Ë
    ðÜ˜jüh  ã                   óÚ  — 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mZ ddl	m
Z
 ddlZddlmZ ddlmZ ddlmZ ddlmZ d	Zd
ZdZg d¢ZdZdZ ej6                  ed¬«        eee«      Z e
g d¢«      Zg d¢Zd„ Zd„ Z d„ Z!d„ Z"d„ Z# ejH                  d«      Z% ejH                  d«      Z& ejH                  d«      Z'd(d„Z(ddddd œZ)h d!£Z*d"„ Z+d#„ Z,d$„ Z-d%„ Z.d&„ Z/e0d'k(  r e/«        yy))u  
parse_ccpc_v2.py â€” ç»Ÿä¸€è§£æž� CCPC DOCX/XLS æº�æ–‡ä»¶ï¼Œé€�å­—æ®µæ˜ å°„ + è�”ç³»äººæ��å�–
==============================================================

æ•°æ�®æ�¥æº�ï¼šå�šæžœäº‘ WebDAVï¼ˆ/dav/Downloads/ + /dav/ä¸‹è½½1/ï¼‰
ç¼“å­˜ç›®å½•ï¼š/data/ccpc_source/
ç›®æ ‡æ•°æ�®åº“ï¼šccpc.db (cceup_projects + cceup_contacts)

ç”¨æ³•ï¼š
  python3 parse_ccpc_v2.py             # å¢žé‡�ï¼ˆæŒ‰ project_name åŽ»é‡�ï¼Œå·²æœ‰åˆ™ UPDATEï¼‰
  python3 parse_ccpc_v2.py force       # å…¨é‡�é‡�è·‘
  python3 parse_ccpc_v2.py test        # æµ‹è¯• 3 ä¸ªæ–‡ä»¶
