§
    »‰¬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mZmZmZmZ d dlmZ d dlmZ d dlmZ d	d
lmZ  ej        d¦  «        Z e	¦   «         Ze                     dd¬¦  «         e
 eg d¢¦  «        ¦  «        fd2d„¦   «         Ze                     dd¬¦  «         edd¬¦  «         edd¬¦  «         eddd d!¬"¦  «         e
 eg d¢¦  «        ¦  «        fd3d'„¦   «         Ze                     d(d)¬¦  «         ed*d+¬¦  «         edd,¬¦  «         edd-¬¦  «         edd.¬¦  «         e
 eg d¢¦  «        ¦  «        fd4d1„¦   «         Z dS )5é    )ÚannotationsN)ÚPath)ÚAny)Ú	APIRouterÚDependsÚFileÚFormÚHTTPExceptionÚQueryÚResponseÚ
UploadFile)Úrequire_role)ÚErpDatabaseClient)Úget_drawing_takeoff_serviceé   )ÚSTORAGE_VAULTzdscons.api.takeoff.exportz/{takeoff_id}/export-exceluZ   Xuáº¥t ToÃ n Bá»™ Báº£ng BÃ³c TÃ¡ch Dá»± ToÃ¡n BoQ (Phá»¥ Lá»¥c 03a) ra File Excel (.xlsx))Úsummary)Ú
superadminÚdirectorÚmanagerÚengineerÚstaffÚ
takeoff_idÚstrÚcurrent_userúdict[str, Any]Úreturnr   c                ó  — t          ¦   «         }|                     | ¦  «        }|st          dd¬¦  «        ‚	 t          ¦   «         }|                     | ¦  «        }t          |                     d¦  «        pd¦  «                             dd¦  «                             dd¦  «        }d	|› d
�}t          |ddd|› d�i¬¦  «        S # t          $ r4}t                               d|¦  «         t          dd|›�¬¦  «        ‚d}~ww xY w)u†   Táº¡o vÃ  táº£i vá»� file Excel (.xlsx) chuáº©n dá»± toÃ¡n AEC bao gá»“m báº£ng BoQ vÃ  báº£ng giÃ¡ váº­t liá»‡u thá»‹ trÆ°á»�ng 2026.é”  õ&   KhÃ´ng tÃ¬m tháº¥y há»“ sÆ¡ báº£n váº½©Ústatus_codeÚdetailÚdrawing_codeÚDu_Toan_BoQú Ú_ú.ÚDu_Toan_BoQ_z
_2026.xlsxzAapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheetúContent-Dispositionúattachment; filename="ú"©ÚcontentÚ
media_typeÚheadersz![TAKEOFF] Export Excel failed: %séô  u(   Lá»—i khi xuáº¥t file Excel dá»± toÃ¡n: N)r   Úget_drawing_takeoffr
   r   Úexport_takeoff_to_excelr   ÚgetÚreplacer   Ú	ExceptionÚloggerÚerror)	r   r   ÚclientÚtakeoffÚserviceÚexcel_bytesÚ	safe_codeÚfilenameÚes	            úDC:\Projects\DSCons\app\modules\takeoff\presentation\export_routes.pyÚexport_takeoff_boq_excelrA      sA  € õ Ñ Ô €FØ×(Ò(¨Ñ4Ô4€GØð ^Ý¨Ð4\Ð]Ñ]Ô]Ð]ð
Ý-Ñ/Ô/ˆØ×5Ò5°jÑAÔAˆå�—’˜NÑ+Ô+Ð<¨}Ñ=Ô=ßŠW�S˜#ÑÔßŠW�S˜#ÑÔð 	ð
 8 )Ð7Ð7Ð7ˆåØØZà%Ð'KÀÐ'KÐ'KÐ'Kðð
ñ 
ô 
ð 	
øõ ð 
ð 
ð 
Ý�ŠÐ8¸!Ñ<Ô<Ð<ÝØÐ$TÈqÐ$TÐ$Tð
ñ 
ô 
ð 	
øøøøð
øøøs   ¸BC Ã
DÃ/C>Ã>Dz/{takeoff_id}/export-a3-pdfuV   Xuáº¥t Báº£n váº½ Ká»¹ thuáº­t sang file PDF Khá»• A3 Ä�á»™ PhÃ¢n Giáº£i Cao (300 DPI)Ú	landscapeu*   Khá»• giáº¥y in: landscape hoáº·c portrait)ÚdescriptionÚprint_readyu)   Cháº¿ Ä‘á»™ mÃ u: print_ready hoáº·c darki,  éd   iX  u$   Ä�á»™ phÃ¢n giáº£i trang in A3 (DPI))ÚgeÚlerC   ÚorientationÚcolor_schemeÚdpiÚintc                óò  — t          ¦   «         }|                     | ¦  «        }|st          dd¬¦  «        ‚|                     d¦  «        pd}|                     d¦  «        pd}d}	|r1t	          |¦  «                             ¦   «         rt	          |¦  «        }	nm|rkt	          |                     d¦  «        ¦  «        }
t          t	          |¦  «        j        z  }|
                     ¦   «         r|
}	n|                     ¦   «         r|}	|	r|	                     ¦   «         st          dd	¬¦  «        ‚	 t          ¦   «         }| 
                    |	|||¬
