o
    ÔïÅ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„ ZAg dQ¢ZBG dRdS„ dSejƒZCe0e.eCdT�dUdV„ ƒZDdS )Wé    )Ú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                   @   ó   e Zd ZdZdS )zProfiles.MetaÚprofileN©Ú__name__Ú
__module__Ú__qualname__Údb_table© r    r    ú5C:\Users\psant\Downloads\Manju\school\myapp\models.pyÚMeta0   ó    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      s2    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                   @   ó   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   ó    
r"   N)r   r   r   r   r'   r(   Ú	TextFieldÚdescriptionr4   r6   r$   r   r%   Ú
created_byÚ
updated_byr7   r8   r9   r"   r    r    r    r!   r:   7   s    ÿÿr:   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                   @   r;   )zDesignation.MetaÚdesignationr=   Nr>   r    r    r    r!   r"   X   r@   r"   N)r   r   r   r   r$   r:   r%   r<   r'   r(   rA   rB   r4   r6   r   rC   rD   r7   r8   r9   r"   r    r    r    r!   rE   L   s    ÿÿrE   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      œ@r:   Ú	employees©r   r   r	   rE   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 rV   )rZ   ÚnpÚarrayrW   Úloads©r\   r    r    r!   Úget_encoding�   s   zEmployee.get_encodingc                   @   r;   )zEmployee.MetarS   ú-created_atNr>   r    r    r    r!   r"   ¢   r@   r"   N).r   r   r   r   r$   r   r%   Úusersr'   r(   ÚmobileÚIntegerFieldÚagerA   r+   r,   ZphotorZ   r3   ÚDecimalFieldÚctcZgrossSalaryÚbasicÚhraÚ
conveyanceZotherAllowanceZfixedPTZpfLimitÚadvanceÚotÚreimbursementÚ	incentiveÚSET_NULLr<   rG   r0   r1   r4   r6   rC   r7   r8   r9   r]   rb   r"   r    r    r    r!   rH   \   sX    üü
þrH   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 )Ú
AttendancerH   TZattendance_recordsrT   rF   Fr   ))ÚPresentrs   )ÚAbsentrt   rL   rM   )r   Úchoicesr   r   c                   @   r   )zAttendance.MetaZ
attendanceNr   r    r    r    r!   r"   Å   r#   r"   N)r   r   r   r   r$   r%   Úemployeer   r&   r0   ÚdateZATTENDANCE_STATUSÚ	TimeFieldZin_timeZout_timer'   r6   rA   Úlocationr7   r8   r9   r"   r    r    r    r!   rr   §   s    
þrr   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   rL   r   r   Zannouncements_created_byr   r   r   c                   @   r   )zAnnouncement.MetaZannouncementNr   r    r    r    r!   r"   Õ   r#   r"   N)r   r   r   r   rA   rB   r0   rw   r4   r6   r$   r   r%   rC   r7   r8   r9   r"   r    r    r    r!   rz   Ì   s    ÿrz   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                   @   r   )zLeaveRequest.MetaZleaverequestNr   r    r    r    r!   r"   è   r#   r"   N)r   r   r   r   r'   ÚtyperA   ÚreasonZ
total_daysÚ	JSONFieldZleave_datesÚwhyr4   r6   r$   r   r%   rC   r7   r8   r9   r"   r    r    r    r!   r{   Ú   s    ÿr{   c                   @   sÎ   e Zd Zg d¢Zg d¢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†   rH   Zleave_requests©r   r	   é   r‚   ©r   ru   r   Tr|   rM   r„   r
   )r   r   r   r   ú+)r   r   r   r	   rL   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Údaysra   r    r    r!   Ú
