Ë
    ¢j&  ã                   ó  — 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ZdZdZ	 ej                  d«      Z ej                  d«      Zd„ Zdd	„Zd
„ Z G d„ d«      Zd„ Zd„ Zdd„Zd„ Zd„ Zd„ Zedk(  r ej0                   e«       «       yy)up  
contact_lib.py â€” å…¨æº�è�”ç³»äººè�šå�ˆå…¥åº“æ¨¡å�— (2026-09-10 è®¾è®¡å®šç¨¿)
============================================================
ç»Ÿä¸€è�”ç³»äººåº“ contact.db: ä»Ž CCPC(ccpc.db) + ZC(ZC.db) ä¸¤æº�è�šå�ˆè�”ç³»äºº,
æŒ‰ company+contact_name åŽ»é‡�å�ˆå¹¶(è¦�ç´ å¹¶é›†, é¡¹ç›®ç´¯åŠ ), å…¨è¦�ç´ ä¿�ç•™ã€‚

è®¾è®¡(ç”¨æˆ· 2026-09-10 æ‹�æ�¿):
  - ä¿�ç•™è�”ç³»äººå½’å±žå…¬å�¸; å�¯æŸ¥"æŸ�å…¬å�¸æ‰€æœ‰è�”ç³»äºº"
  - å…¨è¦�ç´ : è�Œè´£(role/position/department) + åº§æœº(landline) + æ‰‹æœº(phone) + é‚®ç®±(email)
  - å�Œå…¬å�¸å†…åŽ»é‡�, ä¸�å�Œå…¬å�¸ä¸�åŽ»é‡�; è·¨æº�å�Œå…¬å�¸å�Œäººå�ˆå¹¶(è¦�ç´ å¹¶é›†)
  - ç”± ccpc_zc_sync.py Phase3 è°ƒç”¨(ç¼–æŽ’å™¨), ä¹Ÿå�¯ CLI å�•è·‘

Schema:
  contacts(id, company, contact_name, department, position, role,
           phone, landline, email, address, remarks)
  contact_projects(contact_id, source, project_key, project_name)

è¡Œä¸º:
  - å…¨é‡�é‡�å»º(æº�åº“æ�ƒå¨�), å¹‚ç­‰
  - ç»“æžœä¸ŽçŽ°åº“å®Œå…¨ä¸€è‡´æ—¶é�™é»˜(exit 0 æ— è¾“å‡º) â€”â€” é…�å�ˆç¼–æŽ’å™¨"æ— å�˜åŒ–é�™é»˜"è¯­ä¹‰
ç”¨æ³•:
  python3 contact_lib.py            # é‡�å»ºå¹¶å†™åº“
  python3 contact_lib.py force      # å�Œ(é»˜è®¤å�³å…¨é‡�)
é    Nz/root/contact.dbz/root/ccpc.dbz/root/ZC.dbu   [\s\-â€”â€“_()ï¼ˆï¼‰]+z^1[3-9]\d{9}$c                 ób   — | syt         j                  dt        | «      «      j                  «       S )NÚ )Ú
PHONE_NORMÚsubÚstrÚstrip)Úvs    ú /root/gov_crawler/contact_lib.pyÚ
norm_phoner   %   s&   € ÙØÜ�>‰>˜"œc !›fÓ%×+Ñ+Ó-Ð-ó    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   ú/ú / )r   Úsplitr   Ú	MOBILE_REÚmatchÚappendÚjoin)r	   Ú	phone_valÚkeepÚpartÚps        r
   Úclean_landliner   +   s„   € ñ ØØ€DÜ�A“—‘˜SÓ!ò 	ˆÜ�tÓˆÙØÜ�?‰?˜1ÔØÜ�iÔ  Q¬*°YÓ*?Ò%?ØØ�DŠ=Ø�K‰K˜�Nð	ð �:‰:�dÓÐr   c                 ó  — | xs dj                  d«      D �cg c]#  }|j                  «       sŒ|j                  «       ‘Œ% }}|r1|j                  «       |vr|j                  |j                  «       «       dj                  |«      S c c}w )u5   å­—æ®µå¹¶é›†: é�žç©ºå€¼åŽ»é‡�, å¤šå€¼ç”¨ ' / ' è¿žæŽ¥r   r   )r   r   r   r   )ÚaÚbÚxÚvalss       r
   Ú	merge_valr   >   sg   € à !¢ RŸ™¨uÓ5ÖC˜!¸¿¹½ˆA�G‰G�IÐC€DÐCÙˆQ�W‰W‹Y˜dÑ"Ø�‰�A—G‘G“IÔØ�:‰:�dÓÐùò Ds
   ˜B®Bc                   ó   — e Zd Zd„ Zd„ Zy)ÚContactMergerc                 ó   — i | _         y ©N)Úby_key)Úselfs    r
   Ú__init__zContactMerger.__init__G   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)ÚcompanyÚcontact_nameÚ
