Ë
    A†§jŽ	 ã                   ó8  — d Z ddlZddlZddlZddlZddlZddlZddlZddl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 ddlZddlmZ ddlZddlmZ ddlmZ d	Zej:                  j=                  ed
«      ZdZ dZ!dZ"dZ#dZ$g d¢Z%dZ&dZ'dZ(dZ)efd„Z* e*«       Z+ejX                  j[                  d«      xs e+j[                  dd«      Z.ejX                  j[                  d«      xs e+j[                  dd«      Z/da0d„ Z1d„ Z2dQd„Z3d„ Z4 G d„ de5«      Z6dRd„Z7d „ Z8d!„ Z9d"„ Z:d#„ Z;d$„ Z<d%„ Z=d&„ Z>d'„ Z?d(„ Z@d)„ ZAd*„ ZB eg d+¢«      ZCg d,¢ZDd-„ ZEd.„ ZFd/„ ZGd0„ ZH ej’                  d1«      ZJ ej’                  d2«      ZK ej’                  d3«      ZLdSd4„ZMd5d6d7d8d9œZNh d:£ZOd;„ ZPd<„ ZQd=„ ZRd>„ ZSd?„ ZTdTd@„ZU ej’                  dA«      ZV ej’                  dB«      ZWdC„ ZXdSdD„ZYdE„ ZZ G dF„ dG«      Z[dH„ Z\dI„ Z]dQdJ„Z^dK„ Z_dL„ Z`dM„ ZadNZbdO„ ZceddPk(  r ejÊ                   ec«       «       yy)Uuø  
ccpc_zc_sync.py â€” ZC + CCPC + CONTACT å�•æ–‡ä»¶å…¥åº“é“¾ï¼ˆç‰©ç�†å�ˆå¹¶ç‰ˆ, 2026-09-10ï¼‰
==========================================================================

å�ˆå¹¶æ�¥æº�ï¼ˆ4 å¼•æ“Ž + ç¼–æŽ’å™¨ â†’ æœ¬æ–‡ä»¶ï¼›ä¸šåŠ¡é€»è¾‘é€�å­—ä¿�ç•™ï¼Œä»…é‡�å‘½å��å†²çª�ç¬¦å�·ï¼‰ï¼š
  Phase ZC      â†� sync_zc.py       WebDAV Downloads_nuc çš„ PDF â†’ /root/ZC.db
                + parse_zc.py      PDF è§£æž�åº“(extract_basic/extract_page2/extract_contacts)
                                   â˜…é‡‡ç”¨æ—§ç‰ˆ(live)å�¯å�‘å¼�ï¼šé•¿æ ‡é¢˜è¢« PDF æŠ˜è¡Œæ—¶å›žé€€æ–‡ä»¶å��ï¼Œæ ‡é¢˜æ›´å®Œæ•´
  Phase CCPC    â†� parse_ccpc_v2.py WebDAV Downloads|ä¸‹è½½1|Downloads2 çš„ DOCX/XLS â†’ /root/ccpc.db
  Phase CONTACT â†� contact_lib.py   ccpc.db+ZC.db è�”ç³»äººè�šå�ˆåŽ»é‡�(å�Œå…¬å�¸å�Œäººå�ˆå¹¶) â†’ /root/contact.db

ä¸ºä»€ä¹ˆä¸�ç»Ÿä¸€ WebDAV ä¼ è¾“å±‚ï¼š
  ZC æ®µç”¨ urllib+æ­£åˆ™åˆ—ç›®å½•ï¼ˆæ—¢æœ‰å�¯ç”¨è·¯å¾„ï¼‰ï¼ŒCCPC æ®µç”¨ requests+ElementTreeã€‚
  ä¸¤è€…éƒ½ç¨³å®šè¿�è¡Œï¼Œå¼ºè¡Œç»Ÿä¸€ç­‰äºŽé‡�å†™å…¶ä¸­ä¸€æ�¡ â†’ è¿�èƒŒ"é›¶è¡Œä¸ºå�˜åŒ–"åŽŸåˆ™ï¼Œæ•…å�„è‡ªä¿�ç•™ã€�å‰�ç¼€åŒºåˆ†ã€‚

2026-09-10 åŠ å›ºï¼ˆå�ˆå¹¶å�Œæ‰¹ï¼‰ï¼š
  - parse_contacts_from_text: list(set(...)) â†’ sorted(set(...))  å¤šæ‰‹æœºå�·æ‹¼æŽ¥é¡ºåº�è·¨è¿›ç¨‹éš�æœº(PYTHONHASHSEED)
  - load_ccpc / load_zc: åŠ  ORDER BYï¼ˆç¨³å®šé”®ï¼‰â†’ è�šå�ˆä¸¥æ ¼ç¡®å®šæ€§ï¼Œcontact.db ä¸�å†�æ¯�æ—¥æ— è°“é‡�å†™
  - WebDAV åˆ—è¡¨/ä¸‹è½½ç»Ÿä¸€èµ° _retry(3 æ¬¡)ï¼›åˆ—è¡¨æœ€ç»ˆå¤±è´¥ â†’ è¯¥é˜¶æ®µ rc=1ï¼Œä¸�å†�é�™é»˜å½“ä½œ 0 ä¸ªæ–‡ä»¶

ç”¨æ³•ï¼ˆä¿�ç•™åŽŸä¸‰å¼•æ“Žçš„å�•è·‘èƒ½åŠ›ï¼‰ï¼š
  python3 ccpc_zc_sync.py                    # å…¨é“¾ daily å¢žé‡�
  python3 ccpc_zc_sync.py force              # CCPC å…¨é‡�é‡�è·‘ï¼ˆè€—æ—¶ï¼‰ï¼›ZC/CONTACT è¯­ä¹‰ä¸�å�˜
  python3 ccpc_zc_sync.py test               # CCPC å�ªè·‘ 3 æ–‡ä»¶
  python3 ccpc_zc_sync.py --only zc          # å�ªè·‘ ZC
  python3 ccpc_zc_sync.py --only ccpc        # å�ªè·‘ CCPC
  python3 ccpc_zc_sync.py --only contact     # å�ªè·‘ CONTACT
  python3 ccpc_zc_sync.py --zc-preview X.pdf # å�• PDF è§£æž�é¢„è§ˆï¼ˆåŽŸ parse_zc.py å�•æ–‡ä»¶ç”¨æ³•ï¼‰

å‡­æ�®ï¼šä»Ž /root/gov_crawler/.envï¼ˆæ�ƒé™� 600ï¼‰è¯»å�– WEBDAV_USER / WEBDAV_PASSï¼Œ
      æˆ–å�Œå��çŽ¯å¢ƒå�˜é‡�ï¼ˆçŽ¯å¢ƒå�˜é‡�ä¼˜å…ˆï¼‰ã€‚

crontabï¼š
  30 2 * * * cd /root/gov_crawler && python3 ccpc_zc_sync.py >> /var/log/ccpc_zc_sync.log 2>&1
é    N)Údatetime)ÚOrderedDict)ÚElementTree)ÚHTTPBasicAuth)Úload_workbook)ÚDocumentz/root/gov_crawlerz.envz,https://dav.jianguoyun.com/dav/Downloads_nucz/mnt/data/zc_pdfsz/root/ZC.dbz/var/log/zc_sync.logzhttps://dav.jianguoyun.com)z/dav/Downloads/z/dav/%E4%B8%8B%E8%BD%BD1/z/dav/Downloads2/z/data/ccpc_sourcez/mnt/data/ccpc_srcz/root/ccpc.dbz/root/contact.dbc                 óš  — i }t         j                  j                  | «      rœt        | d¬«      5 }|D ]~  }|j	                  «       }|r|j                  d«      sd|vrŒ+|j                  dd«      \  }}|j	                  «       j	                  d«      j	                  d«      ||j	                  «       <   Œ€ 	 ddd«       |S |S # 1 sw Y   |S xY w)	uG   æž�ç®€ .env è¯»å�–ï¼ˆä¸�å¼•ç¬¬ä¸‰æ–¹ä¾�èµ–ï¼‰ï¼›KEY=VALUEï¼Œ# æ³¨é‡Šã€‚zutf-8)Úencodingú#ú=é   ú"ú'N)ÚosÚpathÚexistsÚopenÚstripÚ
startswithÚsplit)r   ÚcfgÚfhÚlineÚkÚvs         ú!/root/gov_crawler/ccpc_zc_sync.pyÚload_envr   N   s¸   € à
€CÜ	‡w�w‡~�~�dÔÜ�$ Ô)ð 	A¨RØò A�Ø—z‘z“|�Ù˜tŸ™¨sÔ3°sÀ$±ØØ—z‘z # qÓ)‘��1Ø!"§¡£§¡°Ó!5×!;Ñ!;¸CÓ!@��A—G‘G“I’ñA÷	Að €Jˆ3€J÷	Að €Jús   ¯BC Ã C
ÚWEBDAV_USERÚ ÚWEBDAV_PASSc                  óB   — t         €t        t        t        «      a t         S )uR   CCPC æ®µ requests ç”¨çš„ HTTPBasicAuthï¼ˆæ‡’å»ºï¼Œé�¿å…� import æœŸå‰¯ä½œç”¨ï¼‰ã€‚)Ú
_ccpc_authr   r   r    © ó    r   Ú_authr%   c   s   € ô ÐÜ"¤;´Ó<ˆ
ÜÐr$   c                  ó”   — t         rt        s<t        j                  j	                  dt
        z  «       t        j                  d«       y y )Nu�   [FATAL] ç¼ºå°‘ WebDAV å‡­æ�®ã€‚è¯·åœ¨ %s å†™å…¥ï¼š
        WEBDAV_USER=...
        WEBDAV_PASS=...
        ï¼ˆæˆ–å¯¼å‡ºå�Œå��çŽ¯å¢ƒå�˜é‡�ï¼‰
é   )r   r    ÚsysÚstderrÚwriteÚENV_FILEÚexitr#   r$   r   Úcheck_credsr-   k   s:   € Ý�kÜ�
‰
×Ñð:ä<DñEô	Fô 	�‰��ð *r$   c                 óú   — t        j                  «       j                  d«      }|r9t        |d«      5 }|j	                  d|› d| › d�«       ddd«       t        | «       yt        d|› d| › �«       y# 1 sw Y   Œ'xY w)u—   logfile ç»™å®š â†’ å¸¦æ—¶é—´æˆ³è�½ç›˜ + è£¸ printï¼ˆåŽŸ sync_zc.log è¯­ä¹‰ï¼‰ï¼›
    æœªç»™ â†’ å¸¦æ—¶é—´æˆ³ printï¼ˆåŽŸ parse_ccpc_v2.log è¯­ä¹‰ï¼‰ã€‚ú%Y-%m-%d %H:%M:%SÚaú[z] ú
N)r   ÚnowÚstrftimer   r*   Úprint)ÚmsgÚlogfileÚtsÚfs       r   Úlogr:   x   su   € ô 
�‰‹×	 Ñ	 Ð!4Ó	5€BÙÜ�'˜3Óð 	' 1Ø�G‰G�a˜�t˜2˜c˜U "Ð%Ô&÷	'äˆc�
ä��"��R˜�uˆoÕ÷		'ð 	'ús   ²A1Á1A:c                 óD   — dt        | «      j                  dd«      z   dz   S )uT   SQL å�•å¼•å�·è½¬ä¹‰ï¼ˆåŽŸ sync_zc.sq / parse_zc.sq å�Œå®žçŽ°ï¼Œå�ˆå¹¶ä¸ºä¸€å¤„ï¼‰ã€‚r   z'')ÚstrÚreplace)Úss    r   Úsqr?   „   s!   € à”�Q“—‘  TÓ*Ñ*¨SÑ0Ð0r$   c                   ó   — e Zd ZdZy)ÚPermanentErroru^   æ˜Žç¡®ä¸�è¯¥é‡�è¯•çš„é”™è¯¯ï¼ˆå¦‚ HTTP 4xxï¼šèµ„æº�ä¸�å­˜åœ¨/å��å­—é�žæ³•ï¼Œé‡�è¯•ä¹Ÿç™½æ�­ï¼‰N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r#   r$   r   rA   rA   ‰   s   „ Úhr$   rA   c                 óð   — d}t        d|dz   «      D ]  }	  | «       c S  |‚# t        $ r ‚ t        $ rA}|}||k  r0t        d|› d|› d|› d|› d|› d�«       t	        j
                  |«       Y d}~Œ^d}~ww xY w)	uï   ç½‘ç»œè°ƒç”¨é‡�è¯•ï¼šæœ€å¤š attempts æ¬¡ï¼Œæœ€å�Žä¸€æ¬¡ä»�å¤±è´¥åˆ™æŠ›å‡ºã€‚
    ï¼ˆ2026-09-10 åŠ å›ºï¼šå�šæžœäº‘ WebDAV å�¶å�‘ ConnectTimeoutï¼Œæ—§ä»£ç �ä¸€å´©å°±æ•´é˜¶æ®µå¤±è´¥ã€‚
      PermanentError ç›´æŽ¥æŠ›å‡ºï¼Œä¸�å�šæ— è°“é‡�è¯•ï¼‰Nr   ú  u    ç¬¬ú/u   æ¬¡å¤±è´¥: u    â€” u   s å�Žé‡�è¯•)ÚrangerA   Ú	Exceptionr:   ÚtimeÚsleep)ÚfnÚattemptsÚdelayÚwhatÚlastÚiÚes          r   Ú_retryrT   �   s•   € ð €DÜ�1�h ‘lÓ#ò 	"ˆð	"Ù“4ŠKð	"ð €Jøô ò 	ØÜò 	"ØˆDØ�8Š|Ü�b˜˜˜d 1 # Q x j°¸A¸3¸eÀEÀ7È+ÐVÔWÜ—
