U
    ÿÆj©¤  ã                   @   s  d dl mZ d dlmZ d dlZd dlZG dd„ dejƒZG dd„ dejƒZ	G dd	„ d	ejƒZ
G d
d„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZd dl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#Zd$Zd%Zd&Z G d'd(„ d(ejƒZ!G d)d*„ d*ejƒZ"G d+d,„ d,ejƒZ#d dl$Z$d dl%Z%d dl&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. d d0l/m0Z0 d1Z1d2Z2e1d3fe2d4fgZ3e*d5d6ƒZ4e*d7d8ƒZ5e*d9d:ƒZ6e*d;d<ƒZ7e*d=d>ƒZ8e*d?d@ƒZ9e*dAdBƒZ:e*dCdDƒZ;dEdF„ Z<G dGdH„ dHejƒZ=G dIdJ„ dJejƒZ>G dKdL„ dLejƒZ?G dMdN„ dNejƒZ@dOdP„ ZAdQdRdSdTdUdVdWgZBG dXdY„ dYejƒZCe0e.eCdZ�d[d\„ ƒZDdS )]é    )Úmodels)ÚUserNc                   @   sb  e Zd Zejeejdddd�Zejddd�Z	ejddd�Z
ejddd�Zejddd�Zejddd�Zejddd�Zejddddd�Zejddd�Zejddd�Zejddd�Zejdd	�Zejdddd
�Zejdddd
�Zejddd�Zejddd�Zejddd�Zejdddd
�Zejdd�Zejdd�Zejdd�Zej dd�Z!ej dd�Z"G dd„ dƒZ#dS )ÚProfilesTZuser_profiles©Ú	on_deleteÚnullÚblankÚrelated_nameéÿ   ©Ú
max_lengthr   úuploads/ú../static/dummy.png©Ú	upload_tor   r   Údefault©r   )r   r   r   r   ©r   é   ©Úauto_now_add©Úauto_nowc                   @   s   e Zd ZdZdS )zProfiles.MetaÚprofileN©Ú__name__Ú
__module__Ú__qualname__Údb_table© r   r   ú,/var/www/html/Manju/school/./myapp/models.pyÚMeta0   s   r!   N)$r   r   r   r   Ú
ForeignKeyr   ÚCASCADEÚuserÚ	CharFieldÚnameÚphoneÚemailÚaddressZservicenameZgenderÚ	FileFieldÚprofilesÚpasswordZ	gstnumberÚpincodeÚ	DateFieldÚdojÚgstZcompanylogoZ
alteremailZalteremail1Zalteremail2ÚpanÚSmallIntegerFieldÚroleÚstatusZ	geostatusÚDateTimeFieldÚ
created_atÚ
updated_atr!   r   r   r   r    r      s0   r   c                   @   s„   e Zd Zejddd�Zejdd�Zejdd�Z	ej
eejdddd�Zej
eejddd	d�Zejdd
�Zejdd�ZG dd„ dƒZdS )Ú
Departmentr
   Tr   r   r   r   Zdeartment_created_byr   Zdepartment_updated_byr   r   c                   @   s   e Zd ZdZdgZdS )zDepartment.MetaÚ
departmentÚpkN©r   r   r   r   Úorderingr   r   r   r    r!   B   s   r!   N)r   r   r   r   r%   r&   Ú	TextFieldÚdescriptionr2   r4   r"   r   r#   Ú
created_byÚ
updated_byr5   r6   r7   r!   r   r   r   r    r8   7   s   ÿÿr8   c                   @   s˜   e Zd Zejeejddd�Zejddd�Z	ej
dd�Zejdd�Zejeejdddd	�Zejeejddd
d	�Zejdd�Zejdd�ZG dd„ dƒZdS )ÚDesignationT©r   r   r   r
   r   r   r   r   Zdesignation_created_byr   Zdesignation_updated_byr   r   c                   @   s   e Zd ZdZdgZdS )zDesignation.MetaÚdesignationr:   Nr;   r   r   r   r    r!   X   s   r!   N)r   r   r   r   r"   r8   r#   r9   r%   r&   r=   r>   r2   r4   r   r?   r@   r5   r6   r7   r!   r   r   r   r    rA   L   s   ÿÿrA   c                   @   sÒ  e Zd Zejeejdddd�Zejdd�Z	ejddd�Z
