§
    mQ¶j  ã                  ó¨   — d dl mZ d dlZd dl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 d dlmZ  ej        d¦  «        Z G d„ d¦  «        ZdS )	é    )ÚannotationsN)Údatetime)ÚDecimal)ÚAnyÚDictÚListÚOptional)ÚProjectExcelSyncPortÚExcelSyncServicec                  ó>   — e Zd ZdZdZdZddd„Zdd
„Zdd„Zddd„Z	dS )r   uM   Dá»‹ch vá»¥ Ä‘á»“ng bá»™ an toÃ n hai chiá»�u giá»¯a Excel vÃ  PostgreSQL DB.u?   C:/Projects/DSCons/CongTrinh/Báº£ng theo dÃµi cÃ´ng trÃ¬nh.xlsxz$C:/Projects/DSCons/CongTrinh/BackupsNÚrepoúProjectExcelSyncPort | Nonec                ó8   — |€ddl m}  |¦   «         }|| _        d S )Nr   )ÚErpDatabaseClient)Úapp.core.postgres.erp_clientr   Údb)Úselfr   r   s      úIC:\Projects\DSCons\app\modules\projects\application\excel_sync_service.pyÚ__init__zExcelSyncService.__init__   s2   € Øˆ<ØFÐFÐFÐFÐFÐFØ$Ð$Ñ&Ô&ˆDØˆŒˆˆó    ÚreturnÚstrc                óH  — t          j        | j        d¬¦  «         t          j        ¦   «                              d¦  «        }t           j                             | j        d|› d�¦  «        }t          j	        | j
        |¦  «         t                               d|› �¦  «         |S )uG   Táº¡o báº£n sao lÆ°u an toÃ n cho file Excel trÆ°á»›c khi Ä‘á»“ng bá»™.T)Úexist_okz%Y%m%d_%H%M%SÚ Bang_theo_doi_cong_trinh_backup_z.xlsxu'   Ä�Ã£ táº¡o báº£n sao lÆ°u Excel táº¡i: )ÚosÚmakedirsÚ
