§
    y^¶jFK  ã                  óz   — d dl mZ 	 d dlZd dlmZ d dlmZ d dlmZ  ej	        d¦  «        Z
 G d„ d¦  «        ZdS )é    )ÚannotationsN)ÚDecimal)ÚAny)ÚErpDatabaseClientÚBoQMaterialAllocationServicec                  óJ   — e Zd Zddd„Zddd	„Zdd„Zdd„Zdd„Zd d„Zd d„Z	dS )!r   NÚdbúErpDatabaseClient | Nonec                ó0   — |pt          ¦   «         | _        d S ©N)r   r	   )Úselfr	   s     úiC:\Projects\DSCons\app\modules\invoices\application\invoice_processing\boq_material_allocation_service.pyÚ__init__z%BoQMaterialAllocationService.__init__   s   € ØÐ+Õ)Ñ+Ô+ˆŒˆˆó    Ú
project_idú
str | NoneÚreturnúlist[dict[str, Any]]c                ó¨  — | j                              ¦   «         5 }|                     ¦   «         5 }d}g }|r|dz  }|                     |¦  «         |dz  }|                     |t          |¦  «        ¦  «         d„ |                     ¦   «         D ¦   «         cddd¦  «         cddd¦  «         S # 1 swxY w Y   	 ddd¦  «         dS # 1 swxY w Y   dS )uO   Láº¥y danh sÃ¡ch Ä‘á»‹nh má»©c váº­t tÆ° dá»± toÃ¡n vÃ  háº¡n má»©c cÃ²n láº¡i.aF  
                    SELECT 
                        bm.id, bm.project_id, p.project_code, p.project_name, p.project_type,
                        bm.material_code, bm.material_name, bm.material_group, bm.unit,
                        bm.boq_quantity, bm.unit_price_boq_vnd, bm.total_budget_boq_vnd,
                        bm.invoiced_quantity, bm.invoiced_amount_vnd, bm.remaining_quantity,
                        bm.allowed_loss_percent, bm.status
                    FROM erp_project_boq_materials bm
                    JOIN projects p ON bm.project_id = p.id
                z WHERE bm.project_id = %sz> ORDER BY p.project_code, bm.material_group, bm.material_name;c                ó,   — g | ]}t          |¦  «        ‘ŒS © ©Údict©Ú.0Úrs     r   ú
<listcomp>zJBoQMaterialAllocationService.get_project_boq_materials.<locals>.<listcomp>'   s   € Ð8Ð8Ð8 A�˜Q™œÐ8Ð8Ð8r   N)r	   Úget_connectionÚcursorÚappendÚexecuteÚtupleÚfetchall)r   r   ÚconnÚcurÚsqlÚparamss         r   Úget_project_boq_materialsz6BoQMaterialAllocationService.get_project_boq_materials   su  € àŒW×#Ò#Ñ%Ô%ð 	9¨Ø—’‘”ð 9 #ð	�ð %'�Øð .ØÐ6Ñ6�CØ—M’M *Ñ-Ô-Ð-ØÐWÑW�à—’˜C¥ v¡¤Ñ/Ô/Ð/Ø8Ð8¨¯ª©¬Ð8Ñ8Ô8ð%9ð 9ð 9ð 9ñ 9ô 9ð 9ð	9ð 	9ð 	9ð 	9ñ 	9ô 	9ð 	9ð 	9ð9ð 9ð 9ð 9øøøð 9ð 9ð 9ð 9ð 9ð	9ð 	9ð 	9ñ 	9ô 	9ð 	9ð 	9ð 	9ð 	9ð 	9ð 	9ð 	9øøøð 	9ð 	9ð 	9ð 	9ð 	9ð 	9s5   šC¯A&B.ÂCÂ.B2	Â2CÂ5B2	Â6CÃCÃCÚ	item_nameÚstrÚmaterial_groupÚactive_boq_itemsc                ó  ‡‡— |                      ¦   «         Šg }g d¢}t          ˆfd„|D ¦   «         ¦  «        }g d¢}t          ˆfd„|D ¦   «         ¦  «        }|D �]¬}	t          |	                     d¦  «        pd¦  «                              ¦   «         }
t          |	                     d¦  «        pd¦  «                             ¦   «         }t          |	                     d¦  «        pd¦  «                              ¦   «         Š||                     ¦   «         k    p,t          ˆfd	„‰                     ¦   «         D ¦   «         ¦  «        }|sŒí|rQd
|
v s6dt          |	                     d¦  «        ¦  «                              ¦   «         v r|                     |	¦  «         �Œ@|rUd|
v s:d|
v s6dt          |	                     d¦  «        ¦  «                              ¦   «         v r|                     |	¦  «         �Œ—|                     |	¦  «         �Œ®|S )ui   XÃ¡c Ä‘á»‹nh danh sÃ¡ch dá»± Ã¡n á»©ng viÃªn dá»±a trÃªn Ä‘áº·c thÃ¹ ká»¹ thuáº­t (Technical Spec / DNA).)u	   tÃ´n máº¡u
   tÃ´n lá»£pu   thÃ©p há»™pu   gáº¡ch xÃ¢yu   gáº¡ch khÃ´ng nungu   gáº¡ch tuynelu   gáº¡ch lÃ¡tu   ngÃ³iu   tháº¡ch caou   cá»­a nhÃ´mu   sÆ¡n nÆ°á»›cu	   á»‘ng ppru   thiáº¿t bá»‹ vá»‡ sinhc              3  ó    •K  — | ]}|‰v V — Œ	d S r   r   ©r   ÚkÚ
