§
    s�’j3)  ã                  óh   — d dl mZ d dlZd dlZd dlmZ  ej        e¦  «        Z G d„ d¦  «        Z	dS )é    )ÚannotationsN)ÚAnyc                  ó4   — e Zd Zddd„Zdd
„Zdd„Z	 ddd„ZdS )ÚErpProjectMixinNÚstatusú
str | NoneÚreturnúlist[dict[str, Any]]c                óz  — d}g }|r |dk    r|dz  }|                      |¦  «         |dz  }|                      ¦   «         5 }|                     ¦   «         5 }|                     ||¦  «         |                     ¦   «         cddd¦  «         cddd¦  «         S # 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )uR   Láº¥y danh sÃ¡ch táº¥t cáº£ cÃ¡c dá»± Ã¡n thi cÃ´ng kÃ¨m bá»™ lá»�c tráº¡ng thÃ¡i.a  
            SELECT p.*, c.legal_name as company_name, emp.full_name as pm_name
            FROM projects p
            JOIN companies c ON p.company_id = c.id
            LEFT JOIN employees emp ON p.project_manager_id = emp.id
            WHERE 1=1
        Úallz AND p.status = %sz ORDER BY p.created_at DESC;N)ÚappendÚget_connectionÚcursorÚexecuteÚfetchall)Úselfr   ÚsqlÚparamsÚconnÚcurs         ú>C:\Projects\DSCons\app\core\postgres\clients\project_client.pyÚlist_projectszErpProjectMixin.list_projects   sa  € ðˆð ˆØð 	"�f ’o�oØÐ'Ñ'ˆCØ�MŠM˜&Ñ!Ô!Ð!ØÐ-Ñ-ˆà× Ò Ñ"Ô"ð 	" d¨D¯KªK©M¬Mð 	"¸SØ�KŠK˜˜VÑ$Ô$Ð$Ø—<’<‘>”>ð	"ð 	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"ð 	"ð 	"s6   Á B0Á*BÁ?B0ÂB	ÂB0ÂB	Â B0Â0B4Â7B4Úproject_id_or_codeÚstrúdict[str, Any] | Nonec                ó,  — d}|                       ¦   «         5 }|                     ¦   «         5 }|                     |||f¦  «         |                     ¦   «         cddd¦  «         cddd¦  «         S # 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )uM   Láº¥y thÃ´ng tin chi tiáº¿t cá»§a má»™t dá»± Ã¡n theo ID hoáº·c MÃ£ dá»± Ã¡n.a'  
            SELECT p.*, c.legal_name as company_name, emp.full_name as pm_name
            FROM projects p
            JOIN companies c ON p.company_id = c.id
            LEFT JOIN employees emp ON p.project_manager_id = emp.id
            WHERE p.id::text = %s OR p.project_code = %s;
        N)r   r   r   Úfetchone)r   r   r   r   r   s        r   Úget_projectzErpProjectMixin.get_project   s+  € ðˆð × Ò Ñ"Ô"ð 	" d¨D¯KªK©M¬Mð 	"¸SØ�KŠK˜Ð0Ð2DÐEÑFÔFÐFØ—<’<‘>”>ð	"ð 	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"ð 	"ð 	"s4   —B	¬,A1ÁB	Á1A5	Á5B	Á8A5	Á9B	Â	BÂBÚpayloadúdict[str, Any]c                ó"  — ddl }|                     d¦  «        p t          |                     ¦   «         ¦  «        }|                     d¦  «        pd}|                     d¦  «        }|sUdt                               ¦   «         j        › d|                     ¦   «         j        dd	…                              ¦   «         › �}d
}i d|“d|“d|“d|                     d¦  «        pd“d|                     d¦  «        pd“d|                     d¦  «        pd“d|                     d¦  «        pd“d|                     d¦  «        pd“d|                     d¦  «        pd“d|                     d¦  «        pd“d|                     d¦  «        p|                     d¦  «        pd“d|                     d¦  «        p|                     d¦  «        pd“d|                     d¦  «        “d|                     d¦  «        “d|                     d¦  «        pd“d|                     d¦  «        pd “d!|                     d!¦  «        pd“d"t          j
        |                     d"¦  «        pg ¦  «        i¥}|                      ¦   «         5 }|                     ¦   «         5 }	|	                     ||¦  «         |                     ¦   «          |	                     ¦   «         cddd¦  «         cddd¦  «         S # 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )#uN   Táº¡o má»›i hoáº·c cáº­p nháº­t dá»± Ã¡n thi cÃ´ng trong cÆ¡ sá»Ÿ dá»¯ liá»‡u.r   NÚidÚ
