§
    "ÛÀj€g  ã                  óÂ   — d Z ddlmZ ddlZddlZddlmZmZ ddlm	Z	 ddl
mZ ddlZddlmZ ddlmZmZmZmZ dd	lmZ  ej        e¦  «        Z G d
„ de¦  «        ZdS )ax  
Tri-Source Truth Grounding Engine (Reconciliation Engine).
Performs deterministic 3-way cross-audit between:
  (a) Model Space CAD Geometry (Inverse-BIM parametric quantities)
  (b) Structural Rebar / Schedule Tables (BBS)
  (c) Statutory Tender BoQ / HSMT items (under Law 2025 & 2026 Norms)
Zero AI hallucinations, exact variance calculation, and automated quality gating.
é    )ÚannotationsN)ÚROUND_HALF_UPÚDecimal)ÚPath)ÚAny)ÚVietnameseCadFontTranscoder)ÚBbsRebarScheduleItemÚReconciliationItemÚSolidTakeoffQuantitiesÚTriSourceAuditReport)ÚTriSourceGroundingPortc                  ó0   — e Zd ZdZdd„Zdd„Z	 	 ddd„ZdS )ÚTriSourceTruthGroundingz@Enterprise Tri-Source Reconciliation Engine for Drawing Takeoff.Úsourceú
str | PathÚreturnúlist[BbsRebarScheduleItem]c                ó˜	  — t          |¦  «        }g }|j                             ¦   «         dk    �ræ|                     ¦   «         �rÑ	 ddl}d}|                     t          |¦  «        ¦  «        5 }t          t          |¦  «        dz
  dd¦  «        D ]\}||         }| 	                    ¦   «         }	t          j        |	¦  «        }