name_lowers     €r   ú	<genexpr>zLBoQMaterialAllocationService.determine_candidate_projects.<locals>.<genexpr>8   s'   øè è € ÐHÐH°A  Z ÐHÐHÐHÐHÐHÐHr   )u   cá»« larsenu	   cá»�c treu
   cá»« trÃ mu
   Ä‘Ã¡ há»™cu	   rá»� Ä‘Ã¡u   váº£i Ä‘á»‹au   báº¡t xÃ¡c ráº¯nu   cá»‘ng há»™pu   chá»‹u máº·nu   bá»�n sunfatu   kÃ¨ mÃ¡iu   bÃª tÃ´ng cá»‘ngc              3  ó    •K  — | ]}|‰v V — Œ	d S r   r   r/   s     €r   r2   zLBoQMaterialAllocationService.determine_candidate_projects.<locals>.<genexpr>?   s'   øè è € Ð#PÐ#P¸ A¨ OÐ#PÐ#PÐ#PÐ#PÐ#PÐ#Pr   Úproject_typeÚ r+   Úmaterial_namec              3  óF   •K  — | ]}t          |¦  «        d k    ¯|‰v V — ŒdS )é   N)Úlen)r   ÚwÚboq_names     €r   r2   zLBoQMaterialAllocationService.determine_candidate_projects.<locals>.<genexpr>I   s1   øè è € ÐOÐO¨ÅCÈÁFÄFÈQÂJÀJ�q˜H�}ÀJÀJÀJÀJÐOÐOr   u   dÃ¢n dá»¥ngu   nhÃ  vÄƒn hÃ³aÚproject_nameu   thá»§y lá»£iu   háº¡ táº§ngu   cá»‘ng)ÚlowerÚanyr*   ÚgetÚupperÚsplitr    )r   r)   r+   r,   Ú