ejddd�Zejddd�Zejd	ddd
d�Zejddd�Zejddd�Zejdddd�Zejdddd�Zejdddd�Zejdddd�Zejdddd�Zejdddd�Zejdddd�Zejdddd�Zejdddd�Zejdddd�Zejdddd�Zejdddd�Zejdej ddd�Z!ejdej ddd�Z"ej#dd�Z$ej%dd�Z&ejeejdddd�Z'ej(dd�Z)ej(dd�Z*dd„ Z+dd „ Z,G d!d"„ d"ƒZ-d#S )$ÚEmployeeTZemployees_profilesr   r
   ©r   é   )r   Úunique©r   r   r   r   r   é
   é   ç        ©Ú
max_digitsÚdecimal_placesr   g      j@g      œ@r8   Ú	employees©r   r   r	   rA   zDate of Joining)Úverbose_namer   r   Zemployee_created_byr   r   c                 C   s   t  | ¡ ¡| _|  ¡  d S ©N)ÚjsonÚdumpsÚtolistÚface_encoding_dataÚsave)ÚselfZencoding_arrayr   r   r    Úsave_encoding˜   s    zEmployee.save_encodingc                 C   s   | j rt t | j ¡¡S d S rR   )rV   ÚnpÚarrayrS   Úloads©rX   r   r   r    Úget_encoding�   s    zEmployee.get_encodingc                   @   s   e Zd ZdZdgZdS )zEmployee.MetarO   ú-created_atNr;   r   r   r   r    r!   ¢   s   r!   N).r   r   r   r   r"   r   r#   Úusersr%   r&   ÚmobileÚIntegerFieldÚager=   r)   r*   ZphotorV   r1   ÚDecimalFieldÚctcZgrossSalaryÚbasicÚhraÚ
conveyanceZotherAllowanceZfixedPTZpfLimitÚadvanceÚotÚreimbursementÚ	incentiveÚSET_NULLr9   rC   r.   r/   r2   r4   r?   r5   r6   r7   rY   r^   r!   r   r   r   r    rD   \   s\   üü   þrD   c                   @   s    e Zd Zejdejddd�Zejeejddd�Zej	dd�Z
dZejddd	�Zejddd	�Zejd
ed�Zejdd�Zejdd�Zejdd�ZG dd„ dƒZdS )Ú
AttendancerD   TZattendance_recordsrP   rB   Fr   ))ÚPresentro   )ÚAbsentrp   rH   rI   )r   Úchoicesr   r   c                   @   s   e Zd ZdZdS )zAttendance.MetaZ
attendanceNr   r   r   r   r    r!   Å   s   r!   N)r   r   r   r   r"   r#   Úemployeer   r$   r.   ÚdateZATTENDANCE_STATUSÚ	TimeFieldZin_timeZout_timer%   r4   r=   Úlocationr5   r6   r7   r!   r   r   r   r    rn   §   s   
þrn   c                   @   sn   e Zd Zejdd�Zejddd�Zejdd�Z	ej
eejdddd�Zejdd�Zejdd	�ZG d
d„ dƒZdS )ÚAnnouncementTr   rH   r   r   Zannouncements_created_byr   r   r   c                   @   s   e Zd ZdZdS )zAnnouncement.MetaZannouncementNr   r   r   r   r    r!   Õ   s   r!   N)r   r   r   r   r=   r>   r.   rs   r2   r4   r"   r   r#   r?   r5   r6   r7   r!   r   r   r   r    rv   Ì   s   ÿrv   c                   @   s–   e Zd Zejddd�Zejdd�Zejddd�Zej	ddd�Z
ejdd�Zejdd�Zejeejdddd	�Zejdd
�Zejdd�ZG dd„ dƒZdS )ÚLeaveRequestr
   Tr   r   ©r   r   r   r   Zleaverequest_created_byr   r   r   c                   @   s   e Zd ZdZdS )zLeaveRequest.MetaZleaverequestNr   r   r   r   r    r!   è   s   r!   N)r   r   r   r   r%   Útyper=   ÚreasonZ
total_daysÚ	JSONFieldZleave_datesÚwhyr2   r4   r"   r   r#   r?   r5   r6   r7   r!   r   r   r   r    rw   Ú   s   ÿrw   c                   @   sÔ   e Zd ZddddgZdddgZejdejd	d
�Zej	dedd�Z
e ¡ Ze ¡ Zejddd�Zej	dedd�Zej	dddd�Zejdd�Zejeddejdd�Zejddd�ZG dd„ dƒZedd„ ƒZdd„ ZdS )ÚLeaveRequests)ÚCasualzCasual Leave)ZSickz
Sick Leave)ZEarnedzEarned Leave)ZUnpaidzUnpaid Leave©ÚPendingr€   )ÚApprovedr�   )ÚRejectedr‚   rD   Zleave_requests©r   r	   é   r~   ©r   rq   r   Trx   rI   r€   r
   )r   r   r   r   ú+)r   r   r   r	   rH   c                   @   s   e Zd ZdgZdS )zLeaveRequests.Metaz-applied_atN)r   r   r   r<   r   r   r   r    r!     s   r!   c                 C   s   | j | j jd S )Nr   )Úend_dateÚ
