Ë
    DîiQ/  ã                   ó  — d Z ddlZddlZddlZddl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 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 ddlmZmZ ddlmZ  G d„ de«      Z  G d„ de«      Z! G d„ de«      Z" G d„ de«      Z#y)uF   tenancy/views.py â€” Tenant CRUD (super admin) + License + Export CSV.é    N)ÚHttpResponse)Úget_object_or_404)Útimezone©Ústatus)Úapi_viewÚpermission_classes)ÚIsAuthenticated)ÚResponse)ÚAPIView)ÚModelViewSeté   )ÚTenantÚTenantLicense)ÚTenantSerializerÚTenantLicenseSerializer)ÚIsSuperUserc                   ój   — e Zd Zej                  j                  «       j                  d«      ZeZ	e
egZy)ÚTenantViewSetz-created_atN)Ú__name__Ú
__module__Ú__qualname__r   ÚobjectsÚallÚorder_byÚquerysetr   Úserializer_classr
   r   r	   © ó    ú"/var/www/html/acx/tenancy/views.pyr   r      s0   „ Ø�~‰~×!Ñ!Ó#×,Ñ,¨]Ó;€HØ'ÐØ)¨;Ð7Ñr   r   c                   ó   ‡ — e Zd Zˆ fd„Zˆ xZS )ÚSuperAdminOnlyc                 ó†   •— t         ‰| �  ||«      }|xr- t        |j                  xr |j                  j                  «      S ©N)ÚsuperÚhas_permissionÚboolÚuserÚis_superuser)ÚselfÚrequestÚviewÚokÚ	__class__s       €r    r&   zSuperAdminOnly.has_permission!   s7   ø€ Ü‰WÑ# G¨TÓ2ˆØÒF”d˜7Ÿ<™<ÒE¨G¯L©L×,EÑ,EÓFÐFr   )r   r   r   r&   Ú__classcell__)r.   s   @r    r"   r"       s   ø„ ÷Gð Gr   r"   c                   ó6   — e Zd ZdZeegZd„ Zd„ Zd„ Z	d„ Z
d„ Zy)ÚTenantLicenseViewuÄ   
    GET  /api/tenants/{id}/license/   â†’ lecture licence
    POST /api/tenants/{id}/license/   â†’ crÃ©ation ou remplacement
    PATCH /api/tenants/{id}/license/  â†’ mise Ã  jour partielle
    c                 ó$   — t        t        |¬«      S )N©Úpk)r   r   )r*   r4   s     r    Ú_get_tenantzTenantLicenseView._get_tenant0   s   € Ü ¤¨BÔ/Ð/r   c                 óâ   — | j                  |«      }	 |j                  }t	        t        |«      j                  «      S # t        j                  $ r t	        d t
        j                  ¬«      cY S w xY w©Nr   )	r5   Úlicenser   ÚDoesNotExistr   r   ÚHTTP_200_OKr   Údata)r*   r+   r4   ÚtenantÚlics        r    ÚgetzTenantLicenseView.get3   sc   € Ø×!Ñ! "Ó%ˆð	=Ø—.‘.ˆCô Ô/°Ó4×9Ñ9Ó:Ð:øô ×)Ñ)ò 	=Ü˜D¬×);Ñ);Ô<Ò<ð	=ús   “= ½.A.Á-A.c                 ó†  — | j                  |«      }	 |j                  }t        ||j                  d¬«      }|j                  d¬«       |j                  ||j                  ¬«      }t        t        |«      j                  t        j                  ¬«      S # t        j
                  $ r t        |j                  ¬«      }Y Œˆw xY w)NF©r;   Úpartial)r;   T©Úraise_exception)r<   Ú
