Ë
    !q6jô9  ã                   óê  — 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mZ d dlmZmZ d dlmZmZ  e«       Zdej*                  fd	„Zdej*                  fd
„Zd„ Z G d„ dej2                  «      Z G d„ dej2                  «      Z G d„ dej2                  «      Z G d„ dej2                  «      Z G d„ dej2                  «      Z G d„ dej2                  «      Z G d„ dej*                  «      Z y)é    )Úget_user_model)Úserializers)ÚValidationError)Úget_active_tenant_for_user)Ú	PortfolioÚDebtorÚCaseÚCaseNoteÚCaseDocument)Úgenerate_case_referenceÚget_country_for_user)ÚCustomerÚCreditorÚ
serializerc                 óî   — | j                   j                  d«      }|�|S | j                   j                  d«      }|€yt        |dd«      }|�|S t        |dd«      }|r|j                  rt	        |«      S yy)uÚ   
    RÃ©cupÃ¨re le tenant de faÃ§on robuste :
    1) serializer.context["tenant"] (portail client)
    2) request.tenant (si middleware un jour)
    3) get_active_tenant_for_user(request.user) (tenant-side actuel)
    ÚtenantNÚrequestÚuser)ÚcontextÚgetÚgetattrÚis_authenticatedr   )r   r   r   Útr   s        ú&/var/www/html/acx/cases/serializers.pyÚget_request_tenantr      s†   € ð ×Ñ×#Ñ# HÓ-€FØÐØˆà× Ñ ×$Ñ$ YÓ/€GØ€Øä�˜ 4Ó(€AØ€}Øˆä�7˜F DÓ)€DÙ�×%Ò%Ü)¨$Ó/Ð/ð &€tó    c                 óò   — | j                   j                  d«      }|�|S | j                   j                  d«      }|€yt        |dd«      }|�|S t        |dd«      }|rt        |dd«      rt        |dd«      S y)uÍ   
    RÃ©cupÃ¨re le customer de faÃ§on robuste :
    1) serializer.context["customer"] (portail client)
    2) request.customer (si middleware un jour)
    3) request.user.customer (si ton modÃ¨le l'a)
    ÚcustomerNr   r   r   F)r   r   r   )r   r   r   Úcr   s        r   Úget_request_customerr    &   sŠ   € ð ×!Ñ!×%Ñ% jÓ1€HØÐØˆà× Ñ ×$Ñ$ YÓ/€GØ€Øä�˜ TÓ*€AØ€}Øˆä�7˜F DÓ)€DÙ”˜Ð0°%Ô8Ü�t˜Z¨Ó.Ð.àr   c                 óü   — |€| j                   j                  «       S 	 | j                  j                  d«       | j                   j	                  |¬«      S # t
        $ r | j                   j                  «       cY S w xY w)uH   Retourne un queryset filtrÃ© par tenant si le modÃ¨le a un champ tenant.r   )r   )ÚobjectsÚnoneÚ_metaÚ	get_fieldÚfilterÚ	ExceptionÚall)Ú	model_clsr   s     r   Ú_qs_for_tenantr*   @   sq   € à€~Ø× Ñ ×%Ñ%Ó'Ð'ð'Ø�‰×!Ñ! (Ô+Ø× Ñ ×'Ñ'¨vÐ'Ó6Ð6øÜò 'à× Ñ ×$Ñ$Ó&Ò&ð'ús   ž6A Á#A;Á:A;c                   óî   — e Zd Z ej                  d¬«      Z ej                  d¬«      Z ej                  d¬«      Z ej                  dddd¬«      Z	 G d„ d«      Z
