Ë
    ]øià-  ã                  ó|  — d dl mZ d dl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mZmZmZmZmZ ddlmZ dd	„Zdd
„Z G d„ de
j,                  «      Z G d„ de
j,                  «      Z G d„ de
j,                  «      Z G d„ de
j,                  «      Z G d„ de
j,                  «      Z G d„ de
j,                  «      Zy)é    )ÚannotationsN)ÚAnyÚDictÚOptional)Útransaction)Úserializersé   )ÚCollectionCaseÚCollectionActionÚPaymentPromiseÚPaymentÚCollectionEmailÚCollectionEmailAttachment)Úrecompute_case_balancesc                ó4   — t        j                  | ddd¬«      S )NFé   T)Úensure_asciiÚindentÚ	sort_keys)ÚjsonÚdumps)Úmetas    ú7/var/www/html/acx/collections_management/serializers.pyÚ
_dump_metar      s   € ä�:‰:�d¨°qÀDÔIÐIó    c                ó¢   — | xs dj                  «       } | sy 	 t        j                  | «      }t        |t        «      r|S d S # t
        $ r Y y w xY w)NÚ )Ústripr   ÚloadsÚ
isinstanceÚdictÚ	Exception)ÚsÚvs     r   Ú_try_load_jsonr%      sP   € Ø	
Šˆb�‰Ó€AÙØðÜ�J‰J�q‹MˆÜ˜q¤$Ô'ˆqÐ1¨TÐ1øÜò Ùðús   ™&A Á A Á	AÁAc                  óð   — e Zd Z ej                  ddd¬«      Z ej                  ddd¬«      Z ej                  d¬«      Z ej                  ddd¬«      Z
 ej                  d¬«      Zd	„ Z G d
„ d«      Zy)ÚCollectionCaseSerializeré   r   T)Ú
max_digitsÚdecimal_placesÚ	read_only©r+   zcustomer.nameN)Úsourcer+   Údefaultc                óŽ   — |j                   r|j                  j                  S |j                  r|j                  j                  S d S )N)Úcreditor_idÚcreditorÚnameÚcustomer_idÚcustomer©ÚselfÚobjs     r   Úget_creditor_namez*CollectionCaseSerializer.get_creditor_name'   s4   € Ø�?Š?Ø—<‘<×$Ñ$Ð$Ø$'§O¢Oˆs�|‰|× Ñ Ð=¸Ð=r   c                  ó    — e Zd ZeZg d¢Zg d¢Zy)úCollectionCaseSerializer.Meta)ÚidÚtenantÚ	referencer4   Úcustomer_namer1   Úcreditor_nameÚ	portfolioÚdebtorÚstatusÚpriorityÚassigned_toÚprincipal_amountÚinterest_amountÚpenalty_amountÚfees_amountÚtotal_paid_amountÚ	total_dueÚbalanceÚdue_dateÚnext_action_typeÚnext_action_dateÚnotesÚ
created_byÚ
created_atÚ
updated_atÚ
is_overdue©r<   rP   rQ   rR   N)Ú__name__Ú
__module__Ú__qualname__r
   ÚmodelÚfieldsÚread_only_fields© r   r   ÚMetar:   ,   s   „ Øˆò
