o
    ¬íziÔæ ã                   @   sv  d dl mZ d dlmZ ddlmZmZmZmZm	Z	m
Z
mZmZmZ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 d dlm Z mZm!Z! d dl"Z"d dl#Z#d dl$Z$d dl%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,Z,d dl-m.Z. d dl/m0Z0 d dl1m2Z2m3Z3 ddl4m5Z5 d dl6m7Z7 d dlmZm8Z8 d dl9Z9d dl:m;Z; d dl<m=Z= d dl>Z>d dlmZ d dl?Z?d dl mZ d dl@Z@d dl:mAZA d dlBmCZC d dl/mDZD d d
lmZ d dlmZmZ d dlEmFZF d dlGmHZH d dlImJZJ d dlmZ d dlmZ d dl?Z?G dd„ deJƒZKG dd „ d e2ƒZLd!d"„ ZMd#d$„ ZNd d%lmOZO eOƒ ZG d&d'„ d'eJƒZPG d(d)„ d)eJƒZQd d*lm!Z! d dlmZ G d+d,„ d,eJƒZRG d-d.„ d.eJƒZSG d/d0„ d0eJƒZTG d1d2„ d2eJƒZUG d3d4„ d4eJƒZVG d5d6„ d6eJƒZWG d7d8„ d8eJƒZXG d9d:„ d:eJƒZYG d;d<„ d<eJƒZZG d=d>„ d>eJƒZ[G d?d@„ d@eJƒZ\G dAdB„ dBeJƒZ]G dCdD„ dDeJƒZ^d dl_Z_d dElmZ G dFdG„ dGeJƒZ`G dHdI„ dIeJƒZaG dJdK„ dKeJƒZbG dLdM„ dMeJƒZcG dNdO„ dOeJƒZdG dPdQ„ dQeJƒZeG dRdS„ dSeJƒZfG dTdU„ dUeJƒZgG dVdW„ dWeJƒZhG dXdY„ dYeJƒZiG dZd[„ d[eJƒZjG d\d]„ d]eJƒZkG d^d_„ d_eJƒZldS )`é    )Úsettings)Úrenderé   )
ÚProfilesÚOtpÚProductÚAnnouncementÚLeaveRequestÚClientÚEmployeeÚ
AttendanceÚ
DepartmentÚDesignation)ÚObjectDoesNotExist)ÚNotFound)ÚauthenticateÚlogin)ÚRefreshToken)Úmake_password)ÚUser©Útimezone)ÚdateÚdatetimeÚ	timedeltaN)ÚHttpResponse)ÚImage)ÚQ)ÚRetrieveAPIViewÚListAPIView)ÚUserSerializer)ÚIsAuthenticated)r   Útime)ÚEmailMessage)ÚBASE_DIR)Ú	send_mail)Úget_random_string©ÚSum)ÚResponse©Ústatus)ÚAPIViewc                   @   ó   e Zd Zdd„ ZdS )ÚLoginAPIViewc                 C   sÔ  |j }| d¡}|d }t d|¡r(z	tjj|d�}W n tjy'   d }Y nw t|||d�}|d urÚ| |¡rÚt	||ƒ t
 |¡}z^tjj|jd�}|jdkrattjdd	œd
dd dœtjd�W S |jj}|j}	d}
|jdkr•ztjj|jd�}tjj|jd�}|jrŠ|jj}
|j}	W n ty”   Y nw |jrŸ|jj}
|j}	W n ty¯   d}d}
d }Y nw d}	|j}ttjdd	œd d|j|j|j|j|jt |ƒt |j!ƒ||
|	||jdœdœƒS ttj"dd	œddd dœtj"d�S )NÚusernameÚpasswordz[^@]+@[^@]+\.[^@]+©Úemail)r/   r0   ©Úuser_idé   Úerror©ÚcodeÚresponsezInactive userzYou are inactive. Contact Admin©r+   r6   ÚmessageÚdatar*   ú../static/dummy.pngÚloopÚsuccesszLogin success)ÚnameÚidr/   r2   ZisSuperZrefreshÚtokenÚprofileÚcompanylogoÚcompanynameÚphoneÚrolezAuthentication failedzInvalid username or password)#r<   ÚgetÚreÚmatchr   ÚobjectsÚDoesNotExistr   Úcheck_passwordr   r   Zfor_userr   rA   r+   r)   ZHTTP_403_FORBIDDENÚprofilesÚurlr@   rG   r4   Úcreated_by_idrD   Úservicenamer   rF   ÚHTTP_200_OKr/   Ú
first_namer2   Úis_superuserÚstrZaccess_tokenÚHTTP_401_UNAUTHORIZED)ÚselfÚrequestr<   Zusername_or_emailr0   ÚuserrB   rC   ÚprorE   ÚcomZcreated_companyZcompany_creator_profilerF   © r\   ú:C:\Users\psant\Downloads\PAF backend\school\myapp\views.pyÚpost<   s–   
ÿ



üû
€ÿ€ý
óü
üûzLoginAPIView.postN©Ú__name__Ú
__module__Ú__qualname__r^   r\   r\   r\   r]   r.   :   ó    r.   c                   @   s&   e Zd ZefZeZdd„ Zdd„ ZdS )ÚUserAPIViewc                 C   s   | j jS ©N)rX   rY   )rW   r\   r\   r]   Ú
get_objectš   s   zUserAPIView.get_objectc                 C   sT   |j }tjj|d d�}tjj|d�}ttjddœd|j|j	|j
j|jjdœdœƒS )	Nr2   r1   ©rY   r?   r7   T)r/   r2   rG   rC   ©r+   r6   r<   )r<   r   rK   rH   r   r)   r+   rR   r/   r2   rG   rA   rN   rO   )rW   rX   r<   rY   rC   r\   r\   r]   r^   �   s   
üýzUserAPIView.postN)	r`   ra   rb   r!   Úpermission_classesr    Zserializer_classrf   r^   r\   r\   r\   r]   rd   •   s
    rd   c              
   C   ób   d}d|› d�}zt ||tj| gdd� W d S  ty0 } ztd|› �ƒ W Y d }~d S d }~ww )Nú%Your One-Time  (OTP) for Verificationú?Dear User,

    Your One-Time  (OTP) for verification is:

    zâ

    Please enter this code to proceed. This OTP is valid for the next 1 minutes.

    If you did not request this code, please ignore this email.

    Thank you,  
    Pearlcon Technologies LLP
    https://pearlcons.com
    F©Úfail_silentlyúError sending email: ©r%   r   ÚDEFAULT_FROM_EMAILÚ	ExceptionÚprint©r2   ÚotpÚsubjectr;   Úer\   r\   r]   Úsend_otp_email±   s    üû€ÿrx   c              
   C   rj   )Nrk   rl   zæ

    Please enter this code to proceed. This OTP is valid for the next 1 minutes.

    If you did not request this code, please ignore this email.

    Thank you,  
    Pearlcon Technologies LLP
    https://pearlcons.com
        Frm   ro   rp   rt   r\   r\   r]   Úsend_otp_emailsË   s    üû€ÿry   )Úget_user_modelc                   @   r-   )ÚSendotpAPIViewc              
   C   s  |j }zX| di ¡ dd ¡}td|ƒ tjj|d� ¡ s)ttj	ddœddd	œƒW S t
jj|d�}td
dd�}||_t ¡ |_| ¡  tjt||fd� ¡  ttjddœd d|idœƒW S  ty€ } ztd|ƒ ttjddœdt|ƒd	œƒW  Y d }~S d }~ww )NÚparamsr2   úReceived email:r1   zEmail not foundr7   TzEmail not registered©r+   r6   r;   é   Ú
1234567890©ÚlengthÚallowed_chars©ÚtargetÚargsÚSuccessrh   zError:úInternal Server Error)r<   rH   rs   r   rK   ÚfilterÚexistsr)   r+   ÚHTTP_404_NOT_FOUNDr   Úcreater&   ru   r   ÚnowÚotp_created_atÚsaveÚ	threadingÚThreadrx   ÚstartrR   rr   ÚHTTP_500_INTERNAL_SERVER_ERRORrU   )rW   rX   r<   r2   rY   ru   rw   r\   r\   r]   r^   ì   s<   


ý


ý

ý€þzSendotpAPIView.postNr_   r\   r\   r\   r]   r{   ë   ó    r{   c                   @   r-   )ÚSendotpsAPIViewc              
   C   sà   |j }zL| dd ¡}td|ƒ tjj|d� ¡ r%ttj	ddœdddœƒW S t
d	d
d�}tjj||t ¡ d�}tjt||fd� ¡  ttjddœd d|idœƒW S  tyo } zttjddœdt|ƒdœƒW  Y d }~S d }~ww )Nr2   r}   r1   zEmail already registeredr7   Tz;This email is already registered. Please use another email.r~   r   r€   r�   )r2   ru   rŽ   r„   r‡   rh   rˆ   )r<   rH   rs   r   rK   r‰   rŠ   r)   r+   ZHTTP_409_CONFLICTr&   r   rŒ   r   r�   r�   r‘   ry   r’   rR   rr   r“   rU   )rW   rX   r<   r2   ru   rY   rw   r\   r\   r]   r^     s4   


ý

ý
ý€ÿzSendotpsAPIView.postNr_   r\   r\   r\   r]   r•     r”   r•   ©r   c                   @   ó   e Zd Zdd„ Zdd„ ZdS )ÚVerifyotpAPIViewc                 C   sÆ   |j  d¡}|j  d¡}zAtjj|d� d¡}|jtdd� }t 	¡ |kr1t
ddd	d
œtjd�W S ||jkrBt
dddd
œtjd�W S t
ddd	d
œtjd�W S  tjyb   t
ddd	d
œtjd� Y S w )Nr2   ru   r1   rŽ   é<   )Úsecondsi‘  z&OTP expired. Please request a new one.T)r+   r;   r6   r*   éÈ   zOTP VerifiedFé�  zInvalid OTPé”  zOTP not found)Úquery_paramsrH   r   rK   r‰   ÚlatestrŽ   r   r   r�   r)   r+   rR   ru   rL   )rW   rX   r2   Zotp_enteredZuser_otpZexpiration_timer\   r\   r]   rH   5  sJ   ýü
ýüýüý
üÿzVerifyotpAPIView.getc                 C   s–   |d ur?z%t jj|d�}|jr|jjdd� d |_| ¡  ttjddœd ddœƒW S  t	y>   ttj
ddœd d	dœƒ Y S w ttjddœd
ddœƒS )Nr3   F)r�   r?   r7   z"Profile image deleted successfullyr~   ÚfailedzProfile not foundzID not providedzUser ID is required)r   rK   rH   rN   Údeleter�   r)   r+   rR   r   r‹   ÚHTTP_400_BAD_REQUEST)rW   rX   rA   rC   r\   r\   r]   r¡   \  s0   

ý
ýÿ
ýzVerifyotpAPIView.deleteN)r`   ra   rb   rH   r¡   r\   r\   r\   r]   r˜   4  s    'r˜   c                   @   s*   e Zd ZefZdd„ Zdd„ Zdd„ ZdS )ÚProfileupdateAPIViewc                 K   sº   |  d¡}|d ur[z<tjj |d�}tjj |jd�}|jr'|jjdkr'|jj}nd}|j|j|j	|j
|j||jdœ}ttjddœd |dœƒW S  tyZ   ttjd	dœd
ddœƒ Y S w d S )NrA   ©rA   r3   r=   )r@   r2   rF   Úf_nameZl_namerC   rA   r‡   r7   rh   ÚFailedTúCompany not foundr~   )rH   r   rK   r   rA   rN   rO   r@   r2   rF   rS   Ú	last_namer)   r+   rR   r   r‹   )rW   rX   ÚkwargsrA   rY   ÚcompanyÚprr<   r\   r\   r]   rH   �  s:   

