§
    R¶j†  ã                  óh   — d Z ddlmZ ddlmZmZmZ ddlmZ ddlm	Z	 ddl
mZ  G d„ d¦  «        Zd	S )
zžEarned Value Management (EVM) Calculation & S-Curve Analytics Engine.
Strict Decimal Precision NUMERIC(18, 4) compliant with FIDIC and Construction ERP 2026.
é    )Úannotations)ÚdateÚdatetimeÚ	timedelta)ÚDecimal)ÚAny)ÚFinancialWarRoomPortc                  ó$   — e Zd ZdZddd„Zdd„ZdS )ÚEvmCalculationServicezJEnterprise EVM engine for cost and schedule performance index calculation.NÚrepoúFinancialWarRoomPort | NoneÚreturnÚNonec                ó8   — |€ddl m}  |¦   «         }|| _        d S )Nr   )ÚProjectCrudRepository)Ú)app.core.postgres.project_crud_repositoryr   r   )Úselfr   r   s      úOC:\Projects\DSCons\app\modules\financial\application\evm_calculation_service.pyÚ__init__zEvmCalculationService.__init__   s2   € Øˆ<ØWÐWÐWÐWÐWÐWØ(Ð(Ñ*Ô*ˆDØˆŒ	ˆ	ˆ	ó    Úproject_id_or_codeÚstrúdict[str, Any]c                óì  — | j                              |¦  «        }|sddiS t          |d         ¦  «        }t          t          |                     d¦  «        pd¦  «        ¦  «        }t          t          |                     d¦  «        p|pd¦  «        ¦  «        }|dk    r|pt          d¦  «        }|                     d¦  «        pg }|                     d	¦  «        pg }t          d¦  «        }t          d¦  «        }	d
„ |D ¦   «         }
|
s|}
|
D ]Ó}t          t          |                     d¦  «        pd¦  «        ¦  «        }|dk    rt          d¦  «        }t          t          |                     d¦  «        pd¦  «        ¦  «        t          d¦  «        z  }|||z  z  }|                     d¦  «        dv r|	|t          d¦  «        z  z  }	Œ¾|	|t          d¦  «        z  z  }	ŒÔ|dk    rX|                     d¦  «        rC|t          t          |                     dd¦  «        ¦  «        ¦  «        t          d¦  «        z  z  }|	dk    r|t          d¦  «        z  }	|t          d¦  «        z  }|dk    rt          d¦  «        }||z
  }||	z
  }|dk    r||z  nt          d¦  «        }|	dk    r||	z  nt          d¦  «        }|dk    r||z  n|}||z
  }t          t          |                     d¦  «        pd¦  «        ¦  «        t          d¦  «        z  }t          t          |                     d¦  «        pd¦  «        ¦  «        t          d¦  «        z  }||z  }||z  }||z
  |z
  }|                     d¦  «        pt          j        ¦   «         }t          |t          ¦  «        rL	 t          j	        |d¦  «                             ¦   «         }n## t          $ r t          j        ¦   «         }Y nw xY wg }g d¢}g d¢}g d¢}g d ¢}d!} t          d"¦  «        D �]}!|t          |!d#z  ¬$¦  «        z   }"|!| k    }#|                     ||!         |"                     d¦  «        t          t!          |t          t          ||!         ¦  «        ¦  «        z  d!¦  «        ¦  «        |#s@t          t!          |t          t          ||!         ¦  «        ¦  «        z  d!¦  «        ¦  «        nd%|#s@t          t!          |t          t          ||!         ¦  «        ¦  «        z  d!¦  «        ¦  «        nd%|#d&œ¦  «         �Œ|t          d'¦  «        k    rd(}$d)}%n|t          d*¦  «        k    rd+}$d,}%nd-}$d.}%|t          d/¦  «        k    rd0}&d)}'n|t          d1¦  «        k    rd2}&d,}'nd3}&d.}'i d4|“d5|                     d5¦  «        “d6|                     d6¦  «        “dt          |¦  «        “d7t          |¦  «        “d8t          t!          |	d!¦  «        ¦  «        “d9t          t!          |d!¦  «        ¦  «        “d:t          t!          |d!¦  «        ¦  «        “d;t          t!          |d!¦  «        ¦  «        “d<t          t!          |d!¦  «        ¦  «        “d=t          t!          |d>¦  «        ¦  «        “d?t          t!          |d>¦  «        ¦  «        “d@t          t!          |d!¦  «        ¦  «        “dAt          t!          |d!¦  «        ¦  «        “dBt          t!          |d!¦  «        ¦  «        “dCt          t!          |d!¦  «        ¦  «        “dDt          t!          |d!¦  «        ¦  «        “|$|%|&|'|t          j        ¦   «                              dE¦  «        dFœ¥S )Gub   TÃ­nh toÃ¡n cÃ¡c chá»‰ sá»‘ EVM vÃ  dá»±ng biá»ƒu Ä‘á»“ Ä‘Æ°á»�ng cong S-Curve thá»�i gian thá»±c.ÚerrorzProject not foundÚidÚcontract_valuer   Úbudget_amounti Êš;Úwbs_treeÚ	wbs_itemsc                ó@   — g | ]}|                      d ¦  «        dv ¯|‘ŒS )Ú	task_type)ÚtaskÚpackage)Úget)Ú.0Úts     r   ú