¦  «        }t          |                     d¦  «        pd¦  «                             dd¦  «        }|› d|› d�}t          |dd|› d�d|dk    rdnddœ¬¦  «        S # t          $ r4}t                               d|¦  «         t          dd|›�¬¦  «        ‚d}~ww xY w)uQ   Táº¡o vÃ  táº£i vá»� file PDF Khá»• A3 chuáº©n in áº¥n thi cÃ´ng (420mm x 297mm).r   r    r!   Ú	file_pathÚ Úfile_urlNú/u;   File báº£n váº½ gá»‘c khÃ´ng tá»“n táº¡i trÃªn há»‡ thá»‘ng©rM   rH   rI   rJ   r$   ÚBAN_VEr&   r'   Ú	_Size_A3_ú.pdfúapplication/pdfr+   r,   ÚA3rB   Ú420x297Ú297x420)r*   úX-Paper-SizezX-Dimensions-MMr-   z"[TAKEOFF] Export A3 PDF failed: %sr1   u   Lá»—i khi xuáº¥t PDF A3: )r   r2   r
   r4   r   ÚexistsÚlstripr   Únamer   Úexport_drawing_to_a3_pdfr   r5   r   r6   r7   r8   )r   rH   rI   rJ   r   r9   r:   Úfile_path_strrO   rM   Úcand1Úcand2r;   Ú	pdf_bytesr=   r>   r?   s                    r@   Ú export_takeoff_drawing_to_a3_pdfrb   G   s[  € õ( Ñ Ô €FØ×(Ò(¨Ñ4Ô4€GØð ^Ý¨Ð4\Ð]Ñ]Ô]Ð]à—K’K Ñ,Ô,Ð2°€MØ�{Š{˜:Ñ&Ô&Ð,¨"€Hà!€IØð �˜mÑ,Ô,×3Ò3Ñ5Ô5ð Ý˜Ñ'Ô'ˆ	ˆ	Ø	ð Ý�X—_’_ SÑ)Ô)Ñ*Ô*ˆÝ¥ X¡¤Ô 3Ñ3ˆØ�<Š<‰>Œ>ð 	ØˆIˆIØ�\Š\‰^Œ^ð 	ØˆIàð 
˜I×,Ò,Ñ.Ô.ð 
ÝØÐ$að
ñ 
ô 
ð 	
ðWÝ-Ñ/Ô/ˆØ×4Ò4ØØ#Ø%Øð	 5ñ 
ô 
ˆ	õ ˜Ÿš NÑ3Ô3Ð?°xÑ@Ô@×HÒHÈÈcÑRÔRˆ	ØÐ;Ð;¨+Ð;Ð;Ð;ˆåØØ(à'KÀÐ'KÐ'KÐ'KØ $à +Ò-Ð-ð $- 9àðð ð

ñ 

ô 

ð 
	
øõ ð Wð Wð WÝ�ŠÐ9¸1Ñ=Ô=Ð=Ý¨Ð4UÐPQÐ4UÐ4UÐVÑVÔVÐVøøøøðWøøøs   Ä/BF8 Æ8
G6Ç/G1Ç1G6z/convert-to-a3-pdfuN   Chuyá»ƒn Ä‘á»•i Trá»±c tiáº¿p File CAD / DWG / DXF sang PDF Khá»• A3 (300 DPI).zFile CAD DWG, DXF, PDF, PNGu   landscape hoáº·c portraitu   print_ready hoáº·c darkÚDPIÚfiler   c              ƒ  ó  K  — | j         st          dd¬¦  «        ‚g d¢}t          | j         ¦  «        j                             ¦   «         }||vrt          dd¬¦  «        ‚t
          d| j         › �z  }	 t          |d¦  «        5 }t          j        | j	        |¦  «         ddd¦  «         n# 1 swxY w Y   t          ¦   «         }	|	                     ||||¬	¦  «        }
