Ë
    úîi‘,  ã                  ó2  — d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	 ddl
mZmZmZmZ dd	œdd
„Zej                   dddœ	 	 	 	 	 dd„«       Zej                   ddddddej$                  j&                  ddddœ
	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„«       Zej                   dddddddœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„«       Zej                   ddddœ	 	 	 	 	 	 	 dd„«       Zej                   dddœ	 	 	 	 	 	 	 dd„«       Zej                   ddddœ	 	 	 	 	 d d„«       Zy)!é    )Úannotations)ÚDecimal)Úuuid4)Útransaction)Útimezoneé   )ÚTreasuryAccountÚTreasuryMovementÚRemittanceBatchÚRemittanceLineÚXAF)Úcurrencyc                ó€   — t         j                  j                  | |d¬«      j                  d«      j	                  «       S )NT)Útenantr   Ú
is_defaultz-id)r	   ÚobjectsÚfilterÚorder_byÚfirst©r   r   s     ú1/var/www/html/acx/treasury_management/services.pyÚget_default_accountr      s3   € ä×Ñ×&Ñ&¨f¸xÐTXÐ&ÓYß	‰�%‹ß	‰‹ðó    NT)Útreasury_accountÚ	confirmedc                ó$  — t        |dd«      }t        |dd«      xs t        t        |dd«      dd«      xs d}|dv ry|€t        |dd«      xs t        | |¬«      }|€yt        |dd«      }t        |d	d«      xs t        |d	d«      xs t        |d
d«      }|rt        |dd«      nd}|€|�t        |d	d«      }t        |dd«      xs t        d«      }	t        |dd«      xs t        j                  «       }
d|j
                  › �}t        j                  j                  | ||t        j                  j                  |rt        j                  j                  nt        j                  j                  |	||
dt        |dd«      xs d|||t        j                  j                  t        |dd«      xs dt        |dd«      dœ¬«      \  }}|sÈg }|j                   |	k7  r|	|_        |j#                  d«       |j$                  |
k7  r|
|_        |j#                  d«       |j&                  t        |dd«      k7  r||_        |j#                  d	«       |j*                  t        |dd«      k7  r||_        |j#                  d«       |r|j/                  |¬«       |S )uD  
    CrÃ©e un mouvement IN si l'argent transite rÃ©ellement par ACX.

    âš ï¸� Le paiement "direct client" ne doit PAS crÃ©er un mouvement de trÃ©sorerie.
    On s'appuie sur payment.received_by si le champ existe.
    Si le champ n'existe pas encore: on suppose ACX (inflow) seulement si treasury_account est fourni.
    Úreceived_byNr   Úcaser   )Úcustomer_directÚclientÚcustomerr   r   r!   ÚdebtorÚ	portfolioÚamountú0.00Úpaid_atzpayment:zEncaissement (paiement)Ú	referenceÚ ÚnotesÚ
created_by)ÚaccountÚ	directionÚstatusr$   r   Ú
value_dateÚlabelr'   r!   r   ÚpaymentÚsourcer)   r*   ©r   Ú
source_keyÚdefaultsr.   Úid©Úupdate_fields)Úgetattrr   r   r   Únowr5   r
   r   Úget_or_createÚ	DirectionÚINÚStatusÚ	CONFIRMEDÚPENDINGÚSourceÚPAYMENTr$   Úappendr.   Úcustomer_idr!   Úcase_idr   Úsave)r   r0   r   r   r   r   r   r!   r#   r$   r&   r3   ÚmvÚcreatedÚupdatess                  r   Úrecord_payment_inflowrI      s˜  € ô ˜' =°$Ó7€Kä�˜ TÓ*ò 	Ü”7˜7 F¨DÓ1°:¸tÓDò	àð ð Ð?Ñ?Øð ÐÜ" 7Ð,>ÀÓEò 