‘
˜5Ô!ÿøð		"ús   –"¢A5´7A0Á0A5c                  óÒ  ‡‡— t         dz   Št        j                  t        › dt        › �j                  «       «      j                  «       Šˆˆfd„} t        | d¬«      }g }t        j                  d|«      D ]f  }|j                  d«      }|j                  d«      j                  d«      d   }t        j                  j                  |«      }|j!                  |«       Œh t#        |«      S )	ul   åˆ— ZC æº�ç›®å½• PDFï¼›ç½‘ç»œå¤±è´¥é‡�è¯• 3 æ¬¡ï¼Œæœ€ç»ˆå¤±è´¥æŠ›å¼‚å¸¸ï¼ˆç”± zc_run æ�•èŽ·â†’rc=1 å�¯è§�ï¼‰rH   ú:c                  óô   •— t         j                  j                  ‰dddi¬«      } | j                  dd‰› �«       t         j                  j	                  | d¬«      }|j                  «       j                  «       S )	NÚPROPFINDÚDepthÚ1)ÚmethodÚheadersÚAuthorizationúBasic é   ©Útimeout)ÚurllibÚrequestÚRequestÚ
add_headerÚurlopenÚreadÚdecode)ÚreqÚrespÚcredsÚurls     €€r   Ú_dozzc_webdav_list.<locals>._do¨   se   ø€ Ü�n‰n×$Ñ$ S°ÀgÈsÀ^Ð$ÓTˆØ�‰�¨&°°Ð(8Ô9Ü�~‰~×%Ñ% c°2Ð%Ó6ˆØ�y‰y‹{×!Ñ!Ó#Ð#r$   u   ZC WebDAV åˆ—è¡¨©rP   z<d:href>([^<]+\.pdf)</d:href>r   éÿÿÿÿ)ÚZC_WEBDAV_BASEÚbase64Ú	b64encoder   r    Úencoderh   rT   ÚreÚfinditerÚgroupÚrstripr   rb   ÚparseÚunquoteÚappendÚsorted)rm   Úxml_dataÚpdfsÚmÚhrefÚfnamerk   rl   s         @@r   Úzc_webdav_listr�   £   sÅ   ù€ ä
˜3Ñ
€CÜ×Ñ¤˜}¨A¬k¨]Ð;×BÑBÓDÓE×LÑLÓN€Eõ$ô �cÐ 2Ô3€HØ€DÜ�[‰[Ð9¸8ÓDò ˆØ�w‰w�q‹zˆØ—‘˜CÓ ×&Ñ& sÓ+¨BÑ/ˆÜ—‘×$Ñ$ UÓ+ˆØ�‰�EÕð	ô
 �$‹<Ðr$   c                 ód  ‡ ‡‡— t         dz   t        j                  j                  ‰ «      z   Št	        j
                  t        › dt        › �j                  «       «      j                  «       Šˆˆ ˆfd„}	 t        |d‰ d d › �¬«      S # t        $ r }t        d‰ › d|› �t        «       Y d }~y d }~ww xY w)	NrH   rV   c                  ó.  •— t         j                  j                  ‰«      } | j                  dd‰› �«       	 t         j                  j	                  | d¬«      }|j                  «       }t        j                  j                  t        ‰«      }t        |d«      5 }|j                  |«       d d d «       |S # t         j
                  j                  $ r6}d|j                  cxk  rdk  rn ‚ t        d|j                  › �«      ‚‚ d }~ww xY w# 1 sw Y   |S xY w)	Nr]   r^   é<   r`   é�  éô  úHTTP Úwb)rb   rc   rd   re   rf   ÚerrorÚ	HTTPErrorÚcoderA   rg   r   r   ÚjoinÚ
ZC_PDF_DIRr   r*   )	ri   rj   ÚheÚdatar   r9   rk   Úfilenamerl   s	         €€€r   rm   zzc_webdav_download.<locals>._do¼   sç   ø€ Ü�n‰n×$Ñ$ SÓ)ˆØ�‰�¨&°°Ð(8Ô9ð	Ü—>‘>×)Ñ)¨#°rÐ)Ó:ˆDð
 �y‰y‹{ˆÜ�w‰w�|‰|œJ¨Ó1ˆÜ�$˜Óð 	 Ø�G‰G�DŒM÷	àˆøô �|‰|×%Ñ%ò 	Ø�b—g‘gÔ# Ô#àô % u¨R¯W©W¨IÐ%6Ó7Ð7Øûð	ú÷	àˆús#   ·!B4 ÂD
Â4DÃ1DÄDÄ
Du   ä¸‹è½½ r_   rn   u     ä¸‹è½½å¤±è´¥ ú: )rp   rb   rx   Úquoterq   rr   r   r    rs   rh   rT   rJ   r:   ÚZC_LOG)r�   rm   rS   rk   rl   s   `  @@r   Úzc_webdav_downloadr”   ¸   sœ   ú€ Ü
˜3Ñ
¤§¡×!3Ñ!3°HÓ!=Ñ
=€CÜ×Ñ¤˜}¨A¬k¨]Ð;×BÑBÓDÓE×LÑLÓN€EöðÜ�c '¨(°3°B¨-¨Ð 9Ô:Ð:øÜò Üˆo˜h˜Z r¨!¨Ð-¬vÔ6Üûðús   Á3B Â	B/ÂB*Â*B/c                 óð  ‡— i }| j                  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.œ
¥}t        |«      D �];  \  }Š|j                  «       D �]!  \  }}‰j                  |d/z   «      s‰j                  |d0z   «      sŒ0‰t	        |«      d1z   d2 j                  «       }|s8|dk7  r3|d1z   t	        |«      k  r"||d1z      j                  «       }|r
d/|vrd0|vr|}|dk(  rŽg }	d1}
||
z   t	        |«      k  rf|||
z      j                  «       }d/|v s#d0|v st	        |«      d3k  s|j                  d4«      rn(|	j                  |«       |
d1z  }
||
z   t	        |«      k  rŒf|	rd5j                  |	«      }|||<    �Œ; �Œ> t        |«      D �]  \  }Š‰j                  d6«      s‰j                  d7«      sŒ*d/‰v r#‰j                  d/d1«      d8   j                  «       n"‰j                  d0d1«      d8   j                  «       }t        j                  d9|«      }|rE|j                  d1«      j                  «       |d:<   |j                  d3«      j                  «       |d;<   ŒÑd<|v r@|j                  d<d1«      }|d=   j                  «       |d:<   |d1   j                  «       |d;<   �Œ||d:<   d5|d;<   �Œ! |D ]j  Š‰j                  d>«      sŒd/‰v sd0‰v sŒd/‰v r#‰j                  d/d1«      d8   j                  «       n"‰j                  d0d1«      d8   j                  «       |d?<   Œl d@}g }dA}|D ]Ä  Š‰j                  dB«      rhd/‰v sd0‰v r`dC}d/‰v r#‰j                  d/d1«      d8   j                  «       n"‰j                  d0d1«      d8   j                  «       }|r|j                  |«       Œ||sŒt        ˆfdD„|D «       «      r n2‰j                  «       sŒ¦|j                  ‰j                  «       «       ŒÆ |rd5j                  |«      |dE<   dF}g }dA}|D ]›  Š‰j                  dG«      r?dC}d/‰v r#‰j                  d/d1«      d8   j                  «       nd5}|r|j                  |«       ŒS|sŒVt        ˆfdH„|D «       «      r n2‰j                  «       sŒ}|j                  ‰j                  «       «       Œ� |rd5j                  |«      |dI<   |j                  dI«      sŸ|D ]š  Š‰j                  dJ«      s‰j                  dK«      sŒ&d/‰v r#‰j                  d/d1«      d8   j                  «       n"‰j                  d0d1«      d8   j                  «       }t        j                  dLd5|«      j                  «       }||dI<    n |r|d=   j                  «       nd5}|rt	        |«      dMkD  rd4|vr||dN<   |S t	        |«      d1kD  r(|d1   j                  «       }|rt	        |«      dMkD  r||dN<   |S )Ou   æ��å�– page 1 åŸºç¡€å­—æ®µr2   u   é¡¹ç›®ç¼–å�·Ú
project_idu   ç‰ˆæœ¬ç±»åž‹Úversion_typeõ   å�‘å¸ƒæ—¶é—´Úpublish_dateu   é¡¹ç›®é˜¶æ®µÚphaseu   å»ºè®¾å‘¨æœŸÚconstruction_periodu   æ€»æŠ•èµ„é¢�Útotal_investmentu   å·¥ç¨‹ç±»åž‹Úproject_typeu   ç”²æ–¹æ€§è´¨Úowner_natureu   æ‰€å±žè¡Œä¸šÚindustryu   æ‰€å±žä¸“é¢˜Útopicu   é¡¹ç›®è§„æ¨¡Úscaleu   æ•°é‡�è§„æ¨¡Úquantity_scaleu   è¡Œä¸šçº§åˆ«Úindustry_levelõ   å»ºç­‘é�¢ç§¯Úbuilding_areaõ   å� åœ°é�¢ç§¯Ú	land_areaõ   å»ºç­‘å±‚æ•°Úfloorsu   å¤–èµ„å�‚ä¸ŽÚforeign_investmentÚ
decorationÚsteel_structureÚexterior_wallÚparkingÚelevatorÚair_conditioningÚ	fresh_airÚheatingÚprefabÚpassive_house)
õ   è£…ä¿®u	   é’¢ç»“æž„õ   å¤–å¢™æ��æ–™u   è½¦åº“å�œè½¦ä½�u   ç”µæ¢¯u   ç©ºè°ƒu   æ–°é£Žç³»ç»Ÿõ   ä¾›æš–æ–¹å¼�u   è£…é…�å¼�å»ºç­‘u	   è¢«åŠ¨æˆ¿õ   ï¼šrV   r   Nr'   u   é¡¹ç›®r   u   çœ�/å¸‚u	   çœ�ï¼�å¸‚ro   uæ   ^(é»‘é¾™æ±Ÿ|å†…è’™å�¤|å¹¿è¥¿|è¥¿è—�|æ–°ç–†|å®�å¤�|é�’æµ·|ç”˜è‚ƒ|å››å·�|è´µå·ž|äº‘å�—|é™•è¥¿|å±±è¥¿|æ²³åŒ—|å±±ä¸œ|æ²³å�—|æ¹–åŒ—|æ¹–å�—|æ±Ÿè‹�|æµ™æ±Ÿ|å®‰å¾½|æ±Ÿè¥¿|ç¦�å»º|å¹¿ä¸œ|æµ·å�—|è¾½å®�|å�‰æž—|ä¸Šæµ·|åŒ—äº¬|å¤©æ´¥|é‡�åº†)(.*)$ÚprovinceÚcityrH   r   u   è¯¦ç»†åœ°å�€Údetail_address)õ   é¡¹ç›®ä¸»è¦�é‡‡è´­è®¾å¤‡õ   ç²¾å‡†é‡‡è´­è®¾å¤‡õ   å·¥è‰ºæµ�ç¨‹õ   é¡¹ç›®å·¥æœŸå�Šé˜¶æ®µè¿›å±•õ   è¯¥é¡¹ç›®å�¯èƒ½õ   ä¸»è¦�è®¾å¤‡õ   æ¸©é¦¨æ��ç¤ºõ   é¡¹ç›®åŸºæœ¬ä¿¡æ�¯Fu   å»ºè®¾å†…å®¹æ��è¿°Tc              3   ó@   •K  — | ]  }‰j                  |«      –— Œ y ­w©N©r   ©Ú.0r>   Úls     €r   ú	<genexpr>z extract_basic.<locals>.<genexpr>7  s   øè ø€ Ò7 q�1—<‘< —?Ñ7ùó   ƒÚconstruction_content)r½   r¾   r¿   rÂ   rÃ   r¼   c              3   ó@   •K  — | ]  }‰j                  |«      –— Œ y ­wrÅ   rÆ   rÇ   s     €r   rÊ   z extract_basic.<locals>.<genexpr>M  s   øè ø€ Ò5 q�1—<‘< —?Ñ5ùrË   Úequipment_listrÀ   rÁ   u   æ¸©é¦¨æ��ç¤º.*é
   Úproject_name)r   Ú	enumerateÚitemsr   Úlenr   rz   rŒ   rt   Úmatchrv   ÚanyÚgetÚsub)ÚtextÚpÚlinesÚ	field_maprR   ÚlabelÚkeyÚvalÚnext_lÚvalsÚnr~   ÚpartsÚ
DESC_STOPSÚ
desc_linesÚin_descÚrestÚPE_STOPSÚpe_linesÚin_peÚheaderÚheader2rÉ   s                         @r   Úextract_basicrì   Ô   s›  ø€ à
€AØ�J‰J�tÓ€EðØ˜ðà˜ðð 	˜ðð 	˜ð	ð
 	Ð-ðð 	Ð*ðð 	˜ðð 	˜ðð 	˜
