§
    j¿Àjæ'  ã                  ót   — d dl mZ d dlZd dlZd dlmZ d dlmZ  ej        e	¦  «        Z
 G d„ d¦  «        ZdS )é    )ÚannotationsN)ÚPath)ÚAnyc                  óD   — e Zd Zdd„Zdd„Z	 ddd„Zdd„Zdd„Zddd„Zd	S )ÚErpTakeoffHeaderMixinÚpayloadúdict[str, Any]Úreturnc           
     óV  — |                      d¦  «        }t          |t          t          f¦  «        rt	          j        |¦  «        }n|rt          |¦  «        nd}i d|                      d¦  «        “d|                      d¦  «        “d|                      d¦  «        “d|                      dd¦  «        “d|                      d|                      dd	¦  «        ¦  «        “d
|                      d
d¦  «        “d|                      dd¦  «        “d|                      dd¦  «        “d|                      dd¦  «        “d|                      dd¦  «        “d|                      dd¦  «        “d|                      dd¦  «        “d|                      dd¦  «        “d|                      dd¦  «        “d|                      dd¦  «        “d|                      dd¦  «        “d|                      dd¦  «        “|                      dd¦  «        |                      dd¦  «        t          |                      dd¦  «        ¦  «        |                      d d!¦  «        |                      d"d ¦  «        |                      d#d$¦  «        |d%œ¥}|                      ¦   «         5 }| 	                    ¦   «         5 }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 )'NÚ
pages_dataz[]ÚidÚ
project_idÚdocument_idÚdrawing_codezDWG-001Údrawing_titleu   Báº£n váº½ ká»¹ thuáº­tÚdrawing_typeÚcivil_buildingÚdrawing_scalez1:100Úfile_urlÚ Ú	file_pathÚ	file_hashÚpreview_image_urlÚtotal_estimated_cost_vndg        Útotal_concrete_volume_m3Útotal_formwork_area_m2Útotal_rebar_weight_tonsÚtotal_earthwork_volume_m3Útakeoff_statusÚpendingÚai_vision_modelzgemini-3.1-pro-highÚai_analysis_notesÚconfidence_scoreéb   Úconfidence_levelÚhsmt_verifiedÚhsmt_reference_fileÚai_report_messageuG   AI Quá»³nh QS Ä‘Ã£ sáºµn sÃ ng Ä‘á»‘i soÃ¡t bÃ³c tÃ¡ch khá»‘i lÆ°á»£ng.)r!   r"   r#   r%   r'   r(   r   a4  
                    INSERT INTO erp_drawing_takeoffs (
                        id, project_id, document_id, drawing_code, drawing_title, drawing_type,
                        drawing_scale, file_url, file_path, file_hash, preview_image_url,
                        total_estimated_cost_vnd, total_concrete_volume_m3, total_formwork_area_m2,
                        total_rebar_weight_tons, total_earthwork_volume_m3, takeoff_status,
                        ai_vision_model, ai_analysis_notes, confidence_score, confidence_level,
                        hsmt_reference_file, ai_report_message, pages_data
                    ) VALUES (
                        %(id)s, %(project_id)s, %(document_id)s, %(drawing_code)s, %(drawing_title)s, %(drawing_type)s,
                        %(drawing_scale)s, %(file_url)s, %(file_path)s, %(file_hash)s, %(preview_image_url)s,
                        %(total_estimated_cost_vnd)s, %(total_concrete_volume_m3)s, %(total_formwork_area_m2)s,
                        %(total_rebar_weight_tons)s, %(total_earthwork_volume_m3)s, %(takeoff_status)s,
                        %(ai_vision_model)s, %(ai_analysis_notes)s, %(confidence_score)s, %(confidence_level)s,
                        %(hsmt_reference_file)s, %(ai_report_message)s, %(pages_data)s
                    ) RETURNING *;
                )ÚgetÚ