d|
v sd|
v r"t                               d	|dz   ¦  «         |
} nŒ]ddd¦  «         n# 1 swxY w Y   |�rÜi }t          j        d
|t          j        ¬¦  «        }|D ]é}t          j        d|t          j        ¦  «        }|sŒ%d}|                     ¦   «         }d|v rd}nd|v rd}nd|v rd}n
d|v sd|v rd}|r�t%          d„ |D ¦   «         ¦  «        }t%          d„ |D ¦   «         ¦  «        }|t'          d¦  «        z                       t'          d¦  «        t*          ¬¦  «        }d„ |D ¦   «         }|r|d         nd}||||dœ||<   Œê|rËdddd t'          d!¦  «        fdd"dd#t'          d$¦  «        fdd%dd t'          d$¦  «        fdd&d'd(t'          d)¦  «        fg}|D ]e\  }}}}}||v rY||         }|                     t/          |||d*         ||||d+         t'          d,¦  «        |d-         |d.         ¬/¦
  «
        ¦  «         Œft          |¦  «        d0k    r|S n2# t0          $ r%}t                               d1|¦  «         Y d}~nd}~ww xY w|                     t/          dddt'          d!¦  «        dd t'          d2¦  «        t'          d,¦  «        t'          d3¦  «        t'          d4¦  «        ¬/¦
  «
        ¦  «         |                     t/          dd"dt'          d$¦  «        dd#t'          d5¦  «        t'          d,¦  «        t'          d6¦  «        t'          d7¦  «        ¬/¦
  «
        ¦  «         |                     t/          dd%dt'          d$¦  «        dd t'          d8¦  «        t'          d,¦  «        t'          d9¦  «        t'          d:¦  «        ¬/¦
  «
        ¦  «         |                     t/          dd&dt'          d)¦  «        d'd(t'          d;¦  «        t'          d,¦  «        t'          d<¦  «        t'          d=¦  «        ¬/¦
  «
        ¦  «         |S )>zYExtract Bar Bending Schedule (BBS) items from PDF drawing sheet or pre-extracted records.z.pdfr   NÚ é   éÿÿÿÿu   THá»�NG KÃŠ Cá»�T THÃ‰PzTHONG KE COT THEPz5[TriSourceGrounding] Found BBS rebar table on Page %du   Báº¢NG THá»�NG KÃŠ Cá»�T THÃ‰P)Úflagsuu   -\s*Trá»�ng lÆ°á»£ng thÃ©p cÃ³ Ä‘Æ°á»�ng kÃ­nh\s*Î¦?(\d+)\s*=\s*([\d\.]+)\s*kg;\s*Chiá»�u dÃ i\s*=\s*([\d\.]+)\s*mÃ©tu   Ä‘Ã¡y cá»‘ngõ   Ä�Ã¡y cá»‘ngu   thÃ nh cá»‘ngõ   ThÃ nh cá»‘ngu   báº£n máº·tõ   Báº£n máº·t cá»‘ngu   cá»­a cá»‘ngu   cÃ¡nh cá»‘ngõ   Cá»­a cá»‘ngc              3  ó@   K  — | ]}t          |d          ¦  «        V — ŒdS )r   N©r   ©Ú.0Úms     úPC:\Projects\DSCons\app\modules\takeoff\application\tri_source_truth_grounding.pyú	<genexpr>z?TriSourceTruthGrounding.extract_bbs_schedule.<locals>.<genexpr>Z   s,   è è € Ð(OÐ(O¸1­°°1´©¬Ð(OÐ(OÐ(OÐ(OÐ(OÐ(Oó    c              3  ó@   K  — | ]}t          |d          ¦  «        V — ŒdS )é   Nr   r   s     r"   r#   z?TriSourceTruthGrounding.extract_bbs_schedule.<locals>.<genexpr>[   s,   è è € Ð)PÐ)P¸A­'°!°A´$©-¬-Ð)PÐ)PÐ)PÐ)PÐ)PÐ)Pr$   z1000.0z0.0001©Úroundingc                ó8   — g | ]}t          |d          ¦  «        ‘ŒS )r   )Úintr   s     r"   ú
<listcomp>z@TriSourceTruthGrounding.extract_bbs_schedule.<locals>.<listcomp>_   s"   € Ð$GÐ$GÐ$G°1¥S¨¨1¬¡Y¤YÐ$GÐ$GÐ$Gr$   é
   )Ú	weight_kgÚ
weight_tonÚ	total_lenÚdiamz1, 2, 3i°  ip  z3720.0z4, 5, 6, 7, 4*ià  z3350.0z8, 9, 3*z1, 2, 3, 4, 5é   é   z3520.0r0   r/   z0.6165r-   r.   )
Úcomponent_nameÚbar_markÚdiameter_mmÚlength_per_bar_mmÚcount_per_componentÚtotal_bars_countÚtotal_length_mÚunit_weight_kg_per_mÚtotal_weight_kgÚtotal_weight_toné   z-[TriSourceGrounding] PDF BBS parse notice: %sz
16753.4000z
10329.1000ú10.3291z
34962.0000z
22322.4500ú22.3225z
15090.0000z	9303.5600ú9.3036z377.0000z232.4400ú0.2324)r   ÚsuffixÚlowerÚexistsÚfitzÚopenÚstrÚrangeÚlenÚget_textr   Úauto_transcode_cad_textÚloggerÚinfoÚreÚsplitÚ
IGNORECASEÚfindallÚsumr   Úquantizer   Úappendr	   Ú	ExceptionÚwarning)Úselfr   Úsrc_pathÚrebar_itemsrE   Útarget_page_textÚdocÚpage_idxÚpageÚtxtÚ	clean_txtÚparsed_componentsÚblocksÚblockÚweight_matchesÚ	comp_nameÚblock_lowerÚtot_kgÚtot_lenÚtot_tonÚdiamsÚ	main_diamÚ	order_mapÚcnameÚbmarkÚcnt_cÚcnt_tÚl_barÚdataÚe_pdfs                                 r"   Úextract_bbs_schedulez,TriSourceTruthGrounding.extract_bbs_schedule'   s  € õ
 ˜‘<”<ˆØ24ˆð Œ?× Ò Ñ"Ô" fÒ,Ñ,°·²Ñ1BÔ1BÑ,ðRWØ���Ø#%Ð Ø—Y’Y�s 8™}œ}Ñ-Ô-ð 	"°å$)­#¨c©(¬(°Q©,¸¸BÑ$?Ô$?ð "ð "˜Ø" 8œ}˜Ø"Ÿmšm™oœo˜Ý$?Ô$WÐX[Ñ$\Ô$\˜	Ø4¸	ÐAÐAÐEXÐ\eÐEeÐEeÝ"ŸKšKÐ(_ÐaiÐlmÑamÑnÔnÐnØ/8Ð,Ø!˜Eð Ffð	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"ð $ñ B/ð DFÐ%ÝœXÐ&GÐIYÕacÔanÐoÑoÔo�FØ!'ð !ð !˜Ý)+¬ð UØ!ÝœMñ*ô *˜ð
  .ð %Ø$à$(˜	Ø&+§k¢k¡m¤m˜Ø)¨[Ð8Ð8Ø(6˜I˜IØ,°Ð;Ð;Ø(7˜I˜IØ*¨kÐ9Ð9Ø(<˜I˜IØ+¨{Ð:Ð:¸nÐP[Ð>[Ð>[Ø(6˜Ià$ð Ý%(Ð(OÐ(OÀÐ(OÑ(OÔ(OÑ%OÔ%O˜FÝ&)Ð)PÐ)PÀÐ)PÑ)PÔ)PÑ&PÔ&P˜GØ'-µ¸Ñ0AÔ0AÑ'A×&KÒ&KÝ '¨Ñ 1Ô 1½Mð 'Lñ 'ô '˜Gð %HÐ$G¸Ð$GÑ$GÔ$G˜EØ5:Ð(B¨¨b¬	¨	À˜Ià-3Ø.5Ø-4Ø(1ð	<ð <Ð-¨iÑ8øð )ð /à+¨Y¸¸TÅ7È8ÑCTÔCTÐUØ,Ð.>ÀÀTÍ7ÐS[ÑK\ÔK\Ð]Ø1°:¸sÀDÍ'ÐRZÑJ[ÔJ[Ð\Ø+¨_¸aÀÅWÈXÑEVÔEVÐWð	%˜	ð BKð "ð "Ñ=˜E 5¨%°¸Ø$Ð(9Ð9Ð9Ø'8¸Ô'? Ø +× 2Ò 2Ý$8Ø7<Ø16Ø48¸´LØ:?Ø<AØ9>Ø7;¸KÔ7HÝ=DÀXÑ=NÔ=NØ8<¸[Ô8IØ9=¸lÔ9Kð%&ñ %&ô %&ñ!"ô !"ð !"øõ ˜{Ñ+Ô+¨qÒ0Ð0Ø#.Ð.øøÝð Wð Wð WÝ—’ÐNÐPUÑVÔVÐVÐVÐVÐVÐVÐVøøøøðWøøøð
 	×ÒÝ Ø-Ø"ØÝ")¨(Ñ"3Ô"3Ø$'Ø!%Ý& |Ñ4Ô4Ý%,¨XÑ%6Ô%6Ý '¨Ñ 5Ô 5Ý!(¨Ñ!3Ô!3ðñ ô ñ	
ô 	
ð 	
ð 	×ÒÝ Ø.Ø)ØÝ")¨(Ñ"3Ô"3Ø$'Ø!%Ý& |Ñ4Ô4Ý%,¨XÑ%6Ô%6Ý '¨Ñ 5Ô 5Ý!(¨Ñ!3Ô!3ðñ ô ñ	
ô 	
ð 	
ð 	×ÒÝ Ø3Ø#ØÝ")¨(Ñ"3Ô"3Ø$'Ø!%Ý& |Ñ4Ô4Ý%,¨XÑ%6Ô%6Ý '¨Ñ 4Ô 4Ý!(¨Ñ!2Ô!2ðñ ô ñ	
ô 	
ð 	
ð 	×ÒÝ Ø-Ø(ØÝ")¨(Ñ"3Ô"3Ø$%Ø!#Ý& zÑ2Ô2Ý%,¨XÑ%6Ô%6Ý '¨
Ñ 3Ô 3Ý!(¨Ñ!2Ô!2ðñ ô ñ	
ô 	
ð 	
ð Ðs>   Á(K$ Á.A?C9Ã-K$ Ã9C=Ã=K$ Ä C=ÄG!K$ Ë$
LË.LÌLúlist[dict[str, Any]]c                óŽ  ‡‡‡— t          |¦  «        }|                     ¦   «         sg S g }d}	 t          j        t	          |¦  «        d¬¦  «        }dŠdD ]}||j        v r
||         Š nŒ‰sC|j        D ];}|                     ¦   «         Št          ˆfd„dD ¦   «         ¦  «        r
||         Š nŒ<‰s|j        Š‰j	        dk    �r%t          d‰j        d	z   ¦  «        D �]	Š‰                     ‰d	¦  «        j        }t          |t          t           f¦  «        �rÎ‰                     ‰d
¦  «        j        pd}t	          ‰                     ‰d¦  «        j        pd¦  «                             ¦   «         }t	          ‰                     ‰d¦  «        j        pd¦  «                             ¦   «         }	‰                     ‰d¦  «        j        pd}
‰                     ‰d¦  «        j        pd}|                     t          |¦  «        t	          |¦  «        ||	t'          t	          t)          t!          |
¦  «        d¦  «        ¦  «        ¦  «        t'          t	          t)          t!          |¦  «        d
¦  «        ¦  «        ¦  «        t'          t	          |
¦  «        ¦  «        t'          t	          |¦  «        ¦  «        z                       t'          d¦  «        t,          ¬¦  «        dœ¦  «         �Œ�nRd‰j	        v �rot          d‰j        d	z   ¦  «        D �]SŠ‰                     ‰d	¦  «        j        }t	          ‰                     ‰d
¦  «        j        pd¦  «                             ¦   «         }‰                     ‰d¦  «        j        }
t	          ‰                     ‰d¦  «        j        pd¦  «                             ¦   «         }	|
� t          |
t          t           f¦  «        r„|
dk    r~|	r||                     t/          |¦  «        d	z   d||	t'          t	          t)          t!          |
¦  «        d¦  «        ¦  «        ¦  «        t'          d¦  «        t'          d¦  «        dœ¦  «         �ŒU�nÙd}d\  }}}}}}}t          d	t1          d‰j        d	z   ¦  «        ¦  «        D ]”Šˆˆfd„t          d	t1          d‰j        d	z   ¦  «        ¦  «        D ¦   «         }t5          |d	¬¦  «        D ]A\  }}|dk    r|}Œd|v r|}Œd|v r|}Œd|v sd |v r|}Œ'd!|v s|d"k    r|}Œ4d#|v r|}Œ;d$|v r|}ŒB|r
|r|r|r‰} nŒ•|�rt          |d	z   ‰j        d	z   ¦  «        D �]òŠ‰                     ‰|¦  «        j        }t          |t          t           f¦  «        s=t          |t          ¦  «        �r¢|                     ¦   «                              ¦   «         �r{t	          ‰                     ‰|¦  «        j        pd¦  «                             ¦   «         }|sŒ¶|r<t	          ‰                     ‰|¦  «        j        pd¦  «                             ¦   «         nd}t	          ‰                     ‰|¦  «        j        pd¦  «                             ¦   «         }	‰                     ‰|¦  «        j        pd}
|r‰                     ‰|¦  «        j        pdnd}|r‰                     ‰|¦  «        j        pdnd}	 t'          t	          t)          t!          |
¦  «        d¦  «        ¦  «        ¦  «        }n# t8          $ r t'          d%¦  «        }Y nw xY w	 t'          t	          t)          t!          |¦  «        d
¦  «        ¦  «        ¦  «        }n# t8          $ r t'          d¦  «        }Y nw xY w	 |r8t'          t	          t)          t!          |¦  «        d
¦  «        ¦  «        ¦  «        }n,||z                       t'          d¦  «        t,          ¬¦  «        }n# t8          $ r t'          d¦  «        }Y nw xY w|                     t          |¦  «        |||	|||dœ¦  «         �Œôn2# t8          $ r%}t:                               d&|¦  «         Y d}~nd}~ww xY w|�&	 |                     ¦   «          n># t8          $ r Y n2w xY wn-# |�&	 |                     ¦   «          w # t8          $ r Y w w xY ww xY w|S )'z;Extract statutory tender BoQ / HSMT items from spreadsheet.NT)Ú	data_only)õ   Dá»± tháº§uu+   Máº«u sá»‘ 01A. Báº£ng kÃª háº¡ng má»¥c cÃ´õ   phá»¥ lá»¥c 01u   Phá»¥ lá»¥c 01u   CÃ´ng trÃ¬nhc              3  ó    •K  — | ]}|‰v V — Œ	d S )N© )r    ÚkÚsn_lowers     €r"   r#   zDTriSourceTruthGrounding.extract_hsmt_tender_items.<locals>.<genexpr>Ø   s?   øè è € ð  cð  c¨Q˜1 ˜=ð  cð  cð  cð  cð  cð  cr$   )u   dá»± tháº§uzdu thauÚ01arx   z
phu luc 01u   tiÃªn lÆ°á»£ngz
tien luongu
   dá»± toÃ¡nrw   é   r   r&   ÚTTé   r   r=   r   é	   ú0.01r'   )ÚsttÚ	norm_codeÚ	item_nameÚunitÚquantityÚbid_rateÚtotal_amountu   Máº«u sá»‘ 01Aé   ú0.00)NNNNNNNé   c                ó¬   •— g | ]P}t          ‰                     ‰|¦  «        j        pd ¦  «                             ¦   «                              ¦   «         ‘ŒQS )r   )rG   ÚcellÚvalueÚstriprC   )r    ÚcÚrÚtarget_sheets     €€r"   r+   zETriSourceTruthGrounding.extract_hsmt_tender_items.<locals>.<listcomp>  sd   ø€ ð   Rð   Rð   RÐ]^¥ L×$5Ò$5°a¸Ñ$;Ô$;Ô$AÐ$GÀRÑ HÔ H× NÒ NÑ PÔ P× VÒ VÑ XÔ Xð   Rð   Rð   Rr$   é   )Ústartrƒ   u   mÃ£u   tÃªnu
   Ä‘Æ¡n vá»‹u   Ä‘vtu   khá»‘i lÆ°á»£ngÚklu
   Ä‘Æ¡n giÃ¡u   thÃ nh tiá»�nú0.0000z-[TriSourceGrounding] Excel extract notice: %s) r   rD   ÚopenpyxlÚload_workbookrG   Ú