days_count  s   zLeaveRequests.days_countc                 C   ó   | j › d| j› d| j› �S )Nõ    Â· )rv   Ú
leave_typerŒ   ra   r    r    r!   Ú__str__  ó   zLeaveRequests.__str__N)r   r   r   ZLEAVE_TYPESÚSTATUS_CHOICESr   r$   r%   rv   r'   r‘   r0   rŒ   r‹   rA   rB   r6   Z
admin_noter7   Z
applied_atr   rq   Zreviewed_byZreviewed_atr"   ÚpropertyrŽ   r’   r    r    r    r!   r�   î   s*    ÿÿ
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   rM   r   é   r   g      @rP   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                   @   r   )zSetting.MetaÚsettingsNr   r    r    r    r!   r"   F  r#   r"   c                 C   ó   | j S rV   )Úcompany_namera   r    r    r!   r’   I  ó   zSetting.__str__N)%r   r   r   Ú__doc__r   rx   Zshift_startZ	shift_endr'   Z
weekly_offÚPositiveIntegerFieldZgrace_minutesrh   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   rq   rD   r7   r9   r"   r’   r    r    r    r!   r–     s@    ý
þ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
   rI   TZholiday_created_byr   r   c                   @   r;   )zHoliday.MetaZholidayrw   Nr>   r    r    r    r!   r"   W  r@   r"   c                 C   s   | j › d| j› d�S )Nz (ú))r(   rw   ra   r    r    r!   r’   [  ó   zHoliday.__str__N)r   r   r   r¢   r   r'   r(   r0   rw   r$   r   rq   rC   r7   r8   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   r|   c                   @   r;   )zOtp.MetaÚotpr=   Nr>   r    r    r    r!   r"   i  r@   r"   N)r   r   r   r   r'   r*   r4   r6   r«   r7   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 )ÚPaysliprH   TZpayslip_recordsrT   r
   r   r   r   r   r   c                   @   r   )zPayslip.MetaZpayslipNr   r    r    r    r!   r"   š  r#   r"   N).r   r   r   r   r$   r%   rv   r'   ZempnameZempidZemppanri   ZgrosssalaryZperdaysalaryZbasicsalaryrk   rl   ZotherallowanceZ	totaldaysZworkingdaysZbaiscnewZhranewZconveyancenewZotherallowancenewZgrosspayZvariablepfgrossZesilessZpflessÚbankZuanZlessptZpfZesirm   Znetpayrn   ro   rp   ZtopayÚmonthr4   r6   r7   r8   r9   r"   r    r    r    r!   r¬   o  sR    
þ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                   @   r;   )zProduct.MetaÚproductr=   Nr>   r    r    r    r!   r"   ý  r@   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s4MT7r4   r6   r$   r   r%   rC   rD   r7   r8   r9   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ˆ   rI   r   r   r   c                   @   r;   )zNotification.MetaZnotificationr=   Nr>   r    r    r    r!   r"     r@   r"   N)r   r   r   r   r$   r   r%   r&   r'   r}   rA   Úmessager4   r6   r7   r8   r"   r    r    r    r!   r³     s    r³   )rw   )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   rK   r   r   Úeditabler
   rI   rJ   ©r   r   r   rL   r   r   Zfee_clients_created_byr   r   r   c                   @   r;   )zFeeClient.MetaZfee_clientsr(   Nr>   r    r    r    r!   r"   a  r@   r"   c                 C   ó   | j pd› d| j› �S )Nú-r�   ©Úclient_coder(   ra   r    r    r!   r’   e  ó   zFeeClient.__str__c                 C   sn   g }| j j| jd�jddd�D ]}|t| jƒd… }| ¡ r%| t|ƒ¡ q| j› |r3t|ƒd › �S 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|i |¤ŽS tdƒD ]7}|  ¡ | _ z"t ¡ � tƒ j|i |¤ŽW  d   ƒ W   S 1 s3w   Y  W q tyG   |dkrE‚ Y qw d S )Né   r™   )rÒ   Úsuperr[   Úrangerá   rµ   Úatomicr¶   )r\   ÚargsÚkwargsÚattempt©Ú	__class__r    r!   r[   t  s   