BACKUP_DIRr   ÚnowÚstrftimeÚpathÚjoinÚshutilÚcopy2Ú
EXCEL_PATHÚloggerÚinfo)r   Ú	timestampÚbackup_paths      r   Úbackup_excel_filez"ExcelSyncService.backup_excel_file   s‹   € å
Œ�D”O¨dÐ3Ñ3Ô3Ð3Ý”L‘N”N×+Ò+¨OÑ<Ô<ˆ	Ý”g—l’l 4¤?Ð4gÐW`Ð4gÐ4gÐ4gÑhÔhˆÝŒ�T”_ kÑ2Ô2Ð2Ý�ŠÐK¸kÐKÐKÑLÔLÐLØÐr   úDict[str, Any]c                óº  — |                       ¦   «         }t          j        | j        ¦  «        }d}| j                             ¦   «         5 }|                     ¦   «         5 }|                     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 �]1}||j	        vrŒ||         }|dk    rdnd}	d	}
t          d	|j        d
z   ¦  «        D ]÷}|                     |d
¦  «        j        }|sŒ 	 t          |¦  «        }d|› d|d›�}||v rª||         }|d         �Vt          |d         ¦  «        }|                     ||	¦  «        j        }||k    r ||                     ||	¦  «        _        |d
z  }|d         r<|                     ||
¦  «        j        s!|d         |                     ||
¦  «        _        Œè# t           $ r Y Œôw xY w�Œ3|                     | j        ¦  «         t$                               d|› d�¦  «         d||| j        t)          j        ¦   «                              ¦   «         dœS )u¬   Ä�á»“ng bá»™ tá»« Database sang Excel:
        Láº¥y cÃ¡c giÃ¡ trá»‹ Ä‘Ã£ tháº©m tra tá»« DB vÃ  ghi vÃ o Excel, giá»¯ nguyÃªn Ä‘á»‹nh dáº¡ng, khÃ´ng lá»‡ch dÃ²ng.
        r   zµ
                    SELECT project_code, project_name, contract_number, contract_value
                    FROM projects
                    ORDER BY project_code;
                c                ó    — i | ]}|d          |“ŒS ©Úproject_code© ©Ú.0Úrs     r   ú
<dictcomp>z5ExcelSyncService.sync_db_to_excel.<locals>.<dictcomp>4   ó   € ÐLÐLÐL¸˜q Ô0°!ÐLÐLÐLr   N©Ú2026Ú2025Ú2024Ú2023Ú2022r9   é   é   é   é   úDA-ú-Ú02dÚcontract_valueÚcontract_numberu   Ä�Ã£ Ä‘á»“ng bá»™ u#    Ã´ dá»¯ liá»‡u tá»« DB vÃ o Excel!T)ÚsuccessÚupdated_cellsÚbackup_fileÚ
excel_pathÚ	synced_at)r*   ÚopenpyxlÚload_workbookr%   r   Úget_connectionÚcursorÚexecuteÚfetchallÚ
sheetnamesÚrangeÚmax_rowÚcellÚvalueÚintÚfloatÚ	ExceptionÚsaver&   r'   r   r   Ú	isoformat)r   rG   ÚwbÚupdated_countÚconnÚcurÚdb_projectsÚsnameÚwsÚgt_colÚhd_colr3   ÚsttÚstt_intÚcodeÚpÚ
target_valÚcurr_vals                     r   Úsync_db_to_excelz!ExcelSyncService.sync_db_to_excel%   s8  € ð ×,Ò,Ñ.Ô.ˆÝÔ# D¤OÑ4Ô4ˆàˆØŒW×#Ò#Ñ%Ô%ð 	M¨Ø—’‘”ð M #Ø—’ð ñ ô ð ð
 MÐL¸S¿\º\¹^¼^ÐLÑLÔL�ðMð Mð Mñ Mô Mð Mð Mð Mð Mð Mð Møøøð Mð Mð Mð Mð	Mð 	Mð 	Mñ 	Mô 	Mð 	Mð 	Mð 	Mð 	Mð 	Mð 	Møøøð 	Mð 	Mð 	Mð 	Mð >ð 	ñ 	ˆEØ˜BœMÐ)Ð)ØØ�E”ˆBØ  Fš?˜?�R�R°ˆFØˆFå˜1˜bœj¨1™nÑ-Ô-ð ð �Ø—g’g˜a ‘m”mÔ)�Øð ØðÝ! #™hœh�GØ6 Ð6Ð6¨Ð6Ð6Ð6�DØ˜{Ð*Ð*Ø'¨Ô-˜ØÐ-Ô.Ð:Ý).¨qÐ1AÔ/BÑ)CÔ)C˜JØ')§w¢w¨q°&Ñ'9Ô'9Ô'?˜HØ'¨:Ò5Ð5Ø;E §¢¨¨6Ñ 2Ô 2Ô 8Ø -°Ñ 2 ØÐ.Ô/ð L¸¿ºÀÀ6Ñ8JÔ8JÔ8Pð LØ78Ð9JÔ7K˜BŸGšG A vÑ.Ô.Ô4øøÝ ð ð ð Ø�Hðøøøñ#ð( 	�Š�”Ñ Ô Ð Ý�ŠÐ[¨Ð[Ð[Ð[Ñ\Ô\Ð\ð Ø*Ø&Øœ/Ý!œ™œ×1Ò1Ñ3Ô3ð
ð 
ð 	
sI   Á	B5Á4BÂB5ÂB"	Â"B5Â%B"	Â&B5Â5B9Â<B9ÄCG#Ç#
G0Ç/G0TÚdry_runÚboolc                óú  — t          j        | j        d¬¦  «        }g }| j                             ¦   «         5 }|                     ¦   «         5 }|                     d¦  «         d„ |                     ¦   «         D ¦   «         }dD �]~}||j        vrŒ||         }|dk    rdnd}	t          d	|j
        d
z   ¦  «        D �]E}
|                     |
d
¦  «        j        }|sŒ!	 t          |¦  «        }d|› d|d›�}||v rö|                     |
|	¦  «        j        }t          |t          t          f¦  «        r¿|dk    r¹||         }t          |d         pd¦  «        }t!          |t          |¦  «        z
  ¦  «        dk    rw|                     ||t          |¦  «        ||
dœ¦  «         |sM|                     dt%          t'          |¦  «        ¦  «        t%          t'          |¦  «        ¦  «        |f¦  «         �Œ6# t(          $ r Y �ŒCw xY w�Œ€|s|                     ¦   «          ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   |t-          |¦  «        |t/          j        ¦   «                              ¦   «         dœS )u]   Ä�á»�c file Excel vÃ  Ä‘á»“ng bá»™ an toÃ n vÃ o CSDL (vá»›i cháº¿ Ä‘á»™ Dry-run báº£o vá»‡).T)Ú	data_onlyz6SELECT id, project_code, contract_value FROM projects;c                ó    — i | ]}|d          |“ŒS r.   r0   r1   s     r   r4   z5ExcelSyncService.sync_excel_to_db.<locals>.<dictcomp>d   r5   r   r6   r9   r<   r=   r>   r?   r@   rA   rB   r   rC   iè  )r/   Ú	old_valueÚ	new_valueÚsheetÚrowaŽ  
                                                UPDATE projects
                                                SET contract_value = %s,
                                                    budget_amount = %s,
                                                    updated_at = NOW()
                                                WHERE project_code = %s;
                                            N)rj   Údetected_changes_countÚchangesrI   )rJ   rK   r%   r   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   Ú
isinstancerV   ÚabsÚappendr   r   rW   ÚcommitÚlenr   r   rY   )r   rj   rZ   rt   r\   r]   r^   r_   r`   ra   r3   rc   rd   re   Úc_valÚdb_itemÚdb_vals                    r   Úsync_excel_to_dbz!ExcelSyncService.sync_excel_to_db\   s0  € åÔ# D¤O¸tÐDÑDÔDˆØˆàŒW×#Ò#Ñ%Ô%ð +	"¨Ø—’‘”ð *" #Ø—’ÐTÑUÔUÐUØLÐL¸S¿\º\¹^¼^ÐLÑLÔL�àEð #%ñ #%�EØ B¤MÐ1Ð1Ø Ø˜Eœ�BØ#(¨F¢? ?˜R˜R¸�Få" 1 b¤j°1¡nÑ5Ô5ð %ñ %˜Ø Ÿgšg a¨™mœmÔ1˜Ø"ð %Ø$ð%Ý&)¨#¡h¤h˜GØ#>¨Ð#>Ð#>°Ð#>Ð#>Ð#>˜DØ# {Ð2Ð2Ø(*¯ª°°6Ñ(:Ô(:Ô(@ Ý#-¨eµc½5°\Ñ#BÔ#Bð !cÀuÈqÂyÀyØ.9¸$Ô.? GÝ-2°7Ð;KÔ3LÐ3QÐPQÑ-RÔ-R FÝ'*¨6µE¸%±L´LÑ+@Ñ'AÔ'AÀDÒ'HÐ'HØ(/¯ªØ<@Ø9?Ý9>¸u¹¼Ø5:Ø34ð8*ð 8*ñ )+ô )+ð )+ð 07ð )cØ,/¯KªKð 90õ 3:½#¸e¹*¼*Ñ2EÔ2EÅwÍsÐSXÉzÌzÑGZÔGZÐ\`Ð1añ-cô -cð -cùøõ  )ð %ð %ð %Ø$™Hð%øøøñ9%ð> ð "Ø—K’K‘M”M�MðU*"ð *"ð *"ñ *"ô *"ð *"ð *"ð *"ð *"ð *"ð *"øøøð *"ð *"ð *"ð *"ð+	"ð +	"ð +	"ñ +	"ô +	"ð +	"ð +	"ð +	"ð +	"ð +	"ð +	"øøøð +	"ð +	"ð +	"ð +	"ð\ Ý&)¨'¡l¤lØÝ!œ™œ×1Ò1Ñ3Ô3ð	
ð 
ð 	
s[   ·H;ÁBH$ÃDG/Ç-H$Ç/
G=Ç9H$Ç<G=Ç=H$ÈH;È$H(	È(H;È+H(	È,H;È;H?ÉH?)N)r   r   )r   r   )r   r+   )T)rj   rk   r   r+   )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r%   r   r   r*   ri   r}   r0   r   r   r   r      s   € € € € € ØWÐWàR€JØ7€Jðð ð ð ð ðð ð ð ð5
ð 5
ð 5
ð 5
ðn7
ð 7
ð 7
ð 7
ð 7
ð 7
ð 7
r   )Ú
__future__r   ÚloggingrJ   r   r#   r   Údecimalr   Útypingr   r   r   r	   Ú9app.modules.projects.domain.ports.project_repository_portr
   Ú	getLoggerr&   r   r0   r   r   ú<module>rˆ      sä   ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,à ZÐ ZÐ ZÐ ZÐ ZÐ Zà	ˆÔ	Ð-Ñ	.Ô	.€ðC
ð C
ð C
ð C
ð C
ñ C
ô C
ð C
ð C
ð C
r   