isinstanceÚlistÚdictÚjsonÚdumpsÚstrÚintÚget_connectionÚcursorÚexecuteÚcommitÚfetchone)Úselfr   r   Úpages_data_jsonÚdefaultsÚconnÚcurÚsqls           úEC:\Projects\DSCons\app\core\postgres\clients\takeoff_header_client.pyÚcreate_drawing_takeoffz,ErpTakeoffHeaderMixin.create_drawing_takeoff   sì  € Ø—[’[ Ñ.Ô.ˆ
Ý�j¥4­ ,Ñ/Ô/ð 	FÝ"œj¨Ñ4Ô4ˆOˆOà1;ÐE�c *™oœo˜oÀˆOð
Ø�'—+’+˜dÑ#Ô#ð
à˜'Ÿ+š+ lÑ3Ô3ð
ð ˜7Ÿ;š; }Ñ5Ô5ð
ð ˜GŸKšK¨¸	ÑBÔBð	
ð
 ˜WŸ[š[Ø §¢¨^Ð=VÑ!WÔ!Wñô ð
ð ˜GŸKšK¨Ð8HÑIÔIð
ð ˜WŸ[š[¨¸'ÑBÔBð
ð ˜Ÿš J°Ñ3Ô3ð
ð ˜Ÿš [°"Ñ5Ô5ð
ð ˜Ÿš [°"Ñ5Ô5ð
ð   §¢Ð-@À"Ñ!EÔ!Eð
ð '¨¯ªÐ4NÐPSÑ(TÔ(Tð
ð '¨¯ªÐ4NÐPSÑ(TÔ(Tð
ð  % g§k¢kÐ2JÈCÑ&PÔ&Pð!
ð" & w§{¢{Ð3LÈcÑ'RÔ'Rð#
ð$ (¨¯ªÐ5PÐRUÑ)VÔ)Vð%
ð& ˜gŸkškÐ*:¸IÑFÔFð'
ð(  'Ÿ{š{Ð+<Ð>SÑTÔTØ!(§¢Ð-@À"Ñ!EÔ!EÝ # G§K¢KÐ0BÀBÑ$GÔ$GÑ HÔ HØ '§¢Ð,>ÀÑ PÔ PØ#*§;¢;Ð/DÀdÑ#KÔ#KØ!(§¢Ø#ØYñ"ô "ð *ð;
ð 
ð 
ˆð> × Ò Ñ"Ô"ð 	& dØ—’‘”ð & #ð�ð" —’˜C Ñ*Ô*Ð*Ø—’‘”�Ø—|’|‘~”~ð)&ð &ð &ð &ñ &ô &ð &ð	&ð 	&ð 	&ð 	&ñ 	&ô 	&ð 	&ð 	&ð&ð &ð &ð &øøøð &ð &ð &ð &ð &ð	&ð 	&ð 	&ñ 	&ô 	&ð 	&ð 	&ð 	&ð 	&ð 	&ð 	&ð 	&øøøð 	&ð 	&ð 	&ð 	&ð 	&ð 	&s7   ÊLÊ,A LË,LÌL		Ì	LÌL		ÌLÌL"Ì%L"Ú
takeoff_idr/   údict[str, Any] | Nonec                ó*  — d}|                       ¦   «         5 }|                     ¦   «         5 }|                     ||f¦  «         |                     ¦   «         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 )uA   Láº¥y thÃ´ng tin chi tiáº¿t má»™t há»“ sÆ¡ bÃ³c tÃ¡ch báº£n váº½.z½
            SELECT t.*, p.project_name, p.project_code
            FROM erp_drawing_takeoffs t
            LEFT JOIN projects p ON t.project_id = p.id
            WHERE t.id = %s;
        N)r1   r2   r3   r5   )r6   r>   r;   r9   r:   s        r<   Úget_drawing_takeoffz)ErpTakeoffHeaderMixin.get_drawing_takeoffI   s&  € ðˆð × Ò Ñ"Ô"ð 	" d¨D¯KªK©M¬Mð 	"¸SØ�KŠK˜˜j˜]Ñ+Ô+Ð+Ø—<’<‘>”>ð	"ð 	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"ð 	"ð 	"s4   —B¬+A0ÁBÁ0A4	Á4BÁ7A4	Á8BÂBÂBNé2   r   ú