start_dateÚdaysr]   r   r   r    Ú
days_count  s    zLeaveRequests.days_countc                 C   s   | j › d| j› d| j› �S )Nõ    Â· )rr   Ú
leave_typerˆ   r]   r   r   r    Ú__str__  s    zLeaveRequests.__str__N)r   r   r   ZLEAVE_TYPESÚSTATUS_CHOICESr   r"   r#   rr   r%   rŒ   r.   rˆ   r‡   r=   r>   r4   Z
admin_noter5   Z
applied_atr   rm   Zreviewed_byZreviewed_atr!   ÚpropertyrŠ   r�   r   r   r   r    r}   î   sB   üý  ÿ    ÿ
r}   c                   @   sD  e Zd ZdZejdddd�Zejdddd�Zejddd�Z	ej
d	d
�Zejdddd�Zejdd
�Zejdd
�Zejd	ddd�Zejdd
�Zejdd
�Zejdd
�Zejdd
�Zejddd�Zejddd�Zejdd
�Zejdd
�Zejdd
�Zejdd
�Zejddd�Zejeejdddd�Z ej!dd�Z"G dd„ dƒZ#dd„ Z$d S )!ÚSettinguÌ   
    Company-wide settings â€” ONE row mattum irukkum (pk=1).
    App-la irundhu Shift, Notification, Company, Security settings
    ellam indha à®’à®°à¯‡ row-la thaan save aagum (singleton pattern).
    Tz09:30)r   r   r   z18:30é2   ÚSun)r   r   rI   r   é   r   g      @rL   F))ÚLowr”   )ÚMediumr•   )ÚHighr–   r•   r…   r
   zManju Associateséd   zAsia/Kolkata (GMT +5:30)r„   z
DD/MM/YYYYZsettings_updated_byr   r   c                   @   s   e Zd ZdZdS )zSetting.MetaÚsettingsNr   r   r   r   r    r!   F  s   r!   c                 C   s   | j S rR   )Úcompany_namer]   r   r   r    r�   I  s    zSetting.__str__N)%r   r   r   Ú__doc__r   rt   Zshift_startZ	shift_endr%   Z
weekly_offÚPositiveIntegerFieldZgrace_minutesrd   Zhalf_day_hoursÚBooleanFieldZovertime_enabledZgeofence_enabledZface_sensitivityZpush_notificationsZemail_alertsZabsent_alertsZleave_alertsr™   Z	time_zoneZbiometric_loginZ
two_factorZ	dark_modeZauto_backupÚdate_formatr"   r   rm   r@   r5   r7   r!   r�   r   r   r   r    r�     sD   ý   þr�   c                   @   s\   e Zd ZdZejdd�Ze ¡ Zej	e
ejdddd�Zejdd�ZG dd	„ d	ƒZd
d„ ZdS )ÚHolidayu0   Company holiday list â€” Add Holiday screen-kku.r
   rE   TZholiday_created_byr   r   c                   @   s   e Zd ZdZdgZdS )zHoliday.MetaZholidayrs   Nr;   r   r   r   r    r!   W  s   r!   c                 C   s   | j › d| j› d�S )Nz (ú))r&   rs   r]   r   r   r    r�   [  s    zHoliday.__str__N)r   r   r   rš   r   r%   r&   r.   rs   r"   r   rm   r?   r5   r6   r!   r�   r   r   r   r    rž   M  s      þrž   c                   @   sP   e Zd Zejddd�Zejdd�Zejddd�Zej	ddd�Z