candidatesÚcivil_keywordsÚis_civil_specificÚhydraulic_keywordsÚis_hydraulic_specificÚboqÚp_typeÚmat_grpÚgroup_matchr;   r1   s                @@r   Údetermine_candidate_projectsz9BoQMaterialAllocationService.determine_candidate_projects)   sC  øø€ ð —_’_Ñ&Ô&ˆ
Ø+-ˆ
ð
ð 
ð 
ˆõ  ÐHÐHÐHÐH¸ÐHÑHÔHÑHÔHÐð
ð 
ð 
Ðõ !$Ð#PÐ#PÐ#PÐ#PÐ=OÐ#PÑ#PÔ#PÑ PÔ PÐà#ð 	'ñ 	'ˆCÝ˜Ÿš Ñ0Ô0Ð6°BÑ7Ô7×=Ò=Ñ?Ô?ˆFÝ˜#Ÿ'š'Ð"2Ñ3Ô3Ð9°rÑ:Ô:×@Ò@ÑBÔBˆGÝ˜3Ÿ7š7 ?Ñ3Ô3Ð9°rÑ:Ô:×@Ò@ÑBÔBˆHð ˜>×/Ò/Ñ1Ô1Ò1ð PÝÐOÐOÐOÐO¨j×.>Ò.>Ñ.@Ô.@ÐOÑOÔOÑOÔOð ð ð Øà ð 'Ø  FÐ*Ð*Ð.>Å#ÀcÇgÂgÈnÑF]ÔF]ÑB^ÔB^×BdÒBdÑBfÔBfÐ.fÐ.fØ×%Ò% cÑ*Ô*Ð*ùØ&ð 'Ø! VÐ+Ð+¨}ÀÐ/FÐ/FÈ(ÕVYÐZ]×ZaÒZaÐbpÑZqÔZqÑVrÔVr×VxÒVxÑVzÔVzÐJzÐJzØ×%Ò% cÑ*Ô*Ð*ùð ×!Ò! #Ñ&Ô&Ð&Ñ&àÐr   Úinvoice_itemúdict[str, Any]Úcandidate_boq_itemsc                óÐ	  — t          t          |                     d¦  «        pd¦  «        ¦  «        }t          t          |                     d¦  «        pd¦  «        ¦  «        }t          t          |                     d¦  «        pd¦  «        ¦  «        }t          t          |                     d¦  «        p||z   ¦  «        ¦  «        }|sg S t          |¦  «        dk    �rO|d         }t          t          |                     d¦  «        pd¦  «        ¦  «        }t          t          |                     d¦  «        pd¦  «        ¦  «        }	t          t          |                     d	¦  «        pd
¦  «        ¦  «        }
|t          d¦  «        |
t          d¦  «        z  z   z  }|	|z   |k    }t          |d         ¦  «        t          |d         ¦  «        t          |d         ¦  «        ||||dd|d         › �dt          d¦  «        ||dk    rt	          |	|z   |z  ¦  «        ndd|d         › d�dœgS t          d„ |D ¦   «         ¦  «        }g }t          d¦  «        }t          d¦  «        }t          |¦  «        D �]m\  }}t          t          |                     d¦  «        pd¦  «        ¦  «        }|dk    r||z  }n,t          d¦  «        t          t          |¦  «        ¦  «        z  }|t          |¦  «        dz
  k    r1||z
  }||z
  }||dk    r||z  |z  ndz
  }||dk    r||z  |z  ndz
  }nž||z                       t          d¦  «        ¦  «        }||z                       t          d¦  «        ¦  «        }||z                       t          d¦  «        ¦  «        }||z                       t          d¦  «        ¦  «        }||z  }||z  }t          t          |                     d¦  «        pd¦  «        ¦  «        }t          t          |                     d¦  «        pd¦  «        ¦  «        }	|	|z   |t          d¦  «        z  k    }|                     t          |d         ¦  «        t          |d         ¦  «        t          |d         ¦  «        ||||dd|d         › �dt          d¦  «        ||dk    rt	          |	|z   |z  ¦  «        ndd|d z  d!›d"|d         › �dœ¦  «         �Œo|S )#uq   TÃ­nh toÃ¡n tá»· trá»�ng phÃ¢n bá»• dÃ²ng hÃ ng vÃ o cÃ¡c dá»± Ã¡n theo háº¡n má»©c cÃ²n láº¡i (Remaining Quota).Úquantityr   Úamount_before_vat_vndÚvat_amount_vndÚtotal_item_amount_vndé   Úboq_quantityÚinvoiced_quantityÚallowed_loss_percentr8   Ú1Ú100r   Úproject_codeÚidÚboq_auto_directÚ621_Ú331z98.00g      ð?u   Xuáº¥t tháº³ng chÃ¢n CT u    (Khá»›p dá»± toÃ¡n 100%))r   rZ   Úboq_material_idÚallocated_quantityÚallocated_amount_before_vat_vndÚallocated_vat_amount_vndÚallocated_total_amount_vndÚallocation_methodÚdebit_accountÚcredit_accountÚconfidence_scoreÚ