ˆò: PÑr   r\   )rU   rV   rW   r   ÚDecimalFieldrJ   rK   ÚBooleanFieldrS   Ú	CharFieldr>   ÚSerializerMethodFieldr?   r8   r\   r[   r   r   r'   r'      s~   „ Ø(�×(Ñ(°BÀqÐTXÔY€IØ&ˆk×&Ñ&°"ÀQÐRVÔW€GØ)�×)Ñ)°DÔ9€Jð *�K×)Ñ)°ÈDÐZ^Ô_€MØ5�K×5Ñ5ÀÔE€Mò>÷
Pò Pr   r'   c                  ó  — e Zd Z ej                  dd¬«      Z ej                  d¬«      Z ej                  d¬«      Z ej                  d¬«      Z	 ej                  d¬«      Z
 G d„ d«      Zdd„Zdd„Zdd	„Zdd
„Zd„ Zy)ÚCollectionActionSerializerFT©ÚrequiredÚ
write_onlyr,   c                  ó    — e Zd ZeZg d¢Zg d¢Zy)úCollectionActionSerializer.Meta)r;   r<   ÚcaseÚcase_referenceÚdebtor_nameÚaction_typeÚoutcomeÚsummaryÚdetailsÚdetails_jsonr   Úaction_daterM   rN   rP   Úcreated_by_usernamerQ   rR   rT   N)rU   rV   rW   r   rX   rY   rZ   r[   r   r   r\   rg   X   s   „ Ø ˆò
ˆò( PÑr   r\   c                ó6   — t        t        |dd«      xs d«      S )Nrn   r   ©r%   Úgetattrr5   s     r   Úget_details_jsonz+CollectionActionSerializer.get_details_jsonp   s   € Üœg c¨9°bÓ9Ò?¸RÓ@Ð@r   c                óZ   — t        |dd «      }|sy t        |dd «      xs t        |dd «      S )Nrh   r=   Úcase_number©rt   )r6   r7   rh   s      r   Úget_case_referencez-CollectionActionSerializer.get_case_references   s4   € Ü�s˜F DÓ)ˆÙØÜ�t˜[¨$Ó/ÒU´7¸4ÀÐPTÓ3UÐUr   c                ó   — t        |dd «      }|rt        |dd «      nd }|sy dD ]  }t        ||d «      }|sŒ|c S  t        |dd «      xs d}t        |dd «      xs d}|› d|› �j                  «       xs t        |«      S )Nrh   rA   )Ú	full_namer2   Údisplay_nameÚlabelÚ
first_namer   Ú	last_nameÚ )rt   r   Ústr)r6   r7   rh   rA   ÚattrÚvalÚfirstÚlasts           r   Úget_debtor_namez*CollectionActionSerializer.get_debtor_namey   s˜   € Ü�s˜F DÓ)ˆÙ26”˜˜x¨Ô.¸DˆÙØØBò 	ˆDÜ˜& $¨Ó-ˆCÚØ’
ð	ô ˜ ¨dÓ3Ò9°rˆÜ�v˜{¨DÓ1Ò7°RˆØ�'˜˜4˜&Ð!×(Ñ(Ó*Ò9¬c°&«kÐ9r   c                óZ   — t        |dd «      }|sy t        |dd «      xs t        |dd «      S )NrP   ÚusernameÚemailrx   )r6   r7   Úusers      r   Úget_created_by_usernamez2CollectionActionSerializer.get_created_by_username†   s3   € Ü�s˜L¨$Ó/ˆÙØÜ�t˜Z¨Ó.ÒN´'¸$ÀÈÓ2NÐNr   c                óþ   — |j                  dd «      }|�ht        |t        «      st        j                  ddi«      ‚|j                  d«      xs dj                  «       }t        |«      }|s||d<   |S |› d|› �|d<   |S )Nr   úmeta must be a JSON object.rn   r   ú

META:
©Úpopr    r!   r   ÚValidationErrorÚgetr   r   )r6   Úattrsr   rn   Ú	meta_dumps        r   Úvalidatez#CollectionActionSerializer.validateŒ   s�   € à�y‰y˜ Ó&ˆØÐÜ˜d¤DÔ)Ü!×1Ñ1°6Ð;XÐ2YÓZÐZà—y‘y Ó+Ò1¨r×8Ñ8Ó:ˆGÜ" 4Ó(ˆIáØ#,��iÑ ð
 ˆð '. Y¨k¸)¸Ð#E��iÑ àˆr   N)r7   r   )r7   r   Úreturnz