created_byr   )r5   r8   r   r;   r   r9   Úis_validÚsaver(   r   r   r:   ©r*   r+   r4   r<   r=   Úsers         r    ÚpostzTenantLicenseView.post;   sœ   € Ø×!Ñ! "Ó%ˆð	=Ø—.‘.ˆCÜ)¨#°G·L±LÈ%ÔPˆCð 	�‰ TˆÔ*Ø�h‰h˜f°·±ˆhÓ>ˆÜÔ/°Ó4×9Ñ9Ä&×BTÑBTÔUÐUøô ×)Ñ)ò 	=Ü)¨w¯|©|Ô<ŠCð	=ús   “$B Â)C Â?C c                 óZ  — | j                  |«      }	 |j                  }t        ||j                  d¬«      }|j                  d¬«       |j                  «        t	        t        |«      j                  «      S # t        j                  $ r  t	        ddit
        j                  ¬«      cY S w xY w)NÚdetailzAucune licence.r   Tr@   rB   )r5   r8   r   r9   r   r   ÚHTTP_404_NOT_FOUNDr   r;   rE   rF   rG   s         r    ÚpatchzTenantLicenseView.patchH   s•   € Ø×!Ñ! "Ó%ˆð	]Ø—.‘.ˆCô & c°·±ÀdÔKˆØ�‰ TˆÔ*Ø�‰Œ
ÜÔ/°Ó4×9Ñ9Ó:Ð:øô ×)Ñ)ò 	]Ü˜XÐ'8Ð9Ä&×B[ÑB[Ô\Ò\ð	]ús   “A7 Á70B*Â)B*c                 óÀ   — | j                  |«      }	 |j                  j                  «        t        t        j                  ¬«      S # t        j                  $ r Y Œ/w xY wr7   )r5   r8   Údeleter   r9   r   r   ÚHTTP_204_NO_CONTENT)r*   r+   r4   r<   s       r    rO   zTenantLicenseView.deleteS   sT   € Ø×!Ñ! "Ó%ˆð	Ø�N‰N×!Ñ!Ô#ô œv×9Ñ9Ô:Ð:øô ×)Ñ)ò 	Ùð	ús   “A ÁAÁAN)r   r   r   Ú__doc__r
   r   r	   r5   r>   rI   rM   rO   r   r   r    r1   r1   (   s.   „ ñð
 *¨;Ð7Ðò0ò;òVò	;ó;r   r1   c                   ó”   — e Zd ZdZeegZd„ Zede	fd„«       Z
de	fd„Zde	fd„Zde	fd„Zde	fd„Zde	fd	„Zde	fd
„Zde	fd„Zde	fd„Zy)ÚTenantExportViewud   
    GET /api/tenants/{id}/export/
    Retourne un ZIP contenant les donnÃ©es du tenant en CSV.
    c                 óÄ  — t        t        |¬«      }t        j                  «       }t	        j
                  |dt        j                  «      5 }|j                  d| j                  |«      «       |j                  d| j                  |«      «       |j                  d| j                  |«      «       |j                  d| j                  |«      «       |j                  d| j                  |«      «       |j                  d| j                  |«      «       |j                  d	| j                  |«      «       |j                  d