ðð 	˜ðð 	˜ðð 	Ð(ðð 	Ð(ðð 	˜ðð 	˜ðð  	˜ð!ð" 	Ð,ð#ð$ Ø&Ø'Ø$ØØ$Ø#Ø!Ø#Ø$ò7€Iô< ˜%Ó ó ‰ˆˆ1Ø#Ÿ/™/Ó+ó 	‰JˆE�3Ø�|‰|˜E E™MÔ*¨a¯l©l¸5À3¹;Õ.GØœ˜E›
 1™˜Ð&×,Ñ,Ó.�á˜s jÒ0°Q¸±U¼SÀ»ZÒ5GØ" 1 Q¡3™Z×-Ñ-Ó/�FÙ %¨vÑ"5¸#ÀVÑ:KØ$˜à˜*Ò$Ø�DØ�AØ˜a™%¤# e£*Ò,Ø!& q¨1¡u¡×!3Ñ!3Ó!5˜Ø  F™?¨c°V©m¼sÀ6»{ÈQºÐRX×RcÑRcÐdlÔRmØ!ØŸ™ FÔ+Ø˜Q™˜ð ˜a™%¤# e£*Ó,ñ Ø Ÿg™g d›m˜Ø��#‘Úò+	ðô2 ˜%Ó ó ‰ˆˆ1Ø�<‰<˜	Ô" a§l¡l°;Õ&?Ø38¸A±:�!—'‘'˜% Ó# BÑ'×-Ñ-Ô/À1Ç7Á7È3ÐPQÃ?ÐSUÑCV×C\ÑC\ÓC^ˆCä—‘ð  Cð  EHó  IˆAÙØ !§¡¨£
× 0Ñ 0Ó 2��*‘ØŸG™G A›J×,Ñ,Ó.��&’	Ø˜‘ØŸ	™	 # qÓ)�Ø % a¡§¡Ó 0��*‘Ø! !™HŸN™NÓ,��&“	à #��*‘Ø��&“	ðð" ò oˆØ�<‰<˜Õ'¨U°a©Z¸3À!º8ØCHÈAÁ: !§'¡'¨%°Ó"3°BÑ"7×"=Ñ"=Ô"?ÐST×SZÑSZÐ[^Ð`aÓSbÐceÑSf×SlÑSlÓSnˆAÐÒðoð[€Jà€JØ€GØò -ˆØ�<‰<Ð,Ô-°5¸A±:ÀÈÁØˆGØ49¸Q±J�1—7‘7˜5 !Ó$ RÑ(×.Ñ.Ô0ÀAÇGÁGÈCÐQRÃOÐTVÑDW×D]ÑD]ÓD_ˆDÙØ×!Ñ! $Ô'ØÚÜÓ7¨JÔ7Ô7ÙØ�w‰w�yØ×!Ñ! !§'¡'£)Õ,ð-ñ Ø$&§G¡G¨JÓ$7ˆÐ
 Ñ!ð {€HØ€HØ€EØò +ˆØ�<‰<Ð2Ô3ØˆEØ49¸Q±J�1—7‘7˜5 !Ó$ RÑ(×.Ñ.Ô0ÀBˆDÙØ—‘ Ô%ØÚÜÓ5¨HÔ5Ô5ÙØ�w‰w�yØ—‘ §¡£	Õ*ð+ñ Ø Ÿg™g hÓ/ˆÐ
Ñð �5‰5Ð!Ô"Øò 	ˆAØ�|‰|Ð-Ô.°!·,±,¸~Õ2NØ7<À±z�a—g‘g˜e QÓ'¨Ñ+×1Ñ1Ô3ÀqÇwÁwÈsÐTUÃÐWYÑGZ×G`ÑG`ÓGb�ä—f‘fÐ.°°CÓ8×>Ñ>Ó@�Ø&)�Ð"Ñ#Ùð	ñ "'ˆU�1‰X�^‰^Ô¨B€FÙ”#�f“+ Ò" x°vÑ'=Ø"ˆˆ.Ñð €Hô 
ˆU‹�aŠà˜‘(—.‘.Ó"ˆÙ”s˜7“| bÒ(Ø 'ˆAˆnÑà€Hr$   c                 óŒ  — i }| j                  d«      }t        |«      D �]¡  \  }}t        j                  d|«      }|r#|j	                  d«      j                  «       |d<   ŒBt        j                  d|«      }|r#|j	                  d«      j                  «       |d<   Œ}t        j                  d|«      }|r#|j	                  d«      j                  «       |d<   Œ¸d	D ]å  \  }}|j                  |«      sŒd
|v s*d|v s&t        |j                  «       «      t        |«      k(  sŒFt        |j                  «       «      t        |«      k(  r*|dz   t        |«      k  r||dz      j                  «       nd}nJd
|v r#|j                  d
d«      d   j                  «       n"|j                  dd«      d   j                  «       }|||<    �Œ¡ �Œ¤ |S )u   æ��å�– page 2 å­—æ®µr2   u    ç²¾å‡†é‡‡è´­è®¾å¤‡[ï¼š:]?\s*(.*)r   Úprocurement_equipmentu   å·¥è‰ºæµ�ç¨‹[ï¼š:]?\s*(.*)Úprocess_flowu   å·¥æœŸæ¦‚è¿°[ï¼šï¼š]?\s*(.*)Úschedule_overview))u   ç«‹é¡¹å®¡æ‰¹Úphase_approval)u   é¡¹ç›®è®¾è®¡Úphase_design)u   ä¸»è®¾å¤‡æ��æ–™é‡‡è´­Úphase_procurement)u   ä¸»ä½“æ–½å·¥Úphase_construction)u   å·¥ç¨‹åˆ†åŒ…Úphase_contractor)u   æš‚å­˜/å�–æ¶ˆ/å·²å®Œå·¥Úphase_statusr¸   rV   r   ro   )r   rÑ   rt   Úsearchrv   r   r   rÓ   )	rØ   rÙ   rÚ   rR   rÉ   r~   Úphase_labelrÝ   rÞ   s	            r   Úextract_page2rù   l  s¤  € à
€AØ�J‰J�tÓ€Eä˜%Ó ó #‰ˆˆ1ä�I‰IÐ9¸1Ó=ˆÙØ)*¯©°«×)9Ñ)9Ó);ˆAÐ%Ñ&Øô �I‰IÐ3°QÓ7ˆÙØ !§¡¨£
× 0Ñ 0Ó 2ˆAˆnÑØô �I‰IÐ5°qÓ9ˆÙØ%&§W¡W¨Q£Z×%5Ñ%5Ó%7ˆAÐ!Ñ"Øð!
ò 	ÑˆK˜ð �|‰|˜KÕ(¨e°q©j¸CÀ1¹HÌÈAÏGÉGËIËÔZ]Ð^iÓZjÓHjÜ�q—w‘w“y“>¤S¨Ó%5Ò5à23°a±%¼#¸e»*Ò2D˜%  A¡™,×,Ñ,Ô.È"‘Cà;@ÀA¹:˜!Ÿ'™' %¨Ó+¨BÑ/×5Ñ5Ô7È1Ï7É7ÐSVÐXYË?Ð[]ÑK^×KdÑKdÓKf�CØ��#‘Úò	ð)#ðJ €Hr$   c                 óä  — g }g d¢}d	d„}i }|D ]:  }| j                  d|z   dz   «      }|dk  r| j                  |«      }|dk\  sŒ6|||<   Œ< |s|S t        |j                  «       d„ ¬«      }t        |«      D ]v  \  }\  }	}
t	        | «      }|dz   t	        |«      k  r||dz      d   }n| j                  d|
«      }|dk\  r|}| |
| j                  «       }|sŒ`|j                   ||«      «       Œx |S )
u<   ä»Ž 'ä¸šä¸»æ–¹' / 'è®¾è®¡é™¢' ç­‰å¤šä¸ªåŒºåŸŸæ��å�–è�”ç³»äºº©u	   ä¸šä¸»æ–¹õ	   è®¾è®¡é™¢õ   æ–½å·¥å�•ä½�u	   æ–½å·¥æ–¹õ   ä¸šä¸»å�•ä½�u   è®¾è®¡å�•ä½�u	   æ‰¿åŒ…å•†u	   æ‰¿åŒ…æ–¹c           
      ó"  — | j                  d«      }|r|d   j                  «       nd}dddddddddœ}|j                  ||«      }d}|D ]]  }d|v sŒd	|v sd
|v sŒd	|v r#|j                  d	d«      d   j                  «       n"|j                  d
d«      d   j                  «       }|} n t        j                   d| «      }	g }
|	D �]Ç  }|j                  d«      }|dddddd|dœ}|D �]…  }|j                  «       }|sŒ|j	                  d«      r-d	|v r)|j                  d	d«      d   j                  «       }||d<   ŒU|j	                  d«      r+d	|v r'|j                  d	d«      d   j                  «       |d<   Œ‘|j	                  d«      r+d	|v r'|j                  d	d«      d   j                  «       |d<   ŒÍ|j	                  d«      r,d	|v r(|j                  d	d«      d   j                  «       |d<   �Œ
|j	                  d«      r,d	|v r(|j                  d	d«      d   j                  «       |d<   �ŒG|j	                  d«      s�ŒZd	|v s�Œ`|j                  d	d«      d   j                  «       |d<   �Œˆ |d   s|d   s�Œ·|
j                  |«       �ŒÊ |
S )u   è§£æž�ä¸€ä¸ªè�”ç³»äººåŒºåŸŸå�—r2   r   r   u   ä¸šä¸»rü   rý   rû   u   å�•ä½�å��ç§°r¸   rV   r   ro   u   \n(?=å§“å��[ï¼š:]))ÚcompanyÚcontact_nameÚ
departmentÚpositionÚphoneÚremarksÚaddressÚroleõ   å§“å��r  õ   éƒ¨é—¨r  u   è�ŒåŠ¡r  õ   æ‰‹æœºr  u   å¤‡æ³¨r  u   å�•ä½�æ³¨å†Œåœ°å�€r  )r   r   rÖ   rt   r   rz   )ÚblkÚdefault_rolerÚ   Úsection_titleÚrole_mapr  r   r   rÞ   Úperson_blocksÚresultsÚpblkÚplinesÚcrÉ   Únames                   r   Úparse_one_sectionz+extract_contacts.<locals>.parse_one_section¡  s°  € à—	‘	˜$“ˆá,1˜˜a™Ÿ™Ô(°rˆà!)¸ÐUcð  sAð  S[ð  mxð  GUð  drñ  sˆØ�|‰|˜M¨<Ó8ˆð ˆØò 	ˆDØ Ò%¨5°D©=¸CÀ4ºKà:?À4¹-�d—j‘j ¨Ó*¨2Ñ.×4Ñ4Ô6ÈTÏZÉZÐX[Ð]^ÓM_Ð`bÑMc×MiÑMiÓMk�ð �Ùð	ô Ÿ™Ð!6¸Ó<ˆàˆØ!ó 	"ˆDØ—Z‘Z Ó%ˆFØ#°RÀrØ¨"¸ÈÐTXñZˆAàó A�Ø—G‘G“I�ÙØØ—<‘< Ô)¨u¸©zØŸ7™7 5¨!Ó,¨RÑ0×6Ñ6Ó8�DØ(,�A�nÒ%Ø—\‘\ (Ô+°¸!±Ø&'§g¡g¨e°QÓ&7¸Ñ&;×&AÑ&AÓ&C�A�l’OØ—\‘\ (Ô+°¸!±Ø$%§G¡G¨E°1Ó$5°bÑ$9×$?Ñ$?Ó$A�A�j’MØ—\‘\ (Ô+°¸!±Ø!"§¡¨°Ó!2°2Ñ!6×!<Ñ!<Ó!>�A�g“JØ—\‘\ (Ô+°¸!±Ø#$§7¡7¨5°!Ó#4°RÑ#8×#>Ñ#>Ó#@�A�i“LØ—\‘\Ð"6Ö7¸UÀa»ZØ#$§7¡7¨5°!Ó#4°RÑ#8×#>Ñ#>Ó#@�A�i“Lð!Að$ �Ò  A g¤JØ—‘˜qÖ!ð/	"ð0 ˆr$   r2   r   c                 ó   — | d   S )Nr   r#   )Úxs    r   ú<lambda>z"extract_contacts.<locals>.<lambda>å  s
   € °q¸±t€ r$   )rÝ   r   zPowered by TCPDF©r   )Úfindr{   rÒ   rÑ   rÓ   r   Úextend)rØ   ÚcontactsÚCONTACT_SECTIONSr  Ú	positionsÚsecÚidxÚsectionsrR   Úsec_nameÚsec_posÚnext_posÚpbrr  s                 r   Úextract_contactsr&  ›  s!  € à€Hò IÐó5ðp €IØò !ˆØ�i‰i˜˜s™
 TÑ)Ó*ˆØ�Š7Ø—)‘)˜C“.ˆCØ�!‹8Ø ˆI�cŠNð!ñ Øˆô �i—o‘oÓ'©^Ô<€Hô #,¨HÓ"5ò 4ÑˆÑˆH�gä�t“9ˆØˆq‰5”3�x“=Ò Ø  A¡‘ qÑ)‰Hð —)‘)Ð.°Ó8ˆCØ�aŠxØ�à�7˜8Ð$×*Ñ*Ó,ˆÚØ�O‰OÑ-¨cÓ2Õ3ð4ð €Or$   c                 ó‚  — | j                  dd«      }| j                  dd«      xs" t        j                  j                  |«      d   }g d¢}|D �cg c]  }t	        | j                  |d«      «      ‘Œ }}ddj                  |«      › ddj                  |«      › d	�}|D ]™  }	|d
t	        |«      › dt	        |	d   «      › dt	        |	d   «      › dt	        |	d   «      › dt	        |	d   «      › dt	        |	d   «      › dt	        |	d   «      › dt	        |	d   «      › dt	        |	j                  dd«      «      › d	�z  }Œ› |S c c}w )Nr–   r   rÐ   r   )*r–   rÐ   r—   r™   rš   r›   rœ   r�   rž   rŸ   r    r¡   r¢   r£   r¹   rº   r»   r¥   r§   r©   rª   r«   r¬   r­   r®   r¯   r°   r±   r²   r³   r´   rÌ   rÎ   rî   rï   rð   rñ   rò   ró   rô   rõ   rö   úINSERT INTO zc_projects (ú, ú
) VALUES (z);
zyINSERT INTO zc_contacts (project_id, company, contact_name, department, position, phone, remarks, address, role) VALUES (r   r  r  r  r  r  r  r  )rÖ   r   r   Úsplitextr?   rŒ   )
rÙ   r  r�   Úpidr  Úfieldsr9   rà   Úsqlr  s
             r   Úgen_sqlr/  ü  sR  € Ø
�%‰%�˜bÓ
!€CØ�5‰5� Ó$ÒE¬¯©×(8Ñ(8¸Ó(BÀ1Ñ(E€Dò€Fð '-Ö- ŒBˆq�u‰u�Q˜‹|ÕÐ-€DÐ-Ø% d§i¡i°Ó&7Ð%8¸
À4Ç9Á9ÈTÃ?ÐBSÐSWÐ
X€Càò 
ˆØðä˜#“w�i˜r¤" Q y¡\Ó"2Ð!3°2´b¸¸>Ñ9JÓ6KÐ5LÈBÜ�!�L‘/Ó"Ð# 2¤b¨¨:©Ó&7Ð%8¸¼2¸aÀ¹j»>Ð:JÈ"Ü�!�I‘,ÓÐ  ¤2 a¨	¡lÓ#3Ð"4°B´r¸!¿%¹%ÀÈÓ:KÓ7LÐ6MÈTð	Sñ	
‰ð
ð €Jùò .s   Á"D<c                 óZ  — t        j                  | «      }|j                  dkD  r|d   j                  «       nd}|j                  dkD  r|d   j                  «       nd}d}t	        d|j                  «      D ]  }|||   j                  «       dz   z  }Œ |j                  «        t        |«      }|j                  t        |«      «       |j                  d«      sDt        j                  j                  | «      }t        j                  j                  |«      d   |d<   t        |«      }||fS )Nr   r   r   r2   rÐ   )Úfitzr   Ú
page_countÚget_textrI   Úcloserì   Úupdaterù   rÖ   r   r   Úbasenamer+  r&  )	Úpdf_pathÚdocÚtext_p1Útext_p2Útext_contactsÚpirÙ   r€   r  s	            r   Úzc_parse_oner=    sû   € Ü
�)‰)�HÓ
€CØ#&§>¡>°AÒ#5ˆc�!‰f�o‰oÔ¸2€GØ#&§>¡>°AÒ#5ˆc�!‰f�o‰oÔ¸2€GØ€MÜ�A�s—~‘~Ó&ò 3ˆØ˜˜R™×)Ñ)Ó+¨dÑ2Ñ2‰ð3à‡I�I„Kä�gÓ€AØ‡H�HŒ]˜7Ó#Ô$à�5‰5�Ô Ü—‘× Ñ  Ó*ˆÜŸG™G×,Ñ,¨UÓ3°AÑ6ˆˆ.Ñä Ó.€HØˆhˆ;Ðr$   c                 óœ   — |r$| j                  d|f«      j                  «       }|ry|r$| j                  d|f«      j                  «       }|ryy)u4   æŸ¥ DBï¼šproject_id æˆ– project_name æ˜¯å�¦å·²å­˜åœ¨z,SELECT 1 FROM zc_projects WHERE project_id=?Tz.SELECT 1 FROM zc_projects WHERE project_name=?F)ÚexecuteÚfetchone)r  r,  r  Úrs       r   Úzc_check_existsrB  5  sO   € á
Ø�I‰IÐDÀsÀfÓM×VÑVÓXˆÙØÙØ�I‰IÐFÈÈÓP×YÑYÓ[ˆÙØØr$   c                 óÌ  — t        j                  t        «      }|j                  «       }| j	                  dd«      }| j	                  dd«      xs" t
        j                  j                  |«      d   }t        |||«      r|j                  «        yg d¢}t        | «      }||d<   t        j                  |d¬«      | d	<   |D �	cg c]  }	t        | j	                  |	d«      «      ‘Œ }
}	d
dj                  |«      › ddj                  |
«      › d�}|j                  |«       |D ]�  }|j                  d||j	                  dd«      |j	                  dd«      |j	                  dd«      |j	                  dd«      |j	                  dd«      |j	                  dd«      |j	                  dd«      |j	                  dd«      f	«       ŒŸ |j!                  «        |j                  «        yc c}	w )Nr–   r   rÐ   r   F)+r–   rÐ   r—   r™   rš   r›   rœ   r�   rž   rŸ   r    r¡   r¢   r£   r¹   rº   r»   r¥   r§   r©   rª   r«   r¬   r­   r®   r¯   r°   r±   r²   r³   r´   rÌ   rÎ   rî   rï   rð   rñ   rò   ró   rô   rõ   rö   Úraw_jsonr  ©Úensure_asciirD  r(  r)  r*  ú)z‹INSERT INTO zc_contacts (project_id, company, contact_name, department, position, phone, remarks, address, role) VALUES (?,?,?,?,?,?,?,?,?)r   r  r  r  r  r  r  r  T)Úsqlite3ÚconnectÚZC_DBÚcursorrÖ   r   r   r+  rB  r4  ÚdictÚjsonÚdumpsr?   rŒ   r?  Úcommit)rÙ   r  r�   Úconnr  r,  r  r-  Úraw_datar9   rà   r.  Úcts                r   Úzc_insert_to_dbrS  B  s¡  € Ü�?‰?œ5Ó!€DØ�‰‹€AØ
�%‰%�˜bÓ
!€CØ�5‰5� Ó$ÒE¬¯©×(8Ñ(8¸Ó(BÀ1Ñ(E€DÜ�q˜#˜tÔ$Ø�
‰
ŒØò
€Fô �A‹w€HØ#€HˆZÑÜ—J‘J˜x°eÔ<€A€j�MØ&,Ö- ŒBˆq�u‰u�Q˜‹|ÕÐ-€DÐ-Ø% d§i¡i°Ó&7Ð%8¸
À4Ç9Á9ÈTÃ?ÐBSÐSTÐ
U€CØ‡I�Iˆc„NØò 
ˆØ	�	‰	ð ZØ�"—&‘&˜ 2Ó&¨¯©¨~¸bÓ(AÀ2Ç6Á6È,ÐWYÓCZØ�V‰V�J˜rÓ" B§F¡F¨7°2Ó$6¸¿¹¸yÈÓ8LØ�V‰V�I˜bÓ! 2§6¡6¨&°Ó#4ð6õ	
ð
ð 	‡K�K„MØ‡J�J„LØùò .s   Ã"G!c                  ó4  — t        j                  t        d¬«       t        dt        «       t        d„ t        j                  t        «      D «       «      } | r)| d}}t        dt        › dt        | «      › d�t        «       nBt        d	t        › d
�t        «       	 t        «       }d}t        dt        |«      › d�t        «       dx}x}x}}|D ]Ù  }t         j                  j                  t        |«      }	t         j                  j                  |	«      r|	}
nEt        |«      }
|
r|dz  }t        d|dd › �t        «       n|dz  }t        d|dd › �t        «       ŒŽ	 t        |
«      \  }}t        |||«      }|r)|dz  }t        d|dd › dt        |«      › d�t        «       n|dz  }ŒÛ t!        j"                  t$        «      j'                  d«      j)                  «       d   }t        d|› d|› d|› d |› d!|› d"|› d#�t        «       t        d$t        «       |rt        d%|› d&�t        «       yy# t        $ r-}t        d|› �t        «       t        dt        «       Y d}~yd}~ww xY w# t        $ r)}|dz  }t        d|dd › d|› �t        «       Y d}~�ŒÆd}~ww xY w)'u  è¿”å›ž 0 æˆ�åŠŸ / 1 å¤±è´¥ã€‚

    æ•°æ�®æº�ä¼˜å…ˆçº§ï¼ˆ2026-09-14 èµ·ï¼Œç”¨æˆ·æŒ‡ä»¤ï¼‰ï¼š
      â‘  æœ¬åœ°é•œåƒ� ZC_PDF_DIR â€”â€” ç”± Mac ç«¯ rsync å�šæžœäº‘ã€ŒDownloads_nucã€�å�Œæ­¥è€Œæ�¥ã€‚
         **å�šæžœäº‘å�Œæ­¥ç»“æžœä¸ºå‡†**ï¼ˆå®žæ—¶ã€�å®Œæ•´ï¼šå®žæµ‹ 2634 ä¸ªæ�¡ç›®ï¼‰ã€‚
      â‘¡ å›žè�½ WebDAV PROPFIND â€”â€” âš ï¸� å�šæžœäº‘ PROPFIND ä¼šã€�æˆªæ–­ã€‘ï¼š
         å®žæµ‹ç›®å½• 2634 ä¸ªæ�¡ç›®å�ªè¿”å›ž 751 ä¸ª <response>ï¼ˆ743 ä¸ª PDFï¼‰ï¼Œ
         å�³ 71% çš„æ–‡ä»¶å¯¹å¼•æ“Žä¸�å�¯è§� â†’ å�ªèƒ½å½“æœ€å�Žæ‰‹æ®µã€‚
    T©Úexist_oku   === å¼€å§‹ ZC å�Œæ­¥ ===c              3   ó^   K  — | ]%  }|j                  «       j                  d «      r|–— Œ' y­w)z.pdfN)ÚlowerÚendswith©rÈ   r9   s     r   rÊ   zzc_run.<locals>.<genexpr>t  s+   è ø€ ò 7˜aØŸ7™7›9×-Ñ-¨fÔ5ô ñ 7ùs   ‚+-Úlocalu   æ•°æ�®æº�=æœ¬åœ°é•œåƒ�(u   ) å…± u.    ä¸ª PDF â€”â€” ä»¥å�šæžœäº‘å�Œæ­¥ç»“æžœä¸ºå‡†u   !!! æœ¬åœ°é•œåƒ�ä¸ºç©º(uk   ) â†’ å›žè�½ WebDAVï¼ˆæ³¨æ„�ï¼šå�šæžœäº‘ PROPFIND æœ‰æˆªæ–­é£Žé™©ï¼Œå�¯è§�æ–‡ä»¶æ•°å�¯èƒ½è¿œå°‘äºŽå®žé™…ï¼‰u/   !!! ZC æº�ç›®å½•åˆ—è¡¨å¤±è´¥(å·²é‡�è¯• 3 æ¬¡): u   === ä¸­æ­¢ ZC ===Nr   Úwebdavu   WebDAV å…±æœ‰ u=    ä¸ª PDFï¼ˆâš ï¸� è‹¥è¿œå°‘äºŽé¢„æœŸå�³ä¸º PROPFIND æˆªæ–­ï¼‰r   u     â¬‡ ä¸‹è½½ r„   u     âœ— ä¸‹è½½å¤±è´¥(å·²é‡�è¯•): u     âœ… é2   u    (è�”ç³»äºº: rG  u     âœ— r‘   z SELECT COUNT(*) FROM zc_projectsu   æº�=u	    æ–°å¢ž: u
   , è·³è¿‡: u
   , ä¸‹è½½: u
   , å¤±è´¥: u   , ZC.db æ€»è®¡: u    æ�¡u   === å®Œæˆ� ===ú!!! uD    ä¸ªæ–‡ä»¶å¤„ç�†å¤±è´¥ â†’ rc=1 ä»¥ä¾¿å‘Šè­¦ï¼ˆä¸�å†�é�™é»˜å�žæŽ‰ï¼‰)r   Úmakedirsr�   r:   r“   r{   ÚlistdirrÓ   r�   rJ   r   rŒ   r   r”   r=  rS  rH  rI  rJ  r?  r@  )Ú
local_pdfsr}   ÚviarS   Ú	new_countÚ
skip_countÚ
fail_countÚdl_countr€   Ú
local_pathr7  rÙ   r  ÚinsertedÚcounts                  r   Úzc_runrj  g  s°  € ô ‡K�K”
 TÕ*ÜÐ"¤FÔ+äñ 7¤2§:¡:¬jÓ#9ô 7ó 7€JáØ ˆcˆÜÐ%¤j \°¼¸J»Ð7HÐHvÐwÔyõ  	AäÐ%¤j \ð 2gð hÜioô	qð	Ü!Ó#ˆDð
 ˆÜˆnœS ›Y˜KÐ'dÐeÔgmÔnà56Ð6€IÐ6�
Ð6˜Z¨(Øò 4ˆä—W‘W—\‘\¤*¨eÓ4ˆ
Ü�7‰7�>‰>˜*Ô%Ø!‰Hä)¨%Ó0ˆHÙØ˜A‘�Ü�m E¨#¨2 J <Ð0´&Õ9ð ˜a‘�
ÜÐ5°e¸C¸R°j°\ÐBÄFÔKØð
	4Ü& xÓ0‰KˆAˆxÜ& q¨(°EÓ:ˆHÙØ˜Q‘�	Ü�f˜U 3 B˜Z˜L¨´c¸(³m°_ÀAÐFÌÕOà˜a‘�
øð/4ô8 �O‰OœEÓ"×*Ñ*Ð+MÓN×WÑWÓYÐZ[Ñ\€EÜˆ$ˆsˆe�9˜Y˜K z°*°¸ZÈÀzð RØ�,Ð.¨u¨g°Tð	;Ü<BôDäÐœ&Ô!ÙÜˆd�:�,ÐbÐcÔekÔlØØøôW ò 	ÜÐAÀ!ÀÐEÄvÔNÜÐ#¤VÔ,Üûð	ûô@ ò 	4Ø˜!‰OˆJÜ�&˜˜s ˜˜ B q cÐ*¬F×3Ò3ûð	4ús1   Â
H, ÅAI%È,	I"È5#IÉI"É%	JÉ.JÊJc           	      óª  — t        dt        j                  j                  | «      › �«       t	        | «      \  }}t        d«       |j                  «       D ]L  \  }}|sŒ	t        t        |«      «      dkD  rt        |«      dd dz   n
t        |«      }t        d|› d|› �«       ŒN t        d«       |rZt        |d	«      D ]J  \  }}t        d
|› d�«       |j                  «       D ]  \  }}|sŒ	t        d|› d|› �«       Œ t        «        ŒL nt        d«       t        d«       t        t        ||t        j                  j                  | «      «      «       y)u9   å�• PDF è§£æž�é¢„è§ˆï¼ˆåŽŸ parse_zc.py å�•æ–‡ä»¶ç”¨æ³•ï¼‰u   ðŸ“„ u   
â”€â”€ é¡¹ç›®ä¿¡æ�¯ â”€â”€éd   Nz...rG   r‘   u   
â”€â”€ è�”ç³»äºº â”€â”€r   z  [ú]z    u     (æ— )u   
â”€â”€ SQL â”€â”€)
r5   r   r   r6  r=  rÒ   rÓ   r<   rÑ   r/  )r7  rÙ   r  r   r   ÚoutputrR   r  s           r   Ú
zc_previewro  ¬  s4  € ä	ˆE”"—'‘'×"Ñ" 8Ó,Ð-Ð
.Ô/Ü˜xÓ(�K€A€xä	Ð
(Ô)Ø—‘“	ò &‰ˆˆ1ÚÜ-0´°Q³«[¸3Ò->”S˜“V˜D˜S�\ EÒ)ÄCÈÃFˆFÜ�B�q�c˜˜F˜8Ð$Õ%ð&ô
 
Ð
%Ô&ÙÜ˜h¨Ó*ò 	‰DˆAˆqÜ�C˜�s˜!�*ÔØŸ™›	ò +‘��1ÚÜ˜D   2 a S˜/Õ*ð+ô �Gñ	ô 	ˆiÔä	Ð
Ô Ü	Œ'�!�XœrŸw™w×/Ñ/°Ó9Ó
:Õ;r$   )))u   é¡¹ç›®å��ç§°rÐ   )u   é¡¹ç›®ç±»åž‹r�   )u   é¡¹ç›®IDr–   )u   é¡¹ç›®æ‰€å±žè¡Œä¸šrŸ   )u   æ‰€å±žé¢†åŸŸç±»åž‹Ú
field_type)u   æ‰€å±žçœ�ä»½r¹   )u   æ‰€å±žåœ°çº§å¸‚rº   )u   è¿›å±•é˜¶æ®µrš   )r˜   r™   )u   è·Ÿè¸ªç‰ˆæœ¬å�·Úversion)u   é¡¹ç›®æ€§è´¨Únature)u   é¢„ç®—æŠ•èµ„æ€»é¢�(ä¸‡å…ƒ)Úbudget)u   æŠ•èµ„æ€§è´¨Úinvest_nature)u   èµ„é‡‘åˆ°ä½�æƒ…å†µÚfunding)u   å»ºè®¾ç­‰çº§Úgrade)u   é¢„è®¡å¼€å»ºæ—¶é—´Ú
start_time)u   é¢„è®¡æˆªæ­¢æ—¶é—´Úend_time)u   è®¾å¤‡æ�¥æº�Úequipment_source)r¤   r¥   )r¦   r§   )u   æœ‰æ— é’¢ç»“æž„r¬   )r¨   Úbuilding_floors)r·   Úheating_method)r¶   Úwall_material)rµ   r«   )u   æœ‰æ— ç©ºè°ƒÚhas_ac)u   æœ‰æ— ç«‹ä½“å�œè½¦ä½�Úhas_parking)u   æœ‰æ— ç”µæ¢¯Úhas_elevator)u   é¡¹ç›®æ‰€åœ¨åœ°Úproject_address)u   ä¸“é¢˜æ ‡ç­¾Útags)r¾   rï   )u   ä¸»ä½“æ–½å·¥é˜¶æ®µrô   )u   ä¸»ä½“è®¾è®¡é˜¶æ®µrò   )u   å•†æœºæ��è¿°Úopportunity)u   å…³é”®å·¥ç¨‹Ú	key_works)u   å…·ä½“éœ€æ±‚æƒ…å†µÚprocurement_needs)rþ   Úowner_company)u   é¡¹ç›®æ ‡é¢˜rÐ   )u   æ›´æ–°ç‰ˆæœ¬rq  )u   æ›´æ–°æ—¶é—´r™   )u   æ‰€å±žæ �ç›®r�   ),rÐ   r�   r–   rŸ   rp  r¹   rº   rš   r™   rq  rr  rs  rt  ru  rv  rw  rx  ry  r¥   r§   r¬   rÎ   Úprogressr‚  rƒ  ÚoverviewÚdetailr…  r  rD  rz  r{  r|  r«   r}  r~  r  r€  r�  rï   rô   rò   rî   r„  c                 ó´   — | s| S t        j                  dd| «      }t        j                  dd|«      }t        j                  dd|«      }|j                  «       S )uX   æ¸…ç�†å…¬å�¸å��ä¸­çš„æ‰€æœ‰æ�ƒæ ‡è®° (ç§�è�¥)/(å›½æœ‰)/(é›†ä½“) å�Šå°¾éƒ¨é™„å±žå¤‡æ³¨ã€‚ud   \s*[ï¼ˆ(](?:ç§�è�¥|å›½æœ‰(?:/é›†ä½“æ‰€æœ‰)?|é›†ä½“(?:æ‰€æœ‰)?)[)ï¼‰]\s*(?:[ï¼ˆ(][^)ï¼‰]*[)ï¼‰])?\s*$r   u   \s*[ï¼ˆ(][^)ï¼‰]*$u   \s*[(ï¼ˆ][^)ï¼‰]*[)ï¼‰]\s*$)rt   r×   r   )r  Úcleaneds     r   Ú_clean_company_namer‹  	  s\   € áØˆÜ�f‰fÐ|ð  Að  CGó  H€GÜ�f‰fÐ*¨B°Ó8€GÜ�f‰fÐ3°R¸ÓA€GØ�=‰=‹?Ðr$   c                 ó¢   — t         j                  |«      }|r8| j                  |«      s&|j                  «       }|dk(  rt        |«      }|| |<   yyy)uB   é€šè¿‡ FIELD_MAP å°†ä¸­æ–‡é”®æ˜ å°„ä¸ºè‹±æ–‡å­—æ®µå†™å…¥ recordã€‚r…  N)Ú	FIELD_MAPrÖ   r   r‹  )ÚrecordÚcn_keyrÞ   Úens       r   Ú_apply_fieldr‘    sJ   € ä	�‰�vÓ	€BÙ	�&—*‘*˜R”.Ø�i‰i‹kˆØ�Ò Ü% cÓ*ˆCØˆˆrŠ
ð	 !€rr$   c                 óÀ  ‡ — ˆ fd„}t        |d‰ › �¬«      }|j                  dk7  rg S t        j                  |j                  «      }ddi}g }|j                  d|«      D ]|  }|j                  d|«      }|€Œ|j                  xs d	j                  d
«      j                  d
d«      d   }t        j                  j                  |«      }|sŒl|j                  |«       Œ~ |S )Nc                  óZ   •— t        j                  dt        ‰ z   t        «       ddid¬«      S )NrX   rY   rZ   r_   )Úauthr\   ra   )Úrequestsrc   ÚCCPC_WEBDAV_HOSTr%   ©Ú
remote_dirs   €r   rm   zccpc_webdav_list.<locals>._do   s1   ø€ Ü×Ñ 
Ô,<¸zÑ,IÔPUÓPWØ)0°#¨ÀôDð 	Dr$   u   CCPC åˆ—è¡¨ rn   éÏ   ÚdzDAV:z.//d:responsezd:hrefr   rH   r   ro   )rT   Ústatus_codeÚETÚ
fromstringÚcontentÚfindallr  rØ   rw   Úrsplitrb   rx   ry   rz   )	r˜  rm   rA  ÚrootÚnsÚfilesrj   Úhref_elrM   s	   `        r   Úccpc_webdav_listr¥    sÖ   ø€ ôDô 	ˆs˜<¨
 |Ð4Ô5€AØ‡}�}˜ÒØˆ	Ü�=‰=˜Ÿ™Ó#€DØ