ø

ý
ýÿãzProfileupdateAPIView.getc              
   C   sÖ   |j }z"| d¡}tjj|jjd�}||_| ¡  tt	j
ddœd ddœƒW S  tyH } ztt	jddœdd	t|ƒ› �dœƒW  Y d }~S d }~w tyj } ztt	jddœdd
t|ƒ› �dœƒW  Y d }~S d }~ww )NÚ
prof_photor3   r?   r7   zProfile updated successfullyr~   r    TúMissing required field: úAn error occurred: )r<   rH   r   rK   rY   rA   rN   r�   r)   r+   ÚHTTP_201_CREATEDÚKeyErrorr¢   rU   rr   r“   )rW   rX   r<   ZphoZtakerw   r\   r\   r]   r^   ©  s4   


ý
ý€
ý€ÿzProfileupdateAPIView.postc           
      C   sø   |j }|j  d¡}|j  d¡}|j  d¡}|j  d¡}zKtjj|d�}tjj|d�}	|d |	_|d |	_|d |	_|d |	_|	 	¡  |d |_|d |_
|d |_|d |_| 	¡  ttjd	d
œd ddœƒW S  ty{   ttjdd
œdddœƒ Y S w )Nr¬   Úphone_noÚemail_idrS   r3   r¤   Zfirst_namesr¨   r?   r7   úUser updated successfullyr~   r    TúSomething went wrong)r<   rH   r   rK   r   r/   rS   r¨   r2   r�   rF   r@   rN   r)   r+   r¯   r   r¢   )
rW   rX   rA   r<   r¬   r±   r²   rS   ÚmmÚsdr\   r\   r]   ÚputÏ  s<   









ý
ýÿzProfileupdateAPIView.putN)r`   ra   rb   r!   ri   rH   r^   r·   r\   r\   r\   r]   r£   }  s
    (&r£   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚRegisterAPIViewc                 K   s|  |  d¡}|d urezFtjj |d�}tjj |jd�}|jr'|jjdkr'|jj}nd}|j|j|j	|j
|j||j|j|j|j|j|jdœ}ttjddœd |dœƒW S  tyd   ttjd	dœd
ddœƒ Y S w |j  d¡}t|ƒ z¸g }|j  dd¡ ¡ }	|j  dd¡ ¡ }
|j  dd¡ ¡ }|j  dd¡ ¡ }|j  dd¡ ¡ }|dkr¯tjjddd� d¡}ntjjddd� d¡}|	rÂ|j|	d�}|rÊ|j|d�}|rÒ|j|d�}|
rÚ|j|
d�}|rözt|ƒ}|dv rë|j|d�}W n	 tyõ   Y nw |D ]"}tjj |jd�}|j|j|j	|j|j|j
|j	|jd œ}| |¡ qøttjddœd |dœƒW S  t�y=   ttj d	dœd
d!dœƒ Y S w )"NrA   r¤   rg   r=   )r@   r2   rF   ÚaddressÚpincoderC   Ú	firstnameÚlastnameÚgenderÚdojr0   rA   r‡   r7   rh   r¦   Tr§   r~   ÚvalÚ
vendornameÚ rº   r2   rF   r+   Ú2r5   r   ©r+   rG   z-user_idr   )Zname__icontains)Zemail__icontains)Zphone__icontains)Zpincode__icontains)r   r5   r*   )r@   rA   rF   rº   r2   r¹   rF   r+   r´   )!rH   r   rK   r   rA   rN   rO   r@   r2   rF   r¹   rº   rS   r¨   r½   r¾   r0   r)   r+   rR   r   r‹   ÚGETrs   rž   Ústripr‰   Úorder_byÚintÚ
ValueErrorr4   Úappendr¢   )rW   rX   r©   rA   rY   rª   r«   r<   r¿   r/   rº   r2   rF   Zstatus_paramÚ	companiesZ
status_intÚusersZcompany_datar\   r\   r]   rH     s¬   

ï

ý
ýÿ€ÿ	ó

ý
ýÿzRegisterAPIView.getc              
   C   s"  |j }zH| d¡}| d¡}| d¡}| d¡}| d¡}| d¡}t|ƒ}	t|||	d�}
|
 ¡  t||||||
d�}| ¡  ttjd	d
œd ddœƒW S  t	yn } zttj
dd
œddt|ƒ› �dœƒW  Y d }~S d }~w ty� } zttjdd
œddt|ƒ› �dœƒW  Y d }~S d }~ww )NZemployeenamer2   Úmobilenumberr¹   rº   r0   )r/   r2   r0   )r0   r@   r2   rF   r¹   rY   r?   r7   z New User Registered successfullyr~   r    Tr­   r®   )r<   rH   r   r   r�   r   r)   r+   r¯   r°   r¢   rU   rr   r“   )rW   rX   r<   r@   r2   rF   r¹   rº   r0   Úhashed_passwordZvanZprofile_datarw   r\   r\   r]   r^   ‹  sJ   





ý

ý
ý€
ý€ÿzRegisterAPIView.postc           
      C   s¤  |j  d¡}|j}|j d¡}|dkr6tjj|d�}|jdkr#d|_nd|_| ¡  ttj	ddœd d	d
œƒS |dkr]tjj|d�}|jdkrJd|_nd|_| ¡  ttj	ddœd dd
œƒS |r™tjj|d�}|d |_
|d |_|d |_|d |_|d |_|d |_|d |_| ¡  ttj	ddœd dd
œƒS z¢tjj|d�}tjj|d�}	|d |_|d |_|d |_|d |_|d |_|d |_|d |_|d |_|d |_|d |_|d |_|d  |_|d! |_|d" |_|d# |_ |d$ |_!|d% |_"|d& |_#|d' |_$|d( |_%| ¡  |d |	_&|d) |	_'|d* |	_(|d |	_t)|d( ƒ|	_%|	 ¡  ttj	ddœd d+d
œƒW S  t*�yQ   ttj+d,dœd-d.d
œƒ Y S w )/Nr¿   ÚctcÚ1r3   r   r5   r?   r7   zWFH updated successfullyr~   rÂ   zInactive updated successfullyÚgrossÚptÚuanÚpanÚaccountÚreimz#Salary details updated successfullyr¤   r@   ÚpemailÚshiftÚmarriedstatusr½   r2   rF   r¹   ÚcityÚstateÚcountryrº   Ú
departmentÚdesignationrG   Ú	authorityr¾   rN   Úempcoder0   r»   r¼   r³   r    Tr´   ),rÄ   rH   r<   r   rK   Zwfhr�   r)   r+   r¯   rÎ   rÐ   rÑ   rÒ   rÓ   rÔ   rÕ   r   r@   rÖ   r×   rØ   r½   r2   rF   r¹   rÙ   rÚ   rÛ   rº   Údepartment_idÚdesignation_idrG   Úauthority_idr¾   rN   rß   r0   r/   rS   r¨   r   r   r¢   )
rW   rX   rA   r¿   r<   rÎ   ZpoZmeowrµ   r¶   r\   r\   r]   r·   Í  s¤   

ý

ý







ý

























ý
ýÿzRegisterAPIView.putc                 O   s|   |  d¡}z#tjj |d�}| ¡  tjj |d�}| ¡  ttjddœd ddœƒW S  ty=   ttj	ddœd	d
dœƒ Y S w )NrA   r3   r¤   r?   r7   zCompany deleted successfullyr~   r    TúNo data found)
rH   r   rK   r¡   r   r)   r+   rR   r   r‹   )rW   r†   r©   Z
company_idr«   rª   r\   r\   r]   r¡   ,  s$   


ý
ýÿzRegisterAPIView.deleteN©r`   ra   rb   rH   r^   r·   r¡   r\   r\   r\   r]   r¸     s     B_r¸   c                   @   r-   )ÚCompanydashboardAPIViewc                 C   sâ   z[ddl m} |jj}tjj|d� ¡ }ddl m} ddlm	} |jj}|ƒ }d}d}d}	d}
d}d}d	}d}d}d
}d}d}|||	|
|||||||||dœ}t
tjddœd |dœƒW S  typ   t
tjddœdddœƒ Y S w )Nr   ©r�   ©rP   r–   r   é   é   é   é	   é   r5   )ÚtotalenquiryÚtotalvendorÚtotalenquirytodaydateÚactivevendorÚinactivevendorÚ	monthdataÚtotalvendorlastmonthÚcurrent_month_enquiryÚlast_month_enquiryÚcurrent_month_auctionÚlast_month_auctionÚcurrent_month_productÚlast_month_productr?   r7   rh   r    Trã   r~   )Údjango.utils.timezoner�   rY   rA   r   rK   r‰   Úcountr   r   r)   r+   rR   r   r‹   )rW   rX   r�   Úoprí   r   Úcurrent_dateró   rî   rï   rð   rò   rñ   rõ   rô   rö   r÷   rø   rù   r<   r\   r\   r]   rH   G  s\   ó