G d	d
„ d
ƒZdS )ÚOtpr
   Tr   r   r   é   )r   r   rx   c                   @   s   e Zd ZdZdgZdS )zOtp.MetaÚotpr:   Nr;   r   r   r   r    r!   i  s   r!   N)r   r   r   r   r%   r(   r2   r4   r¢   r5   Zotp_created_atr!   r   r   r   r    r    c  s
   r    c                   @   s  e Zd Zejdejddd�Zejddd�Zejddd�Z	ejddd�Z
ejddd�Zejddd�Zejddd�Zejddd�Zejddd�Zejddd�Zejddd�Zejddd�Zejddd�Zejddd�Zejddd�Zejddd�Zejddd�Zejddd�Zejddd�Zejddd�Zejddd�Zejddd�Zejddd�Zejddd�Zejddd�Zejddd�Z ejddd�Z!ejddd�Z"ejddd�Z#ejddd�Z$ejddd�Z%ejddd�Z&ejddd�Z'ej(dd�Z)ej*dd	�Z+ej*dd
�Z,G dd„ dƒZ-dS )ÚPaysliprD   TZpayslip_recordsrP   r
   r   r   r   r   r   c                   @   s   e Zd ZdZdS )zPayslip.MetaZpayslipNr   r   r   r   r    r!   š  s   r!   N).r   r   r   r   r"   r#   rr   r%   ZempnameZempidZemppanre   ZgrosssalaryZperdaysalaryZbasicsalaryrg   rh   ZotherallowanceZ	totaldaysZworkingdaysZbaiscnewZhranewZconveyancenewZotherallowancenewZgrosspayZvariablepfgrossZesilessZpflessÚbankZuanZlessptZpfZesiri   Znetpayrj   rk   rl   ZtopayÚmonthr2   r4   r5   r6   r7   r!   r   r   r   r    r£   o  sP   
þr£   c                   @   sv  e Zd Zejddd�Zejddd�Zejddd�Zejddd�Zejddd�Z	ejddd�Z
ejddd�Zejddd�Zejddd�Zejddd�Zejddd�Zejddd�Zejddd�Zejddd�Zejddd�Zejddd�Zejddd�Zejddd�Zejddd�Zejddd�Zejddd�Zejddd�Zejddd�Zejddd�Zejddd�Zejddd�Zejddd�Zejddd�Z ejddd�Z!ejddd�Z"ejddd�Z#ejddd�Z$ejddd�Z%ejddd�Z&ejddd�Z'ejddd�Z(ejddd�Z)ejddd�Z*ejddd�Z+ejddd�Z,ejddd�Z-ejddd�Z.ejddd�Z/ejddd�Z0ejddd�Z1ejddd�Z2ejddd�Z3ejddd�Z4ejddd�Z5ejddd�Z6ejddd�Z7ejddd�Z8ejddd�Z9ejddd�Z:ejddd�Z;ejddd�Z<ejddd�Z=ejddd�Z>ejddd�Z?ejddd�Z@ejddd�ZAejddd�ZBejddd�ZCejddd�ZDejddd�ZEejddd�ZFejddd�ZGejddd�ZHejddd�ZIejddd�ZJejddd�ZKejddd�ZLejddd�ZMejddd�ZNejOdd�ZPejQeRejSdddd�ZTejQeRejSddd	d�ZUejVdd
�ZWejVdd�ZXG dd„ dƒZYdS )ÚProductr
   Tr   r—   r   r   Zproduct_created_byr   Zproduct_updated_byr   r   c                   @   s   e Zd ZdZdgZdS )zProduct.MetaÚproductr:   Nr;   r   r   r   r    r!   ý  s   r!   N)Zr   r   r   r   r%   r™   Zproject_nameÚapplicationÚcountryZdeliverydateZbidclosedateZs2dailyflowZs2monthflowZ