ˆvˆ€BØ€EØ—‘˜_¨bÓ1ò ˆØ—)‘)˜H bÓ)ˆØˆ?ØØ�l‰lÒ ˜b×(Ñ(¨Ó-×4Ñ4°S¸!Ó<¸RÑ@ˆÜ�\‰\×!Ñ! "Ó%ˆÚØ�L‰L˜Õðð €Lr$   c                 óª   ‡‡— t         | z   t        j                  j                  |«      z   Šˆˆfd„}	 t	        |d|d d › �¬«      S # t
        $ r Y yw xY w)Nc                  ól  •— t        j                  ‰t        «       d¬«      } | j                  dk(  r1t	        ‰d«      5 }|j                  | j                  «       d d d «       yd| j                  cxk  rdk  rn nt        d| j                  › �«      ‚t        d| j                  › �«      ‚# 1 sw Y   yxY w)	Nr„   )r”  ra   éÈ   rˆ   Tr…   r†   r‡   )	r•  rÖ   r%   r›  r   r*   rž  rA   ÚRuntimeError)rA  r9   rg  rl   s     €€r   rm   z!ccpc_webdav_download.<locals>._do9  s’   ø€ Ü�L‰L˜¤5£7°BÔ7ˆØ�=‰=˜CÒÜ�j $Ó'ð #¨1Ø—‘˜Ÿ	™	Ô"÷#àØ�!—-‘-Ô% #Õ%Ü  5¨¯©¨Ð!8Ó9Ð9Ü˜U 1§=¡= /Ð2Ó3Ð3÷#àús   ½B*Â*B3u   CCPC ä¸‹è½½ r_   rn   F)r–  rb   rx   r’   rT   rJ   )Úremote_baser�   rg  rm   rl   s     ` @r   Úccpc_webdav_downloadr«  4  sY   ù€ ô ˜[Ñ