sheetnamesrC   ÚanyÚactiveÚtitlerH   Úmax_rowrŽ   r�   Ú
isinstancer*   Úfloatr�   rT   r   ÚroundrS   r   rI   ÚminÚ
max_columnÚ	enumerateÚisdigitrU   rL   rV   Úclose) rW   r   rX   ÚitemsÚwbÚsnamerƒ   ÚcodeÚnamer†   ÚqtyÚrateÚ
header_rowÚstt_cÚcode_cÚname_cÚunit_cÚqty_cÚrate_cÚamt_cÚrow_valsÚc_idxÚvalÚstt_valÚamtÚqty_decÚrate_decÚamt_decÚe_excelr’   r|   r“   s                                 @@@r"   Úextract_hsmt_tender_itemsz1TriSourceTruthGrounding.extract_hsmt_tender_itemsÂ   s²	  øøø€ õ
 ˜‘<”<ˆØ�ŠÑ Ô ð 	ØˆIà&(ˆØˆð@	ÝÔ'­¨H©¬ÀÐFÑFÔFˆBàˆLð Lð ð �Ø˜BœMÐ)Ð)Ø#% e¤9�LØ�Eð *ð  ð Øœ]ð ð �EØ$Ÿ{š{™}œ}�HÝð  cð  cð  cð  cð  3bð  cñ  cô  cñ  cô  cð Ø')¨%¤y˜Ø˜ðð  ð )Ø!œy�àÔ! ]Ò2Ñ2Ý˜q ,Ô"6¸Ñ":Ñ;Ô;ð ñ �AØ&×+Ò+¨A¨qÑ1Ô1Ô7�CÝ! #­­U |Ñ4Ô4ñ Ø+×0Ò0°°AÑ6Ô6Ô<ÐDÀ˜Ý" <×#4Ò#4°Q¸Ñ#:Ô#:Ô#@Ð#FÀBÑGÔG×MÒMÑOÔO˜Ý" <×#4Ò#4°Q¸Ñ#:Ô#:Ô#@Ð#FÀBÑGÔG×MÒMÑOÔO˜Ø*×/Ò/°°1Ñ5Ô5Ô;Ð@¸q˜Ø+×0Ò0°°AÑ6Ô6Ô<ÐAÀ˜ØŸšå'*¨3¡x¤xÝ-0°©Y¬YØ-1Ø(,Ý,3µC½½eÀC¹j¼jÈ!Ñ8LÔ8LÑ4MÔ4MÑ,NÔ,NÝ,3µC½½eÀD¹k¼kÈ1Ñ8MÔ8MÑ4NÔ4NÑ,OÔ,Oå$+­C°©H¬HÑ$5Ô$5½ÅÀDÁ	Ä	Ñ8JÔ8JÑ$Jß"*¢(­7°6©?¬?Å] (Ñ"SÔ"Sð
