§
    3ª“j”$  ã                  óŒ   — d dl mZ d dlZd dlZd dlmZ d dlmZ ddlm	Z	m
Z
mZmZ  ej        d¦  «        Z G d„ d	¦  «        ZdS )
é    )ÚannotationsN)ÚDecimal)ÚAnyé   )ÚEQUIPMENT_PURCHASE_UNITSÚEQUIPMENT_RENTAL_UNITSÚMACHINE_KEYWORDSÚMATERIAL_GROUP_KEYWORDSzdscons.invoice_truth.classifierc                  ó2   — e Zd ZdZ	 ddd„Zdd„Z	 ddd„ZdS )ÚTruthClassifierMixinzHInvoice line item classification for inventory vs equipment vs expenses.Ú Ú	item_nameÚstrÚunitÚquantityúDecimal | floatÚ
unit_priceÚtotal_amountÚseller_nameÚreturnúdict[str, Any]c                ó`  ‡— |pd                      ¦   «                              ¦   «         Š|pd                      ¦   «                              ¦   «         }|pd                      ¦   «                              ¦   «         }d}	t          j        ¦   «         D ]$\  }
}t	          ˆfd„|D ¦   «         ¦  «        r|
}	 nŒ%|t
          v pd‰v pd‰v pd‰v pd‰v p	d‰v pd	|k    }|	rK|s9|t          v s|d
k    r*|                      |¦  «        }d|	||pd|||dd|› d|› d�dœ	S d|	|pd|||dd|› �dœS d}t          j        ¦   «         D ].\  }}t	          ˆfd„|D ¦   «         ¦  «        s
|dk    rd|v r|} nŒ/d‰v sd‰v rd|pd|||d|› �d œS d!‰v sd"‰v sd#‰v sd$‰v r|d%v rd&d'|pd(|||d)|› �d*œS d+||pd,|||d-|› �d*œS ).a�  Classify an invoice line item into:
        - OWNED_EQUIPMENT: Physical machine asset purchase (added to `erp_equipment`)
        - RENTAL_EQUIPMENT: Machine shift rental / subcontractor service (logged to `erp_equipment_logs`)
        - WAREHOUSE_MATERIAL: Physical construction material (added to `erp_warehouse_inventory`)
        - SUBCONTRACT_SERVICE: Construction work service / labor
        r   Nc              3  ó    •K  — | ]}|‰v V — Œ	d S ©N© ©Ú.0ÚkwÚ
name_lowers     €úOC:\Projects\DSCons\app\modules\invoices\application\invoice_truth\classifier.pyú	<genexpr>z5TruthClassifierMixin.classify_item.<locals>.<genexpr>+   ó(   øè è € Ð2Ð2¨�2˜Ð#Ð2Ð2Ð2Ð2Ð2Ð2ó    u   thuÃªu   ca mÃ¡yu   váº­n hÃ nhu	   tiá»�n cau
   cÃ´ng mÃ¡yÚcaé   ÚOWNED_EQUIPMENTu   Chiáº¿cÚownedu
   Mua sáº¯m z (ú))	ÚclassificationÚequipment_typeÚbrand_modelr   r   Úunit_price_vndÚtotal_amount_vndÚownership_typeÚdescriptionÚRENTAL_EQUIPMENTÚCaÚrentedu   ThuÃª ca mÃ¡y: )r)   r*   r   r   r,   r-   r.   r/   ÚOTHER_SUPPLIESc              3  ó    •K  — | ]}|‰v V — Œ	d S r   r   r   s     €r    r!   z5TruthClassifierMixin.classify_item.<locals>.<genexpr>[   r"   r#   ÚFUEL_OILÚ
petrolimexu   váº­n chuyá»ƒnu   cÆ°á»›cÚTRANSPORT_SERVICEu   Chuyáº¿nu   Dá»‹ch vá»¥ váº­n chuyá»ƒn: )r)   r   r   r,   r-   r/   u	   thi cÃ´ngu   xÃ¢y dá»±ngu   láº¯p Ä‘áº·tu   nhÃ¢n cÃ´ng)u   gÃ³iu   láº§nu   há»£p Ä‘á»“ngÚm2Úm3ÚmdÚSUBCONTRACT_SERVICEÚCONSTRUCTION_SERVICEu   GÃ³iu%   GÃ³i tháº§u / Dá»‹ch vá»¥ thi cÃ´ng: )r)   Úmaterial_groupr   r   r,   r-   r/   ÚWAREHOUSE_MATERIALu   LÃ´u   Nháº­p kho váº­t tÆ°: )	ÚlowerÚstripr	   ÚitemsÚanyr   r   Ú_extract_brand_modelr
   )Úselfr   r   r   r   r   r   Ú
unit_lowerÚseller_lowerÚdetected_machine_typeÚm_typeÚkwsÚ	is_rentalr+   Údetected_mat_groupÚgroupr   s                   @r    Úclassify_itemz"TruthClassifierMixin.classify_item   s%  ø€ ð  �o 2×,Ò,Ñ.Ô.×4Ò4Ñ6Ô6ˆ
Ø�j˜b×'Ò'Ñ)Ô)×/Ò/Ñ1Ô1ˆ
Ø#Ð) r×0Ò0Ñ2Ô2×8Ò8Ñ:Ô:ˆð !%ÐÝ+Ô1Ñ3Ô3ð 	ð 	‰KˆF�CÝÐ2Ð2Ð2Ð2¨cÐ2Ñ2Ô2Ñ2Ô2ð Ø(.Ð%Ø�ðð Õ0Ð0ð "Ø˜*Ð$ð"à˜JÐ&ð"ð  
Ð*ð"ð ˜jÐ(ð	"ð
 ˜zÐ)ð"ð �zÒ!ð 	ð !ð 	Øð ØÕ6Ð6Ð6¸(Àaº-¸-ð #×7Ò7¸	ÑBÔB�à&7Ø&;Ø#.Ø Ð- IØ (Ø&0Ø(4Ø&-Ø#K°	Ð#KÐ#K¸[Ð#KÐ#KÐ#Kð
ð 
ð 
ð '9Ø&;Ø ˜L DØ (Ø&0Ø(4Ø&.Ø#@°YÐ#@Ð#@ð	ð 	ð 	ð .ÐÝ1Ô7Ñ9Ô9ð 	ð 	‰JˆE�3ÝÐ2Ð2Ð2Ð2¨cÐ2Ñ2Ô2Ñ2Ô2ð Ø˜Ò#Ð#¨¸Ð(DÐ(Dà%*Ð"Ø�øð ˜zÐ)Ð)¨Y¸*Ð-DÐ-Dà"5ØÐ* 
Ø$Ø",Ø$0ØI¸iÐIÐIðð ð ð ˜:Ð%Ð%Ø 
Ð*Ð*Ø Ð+Ð+Ø 
Ð*Ð*àÐQÐQÐQà&;Ø&<Ø ˜N FØ (Ø&0Ø(4Ø#VÈ9Ð#VÐ#Vðð ð ð 3Ø0Ø�M˜EØ Ø(Ø ,Ø?°IÐ?Ð?ð
ð 
ð 	
r#   Útextc                ó  — g d¢}|                      ¦   «         }|D ]Q}t          j        d|› d�|t          j        ¦  «        }|r)|                     d¦  «                              ¦   «         c S ŒRt          |¦  «        dk    r|S |dd…         S )zQExtract brand/model from equipment text (e.g. 'Volvo EC210D', 'Komatsu PC200-8').)ÚVolvoÚKomatsuÚHitachiÚCaterpillarÚCATÚSakaiÚHyundaiÚKobelcoÚDoosanÚSumitomoÚDynapacÚBomagÚCumminsÚSinotrukÚHowoÚHinoÚIsuzuÚTadanoÚKatoÚSanyÚZoomlionÚXCMGÚPutzmeisterÚSchwingz\bz\b[A-Za-z0-9\s\-]+r   é2   N)r@   ÚreÚsearchÚ
IGNORECASErL   Úlen)rD   rN   ÚbrandsÚ
text_cleanÚbÚms         r    rC   z)TruthClassifierMixin._extract_brand_model‰   s¨   € ð
ð 
ð 
ˆð4 —Z’Z‘\”\ˆ
Øð 	*ð 	*ˆAÝ”	Ð5 Ð5Ð5Ð5°zÅ2Ä=ÑQÔQˆAØð *Ø—w’w˜q‘z”z×'Ò'Ñ)Ô)Ð)Ð)Ð)ð*õ ˆz‰?Œ?˜bÒ Ð ØÐØ˜#˜2˜#ŒÐr#   FÚ	directionÚitems_classificationú	list[str]Úhas_rental_input_historyÚboolúdict[str, str]c                ó  — |sdddœS t          |¦  «        }d|v pd|v }d|v }d|v }d|v }|r|s|s|rd	d
dœS |dk    r|rdddœS |rdddœS |rdddœS dddœS |dk    r!|r|rdddœS dddœS |rdddœS |rdddœS dddœS dddœS )a{  
        Classifies the entire invoice business category and subcategory based on its items and history.
        - direction: 'input' or 'output'
        - items_classification: list of item classifications (e.g., ['WAREHOUSE_MATERIAL', 'RENTAL_EQUIPMENT'])
        - has_rental_input_history: Used for output invoices to check if we previously rented this equipment in.
        ÚunclassifiedN)Úbusiness_categoryÚbusiness_subcategoryr>   r&   r0   r;   r7   ÚmixedÚcomplex_mixedÚinputÚ
commercialÚmachine_rental_inÚserviceÚtransport_hireÚconstruction_workÚpurchase_inÚoutputÚmachine_sublease_outÚequipment_leasingÚ	sales_out)Úset)	rD   rq   rr   rt   Ú	types_setÚhas_materialÚ
has_rentalÚhas_serviceÚhas_transports	            r    Úclassify_invoice_business_typez3TruthClassifierMixin.classify_invoice_business_type°   s  € ð $ð 	WØ)7ÐQUÐVÐVÐVõ Ð,Ñ-Ô-ˆ	Ø+¨yÐ8ÐZÐ<MÐQZÐ<ZˆØ'¨9Ð4ˆ
Ø+¨yÐ8ˆØ+¨yÐ8ˆð ð 	[˜[ð 	[¨Jð 	[¸-ð 	[Ø)0È/ÐZÐZÐZð ˜ÒÐØð hØ-9ÐSfÐgÐgÐgØð bØ-6ÐP`ÐaÐaÐaØð eØ-6ÐPcÐdÐdÐdØ)5È}Ð]Ð]Ð]ð ˜Ò Ð Øð ið ,ð iØ1=ÐWmÐnÐnÐnà1:ÐTgÐhÐhÐhàð bØ-6ÐP`ÐaÐaÐaàð eØ-6ÐPcÐdÐdÐdà)5È{Ð[Ð[Ð[à%3ÈTÐRÐRÐRr#   N)r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   )rN   r   r   r   )F)rq   r   rr   rs   rt   ru   r   rv   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rM   rC   rŽ   r   r#   r    r   r      sx   € € € € € ØRÐRð ðr
ð r
ð r
ð r
ð r
ðh%ð %ð %ð %ðV */ð	6Sð 6Sð 6Sð 6Sð 6Sð 6Sð 6Sr#   r   )Ú
__future__r   Úloggingri   Údecimalr   Útypingr   Úclassifier_rulesr   r   r	   r
   Ú	getLoggerÚloggerr   r   r#   r    ú<module>rš      sä   ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ð 
ˆÔ	Ð<Ñ	=Ô	=€ðTSð TSð TSð TSð TSñ TSô TSð TSð TSð TSr#   