(¬6¯<©<×+=Ñ+=¸hÓ+GÑ
G€Cõ4ðÜ�c ,¨x¸¸¨}¨oÐ >Ô?Ð?øÜò Ùðús   ³A Á	AÁAz1[3-9]\d{9}z.[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}u*   è�”ç³»äºº[ï¼š:]\s*([\u4e00-\u9fffÂ·]{2,6})c                 ó„  — g }| r| j                  «       s|S | j                  «       j                  d«      }g }g }|D ]   }|j                  «       }|sŒt        |«      dkD  xr t        j                  d|«      xs d|v xs d|v xs
 d|v xs d|v xr |j                  d«       }|r&|r$|j                  dj                  |«      «       |g}Œ�|j                  |«       Œ¢ |r |j                  dj                  |«      «       |D �]¹  }|j                  «       }|rd	|v sd
|v rŒ|j                  d«      }	|	d   j                  «       }
|
}|sŒHdj                  |	dd «      }t        j                  |«      }t        t        t        j                  |«      «      «      }t        t        t        j                  |«      «      «      }d}t        j                  d|«      }|r|j                  d«      j                  «       }d}t        j                  d|«      }|r|j                  d«      j                  «       }|rH|D ]A  }|j                  |||rdj                  |«      nd||rdj                  |«      nd||dœ«       ŒC �Œ{|s�Œ|j                  |ddj                  |«      ||rdj                  |«      nd||dœ«       �Œ¼ |S )u/   ä»Žè�”ç³»äººæ–‡æœ¬å�—è§£æž�ä¸º [dict] åˆ—è¡¨ã€‚r2   é   ud   [ï¼ˆ(](ä¸šä¸»|è®¾è®¡|æ–½å·¥|æ³•äºº|é¡¹ç›®|è‚¡ä¸œ|æ€»é›†å›¢|æŠ€æœ¯|é‡‡è´­|æ–½å·¥å›¾çº¸)[^)ï¼‰]*[)ï¼‰]u   æœ‰é™�å…¬å�¸u   å…¬å�¸u   åŽ‚u   é™¢)
u	   è�”ç³»äººu   è�”ç³»æ–¹å¼�r
  u   åœ°å�€u   ç”µè¯�r  r	  u   é‚®ç®±ÚEmailÚemailõ   ä»…ä¾›å�‚è€ƒõ   ç‰ˆæ�ƒæ‰€æœ‰r   r   Nr   u:   (?:å›ºå®šç”µè¯�|åº§æœº|landline)[ï¼š:]\s*(\d[\d\- ]{5,15})u   åœ°å�€[ï¼š:]\s*(.+)ú / )r   r  r  Úlandliner¯  r  r  )r   r   rÓ   rt   r÷   r   rz   rŒ   ÚNAME_RErŸ  r{   ÚsetÚPHONE_REÚEMAIL_RErv   )Ú	text_blobÚ
role_labelr  rÚ   ÚblocksÚcurr   Úis_company_lineÚblockÚlines_bÚ
first_liner   ræ   ÚnamesÚphonesÚemailsÚlandline_numÚm_llÚaddrr~   r  s                        r   Úparse_contacts_from_textrÆ  P  sÖ  € à€HÙ˜IŸO™OÔ-ØˆØ�O‰OÓ×#Ñ# DÓ)€EØ€FØ
€CØò ˆØ�z‰z‹|ˆÙØÜ˜t›9 q™=ò SÜŸ)™)ð  %Lð  NRó  Sògà(¨DÐ0ògà4<ÀÐ4DògàHMÐQUÈògàY^ÐbfÐYfò[ð #Ÿo™oð  /Zó  [ð  [ð 	ñ ™sØ�M‰M˜$Ÿ)™) C›.Ô)Ø�&‰Cà�J‰J�tÕðñ Ø�‰�d—i‘i “nÔ%Øó +ˆØ—‘“ˆÙ˜¨%Ñ/°>ÀUÑ3JØØ—+‘+˜dÓ#ˆØ˜Q‘Z×%Ñ%Ó'ˆ
ð ˆÙØØ�y‰y˜  ˜Ó%ˆÜ—‘ Ó&ˆÜœœH×,Ñ,¨UÓ3Ó4Ó5ˆÜœœH×,Ñ,¨UÓ3Ó4Ó5ˆØˆÜ�y‰yÐVÐX]Ó^ˆÙØŸ:™: a›=×.Ñ.Ó0ˆLØˆÜ�I‰IÐ,¨eÓ4ˆÙØ—7‘7˜1“:×#Ñ#Ó%ˆDÙØò 	�Ø—‘Ø&Ø$(Ù39˜UŸZ™Z¨Ô/¸rØ ,Ù39˜UŸZ™Z¨Ô/¸rØ#Ø&ñ!õ ò	ó Ø�O‰OØ"Ø "ØŸ™ FÓ+Ø(Ù/5˜Ÿ™ FÔ+¸2ØØ"ñö ðG+ðX €Or$   rþ   rü   rý   õ   å�‚è€ƒè�”ç³»äºº)õ'   ä¸šä¸»å�•ä½�è�”ç³»äººä»¥å�Šè�”ç³»æ–¹å¼�õ$   è®¾è®¡é™¢è�”ç³»äººä»¥å�Šè�”ç³»æ–¹å¼�õ'   æ–½å·¥å�•ä½�è�”ç³»äººä»¥å�Šè�”ç³»æ–¹å¼�õ   å�‚è€ƒå�•ä½�ï¼ˆä»…ä¾›å�‚è€ƒï¼‰>   õ   ç›®å½•õ   é¡¹ç›®æ¦‚å†µõ   é¡¹ç›®è¯¦æƒ…õ   é¡¹ç›®è¿›å±•õ   æ‰€éœ€æ��æ–™è®¾å¤‡õ   è®¾å¤‡é‡‡è´­æƒ…å†µõ   é¡¹ç›®åŸºç¡€ä¿¡æ�¯õ   é¡¹ç›®è·Ÿè¸ªç‰ˆæœ¬rË  rÉ  rÈ  rÊ  c                 ó"  ‡‡‡‡‡‡‡‡— t        | «      }i Šg Šg Ši Ši Š|j                  D ]Ö  }g ŠdŠˆˆˆˆˆˆˆfd„}t        |j                  «      D ]¦  \  }}|j                  D �cg c]  }|j
                  j                  «       ‘Œ c}Š‰xr t        ˆfd„‰D «       «      }‰r‰d   nd}|xr# |t        v xs |dkD  xr |xr t        |«      dk  }	|	r|dkD  r |«        g Š|ŠŒ“|	rŒ–‰j                  ‰«       Œ¨  |«        ŒØ ‰j                  d«      sdj                  ‰«      ‰d<   nG‰rE‰d   }
g }‰D ]  }||
vsŒ||vsŒ|j                  |«       Œ |r|
dz   dj                  |«      z   ‰d<   ‰j                  d	«      sz|j                  D �cg c]7  }|j
                  j                  «       sŒ|j
                  j                  «       ‘Œ9 }}|D ])  }t        |«      d
kD  sŒ|j                  d«      rŒ$|‰d	<    n ‰j                  d	«      s9t        j                   j#                  | «      }t%        j&                  dd|«      ‰d	<   i }t(        D ]  }‰j                  |«      sŒ‰|   ||<   Œ ‰j+                  «       D ]  \  }}||d|› �<   Œ |j                  D �cg c]7  }|j
                  j                  «       sŒ|j
                  j                  «       ‘Œ9 }}|r||d<   t-        j.                  |dt0        ¬«      ‰d<   ‰‰fS c c}w c c}w c c}w )u,   è§£æž� DOCX â†’ (record dict, contacts list)Nc            
      óˆ  •— ‰r‰sy ‰dk(  r´t        ‰«      dk\  r¥‰d   } g }‰dd  D ]~  }t        dt        t        | «      t        |«      «      «      D ]Q  }| |   j                  «       }||   j                  «       }|sŒ,|sŒ/|j	                  |› d|› �«       t        ‰||«       ŒS Œ€ |rdj                  |«      ‰‰<   y y y ‰dk(  rÐg }‰D ]¯  }g }|D ]  }	|r	|	|d   k7  sŒ|j	                  |	«       Œ  t        dt        |«      d«      D ]o  }|dz   t        |«      k  sŒ||   j                  «       ||dz      j                  «       }}|sŒA|sŒDt        ‰||«       |t        v sŒZ|j	                  |› d|› �«       Œq Œ± |rdj                  |«      }
|
‰‰<   y y ‰d	k(  rl‰r‰d   r‰d   d   j                  «       nd
}|rJd|vrE|‰‰<   |‰j                  d«      xs d
vr‰j	                  |«       ‰j                  d«      s|‰d<   y y y y ‰dk(  rD‰r‰d   r‰d   d   j                  «       nd
}|r"d|vr|‰‰<   ‰j                  d«      s|‰d<   y y y y ‰dv rD‰r‰d   r‰d   d   j                  «       nd
}|r"d|vr|‰‰<   ‰j                  d«      s|‰d<   y y y y ‰dk(  rD‰r‰d   r‰d   d   j                  «       nd
}|r"d|vr|‰‰<   ‰j                  d«      s|‰d<   y y y y ‰t        v r[‰r‰d   r‰d   d   j                  «       nd
}|r9d|vr4d|vr/t        ‰   }|‰‰<   |‰‰<   ‰j                  t        ||«      «       y y y y y )NrÓ  r'   r   r   r¸   r2   rÒ  ro   rÎ  r   r±  rˆ  rÍ  r‡  )rÐ  rÑ  rÎ   rÏ  r†  r°  )rÓ   rI   Úminr   rz   r‘  rŒ   r�  rÖ   ÚCONTACT_SECTION_MAPr  rÆ  )ÚhdrrÚ   ÚrowrR   r   r   Úkv_linesÚrcellsÚdedupedr  Útxtr  Úall_contactsÚall_sections_rawÚcontact_sectionsÚdetail_partsrŽ  Ú	rows_dataÚsection_names               €€€€€€€r   Úflush_sectionz!parse_docx.<locals>.flush_section¶  sô  ø€ á¡yØØÐ3Ò3Ü�y“> QÒ&Ø# A™,�CØ�EØ(¨¨˜}ò ;˜Ü!& q¬#¬c°#«h¼¸C»Ó*AÓ!Bò ;˜AØ # A¡§¡£˜AØ # A¡§¡£˜AÚ ¢QØ %§¡°¨s°#°a°S¨\Ô :Ü ,¨V°Q¸Õ :ñ;ð;ñ Ø9=¿¹À5Ó9IÐ(¨Ò6ð ð 'ð Ð!5Ò5Ø�Ø'ò B�FØ �GØ#ò .˜Ù&¨!¨w°r©{Ó*:Ø#ŸN™N¨1Õ-ð.ô # 1¤c¨'£l°AÓ6ò B˜Ø˜q™5¤3 w£<Ó/Ø#*¨1¡:×#3Ñ#3Ó#5°w¸qÀ¹s±|×7IÑ7IÓ7K˜q˜AÚ ¢QÜ ,¨V°Q¸Ô :Ø#$¬	¢>Ø$,§O¡O°q°c¸¸Q¸C°LÕ$AñBðBñ ØŸ)™) HÓ-�CØ58Ð$ \Ò2ð ð  Ò/Ù/8¸YÀqº\�I˜a‘L ‘O×)Ñ)Ô+Èr�Ù˜¨qÑ0Ø56Ð$ \Ñ2Ø §¡¨HÓ!5Ò!;¸Ñ<Ø$×+Ñ+¨AÔ.Ø!Ÿ:™: hÔ/Ø+,˜˜xÒ(ð 0ð	 1�1ð  Ò/Ù/8¸YÀqº\�I˜a‘L ‘O×)Ñ)Ô+Èr�Ù˜¨qÑ0Ø56Ð$ \Ñ2Ø!Ÿ:™: jÔ1Ø-.˜˜zÒ*ð 2ð 1�1ð
 Ð!MÑMÙ/8¸YÀqº\�I˜a‘L ‘O×)Ñ)Ô+Èr�Ù˜¨qÑ0Ø56Ð$ \Ñ2Ø!Ÿ:™:Ð&6Ô7Ø34˜Ð/Ò0ð 8ð 1�1ð
  Ò/Ù/8¸YÀqº\�I˜a‘L ‘O×)Ñ)Ô+Èr�Ù˜¨qÑ0Ø56Ð$ \Ñ2Ø!Ÿ:™: jÔ1Ø-.˜˜zÒ*ð 2ð 1�1ð
 Ô!4Ñ4Ù/8¸YÀqº\�I˜a‘L ‘O×)Ñ)Ô+Èr�Ù˜¨qÑ0°^È1Ñ5LÜ.¨|Ñ<�DØ56Ð$ \Ñ2Ø56Ð$ \Ñ2Ø ×'Ñ'Ô(@ÀÀDÓ(IÕJð	 6MÐ0�1ð 5r$   c              3   ó.   •K  — | ]  }|‰d    k(  –— Œ y­w)r   Nr#   )rÈ   r  Úcellss     €r   rÊ   zparse_docx.<locals>.<genexpr>  s   øè ø€ Ò$B°q Q¨%°©(¥]Ñ$Bùs   ƒr   r   é   rˆ  ú