é    N)Údatetime)ÚOrderedDict)ÚHTTPBasicAuth)ÚElementTree)Úload_workbook)ÚDocumentzchniir0000@outlook.comÚah4urmcdv7s4hgpdzhttps://dav.jianguoyun.com)z/dav/Downloads/z/dav/%E4%B8%8B%E8%BD%BD1/z/dav/Downloads2/z/data/ccpc_sourcez/root/ccpc.dbT)Úexist_ok)))u   é¡¹ç›®å��ç§°Úproject_name)u   é¡¹ç›®ç±»åž‹Úproject_type)u   é¡¹ç›®IDÚ
project_id)u   é¡¹ç›®æ‰€å±žè¡Œä¸šÚindustry)u   æ‰€å±žé¢†åŸŸç±»åž‹Ú
field_type)u   æ‰€å±žçœ�ä»½Úprovince)u   æ‰€å±žåœ°çº§å¸‚Úcity)u   è¿›å±•é˜¶æ®µÚphase)u   å�‘å¸ƒæ—¶é—´Úpublish_date)u   è·Ÿè¸ªç‰ˆæœ¬å�·Úversion)u   é¡¹ç›®æ€§è´¨Únature)u   é¢„ç®—æŠ•èµ„æ€»é¢�(ä¸‡å…ƒ)Úbudget)u   æŠ•èµ„æ€§è´¨Úinvest_nature)u   èµ„é‡‘åˆ°ä½�æƒ…å†µÚfunding)u   å»ºè®¾ç­‰çº§Úgrade)u   é¢„è®¡å¼€å»ºæ—¶é—´Ú
start_time)u   é¢„è®¡æˆªæ­¢æ—¶é—´Úend_time)u   è®¾å¤‡æ�¥æº�Úequipment_source)u   å»ºç­‘é�¢ç§¯Úbuilding_area)u   å� åœ°é�¢ç§¯Ú	land_area)u   æœ‰æ— é’¢ç»“æž„Ústeel_structure)u   å»ºç­‘å±‚æ•°Úbuilding_floors)u   ä¾›æš–æ–¹å¼�Úheating_method)u   å¤–å¢™æ��æ–™Úwall_material)u   è£…ä¿®Ú
decoration)u   æœ‰æ— ç©ºè°ƒÚhas_ac)u   æœ‰æ— ç«‹ä½“å�œè½¦ä½�Úhas_parking)u   æœ‰æ— ç”µæ¢¯Úhas_elevator)u   é¡¹ç›®æ‰€åœ¨åœ°Úproject_address)u   ä¸“é¢˜æ ‡ç­¾Útags)u   å·¥è‰ºæµ�ç¨‹Úprocess_flow)u   ä¸»ä½“æ–½å·¥é˜¶æ®µÚphase_construction)u   ä¸»ä½“è®¾è®¡é˜¶æ®µÚphase_design)u   å•†æœºæ��è¿°Úopportunity)u   å…³é”®å·¥ç¨‹Ú	key_works)u   å…·ä½“éœ€æ±‚æƒ…å†µÚprocurement_needs)õ   ä¸šä¸»å�•ä½�Úowner_company)u   é¡¹ç›®æ ‡é¢˜r   )u   æ›´æ–°ç‰ˆæœ¬r   )u   æ›´æ–°æ—¶é—´r   )u   æ‰€å±žæ �ç›®r   ),r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Úequipment_listÚprogressr,   r-   ÚoverviewÚdetailr0   ÚcontactsÚraw_jsonr    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   Úprocurement_equipmentr.   c                 óh   — t        dt        j                  «       j                  d«      › d| › �«       y )Nú[z%Y-%m-%d %H:%M:%Sz] )Úprintr   ÚnowÚstrftime)Úmsgs    ú4/root/gov_crawler/parse_ccpc_v2.py.absorbed_20260910Úlogr?   n   s*   € Ü	ˆAŒh�l‰l‹n×%Ñ%Ð&9Ó:Ð;¸2¸c¸UÐ
CÕDó    c                 ó´   — | s| S t        j                  dd| «      }t        j                  dd|«      }t        j                  dd|«      }|j                  «       S )uX   æ¸…ç�†å…¬å�¸å��ä¸­çš„æ‰€æœ‰æ�ƒæ ‡è®° (ç§�è�¥)/(å›½æœ‰)/(é›†ä½“) å�Šå°¾éƒ¨é™„å±žå¤‡æ³¨ã€‚ud   \s*[ï¼ˆ(](?:ç§�è�¥|å›½æœ‰(?:/é›†ä½“æ‰€æœ‰)?|é›†ä½“(?:æ‰€æœ‰)?)[)ï¼‰]\s*(?:[ï¼ˆ(][^)ï¼‰]*[)ï¼‰])?\s*$Ú u   \s*[ï¼ˆ(][^)ï¼‰]*$u   \s*[(ï¼ˆ][^)ï¼‰]*[)ï¼‰]\s*$)ÚreÚsubÚstrip)ÚnameÚcleaneds     r>   Ú_clean_company_namerH   q   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ã€‚r0   N)Ú	FIELD_MAPÚgetrE   rH   )ÚrecordÚcn_keyÚvalÚens       r>   Ú_apply_fieldrP   |   sJ   € ä	�‰�vÓ	€BÙ	�&—*‘*˜R”.Ø�i‰i‹kˆØ�Ò Ü% cÓ*ˆCØˆˆrŠ
ð	 !€rr@   c                 óæ  — t         | z   }t        j                  d|t        ddi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 )NÚPROPFINDÚDepthÚ1é   )ÚauthÚheadersÚtimeoutéÏ   ÚdzDAV:z.//d:responsezd:hrefrB   ú/é   éÿÿÿÿ)ÚWEBDAV_BASEÚrequestsÚrequestrV   Ústatus_codeÚETÚ
fromstringÚcontentÚfindallÚfindÚtextÚrstripÚrsplitÚurllibÚparseÚunquoteÚappend)	Ú
remote_dirÚurlÚrÚrootÚnsÚfilesÚrespÚhref_elÚfns	            r>   Úwebdav_listrw   Š   sá   € Ü
˜
Ñ
"€CÜ×Ñ˜ S¬t¸gÀs¸^ÐUWÔX€AØ‡}�}˜ÒØˆ	Ü�=‰=˜Ÿ™Ó#€DØ
ˆvˆ€BØ€EØ—‘˜_¨bÓ1ò ˆØ—)‘)˜H bÓ)ˆØˆ?ØØ�l‰lÒ ˜b×(Ñ(¨Ó-×4Ñ4°S¸!Ó<¸RÑ@ˆÜ�\‰\×!Ñ! "Ó%ˆÚØ�L‰L˜Õðð €Lr@   c                 óì   — t         | z   |z   }t        j                  |t        d¬«      }|j                  dk(  r1t        |d«      5 }|j                  |j                  «       d d d «       yy# 1 sw Y   yxY w)Né<   )rV   rX   éÈ   ÚwbTF)r^   r_   rK   rV   ra   ÚopenÚwriterd   )Úremote_baseÚfilenameÚ
local_pathro   rp   Úfs         r>   Úwebdav_downloadr‚   œ   sd   € Ü
˜Ñ
# hÑ
.€CÜ�‰�Sœt¨RÔ0€AØ‡}�}˜ÒÜ�*˜dÓ#ð 	 qØ�G‰G�A—I‘IÔ÷	àØ÷	àús   ÁA*Á*A3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                  «       }
t        j                  dd|
«      j                  «       }|sŒkd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] åˆ—è¡¨ã€‚
    æ–‡æœ¬æ ¼å¼�ï¼š
      å…¬å�¸å��(è§’è‰²)
      è�”ç³»äººï¼šXXXï¼ˆå¤‡æ³¨ï¼‰
      è�”ç³»æ–¹å¼�ï¼š1XXXXXXXXXX
      é‚®ç®±ï¼šxxx@xx.com
      åœ°å�€ï¼šXXX
    è¿”å›ž [{company, contact_name, phone, landline, address, role, email}]ú