str | None)rU   rV   rW   r   Ú	JSONFieldr   r`   ro   ri   rj   rq   r\   ru   ry   r†   r‹   r•   r[   r   r   rb   rb   N   s‰   „ à ˆ;× Ñ ¨%¸DÔA€Dð >˜K×=Ñ=ÈÔM€LØ=˜K×=Ñ=ÈÔM€NØ=˜K×=Ñ=ÈÔM€KØ=˜K×=Ñ=ÈÔMÐ÷Pñ Pó0AóVó:óOór   rb   c                  ó|   — e Zd Z ej                  dd¬«      Z ej                  d¬«      Z G d„ d«      Zd
d„Z	d„ Z
y	)ÚPaymentPromiseSerializerFTrc   r,   c                  ó    — e Zd ZeZg d¢Zg d¢Zy)úPaymentPromiseSerializer.Meta)r;   r<   rh   ÚamountÚpromised_daterB   rO   Ú
notes_jsonr   rP   rQ   rR   rT   N)rU   rV   rW   r   rX   rY   rZ   r[   r   r   r\   r›   ¥   s   „ Øˆò
ˆò PÑr   r\   c                ó6   — t        t        |dd«      xs d«      S ©NrO   r   rs   r5   s     r   Úget_notes_jsonz'PaymentPromiseSerializer.get_notes_json·   ó   € Üœg c¨7°BÓ7Ò=¸2Ó>Ð>r   c                óþ   — |j                  dd «      }|�ht        |t        «      st        j                  ddi«      ‚|j                  d«      xs dj                  «       }t        |«      }|s||d<   |S |› d|› �|d<   |S )Nr   r�   rO   r   rŽ   r�   )r6   r“   r   rO   r”   s        r   r•   z!PaymentPromiseSerializer.validateº   s�   € Ø�y‰y˜ Ó&ˆØÐÜ˜d¤DÔ)Ü!×1Ñ1°6Ð;XÐ2YÓZÐZà—Y‘Y˜wÓ'Ò-¨2×4Ñ4Ó6ˆEÜ" 4Ó(ˆIáØ!*��g‘ð ˆð %* 7¨+°i°[Ð!A��g‘àˆr   N)r7   r   )rU   rV   rW   r   r—   r   r`   rž   r\   r¡   r•   r[   r   r   r™   r™   Ÿ   s>   „ à ˆ;× Ñ ¨%¸DÔA€Dà2�×2Ñ2¸TÔB€J÷Pñ Pó$?ór   r™   c                  óœ   ‡ — e Zd ZdZ ej
                  dd¬«      Z ej                  d¬«      Z G d„ d«      Z	dd„Z
d	„ Zˆ fd
„Zˆ fd„Zˆ xZS )ÚPaymentSerializeruõ   
    âš ï¸� IMPORTANT :
    - Dans ta version actuelle, PaymentSerializer est dÃ©fini DEUX FOIS.
      Le 2áµ‰ Ã©crase le 1er => le recompute ne se fait pas.
    - Ici: on garde un SEUL PaymentSerializer, avec meta + recalcul des agrÃ©gats.
    FTrc   r,   c                  ó    — e Zd ZeZg d¢Zg d¢Zy)úPaymentSerializer.Meta)r;   r<   rh   rœ   Úpaid_atÚmethodÚreceived_byÚtreasury_accountr=   rO   rž   r   rP   rQ   rR   rT   N)rU   rV   rW   r   rX   rY   rZ   r[   r   r   r\   r§   ×   s   „ Øˆò
ˆò" PÑr   r\   c                ó6   — t        t        |dd«      xs d«      S r    rs   r5   s     r   r¡   z PaymentSerializer.get_notes_jsonì   r¢   r   c                ó   — |j                  dd «      }|�gt        |t        «      st        j                  ddi«      ‚|j                  d«      xs dj                  «       }t        |«      }|s||d<   n
|› d|› �|d<   |j                  d«      xs) | j                  rt        | j                  dd «      nd xs d}|dk(  rd |d	<   |S |j                  d	«      }|�§d }| j                  j                  d
«      }|�t        |dd «      }|€E|j                  d«      xs% | j                  rt        | j                  dd «      nd }	t        |	dd «      }|�2t        |dd «      t        |dd «      k7  rt        j                  d	di«      ‚|S )Nr   r�   rO   r   rŽ   rª   ÚacxÚcustomer_directr«   Úrequestr<   rh   Ú	tenant_idr;   z)Invalid treasury account for this tenant.)r�   r    r!   r   r‘   r’   r   r   Úinstancert   Úcontext)
r6   r“   r   rO   r”   rª   Útar<   ÚreqÚcs
             r   r•   zPaymentSerializer.validateï   s™  € Ø�y‰y˜ Ó&ˆØÐÜ˜d¤DÔ)Ü!×1Ñ1°6Ð;XÐ2YÓZÐZà—Y‘Y˜wÓ'Ò-¨2×4Ñ4Ó6ˆEÜ" 4Ó(ˆIáØ!*��g’à$) 7¨+°i°[Ð!A��g‘ð —i‘i Ó.ò  DÐbf×boÒbo´7¸4¿=¹=È-ÐY]Ô3^Ðuyò  Dð  DˆØÐ+Ò+à(,ˆEÐ$Ñ%ð  ˆð —‘Ð-Ó.ˆBØˆ~à�Ø—l‘l×&Ñ& yÓ1�Ø�?Ü$ S¨(°DÓ9�FØ�>ØŸ	™	 &Ó)ÒnÐVZ×VcÒVc¬g°d·m±mÀVÈTÔ.RÐim�AÜ$ Q¨°$Ó7�FàÐ%¬'°"°kÀ4Ó*HÌGÐTZÐ\`ÐbfÓLgÒ*gÜ%×5Ñ5Ð7IÐKvÐ6wÓxÐxàˆr   c                ó¨   •— t        j                  «       5  t        ‰| �  |«      }t	        |j
                  d¬«       d d d «       |S # 1 sw Y   S xY w©NT)Úsync_core_case)r   ÚatomicÚsuperÚcreater   rh   )r6   Úvalidated_dataÚpaymentÚ	__class__s      €r   r¼   zPaymentSerializer.create  sL   ø€ Ü×ÑÓ!ñ 	GÜ‘g‘n ^Ó4ˆGÜ# G§L¡LÀÕF÷	Gð ˆ÷	Gð ˆús   –'AÁAc                óª   •— t        j                  «       5  t        ‰| �  ||«      }t	        |j
                  d¬«       d d d «       |S # 1 sw Y   S xY wr¸   )r   rº   r»   Úupdater   rh   )r6   r²   r½   r¾   r¿   s       €r   rÁ   zPaymentSerializer.update  sN   ø€ Ü×ÑÓ!ñ 	GÜ‘g‘n X¨~Ó>ˆGÜ# G§L¡LÀÕF÷	Gð ˆ÷	Gð ˆús   –(AÁA)r7   r   )rU   rV   rW   Ú__doc__r   r—   r   r`   rž   r\   r¡   r•   r¼   rÁ   Ú__classcell__)r¿   s   @r   r¥   r¥   Ë   sV   ø„ ñð !ˆ;× Ñ ¨%¸DÔA€DØ2�×2Ñ2¸TÔB€J÷Pñ Pó*?ò"ôH÷ð r   r¥   c                  óJ   — e Zd Z ej                  «       Z G d„ d«      Zdd„Zy)Ú#CollectionEmailAttachmentSerializerc                  ó   — e Zd ZeZg d¢ZeZy)ú(CollectionEmailAttachmentSerializer.Meta)r;   ÚfilenameÚcontent_typeÚsizeÚfile_urlrQ   N)rU   rV   rW   r   rX   rY   rZ   r[   r   r   r\   rÇ   "  s   „ Ø)ˆÚUˆØ!Ñr   r\   c                óª   — | j                   j                  d«      }t        |dd «      }|sy |r|j                  |j                  «      S |j                  S )Nr°   Úfile©r³   r’   rt   Úbuild_absolute_uriÚurl©r6   r7   r°   Úfs       r   Úget_file_urlz0CollectionEmailAttachmentSerializer.get_file_url'  sK   € Ø—,‘,×"Ñ" 9Ó-ˆÜ�C˜ Ó&ˆÙØÙØ×-Ñ-¨a¯e©eÓ4Ð4Ø�u‰uˆr   N)r7   r   )rU   rV   rW   r   r`   rË   r\   rÓ   r[   r   r   rÅ   rÅ     s!   „ Ø0ˆ{×0Ñ0Ó2€H÷"ñ "ô