<listcomp>zCEvmCalculationService.get_project_evm_analytics.<locals>.<listcomp>/   s/   € ÐSÐSÐS�q¨¯ª¨{Ñ);Ô);Ð?RÐ)RÐ)R�Ð)RÐ)RÐ)Rr   Útotal_amount_vndi€ðúÚprogress_percentéd   Ústatus)Ú	completedÚin_progressz0.85z0.40z1.02z0.945i áõz1.0000Úadvance_payment_percentg      $@Úretention_percentg      @Ú
start_datez%Y-%m-%d)u   ThÃ¡ng 1u   ThÃ¡ng 2u   ThÃ¡ng 3u   ThÃ¡ng 4u   ThÃ¡ng 5u   ThÃ¡ng 6)gš™™™™™¹?gìQ¸…ëÑ?gš™™™™™á?gö(\�Âõè?gq=
×£pí?ç      ð?)g¸…ëQ¸¾?g{®GázÔ?g�Âõ(\�â?gš™™™™™é?çffffffî?r2   )g)\�Âõ(¼?g333333Ó?gHáz®Gá?gR¸…ëQè?gÍÌÌÌÌÌì?r3   é   é   é   )ÚdaysN)Úperiod_labelÚperiod_dateÚplanned_value_pvÚearned_value_evÚactual_cost_acÚis_projectedz1.05u.   Tá»‘i Æ°u chi phÃ­ (Tiáº¿t kiá»‡m ngÃ¢n sÃ¡ch)Úgreenz0.95u   Ä�Ãºng káº¿ hoáº¡ch dá»± toÃ¡nÚcyanu   Cáº£nh bÃ¡o vÆ°á»£t chi phÃ­Úrosez1.00u(   VÆ°á»£t tiáº¿n Ä‘á»™ Ä‘Æ°á»�ng gÄƒng CPMz0.90u$   BÃ¡m sÃ¡t tiáº¿n Ä‘á»™ há»£p Ä‘á»“ngu)   Cháº­m tiáº¿n Ä‘á»™ (Cáº§n tÄƒng ca mÃ¡y)Ú
project_idÚproject_codeÚproject_nameÚbudget_amount_bacr:   r;   r<   Úcost_variance_cvÚschedule_variance_svÚcpié   ÚspiÚestimate_at_completion_eacÚvariance_at_completion_vacÚadvance_recovery_amountÚretention_withheld_amountÚnet_ipc_payable_amountz%d/%m/%Y %H:%M)Úcost_healthÚ
cost_colorÚschedule_healthÚschedule_colorÚs_curve_pointsÚanalyzed_at)r   Úget_project_detailr   r   r%   r   ÚtodayÚ
isinstancer   ÚstrptimeÚ	ExceptionÚranger   ÚappendÚstrftimeÚfloatÚroundÚnow)(r   r   ÚdetailrA   r   r   r   r    Útotal_evÚtotal_pvÚtasksr'   Úitem_valÚprogÚtotal_acÚcvÚsvrG   rI   ÚeacrK   Úadvance_pctÚretention_pctrL   rM   rN   r1   rS   Úmonths_labelÚpv_curve_pctÚev_curve_pctÚac_curve_pctÚcurr_progress_idxÚidxÚpt_dateÚ	is_futurerO   rP   rQ   rR   s(                                           r   Úget_project_evm_analyticsz/EvmCalculationService.get_project_evm_analytics   s1  € à”×-Ò-Ð.@ÑAÔAˆØð 	2ØÐ0Ð1Ð1å˜ œÑ&Ô&ˆ
Ý ¥ V§Z¢ZÐ0@Ñ%AÔ%AÐ%FÀQÑ!GÔ!GÑHÔHˆÝÝ�—
’
˜?Ñ+Ô+ÐK¨~ÐKÀÑLÔLñ
ô 
ˆð ˜AÒÐØ*ÐA­g°jÑ.AÔ.AˆMà—:’:˜jÑ)Ô)Ð/¨RˆØ—J’J˜{Ñ+Ô+Ð1¨rˆ	õ ˜1‘:”:ˆÝ˜1‘:”:ˆð TÐS˜IÐSÑSÔSˆØð 	ØˆEàð 	7ð 	7ˆAÝ�s 1§5¢5Ð);Ñ#<Ô#<Ð#AÀÑBÔBÑCÔCˆHØ˜1Š}ˆ}Ý" 8Ñ,Ô,�Ý�3˜qŸušuÐ%7Ñ8Ô8Ð=¸AÑ>Ô>Ñ?Ô?Å'È#Á,Ä,ÑNˆDØ˜ 4™Ñ'ˆHð �uŠu�X‰ŒÐ">Ð>Ð>Ø˜H¥w¨v¡¤Ñ6Ñ6��à˜H¥w¨v¡¤Ñ6Ñ6��à�qŠ=ˆ=˜VŸZšZÐ(:Ñ;Ô;ˆ=Ø$Ý�˜FŸJšJÐ'9¸1Ñ=Ô=Ñ>Ô>Ñ?Ô?Å'È#Á,Ä,ÑNñˆHð �qŠ=ˆ=Ø¥'¨&¡/¤/Ñ1ˆHð �g gÑ.Ô.Ñ.ˆØ�qŠ=ˆ=Ý˜yÑ)Ô)ˆHð ˜Ñ ˆØ˜Ñ ˆà'/°!¢| |ˆx˜(Ñ"Ð"½ÀÑ9JÔ9JˆØ'/°!¢| |ˆx˜(Ñ"Ð"½ÀÑ9JÔ9Jˆð (+¨Q¢w wˆ}˜sÑ"Ð"°MˆØ%2°SÑ%8Ð"õ Ý�—
’
Ð4Ñ5Ô5Ð=¸Ñ>Ô>ñ
ô 
å�C‰LŒLñˆõ  ¥ F§J¢JÐ/BÑ$CÔ$CÐ$JÀsÑ KÔ KÑLÔLÍwØñP
ô P
ñ 
ˆð #+¨[Ñ"8ÐØ$,¨}Ñ$<Ð!àÐ.Ñ.Ð1JÑJð 	ð
 —Z’Z Ñ-Ô-Ð=µ´±´ˆ