*ÿÿÿûzFeeClient.save)r   r   r   r×   r   r'   rÒ   r(   re   rA   r+   Z
gst_numberr4   r6   r$   r   rq   rC   r7   r8   r9   r"   r’   Úclassmethodrá   r[   Ú__classcell__r    r    ré   r!   rÌ   K  s*    
ÿ
þ
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Î   rM   rN   rO   rP   rˆ   r¸   rL   r„   rH   Zfees_created_byr   r   r   c                   @   r;   )zFee.Metarî   z	-due_dateNr>   r    r    r    r!   r"   ¨  r@   r"   c                 C   s   | j j› d| j› d| j› �S )Nu    â€” õ    â€” â‚¹)Úclientr(   ÚserviceÚ
fee_amountra   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r-d| _
n||k r5d| _
nd	| _
| jg d
¢d� d S )Nr   )ÚDecimalÚamount)Útotalrõ   Ú0r„   rÇ   rÆ   )Úpaid_amountÚbalanceÚpayment_statusr9   ©Úupdate_fields)Údecimalró   ÚpaymentsÚ	aggregater   ÚSumÚstrrò   r÷   rø   rù   r[   )r\   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rd}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Ú
monthrangerw   )r\   Ú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|i |¤Ž d S rV   )Únext_due_dater  rã   r[   ©r\   ræ   rç   ré   r    r!   r[   Õ  s   
zFee.save)$r   r   r   r   r$   rÌ   r%   rð   r'   ÚSERVICE_CHOICESrñ   Zservice_otherrh   rò   ÚBILLING_FREQUENCY_CHOICESr  r0   r  r  r÷   rø   ÚPAYMENT_STATUS_CHOICESrù   rq   rC   rA   Únotesr7   r8   r9   r"   r’   r  r  r[   rì   r    r    ré   r!   rí   ‰  s:    ÿÿÿ
þ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‡   rH   TZfee_payments_collectedr   rM   rN   )rQ   rR   r   rˆ   rÈ   r‰   r�   rÎ   r
   r   c                   @   ó   e Zd ZdZddgZdS )zFeePayment.MetaZfee_paymentsz-payment_daterc   Nr>   r    r    r    r!   r"   ò  ó    r"   c                 C   s   | j jj› d| j› d| j› �S )Nrï   z on )Úfeerð   r(   rô   Úpayment_datera   r    r    r!   r’   ö  s   zFeePayment.__str__c                    s    t ƒ j|i |¤Ž | j ¡  d S rV   )rã   r[   r  r  r  ré   r    r!   r[   ù  s   zFeePayment.savec                    s$   | j }tƒ j|i |¤Ž | ¡  d S rV   )r  rã   Údeleter  )r\   ræ   rç   r  ré   r    r!   r  ý  s   zFeePayment.delete)r   r   r   r   r$   rí   r%   r  rq   Zcollected_byrh   rô   r0   r·   Únowr  r'   ÚPAYMENT_MODE_CHOICESZpayment_modeZreference_noZnoter7   r8   r"   r’   r[   r  rì   r    r    ré   r!   r  á  s     
þr  )ÚFileExtensionValidatorÚMaxLengthValidatorÚRegexValidator)ÚLower)Úpost_delete)Úreceiverr   rN   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  ó   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é–   rI   )r   ru   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   rŸ   rV   r)  ra   r    r    r!   r’   1  r¡   zService.__str__N)r   r   r   r   r'   r(   r4   ÚSTATUS_ACTIVEr”   r6   r$   r   rq   rC   rD   r7   r8   r9   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   rK   r   r   Ú
validatorséÈ   )r   Údb_indexr!  ©r   r   r   iô  )r   r   r.  r�   rª   )r   r   r   r.  rM   )r   r0  r.  )r   r   r  rJ   r(  é   é   ÚClientServiceÚclients)Úthroughr	   r   F)r   r0  rL   iÐ  )r   ru   r0  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ð   ú-idr3   r!  )r3   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   rÏ   )NÚNEWú - rÑ   ra   r    r    r!   r’   e  rÓ   zClient.__str__c                 C   sÞ   dD ]}t | |t| |ƒpd ¡ ƒ q| jpd ¡  ¡ pd | _| j ¡ | _| jp(d ¡  ¡ | _| jp2d ¡  ¡ | _| j	p<d ¡  ¡ | _	t
| jƒ| _t
| jƒ| _t
| jƒ| _t
| jƒ}t|ƒdkrj| d¡rj|dd … }|| _d S )N)r(   Úbusiness_namer+   Úcityr*   Ú	bank_nameÚaccount_holderr  r!  r  Z91rN   )ÚsetattrÚgetattrÚstriprÒ   Úupperr*   Úlowerr3   ÚgstinÚifscr%  r:  Úaccount_numberr/   r)   rÙ   Ú
startswith)r\   Úfr)   r    r    r!   Ú	normalizeh  s   