ý
ýÿzCompanydashboardAPIView.getN©r`   ra   rb   rH   r\   r\   r\   r]   rå   D  ó    rå   c                   @   r-   )ÚAdmindashboardAPIViewc              	   C   sR  z“ddl m} |jj}|ƒ }tjjddd� ¡ }tjjddd� ¡ }dd l}ddl	m	} g }	| ¡ j
}
| ¡ j}|d }ddlm} td|ƒD ]}|j| }d}|	 ||dœ¡ qGtjjdd	� ¡ }d}d}tjjdd	�}|D ]}zW qo tjy}   Y qow ||||||	d
œ}ttjddœd |dœƒW S  ty¨   ttjddœdddœƒ Y S w )Nr   ræ   r   rÃ   r5   ©r   r'   )Ú	monthnameÚcounts)rG   )ÚpaidcompanyÚunpaidcompanyÚtotalcompanyÚactivecompanyÚinactivecompanyrò   r?   r7   rh   r    Trã   r~   )rú   r�   rY   rA   r   rK   r‰   rû   Úcalendarr   ÚyearÚmonthÚdjango.db.modelsr(   ÚrangeÚ
month_abbrrÉ   ZPaymentrL   r)   r+   rR   r   r‹   )rW   rX   r�   rü   rý   r  r  r	  r   rò   Úcurrent_yearZcurrent_monthZbakr(   r  Ú
month_nameZpaymentr  r  r  ZqpÚbr<   r\   r\   r]   rH   ‹  sb   



þ
ÿ
ø


ý
ýÿzAdmindashboardAPIView.getNrþ   r\   r\   r\   r]   r   ˆ  rÿ   r   c                   @   ó   e Zd Zddd„ZdS )ÚCheckcompanyAPIViewNc           	      C   sî   |j  d¡}|j  d¡}|j  d¡}|j  d¡p|j  d¡}td|||ƒ |s-|s-|s-|rhtƒ }|r9|t|d�O }|rB|t|d�O }|rK|t|d	�O }|rT|t|d
�O }tj |¡ ¡ }tt	j
ddœd |dœƒS tt	jddœdddœt	jd�S )NrF   r2   r/   Ú	gstnumberÚgstzCheck Params:)r@   )rF   r1   )r  r?   r7   )r+   r6   rŠ   r    Tz!No phone, email, or GST provided.r~   r*   )rž   rH   rs   r   r   rK   r‰   rŠ   r)   r+   rR   r¢   )	rW   rX   rA   rF   r2   r@   r  ÚqueryrŠ   r\   r\   r]   rH   ß  s8   
ý
ýüzCheckcompanyAPIView.getre   rþ   r\   r\   r\   r]   r  Þ  s    r  c                   @   ó4   e Zd ZefZd
dd„Zdd„ Zdd„ Zdd	„ ZdS )ÚProductAPIViewNc                 C   sP  |d u�rZ�z=t jj|d�}i d|j“d|j“d|j“d|j“d|j“d|j“d|j	“d	|j
“d
|j“d|j“d|j“d|j“d|j“d|j“d|j“d|j“d|j“i d|j“d|j“d|j“d|j“d|j“d|j“d|j“d|j“d|j“d|j“d|j“d|j“d|j “d |j!“d!|j"“d"|j#“d#|j$“¥i d$|j%“d%|j&“d&|j'“d'|j(“d(|j)“d)|j*“d*|j+“d+|j,“d,|j-“d-|j.“d.|j/“d/|j0“d0|j1“d1|j2“d2|j3“d3|j4“d4|j5“¥i d5|j6“d6|j7“d7|j8“d8|j9“d9|j:“d:|j;“d;|j<“d<|j=“d=|j>“d>|j?“d?|j@“d@|jA“dA|jB“dB|jC“dC|jD“dD|jE“dE|jF“¥|jG|jH|jI|jJ|jK|jL|jMdFœ¥}tNtOjPdGdHœd |dIœƒW S  tQ�yY   tNtOjRdJdHœdKdLdMœƒ Y S w z7dN}g }t jjS|jTjdO�}|D ]}|dP7 }| U||j|j|j|j|j|jOdQœ¡ �qjtNtOjPdGdHœd |dIœƒW S  tQ�y§   tNtOjRdJdHœdKdLdMœƒ Y S w )RNr¤   rA   Úcompany_nameÚapplicationÚproject_namerÛ   ÚbidclosedateÚdeliverydateÚs2dailyflowÚs2monthflowÚ
s2weekflowÚs2maxdailyflowÚ
s2hourflowÚs2bodÚs2bodoutÚ	s2bodrateÚs2codÚs2codoutÚ	s2codrateÚs2tssÚs2tssoutÚ	s2tssrateÚs2tnÚs2tnoutÚs2tnrateÚs2tpÚs2tpoutÚs2tprateÚs2oilÚs2oiloutÚ	s2oilrateÚs2avgwatertempÚs2avgwatertempoutÚs2avgwatertemprateÚs2maxwatertempÚs2maxwatertempoutÚs2maxwatertemprateÚs2minwatertempÚs2minwatertempoutÚs2minwatertemprateÚ	Davgflux1Ú	Davgflux2Ú	DpeakfluxÚMsurfacearea1ÚMsurfacearea2ÚproductcodeÚ
NoofmoduleÚ
NoofmtrainÚNoofmptrainÚTNMÚTMsurfaceareaÚ	Aavgflux1Ú	Aavgflux2Ú
Apeakflux1Ú
Apeakflux2Ús4AT1Ús4AT2Ús4AT3Ús4AT4Ús4AT5Ús4AT6Ús4AT7Ús4TT1Ús4TT2Ús4TT3Ús4TT4Ús4TT5Ús4TT6Ús4TT7)Ús4MT1Ús4MT2Ús4MT3Ús4MT4Ús4MT5Ús4MT6Ús4MT7r?   r7   rh   r    Trã   r~   r   rç   r   )ÚrowrA   r  r  r  rÛ   r+   )Vr   rK   rH   rA   r  r  r  rÛ   r  r  r  r  r   r!  r"  r#  r$  r%  r&  r'  r(  r)  r*  r+  r,  r-  r.  r/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r^  r_  r`  ra  r)   r+   rR   r   r‹   r‰   rY   rÉ   )rW   rX   rA   rª   r<   ÚindexrÊ   Zproductsr\   r\   r]   rH     sv  
ÿþýüûúù
öõôóòñðïíìëéèçåäã à!ß"Þ$Ü%Û&Ú(Ø)×*Ö,Ô-Ó.Ò0Ð1Ï2Î9Ç:Æ;Å=Ã>Â?ÁB¾C½D¼E»FºG¹H¸I·J¶L´M³N²O±P°Q¯R®T¬U«VªW©X¨Y§Z¦\žo

ý
ýÿ÷

ý
ýÿzProductAPIView.getc              
   C   sj  |j }�zŽtjjdSi d|d “d|d “d|d “d|d “d|d “d|d “d|d “d|d “d	|d	 “d