company_idú$0753d827-90e1-4894-9c16-266ca572c5ebÚproject_codeúDA-ú-é   aÆ  
            INSERT INTO projects (
                id, company_id, project_code, project_name, client_name,
                location, description, project_type, status, priority,
                budget_amount, contract_value, start_date, expected_end_date,
                contract_duration_days, contract_type, notes,
                contract_schedule_json, created_at, updated_at
            ) VALUES (
                %(id)s, %(company_id)s, %(project_code)s, %(project_name)s, %(client_name)s,
                %(location)s, %(description)s, %(project_type)s, %(status)s, %(priority)s,
                %(budget_amount)s, %(contract_value)s, %(start_date)s, %(expected_end_date)s,
                %(contract_duration_days)s, %(contract_type)s, %(notes)s,
                %(contract_schedule_json)s, NOW(), NOW()
            )
            ON CONFLICT (project_code) DO UPDATE SET
                project_name = EXCLUDED.project_name,
                client_name = EXCLUDED.client_name,
                location = EXCLUDED.location,
                description = EXCLUDED.description,
                project_type = EXCLUDED.project_type,
                status = EXCLUDED.status,
                budget_amount = EXCLUDED.budget_amount,
                contract_value = EXCLUDED.contract_value,
                contract_duration_days = EXCLUDED.contract_duration_days,
                notes = EXCLUDED.notes,
                updated_at = NOW()
            RETURNING *;
        Úproject_nameu   Dá»± Ã¡n má»›iÚclient_nameu   Chá»§ Ä‘áº§u tÆ°Úlocationõ   TP Háº£i PhÃ²ngÚdescriptionÚ Úproject_typeõ   Thá»§y lá»£ir   ÚbiddingÚpriorityÚhighÚbudget_amountÚcontract_valueÚ