s2weekflowZs2maxdailyflowZ
s2hourflowZs2bodZs2bodoutZ	s2bodrateZs2codZs2codoutZ	s2codrateZs2tssZs2tssoutZ	s2tssrateZs2tnZs2tnoutZs2tnrateZs2tpZs2tpoutZs2tprateZs2oilZs2oiloutZ	s2oilrateZs2avgwatertempZs2avgwatertempoutZs2avgwatertemprateZs2maxwatertempZs2maxwatertempoutZs2maxwatertemprateZs2minwatertempZs2minwatertempoutZs2minwatertemprateZ	Davgflux1Z	Davgflux2Z	DpeakfluxZMsurfacearea1ZMsurfacearea2ZproductcodeZ
NoofmoduleZ
NoofmtrainZNoofmptrainZTNMZTMsurfaceareaZ	Aavgflux1Z	Aavgflux2Z
Apeakflux1Z
Apeakflux2Zs4AT1Zs4AT2Zs4AT3Zs4AT4Zs4AT5Zs4AT6Zs4AT7Zs4TT1Zs4TT2Zs4TT3Zs4TT4Zs4TT5Zs4TT6Zs4TT7Zs4MT1Zs4MT2Zs4MT3Zs4MT4Zs4MT5Zs4MT6Zs4MT7r2   r4   r"   r   r#   r?   r@   r5   r6   r7   r!   r   r   r   r    r¦   Ÿ  s¨   	ÿÿr¦   c                   @   s\   e Zd Zejeejdddd�Zejdd�Z	e 
¡ Zejdd�Zejdd�ZG d	d
„ d
ƒZdS )ÚNotificationTZNotificationsr   r„   rE   r   r   r   c                   @   s   e Zd ZdZdgZdS )zNotification.MetaZnotificationr:   Nr;   r   r   r   r    r!     s   r!   N)r   r   r   r   r"   r   r#   r$   r%   ry   r=   Úmessager2   r4   r5   r6   r!   r   r   r   r    rª     s   rª   )rs   )r   ÚtransactionÚIntegrityError)Útimezone))ÚMonthlyr¯   )Ú	Quarterlyr°   )ÚYearlyr±   )úOne-Timer²   )	)ú
GST Filingr³   )úGST Renewalr´   )ú	IT Filingrµ   )úIT Filing Renewalr¶   )ú
TDS Filingr·   )ú
ROC Filingr¸   )Ú	Trademarkr¹   )Ú	Insurancerº   ©ÚOtherr¼   ))ÚPaidr½   r   )ÚPartialr¾   ))ÚCashr¿   )ÚUPIrÀ   )úBank TransferrÁ   )ÚChequerÂ   r»   c                       sÊ   e Zd ZdZejdddddd�Zejdd�Zejdddd	�Zej	ddd
�Z
ejdddd	�Zejdd�Zejeejdddd�Zejdd�Zejdd�ZG dd„ dƒZdd„ Zedd„ ƒZ‡ fdd„Z‡  ZS )Ú	FeeClientZMASr„   TF)r   rG   r   r   Úeditabler
   rE   rF   ©r   r   r   rH   r   r   Zfee_clients_created_byr   r   r   c                   @   s   e Zd ZdZdgZdS )zFeeClient.MetaZfee_clientsr&   Nr;   r   r   r   r    r!   a  s   r!   c                 C   s   | j pd› d| j› �S )Nú-r‹   ©Úclient_coder&   r]   r   r   r    r�   e  s    zFeeClient.__str__c                 C   sj   g }| j j| jd�jddd�D ],}|t| jƒd… }| ¡ r| t|ƒ¡ q| j› |rbt|ƒd nd› �S )z9Ippo irukura highest number-ku +1 (MAS7 irundha -> MAS8).)Zclient_code__startswithrÈ   T)ÚflatNr   )	ÚobjectsÚfilterÚCODE_PREFIXÚvalues_listÚlenÚisdigitÚappendÚintÚmax)ÚclsZnumbersÚcodeÚsuffixr   r   r    Únext_client_codeh  s    ÿ þ
zFeeClient.next_client_codec                    s„   | j rtƒ j||ŽS tdƒD ]b}|  ¡ | _ z4t ¡ �" tƒ j||ŽW  5 Q R £ W   S Q R X W q tk
r|   |dkrx‚ Y qX qd S )Né   r“   )rÈ   ÚsuperrW   ÚrangerÖ   r¬   Úatomicr­   )rX   ÚargsÚkwargsÚattempt©Ú	__class__r   r    rW   t  s    

*zFeeClient.save)r   r   r   rÌ   r   r%   rÈ   r&   ra   r=   r)   Z
gst_numberr2   r4   r"   r   rm   r?   r5   r6   r7   r!   r�   ÚclassmethodrÖ   rW   Ú__classcell__r   r   rÞ   r    rÃ   K  s6       ÿ   þ
rÃ   c                       s  e Zd Zejeejdd�Zejde	dd�Z
ejdddd�Zejd	d
dd�Zejdedd�Ze ¡ Zejddd�Zejd	d
dd�Zejd	d
dd�Zejd	edd�Zejdejdddd�Zejddd�Zejdd�Zejdd�ZG dd„ dƒZdd„ Zdd„ Z dd„ Z!‡ fdd„Z"‡  Z#S ) ÚFeeÚfeesrƒ   r‘   r³   r…   r—   TrÅ   rI   rJ   rK   rL   r„   r¯   rH   r€   rD   Zfees_created_byr   r   r   c                   @   s   e Zd ZdZdgZdS )zFee.Metarã   z	-due_dateNr;   r   r   r   r    r!   ¨  s   r!   c                 C   s   | j j› d| j› d| j› �S )Nu    â€” õ    â€” â‚¹)Úclientr&   ÚserviceÚ
fee_amountr]   r   r   r    r�   ¬  s    zFee.__str__c                 C   sˆ   ddl m} | jjt d¡d�d p*|dƒ}|t| jƒƒ}|| _|| | _	|dkrZd| _
n||k rjd| _
nd	| _
| jd
dddgd� d S )Nr   )ÚDecimalÚamount)Útotalrê   Ú0r€   r¾   r½   Úpaid_amountÚbalanceÚpayment_statusr7   ©Úupdate_fields)Údecimalrè   ÚpaymentsÚ	aggregater   ÚSumÚstrrç   rì   rí   rî   rW   )rX   rè   Z
total_paidrç   r   r   r    Úrecalc°  s     
z
Fee.recalcc                 C   s†   | j }| jdkrd}n$| jdkr&d}n| jdkr6d}nd S |jd | }|j|d  }|d d }t|jt ||¡d ƒ}t|||ƒS )Nr¯   r   r°   é   r±   é   )	Údue_dateÚbilling_frequencyr¥   ÚyearÚminÚdayÚcalendarÚ
monthrangers   )rX   ÚdZmonths_to_addZmonth_indexrû   r¥   rý   r   r   r    Úcompute_next_due_dateÄ  s    