| j                  |«      «       d d d «       |j!                  d«       |j"                  xs d|j$                  › �}t'        j(                  «       j+                  d«      }t-        |j/                  «       d¬«      }d|› d|› d�|d<   |S # 1 sw Y   ŒƒxY w)Nr3   Úwz	cases.csvzdebtors.csvzportfolios.csvzcustomers.csvzpayments.csvzcollection_actions.csvztreasury_movements.csvz	users.csvr   Útenant_z%Y%m%dzapplication/zip)Úcontent_typezattachment; filename="export_Ú_z.zip"zContent-Disposition)r   r   ÚioÚBytesIOÚzipfileÚZipFileÚZIP_DEFLATEDÚwritestrÚ_export_casesÚ_export_debtorsÚ_export_portfoliosÚ_export_customersÚ_export_paymentsÚ_export_actionsÚ_export_treasuryÚ_export_usersÚseekÚslugÚidr   ÚnowÚstrftimer   Úread)	r*   r+   r4   r<   ÚbufÚzfrh   ÚdateÚresps	            r    r>   zTenantExportView.gete   s„  € Ü"¤6¨bÔ1ˆÜ�j‰j‹lˆä�_‰_˜S #¤w×';Ñ';Ó<ð 	LÀØ�K‰K˜°×0BÑ0BÀ6Ó0JÔKØ�K‰K˜°×0DÑ0DÀVÓ0LÔMØ�K‰KÐ(°×0GÑ0GÈÓ0OÔPØ�K‰K˜°×0FÑ0FÀvÓ0NÔOØ�K‰K˜°×0EÑ0EÀfÓ0MÔNØ�K‰KÐ0°$×2FÑ2FÀvÓ2NÔOØ�K‰KÐ0°$×2GÑ2GÈÓ2OÔPØ�K‰K˜°×0BÑ0BÀ6Ó0JÔK÷	Lð 	�‰�ŒØ�{‰{Ò3 ¨¯	©	 {Ð3ˆÜ�|‰|‹~×&Ñ& xÓ0ˆÜ˜CŸH™H›JÐ5FÔGˆØ(EÀdÀVÈ1ÈTÈFÐRWÐ&XˆÐ"Ñ#Øˆ÷	Lð 	Lús   ÁD	GÇGÚreturnc                 ó¸   — t        j                  «       }t        j                  |«      }|j	                  | «       |j                  |«       |j                  «       S r$   )rY   ÚStringIOÚcsvÚwriterÚwriterowÚ	writerowsÚgetvalue)ÚheadersÚrowsÚoutrU   s       r    Ú_csvzTenantExportView._csv|   s>   € ä�k‰k‹mˆÜ�J‰J�s‹OˆØ	�
‰
�7ÔØ	�‰�DÔØ�|‰|‹~Ðr   c                 óÞ  — 	 ddl m} |j                  j                  |¬«      j	                  ddd«      }g d¢}|D �cg c]ð  }|j
                  |j                  |j                  |j                  |j                  |j                  xs d|j                  |j                  |j                  xs d|j                  rt        |j                  «      nd|j                   r|j                   j"                  nd|j$                  r|j$                  j&                  nd|j(                  j+                  «       g‘Œò }}| j-                  ||«      S c c}w # t.        $ r | j-                  d	gd