defd	„Zded
z  fd„Zded
z  fd„Zy
)ÚPortfolioSerializerT©Ú	read_onlyé   é   )Ú
max_digitsÚdecimal_placesr.   Ú
allow_nullc                   ó    — e Zd ZeZg d¢Zg d¢Zy)úPortfolioSerializer.Meta)ÚidÚnameÚcodeÚcategoryÚpriorityÚdefault_currencyÚdescriptionÚinternal_notesÚownerÚ	is_activeÚarchived_atÚ
created_byÚ
updated_byÚ
created_atÚ
updated_atÚcases_countÚopen_cases_countÚoverdue_cases_countÚbalance_total)
r6   r@   rA   rB   rC   rD   rE   rF   rG   rH   N)Ú__name__Ú
__module__Ú__qualname__r   ÚmodelÚfieldsÚread_only_fields© r   r   ÚMetar5   X   s   „ Øˆò
ˆò,
Ñr   rP   Úvaluec                 óH   — |xs dj                  «       }|st        d«      ‚|S )NÚ z'Le nom du portefeuille est obligatoire.©Ústripr   ©ÚselfrQ   s     r   Úvalidate_namez!PortfolioSerializer.validate_name}   s(   € Ø’˜"×#Ñ#Ó%ˆÙÜ!Ð"KÓLÐLØˆr   Nc                 ó4   — |€y |j                  «       }|xs d S ©N)rU   ©rW   rQ   Úvs      r   Úvalidate_codez!PortfolioSerializer.validate_codeƒ   s   € Øˆ=ØØ�K‰K‹MˆØŠy�DÐr   c                 óP   — |€y |j                  «       j                  «       }|xs d S rZ   )rU   Úupperr[   s      r   Úvalidate_default_currencyz-PortfolioSerializer.validate_default_currency‰   s(   € Øˆ=ØØ�K‰K‹M×ÑÓ!ˆØŠy�DÐr   )rI   rJ   rK   r   ÚIntegerFieldrE   rF   rG   ÚDecimalFieldrH   rP   ÚstrrX   r]   r`   rO   r   r   r,   r,   O   sŒ   „ à*�+×*Ñ*°TÔ:€KØ/�{×/Ñ/¸$Ô?ÐØ2˜+×2Ñ2¸TÔBÐØ,�K×,Ñ,Ø a°4ÀDô€M÷#
ñ #
ðJ 3ó ð 3¨¡:ó ð¨s°T©zô r   r,   c                   ó,   — e Zd Z G d„ d«      Zdefd„Zy)ÚDebtorSerializerc                   ó    — e Zd ZeZg d¢ZddgZy)úDebtorSerializer.Meta)r6   ÚtypeÚ	full_nameÚnational_idÚtax_idÚphoneÚemailÚaddressÚcityÚcountryÚmetadatarC   r6   rC   N©rI   rJ   rK   r   rL   rM   rN   rO   r   r   rP   rg   ‘   s   „ Øˆò
ˆð ! ,Ð/Ñr   rP   rQ   c                 óH   — |xs dj                  «       }|st        d«      ‚|S )NrS   u$   Le nom du dÃ©biteur est obligatoire.rT   rV   s     r   Úvalidate_full_namez#DebtorSerializer.validate_full_name£   s(   € Ø’˜"×#Ñ#Ó%ˆÙÜ!Ð"HÓIÐIØˆr   N)rI   rJ   rK   rP   rc   rt   rO   r   r   re   re   �   s   „ ÷0ñ 0ð$¨ô r   re   c                   ó  ‡ — e Zd Z ed¬«      Z ed¬«      Z ej                  dd¬«      Z	 ej                  ddd¬«      Z ej                  ddd¬	«      Z ej                  d¬«      Z ej                  d
d¬«      Z ej                   dej$                  j'                  «       ddd¬«      Z ej                   dej$                  j'                  «       ddd¬«      Z ej                   dej$                  j'                  «       d¬«      Z ej                   dej$                  j'                  «       ddd¬«      Z ej                   dej$                  j'                  «       dd¬«      Zd„ Zˆ fd„Z G d„ d«      Zd„ Z ˆ fd„Z!ˆ fd„Z"ˆ xZ#S )ÚCaseSerializerTr-   Úcustomer_id©Úsourcer.   zcustomer.namerS   )ry   r.   ÚdefaultÚcreditor_id)ry   r.   r3   zassigned_to.usernamer   F)ry   ÚquerysetÚ
write_onlyÚrequiredr3   ÚcreditorÚdebtor)ry   r|   r}   Ú	portfolioÚassigned_to)ry   r|   r~   r3   c                 óŽ   — |j                   r|j                  j                  S |j                  r|j                  j                  S d S rZ   )r{   r   r7   rw   r   )rW   Úobjs     r   Úget_creditor_namez CaseSerializer.get_creditor_nameá   s4   € Ø�?Š?Ø—<‘<×$Ñ$Ð$à$'§O¢Oˆs�|‰|× Ñ Ð=¸Ð=r   c                 óÐ  •— t        ‰| �  |i |¤Ž t        | «      }|€y 	 t        t        |«      | j
                  d   _        	 t        t        |«      | j
                  d   _        	 t        t        |«      | j
                  d   _        	 t        t        |«      | j
                  d   _        y # t        $ r Y Œuw xY w# t        $ r Y Œaw xY w# t        $ r Y ŒMw xY w# t        $ r Y y w xY w)NÚ	debtor_idÚportfolio_idrw   r{   )ÚsuperÚ__init__r   r*   r   rM   r|   r'   r   r   r   )rW   ÚargsÚkwargsr   Ú	__class__s       €r   rŠ   zCaseSerializer.__init__ç   sè   ø€ Ü‰Ñ˜$Ð) &Ò)ä# DÓ)ˆØˆ>Øð	Ü0>¼vÀvÓ0NˆD�K‰K˜Ñ$Ô-ð	Ü3AÄ)ÈVÓ3TˆD�K‰K˜Ñ'Ô0ð	Ü2@ÄÈ6Ó2RˆD�K‰K˜Ñ&Ô/ð	Ü2@ÄÈ6Ó2RˆD�K‰K˜Ñ&Õ/øô ò 	Ùð	ûô
 ò 	Ùð	ûô
 ò 	Ùð	ûô
 ò 	Ùð	úsG    "B, Á"B; Á&"C
 Â	"C Â,	B8Â7B8Â;	CÃCÃ
	CÃCÃ	C%Ã$C%c                   ó    — e Zd ZeZg d¢Zg d¢Zy)úCaseSerializer.Meta)r6   Ú	referenceÚtitleÚstatusr:   ÚcurrencyÚoriginal_amountÚbalance_amountÚdue_dateÚ	opened_atÚ	closed_atr�   rˆ   r   rw   Úcustomer_namer   r{   Úcreditor_namer€   r‡   Úassigned_to_idÚassigned_to_usernamerq   Úcreated_sourceÚnotify_customerÚnotify_creditorÚnotify_debtor)r6   r�   r—   r�   N)rI   rJ   rK   r	   rL   rM   rN   rO   r   r   rP   r�     s   „ Øˆò