é   ud   [ï¼ˆ(](ä¸šä¸»|è®¾è®¡|æ–½å·¥|æ³•äºº|é¡¹ç›®|è‚¡ä¸œ|æ€»é›†å›¢|æŠ€æœ¯|é‡‡è´­|æ–½å·¥å›¾çº¸)[^)ï¼‰]*[)ï¼‰]u   æœ‰é™�å…¬å�¸u   å…¬å�¸u   åŽ‚u   é™¢)
u	   è�”ç³»äººu   è�”ç³»æ–¹å¼�u   æ‰‹æœºu   åœ°å�€u   ç”µè¯�u   å§“å��u   éƒ¨é—¨u   é‚®ç®±ÚEmailÚemailõ   ä»…ä¾›å�‚è€ƒõ   ç‰ˆæ�ƒæ‰€æœ‰r   u   \s*[ï¼ˆ(][^)ï¼‰]*[)ï¼‰]\s*$rB   r\   Nu:   (?:å›ºå®šç”µè¯�|åº§æœº|landline)[ï¼š:]\s*(\d[\d\- ]{5,15})u   åœ°å�€[ï¼š:]\s*(.+)z / )ÚcompanyÚcontact_nameÚphoneÚlandliner‡   ÚaddressÚrole)rE   ÚsplitÚlenrC   ÚsearchÚ
startswithrm   ÚjoinrD   ÚNAME_REre   ÚlistÚsetÚPHONE_REÚEMAIL_REÚgroup)Ú	text_blobÚ
role_labelr5   ÚlinesÚblocksÚcurÚlineÚis_company_lineÚblockÚlines_bÚ
first_linerŠ   ÚrestÚnamesÚphonesÚemailsÚlandline_numÚm_llÚaddrÚmrF   s                        r>   Úparse_contacts_from_textr­   ®   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×%Ñ%Ó'ˆ
ä—&‘&Ð7¸¸ZÓH×NÑNÓPˆÙØØ�y‰y˜  ˜Ó%ˆÜ—‘ Ó&ˆÜ”cœ(×*Ñ*¨5Ó1Ó2Ó3ˆÜ”cœ(×*Ñ*¨5Ó1Ó2Ó3ˆàˆÜ�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/   u	   è®¾è®¡é™¢u   æ–½å·¥å�•ä½�õ   å�‚è€ƒè�”ç³»äºº)õ'   ä¸šä¸»å�•ä½�è�”ç³»äººä»¥å�Šè�”ç³»æ–¹å¼�õ$   è®¾è®¡é™¢è�”ç³»äººä»¥å�Šè�”ç³»æ–¹å¼�õ'   æ–½å·¥å�•ä½�è�”ç³»äººä»¥å�Šè�”ç³»æ–¹å¼�õ   å�‚è€ƒå�•ä½�ï¼ˆä»…ä¾›å�‚è€ƒï¼‰>   õ   ç›®å½•õ   é¡¹ç›®æ¦‚å†µõ   é¡¹ç›®è¯¦æƒ…õ   é¡¹ç›®è¿›å±•õ   æ‰€éœ€æ��æ–™è®¾å¤‡õ   è®¾å¤‡é‡‡è´­æƒ…å†µõ   é¡¹ç›®åŸºç¡€ä¿¡æ�¯õ   é¡¹ç›®è·Ÿè¸ªç‰ˆæœ¬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<   nJ‰rHt        «       }
‰d   }‰D ]  }||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<   t1        j2                  |dt4        ¬«      ‰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\   u   ï¼šr„   r¹   r]   rµ   rB   r‰   r4   r´   r3   )r·   r¸   r1   r¶   r2   rˆ   )r‘   ÚrangeÚminrE   rm   rP   r”   rJ   rK   ÚCONTACT_SECTION_MAPÚextendr­   )Úhdrr�   ÚrowÚiÚkÚvÚkv_linesÚrcellsÚdedupedÚcÚtxtr�   Úall_contactsÚall_sections_rawÚcontact_sectionsÚdetail_partsrL   Ú	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   N© )Ú.0rÊ   Úcellss     €r>   ú	<genexpr>zparse_docx.<locals>.<genexpr>t  s   øè ø€ Ò$B°q Q¨%°©(¥]Ñ$Bùs   ƒr   rB   é   r4   ú