start_dateÚexpected_end_dateÚcontract_duration_daysé´   Úcontract_typeõ   Trá»�n gÃ³iÚnotesÚcontract_schedule_json)ÚuuidÚgetr   Úuuid4ÚdatetimeÚnowÚyearÚhexÚupperÚjsonÚdumpsr   r   r   Úcommitr   )
r   r   r>   Ú
project_idr#   r%   r   Úinsert_datar   r   s
             r   Úcreate_projectzErpProjectMixin.create_project+   së  € àˆˆˆà—[’[ Ñ&Ô&Ð;­#¨d¯jªj©l¬lÑ*;Ô*;ˆ
Ø—[’[ Ñ.Ô.ÐXÐ2Xˆ
Ø—{’{ >Ñ2Ô2ˆØð 	VØU¥§¢¡¤Ô!4ÐUÐU°t·z²z±|´|Ô7GÈÈÈÔ7K×7QÒ7QÑ7SÔ7SÐUÐUˆLðˆð8
Ø�*ð
à˜*ð
ð ˜Lð
ð ˜GŸKšK¨Ñ7Ô7ÐKÐ;Kð	
ð
 ˜7Ÿ;š; }Ñ5Ô5ÐKÐ9Kð
ð ˜Ÿš JÑ/Ô/ÐDÐ3Dð
ð ˜7Ÿ;š; }Ñ5Ô5Ð;¸ð
ð ˜GŸKšK¨Ñ7Ô7ÐI¸>ð
ð �g—k’k (Ñ+Ô+Ð8¨yð
ð ˜Ÿš JÑ/Ô/Ð9°6ð
ð ˜WŸ[š[¨Ñ9Ô9ð Ø�{Š{Ð+Ñ,Ô,ðàð
ð ˜gŸkškÐ*:Ñ;Ô;ð Ø�{Š{˜?Ñ+Ô+ðàð!
ð" ˜'Ÿ+š+ lÑ3Ô3ð#
ð$   §¢Ð-@Ñ!AÔ!Að%
ð& % g§k¢kÐ2JÑ&KÔ&KÐ&RÈsð'
ð( ˜WŸ[š[¨Ñ9Ô9ÐJ¸]ð)
ð* �W—[’[ Ñ)Ô)Ð/¨Rð+
ð, %¥d¤jØ—’Ð4Ñ5Ô5Ð;¸ñ'ô 'ð-
ð 
ˆð4 × Ò Ñ"Ô"ð 	" d¨D¯KªK©M¬Mð 	"¸SØ�KŠK˜˜[Ñ)Ô)Ð)Ø�KŠK‰MŒMˆMØ—<’<‘>”>ð	"ð 	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"ð 	"ð 	"s6   Ê LÊ>K,ËLË,K0	Ë0LË3K0	Ë4LÌLÌLÚdoc_idÚcustom_payloadc                óf	  ‡‡— |                       |¦  «        }|st          d|› �¦  «        ‚|pi }|                     d¦  «        pd}|                     d¦  «        pd}|                     d¦  «        pd}|                     d¦  «        p|                     d¦  «        pd}d	d
lŠd	d
lŠdCˆˆfd„}	|                     d¦  «        }
|
sm‰                     d|¦  «        }|r+d|                     d¦  «                             ¦   «         › �}
n*|                     dd¦  «                             dd¦  «        }
|                     d¦  «        }|sS|r&| 	                    d¦  «        s |	|¦  «        }d|› �}n+ |	|
¦  «        d
d…          
                    d¦  «        }d|› �}|                      |¦  «        }|sƒ|                      ¦   «         5 }|                     ¦   «         5 }|                     d|
f¦  «         |                     ¦   «         }d
d
d
¦  «         n# 1 swxY w Y   d
d
d
¦  «         n# 1 swxY w Y   |rt!          |d         ¦  «        }d}|}�n{|                     d¦  «        pd||
|                     d ¦  «        p||                     d!¦  «        pd"|                     d#¦  «        pd$|› d%|› �|                     d&¦  «        p/d'|
                     ¦   «         v sd(|
                     ¦   «         v rd)nd*|                     d+¦  «        pd,|                     d-¦  «        pd.|                     d/¦  «        pd0|                     d1¦  «        pd0|                     d2¦  «        pd3|                     d4¦  «        pd5|                     d6¦  «        pd7|› d8|d