zClient.normalizec                 C   s   |   ¡  |  ¡  dS )z1Clean the values, then run every field validator.N)rL  Úclean_fieldsra   r    r    r!   Úvalidate_fieldsx  s   zClient.validate_fieldsc                    s˜   | j j}|  ¡  tƒ j|i |¤Ž |rH| jsJ| j}tjj	d|d›�d� 
¡ r7|d7 }tjj	d|d›�d� 
¡ s&d|d›�| _tƒ jdgd� d S d S d S )NzMAS-Z05d)rÒ   r   rÒ   rú   )Ú_stateÚaddingrL  rã   r[   rÒ   r=   r-  rÕ   rÖ   Úexists)r\   ræ   rç   ZcreatingÚnré   r    r!   r[   }  s   
ÿûzClient.save)9r   r   r   r   r'   ÚCLIENT_CODE_VALIDATORrÒ   r(   r>  rA   r  r+   r?  ÚPINCODE_VALIDATORr/   ÚPHONE_VALIDATORr)   Ú
EmailFieldr*   ÚPAN_VALIDATORr3   ÚAADHAAR_VALIDATORr:  ÚGSTIN_VALIDATORrG  r@  rA  ÚACCOUNT_VALIDATORrI  ÚIFSC_VALIDATORrH  ÚManyToManyFieldr'  Úservicesr¤   Zfile_deliveredr0   Zfile_delivered_onr  r4   r,  r”   r6   r$   r   rq   rC   rD   r7   r8   r9   r"   r’   rL  rN  r[   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 )r4  Zclient_servicesr‡   T)r   r   r0  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)r8  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_idra   r    r    r!   r’   ”  r&  zClientService.__str__N)r   r   r   r   r$   r-  r%   rð   r'  ÚPROTECTrñ   r0   Zrenewal_dater7   r8   r"   r’   r    r    r    r!   r4  ‰  s    r4  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‡   TrL   r
   r!  r1  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.Metarb  z-renewed_onr7  rð   )r8  N)r   r   r   r   r?   r   ÚIndexÚindexesr    r    r    r!   r"   £  s    r"   c                 C   r�   )Nú )r^  r_  Ú
renewed_onra   r    r    r!   r’   ¨  r“   zRenewalHistory.__str__N)r   r   r   r¢   r   r$   r-  r%   rð   r'  r`  rñ   r0   Zold_dateZnew_daterf  r'   Úremarksr   rq   rC   r7   r8   r"   r’   r    r    r    r!   ra  ˜  s    ra  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/ú/N)ÚosÚpathÚsplitextrF  r^  ÚuuidÚuuid4Úhex)ÚinstanceÚfilenameÚextr    r    r!   Úclient_document_path­  s   rr  ))r3   zPAN Card)r:  zAadhaar Card)r­   zBank Document)r2   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g d¢ƒ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ˆ   rt  T)r   ru   r   r0  r
   )ZpdfZjpgZjpegZpng)r   r   r.  r!  r1  r�   r   r   Zclientdoc_created_byr   r   c                   @   r  )zClientDocument.MetaZclient_documentrc   r7  Nr>   r    r    r    r!   r"   Å  r  r"   c                 C   s   | j › d|  ¡ › �S )Nr=  )r^  Zget_doc_type_displayra   r    r    r!   r’   É  r¨   zClientDocument.__str__N)r   r   r   r   r$   r-  r%   rð   r'   ÚDOC_TYPE_CHOICESZdoc_typer,   rr  r  ÚfileÚoriginal_nameÚcontent_typer£   Úsizerg  r   rq   rC   r7   r8   r"   r’   r    r    r    r!   ru  ¹  s    ÿru  )Úsenderc                 K   s   |j r|j jdd� dS dS )zVRemove the physical file when the record is deleted (also when the client is deleted).F)r[   N)rw  r  )r{  ro  rç   r    r    r!   Údelete_file_from_mediaÍ  s   ÿr|  )EÚ	django.dbr   Údjango.contrib.auth.modelsr   rW   Znumpyr^   ÚModelr   r:   rE   rH   rr   rz   r{   r�   r–   r¦   r©   r¬   r¯   r³   r	  Údatetimerw   rµ   r¶   Údjango.utilsr·   r  r  r  r  rÌ   rí   r  ri  r"  rl  Zdjango.core.validatorsr  r  r  Údjango.db.models.functionsr  Zdjango.db.models.signalsr  Údjango.dispatchr   r,  ZSTATUS_INACTIVEr”   rS  rU  rW  rX  rY  r[  rZ  rT  r%  r'  r-  r4  ra  rr  rv  ru  r|  r    r    r    r!   Ú<module>   sz    ,K%*50d>X"







S