r   é   r³   z-\d+\.docx$Ú	_section_Ú_paragraphsF)Úensure_asciiÚdefaultr6   )r   ÚtablesÚ	enumerateÚrowsrÖ   rg   rE   ÚallÚSECTION_NAMESr‘   rm   rK   r”   r—   ÚaddÚ
paragraphsr“   ÚosÚpathÚbasenamerC   rD   ÚALL_PROJECT_FIELDSÚitemsÚjsonÚdumpsÚstr)ÚfilepathÚdocÚtablerÒ   ÚrirÃ   rÊ   Úall_sameÚctÚis_hdrÚ
detail_setÚexistingÚpartÚpr¦   ÚnÚfnameÚraw_dictr�   ÚsnÚsrrå   rÌ   rÍ   rÖ   rÎ   rÏ   rL   rÐ   rÑ   s                         @@@@@@@@r>   Ú
parse_docxrþ     sÿ  ÿ€ ä
�8Ó
€CØ€FØ€LØ€LØÐØÐà—‘ò gˆØˆ	Øˆ÷S	Kò S	Kôj ! §¡Ó,ò 	(‰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š&Ù”Ø�	Ø!‘ÚØ× Ñ  Õ'ð	(ñ 	�ðOgðT �:‰:�hÔØ!Ÿ;™; |Ó4ˆˆxÒÙ	ä“Uˆ
Ø˜(Ñ#ˆØ ò 	%ˆDØ˜8Ò#Ø—‘˜tÕ$ð	%ñ Ø'¨&Ñ0°6·;±;¸zÓ3JÑJˆ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ˆ:ÑØ�<ÐÐùòk 8ùò< Kùò& Ls   Á%!LÆL
Æ2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_onlyrB   r\   )r¯   r°   r±   r®   r²   Ú_r   z-\d+\.(xls|xlsx)$r4   rµ   F)rÝ   r6   )ÚshutilÚcopy2r   Ú
sheetnamesrà   Ú	iter_rowsrí   Úcloseræ   rç   ÚexistsÚremoveÚdictÚziprJ   rê   rK   r“   rè   rC   rD   rE   rë   rì   rÀ   rÁ   r­   )rî   r  Útmpr{   ÚwsrW   ÚdatarÄ   rÃ   rÆ   ÚrawrL   Úcontacts_rawÚcnrO   rN   rú   Ú
raw_detailrÌ   rg   r�   s                        r>   Ú	parse_xlsr  ¯  s   € ÛØ
#€CØ
‡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ô: �7‰7�>‰>˜#ÔÜ�I‰I�c�Nð ô9 ”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ð ùòG =ùâ9øôB �7‰7�>‰>˜#ÔÜ�I‰I�c�Nð úsP   šAJ2 Á(J(Á>J2 ÂJ2 ÂJ-Â!J2 Ã3AJ2 ÅJ2 Å$CJ2 ÉJ2 É J2 Ê(
J2 Ê27K)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   rB   r   z2SELECT id FROM cceup_projects WHERE project_id = ?z4SELECT id FROM cceup_projects WHERE project_name = ?z, c              3   ó&   K  — | ]	  }|› d �–— Œ y­w)z=?NrÔ   )rÕ   r�   s     r>   r×   z!upsert_project.<locals>.<genexpr>î  s   è ø€ Ò? q˜Q˜C˜rœ(Ñ?ùs   ‚zUPDATE cceup_projects SET z WHERE id=?r   ÚUPDATEú?zINSERT INTO cceup_projects (ú,z
) VALUES (ú)zSELECT last_insert_rowid()ÚINSERT)Úsqlite3ÚconnectÚDB_PATHrK   ÚexecuteÚfetchoneré   r”   r‘   Úcommitr  )rL   ÚdbÚpidÚpnamerö   r�   ÚvalsÚset_cÚproj_idÚactionÚphs              r>   Úupsert_projectr)  ä  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Š   rB   r‹   rŒ   r�   rŽ   r�   r‡   r\   )r  r  r  r  rK   r   r  )r   r5   r!  ÚsavedrÊ   s        r>   Ú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            	      óF	  ‡— t        t        j                  «      dkD  rt        j                  d   nd} t        d| › d�«       g }t        D ]f  Št        ‰«      }|D �cg c]  }|j                  d«      sŒ|‘Œ }}t        d‰› dt        |«      › d�«       |sŒM|j                  ˆfd	„|D «       «       Œh 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   }	|j                  «        t        d|› d|	› �«       y dx}
x}}|D �])  \  }}t         j"                  j%                  t&        |«      }t         j"                  j)                  |«      st+        |||«      s|dz  }Œ]	 |j                  d«      rt-        |«      \  }}nt/        |«      \  }}|�r–|j1                  d«      �r„|�rVg }|D �]:  }g }|j1                  d«      r|j3                  |d   «       |j1                  d«      r|j3                  d|d   › �«       |j1                  d«      r|j3                  d|d   › �«       |j1                  d«      r|j3                  d|d   › �«       |j1                  d«      r|j3                  d|d   › �«       |j1                  d«      r|j3                  d|d   › �«       |j1                  d «      r|j3                  d!|d    › �«       |j3                  d"j%                  |«      «       �Œ= d#j%                  |«      |d$<   t5        |«      \  }}t7        ||«      }|d%k(  r|
dz  }
n|dz  }n|dz  }�Œ, t        j                  t        «      }|j                  d«      j                  «       d   }|j                  d«      j                  «       d   }	|j                  «        t        d(|
› d)|› d*|› �«       t        d+|› d,|	› d-�«       y c c}w c c}w # t8        $ r$}|dz  }t        d&|d d' › d|› �«       Y d }~�Œód }~ww xY w).Nr\   Údailyz=== CCPC v2 parse [mode=z] ===)z.docxú.xlsú.xlsxz  z: z filesc              3   ó&   •K  — | ]  }‰|f–— Œ
 y ­w)NrÔ   )rÕ   r�   rZ   s     €r>   r×   zmain.<locals>.<genexpr>  s   øè ø€ Ò8¨˜q !œfÑ8ùs   ƒzTotal: Útesté   Úforcez#SELECT COUNT(*) FROM cceup_projectsr   z#SELECT COUNT(*) FROM cceup_contactszNothing to process. Projects: z, Contacts: )r/  r0  r   rŠ   r‹   u   è�”ç³»äººï¼šrŒ   u   è�”ç³»æ–¹å¼�ï¼šr�   u   å›ºå®šç”µè¯�ï¼šr‡   u	   é‚®ç®±ï¼šrŽ   u	   åœ°å�€ï¼šr�   u	   è§’è‰²ï¼šr„   rÙ   r5   r  z  ERROR é(   zDone: +z Uz errz	ccpc.db: z projects, z	 contacts)r‘   ÚsysÚargvr?   ÚDOWNLOAD_DIRSrw   ÚendswithrÁ   r–   Úkeysr  r  r  r  r  r  ræ   rç   r”   ÚLOCAL_CACHEr  r‚   r  rþ   rK   rm   r)  r,  Ú	Exception)ÚmodeÚ