r   rÅ   c                  ó^   — e Zd Z ej                  «       Z edd¬«      Z G d„ d«      Zdd„Z	y)ÚCollectionEmailSerializerT)Úmanyr+   c                  ó    — e Zd ZeZg d¢Zg d¢Zy)úCollectionEmailSerializer.Meta)r;   r<   rh   ÚactionÚ	directionr-   rB   ÚproviderÚprovider_message_idÚerror_messageÚfrom_addressÚtoÚccÚbccÚsubjectÚsent_atÚ
message_idÚraw_eml_urlÚ	body_textÚ	body_htmlrO   ÚattachmentsrP   rQ   rR   rT   N)rU   rV   rW   r   rX   rY   rZ   r[   r   r   r\   rØ   5  s   „ Øˆò
ˆò6 PÑr   r\   c                óª   — | j                   j                  d«      }t        |dd «      }|sy |r|j                  |j                  «      S |j                  S )Nr°   Úraw_emlrÎ   rÑ   s       r   Úget_raw_eml_urlz)CollectionEmailSerializer.get_raw_eml_urlT  sK   € Ø—,‘,×"Ñ" 9Ó-ˆÜ�C˜ DÓ)ˆÙØÙØ×-Ñ-¨a¯e©eÓ4Ð4Ø�u‰uˆr   N)r7   r   )
rU   rV   rW   r   r`   rå   rÅ   rè   r\   rë   r[   r   r   rÕ   rÕ   1  s/   „ Ø3�+×3Ñ3Ó5€KÙ5¸4È4ÔP€K÷Pñ Pô>r   rÕ   )r   zDict[str, Any]r–   r�   )r#   r�   r–   zOptional[Dict[str, Any]])Ú
__future__r   r   Útypingr   r   r   Ú	django.dbr   Úrest_frameworkr   Úmodelsr
   r   r   r   r   r   Úservicesr   r   r%   ÚModelSerializerr'   rb   r™   r¥   rÅ   rÕ   r[   r   r   ú<module>ró      s¡   ðå "ã ß &Ñ &å !Ý &ç y× yÝ -óJó
ô-P˜{×:Ñ:ô -Pô`N ×!<Ñ!<ô Nôb)˜{×:Ñ:ô )ôXR˜×3Ñ3ô Rôh¨+×*EÑ*Eô ô$* × ;Ñ ;õ *r   