d9…         › �d:œ}|                      |¦  «        }t!          |d         ¦  «        }d;}|                     d<¦  «        p|d         }|                      ¦   «         5 }|                     ¦   «         5 }|                     d=|||f¦  «         |                     ¦   «          d
d
d
¦  «         n# 1 swxY w Y   d
d
d
¦  «         n# 1 swxY w Y   |||d         ||rd>nd?› d%|                     d¦  «        › d@|                     d¦  «        › dA�dBœS )Dui   Tá»± Ä‘á»™ng khá»Ÿi táº¡o hoáº·c liÃªn káº¿t Dá»± Ã¡n Ä�áº¥u Tháº§u tá»« má»™t VÄƒn Báº£n (TBMT/QÄ�/HÄ�).u!   KhÃ´ng tÃ¬m tháº¥y vÄƒn báº£n id=Údocument_coder.   Údocument_titleÚsummary_contentÚissuer_nameÚpartner_nameu:   Trung tÃ¢m Dá»‹ch vá»¥ sá»± nghiá»‡p cÃ´ng xÃ£ Kiáº¿n Minhr   NÚtextr   r	   c                ó<  •— ‰                      dt          | ¦  «        ¦  «                             dd¦  «                             d¦  «        } ‰                     dd| ¦  «                             ¦   «                              ¦   «         } ‰                     dd| ¦  «        S )	NÚNFKDÚasciiÚignorezutf-8z[^\w\s-]r.   z[-\s]+r'   )Ú	normalizer   ÚencodeÚdecodeÚsubÚstriprE   )rT   ÚreÚunicodedatas    €€r   Úslugify_codezBErpProjectMixin.create_project_from_document.<locals>.slugify_code‡   s€   ø€ à×%Ò% f­c°$©i¬iÑ8Ô8ß’˜ Ñ*Ô*ß’˜‘”ð ð
 —6’6˜+ r¨4Ñ0Ô0×6Ò6Ñ8Ô8×>Ò>Ñ@Ô@ˆDØ—6’6˜) S¨$Ñ/Ô/Ð/ó    r)   u   [Dd]á»±\s*Ã¡n\s*([^,.\n()]+)u	   Dá»± Ã¡n é   u   ThÃ´ng bÃ¡o má»�i tháº§u - u   ThÃ´ng bÃ¡o má»�i tháº§u r%   zTEMP-r&   é   r'   zDA-2026-z7SELECT * FROM projects WHERE project_name = %s LIMIT 1;r"   Fr#   r$   r*   r+   r,   r-   u   Khá»Ÿi táº¡o tá»« vÄƒn báº£n z: r/   u   cá»‘ngu   kÃªnhr0   u   Háº¡ táº§ng ká»¹ thuáº­tr   r1   r2   r3   r4   iÀ•©r5   r8   i  r:   r;   r<   u
   MÃ£ TBMT: u   . TÃ³m táº¯t: i,  )r#   r%   r)   r*   r+   r-   r/   r   r2   r4   r5   r8   r:   r<   TÚroot_document_idzÛ
                    UPDATE erp_documents 
                    SET project_id = %s, project_stage = 'stage_01_initiation', updated_at = NOW() 
                    WHERE root_document_id = %s OR id = %s;
                u-   Ä�Ã£ tá»± Ä‘á»™ng khá»Ÿi táº¡o dá»± Ã¡n má»›iu)   Ä�Ã£ liÃªn káº¿t vÃ o dá»± Ã¡n hiá»‡n cÃ³z (ú))Úcreated_newÚprojectÚdocument_idrI   Úmessage)rT   r   r	   r   )Úget_documentÚ