Ý�j¥#Ñ&Ô&ð 	*ð*Ý%Ô.¨z¸:ÑFÔF×KÒKÑMÔM�
�
øÝð *ð *ð *Ý!œZ™\œ\�
�
�
ð*øøøð ˆð
ð 
ð 
ˆð <Ð;Ð;ˆØ;Ð;Ð;ˆØ;Ð;Ð;ˆàÐÝ˜‘8”8ð 	ñ 	ˆCØ ¥9°#¸±(Ð#;Ñ#;Ô#;Ñ;ˆGØÐ/Ò/ˆIà×!Ò!à$0°Ô$5Ø#*×#3Ò#3°JÑ#?Ô#?Ý(-Ý˜m­gµc¸,ÀsÔ:KÑ6LÔ6LÑ.MÔ.MÑMÈqÑQÔQñ)ô )ð %ð(¥uÝ˜m­gµc¸,ÀsÔ:KÑ6LÔ6LÑ.MÔ.MÑMÈqÑQÔQñ(ô (ð (ð ð %ð'¥eÝ˜m­gµc¸,ÀsÔ:KÑ6LÔ6LÑ.MÔ.MÑMÈqÑQÔQñ'ô 'ð 'ð Ø$-ð!ð ñô ð ñ ð, •'˜&‘/”/Ò!Ð!ØJˆKØ ˆJˆJØ•G˜F‘O”OÒ#Ð#Ø:ˆKØˆJˆJà8ˆKØˆJð •'˜&‘/”/Ò!Ð!ØHˆOØ$ˆNˆNØ•G˜F‘O”OÒ#Ð#ØDˆOØ#ˆNˆNàIˆOØ#ˆNð
Ø˜*ð
à˜FŸJšJ ~Ñ6Ô6ð
ð ˜FŸJšJ ~Ñ6Ô6ð
ð �e NÑ3Ô3ð	
ð
  ¥ }Ñ!5Ô!5ð
ð ¥¥e¨H°aÑ&8Ô&8Ñ 9Ô 9ð
ð �u¥U¨8°QÑ%7Ô%7Ñ8Ô8ð
ð �e¥E¨(°AÑ$6Ô$6Ñ7Ô7ð
ð ¥¥e¨B°¡l¤lÑ 3Ô 3ð
ð #¥E­%°°A©,¬,Ñ$7Ô$7ð
ð •5�˜s A™œÑ'Ô'ð
ð •5�˜s A™œÑ'Ô'ð
ð )­%µ°c¸1±´Ñ*>Ô*>ð
ð )­%µÐ6PÐRSÑ0TÔ0TÑ*UÔ*Uð
ð &¥u­UÐ3JÈAÑ-NÔ-NÑ'OÔ'Oð
ð  (­­uÐ5NÐPQÑ/RÔ/RÑ)SÔ)Sð!
ð" %¥e­EÐ2HÈ!Ñ,LÔ,LÑ&MÔ&Mð#
ð$ 'Ø$Ø.Ø,Ø,Ý#œ<™>œ>×2Ò2Ð3CÑDÔDð/
ð 
ð 
ð 	
s   Î"'O
 Ï
O*Ï)O*)N)r   r   r   r   )r   r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   rt   © r   r   r   r      sM   € € € € € ØTÐTðð ð ð ð ðk
ð k
ð k
ð k
ð k
ð k
r   r   N)rx   Ú
__future__r   r   r   r   Údecimalr   Útypingr   Ú<app.modules.financial.domain.ports.financial_repository_portr	   r   ry   r   r   ú<module>r~      s¿   ððð ð #Ð "Ð "Ð "Ð "Ð "à .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð
t
ð t
ð t
ð t
ð t
ñ t
ô t
ð t
ð t
ð t
r   