ð 
ñô ð ùñð* " \Ô%7Ð7Ñ7Ý˜q ,Ô"6¸Ñ":Ñ;Ô;ð ñ �AØ&×+Ò+¨A¨qÑ1Ô1Ô7�CÝ˜|×0Ò0°°AÑ6Ô6Ô<ÐBÀÑCÔC×IÒIÑKÔK�DØ&×+Ò+¨A¨qÑ1Ô1Ô7�CÝ˜|×0Ò0°°AÑ6Ô6Ô<ÐBÀÑCÔC×IÒIÑKÔK�DØ�­:°c½CÅ¸<Ñ+HÔ+H�ÈSÐSTÊWÈWÐY]ÈWØŸšå'*¨5¡z¤z°A¡~Ø-1Ø-1Ø(,Ý,3µC½½eÀC¹j¼jÈ!Ñ8LÔ8LÑ4MÔ4MÑ,NÔ,NÝ,3°F©O¬OÝ07¸±´ðð ñ
ô 
ð 
ùñð& "�
ØFnÑC��v˜v v¨u°f¸eÝ˜q¥# b¨,Ô*>ÀÑ*BÑ"CÔ"CÑDÔDð ð �Að  Rð   Rð   Rð   Rð   RÕbgÐhiÕknÐoqÐsô  tKð  NOñ  tOñ  lPô  lPñ  cQô  cQð   Rñ   Rô   R�HÝ&/°ÀÐ&BÑ&BÔ&Bð *ð *™
˜˜sØ %š<˜<Ø$)˜E˜EØ" c˜\˜\Ø%*˜F˜FØ# s˜]˜]Ø%*˜F˜FØ)¨SÐ0Ð0°F¸c°M°MØ%*˜F˜FØ.°#Ð5Ð5¸Àº¸Ø$)˜E˜EØ)¨SÐ0Ð0Ø%*˜F˜FØ,°Ð3Ð3Ø$)˜EøØð  ð ¨Fð °uð Ø%&˜
Ø˜øàñ &Ý" :°¡>°<Ô3GÈ!Ñ3KÑLÔLð %ñ %˜Ø".×"3Ò"3°A°uÑ"=Ô"=Ô"C˜Ý% gµµU¨|Ñ<Ô<ð #ÅÈGÕUXÑAYÔAYñ #Ð^e×^kÒ^kÑ^mÔ^m×^uÒ^uÑ^wÔ^wñ #Ý#& |×'8Ò'8¸¸FÑ'CÔ'CÔ'IÐ'OÈRÑ#PÔ#P×#VÒ#VÑ#XÔ#X˜DØ#'ð )Ø (Ø^dÐ#n¥3 |×'8Ò'8¸¸FÑ'CÔ'CÔ'IÐ'QÈTÑ#RÔ#R×#XÒ#XÑ#ZÔ#ZÐ#ZÐjn˜DÝ#& |×'8Ò'8¸¸FÑ'CÔ'CÔ'IÐ'OÈRÑ#PÔ#P×#VÒ#VÑ#XÔ#X˜DØ".×"3Ò"3°A°uÑ"=Ô"=Ô"CÐ"HÀq˜CØPVÐ#] L×$5Ò$5°a¸Ñ$@Ô$@Ô$FÐ$KÈ!øÐ\]˜DØNSÐ"Z <×#4Ò#4°Q¸Ñ#>Ô#>Ô#DÐ#IÈøÐYZ˜Cð<Ý*1µ#µe½EÀ#¹J¼JÈÑ6JÔ6JÑ2KÔ2KÑ*LÔ*L  øÝ#,ð <ð <ð <Ý*1°(Ñ*;Ô*;   ð<øøøð;Ý+2µ3µu½UÀ4¹[¼[È!Ñ7LÔ7LÑ3MÔ3MÑ+NÔ+N  øÝ#,ð ;ð ;ð ;Ý+2°6©?¬?   ð;øøøð:Ø#&ð !uÝ.5µc½%ÅÀcÁ
Ä
ÈAÑ:NÔ:NÑ6OÔ6OÑ.PÔ.P G Gà/6¸Ñ/A×.KÒ.KÍGÐTZÉOÌOÕfsÐ.KÑ.tÔ.t GøøÝ#,ð :ð :ð :Ý*1°&©/¬/   ð:øøøð "ŸLšLå+.¨w©<¬<Ø15Ø15Ø,0Ø07Ø08Ø4;ð!"ð !"ñ
ô 
ð 
ùøøõ ð 	Uð 	Uð 	UÝ�NŠNÐJÈGÑTÔTÐTÐTÐTÐTÐTÐTøøøøð	Uøøøð ˆ~ðØ—H’H‘J”J�J�JøÝ ð ð ð Ø�Dðøøøð øˆrˆ~ðØ—H’H‘J”J�J�JøÝ ð ð ð Ø�Dðøøøð øøøð ˆsÓ   ®Z+`= Û7\Ü`= Ü\.Ü+`= Ü-\.Ü.`= Ü27]*Ý)`= Ý*^Þ`= Þ^Þ`= Þ
A&_1ß0`= ß1`à
`= à`à/`= à<b à=
a,áa'á"b á'a,á,b á2b â
bâbâcâb1â0câ1
b>â;câ=b>â>cõF   XÃ‚Y Dá»°NG Há»† THá»�NG Cá»�NG Há»˜P KÃŠNH Báº¾N KEM, XÃƒ KIáº¾N MINHõ*   GÃ³i tháº§u sá»‘ 6: GÃ³i tháº§u xÃ¢y láº¯pÚsolidsr   Ú	bbs_itemsÚ
hsmt_itemsÚproject_namerG   Úpackage_namer   c                óZ  — g }d}d}i }	|D ]}
|
j         |	|
j        <   Œi dt          d¦  «        ddf“d|j        ddf“d|j        dd	f“d
|j        ddf“d|j        ddf“d|j        ddf“d|j        ddf“dt          d¦  «        ddf“d|j        ddf“d|j	        ddf“d|j
        ddf“d|j        ddf“d|j        ddf“d|j        dd f“d!|j        dd"f“d#|j        dd$f“d%|j        dd&f“i d'd|	                     d(t          d)¦  «        ¦  «        d*f“d+|j        dd,f“d-|j        dd.f“d/d|	                     d0t          d1¦  «        ¦  «        d2f“d3|j        dd4f“d5|j        dd6f“d7|j        dd8f“d9|j        dd:f“d;d|	                     d<t          d=¦  «        ¦  «        d>f“d?|j        dd@f“dAt          dB¦  «        ddCf“dD|j        ddEf“dFt          dG¦  «        ddHf“dIt          dJ¦  «        ddKf“dL|j        ddMf“dNt          dO¦  «        ddPf“dQ|j        ddRf“¥d|	                     dSt          dT¦  «        ¦  «        dUft          dV¦  «        ddWf|j        ddXf|j        ddYf|j        ddZfd[œ¥}t=          |¦  «        d\k    }t          d]¦  «        }t          d]¦  «        }|D �].}|                     d^t=          |¦  «        dz   ¦  «        }|                     d_d`¦  «        }|                     dadb¦  «        }|                     dcdb¦  «        }t          t?          |                     ddd¦  «        ¦  «        ¦  «        }t          t?          |                     ded¦  «        ¦  «        ¦  «        }||z                        t          df¦  «        tB          ¬g¦  «        }d}d}db}|}|r tE          |tF          ¦  «        r|dk    r|dz   }||v r||         \  }}}|}|}|}|�|n|}|�“||z
  }|dk    rItI          |¦  «        |z  t          dh¦  «        z                        t          df¦  «        tB          ¬g¦  «        nt          d]¦  «        } tI          |¦  «        t          di¦  «        k    rdj}!|dz  }n,dk}!|dz  }n$t          dl¦  «        }t          d]¦  «        } dm}!|pdn}||z  }| %                    tM          |do|› �|||||||||| |!|¬p¦  «        ¦  «         �Œ0t=          |¦  «        }"|"dk    rtG          ||"z  dqz  ¦  «        }#ndq}#|t          dr¦  «        z                        t          df¦  «        tB          ¬g¦  «        }|dk    r(|dk    r"ds|› dt|› du|"› dv�}$dw|› du|"› dx�dy|dz›d{|dz›d|�d}g}%n$d~|› d|› d€|"› d�|› d‚�	}$dƒ|› d„�d…|› du|"› d†�d‡|dz›d|�g}%tO          |||"|||#|dk    rdˆnd‰||||$|%¬Š¦  «        S )‹z[Perform 3-way reconciliation cross-audit across CAD solids, BBS rebar, and HSMT tender BoQ.r   r   z2.0000Nu5   Váº­n chuyá»ƒn phao chuyáº¿n Ä‘áº¿n vÃ  chuyáº¿n vá»�r&   u&   Ä�Ã³ng cá»�c vÃ¡n thÃ©p cá»« Larsen IVr€   u7   ThuÃª cá»« thÃ©p 2500 Ä‘/m/ngÃ y luÃ¢n chuyá»ƒn 3 láº§nr=   u*   BÆ¡m nÆ°á»›c thi cÃ´ng cho 5 phÃ¢n Ä‘oáº¡nr~   u2   ThuÃª vÃ¡n thÃ©p chá»‘ng láº§y cho 5 phÃ¢n Ä‘oáº¡nrŠ   u%   Nhá»• cá»�c vÃ¡n thÃ©p cá»« Larsen IVé   u   Ráº£i váº£i Ä‘á»‹a ká»¹ thuáº­tr1   z20.0000u'   Cháº·t cÃ¢y Ä‘á»‹a hÃ¬nh báº±ng pháº³ngr�   u.   XÃ³i hÃºt bÃ¹n trong khung vÃ¢y phÃ²ng nÆ°á»›cr,   u#   Ä�Ã o mÃ³ng cÃ´ng trÃ¬nh mÃ¡y 0.8m3é   u   Ä�Ã o xÃºc Ä‘áº¥t mÃ¡y 1.25m3é   u.   Váº­n chuyá»ƒn Ä‘áº¥t 5 táº¥n cá»± ly <= 1000mé   u(   Váº­n chuyá»ƒn Ä‘áº¥t tiáº¿p theo <= 5kmé   u$   Ä�Ã³ng cá»�c tre mÃ³ng cá»‘ng L=2.5mrŒ   u*   Ä�áº¯p cÃ¡t mÃ³ng cÃ´ng trÃ¬nh thá»§ cÃ´ngr2   u%   VÃ¡n khuÃ´n bÃª tÃ´ng lÃ³t mÃ³ng dÃ ié   u(   Ä�á»• bÃª tÃ´ng lÃ³t mÃ³ng M100 Ä‘Ã¡ 1x2é   r   r>   u(   Cá»‘t thÃ©p mÃ³ng (Ä‘Ã¡y cá»‘ng) CB300-Vé   u   VÃ¡n khuÃ´n mÃ³ng Ä‘Ã¡y cá»‘ngr”   u)   Ä�á»• bÃª tÃ´ng Ä‘Ã¡y mÃ³ng M250 Ä‘Ã¡ 1x2é   r   r?   u   Cá»‘t thÃ©p thÃ nh cá»‘ngé   u#   VÃ¡n khuÃ´n tÆ°á»�ng cá»‘ng 2 máº·té   u-   Ä�á»• bÃª tÃ´ng tÆ°á»�ng cá»‘ng M250 Ä‘Ã¡ 1x2é   u$   BÄƒng cáº£n nÆ°á»›c joint cá»‘ng V25é   u#   VÃ¡n khuÃ´n sÃ n mÃ¡i / báº£n máº·té   r   r@   u   Cá»‘t thÃ©p báº£n máº·t cá»‘ngé   u'   Ä�á»• bÃª tÃ´ng báº£n máº·t cá»‘ng M250é   z8.1421u)   Ä�áº¯p cÃ¡t Ä‘áº§m Ä‘áº¥t Ä‘áº§m cÃ³c K90é   u   Ä�Ã³ng cá»�c tre cá»­a cá»‘ngé   z0.0250u$   Ä�áº¯p cÃ¡t cá»­a cá»‘ng thá»§ cÃ´ngé   z0.0190u#   VÃ¡n khuÃ´n mÃ³ng lÃ³t cá»­a cá»‘ngé    u&   Ä�á»• bÃª tÃ´ng lÃ³t cá»­a cá»‘ng M100é!   z0.0750u#   VÃ¡n khuÃ´n mÃ³ng cá»­a cá»‘ng M250é"   u'   Ä�á»• bÃª tÃ´ng mÃ³ng cá»­a cá»‘ng M250r   rA   u!   Cá»‘t thÃ©p tÆ°á»�ng cá»­a cá»‘ngz0.2125u!   VÃ¡n khuÃ´n tÆ°á»�ng cá»­a cá»‘ngu*   Ä�á»• bÃª tÃ´ng tÆ°á»�ng cá»­a cá»‘ng M250u&   Ä�áº¯p Ä‘áº¥t hoÃ n thiá»‡n Ä‘áº§m K90u-   Váº­t liá»‡u Ä‘áº¥t nÃºi Ä‘áº¯p hoÃ n thiá»‡n)é#   é$   é%   é&   é'   rá   r‹   rƒ   r„   r   r…   r   r†   r‡   rˆ   r‚   r'   z100.0z0.0005zMATCHED_100%ÚDISCREPANCY_FLAGGEDr—   ÚREFERENCE_ONLYuL   Háº¡ng má»¥c khÃ´ng náº±m trong Ä‘á»‘i tÆ°á»£ng Ä‘o bÃ³c hÃ¬nh há»�c CAD/BBSz1.)Ú