|d
 “d|d “d|d “d|d “d|d “d|d “d|d “d|d “d|d “d|d “d|d “d|d “d|d “d|d “d|d “d|d “d|d “d|d “d|d “d|d “d|d “d|d “d |d  “d!|d! “d"|d" “d#|d# “d$|d$ “d%|d% “d&|d& “d'|d' “d(|d( “d)|d) “d*|d* “d+|d+ “d,|d, “d-|d- “d.|d. “d/|d/ “d0|d0 “d1|d1 “d2|d2 “d3|d3 “d4|d4 “d5|d5 “d6|d6 “d7|d7 “d8|d8 “d9|d9 “d:|d: “d;|d; “d<|d< “d=|d= “d>|d> “d?|d? “d@|d@ “dA|dA “dB|dB “dC|dC “dD|dD “dE|dE “dF|dF “dG|dG “dH|dH “dI|dI “dJ|dJ “dK|j“Ž}| ¡  ttjdLdMœd dNdOœƒW S  t	�y´ } zttj
dPdMœdQdR|› �dOœƒW  Y d }~S d }~ww )TNr  r  r  rÛ   r  r  r  r  r   r!  r"  r#  r$  r%  r&  r'  r(  r)  r*  r+  r,  r-  r.  r/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r^  r_  r`  ra  Ú
created_byr?   r7   zProduct created successfullyr~   r    Tr­   r\   )r<   r   rK   rŒ   rY   r�   r)   r+   r¯   r°   r¢   ©rW   rX   r<   rª   rw   r\   r\   r]   r^   ³  sN  ÿþýüúù
öõôóòñðïîíìëêéèçæåäãâá à!ß"Þ#Ý$Ü%Û&Ú'Ù(Ø)×,Ô-Ó.Ò/Ñ0Ð1Ï2Î3Í4Ì5Ë6Ê7É8È9Ç:Æ=Ã>Â?Á@ÀA¿B¾C½FºG¹H¸I·J¶KµL´N²O±P°Q¯R®S­T¬\¤^

ý
ý€ÿzProductAPIView.postc              
   C   sJ  |j }�zhtjj|d�}| d|j¡|_| d|j¡|_| d|j¡|_| d|j¡|_| d|j¡|_| d|j	¡|_	| d|j
¡|_
| d	|j¡|_| d
|j¡|_| d|j¡|_| d|j¡|_| d|j¡|_| d|j¡|_| d|j¡|_| d|j¡|_| d|j¡|_| d|j¡|_| d|j¡|_| d|j¡|_| d|j¡|_| d|j¡|_| d|j¡|_| d|j¡|_| d|j¡|_| d|j¡|_| d|j¡|_| d|j¡|_| d|j¡|_| d|j ¡|_ | d|j!¡|_!| d |j"¡|_"| d!|j#¡|_#| d"|j$¡|_$| d#|j%¡|_%| d$|j&¡|_&| d%|j'¡|_'| d&|j(¡|_(| d'|j)¡|_)| d(|j*¡|_*| d)|j+¡|_+| d*|j,¡|_,| d+|j-¡|_-| d,|j.¡|_.| d-|j/¡|_/| d.|j0¡|_0| d/|j1¡|_1| d0|j2¡|_2| d1|j3¡|_3| d2|j4¡|_4| d3|j5¡|_5| d4|j6¡|_6| d5|j7¡|_7| d6|j8¡|_8| d7|j9¡|_9| d8|j:¡|_:| d9|j;¡|_;| d:|j<¡|_<| d;|j=¡|_=| d<|j>¡|_>| d=|j?¡|_?| d>|j@¡|_@| d?|jA¡|_A| d@|jB¡|_B| dA|jC¡|_C| dB|jD¡|_D| dC|jE¡|_E| dD|jF¡|_F| dE|jG¡|_G| dF|jH¡|_H| dG|jI¡|_I| dH|jJ¡|_J| dI|jK¡|_K| dJ|jL¡|_L| dK|jM¡|_M| N¡  tOtPjQdLdMœd dNdOœƒW S  tR�y‚   tOtPjSdPdMœdQdRdOœƒ Y S  tT�y¤ } ztU|ƒ tOtPjVdPdMœdQdSdOœƒW  Y d }~S d }~ww )TNr¤   r  r  r  rÛ   r  r  r  r  r   r!  r"  r#  r$  r%  r&  r'  r(  r)  r*  r+  r,  r-  r.  r/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r^  r_  r`  ra  r?   r7   zProduct updated successfullyr~   r    Trã   r´   )Wr<   r   rK   rH   r  r  r  rÛ   r  r  r  r  r   r!  r"  r#  r$  r%  r&  r'  r(  r)  r*  r+  r,  r-  r.  r/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r^  r_  r`  ra  r�   r)   r+   rR   r   r‹   rr   rs   r¢   ©rW   rX   rA   r<   rª   rw   r\   r\   r]   r·   '  sÄ   

ý
ý
ý€þzProductAPIView.putc                 C   sj   |d ur3zt jj|d�}| ¡  ttjddœd ddœƒW S  t jy2   ttjddœd ddœƒ Y S w d S )Nr¤   r?   r7   zProduct deleted successfullyr~   r    zNo product found)	r   rK   rH   r¡   r)   r+   rR   rL   r‹   )rW   rX   rA   Úproductr\   r\   r]   r¡   ­  s"   

ý
ýÿêzProductAPIView.deletere   ©	r`   ra   rb   r!   ri   rH   r^   r·   r¡   r\   r\   r\   r]   r    s    
 ,t r  c                   @   s   e Zd Zddd„Zdd„ ZdS )ÚClientAPIViewNc           	      C   s:  |d urUz;t jj|d�}z|jr|jjnd }W n ty"   d }Y nw |j|j|j|j	|j
||jdœ}ttjddœd |dœƒW S  tyT   ttjddœddd	œƒ Y S w z2d
}g }tj ¡ }|D ]}|d7 }| ||j|j|j|j|j|jdœ¡ qattjddœd |dœƒW S  tyœ   ttjddœddd	œƒ Y S w )Nr¤   )rA   r@   r8   ÚdescriptionÚspecificationÚsfiler+   r?   r7   rh   r    Trã   r~   r   r   )rb  rA   Úclient_namerF   r2   r¹   r¾   )r   rK   rH   rl  rO   rÈ   rA   r@   r8   rj  rk  r+   r)   rR   r   r‹   r
   ÚallrÉ   rm  rF   r2   r¹   r¾   )	rW   rX   rA   rª   Zflr<   rc  rÊ   Úclientr\   r\   r]   rH   Ñ  sn   ÿø

ý
ýÿ

ø

ý
ýÿzClientAPIView.getc              
   C   s–   |j }z&tjj|d |d |d d�}| ¡  ttjddœd d|j|j	dœd	œƒW S  t
yJ } zttjd
dœdd|› �dœƒW  Y d }~S d }~ww )NZ
clientNamerÌ   r¹   )rm  rF   r¹   r?   r7   zClient created successfully)rA   ro  r:   r    Tr­   r~   )r<   r
   rK   rŒ   r�   r)   r+   r¯   rA   rm  r°   r¢   re  r\   r\   r]   r^   "  s0   ü
þ
ü	
ý€ÿzClientAPIView.postre   ©r`   ra   rb   rH   r^   r\   r\   r\   r]   ri  Î  s    
Qri  c                   @   s   e Zd ZefZdd„ ZdS )ÚDashboardapiAPIViewc                 C   sP  |j  dd ¡}z|rt |d¡ ¡ nt ¡ }W n   t ¡ }Y tjjdd�}| 	¡ }t
jj|dd�}| 	¡ }|jddd	�}|j|d
�}	g }
|	D ]}|jrT| |jj¡nd }|
 |j|dœ¡ qHt dd¡ ¡ }|j|d� 	¡ }|dkr|t|| d ƒnd}|dkrŠt|| d ƒnd}tdddœd|||dœd|||dœ|
| d¡dœdœƒS )Nr   ú%Y-%m-%dr   r*   ÚPresent)r   r+   Úemployee_idT©Úflat©Zid__in)r@   Úimagez09:30:00z%H:%M:%S)Zin_time__gtr   éd   r›   r?   r7   zActive Staff)ÚlabelZpresentÚtotalÚpercentz
Late Entry)Zn_dataZs_dataÚabsent_employeesZselected_date©r+   r<   )rž   rH   r   Ústrptimer   Útodayr   rK   r‰   rû   r   Úvalues_listÚexcludeÚphotoÚbuild_absolute_urirO   rÉ   r@   r"   rÇ   r)   Ústrftime)rW   rX   Údate_strÚtarget_dateZall_empÚtotal_countZpresent_todayÚpresent_countZpresent_emp_idsZabsent_empsÚabsent_listÚempZ	image_urlZlate_thresholdZ
late_countZ	p_percentZ	l_percentr\   r\   r]   rH   ‘  sL    