ˆò< NÑr   rP   c                 ó`  — t        | «      }|€t        d«      ‚|j                  d«      }|r't        |dd «      |j                  k7  rt        ddi«      ‚|j                  d«      }|�'t        |dd «      |j                  k7  rt        ddi«      ‚| j
                  �)d	|v rt        d
di«      ‚t        | j
                  d	d «      }n-|j                  d	«      xs t        | «      }|€t        d
di«      ‚|€t        d
di«      ‚t        |dd «      }|�||j                  k7  rt        d
di«      ‚||d	<   |S )Nõ.   Tenant non dÃ©tectÃ© sur la requÃªte/contexte.r€   Ú	tenant_idr‡   u.   Ce dÃ©biteur n'appartient pas Ã  votre tenant.r�   rˆ   u1   Ce portefeuille n'appartient pas Ã  votre tenant.r   rw   u=   Le client (customer) d'un dossier ne peut pas Ãªtre modifiÃ©.u<   Le client (customer) est obligatoire pour crÃ©er un dossier.zCustomer introuvable.u6   Ce client (customer) n'appartient pas Ã  votre tenant.)r   r   r   r   r6   Úinstancer    )rW   Úattrsr   r€   r�   r   Úcust_tenant_ids          r   ÚvalidatezCaseSerializer.validate$  sO  € Ü# DÓ)ˆØˆ>Ü!Ð"RÓSÐSð —‘˜8Ó$ˆÙ”g˜f k°4Ó8¸F¿I¹IÒEÜ! ;Ð0`Ð"aÓbÐbà—I‘I˜kÓ*ˆ	ØÐ ¤W¨Y¸ÀTÓ%JÈfÏiÉiÒ%WÜ! >Ð3fÐ"gÓhÐhð �=‰=Ð$Ø˜UÑ"Ü% }Ð6uÐ&vÓwÐwÜ˜tŸ}™}¨j¸$Ó?‰Hà—y‘y Ó,ÒJÔ0DÀTÓ0JˆHØÐÜ% }Ð6tÐ&uÓvÐvàÐÜ! =Ð2IÐ"JÓKÐKô ! ¨;¸Ó=ˆØÐ%¨.¸F¿I¹IÒ*EÜ! =Ð2jÐ"kÓlÐlð %ˆˆjÑàˆr   c                 ó   •— | j                   j                  d«      }d|vrt        | «      }|€t        d«      ‚||d<   |d   }|rt	        |dd «      nd }|r|j
                  r|j                  d|«       |j                  d«      }|rt	        |dd «      nd }|r|j                  «       }n9|r|j
                  rt        ||«      }n|j                  xs dj                  «       }t        ||«      |d	<   t        ‰| �1  |«      S )