zFee.compute_next_due_datec                    s"   | j s|  ¡ | _ tƒ j||Ž d S rR   )Únext_due_dater  rØ   rW   ©rX   rÛ   rÜ   rÞ   r   r    rW   Õ  s    
zFee.save)$r   r   r   r   r"   rÃ   r#   rå   r%   ÚSERVICE_CHOICESræ   Zservice_otherrd   rç   ÚBILLING_FREQUENCY_CHOICESrú   r.   rù   r  rì   rí   ÚPAYMENT_STATUS_CHOICESrî   rm   r?   r=   Únotesr5   r6   r7   r!   r�   rö   r  rW   rá   r   r   rÞ   r    râ   ‰  sJ     ÿ  ÿ  ÿ   þrâ   c                       s¾   e Zd Zejeejdd�Zejdejdddd�Z	ej
ddd	�Zejejd
�Zejdedd�Zejdddd�Zejdddd�Zejdd�ZG dd„ dƒZdd„ Z‡ fdd„Z‡ fdd„Z‡  ZS )Ú
FeePaymentrò   rƒ   rD   TZfee_payments_collectedr   rI   rJ   )rM   rN   r   r„   r¿   r…   r—   rÅ   r
   r   c                   @   s   e Zd ZdZddgZdS )zFeePayment.MetaZfee_paymentsz-payment_dater_   Nr;   r   r   r   r    r!   ò  s   r!   c                 C   s   | j jj› d| j› d| j› �S )Nrä   z on )Úfeerå   r&   ré   Úpayment_dater]   r   r   r    r�   ö  s    zFeePayment.__str__c                    s   t ƒ j||Ž | j ¡  d S rR   )rØ   rW   r	  rö   r  rÞ   r   r    rW   ù  s    zFeePayment.savec                    s    | j }tƒ j||Ž | ¡  d S rR   )r	  rØ   Údeleterö   )rX   rÛ   rÜ   r	  rÞ   r   r    r  ý  s    zFeePayment.delete)r   r   r   r   r"   râ   r#   r	  rm   Zcollected_byrd   ré   r.   r®   Únowr
  r%   ÚPAYMENT_MODE_CHOICESZpayment_modeZreference_noZnoter5   r6   r!   r�   rW   r  rá   r   r   rÞ   r    r  á  s$      þr  )ÚFileExtensionValidatorÚMaxLengthValidatorÚRegexValidator)ÚLower)Úpost_delete)Úreceiverr   rJ   ZActiveZInactivez^[A-Z0-9][A-Z0-9/_-]{0,19}$z9Client ID can have letters, numbers, - _ / only (max 20).z^[6-9]\d{9}$z%Enter a valid 10-digit mobile number.z^[A-Z]{5}[0-9]{4}[A-Z]$z(Enter a valid PAN (example: ABCDE1234F).z^[2-9][0-9]{11}$zAadhaar must be 12 digits.z(^\d{2}[A-Z]{5}\d{4}[A-Z][A-Z\d]Z[A-Z\d]$z!Enter a valid 15-character GSTIN.z^[A-Z]{4}0[A-Z0-9]{6}$z*Enter a valid IFSC (example: HDFC0001234).z
^\d{9,18}$z&Account number must be 9 to 18 digits.z^[1-9]\d{5}$zEnter a valid 6-digit pincode.c                 C   s   t  dd| pd¡S )Nz\DÚ )ÚreÚsub)Úvaluer   r   r    Úonly_digits  s    r  c                   @   s€   e Zd Zejdd�Zejeed�Z	ej
eejdddd�Zej
eejdddd�Zejdd�Zejdd	�ZG d
d„ dƒZdd„ ZdS )ÚServiceé–   rE   )r   rq   TZservice_created_byr   Zservice_updated_byr   r   c                   @   s*   e Zd ZdZdgZejedƒdd�gZdS )zService.Metaræ   r&   Zuniq_service_name_ci©r&   N)	r   r   r   r   r<   r   ÚUniqueConstraintr  Úconstraintsr   r   r   r    r!   )  s   þr!   c                 C   s   | j S rR   r  r]   r   r   r    r�   1  s    zService.__str__N)r   r   r   r   r%   r&   r2   ÚSTATUS_ACTIVErŽ   r4   r"   r   rm   r?   r@   r5   r6   r7   r!   r�   r   r   r   r    r  !  s   r  c                       sì  e Zd Zejddddegd�Zejddd�Zejdddd�Zej	dde
dƒgd	�Zejd
ddd�Zejdddegd�Zejddegd�Zejddd�Zejdddegd�Zejdddegd�Zejdddegd�Zejd
ddd�Zejdddd�Zejdddegd�Zejdddegd�Zeje dddd�Z!ej"ddd�Z#ej$ddd�Z%ej	dde
dƒgd	�Z&ej'e(e)dd�Z*ej+e,ej-dddd�Z.ej+e,ej-dddd�Z/ej0dd �Z1ej0dd!�Z2G d"d#„ d#ƒZ3d$d%„ Z4d&d'„ Z5d(d)„ Z6‡ fd*d+„Z7‡  Z8S ),ÚClientr„   T)r   rG   r   r   Ú
validatorséÈ   )r   Údb_indexr  ©r   r   r   iô  )r   r   r   r—   r¡   )r   r   r   r   rI   )r   r"  r   )r   r   rø   rF   r  é   é   ÚClientServiceÚclients)Úthroughr	   r   F)r   r"  rH   iÐ  )r   rq   r"  Zclient_created_byr   Zclient_updated_byr   r   c                   @   sN   e Zd ZdZdgZejdgejdd� dd�ejdgejdd	� d
d�gZdS )zClient.Metarå   ú-idr1   r  )r1   Zuniq_client_pan)ÚfieldsÚ	conditionr&   Úaadhaar)r,  Zuniq_client_aadhaarN)	r   r   r   r   r<   r   r  ÚQr  r   r   r   r    r!   \  s
   ýr!   c                 C   s   | j pd› d| j› �S )NÚNEWú - rÇ   r]   r   r   r    r�   e  s    zClient.__str__c                 C   sÞ   dD ]}t | |t| |ƒpd ¡ ƒ q| jp,d ¡  ¡ p8d | _| j ¡ | _| jpPd ¡  ¡ | _| jpdd ¡  ¡ | _| j	pxd ¡  ¡ | _	t