þüüòþzDashboardapiAPIView.getN©r`   ra   rb   r!   ri   rH   r\   r\   r\   r]   rq  Ž  ó    rq  c                   @   r-   )ÚStudentClassCountAPIViewc              
   C   s”   z,t dƒ tjj|dd� ¡ }tjj|dd� ¡ }t ||dƒ tdddœ||d	œd
œƒW S  tyI } ztdt|ƒitj	d�W  Y d }~S d }~ww )NZJndddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddr   )Ú
student_idÚsession_typer5   Zjsabdbsdsmdbasmdbsandr›   r?   r7   )Únormal_countÚspecial_countr~  r6   r*   )
rs   r   rK   r‰   rû   r)   rr   rU   r+   r¢   )rW   rX   rA   r‘  r’  rw   r\   r\   r]   rH   Ì  s   þ
þ"€ÿzStudentClassCountAPIView.getNrþ   r\   r\   r\   r]   rŽ  Ë  r”   rŽ  c                   @   s.   e Zd Zd
dd„Zdd„ Zdd„ Zdd	„ ZdS )ÚEmployeeAPIViewNc           	      C   s®  |d urkzPt jj|d�}|j|j|j|j|j|jr|jjnd |jr%|jjnd|j	r-|j	jnd |j	r5|j	jnd|j
|j|jrD| |jj¡nd dœ}ttjddœd |dœƒW S  t jyj   ttjddœdd	d
œƒ Y S w zKt j ¡  d¡}g }t|dƒD ].\}}| ||j|j|j|jr�|jjnd|j	r—|j	jnd|j|jr¤| |jj¡nd dœ¡ q{ttjddœd |dœƒW S  tyÖ } zttjddœdt|ƒd
œƒW  Y d }~S d }~ww )Nr¤   zN/A)rA   r@   ÚmobileÚager¹   rà   Zdepartment_namerá   Zdesignation_namer¾   r+   Úprofile_picr?   r7   rh   r    TzNo employee foundr~   ú-created_atr   )rb  rA   r@   r”  rÜ   rÝ   r+   r–  )r   rK   rH   rA   r@   r”  r•  r¹   rÜ   rÝ   r¾   r+   rƒ  r„  rO   r)   rR   rL   r‹   rn  rÆ   Ú	enumeraterÉ   rr   r¢   rU   )	rW   rX   rA   r‹  r<   Ú	employeesZemp_listrc  rw   r\   r\   r]   rH   æ  sn   ô

ý
ýÿ
ø


ý
ý€ÿzEmployeeAPIView.getc           
      C   sþ   |j }|j d¡}zR| d¡}| d¡}|rtjj|d�nd }|r(tjj|d�nd }tjj| d¡| d¡| d¡| d¡||| d	¡||jj	rK|jnd d
�	}t
tjddœd ddœƒW S  ty~ }	 zt
tjddœddt|	ƒ› �dœƒW  Y d }	~	S d }	~	ww )Nr–  rÜ   rÝ   r¤   r@   r”  r•  r¹   r¾   )	r@   r”  r•  r¹   rÜ   rÝ   r¾   rƒ  rd  r?   r7   zEmployee created successfullyr~   r    TzError: )r<   ÚFILESrH   r   rK   r   r   rŒ   rY   Úis_authenticatedr)   r+   r¯   rr   r¢   rU   )
rW   rX   r<   r–  Zdept_idZdesig_idZdeptZdesigÚemployeerw   r\   r\   r]   r^     s>   

÷

ý
ý€ÿzEmployeeAPIView.postc              
   C   sH  |j }|j d¡}zitjj|d�}d|v r tjj| d¡d�|_d|v r/tjj| d¡d�|_| d|j	¡|_	| d|j
¡|_
| d|j¡|_| d|j¡|_| d	|j¡|_| d
|j¡|_|rd||_| ¡  tdddœddœƒW S  tjy†   tdddœddœƒ Y S  ty£ } ztdddœt|ƒdœƒW  Y d }~S d }~ww )Nr–  r¤   rÜ   rÝ   r@   r”  r•  r¹   r¾   r+   r›   r?   r7   zEmployee updated successfully©r+   r;   r�   r    zEmployee not foundrœ   )r<   rš  rH   r   rK   r   rÜ   r   rÝ   r@   r”  r•  r¹   r¾   r+   rƒ  r�   r)   rL   rr   rU   )rW   rX   rA   r<   r–  r‹  rw   r\   r\   r]   r·   B  s6   
þ$€ÿzEmployeeAPIView.putc                 C   sV   zt jj|d�}| ¡  tdddœddœƒW S  t jy*   tdddœd	dœƒ Y S w )
Nr¤   r›   r?   r7   zEmployee deletedr�  r�   r    z	Not found)r   rK   rH   r¡   r)   rL   )rW   rX   rA   r‹  r\   r\   r]   r¡   e  s   
þÿzEmployeeAPIView.deletere   rä   r\   r\   r\   r]   r“  ã  s
    
8$#r“  c                   @   r-   )ÚFetchdesignationAPIViewc                 C   sH   t jj|d�}g }|D ]}| |j|jdœ¡ qttjddœd |dœƒS )N)rà   )r@   rA   r?   r7   rh   )	r   rK   r‰   rÉ   r@   rA   r)   r+   rR   )rW   rX   rA   rª   r<   Úir\   r\   r]   rH   �  s   
þ
ýzFetchdesignationAPIView.getNrþ   r\   r\   r\   r]   rž  �  r”   rž  c                   @   r-   )ÚStudentStatusAPIViewc                 C   sn   z$t jj|d�}|jdkrd|_nd|_| ¡  tdddœ|jddœƒW S  t jy6   td	d
idd� Y S w )Nr¤   r   r5   r›   r?   r7   zStatus updated successfully)r+   Z
new_statusr;   r6   zStudent not foundr�   r*   )r   rK   rH   r+   r�   r)   rL   )rW   rX   rA   Ústudentr\   r\   r]   Úpatch¤  s   

ýÿzStudentStatusAPIView.patchN)r`   ra   rb   r¢  r\   r\   r\   r]   r   £  r”   r   r  c                   @   s   e Zd ZegZdd„ ZdS )ÚMonthlyAttendanceAPIViewc              
   C   sð  t |j dt ¡ j¡ƒ}t |j dt ¡ j¡ƒ}|j d¡}t ||¡d }tj	| d d… }g }t
d|d ƒD ]}| ||› d|d›�dœ¡ q8|rW|d	krWtjj|d
�}	ntj ¡ }	tjj||d�}
g }|	D ]ˆ}i }d}d}d}d}|D ]l}|d }|
j|j|dd� ¡ }|
j|j|dd� ¡ }|r›|jdkr›dn|rŸdnd}|rª|jdkrªdn|r®dnd}||d|› d�< ||d|› d�< |dkrÉ|d7 }n|dkrÑ|d7 }|dkrÚ|d7 }qv|dkrâ|d7 }qv| |j|||||dœ¡ qht||dœƒS )Nr  r
  r�  r   é   ú Ú02d)Úday_numÚdisplayrn  r¤   )Zdate__monthZ
date__yearr   r§  )r�  Z	date__dayr�  r5   rs  ÚPÚAú-Zday_Z_nZ_s)r@   Ú
attendanceÚ	total_n_pÚ	total_n_aÚ	total_s_pÚ	total_s_a©ÚdaysÚreport)rÇ   rž   rH   r   r�   r  r
  r	  Ú
monthranger  r  rÉ   r   rK   r‰   rn  r   rA   Úfirstr+   ÚstudentNamer)   )rW   rX   r  r
  Zstudent_id_paramZnum_daysr  Z	days_listÚdZstudentsÚattendance_recordsZreport_datar¡  Zstudent_attr­  r®  r¯  r°  Zday_objZn_recZs_recZn_statusZs_statusr\   r\   r]   rH   »  s^   
þ
€
ú	þzMonthlyAttendanceAPIView.getNrŒ  r\   r\   r\   r]   r£  ¸  r�  r£  c                   @   r—   )ÚAttendanceAPIViewc           	      C   sä   zQ|j  dt ¡  ¡ ¡}|j  d¡}tjj|d� d¡}|r$|j|d�}g }t	|dƒD ]\}}| 
||j|jj|jj|j|j|jdœ¡ q+ttjdd	œd |d
œƒW S  tyq } zttjdd	œdt|ƒdœƒW  Y d }~S d }~ww )Nr   r�  ©r   r—  )r�  r   )rb  rA   Z	studentIdr¶  r+   r�  r   r?   r7   rh   r    Tr~   )rž   rH   r   r€  Ú	isoformatr   rK   r‰   rÆ   r˜  rÉ   rA   r¡  r¶  r+   r�  r)   rR   rr   r¢   rU   )	rW   rX   Z
query_dater�  ZattendancesZattendance_listrc  Zattrw   r\   r\   r]   rH   þ  s<   
ù