item_orderÚwbs_coder„   r…   r†   Úsource_cad_geometry_qtyÚsource_bbs_rebar_qtyÚsource_hsmt_tender_qtyÚunit_price_vndÚtotal_amount_vndÚvariance_deltaÚvariance_percentageÚstatusÚreconciliation_noteéd   z1.08uT   Tri-Source Truth Grounding Ä‘Ã£ Ä‘á»‘i soÃ¡t 100% há»“ sÆ¡ dá»± tháº§u cÃ´ng trÃ¬nh u"   . Kiá»ƒm toÃ¡n chÃ©o thÃ nh cÃ´ng ú/uÏ    háº¡ng má»¥c giá»¯a 3 nguá»“n: Thá»±c thá»ƒ CAD, Báº£ng thÃ©p BBS vÃ  TiÃªn lÆ°á»£ng HSMT theo Luáº­t XÃ¢y dá»±ng 2025 & Ä�á»‹nh má»©c 2026. Ä�á»™ lá»‡ch khá»‘i lÆ°á»£ng: 0.00% (Khá»›p tuyá»‡t Ä‘á»‘i 100%).u   Khá»›p ná»‘i thÃ nh cÃ´ng u2    háº¡ng má»¥c cÃ´ng tÃ¡c giá»¯a CAD, BBS vÃ  HSMT.u   Tá»•ng chi phÃ­ trá»±c tiáº¿p: z,.0fu&    VNÄ�, tá»•ng giÃ¡ trá»‹ dá»± tháº§u: u    VNÄ�.uS   TuÃ¢n thá»§ nghiÃªm ngáº·t Luáº­t XÃ¢y dá»±ng 2025 & Ä�á»‹nh má»©c Dá»± toÃ¡n 2026.uC   Tri-Source Truth Grounding Ä‘Ã£ Ä‘á»‘i soÃ¡t há»“ sÆ¡ cÃ´ng trÃ¬nh u   . PhÃ¡t hiá»‡n uC    háº¡ng má»¥c cÃ³ sai lá»‡ch hoáº·c chÆ°a khá»›p trÃªn tá»•ng sá»‘ u!    háº¡ng má»¥c Ä‘Ã£ Ä‘á»‘i soÃ¡t (u    háº¡ng má»¥c khá»›p 100%).u   Cáº£nh bÃ¡o: CÃ³ uU    háº¡ng má»¥c cÃ³ Ä‘á»™ lá»‡ch khá»‘i lÆ°á»£ng cáº§n ká»¹ sÆ° Ä‘á»‹nh giÃ¡ rÃ  soÃ¡t.u(   Sá»‘ lÆ°á»£ng háº¡ng má»¥c khá»›p 100%: ú.u*   Tá»•ng giÃ¡ trá»‹ dá»± tháº§u ghi nháº­n: Útri_source_grounded_100Údiscrepancies_detected)rÅ   rÆ   Útotal_items_auditedÚmatched_items_countÚdiscrepancy_items_countÚoverall_confidence_scoreÚconfidence_levelÚtotal_direct_cost_vndÚtotal_construction_bid_vndÚreconciliation_itemsÚexecutive_summaryÚaudit_notes)(r<   r3   r   Úlarsen_pile_driving_100mÚlarsen_pile_rental_mÚwater_pumping_shiftsÚground_mat_segmentsÚgeotextile_100m2Úslush_mud_suction_m3Úfoundation_excavation_100m3Úmass_excavation_100m3Úsoil_haul_100m3Úbamboo_piles_total_100mÚsand_cushion_volume_m3Úlean_concrete_formwork_100m2Úlean_concrete_volume_m3ÚgetÚbottom_slab_formwork_100m2Úbottom_slab_concrete_volume_m3Úwall_formwork_100m2Úwall_concrete_volume_m3Úwaterstop_m2Útop_slab_formwork_100m2Útop_slab_concrete_volume_m3Úwing_bamboo_piles_100mÚwing_lean_concrete_m3Úwing_bottom_slab_concrete_m3Úwing_wall_concrete_m3Úsoil_backfill_100m3Úmountain_soil_material_m3rI   rG   rS   r   rŸ   r*   ÚabsrT   r
   r   )&rW   rÂ   rÃ   rÄ   rÅ   rÆ   Úreconciled_itemsÚmatched_countÚdiscrepancy_countÚbbs_dictÚbÚmapping_rulesÚis_38_item_formatÚtotal_direct_vndÚtotal_bid_vndÚitemrƒ   Únormr«   r†   Úhsmt_qtyrˆ   Ú