ÔI\Ø HôJ
Ðð Ðàô �7˜F DÓ)€Dô 	�˜ TÓ*ò 	)Ü�4˜ TÓ*ò	)ä�4˜ 4Ó(ð ñ 59”˜˜k¨4Ô0¸d€IØÐ˜IÐ1Ü˜9 j°$Ó7ˆä�W˜h¨Ó-Ò@´¸³€FÜ�g˜y¨$Ó/ÒA´8·<±<³>€Gà˜GŸJ™J˜<Ð(€Jä"×*Ñ*×8Ñ8ØØà'Ü)×3Ñ3×6Ñ6Ù;DÔ&×-Ñ-×7Ò7ÔJZ×JaÑJa×JiÑJiØØ Ø!Ø.Ü  ¨+°rÓ:Ò@¸bØ ØØÜ&×-Ñ-×5Ñ5Ü˜W g¨rÓ2Ò8°bÜ! '¨<¸Ó>ñ
ð 9ó �K€Bˆñ( àˆØ�9‰9˜ÒØˆBŒIØ�N‰N˜8Ô$Ø�=‰=˜GÒ#Ø#ˆBŒMØ�N‰N˜<Ô(Ø�>‰>œW X¨t°TÓ:Ò:Ø"ˆBŒKØ�N‰N˜:Ô&Ø�:‰:œ  t¨TÓ2Ò2ØˆBŒGØ�N‰N˜6Ô"ÙØ�G‰G 'ˆGÔ*Ø€Ir   r(   )
r   r.   r/   r'   r!   r   r-   r)   r*   r3   c                óB  — |xs t        j                  «       }|xs t        |dd«      xs d}|||
||||xs! |t        j                  j
                  k(  rdnd|xs d||	ddt        j                  j                  |xs d|dœ}|rzt        j                  j                  | ||¬«      \  }}|sQg }d	D ]6  }t        ||«      ||   k7  sŒt        ||||   «       |j                  |«       Œ8 |r|j                  |¬
«       |S t        j                  j                  d| ddœ|¤ŽS )u‹   
    CrÃ©e un mouvement manuel (IN/OUT).

    - Si source_key est fourni : idempotent (get_or_create).
    - Sinon : crÃ©ation simple.
    r   Nr   u   EntrÃ©e manuellezSortie manueller(   ©r+   r,   r-   r$   r   r.   r/   r'   r!   r   r0   Ú
remittancer1   r)   r*   r2   )r+   r,   r-   r$   r   r.   r/   r'   r!   r   r)   r6   ©r   r3   © )r   r9   r8   r
   r;   r<   r@   ÚMANUALr   r:   ÚsetattrrB   rE   Úcreate)r   r+   r,   r$   r   r.   r/   r'   r!   r   r-   r)   r*   r3   r4   rF   rG   rH   Úfs                      r   Úcreate_manual_movementrS   u   sC  € ð0 Ò-œxŸ|™|›~€JØÒFœ7 7¨J¸Ó=ÒFÀ€Hð ØØØØØ ØÒs°Ô>N×>XÑ>X×>[Ñ>[Ò1[Ñ-ÐarØ’_ "ØØØØÜ"×)Ñ)×0Ñ0Ø’˜"Ø ñ€Hñ$ Ü&×.Ñ.×<Ñ<ØØ!Øð =ó 
‰ˆˆGñ
 à!#ˆGð Oò &�Ü˜2˜q“> X¨a¡[Ó0Ü˜B  8¨A¡;Ô/Ø—N‘N 1Õ%ð&ñ Ø—‘ g�Ô.Øˆ	ä×#Ñ#×*Ñ*ÐV°&ÀTÑVÈXÑVÐVr   )r   r.   r'   r)   r*   Útransfer_keyc        
        óV  — |	€t        «       j                  }	|xs t        j                  «       }|xs t	        |dd«      xs d}d|	› d�}
d|	› d�}t
        j                  j                  | |
|t
        j                  j                  t
        j                  j                  |||d|j                  › �|xs dddddt	        t
        j                  d	t
        j                  j                  «      |xs d|d