departmentÚpositionÚroleÚphoneÚlandlineÚemailÚaddressÚremarksÚprojects)r*   r+   r,   r0   r1   r-   r.   r/   r2   T)r   r$   Úgetr   r   r   r   )	r%   r(   ÚnameÚprojectÚfieldsÚkeyÚrecÚfÚ_lns	            r
   ÚaddzContactMerger.addJ   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)Ú__name__Ú
__module__Ú__qualname__r&   r;   © r   r
   r!   r!   F   s   „ òór   r!   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
    z7SELECT id, project_id, project_name FROM cceup_projectsÚidÚ
project_idÚproject_namer   Úfk)r   r   r(   r)   Úccpcr   r,   r-   r.   r/   r0   ©r*   r+   r,   r-   r.   r/   r0   r1   é   )
Úsqlite3ÚconnectÚCCPC_DBÚRowÚrow_factoryÚexecuteÚfetchallÚcloser3   r;   )ÚmÚconÚrowsÚrÚpmapÚnÚpidÚpnames           r
   Ú	load_ccpcrX   h   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
    z0SELECT project_id, project_name FROM zc_projectsrB   rC   r   rD   r   r(   r)   Úzcr*   r+   r,   r-   r0   r1   rF   rG   )
rH   rI   ÚZC_DBrK   rL   rM   rN   rO   r3   r;   )rP   rQ   rR   rS   rT   rU   rW   s          r
   Úload_zcr\   ~   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/   r0   r1   r2   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   )Úsortedr$   r   ÚlistÚosÚpathÚexistsÚ
CONTACT_DBrH   rI   rM   rN   Ú
setdefaultÚ	enumerater3   rO   Ú	Exception)ÚmergerÚoutr7   rS   r   rQ   rR   ÚcpsÚprojÚcidÚsÚpkÚpnÚidsÚiÚrows                   r
   Úsnapshotrr   ”   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 )NF)Úensure_ascii)ÚhashlibÚsha256ÚjsonÚdumpsÚencodeÚ	hexdigest)Úitemss    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/   r0   r1   z]INSERT INTO contact_projects (contact_id, source, project_key, project_name) VALUES (?,?,?,?)r2   zSELECT COUNT(*) FROM contactsr   z%SELECT COUNT(*) FROM contact_projects)rr   r|   rH   rI   rc   ÚcursorrM   r^   r$   Ú	lastrowidÚexecutemanyÚcommitÚfetchonerO   )rg   Ú	new_itemsÚnew_hÚcur_hrQ   Úcr7   rS   rk   rl   rm   rn   rU   Úncs                 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    é¡¹ç›®å…³è�”)r!   rX   r\   rˆ   Úlenr$   Úprint)	rP   Ún_ccpcÚn_zcÚsrc_rowsÚresultÚ
n_contactsÚn_projÚkÚ	n_companys	            r
   Úmainr”   å   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 Ú__main__)r   r#   )Ú__doc__r`   ÚreÚsysrH   ru   rw   rc   rJ   r[   Úcompiler   r   r   r   r   r!   rX   r\   rr   r|   rˆ   r”   r<   Úexitr?   r   r
   ú<module>r›      s    ðñ÷0 +× *× *à€
Ø
€Ø€àˆR�Z‰ZÐ1Ó2€
ØˆB�J‰JÐ'Ó(€	ò.óò&÷ñ òDò,ó,òBVò'òTð ˆzÒØ€C‡H�H‰T‹VÕð r   