rÐ   é   rÌ  z-\d+\.docx$Ú	_section_Ú_paragraphsF)rF  ÚdefaultrD  )r   ÚtablesrÑ   Úrowsræ  rØ   r   ÚallÚSECTION_NAMESrÓ   rz   rÖ   rŒ   Ú
paragraphsr   r   r   r6  rt   r×   ÚALL_PROJECT_FIELDSrÒ   rM  rN  r<   )Úfilepathr8  Útablerä  ÚrirÙ  r  Úall_samerR  Úis_hdrÚexistingÚextraÚpartrÙ   rÀ  rá   r€   Úraw_dictr9   ÚsnÚsrrñ  rÞ  rß  ræ  rà  rá  rŽ  râ  rã  s                         @@@@@@@@r   Ú
parse_docxrþ  ©  s  ÿ€ ä
�8Ó
€CØ€FØ€LØ€LØÐØÐà—‘ò \ˆØˆ	Øˆ÷H	Kò H	KôT ! §¡Ó,ò 	(‰GˆB�Ø-0¯Y©YÖ7¨�Q—V‘V—\‘\•^Ò7ˆEØÒB¤Ó$B¸EÔ$BÓ!BˆHÙ"��q’¨ˆBØÒ[ 2¬Ð#6Ò#Z¸2À¹6Ò;YÀbÒ;YÌSÐQSËWÐWYÉ\ˆFá˜"˜qš&Ù”Ø�	Ø!‘ÚØ× Ñ  Õ'ð	(ñ 	�ðy\ð~ �:‰:�hÔØ!Ÿ;™; |Ó4ˆˆxÒÙ	ð ˜(Ñ#ˆØˆØ ò 	#ˆDØ˜8Ò#¨°EÒ(9Ø—‘˜TÕ"ð	#ñ Ø'¨&Ñ0°6·;±;¸uÓ3EÑEˆF�8Ñð �:‰:�nÔ%Ø),¯©ÖJ A¸1¿6¹6¿<¹<½>�—‘—‘•ÐJˆÐJØò 	ˆAÜ�1‹v˜‹z !§,¡,¨xÕ"8Ø)*��~Ñ&Ùð	ð �:‰:�nÔ%Ü—‘× Ñ  Ó*ˆÜ!#§¡¨¸¸EÓ!Bˆˆ~Ñð €HÜò $ˆØ�:‰:�a�=Ø  ™)ˆH�QŠKð$ð #×(Ñ(Ó*ò (‰ˆˆBØ%'ˆ�9˜R˜DÐ!Ò"ð(à*-¯.©.ÖK Q¸A¿F¹F¿L¹L½N�!—&‘&—,‘,•.ÐK€JÐKÙØ",ˆ�ÑÜŸ™ H¸5Ì#ÔN€Fˆ:ÑØ�<ÐÐùòg 8ùò> Kùò  Ls   Á%!LÆLÆ/LÊLÊ:Lc                 óÚ  — dd l }d} |j                  | |«       	 t        |d¬«      }||j                  d      }d\  }}t	        |j                  d¬«      «      D ]J  \  }}|dk(  r|D �	cg c]  }	|	rt        |	«      nd‘Œ }}	Œ(|dk(  sŒ.|D �	cg c]  }	|	rt        |	«      nd‘Œ }}	 n |j                  «        |r|s9d g ft        j                  j                  |«      rt        j                  |«       S S t        t        ||«      «      }
i }i }t        j                  «       D ]Q  \  }}|
j!                  |d«      xs d}|d	v rt        |«      ||<   Œ/|sŒ2|j#                  d
«      rŒDt        |«      ||<   ŒS |j!                  d«      s9t        j                  j%                  | «      }t'        j(                  dd|«      |d<   |j!                  d«      s'|
j!                  dd«      j+                  «       }|r||d<   t-        j.                  |
d¬«      |d<   g }|j                  «       D ]J  \  }}t0        j!                  |d«      }|sŒ|j+                  «       sŒ0|j3                  t5        ||«      «       ŒL ||ft        j                  j                  |«      rt        j                  |«       S S c c}	w c c}	w # t        j                  j                  |«      rt        j                  |«       w w xY w)Nr   z/tmp/ccpc_xls_temp.xlsxT)Ú	read_only)NN)Úvalues_onlyr   r   )rÈ  rÉ  rÊ  rÇ  rË  Ú_rÐ   z-\d+\.(xls|xlsx)$rˆ  rÎ  FrE  rD  )ÚshutilÚcopy2r   Ú
sheetnamesrÑ   Ú	iter_rowsr<   r4  r   r   r   ÚremoverL  Úzipr�  rÒ   rÖ   r   r6  rt   r×   r   rM  rN  r×  r  rÆ  )ró  r  Útmprˆ   Úwsr\   r�   rR   rÙ  r   ÚrawrŽ  Úcontacts_rawÚcnr�  rÞ   r€   Ú
raw_detailrÞ  rØ   r  s                        r   Ú	parse_xlsr  9  s¡  € ÛØ
#€CØ€F‡L�L�˜3Ôð'Ü˜3¨$Ô/ˆØ�—‘˜aÑ Ñ!ˆØ"‰ˆ�Ü §¡¸ Ó >Ó?ò 	‰FˆAˆsØ�AŠvØ8;Ö<°1¡Qœ3˜qœ6¨BÑ.Ð<�Ñ<Ø�a“Ø58Ö9°¡!œ˜Aœ¨Ñ+Ð9�Ð9Ùð	ð 	�‰Œ
Ù™dØ˜�8ô4 �7‰7�>‰>˜#ÔÜ�I‰I�c�Nð ô3 ”3�w Ó%Ó&ˆØˆØˆÜ—o‘oÓ'ò 	&‰FˆB�Ø—'‘'˜"˜b“/Ò' RˆCØð wñ wä#& s£8�˜RÒ Ú˜BŸM™M¨#Õ.Ü  ›X��r’
ð	&ð �z‰z˜.Ô)Ü—G‘G×$Ñ$ XÓ.ˆEÜ%'§V¡VÐ,@À"ÀeÓ%LˆF�>Ñ"Ø�z‰z˜(Ô#ØŸ™ °Ó4×:Ñ:Ó<ˆJÙØ#-��xÑ Ü!ŸZ™Z¨¸%Ô@ˆˆzÑØˆØ$×*Ñ*Ó,ò 	J‰HˆB�Ü&×*Ñ*¨2¨rÓ2ˆDÚ˜Ÿ
™
�Ø×#Ñ#Ô$<¸TÀ4Ó$HÕIð	Jð �|Ð#ä�7‰7�>‰>˜#ÔÜ�I‰I�c�Nð ùòA =ùâ9øô< �7‰7�>‰>˜#ÔÜ�I‰I�c�Nð úsP   ›AJ3 Á)J)Á?J3 ÂJ3 ÂJ.Â"J3 Ã4AJ3 ÅJ3 Å%CJ3 ÉJ3 É J3 Ê)
J3 Ê37K*c                 ó  — t        j                  t        «      }| j                  dd«      | j                  dd«      }}d }|r!|j	                  d|f«      j                  «       }|€#|r!|j	                  d|f«      j                  «       }t        D �cg c]  }| j                  |d«      ‘Œ }}|rAdj                  d„ t        D «       «      }|j	                  d|› d	�||d
   gz   «       |d
   }d}	nrdj                  dgt        t        «      z  «      }
|j	                  ddj                  t        «      › d|
› d�|«       |j	                  d«      j                  «       d
   }d}	|j                  «        |j                  «        |	|fS c c}w )Nr–   r   rÐ   z2SELECT id FROM cceup_projects WHERE project_id = ?z4SELECT id FROM cceup_projects WHERE project_name = ?r)  c              3   ó&   K  — | ]	  }|› d �–— Œ y­w)z=?Nr#   rZ  s     r   rÊ   z&ccpc_upsert_project.<locals>.<genexpr>s  s   è ø€ Ò? q˜Q˜C˜rœ(Ñ?ùs   ‚zUPDATE cceup_projects SET z WHERE id=?r   ÚUPDATEú?zINSERT INTO cceup_projects (ú,r*  rG  zSELECT last_insert_rowid()ÚINSERT)rH  rI  ÚCCPC_DBrÖ   r?  r@  rò  rŒ   rÓ   rO  r4  )rŽ  Údbr,  Úpnamerø  r9   rà   Úset_cÚproj_idÚactionÚphs              r   Úccpc_upsert_projectr  i  sn  € Ü	�‰œÓ	!€BØ—‘˜L¨"Ó-¨v¯z©z¸.È"Ó/Mˆ€CØ€HÙ
Ø—:‘:ÐRÐUXÐTZÓ[×dÑdÓfˆØÐ™EØ—:‘:ÐTÐW\ÐV^Ó_×hÑhÓjˆÜ'9Ö: !ˆF�J‰J�q˜"ÕÐ:€DÐ:ÙØ—	‘	Ñ?Ô,>Ô?Ó?ˆØ
�
‰
Ð/°¨w°kÐBÀDÈHÐUVÉKÈ=ÑDXÔYØ˜1‘+ˆØ‰à�Y‰Y˜�uœsÔ#5Ó6Ñ6Ó7ˆØ
�
‰
Ð1°#·(±(Ô;MÓ2NÐ1OÈzÐZ\ÐY]Ð]^Ð_ÐaeÔfØ—*‘*Ð9Ó:×CÑCÓEÀaÑHˆØˆØ‡I�I„KØ‡H�H„JØ�7ˆ?Ðùò ;s   ÂFc                 óü  — |syt        j                  t        «      }|j                  d| f«       d}|D ]¥  }|j                  d| |j	                  dd«      |j	                  dd«      |j	                  dd«      |j	                  dd«      xs |j	                  dd«      |j	                  d	d«      |j	                  d
d«      |j	                  dd«      f«       |dz  }Œ§ |j                  «        |j                  «        |S )Nr   z/DELETE FROM cceup_contacts WHERE project_id = ?z~INSERT INTO cceup_contacts (project_id, company, contact_name, phone, landline, address, role, email) VALUES (?,?,?,?,?,?,?,?)r   r   r  r  r³  r  r  r¯  r   )rH  rI  r  r?  rÖ   rO  r4  )r–   r  r  Úsavedr  s        r   Úccpc_save_contactsr   �  sç   € ÙØÜ	�‰œÓ	!€BØ‡J�JÐ@À:À-ÔPØ€EØò ˆØ
�
‰
ð MØ˜Ÿ™˜y¨"Ó-¨q¯u©u°^ÀRÓ/HØ�U‰U�7˜BÓ §¡ z°2Ó!6Ò!L¸!¿%¹%ÀÈÓ:LØ�U‰U�9˜bÓ! 1§5¡5¨°Ó#4°a·e±e¸GÀRÓ6HðJô	
ð 	�‰
‰ðð ‡I�I„KØ‡H�H„JØ€Lr$   c                 ó„   — t         j                  j                  | j                  d«      j	                  dd«      d   «      S )uM   WebDAV ç›®å½• â†’ æœ¬åœ°é•œåƒ�å­�ç›®å½•å��ï¼ˆ/dav/Downloads/ â†’ Downloadsï¼‰rH   r   ro   )rb   rx   ry   rw   r   r—  s    r   Ú_ccpc_local_subdirr"  ”  s4   € ä�<‰<×Ñ 
× 1Ñ 1°#Ó 6× =Ñ =¸cÀ1Ó EÀbÑ IÓJÐJr$   c           
      óx  ‡— t        j                  t        d¬«       t        d| › d�«       g }d}t        D �]p  Št        ‰«      }t         j                  j                  t        |«      }t         j                  j                  |«      r¹t        j                  |«      D �cg c]A  }t         j                  j                  t         j                  j                  ||«      «      r|‘ŒC }}|D �cg c]  }|j                  d«      sŒ|‘Œ }}|r7t        d|› dt        |«      › d	�«       |j                  ˆfd