all_remoters   r�   Ú	supportedÚseenÚ
to_processr!  rù   ÚncÚinsÚupdÚerrÚbase_dirrú   ÚlpÚrecr5   ÚclinesrÊ   ÚpartsÚactr&  Úc_savedÚerZ   s                            @r>   ÚmainrN    sf  ø€ ÜœcŸh™h›-¨!Ò+Œ3�8‰8�AŠ;°€DÜÐ
" 4 &¨Ð.Ô/ð €JÜò 9ˆÜ˜A“ˆØ %ÖP˜1¨¯©Ð4NÕ)O’QÐPˆ	ÐPÜˆb���2”c˜)“nÐ% VÐ,Ô-ÚØ×ÑÓ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ØàÐ€CÐˆ#�Ø%ó #.‰ˆ�%Ü�W‰W�\‰\œ+ uÓ-ˆÜ�w‰w�~‰~˜bÔ!¬/¸(ÀEÈ2Ô*NØ�1‰HˆCØð	.Ø�~‰~Ð/Ô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Ü-¨cÓ2‘��WÜ'¨°Ó:�Ø˜(’?Ø˜1‘H‘Cà˜1‘H‘Cà�q‘�ùðA#.ôJ 
�‰œÓ	!€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ùòI Qùò Cøô` ò 	.Ø�1‰HˆCÜ�(˜5  "˜:˜, b¨¨Ð,×-Ò-ûð	.ús+   ÁQ)Á3Q)ÄQ.ÈGQ3Ñ3	R Ñ<RÒR Ú__main__)rB   )1Ú__doc__r6  rë   ræ   rC   Úurllib.parserj   r  r   Úcollectionsr   r_   Úrequests.authr   Ú	xml.etreer   rb   Úopenpyxlr   Údocxr   ÚWEBDAV_USERÚWEBDAV_PASSr^   r8  r;  r  ÚmakedirsrV   rJ   ré   r?   rH   rP   rw   r‚   Úcompiler˜   r™   r•   r­   rÀ   rã   rþ   r  r)  r,  rN  Ú__name__rÔ   r@   r>   ú<module>r\     s&  ðñ÷ 0× /× /Ý Ý #ã Ý 'Ý 'õ #Ý ð '€Ø €Ø*€ÚT€Ø!€Ø€à €‡�ˆK $Õ 'Ù�[ +Ó.€ñ ò ,ó ,€	ò\Ð ò"Eò
òòò$ð ˆ2�:‰:�nÓ%€Øˆ2�:‰:ÐGÓH€Øˆ2�:‰:ÐCÓD€óLð` 0>Ø,7Ø/=Ø&7ñ	Ð ò€òX ò~.òjò0ò.L1ð^ ˆzÒÙ…Fð r@   