ý
ý€ÿzAttendanceAPIView.getc                 C   sˆ  |j  d¡}|stddidd�S �zt |¡}|jdkr!| d¡}t |¡}t	 
|¡}|s6tddidd�W S |d }d }tjjd	d
�jdd�}|D ]k}	zPtj tjt|	jƒ¡}
td|	j› d|	j› �ƒ tj |
¡skW qIt |
¡}|jdkrz| d¡}t |¡}t	 
|¡}|ršt	j|d g|dd�}|d rš|	}W  qµW qI ty´ } ztd|› �ƒ W Y d }~qId }~ww |�rt ¡  ¡ }t ¡  ¡ }tjj|j |d� !¡ }|såtjj"|j |d|d�}d|j› �}d}n||_#| $¡  d|j› �}d}tt%j&ddœ||j|dœdœt%j&d�W S tt%j'ddœddœt%j'd�W S  t�yC } z td t|ƒƒ tt%j(d!dœd"t|ƒ› �dœt%j(d�W  Y d }~S d }~ww )#Nrx  r;   zImage not foundrœ   r*   ÚRGBu[   à®®à¯�à®•à®¤à¯�à®¤à¯ˆ à®…à®Ÿà¯ˆà®¯à®¾à®³à®®à¯� à®•à®¾à®£ à®®à¯�à®Ÿà®¿à®¯à®µà®¿à®²à¯�à®²à¯ˆ!r   T)Zphoto__isnullrÁ   )rƒ  zChecking Employee: z
 | Image: g      à?)Z	tolerancezProfile error: )rt  r   rs  )rt  r   r+   Úin_timezIn-Time Marked: ÚinzOut-Time Marked: Úoutr?   r7   )r@   Úaction)r+   r;   r<   r    uÁ   à®®à¯�à®•à®®à¯� à®ªà¯Šà®°à¯�à®¨à¯�à®¤à®µà®¿à®²à¯�à®²à¯ˆ! à®¨à¯€à®™à¯�à®•à®³à¯� à®ªà®¤à®¿à®µà¯� à®šà¯†à®¯à¯�à®¤ à®Šà®´à®¿à®¯à®°à¯� à®¤à®¾à®©à®¾ à®Žà®© à®šà®°à®¿à®ªà®¾à®°à¯�à®•à¯�à®•à®µà¯�à®®à¯�.r�  zERROR IN ATTENDANCE:r6   zServer Error: ))rš  rH   r)   r   ÚopenÚmodeÚconvertÚnpÚarrayÚface_recognitionZface_encodingsr   rK   r‚  ÚosÚpathÚjoinr   Ú
MEDIA_ROOTrU   rƒ  rs   r@   rŠ   Zcompare_facesrr   r   r�   r   r"   r   r‰   rA   rµ  rŒ   Úout_timer�   r+   rR   rV   r“   )rW   rX   Úuploaded_fileÚimgZtarget_imageZtarget_encodingsZtarget_encodingZ
found_userZall_profilesrC   Z
image_pathZknown_img_rawZknown_imageZknown_encodingsÚmatchesZinner_er€  Znow_timer¬  ÚmsgrÀ  rw   r\   r\   r]   r^   !  sœ   









€€þü
þýù

þý
þý€ýzAttendanceAPIView.postNrp  r\   r\   r\   r]   r¹  û  s    #r¹  c                   @   r  )ÚDesignationAPIViewNc              	   C   s(  |d ur9zt jj|d�}|j|j|j|jdœ}ttj	ddœd |dœƒW S  t
y8   ttjddœddd	œƒ Y S w zEd
}g }t j ¡ D ].}|d7 }ztjj|jd�}|j}W n tjyb   d}Y nw | ||j|j|j|dœ¡ qCttj	ddœd |dœƒW S  t
y“   ttjddœddd	œƒ Y S w )Nr¤   )rA   r@   rj  rÜ   r?   r7   rh   r    Trã   r~   r   r   rÁ   )rb  rA   r@   rj  rÜ   )r   rK   rH   rA   r@   rj  rà   r)   r+   rR   r   r‹   rn  r   rL   rÉ   )rW   rX   rA   rÝ   r<   rc  ZdesignationsrÜ   r\   r\   r]   rH   ‹  sd   ü

ý
ýÿ
ÿ
û

ý
ýÿzDesignationAPIView.getc              
   C   s˜   |j }z'tjj|d |d tjj|d d�|jd�}| ¡  tt	j
ddœd dd	œƒW S  tyK } ztt	jd
dœdd|› �d	œƒW  Y d }~S d }~ww )Nr@   rj  rÜ   r¤   )r@   rj  rÜ   rd  r?   r7   z Designation created successfullyr~   r    Tr­   )r<   r   rK   rŒ   r   rH   rY   r�   r)   r+   r¯   r°   r¢   )rW   rX   r<   rÜ   rw   r\   r\   r]   r^   Ã  s,   ü

ý
ý€ÿzDesignationAPIView.postc                 C   sŠ   |j }z,tjj|d�}|d |_|d |_tjj|d d�|_| ¡  t	t
jddœd ddœƒW S  tyD   t	t
jd	dœd
ddœƒ Y S w )Nr¤   r@   rj  rÜ   r?   r7   z Designation updated successfullyr~   r    Trã   )r<   r   rK   rH   r@   rj  r   rÜ   r�   r)   r+   rR   r   r‹   )rW   rX   rA   r<   rÝ   r\   r\   r]   r·   Û  s&   



ý
ýÿzDesignationAPIView.putc                 C   s|   |d ur2zt jj|d�}| ¡  ttjddœd ddœƒW S  ty1   ttjddœd ddœƒ Y S w ttj	ddœd ddœƒS )	Nr¤   r?   r7   z Designation deleted successfullyr~   r    rã   r´   )
r   rK   rH   r¡   r)   r+   rR   r   r‹   r¢   )rW   rX   rA   rÝ   r\   r\   r]   r¡   ò  s*   

ý
ýÿ
ýzDesignationAPIView.deletere   rh  r\   r\   r\   r]   rÐ  ˆ  s    
8rÐ  c                   @   r  )ÚDepartmentAPIViewNc                 C   óî   |d ur7zt jj|d�}|j|j|jdœ}ttjddœd |dœƒW S  t	y6   ttj
ddœddd	œƒ Y S w z*d
}g }t j ¡ D ]}|d7 }| ||j|j|jdœ¡ qAttjddœd |dœƒW S  t	yv   ttj
ddœddd	œƒ Y S w )Nr¤   )rA   r@   rj  r?   r7   rh   r    Trã   r~   r   r   )rb  rA   r@   rj  )r   rK   rH   rA   r@   rj  r)   r+   rR   r   r‹   rn  rÉ   ©rW   rX   rA   rª   r<   rc  rÊ   r\   r\   r]   rH   	  óT   ý

ý
ýÿ
ü

ý
ýÿzDepartmentAPIView.getc              
   C   sˆ   |j }ztjj|d |d |jd�}| ¡  ttjddœd ddœƒW S  t	yC } zttj
ddœd	d
|› �dœƒW  Y d }~S d }~ww )Nr@   rj  )r@   rj  rd  r?   r7   zDepartment created successfullyr~   r    Tr­   )r<   r   rK   rŒ   rY   r�   r)   r+   r¯   r°   r¢   re  r\   r\   r]   r^   >	  s*   ý

ý
ý€ÿzDepartmentAPIView.postc              
   C   s¸   |j }z"tjj|d�}|d |_|d |_| ¡  ttj	ddœd ddœƒW S  t
y:   ttjddœd	d
dœƒ Y S  ty[ } zt|ƒ ttjddœd	ddœƒW  Y d }~S d }~ww )Nr¤   r@   rj  r?   r7   úDepartment updated successfullyr~   r    Trã   r´   )r<   r   rK   rH   r@   rj  r�   r)   r+   rR   r   r‹   rr   rs   r¢   rf  r\   r\   r]   r·   U	  s4   



ý
ý
ý€þzDepartmentAPIView.putc                 C   óh   |d ur2zt jj|d�}| ¡  ttjddœd ddœƒW S  ty1   ttjddœd ddœƒ Y S w d S ©Nr¤   r?   r7   zDepartment deleted successfullyr~   r    rã   ©	r   rK   rH   r¡   r)   r+   rR   r   r‹   ©rW   rX   rA   rª   r\   r\   r]   r¡   q	  ó"   

ý
ýÿözDepartmentAPIView.deletere   rh  r\   r\   r\   r]   rÑ  
	  s    
1rÑ  c                   @   r  )Ú
AnnAPIViewNc                 C   rÒ  )Nr¤   )rA   r   rj  r?   r7   rh   r    Trã   r~   r   r   )rb  rA   r   rj  )r   rK   rH   rA   r   rj  r)   r+   rR   r   r‹   rn  rÉ   rÓ  r\   r\   r]   rH   ‡	  rÔ  zAnnAPIView.getc              
   C   s˜   |j }z'|d }|d }tjj|d |d |jd�}| ¡  ttjddœd ddœƒW S  t	yK } zttj
ddœd	d
|› �dœƒW  Y d }~S d }~ww )Nr   rj  )r   rj  rd  r?   r7   z!Announcement created successfullyr~   r    Tr­   )r<   r   rK   rŒ   rY   r�   r)   r+   r¯   r°   r¢   )rW   rX   r<   r   rj  rª   rw   r\   r\   r]   r^   ¸	  s.   ý

ý
ý€ÿzAnnAPIView.postc              
   C   sÈ   |j }z*|d }|d }tjj|d�}|d |_|d |_| ¡  ttj	ddœd ddœƒW S  t
yB   ttjddœd	d
dœƒ Y S  tyc } zt|ƒ ttjddœd	ddœƒW  Y d }~S d }~ww )Nr   rj  r¤   r?   r7   z!Announcement updated successfullyr~   r    Trã   r´   )r<   r   rK   rH   r   rj  r�   r)   r+   rR   r   r‹   rr   rs   r¢   )rW   rX   rA   r<   r   rj  rª   rw   r\   r\   r]   r·   Ò	  s8   