gg«      cY S w xY w)Nr   )ÚCase©r<   ÚdebtorÚ	portfolioÚassigned_to)ri   Ú	referenceÚtitler   ÚpriorityÚcurrencyÚoriginal_amountÚbalance_amountÚdue_dater€   r�   r‚   Ú	opened_atÚ Úerrorzcases export unavailable)Úcases.modelsr~   r   ÚfilterÚselect_relatedri   rƒ   r„   r   r…   r†   r‡   rˆ   r‰   r€   Ústrr�   Únamer‚   ÚusernamerŠ   Ú	isoformatr|   Ú	Exception)r*   r<   r~   Úqsry   Úcrz   s          r    r_   zTenantExportView._export_cases„   s6  € ð	HÝ)Ø—‘×$Ñ$¨FÐ$Ó3×BÑBÀ8È[ÐZgÓhˆBòJˆGð öð ð —‘�q—{‘{ A§G¡G¨Q¯X©X°q·z±zÀ1Ç:Á:ÒCSÐQSØ×"Ñ" A×$4Ñ$4°a·j±jÒ6FÀBØ"#§(¢(”�Q—X‘X”°Ø%&§[¢[�—‘×!Ò!°bØ+,¯=ª=�—‘×'Ò'¸bØ—‘×&Ñ&Ó(ò*ðˆDð ð —9‘9˜W dÓ+Ð+ùòøô ò 	HØ—9‘9˜g˜YÐ*DÐ)EÐ(FÓGÒGð	Hús#   ‚;E ½C5EÄ2E ÅE ÅE,Å+E,c                 óö  — 	 ddl m} |j                  j                  |¬«      }g d¢}|D �cg c]�  }|j                  t        |dt        |«      «      t        |dd«      xs dt        |dd«      xs dt        |d	d«      xs dt        |d
d«      xs dt        |dd«      xs d|j                  j                  «       g‘Œ� }}| j                  ||«      S c c}w # t        $ r | j                  dgdgg«      cY S w xY w)Nr   )ÚDebtorr   )ri   Ú	full_nameÚemailÚphoneÚaddressÚcityÚcountryÚ
created_atr™   rš   r‹   r›   rœ   r�   rž   rŒ   zdebtors export unavailable)r�   r˜   r   rŽ   ri   Úgetattrr�   rŸ   r“   r|   r”   )r*   r<   r˜   r•   ry   Údrz   s          r    r`   z TenantExportView._export_debtors˜   s  € ð	JÝ+Ø—‘×&Ñ&¨fÐ&Ó5ˆBÚgˆGð öð
 ð	 —‘”w˜q +¬s°1«vÓ6Ü˜˜G RÓ(Ò.¨B´¸¸7ÀBÓ0GÒ0MÈ2Ü˜˜I rÓ*Ò0¨b´'¸!¸VÀRÓ2HÒ2NÈBÜ˜˜I rÓ*Ò0¨b°!·,±,×2HÑ2HÓ2JòLðˆDð ð —9‘9˜W dÓ+Ð+ùòøô ò 	JØ—9‘9˜g˜YÐ*FÐ)GÐ(HÓIÒIð	Jús#   ‚*C ¬BCÂ>C ÃC ÃC8Ã7C8c                 ó,  — 	 ddl m} |j                  j                  |¬«      j	                  d«      }g d¢}|D �cg c]™  }|j
                  |j                  |j                  xs d|j                  xs d|j                  |j                  xs d|j                  |j                  r|j                  j                  nd|j                  j                  «       g	‘Œ› }}| j!                  ||«      S c c}w # t"        $ r | j!                  dgdgg«      cY S w xY w)	Nr   )Ú	Portfolior   Úowner)	ri   r‘   ÚcodeÚcategoryr…   Údefault_currencyÚ	is_activer¤   rŸ   r‹   rŒ   zportfolios export unavailable)r�   r£   r   rŽ   r�   ri   r‘   r¥   r¦   r…   r§   r¨   r¤   r’   rŸ   r“   r|   r”   )r*   r<   r£   r•   ry   Úprz   s          r    ra   z#TenantExportView._export_portfolios¨   s   € ð	MÝ.Ø×"Ñ"×)Ñ)°Ð)Ó8×GÑGÈÓPˆBò;ˆGð öð ð —‘�q—v‘v˜qŸv™vš|¨¨Q¯Z©ZÒ-=¸2¸q¿z¹zØ×#Ñ#Ò) rØ—‘Ø%&§W¢W�—‘×!Ò!°"Ø—‘×'Ñ'Ó)ò	+ðˆDð ð —9‘9˜W dÓ+Ð+ùòøô ò 	MØ—9‘9˜g˜YÐ*IÐ)JÐ(KÓLÒLð	Mús#   ‚9C2 »BC-ÃC2 Ã-C2 Ã2DÄDc                 óÎ  — 	 ddl m} |j                  j                  |¬«      }g d¢}|D �cg c]y  }|j                  t        |dt        |«      «      t        |dd«      t        |dd«      t        |d	d«      t        |d
d«      t        |dd«      |j                  j                  «       g‘Œ{ }}| j                  ||«      S c c}w # t        $ r | j                  dgdgg«      cY S w xY w)Nr   )ÚCustomerr   )ri   r‘   r¥   rš   r›   rž   r   rŸ   r‘   r¥   r‹   rš   r›   rž   r   rŒ   zcustomers export unavailable)Úcustomers.modelsr«   r   rŽ   ri   r    r�   rŸ   r“   r|   r”   )r*   r<   r«   r•   ry   r–   rz   s          r    rb   z"TenantExportView._export_customersº   sñ   € ð	LÝ1Ø×!Ñ!×(Ñ(°Ð(Ó7ˆBÚaˆGð öð
 ð	 —‘”w˜q &¬#¨a«&Ó1Ü˜˜F BÓ'¬°°G¸RÓ)@Ü˜˜G RÓ(¬'°!°YÀÓ*CÜ˜˜H bÓ)¨1¯<©<×+AÑ+AÓ+CòEðˆDð ð —9‘9˜W dÓ+Ð+ùòøô ò 	LØ—9‘9˜g˜YÐ*HÐ)IÐ(JÓKÒKð	Lús#   ‚*C ¬A>B>Â*C Â>C ÃC$Ã#C$c                 ó^  — 	 ddl m} |j                  j                  |¬«      j	                  d«      }g d¢}|D �cg c]²  }|j
                  |j                  r|j                  j                  nd|j                  t        |dd«      |j                  |j                  xs d|j                  xs d|j                  r|j                  j                  «       nd|j                  j                  «       g	‘Œ´ }}| j                  ||«      S c c}w # t         $ r | j                  dgd	gg«      cY S w xY w)
Nr   )ÚPaymentr   Úcase)	ri   Úcase_referenceÚamountr†   ÚmethodÚreceived_byrƒ   Úpaid_atrŸ   r‹   r†   rŒ   zpayments export unavailable)Úcollections_management.modelsr®   r   rŽ   r�   ri   r¯   rƒ   r±   r    r²   r³   r´   r“   rŸ   r|   r”   )r*   r<   r®   r•   ry   r©   rz   s          r    rc   z!TenantExportView._export_paymentsÊ   s  € ð	KÝ=Ø—‘×'Ñ'¨vÐ'Ó6×EÑEÀfÓMˆBòLˆGð öð ð —‘Ø%&§V¢V�—‘×!Ò!°Ø—‘œ7 1 j°"Ó5Ø—‘˜1Ÿ=™=Ò.¨BØ—‘Ò" ¸Q¿YºY A§I¡I×$7Ñ$7Ô$9ÈBØ—‘×'Ñ'Ó)ò+ðˆDð ð —9‘9˜W dÓ+Ð+ùòøô ò 	KØ—9‘9˜g˜YÐ*GÐ)HÐ(IÓJÒJð	Kús#   ‚9D »B7DÃ2D ÄD ÄD,Ä+D,c                 ó8  — 	 ddl m} |j                  j                  |¬«      j	                  d«      }g d¢}|D �cg c]Ÿ  }|j
                  t        |d«      r"|j                  r|j                  j                  ndt        |dd«      t        |dd«      t        |d	d«      t        |d
|j                  «      j                  «       |j                  j                  «       g‘Œ¡ }}| j                  ||«      S c c}w # t        $ r | j                  dgdgg«      cY S w xY w)Nr   )ÚCollectionActionr   r¯   )ri   r°   Úaction_typeÚoutcomeÚsummaryÚperformed_atrŸ   r‹   r¸   r¹   rº   r»   rŒ   zactions export unavailable)rµ   r·   r   rŽ   r�   ri   Úhasattrr¯   rƒ   r    rŸ   r“   r|   r”   )r*   r<   r·   r•   ry   Úarz   s          r    rd   z TenantExportView._export_actionsÝ   s  € ð	JÝFØ!×)Ñ)×0Ñ0¸Ð0Ó?×NÑNÈvÓVˆBò5ˆGð öð ð —‘Ü%,¨Q°Ô%7¸A¿FºF�—‘×!Ò!ÈÜ˜˜M¨2Ó.´¸¸9ÀbÓ0IÜ˜˜I rÓ*Ü˜˜N¨A¯L©LÓ9×CÑCÓEØ—‘×'Ñ'Ó)ò+ðˆDð ð —9‘9˜W dÓ+Ð+ùòøô ò 	JØ—9‘9˜g˜YÐ*FÐ)GÐ(HÓIÒIð	Jús#   ‚9C8 »B$C3ÃC8 Ã3C8 Ã8DÄDc                 ó�  — 	 ddl m} |j                  j                  |¬«      j	                  d«      }g d¢}|D �cg c]Ë  }|j
                  |j                  r|j                  j                  nd|j                  |j                  |j                  |j                  |j                  r|j                  j                  «       nd|j                  xs d|j                  xs d|j                   xs d|j"                  j                  «       g‘ŒÍ }}| j%                  ||«      S c c}w # t&        $ r | j%                  dgdgg«      cY S w xY w)	Nr   )ÚTreasuryMovementr   Úaccount)ri   rÀ   Ú	directionr   r±   r†   Ú
value_dateÚlabelrƒ   ÚsourcerŸ   r‹   rŒ   ztreasury export unavailable)Útreasury_management.modelsr¿   r   rŽ   r�   ri   rÀ   r‘   rÁ   r   r±   r†   rÂ   r“   rÃ   rƒ   rÄ   rŸ   r|   r”   )r*   r<   r¿   r•   ry   Úmrz   s          r    re   z!TenantExportView._export_treasuryð   s  € ð	KÝCØ!×)Ñ)×0Ñ0¸Ð0Ó?×NÑNÈyÓYˆBòSˆGð öð ð —‘Ø#$§9¢9�—‘—’°"Ø—‘˜aŸh™h¨¯©°!·*±*Ø-.¯\ª\�—‘×'Ñ'Ô)¸rØ—‘’˜B §¡Ò 1¨r°1·8±8²>¸rØ—‘×'Ñ'Ó)ò+ðˆDð ð —9‘9˜W dÓ+Ð+ùòøô ò 	KØ—9‘9˜g˜YÐ*GÐ)HÐ(IÓJÒJð	Kús#   ‚9D$ »CDÄD$ ÄD$ Ä$EÅEc                 ó¦  — 	 ddl m} |j                  j                  |¬«      j	                  d«      j                  d«      }g d¢}|D �cg c]Ç  }|j                  j                  |j                  j                  |j                  j                  |j                  j                  |j                  j                  |j                  j                  |j                  |j                  dj                  d„ |j                   j#                  «       D «       «      g	‘ŒÉ }}| j%                  ||«      S c c}w # t&        $ r | j%                  d	gd
gg«      cY S w xY w)Nr   )Ú
Membershipr   r(   Úroles)	Úuser_idr’   rš   Ú
first_nameÚ	last_namer¨   Úmembership_statusÚis_ownerrÉ   Ú|c              3   óF   K  — | ]  }t        |j                  «      –— Œ y ­wr$   )r�   ri   )Ú.0Úrs     r    ú	<genexpr>z1TenantExportView._export_users.<locals>.<genexpr>  s   è ø€ Ò;¨œ#˜aŸd™dŸ)Ñ;ùs   ‚!rŒ   zusers export unavailable)Úaccounts.modelsrÈ   r   rŽ   r�   Úprefetch_relatedr(   ri   r’   rš   rË   rÌ   r¨   r   rÎ   ÚjoinrÉ   r   r|   r”   )r*   r<   rÈ   r•   ry   rÆ   rz   s          r    rf   zTenantExportView._export_users  s  € ð	HÝ2Ø×#Ñ#×*Ñ*°&Ð*Ó9×HÑHÈÓP×aÑaÐbiÓjˆBòNˆGð öð
 ð	 —‘—‘˜AŸF™FŸO™O¨Q¯V©V¯\©\Ø—‘×"Ñ" A§F¡F×$4Ñ$4°a·f±f×6FÑ6FØ—‘˜1Ÿ:™:Ø—‘Ñ;¨Q¯W©W¯[©[«]Ô;Ó;ò=ðˆDð ð —9‘9˜W dÓ+Ð+ùòøô ò 	HØ—9‘9˜g˜YÐ*DÐ)EÐ(FÓGÒGð	Hús%   ‚AD/ Á
CD*ÄD/ Ä*D/ Ä/EÅEN)r   r   r   rQ   r
   r   r	   r>   Ústaticmethodr�   r|   r_   r`   ra   rb   rc   rd   re   rf   r   r   r    rS   rS   ^   s¤   „ ñð *¨;Ð7Ðòð. ð˜sò ó ððH só Hð(J¨ó Jð M¨Có Mð$L¨3ó Lð K¨#ó Kð&J¨ó Jð&K¨#ó Kð&H sô Hr   rS   )$rQ   rt   rY   r[   ÚdatetimeÚdjango.httpr   Údjango.shortcutsr   Údjango.utilsr   Úrest_frameworkr   Úrest_framework.decoratorsr   r	   Úrest_framework.permissionsr
   Úrest_framework.responser   Úrest_framework.viewsr   Úrest_framework.viewsetsr   Úmodelsr   r   Úserializersr   r   Úpermissionsr   r   r"   r1   rS   r   r   r    ú<module>rå      so   ðÙ Lã 
Û 	Û Û å $Ý .Ý !å !ß BÝ 6Ý ,Ý (Ý 0ç )ß BÝ $ô
8�Lô 8ôG�_ô Gô1;˜ô 1;ôltH�wõ tHr   