Nr   r   r¢   r   rA   r€   rp   ÚXXr�   )r   r   r   r   r   r   Ú
setdefaultr_   r   rp   r   r‰   Úcreate)	rW   Úvalidated_datar   r   r   r€   Údebtor_countryÚcountry_coder�   s	           €r   r«   zCaseSerializer.createL  s   ø€ Ø—,‘,×"Ñ" 9Ó-ˆð ˜>Ñ)Ü'¨Ó-ˆFØˆ~Ü%Ð&VÓWÐWØ'-ˆN˜8Ñ$à Ñ)ˆÙ18Œw�w ¨Ô-¸dˆÙ�D×)Ò)Ø×%Ñ% l°DÔ9ð  ×#Ñ# HÓ-ˆÙ=Cœ ¨°DÔ9ÈˆáØ)×/Ñ/Ó1‰LÙ�d×+Ò+Ü/°°fÓ=‰Là"ŸN™NÒ2¨d×9Ñ9Ó;ˆLä&=¸fÀlÓ&Sˆ�{Ñ#ä‰w‰~˜nÓ-Ð-r   c                 ó$   •— t         ‰| �  ||«      S rZ   )r‰   Úupdate)rW   r¤   r¬   r�   s      €r   r°   zCaseSerializer.updatek  s   ø€ Ü‰w‰~˜h¨Ó7Ð7r   )$rI   rJ   rK   re   r€   r,   r�   r   ra   r   Ú	CharFieldr™   r   ÚSerializerMethodFieldrš   rœ   ÚPrimaryKeyRelatedFieldr   r"   r(   rw   r   r{   r   r‡   r   rˆ   ÚUserr›   r…   rŠ   rP   r§   r«   r°   Ú__classcell__©r�   s   @r   rv   rv   ª   sŸ  ø„ á¨Ô-€FÙ#¨dÔ3€Ið (ˆ{×'Ñ'¨}ÈÔM€HØ)�K×)Ñ)°ÈDÐZ\Ô]€Mð (ˆ{×'Ñ'¨}ÈÐY]Ô^€HØ5�K×5Ñ5ÀÔE€Mà0˜;×0Ñ0Ð8NÐZ^Ô_Ðð 5�+×4Ñ4ØØ×!Ñ!×%Ñ%Ó'ØØØô€Kð 5�+×4Ñ4ØØ×!Ñ!×%Ñ%Ó'ØØØô€Kð 3�×2Ñ2ØØ—‘×#Ñ#Ó%Øô€Ið 6�;×5Ñ5ØØ×"Ñ"×&Ñ&Ó(ØØØô€Lð 8�[×7Ñ7ØØ—‘×!Ñ!Ó#ØØô	€Nò>ô÷6 Nñ  NòD&ôP.÷>8ð 8r   rv   c                   óZ   ‡ — e Zd Z ej                  dd¬«      Z G d„ d«      Zˆ fd„Zˆ xZS )ÚCaseNoteSerializerzauthor.usernameTrx   c                   ó    — e Zd ZeZg d¢Zg d¢Zy)úCaseNoteSerializer.Meta)r6   ÚcaseÚauthorÚauthor_usernameÚbodyrC   rD   )r6   r»   rC   rD   r¼   r½   N)rI   rJ   rK   r
   rL   rM   rN   rO   r   r   rP   rº   r  s   „ ØˆÚ`ˆÚbÑr   rP   c                 ó    •— | j                   j                  d«      }|rt        |dd «      nd }|r|j                  r||d<   t        ‰| �  |«      S )Nr   r   r¼   ©r   r   r   r   r‰   r«   ©rW   r¬   r   r   r�   s       €r   r«   zCaseNoteSerializer.createw  sM   ø€ Ø—,‘,×"Ñ" 9Ó-ˆÙ18Œw�w ¨Ô-¸dˆÙ�D×)Ò)Ø'+ˆN˜8Ñ$Ü‰w‰~˜nÓ-Ð-r   )	rI   rJ   rK   r   r±   r½   rP   r«   rµ   r¶   s   @r   r¸   r¸   o  s/   ø„ Ø+�k×+Ñ+Ð3DÐPTÔU€O÷cñ c÷
.ð .r   r¸   c                   ó‚   ‡ — e Zd Z ej                  dd¬«      Z ej                  «       Z G d„ d«      Zd„ Z	ˆ fd„Z
ˆ xZS )ÚCaseDocumentSerializerzuploaded_by.usernameTrx   c                   ó    — e Zd ZeZg d¢Zg d¢Zy)úCaseDocumentSerializer.Meta)	r6   r»   r‘   Údoc_typeÚfileÚfile_urlÚuploaded_byÚuploaded_by_usernamerC   )r6   r»   rC   rÉ   rÊ   rÈ   N)rI   rJ   rK   r   rL   rM   rN   rO   r   r   rP   rÅ   ƒ  s   „ Øˆò

ˆò kÑr   rP   c                 óÌ   — | j                   j                  d«      }|j                  sy |r%|j                  |j                  j                  «      S |j                  j                  S )Nr   )r   r   rÇ   Úbuild_absolute_uriÚurl)rW   r„   r   s      r   Úget_file_urlz#CaseDocumentSerializer.get_file_url’  sJ   € Ø—,‘,×"Ñ" 9Ó-ˆØ�xŠxØÙØ×-Ñ-¨c¯h©h¯l©lÓ;Ð;Ø�x‰x�|‰|Ðr   c                 ó    •— | j                   j                  d«      }|rt        |dd «      nd }|r|j                  r||d<   t        ‰| �  |«      S )Nr   r   rÉ   rÀ   rÁ   s       €r   r«   zCaseDocumentSerializer.createš  sM   ø€ Ø—,‘,×"Ñ" 9Ó-ˆÙ18Œw�w ¨Ô-¸dˆÙ�D×)Ò)Ø,0ˆN˜=Ñ)Ü‰w‰~˜nÓ-Ð-r   )rI   rJ   rK   r   r±   rÊ   r²   rÈ   rP   rÎ   r«   rµ   r¶   s   @r   rÃ   rÃ     sE   ø„ Ø0˜;×0Ñ0Ð8NÐZ^Ô_ÐØ0ˆ{×0Ñ0Ó2€H÷kñ kò÷.ð .r   rÃ   c                   ó    — e Zd Z G d„ d«      Zy)ÚCustomerPortalDebtorSerializerc                   ó    — e Zd ZeZg d¢ZddgZy)ú#CustomerPortalDebtorSerializer.Meta)
r6   rh   ri   rl   rm   rn   ro   rp   rq   rC   r6   rC   Nrr   rO   r   r   rP   rÓ   £  s   „ Øˆò
ˆð
 ! ,Ð/Ñr   rP   N)rI   rJ   rK   rP   rO   r   r   rÑ   rÑ   ¢  s   „ ÷0ò 0r   rÑ   c                   ó<  — e Zd ZdZ ej
                  «       Z ej                  «       Z ej                  ddd¬«      Z	 ej                  ddd¬«      Z
 ej                  ddd¬«      Z ej                  «       Z ej                  «       Z ej                  d¬«      Zy)ÚCustomerPortalUserSerializeruË   
    ReprÃ©sentation minimale dâ€™un user local cÃ´tÃ© client portal.
    Tu peux baser Ã§a sur ton modÃ¨le rÃ©el (Membership client portal),
    mais ici on standardise le format renvoyÃ© au front.
    FT)r~   r3   Úallow_blank)r~   N)rI   rJ   rK   Ú__doc__r   ra   r6   r±   ÚusernameÚ
first_nameÚ	last_nameÚ
EmailFieldrm   Úroler’   ÚDateTimeFieldrC   rO   r   r   rÕ   rÕ   ­  s    „ ñð
 
"ˆ×	!Ñ	!Ó	#€BØ$ˆ{×$Ñ$Ó&€HØ&�×&Ñ&°À$ÐTXÔY€JØ%�×%Ñ%¨uÀÐSWÔX€IØ"ˆK×"Ñ"¨E¸dÐPTÔU€Eà ˆ;× Ñ Ó"€DØ"ˆ[×"Ñ"Ó$€FØ*�×*Ñ*°EÔ:�Jr   rÕ   N)!Údjango.contrib.authr   Úrest_frameworkr   Úrest_framework.exceptionsr   Úaccounts.tenant_contextr   Úcases.modelsr   r   r	   r
   r   Úcases.referencer   r   Úcustomers.modelsr   r   r´   Ú
Serializerr   r    r*   ÚModelSerializerr,   re   rv   r¸   rÃ   rÑ   rÕ   rO   r   r   ú<module>rç      sÑ   ðå .Ý &Ý 5å >ß HÕ Hß Iß /áÓ€ð0 ;×#9Ñ#9ó 0ð0 [×%;Ñ%;ó ò4ô>˜+×5Ñ5ô >ôB�{×2Ñ2ô ô4B8�[×0Ñ0ô B8ôJ.˜×4Ñ4ô .ô  .˜[×8Ñ8ô  .ôF0 [×%@Ñ%@ô 0ô; ;×#9Ñ#9õ ;r   