str | NoneÚlimitr0   úlist[dict[str, Any]]c                ó@  — |rd}||f}nd}|f}|                       ¦   «         5 }|                     ¦   «         5 }|                     ||¦  «         |                     ¦   «         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 )u5   Láº¥y danh sÃ¡ch cÃ¡c há»“ sÆ¡ bÃ³c tÃ¡ch báº£n váº½.a  
                SELECT t.*, p.project_name, p.project_code
                FROM erp_drawing_takeoffs t
                LEFT JOIN projects p ON t.project_id = p.id
                WHERE t.project_id = %s
                ORDER BY t.created_at DESC
                LIMIT %s;
            zõ
                SELECT t.*, p.project_name, p.project_code
                FROM erp_drawing_takeoffs t
                LEFT JOIN projects p ON t.project_id = p.id
                ORDER BY t.created_at DESC
                LIMIT %s;
            N)r1   r2   r3   Úfetchall)r6   r   rD   r;   Úparamsr9   r:   s          r<   Úlist_drawing_takeoffsz+ErpTakeoffHeaderMixin.list_drawing_takeoffsU   sJ  € ð ð 	ðˆCð ! %Ð(ˆFˆFðˆCð �XˆFà× Ò Ñ"Ô"ð 	" d¨D¯KªK©M¬Mð 	"¸SØ�KŠK˜˜VÑ$Ô$Ð$Ø—<’<‘>”>ð	"ð 	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"ð 	"ð 	"s4   £B¸*A;Á"BÁ;A?	Á?BÂA?	ÂBÂBÂBc                óÞ  — |sdS g }g }|                      ¦   «         D ]|\  }}|                     |› d�¦  «         |dk    rDt          |t          t          f¦  «        r(|                     t          j        |¦  «        ¦  «         Œg|                     |¦  «         Œ}|                     |¦  «         dd                     |¦  «        › d�}|                      ¦   «         5 }| 	                    ¦   «         5 }	|	 
                    ||¦  «         |	                     ¦   «         }
|                     ¦   «          |
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 )uu   Cáº­p nháº­t thÃ´ng tin há»“ sÆ¡ bÃ³c tÃ¡ch báº£n váº½ (tráº¡ng thÃ¡i, tá»•ng khá»‘i lÆ°á»£ng, dá»± toÃ¡n, ghi chÃº).Nz = %sr   z UPDATE erp_drawing_takeoffs SET z, z;, updated_at = CURRENT_TIMESTAMP WHERE id = %s RETURNING *;)ÚitemsÚappendr*   r+   r,   r-   r.   Újoinr1   r2   r3   r5   r4   )r6   r>   r   Úset_clausesrH   ÚkÚvr;   r9   r:   Úrows              r<   Úupdate_drawing_takeoffz,ErpTakeoffHeaderMixin.update_drawing_takeoffq   s  € ð ð 	Ø�4ØˆØˆØ—M’M‘O”Oð 	!ð 	!‰DˆAˆqØ×Ò !˜{˜{˜{Ñ+Ô+Ð+Ø�LÒ Ð ¥Z°µD½$°<Ñ%@Ô%@Ð Ø—’�dœj¨™mœmÑ,Ô,Ð,Ð,à—’˜aÑ Ô Ð Ð Ø�Š�jÑ!Ô!Ð!ð E°·²¸;Ñ1GÔ1Gð  Eð  Eð  Eˆà× Ò Ñ"Ô"ð 	 d¨D¯KªK©M¬Mð 	¸SØ�KŠK˜˜VÑ$Ô$Ð$Ø—,’,‘.”.ˆCØ�KŠK‰MŒMˆMØð		ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s7   ÃE"Ã1A E
Ä1E"Å
E	ÅE"ÅE	ÅE"Å"E&Å)E&Úboolc                óò  ‡
— |                       ¦   «         5 }|                     ¦   «         5 }|                     d|f¦  «         |                     d|f¦  «         |                     ¦   «         }|                     ¦   «          |�r§|                     d¦  «        �r‘	 t          |d         ¦  «        Š
t          ˆ
fd„dD ¦   «         ¦  «        }t          ˆ
fd„dD ¦   «         ¦  «        }|r,|s*‰
                     ¦   «         r‰
 	                    d¬	¦  «         �n# t          $ rÔ 	 t          t          ¦  «                             ¦   «         j        d
         dz  dz  }|                     ¦   «         r…|                     |› d�¦  «        D ]'}	 | 	                    ¦   «          Œ# t          $ r Y Œ$w xY w|                     ‰