| jƒ| _t
| jƒ| _t
| jƒ| _t
| jƒ}t|ƒdkrÔ| d¡rÔ|dd … }|| _d S )N)r&   Úbusiness_namer)   Úcityr(   Ú	bank_nameÚaccount_holderr  r  rø   Z91rJ   )ÚsetattrÚgetattrÚstriprÈ   Úupperr(   Úlowerr1   ÚgstinÚifscr  r,  Úaccount_numberr-   r'   rÎ   Ú
startswith)rX   Úfr'   r   r   r    Ú	normalizeh  s    
zClient.normalizec                 C   s   |   ¡  |  ¡  dS )z1Clean the values, then run every field validator.N)r>  Úclean_fieldsr]   r   r   r    Úvalidate_fieldsx  s    zClient.validate_fieldsc                    st   | j j}|  ¡  tƒ j||Ž |rp| jsp| j}tjj	d|d›�d� 
¡ rR|d7 }q.d|d›�| _tƒ jdgd� d S )NzMAS-Z05d)rÈ   r   rÈ   rï   )Ú_stateÚaddingr>  rØ   rW   rÈ   r:   r  rÊ   rË   Úexists)rX   rÛ   rÜ   ZcreatingÚnrÞ   r   r    rW   }  s    

zClient.save)9r   r   r   r   r%   ÚCLIENT_CODE_VALIDATORrÈ   r&   r0  r=   r  r)   r1  ÚPINCODE_VALIDATORr-   ÚPHONE_VALIDATORr'   Ú
EmailFieldr(   ÚPAN_VALIDATORr1   ÚAADHAAR_VALIDATORr,  ÚGSTIN_VALIDATORr9  r2  r3  ÚACCOUNT_VALIDATORr;  ÚIFSC_VALIDATORr:  ÚManyToManyFieldr  Úservicesrœ   Zfile_deliveredr.   Zfile_delivered_onr  r2   r  rŽ   r4   r"   r   rm   r?   r@   r5   r6   r7   r!   r�   r>  r@  rW   rá   r   r   rÞ   r    r  6  s:   	r  c                   @   sb   e Zd Zejeejdd�Zejeej	dd�Z
ejdddd�Zejdd�ZG dd„ dƒZdd	„ Zd
S )r&  Zclient_servicesrƒ   T)r   r   r"  r   c                   @   s$   e Zd ZdZejddgdd�gZdS )zClientService.MetaZclient_servicerå   ræ   Zuniq_client_service)r*  r&   N)r   r   r   r   r   r  r  r   r   r   r    r!   �  s   r!   c                 C   s   | j › d| j› �S )Nz -> )Ú	client_idÚ
service_idr]   r   r   r    r�   ”  s    zClientService.__str__N)r   r   r   r   r"   r  r#   rå   r  ÚPROTECTræ   r.   Zrenewal_dater5   r6   r!   r�   r   r   r   r    r&  ‰  s   r&  c                   @   sš   e Zd ZdZejeejdd�Zeje	ej
dd�Zejddd�Ze ¡ Ze ¡ Zejdddd�Zejeejddd	d
�Zejdd�ZG dd„ dƒZdd„ ZdS )ÚRenewalHistoryzZOne row every time a service is renewed ("Mark renewed" button). Never edited, only added.Úrenewal_historyrƒ   TrH   r
   r  r#  Zrenewal_created_byr   r   c                   @   s*   e Zd ZdZddgZejddgd�gZdS )zRenewalHistory.MetarT  z-renewed_onr)  rå   )r*  N)r   r   r   r   r<   r   ÚIndexÚindexesr   r   r   r    r!   £  s   r!   c                 C   s   | j › d| j› d| j› �S )Nú )rP  rQ  Ú