ý
ý
ý€þzAnnAPIView.putc                 C   rÖ  r×  )	r   rK   rH   r¡   r)   r+   rR   r   r‹   rÙ  r\   r\   r]   r¡   ö	  rÚ  zAnnAPIView.deletere   rh  r\   r\   r\   r]   rÛ  „	  s    
1$rÛ  c                   @   r  )ÚLeaveAPIViewNc           	      C   s  |d ur=z#t jj|d�}|j|j|j|j|j|jdœ}t	tj
ddœd |dœƒW S  ty<   t	tjddœddd	œƒ Y S w z<d
}g }t jj|jd�D ]"}|d7 }|j}| d¡}| ||j|j|j|j||j|jdœ¡ qJt	tj
ddœd |dœƒW S  tyŽ   t	tjddœddd	œƒ Y S w )Nr¤   )rA   r@   rj  Ú	totaldaysÚ
leavedatesr+   r?   r7   rh   r    Trã   r~   r   rç   r   ú%Y-%m-%d %H:%M:%S)rb  rA   ÚtypeÚreasonÚtdr   r+   Úwhy)r	   rK   rH   rA   rà  rá  Ú
total_daysÚleave_datesr+   r)   rR   r   r‹   r‰   rY   Ú
created_atr…  rÉ   rã  )	rW   rX   rA   rª   r<   rc  rÊ   Útfr†  r\   r\   r]   rH   
  sf   ú	

ý
ýÿ

ø

ý
ýÿzLeaveAPIView.getc              
   C   s  |j }zc|d }|d }t|d |d |d |d |jd�}| ¡  tjj|jd�}tjj|jd�}|j}d}	d}
d	|j	› d
|› d|› d|	› d�	}|j}t
|
|tj|gd�}| ¡  ttjddœd ddœƒW S  ty‡ } zttjddœdd|› �dœƒW  Y d }~S d }~ww )Nr@   Útotaldayrj  Ú	leavedate)rà  rá  rä  rå  rd  r3   z+https://pearlpackagingindia.com/manageleaveúLeave requestz
            Hi am z,,

            This is my leave request for z.

            Total days: z[

            

            You can log in using the following link and check:
            z)

            

            
            ©rv   ÚbodyÚ
from_emailÚtor?   r7   z"Leave request created successfullyr~   r    Tr­   )r<   r	   rY   r�   r   rK   rH   râ   r2   r@   r#   r   ÚEMAIL_HOST_USERÚsendr)   r+   r¯   r°   r¢   )rW   rX   r<   ZcasualÚmanZleave_requestÚjkZmeesiÚroÚ	login_urlrv   rì  Úwer2   rw   r\   r\   r]   r^   K
  s^   ûÿýû
öü	

ý
ý€ÿzLeaveAPIView.postc              
   C   sÌ   |j }z,tjj|d�}|d |_|d |_|d |_|d |_| ¡  t	t
jddœd dd	œƒW S  tyD   t	t
jd
dœddd	œƒ Y S  tye } zt|ƒ t	t
jd
dœddd	œƒW  Y d }~S d }~ww )Nr¤   r@   rj  ré  rè  r?   r7   rÕ  r~   r    Trã   r´   )r<   r	   rK   rH   rà  rá  rå  rä  r�   r)   r+   rR   r   r‹   rr   rs   r¢   rf  r\   r\   r]   r·   �
  s8   





ý
ý
ý€þzLeaveAPIView.putc                 C   rÖ  r×  rØ  rÙ  r\   r\   r]   r¡   ®
  rÚ  zLeaveAPIView.deletere   rh  r\   r\   r\   r]   rÜ  	
  s    
=DrÜ  c                   @   s$   e Zd ZefZddd„Zdd„ ZdS )ÚManageleaveAPIViewNc                 C   s€  |d ur?z%t jj|d�}|j|j|jt|jƒ|j|j	dœ}t
tjddœd |dœƒW S  ty>   t
tjddœddd	œƒ Y S w zkd
}g }tjj|jd�}|D ]O}t jj|jd�D ]D}|d7 }|j}	|	 d¡}
z|j}tjj|d�}|jd |j }W n ttjfyˆ   d}Y nw | ||j|j|j|j|
|j|dœ¡ qXqNt
tjddœd |dœƒW S  ty¿   t
tjddœddd	œƒ Y S w )Nr¤   )rA   r@   rj  rÝ  rÞ  rã  r?   r7   rh   r    Trã   r~   r   )râ   )rd  r   rß  r¥  ÚUnknown)rb  rA   rà  rá  râ  r   r+   r/   )r	   rK   rH   rA   rà  rá  rÇ   rä  rå  rã  r)   r+   rR   r   r‹   r   r‰   rY   r4   ræ  r…  rP   r   rS   r¨   rÈ   rL   rÉ   )rW   rX   rA   rª   r<   rc  rÊ   ZerpÚmrç  r†  r4   r¿   r/   r\   r\   r]   rH   Ä
  sz   ú	

ý
ýÿ
ÿ
øó

ý
ýÿzManageleaveAPIView.getc              
   C   sÖ  |j }�z+z|d d urt|d ƒnd}W n ttfy"   d}Y nw | d¡}| dd¡}| dd¡}|dkr;d}n	|dkrBd	}nd
}z_tjj|d�}	||	_| dd¡|	_| dd¡|	_	||	_
||	_| dd¡|	_|	 ¡  |dkr¢ztjj|	jd�}
|
jd u r�d|
_t|
jƒ|
_|
 ¡  W n tjy¡   td|	j› d�ƒ Y nw W n tjyÂ   td|› d�ƒ ttjddœdddœƒ Y W S w z>tjj|jd�}tjj|	jd�}
|j}d}d}d|› d|› d|› d|› d�	}|
j}t|d ƒ t||tj|gd!�}| ¡  W n! tj�y"   td|	j› d�ƒ ttjddœdd"dœƒ Y W S w ttjd#dœd d$dœƒW S  t�yE   ttjddœdddœƒ Y S  t�yj } ztd%|› �ƒ ttjddœdd&dœƒW  Y d }~S d }~ww )'Nrè  g        r+   r@   rÁ   rÂ   ZApprovedÚ3ZRejectedZPendingr¤   rj  ré  rã  r3   r   zProfile for user ID z does not exist.zLeaveRequest with ID r    r7   Trã   r~   z,https://pearlpackagingindia.com/leaverequestrê  z$
                Your leave request z is z.
                Total days: zU

                You can log in using the following link and check:
                z
                zSending email to recipientrë  z(Profile not found for email notificationr?   zRequest updated successfullyzError occurred: r´   ) r<   ÚfloatrÈ   Ú	TypeErrorrH   r	   rK   rà  rá  rå  rä  r+   rã  r�   r   rP   Ztotal_leaverÇ   rL   rs   r)   r‹   rY   r2   r#   r   rï  rð  rR   r   rr   r¢   )rW   rX   rA   r<   ZrtoZstaÚmlÚnamesrõ  rª   r«   rò  ró  rô  rv   rì  Zrecipient_emailr2   rw   r\   r\   r]   r·     sÂ    ÿ

€ý€
ýý
ÿÿþû
ü
ýþ