is_overrunÚoverrun_ratioÚnotesc              3  óx   K  — | ]5}t          t          |                     d ¦  «        pd¦  «        ¦  «        V — Œ6dS )Úremaining_quantityr   N)r   r*   r?   )r   Úbs     r   r2   zJBoQMaterialAllocationService.calculate_item_allocations.<locals>.<genexpr>†   sU   è è € ð 
ð 
Ø?@�G•C˜ŸšÐ2Ñ3Ô3Ð8°qÑ9Ô9Ñ:Ô:ð
ð 
ð 
ð 
ð 
ð 
r   ú0.0000rl   z0.0001z1.05Úproportional_splitz92.00u*   PhÃ¢n bá»• tá»· trá»�ng BoQ cÃ²n thiáº¿u (éd   z.1fz
%) cho CT )	r   r*   r?   r9   ÚfloatÚsumÚ	enumerateÚquantizer    )r   rL   rN   ÚqtyÚamt_before_vatÚvat_amtÚtot_amtrG   Úboq_qtyÚinvoiced_qtyÚloss_pctÚmax_allowedrh   Útotal_remainingÚallocationsÚallocated_qty_accÚallocated_tot_accÚidxÚremÚweightÚ	alloc_qtyÚ	alloc_totÚalloc_beforeÚ	alloc_vats                           r   Úcalculate_item_allocationsz7BoQMaterialAllocationService.calculate_item_allocationsZ   sE  € õ •c˜,×*Ò*¨:Ñ6Ô6Ð;¸!Ñ<Ô<Ñ=Ô=ˆÝ ¥ \×%5Ò%5Ð6MÑ%NÔ%NÐ%SÐRSÑ!TÔ!TÑUÔUˆÝ�#˜l×.Ò.Ð/?Ñ@Ô@ÐEÀAÑFÔFÑGÔGˆÝ�#˜l×.Ò.Ð/FÑGÔGÐeÈNÐ]dÑLdÑfÔfÑgÔgˆà"ð 	ØˆIõ Ð"Ñ#Ô# qÒ(Ñ(Ø% aÔ(ˆCÝ�c #§'¢'¨.Ñ"9Ô"9Ð">¸QÑ?Ô?Ñ@Ô@ˆGÝ"¥3 s§w¢wÐ/BÑ'CÔ'CÐ'HÀqÑ#IÔ#IÑJÔJˆLÝ�s 3§7¢7Ð+AÑ#BÔ#BÐ#GÀaÑHÔHÑIÔIˆHØ!¥W¨S¡\¤\°H½wÀu¹~¼~Ñ4MÑ%MÑNˆKà&¨Ñ,°Ò;ˆJõ #& c¨,Ô&7Ñ"8Ô"8Ý$'¨¨NÔ(;Ñ$<Ô$<Ý'*¨3¨t¬9¡~¤~Ø*-Ø7EØ07Ø29Ø):Ø%A¨C°Ô,?Ð%AÐ%AØ&+Ý(/°Ñ(8Ô(8Ø",ØNUÐXYÊkÈk¥U¨L¸3Ñ,>À'Ñ+IÑ%JÔ%JÐ%JÐ_bØf¸¸NÔ8KÐfÐfÐfðð ðð õ( ð 
ð 
ØDWð
ñ 
ô 
ñ 
ô 
ˆð -/ˆÝ# HÑ-Ô-ÐÝ# HÑ-Ô-Ðå!Ð"5Ñ6Ô6ð +	ñ +	‰HˆC�Ý�#˜cŸgšgÐ&:Ñ;Ô;Ð@¸qÑAÔAÑBÔBˆCØ Ò"Ð"Ø˜Ñ.��å  ™œ­µÐ4GÑ0HÔ0HÑ(IÔ(IÑI�ð •cÐ-Ñ.Ô.°Ñ2Ò2Ð2ØÐ"3Ñ3�	Ø#Ð&7Ñ7�	Ø-ÐahÐklÒalÐal°ÐBSÑ1SÐV]Ñ1]Ð1]ÐrsÑt�Ø#ÐPWÐZ[ÒP[ÐP[ wÐ1BÑ'BÀWÑ'LÐ'LÐabÑc�	�	à  6™\×3Ò3µG¸HÑ4EÔ4EÑFÔF�	Ø$ vÑ-×7Ò7½ÀÑ8IÔ8IÑJÔJ�	Ø .°Ñ 7×AÒAÅ'È(ÑBSÔBSÑTÔT�Ø$ vÑ-×7Ò7½ÀÑ8IÔ8IÑJÔJ�	à! YÑ.Ð!Ø! YÑ.Ð!å�c #§'¢'¨.Ñ"9Ô"9Ð">¸QÑ?Ô?Ñ@Ô@ˆGÝ"¥3 s§w¢wÐ/BÑ'CÔ'CÐ'HÀqÑ#IÔ#IÑJÔJˆLØ&¨Ñ2°wÅÈÁÄÑ7PÒQˆJà×Òå"% c¨,Ô&7Ñ"8Ô"8Ý$'¨¨NÔ(;Ñ$<Ô$<Ý'*¨3¨t¬9¡~¤~Ø*3Ø7CØ09Ø2;Ø)=Ø%A¨C°Ô,?Ð%AÐ%AØ&+Ý(/°Ñ(8Ô(8Ø",ØT[Ð^_ÒT_ÐT_¥U¨L¸9Ñ,DÈÑ+OÑ%PÔ%PÐ%PÐehØ{È&ÐSVÉ,Ð{Ð{Ð{ÐfiÐjxÔfyÐ{Ð{ðð ñô ð ñ ð& Ðr   Ú
invoice_idÚinvoice_item_idr~   ÚNonec                ój  — |sdS d}d}| j                              ¦   «         5 }|                     ¦   «         5 }|D ]´}|                     ||||d         |                     d¦  «        |d         |d         |d         |d	         |d
         |d         |d         |d         |d         f¦  «         |                     d¦  «        r+|                     ||d         |d	         |d         f¦  «         Œµ	 ddd¦  «         n# 1 swxY w Y   |                     ¦   «          ddd¦  «         dS # 1 swxY w Y   dS )uF   LÆ°u váº¿t phÃ¢n bá»• vÃ o CSDL vÃ  cáº­p nháº­t lÅ©y káº¿ dá»± toÃ¡n.Na(  
            INSERT INTO erp_invoice_item_allocations (
                invoice_id, invoice_item_id, project_id, boq_material_id,
                allocated_quantity, allocated_amount_before_vat_vnd,
                allocated_vat_amount_vnd, allocated_total_amount_vnd,
                allocation_method, debit_account, credit_account,
                confidence_score, notes
            ) VALUES (
                %s, %s, %s, %s,
                %s, %s,
                %s, %s,
                %s, %s, %s,
                %s, %s
            );
        zü
            UPDATE erp_project_boq_materials
            SET invoiced_quantity = invoiced_quantity + %s,
                invoiced_amount_vnd = invoiced_amount_vnd + %s,
                updated_at = CURRENT_TIMESTAMP
            WHERE id = %s;
        r   r_   r`   ra   rb   rc   rd   re   rf   rg   rj   )r	   r   r   r!   r?   Úcommit)	r   r‰   rŠ   r~   Ú
insert_sqlÚupdate_boq_sqlr$   r%   Úallocs	            r   Úsave_allocationsz-BoQMaterialAllocationService.save_allocations½   sô  € ð ð 	ØˆFðˆ
ð ˆð ŒW×#Ò#Ñ%Ô%ð 	¨Ø—’‘”ð  #Ø(ð ð �EØ—K’KØ"à&Ø+Ø! ,Ô/Ø!ŸIšIÐ&7Ñ8Ô8Ø!Ð"6Ô7Ø!Ð"CÔDØ!Ð"<Ô=Ø!Ð">Ô?Ø!Ð"5Ô6Ø! /Ô2Ø!Ð"2Ô3Ø!Ð"4Ô5Ø! 'œNðñô ð ð$ —y’yÐ!2Ñ3Ô3ð ØŸšØ*à %Ð&:Ô ;Ø %Ð&BÔ CØ %Ð&7Ô 8ðñô ð øð)ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð: �KŠK‰MŒMˆMð=	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s5   ¢D(·B8C<Ã0D(Ã<D 	Ä D(ÄD 	ÄD(Ä(D,Ä/D,c                ó`	  — t                                d¦  «         |                      ¦   «         }|st                                d¦  «         dddœS | j                             ¦   «         5 }|                     ¦   «         5 }|                     d¦  «         |                     d¦  «         |                     d¦  «         |                     ¦   «         }|                     d	¦  «         |                     ¦   «         }d
d
d
¦  «         n# 1 swxY w Y   | 	                    ¦   «          d
d
d
¦  «         n# 1 swxY w Y   i }|D ];}t          |d         ¦  «        }||vrg ||<   ||                              |¦  «         Œ<t          |¦  «        di g dœ}	|                      ¦   «         }| j                             ¦   «         5 }|                     ¦   «         5 }|D �]o}
t          |
d         ¦  «        }|                     |g ¦  «        }|sŒ1t          ¦   «         }|D �]¡}t          |d         ¦  «        }t          |                     d¦  «        pd¦  «        }|                      |||¦  «        }|sŒV|                      ||¦  «        }|�r2|                      |t          |d         ¦  «        |¦  «         |	dxx         dz  cc<   |D ]õ}|d         }|                     |¦  «         ||	d         vrt'          d¦  «        ddœ|	d         |<   |	d         |         dxx         |d         z  cc<   |	d         |         dxx         dz  cc<   |                     d¦  «        r^|	d                              |
                     d¦  «        › d|
                     d¦  «        › �|||                     d ¦  «        d!œ¦  «         Œö�Œ£|r‰t)          |¦  «        d         }|                     d"|f¦  «         |                     ¦   «         }|rGt          |d         ¦  «        }d#                     |¦  «        }|                     d$|d%|› d&�|f¦  «         �Œq	 d