j        › d�¦  «        D ]'}	 | 	                    ¦   «          Œ# t          $ r Y Œ$w xY wY n8t          $ r,}	t                                d|d         |	¦  «         Y d}	~	nd}	~	ww xY wt%          |¦  «        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 )uT   XÃ³a há»“ sÆ¡ bÃ³c tÃ¡ch báº£n váº½ vÃ  toÃ n bá»™ cÃ¡c dÃ²ng chi tiáº¿t liÃªn quan.z<DELETE FROM erp_drawing_takeoff_items WHERE takeoff_id = %s;zGDELETE FROM erp_drawing_takeoffs WHERE id = %s RETURNING id, file_path;r   c              3  ó*   •K  — | ]}|‰j         v V — Œd S ©N©Úparts©Ú.0ÚpartÚps     €r<   ú	<genexpr>z?ErpTakeoffHeaderMixin.delete_drawing_takeoff.<locals>.<genexpr>›   s:   øè è € ð /ð /Ø04˜D A¤G˜Oð/ð /ð /ð /ð /ð /ó    )ÚuploadsÚtmpÚtempÚsecure_vaultc              3  ó*   •K  — | ]}|‰j         v V — Œd S rV   rW   rY   s     €r<   r]   z?ErpTakeoffHeaderMixin.delete_drawing_takeoff.<locals>.<genexpr>ž   s:   øè è € ð -ð -Ø04˜D A¤G˜Oð-ð -ð -ð -ð -ð -r^   )Ú	CongTrinhu   HÄ�-2026u   HÄ�-2025u   HÄ�-2024u   HÄ�-2023u   HÄ�-2022ÚKNOWLEDGE_BASET)Ú
missing_oké   ÚstaticÚdrawingsz*.*u1   [TAKEOFF] KhÃ´ng thá»ƒ xÃ³a file váº­t lÃ½ %s: %sN)r1   r2   r3   r5   r4   r)   r   ÚanyÚexistsÚunlinkÚ	ExceptionÚ__file__ÚresolveÚparentsÚglobÚstemÚloggerÚwarningrS   )r6   r>   r9   r:   ÚdeletedÚis_safe_temp_dirÚis_repo_sourceÚdrawings_dirÚfÚer\   s             @r<   Údelete_drawing_takeoffz,ErpTakeoffHeaderMixin.delete_drawing_takeoffˆ   s¤  ø€ à× Ò Ñ"Ô"ð .	% dØ—’‘”ð -% #à—’ØRØ�Mñô ð ð
 —’Ø]Ø�Mñô ð ð Ÿ,š,™.œ.�Ø—’‘”�Øñ ˜wŸ{š{¨;Ñ7Ô7ñ ðÝ  ¨Ô!5Ñ6Ô6˜Ý+.ð /ð /ð /ð /Ø8bð/ñ /ô /ñ ,ô ,Ð(õ *-ð -ð -ð -ð -ð 9Tð-ñ -ô -ñ *ô *˜ð ,ð 6°Nð 6ÀqÇxÂxÁzÄzð 6ØŸHšH°˜HÑ5Ô5Ð5ùøÝ$ð )ð )ð )Øå'+­H¡~¤~×'=Ò'=Ñ'?Ô'?Ô'GÈÔ'JÈXÑ'UÐXbÑ'b˜Ø'×.Ò.Ñ0Ô0ð 
)Ø%1×%6Ò%6¸*Ð7IÐ7IÐ7IÑ%JÔ%Jð )ð ) ð!)Ø$%§H¢H¡J¤J J JøÝ'0ð !)ð !)ð !)Ø$( Dð!)øøøà%1×%6Ò%6¸!¼&°~°~°~Ñ%FÔ%Fð )ð ) ð!)Ø$%§H¢H¡J¤J J JøÝ'0ð !)ð !)ð !)Ø$( Dð!)øøøøøå$ð ð ð ÝŸšØOØ# KÔ0Øñô ð ð ð ð ð ð øøøøðøøøõ ˜G‘}”}ð[-%ð -%ð -%ð -%ñ -%ô -%ð -%ð.	%ð .	%ð .	%ð .	%ñ .	%ô .	%ð .	%ð .	%ð-%ð -%ð -%ð -%øøøð -%ð -%ð -%ð -%ð -%ð.	%ð .	%ð .	%ñ .	%ô .	%ð .	%ð .	%ð .	%ð .	%ð .	%ð .	%ð .	%øøøð .	%ð .	%ð .	%ð .	%ð .	%ð .	%sµ   –I,«A0IÂA9DÄIÄA0H)ÆFÆH)Æ
F*Æ'H)Æ)F*Æ*"H)ÇG"Ç!H)Ç"
G/Ç,H)Ç.G/Ç/H)Ç2IÇ4	H)Ç="H$ÈIÈ$H)È)IÈ:I,ÉI	ÉI,ÉI	ÉI,É,I0É3I0c                óö  — |                       ¦   «         5 }|                     ¦   «         5 }|r/|                     d|f¦  «         |                     d|f¦  «         n*|                     d¦  «         |                     d¦  «         |                     ¦   «         }|                     ¦   «          t          |¦  «        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 )uT   XÃ³a hÃ ng loáº¡t há»“ sÆ¡ bÃ³c tÃ¡ch báº£n váº½ cÅ© (DÃ nh riÃªng cho Super Admin).z½
                        DELETE FROM erp_drawing_takeoff_items 
                        WHERE takeoff_id IN (SELECT id FROM erp_drawing_takeoffs WHERE project_id = %s);
                    zDDELETE FROM erp_drawing_takeoffs WHERE project_id = %s RETURNING id;z&DELETE FROM erp_drawing_takeoff_items;z.DELETE FROM erp_drawing_takeoffs RETURNING id;N)r1   r2   r3   rG   r4   Úlen)r6   r   r9   r:   Úrowss        r<   Údelete_all_drawing_takeoffsz1ErpTakeoffHeaderMixin.delete_all_drawing_takeoffsº   s�  € à× Ò Ñ"Ô"ð 	! dØ—’‘”ð ! #Øð RØ—K’Kðð $˜ñô ð ð —K’KØ^Ø#˜ñô ð ð ð
 —K’KÐ HÑIÔIÐIØ—K’KÐ PÑQÔQÐQØ—|’|‘~”~�Ø—’‘”�Ý˜4‘y”yð%!ð !ð !ð !ñ !ô !ð !ð	!ð 	!ð 	!ð 	!ñ 	!ô 	!ð 	!ð 	!ð!ð !ð !ð !øøøð !ð !ð !ð !ð !ð	!ð 	!ð 	!ñ 	!ô 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!øøøð 	!ð 	!ð 	!ð 	!ð 	!ð 	!s5   •C.ªBCÂ<C.ÃC	ÃC.ÃC	ÃC.Ã.C2Ã5C2)r   r	   r
   r	   )r>   r/   r
   r?   )NrB   )r   rC   rD   r0   r
   rE   )r>   r/   r   r	   r
   r?   )r>   r/   r
   rS   rV   )r   rC   r
   r0   )	Ú__name__Ú
__module__Ú__qualname__r=   rA   rI   rR   r{   r   © r^   r<   r   r      s�   € € € € € ð;&ð ;&ð ;&ð ;&ðz
"ð 
"ð 
"ð 
"ð ;=ð"ð "ð "ð "ð "ð8ð ð ð ð.0%ð 0%ð 0%ð 0%ðd!ð !ð !ð !ð !ð !ð !r^   r   )Ú
__future__r   r-   ÚloggingÚpathlibr   Útypingr   Ú	getLoggerr€   rs   r   rƒ   r^   r<   ú<module>r‰      s›   ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à	ˆÔ	˜8Ñ	$Ô	$€ðD!ð D!ð D!ð D!ð D!ñ D!ô D!ð D!ð D!ð D!r^   