„|D «       «       �Œ	 t        ‰«      }|D �cg c]  }|j                  d«      sŒ|‘Œ }}t        d‰› dt        |«      › d	�«       |s�ŒW|j                  ˆfd„|D «       «       �Œs t        dt        |«      › d	�«       | dk(  rEi }	|D ]  \  Š}||	vsŒ‰|	|<   Œ t#        |	j%                  «       «      dd D �cg c]	  }|	|   |f‘Œ }
}n
| dk(  r|}
n|}
|
s„t'        j(                  t*        «      }|j-                  d«      j/                  «       d   }|j-                  d«      j/                  «       d   }|j1                  «        t        d|› d|› �«       |rdS dS dx}x}}|
D �]�  \  }}t         j                  j                  t        |«      }t         j                  j3                  |«      swt         j                  j                  t        t        |«      |«      }t         j                  j                  |«      rt5        j6                  ||«       nt9        |||«      s|dz  }ŒÁ	 |j                  d«      rt;        |«      \  }}nt=        |«      \  }}|�r–|j?                  d«      �r„|�rVg }|D �]:  }g }|j?                  d«      r|jA                  |d   «       |j?                  d«      r|jA                  d|d   › �«       |j?                  d«      r|jA                  d |d   › �«       |j?                  d!«      r|jA                  d"|d!   › �«       |j?                  d#«      r|jA                  d$|d#   › �«       |j?                  d%«      r|jA                  d&|d%   › �«       |j?                  d'«      r|jA                  d(|d'   › �«       |jA                  d)j                  |«      «       �Œ= d*j                  |«      |d+<   tC        |«      \  }}tE        ||«      }|d,k(  r|dz  }n|dz  }n|dz  }�Œ� t'        j(                  t*        «      }|j-                  d«      j/                  «       d   }|j-                  d«      j/                  «       d   }|j1                  «        t        d/|› d0|› d1|› �«       t        d2|› d3|› d4�«       |rdS dS c c}w c c}w # t         $ r}d}t        d‰› d|› �«       Y d}~�ŒÄd}~ww xY wc c}w c c}w # t         $ r$}|dz  }t        d-|dd. › d|› �«       Y d}~�Œ�d}~ww xY w)5u[   è¿”å›ž 0 æˆ�åŠŸ / 1 æœ‰ç›®å½•åˆ—è¡¨å¤±è´¥ï¼ˆéƒ¨åˆ†æº�ç¼ºå¤±â†’rc=1 å�¯è§�ï¼Œä¸�å†�é�™é»˜ï¼‰TrU  z=== CCPC v2 parse [mode=z] ===F)z.docxú.xlsú.xlsxu     [æœ¬åœ°é•œåƒ�] r‘   z filesc              3   ó&   •K  — | ]  }‰|f–— Œ
 y ­wrÅ   r#   ©rÈ   r9   rš  s     €r   rÊ   zccpc_run.<locals>.<genexpr>¬  s   øè ø€ Ò!<¨Q 1 a¤&Ñ!<ùó   ƒz  !!! u     åˆ—è¡¨å¤±è´¥(å·²é‡�è¯• 3 æ¬¡): Nz  [WebDAV] c              3   ó&   •K  — | ]  }‰|f–— Œ
 y ­wrÅ   r#   r'  s     €r   rÊ   zccpc_run.<locals>.<genexpr>·  s   øè ø€ Ò8¨˜q !œfÑ8ùr(  zTotal: Útesté   Úforcez#SELECT COUNT(*) FROM cceup_projectsr   z#SELECT COUNT(*) FROM cceup_contactszNothing to process. Projects: z, Contacts: r   )r$  r%  rÐ   r   r  u   è�”ç³»äººï¼šr  u   è�”ç³»æ–¹å¼�ï¼šr³  u   å›ºå®šç”µè¯�ï¼šr¯  u	   é‚®ç®±ï¼šr  u	   åœ°å�€ï¼šr  u	   è§’è‰²ï¼šr2   rè  r  r  z  ERROR é(   zDone: +z Uz errz	ccpc.db: z projects, z	 contacts)#r   r_  ÚCCPC_LOCAL_CACHEr:   ÚCCPC_DOWNLOAD_DIRSr"  r   rŒ   ÚCCPC_SRC_ROOTÚisdirr`  ÚisfilerY  rÓ   r  r¥  rJ   ÚlistÚkeysrH  rI  r  r?  r@  r4  r   r  r  r«  r  rþ  rÖ   rz   r  r   )ÚmodeÚ
all_remoteÚ	list_failr×   Úldirr9   r£  Ú	supportedrS   ÚseenÚ
to_processr  rá   ÚncÚinsÚupdÚerrÚbase_dirr€   ÚlpÚ_mirrorÚrecr  Úclinesr  râ   Úactr  Úc_savedrš  s                                @r   Úccpc_runrG  ™  s·  ø€ ä‡K�KÔ ¨4Õ0ÜÐ
" 4 &¨Ð.Ô/ð
 €JØ€IÜó 9ˆÜ  Ó#ˆÜ�w‰w�|‰|œM¨3Ó/ˆÜ�7‰7�=‰=˜ÔÜ "§
¡
¨4Ó 0ö ?˜1ÜŸ™Ÿ™¤r§w¡w§|¡|°D¸!Ó'<Ô=ò ð ?ˆEð ?à$)ÖT˜q¨Q¯Z©ZÐ8RÕ-SšÐTˆIÐTÙÜÐ'¨ u¨B¬s°9«~Ð.>¸fÐEÔFØ×!Ñ!Ó!<°)Ô!<Ô<Ùð	Ü$ QÓ'ˆEð
 !&ÖP˜1¨¯©Ð4NÕ)O’QÐPˆ	ÐPÜˆk˜!˜˜Bœs 9›~Ð.¨fÐ5Ô6ÛØ×ÑÓ8¨iÔ8Ö8ð)9ô* ˆ'”#�j“/Ð" &Ð)Ô*àˆv‚~ØˆØò 	‰DˆAˆqØ˜Š}Ø��Q’ð	ô -1°·±³Ó,=¸b¸qÐ,AÖB q�t˜A‘w ’lÐBˆ
ÑBØ	�ŠØ‰
àˆ
áÜ�_‰_œWÓ%ˆØ�J‰JÐ<Ó=×FÑFÓHÈÑKˆØ�Z‰ZÐ=Ó>×GÑGÓIÈ!ÑLˆØ
�‰Œ
ÜÐ,¨Q¨C¨|¸B¸4Ð@ÔAÙˆqÐ$ 1Ð$àÐ€CÐˆ#�Ø%ó (.‰ˆ�%Ü�W‰W�\‰\Ô*¨EÓ2ˆÜ�w‰w�~‰~˜bÔ!ä—g‘g—l‘l¤=Ô2DÀXÓ2NÐPUÓVˆGÜ�w‰w�~‰~˜gÔ&Ü—‘˜W bÕ)Ü)¨(°E¸2Ô>Ø�q‘�Øð	.Ø�~‰~Ð/Ô0Ü )¨"£‘�‘Xä *¨2£‘��XÚ�s—w‘w˜~Õ.âØ�FØ%ó 	8˜Ø "˜ØŸ5™5 Ô+¨U¯\©\¸!¸I¹,Ô-GØŸ5™5 Ô0°%·,±,ÀÈaÐP^ÑN_ÐM`Ð?aÔ2bØŸ5™5 œ>¨5¯<©<¸/È!ÈGÉ*ÈÐ8VÔ+WØŸ5™5 Ô,¨e¯l©l¸_ÈQÈzÉ]ÈOÐ;\Ô.]ØŸ5™5 œ>¨5¯<©<¸)ÀAÀgÁJÀ<Ð8PÔ+QØŸ5™5 Ô+¨U¯\©\¸IÀaÈ	ÁlÀ^Ð:TÔ-UØŸ5™5 œ=¨%¯,©,¸À1ÀVÁ9À+Ð7NÔ*OØŸ™ d§i¡i°Ó&6Ö7ð	8ð '-§k¡k°&Ó&9�C˜
‘OÜ2°3Ó7‘��WÜ,¨W°hÓ?�Ø˜(’?Ø˜1‘H‘Cà˜1‘H‘Cà�q‘�ùðK(.ôT 
�‰œÓ	!€BØ
�
‰
Ð8Ó9×BÑBÓDÀQÑG€AØ	�‰Ð9Ó	:×	CÑ	CÓ	EÀaÑ	H€BØ‡H�H„JÜˆ'�#��b˜˜˜T # Ð'Ô(Üˆ)�A�3�k "  YÐ/Ô0Ùˆ1Ð ˜qÐ ùòo?ùâTøô ò 	ØˆIÜ�&˜˜Ð;¸A¸3Ð?Ô@Ýûð	üò Qùò Cøôj ò 	.Ø�1‰HˆCÜ�(˜5  "˜:˜, b¨¨Ð,×-Ò-ûð	.úsV   ÂAWÃ+WÄWÅWÅXÅ(XÇ;XÍ&GX×	W?×!W:×:W?Ø	X9ØX4Ø4X9u   [\s\-â€”â€“_()ï¼ˆï¼‰]+z^1[3-9]\d{9}$c                 ób   — | syt         j                  dt        | «      «      j                  «       S )Nr   )Ú
PHONE_NORMr×   r<   r   )r   s    r   Ú
norm_phonerJ  	  s&   € ÙØÜ�>‰>˜"œc !›fÓ%×+Ñ+Ó-Ð-r$   c                 ó  — | syg }t        | «      j                  d«      D ]V  }t        |«      }|sŒt        j	                  |«      rŒ't        |«      r|t        |«      k(  rŒA||vsŒF|j                  |«       ŒX dj                  |«      S )uÈ   åº§æœºæ¸…æ´—(2026-09-10): æº�æ•°æ�® 99% çš„ 'landline' æ˜¯æ‰‹æœºå�·é‡�å¤�å­˜ â†’
    æ‰‹æœºæ ¼å¼�(1[3-9]+9ä½�) æˆ– ä¸Žæ‰‹æœºå�Œå�· çš„å€¼ä¸€å¾‹å‰”é™¤; å¤šå€¼é€�é¡¹è¿‡æ»¤; çœŸåº§æœº(åŒºå�·å¼€å¤´)ä¿�ç•™r   rH   r²  )r<   r   rJ  Ú	MOBILE_RErÔ   rz   rŒ   )r   Ú	phone_valÚkeeprú  rÙ   s        r   Úclean_landlinerO    s„   € ñ ØØ€DÜ�A“—‘˜SÓ!ò 	ˆÜ�tÓˆÙØÜ�?‰?˜1ÔØÜ�iÔ  Q¬*°YÓ*?Ò%?ØØ�DŠ=Ø�K‰K˜�Nð	ð �:‰:�dÓÐr$   c                 ó6  — | xs dj                  d«      D �cg c]#  }|j                  «       sŒ|j                  «       ‘Œ% }}|xs dj                  d«      D ]+  }|j                  «       }|sŒ||vsŒ|j                  |«       Œ- dj                  |«      S c c}w )uî   å­—æ®µå¹¶é›†: ä¸¤ä¾§éƒ½æŒ‰ ' / ' æ‹†æˆ�åŽŸå­�å€¼å†�åŽ»é‡�å�ˆå¹¶ã€‚
    ï¼ˆ2026-09-10 ä¿®æ­£ï¼šåŽŸå®žçŽ°å�ªæŠŠ a æ‹†åˆ†ã€�b æ•´ä½“æ¯”è¾ƒï¼Œå½“ b æœ¬èº«æ˜¯å¤šå€¼æ—¶
      ä¼šäº§ç”Ÿé‡�å¤�é¡¹ï¼Œå¦‚ '07958726678 / 07958726678 / 07957179566'ï¼‰r   r²  )r   r   rz   rŒ   )r0   Úbr  rà   rú  rÙ   s         r   Ú	merge_valrR  "  s„   € ð !"¢ RŸ™¨uÓ5ÖC˜!¸¿¹½ˆA�G‰G�IÐC€DÐCØ’�b—‘ Ó&ò ˆØ�J‰J‹LˆÚ�˜$’Ø�K‰K˜�Nðð �:‰:�dÓÐùò Ds
   ˜B®Bc                   ó   — e Zd Zd„ Zd„ Zy)ÚContactMergerc                 ó   — i | _         y rÅ   )Úby_key)Úselfs    r   Ú__init__zContactMerger.__init__/  s	   € Øˆ�r$   c                 óÌ  — |xs dj                  «       }|xs dj                  «       }|r|sy||f}| j                  j                  |«      }|€||ddddddddg dœ}|| j                  |<   dD ])  }|j                  |«      sŒt        ||   ||   «      ||<   Œ+ |j                  d«      rt        |d   t	        |d   «      «      |d<   |j                  d«      r6t        |d   |j                  d«      xs d«      }|rt        |d   |«      |d<   |j                  d«      r't        |d   |d   xs dj                  «       «      |d<   |r||d   vr|d   j                  |«       y	)
Nr   F)r   r  r  r  r  r  r³  r¯  r  r  Úprojects)r  r  r  r  r  r  r³  r¯  rZ  T)r   rV  rÖ   rR  rJ  rO  rz   )	rW  r   r  Úprojectr-  rÝ   rC  r9   Ú_lns	            r   ÚaddzContactMerger.add2  ss  € Ø’=˜b×'Ñ'Ó)ˆØ’
˜×!Ñ!Ó#ˆÙ™dØØ˜ˆoˆØ�k‰k�o‰o˜cÓ"ˆØˆ;Ø%°tØ!#°¸RÈ"Ø!¨B¸2È"Ø!ñ#ˆCð  #ˆD�K‰K˜ÑØIò 	6ˆAØ�z‰z˜!�}Ü" 3 q¡6¨6°!©9Ó5��A’ð	6ð �:‰:�gÔÜ$ S¨¡\´:¸fÀW¹oÓ3NÓOˆC�‰LØ�:‰:�jÔ!Ü  ¨
Ñ!3°V·Z±ZÀÓ5HÒ5NÈBÓOˆCÙÜ"+¨C°
©O¸SÓ"A��J‘Ø�:‰:�gÔÜ$ S¨¡\°F¸7±OÒ4IÀr×3PÑ3PÓ3RÓSˆC�‰LÙ�w c¨*¡oÑ5Ø�
‰O×"Ñ" 7Ô+Ør$   N)rB   rC   rD   rX  r]  r#   r$   r   rT  rT  .  s   „ òór$   rT  c                 óÔ  — t        j                  t        «      }t         j                  |_        |j                  d«      j                  «       }|j                  d«      D �ci c]  }|d   |d   |d   f“Œ }}|j                  «        d}|D ]T  }|j                  |d   d«      \  }}| j                  |d	   |d
   d||fdd|d   |d   |d   |d   |d   d¬«      sŒP|dz  }ŒV |S c c}w )uG   CCPC æº�: cceup_contacts + cceup_projects(idâ†’project_id/project_name)zï
        SELECT ct.project_id AS fk, ct.company, ct.contact_name, ct.phone,
               ct.landline, ct.email, ct.role, ct.address
        FROM cceup_contacts ct
        ORDER BY ct.project_id, ct.company, ct.contact_name, ct.phone
    z7SELECT id, project_id, project_name FROM cceup_projectsÚidr–   rÐ   r   Úfk)r   r   r   r  Úccpcr   r  r  r³  r¯  r  ©r  r  r  r  r³  r¯  r  r  r   )
rH  rI  r  ÚRowÚrow_factoryr?  Úfetchallr4  rÖ   r]  )r~   Úconrî  rA  Úpmaprá   r,  r  s           r   Ú	load_ccpcrh  P  s  € ä
�/‰/œ'Ó
"€CÜ—k‘k€C„OØ�;‰;ð ó 	÷
 