d
d
¦  «         n# 1 swxY w Y   | 	                    ¦   «          d
d
d
¦  «         n# 1 swxY w Y   t                                d'|	d         › d(�¦  «         |	S ))up   Tá»± Ä‘á»™ng phÃ¢n bá»• toÃ n bá»™ hÃ³a Ä‘Æ¡n Trá»¥ Cá»™t 1 (Thi cÃ´ng XÃ¢y láº¯p & Thá»§y lá»£i) vÃ o dá»± Ã¡n.uR   Khá»Ÿi Ä‘á»™ng quy trÃ¬nh phÃ¢n bá»• váº­t tÆ° tá»± Ä‘á»™ng theo Dá»± toÃ¡n BoQ...u;   ChÆ°a cÃ³ dá»¯ liá»‡u Ä‘á»‹nh má»©c BoQ trong há»‡ thá»‘ng!ÚerrorzNo active BoQ materials)ÚstatusÚmessagez,TRUNCATE TABLE erp_invoice_item_allocations;zTUPDATE erp_project_boq_materials SET invoiced_quantity = 0, invoiced_amount_vnd = 0;u/  
                    SELECT i.id, i.invoice_number, i.invoice_series, i.issue_date, i.seller_name, i.notes
                    FROM erp_invoices i
                    WHERE (i.notes LIKE '%Trá»¥ Cá»™t 1%' OR i.notes LIKE '%Trá»¥ cá»™t 1%')
                    ORDER BY i.issue_date ASC;
                uß  
                    SELECT it.id, it.invoice_id, it.item_name, it.unit, it.quantity,
                           it.amount_before_vat_vnd, it.vat_amount_vnd, it.total_item_amount_vnd, it.cost_category
                    FROM erp_invoice_items it
                    JOIN erp_invoices i ON it.invoice_id = i.id
                    WHERE (i.notes LIKE '%Trá»¥ Cá»™t 1%' OR i.notes LIKE '%Trá»¥ cá»™t 1%')
                    ORDER BY it.invoice_id, it.item_order;
                Nr‰   r   )Útotal_invoices_scannedÚallocated_items_countÚproject_summariesÚoverrun_alertsr[   r)   Úcost_categoryÚOTHERr—   rT   rZ   r˜   rn   )Útotal_amount_vndÚitems_countrœ   rc   r�   rh   r™   Úinvoice_seriesú-Úinvoice_numberri   )ÚinvoiceÚprojectÚitemri   z8SELECT id FROM projects WHERE project_code = %s LIMIT 1;z, a9  
                                UPDATE erp_invoices
                                SET matched_project_id = %s,
                                    notes = notes || %s,
                                    updated_at = CURRENT_TIMESTAMP
                                WHERE id = %s;
                            u    [Giao tháº³ng chÃ¢n CT: Ú]u    HoÃ n thÃ nh phÃ¢n bá»• BoQ cho u    dÃ²ng hÃ ng hÃ³a Ä‘Æ¡n!)ÚloggerÚinfor(   Úwarningr	   r   r   r!   r#   r�   r*   r    r9   r?   ÚsetrK   rˆ   r‘   Úaddr   ÚlistÚfetchoneÚjoin)r   Ú
active_boqr$   r%   ÚinvoicesÚ	all_itemsÚitems_by_invÚitÚiidÚstatsÚinvÚinv_idÚitemsÚinv_matched_projectsÚnameÚcatrB   r~   ÚalÚp_codeÚprimary_proj_codeÚp_rowÚp_idÚ	proj_tagss                           r   Ú$batch_allocate_construction_invoiceszABoQMaterialAllocationService.batch_allocate_construction_invoicesÿ   s!  € å�ŠÐhÑiÔiÐið ×3Ò3Ñ5Ô5ˆ
Øð 	MÝ�NŠNÐXÑYÔYÐYØ%Ð2KÐLÐLÐLð ŒW×#Ò#Ñ%Ô%ð 	¨Ø—’‘”ð + #Ø—’ÐJÑKÔKÐKØ—’ÐrÑsÔsÐsà—’ð ñ ô ð ð Ÿ<š<™>œ>�à—’ð ñ ô ð ð  ŸLšL™NœN�	ð)+ð +ð +ñ +ô +ð +ð +ð +ð +ð +ð +øøøð +ð +ð +ð +ð* �KŠK‰MŒMˆMð-	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð0 /1ˆØð 	)ð 	)ˆBÝ�b˜Ô&Ñ'Ô'ˆCØ˜,Ð&Ð&Ø$&�˜SÑ!Ø˜Ô×$Ò$ RÑ(Ô(Ð(Ð(õ '*¨(¡m¤mØ%&Ø!#Ø ð	
ð 
ˆð ×3Ò3Ñ5Ô5ˆ
àŒW×#Ò#Ñ%Ô%ð >	¨Ø—’‘”ð < #Ø#ð ;ñ ;�CÝ   T¤™^œ^�FØ(×,Ò,¨V°RÑ8Ô8�EØ ð !Ø å58±U´UÐ(à#ð  &ñ  &˜Ý" 2 k¤?Ñ3Ô3˜Ý! "§&¢&¨Ñ"9Ô"9Ð"D¸WÑEÔE˜à%)×%FÒ%FÀtÈSÐR\Ñ%]Ô%]˜
Ø)ð %Ø$à&*×&EÒ&EÀbÈ*Ñ&UÔ&U˜Ø&ñ &Ø ×1Ò1°&½#¸bÀ¼h¹-¼-ÈÑUÔUÐUØ!Ð"9Ð:Ð:Ô:¸aÑ?Ð:Ð:Ñ:à&1ð &ð & Ø)+¨NÔ); Ø 4× 8Ò 8¸Ñ @Ô @Ð @Ø#)°Ð7JÔ1KÐ#KÐ#Kå<CÀHÑ<MÔ<MØ78ðJ&ð J& EÐ*=Ô$>¸vÑ$Fð !&Ð&9Ô :¸6Ô BÐCUÐ VÐ VÔ VÐZ\Ð]yÔZzÑ zÐ VÐ VÑ VØ %Ð&9Ô :¸6Ô BÀ=Ð QÐ QÔ QÐUVÑ VÐ QÐ QÑ Qà#%§6¢6¨,Ñ#7Ô#7ð !&Ø$)Ð*:Ô$;×$BÒ$Bà:=¿'º'ÐBRÑ:SÔ:SÐ7qÐ7qÐVY×V]ÒV]Ð^nÑVoÔVoÐ7qÐ7qØ7=Ø48Ø=?¿VºVÀOÑ=TÔ=Tð	)*ð )*ñ%&ô %&ð %&øùð ,ð Ý,0Ð1EÑ,FÔ,FÀqÔ,IÐ)ØŸšÐ$^ÐarÐ`tÑuÔuÐuØ #§¢¡¤˜Ø ð Ý#& u¨T¤{Ñ#3Ô#3˜DØ(,¯	ª	Ð2FÑ(GÔ(G˜IØŸKšKð! ð "&Ð'OÀ9Ð'OÐ'OÐ'OÐQWÐ Xñ	ô 	ð 	ùðe;ð<ð <ð <ñ <ô <ð <ð <ð <ð <ð <ð <øøøð <ð <ð <ð <ðz �KŠK‰MŒMˆMð}>	ð >	ð >	ñ >	ô >	ð >	ð >	ð >	ð >	ð >	ð >	øøøð >	ð >	ð >	ð >	õ@ 	�ŠÐo°uÐ=TÔ7UÐoÐoÐoÑpÔpÐpØˆsn   Á)D2Á>A=DÃ;D2ÄD	ÄD2ÄD	ÄD2Ä2D6Ä9D6Æ>Q?ÇI4QÑQ?ÑQ	ÑQ?ÑQ	ÑQ?Ñ?RÒRc                ó”  — | j                              ¦   «         5 }|                     ¦   «         5 }|                     d¦  «         d„ |                     ¦   «         D ¦   «         }|                     d¦  «         d„ |                     ¦   «         D ¦   «         }ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   d||dœS )uX   Tá»•ng há»£p tÃ¬nh hÃ¬nh phÃ¢n bá»• váº­t tÆ° vÃ  cáº£nh bÃ¡o vÆ°á»£t Ä‘á»‹nh má»©c BoQ.aë  
                    SELECT 
                        p.project_code, p.project_name,
                        COUNT(a.id) as allocation_records_count,
                        SUM(a.allocated_total_amount_vnd) as total_allocated_amount_vnd
                    FROM erp_invoice_item_allocations a
                    JOIN projects p ON a.project_id = p.id
                    GROUP BY p.project_code, p.project_name
                    ORDER BY total_allocated_amount_vnd DESC;
                c                ó,   — g | ]}t          |¦  «        ‘ŒS r   r   r   s     r   r   zGBoQMaterialAllocationService.get_allocation_summary.<locals>.<listcomp>„  s   € Ð#DÐ#DÐ#D°¥D¨¡G¤GÐ#DÐ#DÐ#Dr   a  
                    SELECT 
                        bm.material_name, bm.material_code, p.project_code,
                        bm.boq_quantity, bm.invoiced_quantity, bm.unit,
                        (bm.invoiced_quantity / NULLIF(bm.boq_quantity, 0)) as burn_rate
                    FROM erp_project_boq_materials bm
                    JOIN projects p ON bm.project_id = p.id
                    WHERE bm.invoiced_quantity > (bm.boq_quantity * 1.05)
                    ORDER BY burn_rate DESC;
                c                ó,   — g | ]}t          |¦  «        ‘ŒS r   r   r   s     r   r   zGBoQMaterialAllocationService.get_allocation_summary.<locals>.<listcomp>�  s   € Ð<Ð<Ð<¨�D ™GœGÐ<Ð<Ð<r   NÚsuccess)r”   Úprojects_summaryr™   )r	   r   r   r!   r#   )r   r$   r%   rÅ   Úoverrunss        r   Úget_allocation_summaryz3BoQMaterialAllocationService.get_allocation_summaryv  sT  € àŒW×#Ò#Ñ%Ô%ð 	=¨Ø—’‘”ð = #Ø—’ð 	ñ 	ô 	ð 	ð $EÐ#D°S·\²\±^´^Ð#DÑ#DÔ#DÐ à—’ð 	ñ 	ô 	ð 	ð =Ð<¨S¯\ª\©^¬^Ð<Ñ<Ô<�ð/=ð =ð =ñ =ô =ð =ð =ð =ð =ð =ð =øøøð =ð =ð =ð =ð	=ð 	=ð 	=ñ 	=ô 	=ð 	=ð 	=ð 	=ð 	=ð 	=ð 	=øøøð 	=ð 	=ð 	=ð 	=ð6  Ø 0Ø&ð