renewed_onr]   r   r   r    r�   ¨  s    zRenewalHistory.__str__N)r   r   r   rš   r   r"   r  r#   rå   r  rR  ræ   r.   Zold_dateZnew_daterX  r%   Úremarksr   rm   r?   r5   r6   r!   r�   r   r   r   r    rS  ˜  s   rS  c                 C   s0   t j |¡d  ¡ }d| j› dt ¡ j› |› �S )z]MEDIA_ROOT/client_documents/<client id>/<random>.<ext>  (random name: URLs can't be guessed).r   zclient_documents/ú/)ÚosÚpathÚsplitextr8  rP  ÚuuidÚuuid4Úhex)ÚinstanceÚfilenameÚextr   r   r    Úclient_document_path­  s    rd  )r1   zPAN Card)r,  zAadhaar Card)r¤   zBank Document)r0   zGST Certificate)ZfssaizFSSAI Certificate)Úitrrµ   )Úotherr¼   c                   @   sÂ   e Zd Zejeejdd�Zejde	ddd�Z
ejededd	d
dgƒgd�Zejdddd�Zejdddd�Zejdd�Zejdddd�Zejeejdddd�Zejdd�ZG dd„ dƒZdd„ ZdS )ÚClientDocumentZ	documentsrƒ   r„   rf  T)r   rq   r   r"  r
   ZpdfZjpgZjpegZpng)r   r   r   r  r#  r—   r   r   Zclientdoc_created_byr   r   c                   @   s   e Zd ZdZddgZdS )zClientDocument.MetaZclient_documentr_   r)  Nr;   r   r   r   r    r!   Å  s   r!   c                 C   s   | j › d|  ¡ › �S )Nr/  )rP  Zget_doc_type_displayr]   r   r   r    r�   É  s    zClientDocument.__str__N)r   r   r   r   r"   r  r#   rå   r%   ÚDOC_TYPE_CHOICESZdoc_typer*   rd  r  ÚfileÚoriginal_nameÚcontent_typer›   ÚsizerY  r   rm   r?   r5   r6   r!   r�   r   r   r   r    rg  ¹  s   ÿrg  )Úsenderc                 K   s   |j r|j jdd� dS )zVRemove the physical file when the record is deleted (also when the client is deleted).F)rW   N)ri  r  )rm  ra  rÜ   r   r   r    Údelete_file_from_mediaÍ  s    rn  )EÚ	django.dbr   Údjango.contrib.auth.modelsr   rS   ZnumpyrZ   ÚModelr   r8   rA   rD   rn   rv   rw   r}   r�   rž   r    r£   r¦   rª   rþ   Údatetimers   r¬   r­   Údjango.utilsr®   r  r  r  r  rÃ   râ   r  r[  r  r^  Zdjango.core.validatorsr  r  r  Údjango.db.models.functionsr  Zdjango.db.models.signalsr  Údjango.dispatchr  r  ZSTATUS_INACTIVErŽ   rE  rG  rI  rJ  rK  rM  rL  rF  r  r  r  r&  rS  rd  rh  rg  rn  r   r   r   r    Ú<module>   s„   ,K%*50d>X"







S     þ
