§
    s�’jœ   ã                  ó`   — d dl mZ d dlZd dlmZ  ej        d¦  «        Z G d„ d¦  «        ZdS )é    )ÚannotationsN)ÚAnyz dscons.postgres.project_crud.wbsc                  óB   — e Zd ZdZdd„Zdd„Zdd„Zdd„Zdd„Zdd„Z	dS )ÚWbsOperationsMixinzCWBS node hierarchy management and automatic progress recalculation.Úwbs_rowsúlist[dict[str, Any]]Úreturnc                óì   — d„ |D ¦   «         }g }|D ]b}||d                  }|                      d¦  «        }|r&||v r"||         d                              |¦  «         ŒM|                     |¦  «         Œc|S )u?   Chuyá»ƒn Ä‘á»•i danh sÃ¡ch pháº³ng WBS thÃ nh cÃ¢y phÃ¢n cáº¥p.c                ó,   — i | ]}|d          i |¥dg i¥“ŒS )ÚidÚsubtasks© )Ú.0Úrs     úCC:\Projects\DSCons\app\core\postgres\project_crud\wbs_operations.pyú
<dictcomp>z6WbsOperationsMixin._build_wbs_tree.<locals>.<dictcomp>   s.   € ÐCÐCÐC°Q�!�D”'Ð0˜aÐ0 ¨RÐ0Ð0ÐCÐCÐCó    r   Úparent_wbs_idr   )ÚgetÚappend)Úselfr   Úid_mapÚtreer   ÚnodeÚ	parent_ids          r   Ú_build_wbs_treez"WbsOperationsMixin._build_wbs_tree   s”   € àCÐC¸(ÐCÑCÔCˆØˆàð 	"ð 	"ˆAØ˜!˜Dœ'”?ˆDØŸš˜oÑ.Ô.ˆIØð "˜Y¨&Ð0Ð0Ø�yÔ! *Ô-×4Ò4°TÑ:Ô:Ð:Ð:à—’˜DÑ!Ô!Ð!Ð!àˆr   Úcurr   Ú
project_idÚitemsÚNonec           
     óÊ  — d}i }|D �]Ú}|                      d¦  «        }|                      d¦  «        p|                      |¦  «        }|                     |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¦  «        “¦  «         |                     ¦   «         }	|	r|	d         ||	d         <   �ŒÜdS )z%Helper to insert batch WBS hierarchy.aÎ  
            INSERT INTO erp_project_wbs (
                project_id, parent_wbs_id, wbs_code, task_name, task_type,
                unit, quantity, unit_price_vnd, total_amount_vnd, start_date,
                end_date, duration_days, progress_percent, status, assigned_role,
                sort_order, notes
            ) VALUES (
                %(project_id)s, %(parent_wbs_id)s, %(wbs_code)s, %(task_name)s, %(task_type)s,
                %(unit)s, %(quantity)s, %(unit_price_vnd)s, %(total_amount_vnd)s, %(start_date)s,
                %(end_date)s, %(duration_days)s, %(progress_percent)s, %(status)s, %(assigned_role)s,
                %(sort_order)s, %(notes)s
            ) RETURNING id, wbs_code;
        Úparent_wbs_coder   r   Úwbs_codez1.0Ú	task_nameu   Háº¡ng má»¥c cÃ´ng viá»‡cÚ	task_typeÚtaskÚunitÚquantityr   Úunit_price_vndÚtotal_amount_vndÚ
start_dateÚend_dateÚduration_daysé   Úprogress_percentÚstatusÚtodoÚassigned_roleÚ
sort_orderÚnotesÚ r   N)r   ÚexecuteÚfetchone)
r   r   r   r   Ú
sql_insertÚ
code_to_idÚitemÚparent_coder   Úress
             r   Ú_insert_wbs_items_batchz*WbsOperationsMixin._insert_wbs_items_batch   s;  € ðˆ
ð ˆ
Øð 	8ñ 	8ˆDØŸ(š(Ð#4Ñ5Ô5ˆKØŸš Ñ1Ô1ÐP°Z·^²^ÀKÑ5PÔ5PˆIà�KŠKØðØ  *ðà# Yðð  §¢¨°UÑ ;Ô ;ðð   §¢¨+Ð7RÑ!SÔ!Sð	ð
   §¢¨+°vÑ!>Ô!>ðð ˜DŸHšH VÑ,Ô,ðð  §¢¨°QÑ 7Ô 7ðð % d§h¢hÐ/?ÀÑ&CÔ&Cðð '¨¯ªÐ1CÀQÑ(GÔ(Gðð ! $§(¢(¨<Ñ"8Ô"8ðð  §¢¨Ñ 4Ô 4ðð $ T§X¢X¨o¸qÑ%AÔ%Aðð '¨¯ªÐ1CÀQÑ(GÔ(Gðð ˜dŸhšh x°Ñ8Ô8ðð $ T§X¢X¨oÑ%>Ô%>ðð  ! $§(¢(¨<¸Ñ";Ô";ð!ð" ˜TŸXšX g¨rÑ2Ô2ð#ñô ð ð, —,’,‘.”.ˆCØð 8Ø.1°$¬i�
˜3˜zœ?Ñ+ùð9	8ð 	8r   ÚstrÚpayloadúdict[str, Any]c                ó\  — d}|                       ¦   «         5 }|                     ¦   «         5 }|                     |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¦  «        “¦  «         |                     ¦   «         }|                      ||¦  «         |                     ¦   «          |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 )u   Táº¡o 1 cÃ´ng viá»‡c WBS má»›i.aÃ  
            INSERT INTO erp_project_wbs (
                project_id, parent_wbs_id, wbs_code, task_name, task_type,
                unit, quantity, unit_price_vnd, total_amount_vnd, start_date,
                end_date, duration_days, progress_percent, status, assigned_role,
                sort_order, notes
            ) VALUES (
                %(project_id)s, %(parent_wbs_id)s, %(wbs_code)s, %(task_name)s, %(task_type)s,
                %(unit)s, %(quantity)s, %(unit_price_vnd)s, %(total_amount_vnd)s, %(start_date)s,
                %(end_date)s, %(duration_days)s, %(progress_percent)s, %(status)s, %(assigned_role)s,
                %(sort_order)s, %(notes)s
            ) RETURNING *;
        r   r   r#   z1.1r$   u   CÃ´ng viá»‡c má»›ir%   r&   r'   r(   r   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   N)Úget_connectionÚcursorr6   r   r7   Ú_recalculate_project_progressÚcommit)r   r   r?   ÚsqlÚconnr   r:   s          r   Úcreate_wbs_itemz"WbsOperationsMixin.create_wbs_itemK   sú  € ðˆð × Ò Ñ"Ô"ð 	 d¨D¯KªK©M¬Mð 	¸SØ�KŠKØðØ  *ðà# W§[¢[°Ñ%AÔ%Aðð  §¢¨J¸Ñ >Ô >ðð   §¢¨[Ð:NÑ!OÔ!Oð	ð
   §¢¨[¸&Ñ!AÔ!Aðð ˜GŸKšK¨Ñ/Ô/ðð  §¢¨J¸Ñ :Ô :ðð % g§k¢kÐ2BÀAÑ&FÔ&Fðð '¨¯ªÐ4FÈÑ(JÔ(Jðð ! '§+¢+¨lÑ";Ô";ðð  §¢¨JÑ 7Ô 7ðð $ W§[¢[°À!Ñ%DÔ%Dðð '¨¯ªÐ4FÈÑ(JÔ(Jðð ˜gŸkšk¨(°FÑ;Ô;ðð $ W§[¢[°Ñ%AÔ%Aðð  ! '§+¢+¨l¸AÑ">Ô">ð!ð" ˜WŸ[š[¨°"Ñ5Ô5ð#ñô ð ð, —<’<‘>”>ˆDØ×.Ò.¨s°JÑ?Ô?Ð?Ø�KŠK‰MŒMˆMØð5	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s5   —H!¬GH	Ç0H!È	H	ÈH!ÈH	ÈH!È!H%È(H%Úwbs_idÚupdatesc           	     óš  — g d¢}g }d|i}|                      ¦   «         D ])\  }}||v r |                     |› d|› d�¦  «         |||<   Œ*|si S |                     d¦  «         dd                     |¦  «        › d�}|                      ¦   «         5 }	|	                     ¦   «         5 }
|
                     ||¦  «         |
                     ¦   «         }|r)|                      |
t          |d	         ¦  «        ¦  «         |	 	                    ¦   «          |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 )u@   Cáº­p nháº­t tiáº¿n Ä‘á»™ hoáº·c tráº¡ng thÃ¡i cÃ´ng viá»‡c WBS.)r$   r%   r'   r(   r)   r*   r+   r,   r-   r/   r0   r2   r3   r4   r   z = %(z)szupdated_at = NOW()z4
            UPDATE erp_project_wbs
            SET z, zF
            WHERE id::text = %(id)s
            RETURNING *;
        r   N)
r   r   ÚjoinrB   rC   r6   r7   rD   r>   rE   )r   rI   rJ   Úallowed_fieldsÚset_clausesÚparamsÚkÚvrF   rG   r   r:   s               r   Úupdate_wbs_itemz"WbsOperationsMixin.update_wbs_itemx   s  € ð
ð 
ð 
ˆð" ˆØ"&¨ ˆà—M’M‘O”Oð 	ð 	‰DˆAˆqØ�NÐ"Ð"Ø×"Ò" aÐ#3Ð#3¨aÐ#3Ð#3Ð#3Ñ4Ô4Ð4Ø��q‘	øàð 	ØˆIà×ÒÐ/Ñ0Ô0Ð0ðà—’˜;Ñ'Ô'ðð ð ˆð × Ò Ñ"Ô"ð 	 d¨D¯KªK©M¬Mð 	¸SØ�KŠK˜˜VÑ$Ô$Ð$Ø—<’<‘>”>ˆDØð QØ×2Ò2°3½¸DÀÔ<NÑ8OÔ8OÑPÔPÐPØ�KŠK‰MŒMˆMØð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s7   ÂE Â$A+D(ÄE Ä(D,	Ä,E Ä/D,	Ä0E Å EÅEÚboolc                ó  — d}d}|                       ¦   «         5 }|                     ¦   «         5 }|                     ||f¦  «         |                     ¦   «         }|s	 ddd¦  «         ddd¦  «         dS t	          |d         ¦  «        }|                     ||f¦  «         |                      ||¦  «         |                     ¦   «          	 ddd¦  «         d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 )u   XÃ³a cÃ´ng viá»‡c WBS.z;SELECT project_id FROM erp_project_wbs WHERE id::text = %s;z0DELETE FROM erp_project_wbs WHERE id::text = %s;NFr   T)rB   rC   r6   r7   r>   rD   rE   )r   rI   Úsql_findÚsql_delrG   r   Úrowr   s           r   Údelete_wbs_itemz"WbsOperationsMixin.delete_wbs_item¦   sÅ  € àPˆØDˆØ× Ò Ñ"Ô"ð 
	 d¨D¯KªK©M¬Mð 
	¸SØ�KŠK˜ 6 )Ñ,Ô,Ð,Ø—,’,‘.”.ˆCØð Øð	
	ð 
	ð 
	ñ 
	ô 
	ð 
	ð 
	ð 
	ð 
	ñ 
	ô 
	ð 
	ð 
	ð 
	õ
 ˜S Ô.Ñ/Ô/ˆJà�KŠK˜ & Ñ+Ô+Ð+Ø×.Ò.¨s°JÑ?Ô?Ð?Ø�KŠK‰MŒMˆMØð
	ð 
	ð 
	ñ 
	ô 
	ð 
	ð 
	ð 
	ð 
	ñ 
	ô 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	øøøð 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	ñ 
	ô 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	øøøð 
	ð 
	ð 
	ð 
	ð 
	ð 
	sA   ™C<®/C$ÁC<Á5AC$ÃC<Ã$C(	Ã(C<Ã+C(	Ã,C<Ã<D ÄD c                óú   — d}|                      ||f¦  «         |                     ¦   «         }|rKt          t          t	          |d         ¦  «        ¦  «        ¦  «        }d}|                      |||f¦  «         dS dS )uY   Tá»± Ä‘á»™ng tÃ­nh toÃ¡n láº¡i overall_progress_percent cho dá»± Ã¡n tá»« cÃ¡c tasks WBS.zÁ
            SELECT 
                COALESCE(AVG(progress_percent), 0) AS avg_progress
            FROM erp_project_wbs
            WHERE project_id::text = %s AND task_type = 'task';
        Úavg_progresszRUPDATE projects SET progress_percent = %s, updated_at = NOW() WHERE id::text = %s;N)r6   r7   ÚintÚroundÚfloat)r   r   r   Úsql_calcr<   rZ   Úsql_ups          r   rD   z0WbsOperationsMixin._recalculate_project_progress¶   s†   € ðˆð 	�Š�H˜z˜mÑ,Ô,Ð,Ø�lŠl‰nŒnˆØð 	<Ý�u¥U¨3¨~Ô+>Ñ%?Ô%?Ñ@Ô@ÑAÔAˆLØiˆFØ�KŠK˜ ¨zÐ :Ñ;Ô;Ð;Ð;Ð;ð	<ð 	<r   N)r   r   r	   r   )r   r   r   r   r   r   r	   r    )r   r>   r?   r@   r	   r@   )rI   r>   rJ   r@   r	   r@   )rI   r>   r	   rS   )r   r   r   r>   r	   r    )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r=   rH   rR   rX   rD   r   r   r   r   r   	   s•   € € € € € ØMÐMðð ð ð ð.8ð .8ð .8ð .8ð`+ð +ð +ð +ðZ,ð ,ð ,ð ,ð\ð ð ð ð <ð <ð <ð <ð <ð <r   r   )Ú
__future__r   ÚloggingÚtypingr   Ú	getLoggerÚloggerr   r   r   r   ú<module>ri      s�   ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ð Ð à	ˆÔ	Ð=Ñ	>Ô	>€ðz<ð z<ð z<ð z<ð z<ñ z<ô z<ð z<ð z<ð z<r   