ð 
ð 	
s5   šB9¯A'B"ÂB9Â"B&	Â&B9Â)B&	Â*B9Â9B=Ã B=r   )r	   r
   )r   r   r   r   )r)   r*   r+   r*   r,   r   r   r   )rL   rM   rN   r   r   r   )r‰   r*   rŠ   r*   r~   r   r   r‹   )r   rM   )
Ú__name__Ú
__module__Ú__qualname__r   r(   rK   rˆ   r‘   rÀ   rÇ   r   r   r   r   r      sº   € € € € € ð,ð ,ð ,ð ,ð ,ð9ð 9ð 9ð 9ð 9ð./ð /ð /ð /ðbað að að aðF@ð @ð @ð @ðDuð uð uð uðn 
ð  
ð  
ð  
ð  
ð  
r   )Ú
__future__r   ÚloggingÚdecimalr   Útypingr   Úapp.core.postgres.erp_clientr   Ú	getLoggerr¥   r   r   r   r   ú<module>rÑ      s«   ðØ "Ð "Ð "Ð "Ð "Ð "ð Gà €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à :Ð :Ð :Ð :Ð :Ð :à	ˆÔ	Ð9Ñ	:Ô	:€ðH
ð H
ð H
ð H
ð H
ñ H
ô H
ð H
ð H
ð H
r   