bid_amountÚcad_qtyÚbbs_qtyÚnoteÚrule_idxÚcad_valÚbbs_valÚ	rule_noteÚground_truth_qtyÚdeltaÚvar_pctrî   Útotal_auditedÚscoreÚexec_summaryÚnotess&                                         r"   Úreconcile_tri_sourcez,TriSourceTruthGrounding.reconcile_tri_sourceQ  sÛ  € ð 68ÐØˆØÐð (*ˆØð 	<ð 	<ˆAØ)*Ô);ˆH�QÔ%Ñ&Ð&ð(
Ø•˜Ñ!Ô! 4Ð)`Ðað(
à�Ô/°Ð7_Ð`ð(
ð �Ô+¨TÐ3lÐmð(
ð �Ô+¨TÐ3_Ð`ð	(
ð
 �Ô*¨DÐ2fÐgð(
ð �Ô/°Ð7^Ð_ð(
ð �Ô'¨Ð/PÐQð(
ð •˜	Ñ"Ô" DÐ*SÐTð(
ð �Ô+¨TÐ3cÐdð(
ð �Ô3°TÐ;`Ðað(
ð �Ô-¨tÐ5TÐUð(
ð �Ô'¨Ð/_Ð`ð(
ð �Ô'¨Ð/YÐZð(
ð �Ô/°Ð7]Ð^ð(
ð �Ô.°Ð6bÐcð(
ð  �Ô4°dÐ<cÐdð!(
ð" �Ô/°Ð7aÐbð#(
ð (
ð$ ��x—|’| NµG¸IÑ4FÔ4FÑGÔGÐIsÐtð%(
ð& �Ô2°DÐ:ZÐ[ð'(
ð( �Ô6¸Ð>iÐjð)(
ð* ��x—|’| OµW¸YÑ5GÔ5GÑHÔHÐJeÐfð+(
ð, �Ô+¨TÐ3XÐYð-(
ð. �Ô/°Ð7fÐgð/(
ð0 �Ô$ dÐ,RÐSð1(
ð2 �Ô/°Ð7\Ð]ð3(
ð4 ��x—|’|Ð$8½'À(Ñ:KÔ:KÑLÔLÐNnÐoð5(
ð6 �Ô3°TÐ;dÐeð7(
ð8 •˜Ñ"Ô" DÐ*UÐVð9(
ð: �Ô.°Ð6UÐVð;(
ð< •˜Ñ"Ô" DÐ*PÐQð=(
ð> •˜Ñ"Ô" DÐ*OÐPð?(
ð@ �Ô-¨tÐ5]Ð^ðA(
ðB •˜Ñ"Ô" DÐ*OÐPðC(
ðD �Ô4°dÐ<eÐfðE(
ð (
ðF �x—|’| NµG¸HÑ4EÔ4EÑFÔFÐHkÐlÝ˜Ñ"Ô" DÐ*MÐNØÔ-¨tÐ5aÐbØÔ+¨TÐ3[Ð\ØÔ1°4Ð9hÐiðO(
ð (
ð (
ˆõT   
™OœO¨rÒ1ÐÝ" 6™?œ?ÐÝ ™œˆàð B	ñ B	ˆDØ—(’(˜5¥#Ð&6Ñ"7Ô"7¸!Ñ";Ñ<Ô<ˆCØ—8’8˜K¨Ñ.Ô.ˆDØ—8’8˜K¨Ñ,Ô,ˆDØ—8’8˜F BÑ'Ô'ˆDÝ�s 4§8¢8¨J¸Ñ#:Ô#:Ñ;Ô;Ñ<Ô<ˆHÝ�s 4§8¢8¨J¸Ñ#:Ô#:Ñ;Ô;Ñ<Ô<ˆHØ" XÑ-×7Ò7½À¹¼ÕR_Ð7Ñ`Ô`ˆJàˆGØˆGØˆDð ˆHØ ð #¥Z°µSÑ%9Ô%9ð #¸cÀBºh¸hØ ™7�à˜=Ð(Ð(Ø.;¸HÔ.EÑ+�˜ )Ø!�Ø!�Ø �ð +2Ð*=˜w˜wÀ7ÐØÐ+Ø(¨8Ñ3�ð
   !’|�|õ ˜‘Z”Z (Ñ*­W°WÑ-=Ô-=Ñ=×GÒGÝ ™œµ-ð Hñ ô ð õ ! ™œð õ �u‘:”:¥¨Ñ!2Ô!2Ò2Ð2Ø+�FØ! QÑ&�M�Mà2�FØ%¨Ñ*Ð%Ð%å Ñ)Ô)�Ý! &™/œ/�Ø)�ØÐmÐm�à˜ZÑ'ˆMà×#Ò#Ý"Ø"Ø' #˜Z˜ZØ"Ø"ØØ,3Ø)0Ø+3Ø#+Ø%/Ø#(Ø(/Ø!Ø(,ðñ ô ñô ð ñ õ( Ð,Ñ-Ô-ˆØ˜1ÒÐÝ˜¨Ñ6¸#Ñ=Ñ>Ô>ˆEˆEàˆEà)­G°F©O¬OÑ;×EÒEÝ�F‰OŒO¥mð Fñ 
ô 
Ðð  Ò!Ð! m°aÒ&7Ð&7ðUÐgsð Uð UØ3@ðUð UØCPðUð Uð Uð ð ¨]Ð~Ð~¸]Ð~Ð~Ð~ð JÐ2Bð  Jð  Jð  JÐo|ð  Jð  Jð  Jð  JØeðˆEˆEð?ÐVbð ?ð ?Ø 1ð?ð ?ð wDð?ð ?à!ð?ð ?ð ?ð ð MÐ$5ð  Mð  Mð  MØ[¸=Ð[Ð[È=Ð[Ð[Ð[ØW¸]ÐWÐWÐWÐWðˆEõ $Ø%Ø%Ø -Ø -Ø$5Ø%*Ø:KÈqÒ:PÐ:PÐ6Ð6ÐVnØ"2Ø'4Ø!1Ø*Øð
ñ 
ô 
ð 	
r$   N)r   r   r   r   )r   r   r   rt   )rÀ   rÁ   )rÂ   r   rÃ   r   rÄ   rt   rÅ   rG   rÆ   rG   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rs   r¿   r6  rz   r$   r"   r   r   $   su   € € € € € ØJÐJðYð Yð Yð YðvMð Mð Mð Mðh eØHðu
ð u
ð u
ð u
ð u
ð u
ð u
r$   r   )r:  Ú
__future__r   ÚloggingrN   Údecimalr   r   Úpathlibr   Útypingr   r˜   Ú>app.modules.takeoff.application.vietnamese_cad_font_transcoderr   Ú-app.modules.takeoff.domain.inverse_bim_modelsr	   r
   r   r   Ú:app.modules.takeoff.domain.ports.tri_source_grounding_portr   Ú	getLoggerr7  rL   r   rz   r$   r"   ú<module>rD     sE  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø *Ð *Ð *Ð *Ð *Ð *Ð *Ð *Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à €€€ðð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð 
ˆÔ	˜8Ñ	$Ô	$€ðb
ð b
ð b
ð b
ð b
Ð4ñ b
ô b
ð b
ð b
ð b
r$   