ý
ý
ý€þzManageleaveAPIView.putre   )r`   ra   rb   r!   ri   rH   r·   r\   r\   r\   r]   rö  Á
  s    
Lrö  c                   @   r-   )ÚTodayAttendanceAPIViewc                 C   s¨  |j  dd ¡}|rt |d¡ ¡ }nt ¡  ¡ }tdddƒ}tdddƒ}tjj	|d� 
d¡}g }|D ]{}d}	d	}
|jrC|j|krCd
}	n
|jrM|j|krMd}	|jr�|j|kr�t ¡ }t ||j¡}t ||¡}|| }t|jdƒ\}}t|dƒ\}}|› d|› d�}
| |jj|jj|jjr’|jjjnd |jrœ|j d¡nd|jr¦|j d¡nd|	|
dœ¡ q2|jddd�}tjj|d�}dd„ |D ƒ}t|t|ƒt|ƒ||dœtjd�S )Nr   rr  rë   r   é   rº  rœ  zOn Timez0:00ZLatezEarly/On-Timeé  r™   zh rø  z%I:%M %pú--)rA   r@   rƒ  r½  rË  Úentry_statusZot_timert  Tru  rw  c                 S   s*   g | ]}|j |j|jr|jjnd dœ‘qS )N)rA   r@   rƒ  )rA   r@   rƒ  rO   )Ú.0r‹  r\   r\   r]   Ú
<listcomp>·  s    ý
ýz.TodayAttendanceAPIView.get.<locals>.<listcomp>)r   r‰  Zabsent_countÚpresent_listrŠ  r*   )rž   rH   r   r  r   r�   r"   r   rK   r‰   Úselect_relatedr½  rË  r€  ÚcombineÚdivmodrš   rÉ   rœ  rA   r@   rƒ  rO   r…  r�  r   r‚  r)   Úlenr+   rR   )rW   rX   r†  r‡  Zoffice_start_timeZoffice_end_timer¸  r  Úrecordr  ZovertimeZdummy_todayZdt_outZdt_offÚdiffÚhoursÚ	remainderÚminutesÚ_Zpresent_idsr}  rŠ  r\   r\   r]   rH   „  s\   
ùüûúzTodayAttendanceAPIView.getNrþ   r\   r\   r\   r]   rþ  ƒ  r”   rþ  c                   @   r  )ÚDashboardAPIViewNc              	   C   s  |d urtzZg }t jj|d�}|D ]}| |j|j|j|j|jdœ¡ qt jj|d�j	t
dƒd�d p3d}tjj|d�}tjj|jd�}|j|j|j|j|j|dœ}	ttjd	d
œd ||	dœƒW S  tys   ttjdd
œdddœƒ Y S w z~d}
g }ddlm} tjjdd� ¡ }tjjdd� ¡ }tj 	t
dƒ¡d pœd}t j 	t
dƒ¡d p¨d}t|ƒt|ƒ }tjjdd� 	t
dƒ¡d pÀd}| ¡  ¡ }t jj|d� 	t
dƒ¡d pÖd}|||||||dœ}t|dƒ ttjd	d
œd |dœƒW S  t�y   ttjdd
œdddœƒ Y S w )N)Úloan_id)rA   ÚcollectedamonutÚmethodr  r   r  )r{  r{  r   r¤   )rm  rF   Úloan_amountZtenureÚloan_statusZpaidr?   r7   )r+   r6   r<   Údatasr    Trã   r~   r   ZActive)r  ZClosedr  Zloan_amount__sumZcollectedamonut__sumZcollection_dayZcollection_day__sum)Zcreated_at__date)ÚactiveÚinactiveÚtotal_disbursedÚtotal_collectedÚtotal_outstandingÚexpected_dailyÚactual_dailyZfdddgdgfdgdfgdfgfdgfdgfdrh   ) Ú
CollectionrK   r‰   rÉ   rA   r  r  r  ræ  Ú	aggregater(   ZLoanrH   r
   Z	client_idrm  rF   r  Zloan_tenure_monthsr  r)   r+   rR   r   r‹   Údjango.utilsr   rû   rú  r�   r   rs   )rW   rX   rA   ZdogoZ
collectionrø  ZcollectedamountZloaÚclir<   rc  rÊ   r   r  r  r  r  r  r  r€  r  r  r\   r\   r]   rH   Ì  s”   
û
ÿþþú


ü
ýÿ  ù


ý
ýÿzDashboardAPIView.getre   rþ   r\   r\   r\   r]   r  É  ó    r  c                   @   r  )ÚGetclientAPIViewNc                 C   sö   |d ur;z!t jj|d�}|j|j|j|j|jdœ}tt	j
ddœd |dœƒW S  ty:   tt	jddœddd	œƒ Y S w z*d
}g }t j ¡ D ]}|d7 }| ||j|j|jdœ¡ qEtt	j
ddœd |dœƒW S  tyz   tt	jddœddd	œƒ Y S w )Nr¤   )rA   rÀ   rF   r2   r¹   r?   r7   rh   r    Trã   r~   r   r   )rb  rA   ro  rF   )r
   rK   r‰   rA   rÀ   rF   r2   r¹   r)   r+   rR   r   r‹   rn  rÉ   rm  rÓ  r\   r\   r]   rH   7  sX   û

ý
ýÿ
ü

ý
ýÿzGetclientAPIView.getre   rþ   r\   r\   r\   r]   r#  4  r"  r#  c                   @   r-   )Ú	FpAPIViewc           	   
   C   s¨   |j }z/| di ¡}| d¡}| d¡}t|ƒ}tjj|d�}||_| ¡  ttj	ddœd ddœƒW S  t
yS } zttjd	dœd
d|› �dœƒW  Y d }~S d }~ww )Nr|   r2   r0   r1   r?   r7   zPassword reset successfullyr~   r    Tr­   )r<   rH   r   r   rK   r0   r�   r)   r+   rR   r°   r¢   )	rW   rX   r<   r|   r2   r0   rÍ   rñ  rw   r\   r\   r]   r^   v  s,   



ý
ý€ÿzFpAPIView.postNr_   r\   r\   r\   r]   r$  r  s    r$  c                   @   r-   )ÚMonthattendanceAPIViewc                    s¸  |j  d¡}�z7t |d d¡ ¡ ‰ˆjdkr(ˆjˆjd ddd�tdd� }nˆjˆjd dd�tdd� }‡fd	d
„t	|ˆ j
d ƒD ƒ}tjjˆ|gd�}tdd„ |D ƒƒ}tjjdd�}	tjjˆ|gd�}
t ¡ }g }|	D ]¾‰ ‡ fdd„|
D ƒ}d}d}d}i }|D ]…}| d¡}d}||v rç|| }|jdkràd}|d7 }|jrß|jrßt t ¡ |j¡}t t ¡ |j¡}||  ¡ }|dkrß|d }||7 }t|d ƒd›dt|d d ƒd›�}n$d}|d7 }n||v rîd}n| ¡ dkr÷d}n||krþd}nd}|d7 }||dœ||< q†t|d ƒ}t|d d ƒ}| ˆ jˆ j|||d›d|d›�|dœ¡ qqtd d
„ |D ƒ|d!œd"d�W S  t�y[ } ztd#t|ƒid$d�W  Y d }~S d }~ww )%Nr¿   z-01rr  é   r   )r
  r  Úday©r²  )r  r'  c                    s   g | ]	}ˆ t |d � ‘qS )r(  r–   )r  rŸ  )Ú	first_dayr\   r]   r  ¢  s    z.MonthattendanceAPIView.get.<locals>.<listcomp>)Zdate__rangec                 s   s   � | ]}|j V  qd S re   rº  )r  Úannr\   r\   r]   Ú	<genexpr>§  s   € z-MonthattendanceAPIView.get.<locals>.<genexpr>r*   c                    s    i | ]}|j ˆ jkr|j|“qS r\   )rt  rA   r   )r  Úr)r‹  r\   r]   Ú
<dictcomp>°  s     z.MonthattendanceAPIView.get.<locals>.<dictcomp>r   z00:00rs  r©  i€p  r   r¦  ú:r™   rª  ÚHr   r  )r+   Úot)r@   r8   Ztotal_presentZtotal_absentZtotal_otr¬  c                 S   s*   g | ]}|  d ¡|  d¡|  d¡dœ‘qS )rr  z%dz%a)r   r¨  Úday_name)r…  )r  r·  r\   r\   r]   r  î  s    ýýÿr±  r›   r6   rœ   ) rÄ   rH   r   r  r   r  Úreplacer
  r   r  r²  r   rK   r‰   Úsetr   r   r€  r…  r+   r½  rË  r  Útotal_secondsrÇ   ÚweekdayrÉ   r@   r”  r)   rr   rU   )rW   rX   r†   r©   r¿   Zlast_dayZdates_in_monthZholiday_announcementsZannouncement_datesr™  Zall_attendancer€  Zfinal_reportZemp_recordsZtotal_pZtotal_aZtotal_ot_secondsZattendance_mapr'  Zday_strZ
ot_displayZrecÚstatus_coder’   Úendr  Zot_secZ
total_ot_hZ
total_ot_mrw   r\   )r‹  r)  r]   rH   ™  sŠ   
" 

&€

ú	ûø	÷
 €ÿzMonthattendanceAPIView.getNrþ   r\   r\   r\   r]   r%  ˜  r”   r%  c                   @   r-   )Ú ProductactivestatusupdateAPIViewc              
   C   s”   z(t jj|d�}|jdkrd|_| ¡  nd|_| ¡  ttjddœd ddœƒW S  tyI } zttjddœd	d
|› �dœƒW  Y d }~S d }~ww )Nr¤   r   r5   r?   r7   zQuote accepted successfullyr~   r    Tr­   )	r   rK   rH   r+   r�   r)   r¯   r°   r¢   )rW   rX   rA   Zvenrw   r\   r\   r]   r·   û  s(   



ý
ý€ÿz$ProductactivestatusupdateAPIView.putN)r`   ra   rb   r·   r\   r\   r\   r]   r8  ù  rc   r8  )mÚdjango.confr   Zdjango.shortcutsr   Úmodelsr   r   r   r   r	   r
   r   r   r   r   Údjango.core.exceptionsr   Zrest_framework.exceptionsr   Údjango.contrib.authr   r   Zrest_framework_simplejwt.tokensr   Údjango.contrib.auth.hashersr   Údjango.contrib.auth.modelsr   r   r   Zdjtzr   r   r   Zcv2rÆ  rÇ  ZnumpyrÄ  ÚsysÚrequestsÚioÚdjango.httpr   Úbase64ÚPILr   r  r   Zrest_framework.genericsr   r   Úserializersr    Zrest_framework.permissionsr!   r"   ÚjsonÚdjango.core.mailr#   Zschool.settingsr$   ZpdfkitrI   r�   r%   Údjango.utils.cryptor&   r(   Zrest_framework.responser)   Úrest_frameworkr+   Zrest_framework.viewsr,   r.   rd   rx   ry   rz   r{   r•   r˜   r£   r¸   rå   r   r  r  ri  rq  rŽ  r“  rž  r   r	  r£  r¹  rÐ  rÑ  rÛ  rÜ  rö  rþ  r  r#  r$  r%  r8  r\   r\   r\   r]   Ú<module>   sÆ    0[& I   CDV'   L A= -C  z  9 CFk>&a