‰‹ð 	ð DGÇ;Á;ØAóDCö D¸aˆAˆd‰G�a˜‘o q¨Ñ'8Ð9Ñ9ð D€Dð Dà‡I�I„KØ	€AØò ˆØ—X‘X˜a ™g xÓ0‰
ˆˆUØ�5‰5��9‘˜q Ñ0°6¸3ÀÐ2FØ¨°!°F±)À1ÀWÁ:Ø˜J™-¨q°©zÀ1ÀYÁ<ÐY[ð õ ]ð �‰F‰Aðð €HùòDs   Á!C%c                 óÐ  — t        j                  t        «      }t         j                  |_        |j                  d«      j                  «       }|j                  d«      D �ci c]  }|d   |d   “Œ }}|j                  «        d}|D ]W  }|j                  |d   d«      }| j                  |d   |d	   d
|d   |f|d   |d   |d   |d   dd|d   |d   ¬«      sŒS|dz  }ŒY |S c c}w )Nzý
        SELECT ct.project_id AS fk, ct.company, ct.contact_name, ct.department,
               ct.position, ct.phone, ct.role, ct.address, ct.remarks
        FROM zc_contacts ct
        ORDER BY ct.project_id, ct.company, ct.contact_name, ct.phone
    z0SELECT project_id, project_name FROM zc_projectsr–   rÐ   r   r`  r   r   r  Úzcr  r  r  r  r  r  rb  r   )
rH  rI  rJ  rc  rd  r?  re  r4  rÖ   r]  )r~   rf  rî  rA  rg  rá   r  s          r   Úload_zcrk  g  s  € Ü
�/‰/œ%Ó
 €CÜ—k‘k€C„OØ�;‰;ð ó 	÷
 
‰‹ð 	ð 9<¿¹Ø:ó9<ö =°1ˆAˆl‰O˜Q˜~Ñ.Ñ.ð =€Dð =à‡I�I„KØ	€AØò ˆØ—‘˜˜4™ "Ó%ˆØ�5‰5��9‘˜q Ñ0°4¸¸4¹À%Ð2HØ˜l™O°a¸
±mÈ!ÈFÉ)Ø˜‘z¨B°bÀ!ÀIÁ,Ø˜9™ð õ 'ð �‰F‰Aðð €Hùò=s   Á!C#c                 óª  — | �Šg }t        | j                  «      D ]n  }| j                  |   }|j                  |d   |d   |d   |d   |d   |d   |d   |d	   |d
   |d   t        |d   D �cg c]  }t        |«      ‘Œ c}«      g«       Œp |S t        j
                  j                  t        «      sy	 t        j                  t        «      }|j                  d«      j                  «       }|j                  d«      j                  «       }i }|D ]+  \  }	}
}}|j                  |	g «      j                  |
||g«       Œ- |j                  d«      j                  «       }g }t        |«      D ]E  \  }}||   d   }	|j                  t        |«      t        |j                  |	g «      «      gz   g«       ŒG |j                  «        |S c c}w # t         $ r Y yw xY w)u]   ç»Ÿä¸€å¿«ç…§: [[10å­—æ®µ..., [[source,key,name],...]], ...] æŽ’åº�ã€‚merger=None æ—¶è¯»çŽ°åº“Nr   r  r  r  r  r  r³  r¯  r  r  rZ  z§SELECT company, contact_name, department, position, role,
            phone, landline, email, address, remarks FROM contacts
            ORDER BY company, contact_namezjSELECT contact_id, source, project_key, project_name
            FROM contact_projects ORDER BY contact_idz6SELECT id FROM contacts ORDER BY company, contact_namer   )r{   rV  rz   r3  r   r   r   Ú
CONTACT_DBrH  rI  r?  re  Ú
setdefaultrÑ   rÖ   r4  rJ   )ÚmergerÚoutrÝ   rA  rÙ   rf  rî  ÚcpsÚprojÚcidr>   ÚpkÚpnÚidsrR   rÙ  s                   r   Úsnapshotrw  ~  sÝ  € àÐØˆÜ˜&Ÿ-™-Ó(ò 	QˆCØ—‘˜cÑ"ˆAØ�J‰J˜˜)™ a¨Ñ&7¸¸<¹È!ÈJÉ-Ø˜&™	 1 W¡:¨q°©}¸aÀ¹jÈ!ÈIÉ,Ø˜)™¤f¸qÀ¹}Ö-M¸!¬d°1­gÒ-MÓ&NðPõ Qð	Qð
 ˆ
Ü�7‰7�>‰>œ*Ô%ØðÜ�o‰oœjÓ)ˆØ�{‰{ð .ó /ç/7©x«zð 	ð �k‰kð 9ó :ß:B¹(»*ð 	àˆØ!ò 	9‰NˆC��B˜Ø�O‰O˜C Ó$×+Ñ+¨Q°°B¨KÕ8ð	9à�k‰kÐRÓS×\Ñ\Ó^ˆØˆÜ “oò 	B‰FˆAˆsØ�a‘&˜‘)ˆCØ�J‰Jœ˜S›	¤V¨D¯H©H°S¸"Ó,=Ó%>Ð$?Ñ?Ð@ÕAð	Bð 	�	‰	ŒØˆ
ùò) .Nøô* ò Ùðús   Á+G"Â2DG Ç	GÇGc                 ó”   — | €y t        j                  t        j                  | d¬«      j	                  «       «      j                  «       S )NFrE  )ÚhashlibÚsha256rM  rN  rs   Ú	hexdigest)rÒ   s    r   Úcontent_hashr|  Ÿ  s6   € Ø€}ØÜ�>‰>œ$Ÿ*™* U¸Ô?×FÑFÓHÓI×SÑSÓUÐUr$   c                 óš  — t        | «      }t        |«      }t        t        d «      «      }||k(  ryt        j                  t        «      }|j                  «       }|j                  d«       |j                  d«       |j                  d«       |j                  d«       |j                  d«       |j                  d«       t        | j                  «      D ]†  }| j                  |   }|j                  d|d	   |d
   |d   |d   |d   |d   |d   |d   |d   |d   f
«       |j                  }|j                  d|d   D �	�
�cg c]  \  }	}
}||	|
|f‘Œ c}}
}	«       Œˆ |j                  «        |j                  d«      j                  «       d   }|j                  d«      j                  «       d   }|j                  «        ||fS c c}}
}	w )NFz%DROP TABLE IF EXISTS contact_projectszDROP TABLE IF EXISTS contactsaq  CREATE TABLE contacts (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        company TEXT NOT NULL,
        contact_name TEXT NOT NULL DEFAULT '',
        department TEXT DEFAULT '', position TEXT DEFAULT '', role TEXT DEFAULT '',
        phone TEXT DEFAULT '', landline TEXT DEFAULT '', email TEXT DEFAULT '',
        address TEXT DEFAULT '', remarks TEXT DEFAULT '')zPCREATE UNIQUE INDEX idx_contacts_company_name ON contacts(company, contact_name)z›CREATE TABLE contact_projects (
        contact_id INTEGER NOT NULL, source TEXT NOT NULL,
        project_key TEXT NOT NULL, project_name TEXT DEFAULT '')z;CREATE INDEX idx_cp_contact ON contact_projects(contact_id)z�INSERT INTO contacts (company, contact_name, department, position, role, phone, landline, email, address, remarks) VALUES (?,?,?,?,?,?,?,?,?,?)r   r  r  r  r  r  r³  r¯  r  r  z]INSERT INTO contact_projects (contact_id, source, project_key, project_name) VALUES (?,?,?,?)rZ  zSELECT COUNT(*) FROM contactsr   z%SELECT COUNT(*) FROM contact_projects)rw  r|  rH  rI  rm  rK  r?  r{   rV  Ú	lastrowidÚexecutemanyrO  r@  r4  )ro  Ú	new_itemsÚnew_hÚcur_hrf  r  rÝ   rA  rs  r>   rt  ru  rá   r<  s                 r   Úwrite_dbrƒ  ¥  s¾  € Ü˜Ó €IÜ˜Ó#€EÜœ $›Ó(€EØ�‚~Øô �/‰/œ*Ó
%€CØ�
‰
‹€AØ‡I�IÐ5Ô6Ø‡I�IÐ-Ô.Ø‡I�Ið =ô >ð ‡I�IÐ`ÔaØ‡I�Ið Dô Eð ‡I�IÐKÔLÜ�f—m‘mÓ$ò 
?ˆØ�M‰M˜#ÑˆØ	�	‰	ðOàˆy‰\˜1˜^Ñ,¨a°©o¸qÀ¹}ÈaÐPVÉiØˆw‰Z˜˜:™¨¨'©
°A°i±LÀ!ÀIÁ,ðPô	Qð
 �k‰kˆØ	�‰ØkØ/0°©}×=Ð=¡) ! R¨ˆc�1�b˜"ÒÔ=õ	?ð
?ð ‡J�J„LØ	�	‰	Ð1Ó2×;Ñ;Ó=¸aÑ@€AØ	
�‰Ð:Ó	;×	DÑ	DÓ	FÀqÑ	I€BØ‡I�I„KØˆrˆ7€Nùô >s   ÅGc                  ó
  — t        «       } t        | «      }t        | «      }||z   }t        | «      }|du ry|\  }}t	        | j
                  D �ch c]  }|d   ’Œ	 c}«      }t        d|› d|› d|› d|› d|› d|› d	�«       yc c}w )
NFr   u   è�”ç³»äººåº“: æº�è¡Œ z (ccpc z / zc u   ) â†’ åŽ»é‡�å�Ž u    äºº / u
    å…¬å�¸ / u    é¡¹ç›®å…³è�”)rT  rh  rk  rƒ  rÓ   rV  r5   )	r~   Ún_ccpcÚn_zcÚsrc_rowsÚresultÚ
n_contactsÚn_projr   Ú	n_companys	            r   Úcontact_runrŒ  Ï  sŸ   € Ü‹€AÜ�q‹\€FÜ�1‹:€DØ˜‰}€HÜ�a‹[€FØ��ØØÑ€J�Ü 1§8¡8Ö,˜a�Q�q“TÒ,Ó-€IÜ	Ð! ( ¨7°6°(¸&ÀÀÐFVÐWaÐVbÐbiØˆK�z & ¨ð8ô 9àùò -s   ÁB )rj  ra  Úcontactc                  ó²  — t         j                  dd  } d| v rT| j                  d«      }|dz   t        | «      k\  r t         j                  j                  d«       yt        | |dz      «       yd }d| v r|| j                  d«      }|dz   t        | «      k  r| |dz      j                  «       nd}|t        vr:t         j                  j                  dd	j                  t        «      › d
|›d�«       y|r|gnt        t        «      }d| v rdnd| v rdnd}t        «        t        dt        j                  d«      › ddj                  |«      › d|› d�d¬«       d}|D ]ï  }t        d|j                  «       › dt        j                  d«      › d�d¬«       t        j                  «       }	 |dk(  rt!        «       }n|dk(  rt#        |«      }n
t%        «       }|r>d}t        d|j                  «       › d"|› dt        j                  «       |z
  d ›d!�d¬«       Œ¸t        d#|j                  «       › d$t        j                  «       |z
  d ›d%�d¬«       Œñ t        d&t        j                  d«      › d'|› �d¬«       |S # t&        $ r\}	dd l}
|
j+                  «        t        d|j                  «       › d|	› dt        j                  «       |z
  d ›d!�d¬«       d}Y d }	~	�Œzd }	~	ww xY w)(Nr   z--zc-previewu0   ç”¨æ³•: ccpc_zc_sync.py --zc-preview <file.pdf>
r'   r   z--onlyr   u   --only å�ªæŽ¥å�— ú|u
   ï¼Œæ”¶åˆ° r2   r,  r*  Údailyr1   r/   u%   ] ccpc+zc å…¥åº“ç¼–æŽ’å¼€å§‹ (phases=ú+z, mode=rG  T)Úflushz
===== z [z%H:%M:%Sz] =====rj  ra  r^  z	 FAILED: z (z.0fzs)u    é�žé›¶è¿”å›ž rc=z--- z OK (zs) ---z
[u   ] ç¼–æŽ’ç»“æ�Ÿ rc=)r(   ÚargvÚindexrÓ   r)   r*   ro  rX  ÚPHASESrŒ   r3  r-   r5   rK   r4   Úupperrj  rG  rŒ  rJ   Ú	tracebackÚ	print_exc)r“  rR   ÚonlyÚphasesr5  Úrc_allr  Út0ÚrcrS   r—  s              r   Úmainrž  å  s®  € Ü�8‰8�A�Bˆ<€Dð ˜ÑØ�J‰J�~Ó&ˆØˆq‰5”C˜“IÒÜ�J‰J×ÑÐPÔQØÜ�4˜˜A™‘;ÔØð €DØ�4ÑØ�J‰J�xÓ ˆØ&'¨!¡e¬c°$«iÒ&7ˆt�A˜‘E‰{× Ñ Ô"¸RˆØ”vÑÜ�J‰J×ÑÐ0°·±¼&Ó1AÐ0BÀ*ÈTÈHÐTVÐWÔXØÙˆd‰V¤¤f£€Fà ‘o‰7°fÀ±n©FÈ'€Dä„Mä	ˆAŒd�m‰mÐ/Ó0Ð1ð 2Ø—X‘X˜fÓ%Ð& g¨d¨V°1ð6Ø=AõCð €FØò TˆÜ�˜Ÿ™›˜ b¬¯©°zÓ)BÐ(CÀ7ÐKÐSWÕXÜ�Y‰Y‹[ˆð	Ø�tŠ|Ü“X‘Ø˜’Ü˜d“^‘ä “]�ñ ØˆFÜ�D˜Ÿ™›˜Ð&7¸°t¸2¼d¿i¹i»kÈ"¹nÈSÐ=QÐQSÐTÐ\`Öaä�D˜Ÿ™›˜ e¬D¯I©I«K¸©N¸3Ð+?¸vÐFÈdÖSð)Tô, 
ˆC”—‘Ð1Ó2Ð3Ð3EÀfÀXÐ
NÐVZÕ[Ø€Møô ò 	ÛØ×ÑÔ!Ü�D˜Ÿ™›˜ i°¨s°"´T·Y±Y³[À±^ÀCÐ4HÈÐKÐSWÕXØˆFÝûð	ús   Æ$+I1É1	KÉ:AKËKÚ__main__rÅ   )r+  r+  r   r  )r�  )frE   r   r(   rt   rM  rK   rq   rH  ry  r  Úurllib.parserb   Úurllib.requestÚurllib.errorr   Úcollectionsr   Ú	xml.etreer   rœ  r•  Úrequests.authr   r1  Úopenpyxlr   Údocxr   ÚWORKDIRr   rŒ   r+   rp   r�   rJ  r“   r–  r/  r.  r0  r  rm  r   Ú_ENVÚenvironrÖ   r   r    r"   r%   r-   r:   r?   rJ   rA   rT   r�   r”   rì   rù   r&  r/  r=  rB  rS  rj  ro  r�  rò  r‹  r‘  r¥  r«  Úcompiler¶  r·  r´  rÆ  r×  rð  rþ  r  r  r   r"  rG  rI  rL  rJ  rO  rR  rT  rh  rk  rw  r|  rƒ  rŒ  r•  rž  rB   r,   r#   r$   r   ú<module>r¬     sŠ  ðñ"÷H m× l× l× l× l× lÝ Ý #Ý 'ã Ý 'Û Ý "Ý ð !€Ø�W‰W�\‰\˜' 6Ó*€ð @€Ø$€
Ø€Ø'€ð 1Ð ÚYÐ Ø(Ð ð *€Ø$€ð  €
ð ó ñ ƒz€Ø�j‰j�n‰n˜]Ó+ÒJ¨t¯x©x¸ÀrÓ/J€Ø�j‰j�n‰n˜]Ó+ÒJ¨t¯x©x¸ÀrÓ/J€à€
òòó	ò1ô
i�Yô ióò,ò*ò8Uòp*ò^\òBòFò,
ò"òJBòJ<ñ@ ò ,ó ,€	ò\Ð òòòò*ð. ˆ2�:‰:�nÓ%€Øˆ2�:‰:ÐGÓH€Øˆ2�:‰:ÐCÓD€óCðN 0>Ø,7Ø/=Ø&7ñ	Ð ò€òK ò`+ò`ò0ò&Kó
e!ðX ˆR�Z‰ZÐ1Ó2€
ØˆB�J‰JÐ'Ó(€	ò.óò&	÷ñ òDò.ó.òBVò'òTð& 
#€ò5ðp ˆzÒØ€C‡H�H‰T‹VÕð r$   