œ¬«      \  }}t
        j                  j                  | ||t
        j                  j                  t
        j                  j                  |||d|j                  › �|xs dddddt	        t
        j                  d	t
        j                  j                  «      |xs d|d
œ¬«      \  }}|||	fS )uô   
    Transfert interne : gÃ©nÃ¨re 2 mouvements idempotents :
    - OUT sur from_account
    - IN sur to_account

    La clÃ© de transfert est utilisÃ©e pour crÃ©er deux source_key distincts:
    - transfer:{key}:out
    - transfer:{key}:in
    Nr   r   z	transfer:z:outz:inzTransfert vers r(   ÚTRANSFERrK   r2   zTransfert depuis )r   Úhexr   r9   r8   r
   r   r:   r;   ÚOUTr=   r>   Únamer@   ÚOTHERr<   )r   Úfrom_accountÚ
to_accountr$   r   r.   r'   r)   r*   rT   Úout_keyÚin_keyÚout_mvÚ_Úin_mvs                  r   Úcreate_transferrb   ¶   s¬  € ð. ÐÜ“w—{‘{ˆàÒ-œxŸ|™|›~€JàÒKœ7 <°¸TÓBÒKÀe€Hà˜,˜ tÐ,€GØ˜˜ cÐ*€Fä ×(Ñ(×6Ñ6ØØà#Ü)×3Ñ3×7Ñ7Ü&×-Ñ-×7Ñ7ØØ Ø$Ø& z§¡Ð&7Ð8Ø"š bØØØØÜÔ.×5Ñ5°zÔCS×CZÑCZ×C`ÑC`ÓaØ’[˜bØ$ñ
ð 7ó �I€FˆAô,  ×'Ñ'×5Ñ5ØØà!Ü)×3Ñ3×6Ñ6Ü&×-Ñ-×7Ñ7ØØ Ø$Ø(¨×):Ñ):Ð(;Ð<Ø"š bØØØØÜÔ.×5Ñ5°zÔCS×CZÑCZ×C`ÑC`ÓaØ’[˜bØ$ñ
ð 6ó �H€Eˆ1ð, �5˜,Ð&Ð&r   )r   r*   r)   c           	     ó†   — t         j                  j                  | |||t         j                  j                  |xs d|¬«      S )Nr(   )r   r!   r+   r   r-   r)   r*   )r   r   rQ   r=   ÚDRAFT)r   r!   r+   r   r*   r)   s         r   Úcreate_remittance_draftre     sG   € ô ×"Ñ"×)Ñ)ØØØØÜ×%Ñ%×+Ñ+ØŠk�rØð *ó ð r   )r$   r)   c                óL  — t        |dd «      }|€t        |dd «      xs t        d«      }t        j                  j	                  | ||||xs ddœ¬«      \  }}t        d„ | j                  j                  «       D «       t        d«      «      | _        | j                  dd	g¬
«       |S )Nr   r$   r%   r(   )r   r$   r)   )rL   r0   r4   c              3  ó4   K  — | ]  }|j                   –— Œ y ­w)N)r$   )Ú.0Úls     r   ú	<genexpr>z,add_payment_to_remittance.<locals>.<genexpr>'  s   è ø€ Ò"L° 1§8¥8Ñ"Lùs   ‚Úamount_totalÚ
updated_atr6   )
r8   r   r   r   r:   ÚsumÚlinesÚallrk   rE   )rL   r0   r$   r)   r   Úliner`   s          r   Úadd_payment_to_remittancerq     s¨   € ô �7˜F DÓ)€DØ€~Ü˜ (¨DÓ1ÒD´W¸V³_ˆä×$Ñ$×2Ñ2ØØàØØ’[˜bñ
ð 3ó �G€Dˆ!ô "Ñ"L°Z×5EÑ5E×5IÑ5IÓ5KÔ"LÌgÐV\ËoÓ^€JÔØ‡O�O >°<Ð"@€OÔAØ€Kr   )r'   r&   r*   c                óv  — | j                   t        j                  j                  k(  rHt        j
                  j                  | j                  d| j                  › �¬«      j                  «       }|S t        j                  j                  | _         |xs | j                  | _
        |xs t        j                  «       | _        | j                  g d¢¬«       d| j                  › �}t        j
                  j                  | j                  || j                   t        j"                  j$                  t        j                  j&                  | j(                  | j*                  | j                  d| j                  xs d| j,                  dd| t        j.                  j0                  | j2                  xs d|dœ¬	«      \  }}|S )
u@   
    Marque une remise payÃ©e et gÃ©nÃ¨re le mouvement OUT.
    zremittance:rM   )r-   r'   r&   rl   r6   zReversement clientr(   NrK   r2   )r-   r   r=   ÚPAIDr
   r   r   r   r5   r   r'   r   r9   r&   rE   r:   r+   r;   rX   r>   rk   r   r!   r@   Ú
REMITTANCEr)   )rL   r'   r&   r*   rF   r3   r`   s          r   Úmark_remittance_paidru   ,  su  € ð ×ÑœO×2Ñ2×7Ñ7Ò7ä×%Ñ%×,Ñ,Ø×$Ñ$°;¸z¿}¹}¸oÐ1Nð -ó 
ç
‰%‹'ð 	ð ˆ	ä'×.Ñ.×3Ñ3€JÔØ$Ò<¨
×(<Ñ(<€JÔØ Ò2¤H§L¡L£N€JÔØ‡O�OÒ"R€OÔSà˜zŸ}™}˜oÐ.€Jä×$Ñ$×2Ñ2Ø× Ñ Øà!×)Ñ)Ü)×3Ñ3×7Ñ7Ü&×-Ñ-×7Ñ7Ø ×-Ñ-Ø"×+Ñ+Ø$×,Ñ,Ø)Ø#×-Ñ-Ò3°Ø"×+Ñ+ØØØ$Ü&×-Ñ-×8Ñ8Ø×%Ñ%Ò+¨Ø$ñ
ð 3ó �E€Bˆð* €Ir   )r   ÚstrÚreturnúTreasuryAccount | None)r   rx   r   Úboolrw   zTreasuryMovement | None)r+   r	   r,   rv   r$   r   r   ú
str | Noner/   rv   r'   rv   r-   rv   r)   rv   r3   rz   rw   r
   )r[   r	   r\   r	   r$   r   r   rz   r'   rv   r)   rv   rT   rz   rw   z.tuple[TreasuryMovement, TreasuryMovement, str])r+   r	   r   rv   r)   rv   rw   r   )rL   r   r$   zDecimal | Noner)   rv   rw   r   )rL   r   r'   rv   rw   r
   )Ú
__future__r   Údecimalr   Úuuidr   Ú	django.dbr   Údjango.utilsr   Úmodelsr	   r
   r   r   r   ÚatomicrI   r=   r>   rS   rb   re   rq   ru   rN   r   r   ú<module>r‚      sg  ðÝ "å Ý å !Ý !ç VÓ Vð 49õ ð ×Ñð
 04Øñ]ð -ð	]ð
 ð]ð ò]ó ð]ð@ ×Ñð  ØØØØØ	Ø"×)Ñ)×3Ñ3ØØØ!ñ=Wð ð=Wð ð	=Wð
 ð=Wð ð=Wð ð=Wð ð=Wð ð=Wð ð=Wð ð=Wð  ò!=Wó ð=Wð@ ×Ñð  ØØØØØ#ñL'ð "ðL'ð  ð	L'ð
 ðL'ð ðL'ð ðL'ð ðL'ð ðL'ð 4òL'ó ðL'ð^ ×ÑàCHÐUYÐhjñØ"1ðØ=@ðØbeðàòó ðð ×ÑàFJÐY[ñØ"ðØ5CðØSVðàòó ðð, ×Ñà57ÀÐRVñ)Ø"ð)Ø/2ð)àò)ó ñ)r   