t          | j         ¦  «        j        }|› d
|› d�}t          |
dd|› d�ddœ¬¦  «        |                     ¦   «         r&	 |                     ¦   «          S # t           $ r Y S w xY wS # |                     ¦   «         r&	 |                     ¦   «          w # t           $ r Y w w xY ww xY w)uV   Upload trá»±c tiáº¿p má»™t file CAD vÃ  nháº­n ngay file PDF khá»• A3 chuáº©n in áº¥n.i�  u   TÃªn file khÃ´ng há»£p lá»‡r!   )z.dwgz.dxfrT   z.pngz.jpgz.jpegz.webpu.   Ä�á»‹nh dáº¡ng file khÃ´ng Ä‘Æ°á»£c há»— trá»£Útemp_ÚwbNrQ   Ú_A3_rT   rU   r+   r,   rV   )r*   rY   r-   )r>   r
   r   ÚsuffixÚlowerr   ÚopenÚshutilÚcopyfileobjrd   r   r]   Ústemr   rZ   Úunlinkr6   )rd   rH   rI   rJ   r   Úallowed_extsÚfile_extÚ	temp_pathÚbufferr;   ra   Ú	base_nameÚout_filenames                r@   Údirect_convert_cad_to_a3_pdfrv   Ž   s;  è è € ð  Œ=ð SÝ¨Ð4QÐRÑRÔRÐRàMÐMÐM€LÝ�D”MÑ"Ô"Ô)×/Ò/Ñ1Ô1€HØ�|Ð#Ð#Ý¨Ð4dÐeÑeÔeÐeåÐ 7¨¬Ð 7Ð 7Ñ7€IðÝ�)˜TÑ"Ô"ð 	2 fÝÔ˜tœy¨&Ñ1Ô1Ð1ð	2ð 	2ð 	2ñ 	2ô 	2ð 	2ð 	2ð 	2ð 	2ð 	2ð 	2øøøð 	2ð 	2ð 	2ð 	2õ .Ñ/Ô/ˆØ×4Ò4ØØ#Ø%Øð	 5ñ 
ô 
ˆ	õ ˜œÑ'Ô'Ô,ˆ	Ø#Ð:Ð:¨Ð:Ð:Ð:ˆåØØ(à'OÀÐ'OÐ'OÐ'OØ $ðð ð
ñ 
ô 
ð ×ÒÑÔð 	ðØ× Ò Ñ"Ô"Ð"Ð"øÝð ð ð Ø�ðøøøð	øˆ9×ÒÑÔð 	ðØ× Ò Ñ"Ô"Ð"Ð"øÝð ð ð Ø�ðøøøð	øøøsg   Á2E ÂB)ÂE Â)B-Â-E Â0B-Â1A#E Ä)D>Ä>
EÅ
EÅFÅ%E:Å9FÅ:
FÆFÆFÆF)r   r   r   r   r   r   )r   r   rH   r   rI   r   rJ   rK   r   r   r   r   )rd   r   rH   r   rI   r   rJ   rK   r   r   r   r   )!Ú
__future__r   Úloggingrl   Úpathlibr   Útypingr   Úfastapir   r   r   r	   r
   r   r   r   Ú"app.modules.auth.presentation.authr   Úapp.core.postgres.erp_clientr   Ú7app.modules.takeoff.application.drawing_takeoff_servicer   Úschemasr   Ú	getLoggerr7   Úrouterr4   rA   rb   Úpostrv   © ó    r@   ú<module>r…      s  ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð <Ð ;Ð ;Ð ;Ð ;Ð ;Ø :Ð :Ð :Ð :Ð :Ð :Ø _Ð _Ð _Ð _Ð _Ð _à "Ð "Ð "Ð "Ð "Ð "à	ˆÔ	Ð6Ñ	7Ô	7€Ø	ˆ‰Œ€ð ‡‚Ø Øhð ñ ô ð $+ 7ØˆØFÐFÐFñ	
ô 	
ñ$ô $ð#
ð #
ð #
ð #
ñ	ô ð#
ðL ‡‚Ø!Ødð ñ ô ð �uØÐ!Mðñ ô ð ˜ØÐ#Nðñ ô ð ˆu�S˜S SÐ6\Ð]Ñ]Ô]Ø#* 7ØˆØFÐFÐFñ	
ô 	
ñ$ô $ð@Wð @Wð @Wð @Wñ	ô ð@WðF ‡‚ØØ\ð ñ ô ð
 �t˜CÐ-JÐKÑKÔKØ�t˜KÐ5PÐQÑQÔQØ˜˜]Ð8QÐRÑRÔRØˆt�C UÐ+Ñ+Ô+Ø#* 7ØˆØFÐFÐFñ	
ô 	
ñ$ô $ð0ð 0ð 0ð 0ñ	ô ð0ð 0ð 0r„   