ValueErrorr?   r^   r_   ÚsearchÚgroupr]   ÚreplaceÚ
startswithÚrstripr   r   r   r   r   r   ÚlowerrK   rH   )r   rL   rM   ÚdocÚcustomÚdoc_codeÚ	doc_titleÚsummaryÚissuerr`   r)   Úmatch_dar%   Úclean_dcÚ
slug_titleÚexisting_projr   r   rI   rf   Úfinal_projectÚnew_proj_payloadÚroot_idr^   r_   s                          @@r   Úcreate_project_from_documentz,ErpProjectMixin.create_project_from_documentp   s¬  øø€ ð ×Ò Ñ'Ô'ˆØð 	KÝÐIÀÐIÐIÑJÔJÐJàÐ% 2ˆð —7’7˜?Ñ+Ô+Ð1¨rˆØ—G’GÐ,Ñ-Ô-Ð3°ˆ	Ø—'’'Ð+Ñ,Ô,Ð2°ˆà�GŠG�MÑ"Ô"ð LØ�wŠw�~Ñ&Ô&ðLàKð 	ð 	ˆ	ˆ	ˆ	ØÐÐÐð	0ð 	0ð 	0ð 	0ð 	0ð 	0ð 	0ð —z’z .Ñ1Ô1ˆØð 	Ø—y’yÐ!@À)ÑLÔLˆHØð ØF¨8¯>ª>¸!Ñ+<Ô+<×+BÒ+BÑ+DÔ+DÐFÐF��à(×0Ò0Ð1NÐPRÑSÔS×[Ò[Ø/°ñ ô  �ð
 —z’z .Ñ1Ô1ˆØð 	7Øð 7 × 3Ò 3°GÑ <Ô <ð 7Ø'˜<¨Ñ1Ô1�Ø/ XÐ/Ð/��à)˜\¨,Ñ7Ô7¸¸¸Ô<×CÒCÀCÑHÔH�
Ø6¨*Ð6Ð6�ð ×(Ò(¨Ñ6Ô6ˆØð 	3Ø×$Ò$Ñ&Ô&ð 3¨$Ø—[’[‘]”]ð 3 cØ—K’KØQØ%˜ñô ð ð %(§L¢L¡N¤N�Mð3ð 3ð 3ñ 3ô 3ð 3ð 3ð 3ð 3ð 3ð 3øøøð 3ð 3ð 3ð 3ð3ð 3ð 3ñ 3ô 3ð 3ð 3ð 3ð 3ð 3ð 3øøøð 3ð 3ð 3ð 3ð ð 	Ý˜]¨4Ô0Ñ1Ô1ˆJØˆKØ)ˆM‰Mð "Ÿgšg lÑ3Ô3ð :Ø9Ø ,Ø ,Ø%Ÿzšz¨-Ñ8Ô8ÐB¸FØ"ŸJšJ zÑ2Ô2ÐGÐ6GØ%Ÿzšz¨-Ñ8Ô8ð  KØJ°8ÐJÐJ¸yÐJÐJØ &§
¢
¨>Ñ :Ô :ð !ð   <×#5Ò#5Ñ#7Ô#7Ð7Ð7¸7Àl×FXÒFXÑFZÔFZÐ;ZÐ;Zð #�Nà3à Ÿ*š* XÑ.Ô.Ð;°)Ø"ŸJšJ zÑ2Ô2Ð<°fØ!'§¢¨OÑ!<Ô!<Ð!HÀØ"(§*¢*Ð-=Ñ">Ô">Ð"JÀ(Ø*0¯*ª*Ð5MÑ*NÔ*NÐ*UÐRUØ!'§¢¨OÑ!<Ô!<Ð!MÀØŸš GÑ,Ô,ð HØG ÐGÐG¸ÀÀÀ¼ÐGÐGð- ð  Ðð0 !×/Ò/Ð0@ÑAÔAˆMÝ˜]¨4Ô0Ñ1Ô1ˆJØˆKð —'’'Ð,Ñ-Ô-Ð:°°T´ˆØ× Ò Ñ"Ô"ð 
	 dØ—’‘”ð 	 #Ø—’ðð
   ¨'Ð2ñô ð ð —’‘”�ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð
	ð 
	ð 
	ñ 
	ô 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	øøøð 
	ð 
	ð 
	ð 
	ð 'Ø$Ø˜tœ9Ø$ØMXð  JÐIÐIð  _Jð  Wð  Wð  N[÷  N_ò  N_ð  `nñ  Noô  Noð  Wð  Wð  s@÷  sDò  sDð  ESñ  sTô  sTð  Wð  Wð  Wð
ð 
ð 	
sl   Ç	H-Ç,HÈ
H-ÈH	ÈH-ÈH	ÈH-È-H1È4H1ÐQ'Ð.QÑQ'ÑQ	ÑQ'ÑQ	ÑQ'Ñ'Q+Ñ.Q+)N)r   r   r	   r
   )r   r   r	   r   )r   r    r	   r    )rL   r   rM   r   r	   r    )Ú__name__Ú
__module__Ú__qualname__r   r   rK   r   © ra   r   r   r   
   s�   € € € € € ð"ð "ð "ð "ð "ð&"ð "ð "ð "ðC"ð C"ð C"ð C"ðL DHðu
ð u
ð u
ð u
ð u
ð u
ð u
ra   r   )
Ú
__future__r   rF   ÚloggingÚtypingr   Ú	getLoggerr€   Úloggerr   rƒ   ra   r   ú<module>r‰      s‰   ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø Ð Ð Ð Ð Ð à	ˆÔ	˜8Ñ	$Ô	$€ð[
ð [
ð [
ð [
ð [
ñ [
ô [
ð [
ð [
ð [
ra   