U
    íÏijÒ‹ ã                   @   sÊ  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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,m-Z-m.Z. d dl%m&Z& d dl/m0Z0 d dl1Z1d dl2m3Z3m4Z4 d dl,m5Z5 d dl6m7Z7m8Z8 ddl9m:Z: d dl;m<Z< d dl(m(Z(m=Z= d dl>Z>d dl?m@Z@ d dlAmBZB d dlCZCd dlmZ d dlDZDd dl mZ d dlEZEd dl?mFZF d dlGmHZH 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lDZDG dd„ deƒZId d!„ ZJd"d#„ ZKd d$lmLZL eLƒ Z$G d%d&„ d&eƒZMG d'd(„ d(eƒZNd d)l(m*Z* d dl%m&Z& G d*d+„ d+eƒZOG d,d-„ d-eƒZPG d.d/„ d/eƒZQG d0d1„ d1eƒZRG d2d3„ d3eƒZSG d4d5„ d5eƒZTG d6d7„ d7eƒZUG d8d9„ d9eƒZVd dl%m&Z& d d:l(m(Z( d dlWZWG d;d<„ d<eƒZXG d=d>„ d>eƒZYd dl>Z>d dl1Z1d dl=Z=d d?lZm[Z[ d dlmZ d dlmZ d dlm	Z	 dd@l
mZ G dAdB„ dBeƒZ\G dCdD„ dDeƒZ]d dEl,m.Z.m-Z- d dlm	Z	 d dlmZ d dlmZ ddFl
mZ G dGdH„ dHeƒZ^d d:l(m(Z( d dl,m5Z5 d dl%m&Z& d dlm	Z	 d dlmZ d dlmZ ddFl
mZ dIdJ„ Z_G dKdL„ dLeƒZ`d dlaZad dlbZbdMdN„ Zcd d:l(m(Z( d dl,m-Zd d dlmZ d dlmZ ddOl
mZmZmZ G dPdQ„ dQeƒZeG dRdS„ dSeƒZfG dTdU„ dUeƒZgG dVdW„ dWeƒZhd dliZid d:l(m(Z( d dlmZ d dlmZ d dl;m<Z< ddXl
mZmZ G dYdZ„ dZeƒZjd d[l(m)Z) d dlmZ d dlmZ d dlm	Z	 dd\l
mZ G d]d^„ d^eƒZkG d_d`„ d`eƒZlG dadb„ dbeƒZmd 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dcl
mZmZ G ddde„ deeƒZnG dfdg„ dgeƒZoG dhdi„ dieƒZpG djdk„ dkeƒZqG dldm„ dmeƒZrG dndo„ doeƒZsG dpdq„ dqeƒZtdS )ré    )Úsettings)Úrender)ÚAPIView)ÚResponse©Ústatusé   )ÚProfilesÚOtpÚProductÚTurfÚNotificationÚBookingÚClientÚLoanÚ
CollectionÚStudentÚ
AttendanceÚFeesÚFeesHistory)ÚObjectDoesNotExist)ÚNotFound)ÚauthenticateÚlogin)ÚRefreshToken)Úmake_password)ÚUser©Útimezone)ÚdateÚdatetimeÚ	timedeltaN)ÚSumÚCount)ÚHttpResponse)ÚMultiPartParserÚ
FormParser)ÚQ)ÚRetrieveAPIViewÚListAPIView)ÚUserSerializer)ÚIsAuthenticated)r    Útime)ÚEmailMessage)ÚBASE_DIR)Ú	send_mail)Úget_random_string©r"   c                   @   s   e Zd Zdd„ ZdS )ÚLoginAPIViewc                 C   sB  |j }| d¡}|d }|d }t d|¡r\ztjj|d�}W qj tjk
rX   d }Y qjX nt|||d�}|d k	�r| |¡�rt	||ƒ t
 |¡}tjj|jd�}||_| ¡  |jrÆ| |jj¡nd }	d}
|j}ttjd	d
œd d|j|j|j|j|jt|ƒt|jƒ|	|
|j|jdœdœƒS ttjdd
œddd dœtjd�S d S )NÚusernameÚpasswordZ	fcm_tokenz[^@]+@[^@]+\.[^@]+©Úemail)r3   r4   ©Úuser_idÚloopÚsuccess©ÚcodeÚresponsezLogin success)ÚnameÚidr3   r6   ZisSuperZrefreshÚtokenÚprofileÚcompanynameÚphoneÚrole©r   ÚerrorÚmessageÚdatarF   zAuthentication failedzInvalid username or passwordr   )rH   ÚgetÚreÚmatchr   ÚobjectsÚDoesNotExistr   Úcheck_passwordr   r   Zfor_userr	   r?   ÚpincodeÚsaveÚprofilesÚbuild_absolute_uriÚurlrC   r   r   ÚHTTP_200_OKr3   r6   Úis_superuserÚstrZaccess_tokenrD   ZHTTP_401_UNAUTHORIZED)ÚselfÚrequestrH   Zusername_or_emailr4   ZfcÚuserr@   rA   Úprofile_photorB   rC   © r[   ú./var/www/html/NKSPORTS/school/./myapp/views.pyÚpost7   sX    



ôü
üûzLoginAPIView.postN©Ú__name__Ú
__module__Ú__qualname__r]   r[   r[   r[   r\   r2   5   s   r2   c              
   C   s`   d}d|› d�}zt ||tj| gdd� W n0 tk
rZ } ztd|› �ƒ W 5 d }~X Y nX d S )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©r6   ÚotpÚsubjectrG   Úer[   r[   r\   Úsend_otp_emailš   s    üû
ro   c              
   C   s`   d}d|› d�}zt ||tj| gdd� W n0 tk
rZ } ztd|› �ƒ W 5 d }~X Y nX d S )Nrb   rc   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
        Frd   rf   rg   rk   r[   r[   r\   Úsend_otp_emails´   s    üû
rp   )Úget_user_modelc                   @   s   e Zd Zdd„ ZdS )ÚSendotpAPIViewc              
   C   s
  |j }z°| di ¡ dd ¡}td|ƒ tjj|d� ¡ sRt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k
�r } z.td|ƒ ttjddœdt|ƒd	œƒ W Y ¢S d }~X Y nX d S )NÚparamsr6   úReceived email:r5   zEmail not foundr;   TzEmail not registered©r   rF   rG   é   Ú
1234567890©ÚlengthÚallowed_chars©ÚtargetÚargsÚSuccess©r   rF   rH   zError:úInternal Server Error)rH   rI   rj   r   rL   ÚfilterÚexistsr   r   ÚHTTP_404_NOT_FOUNDr
   Úcreater0   rl   r   ÚnowÚotp_created_atrP   Ú	threadingÚThreadro   ÚstartrT   ri   ÚHTTP_500_INTERNAL_SERVER_ERRORrV   )rW   rX   rH   r6   rY   rl   rn   r[   r[   r\   r]   Õ   s8    

ý


ý


ýzSendotpAPIView.postNr^   r[   r[   r[   r\   rr   Ô   s   rr   c                   @   s   e Zd Zdd„ ZdS )ÚSendotpsAPIViewc              
   C   sæ   |j }z˜| dd ¡}td|ƒ tjj|d� ¡ rJt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k
rà } z$ttjddœdt|ƒdœƒ W Y ¢S d }~X Y nX d S )Nr6   rt   r5   zEmail already registeredr;   Tz;This email is already registered. Please use another email.ru   rv   rw   rx   )r6   rl   r†   r{   r~   r   r€   )rH   rI   rj   r   rL   r�   r‚   r   r   ÚHTTP_409_CONFLICTr0   r
   r„   r   r…   r‡   rˆ   rp   r‰   rT   ri   rŠ   rV   )rW   rX   rH   r6   rl   rY   rn   r[   r[   r\   r]   û   s0    

ý

ý

ýzSendotpsAPIView.postNr^   r[   r[   r[   r\   r‹   ú   s   r‹   ©r!   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚVerifyotpAPIViewc                 C   sÐ   |j  d¡}|j  d¡}z†tjj|d� d¡}|jtdd� }t 	¡ |krbt
ddd	d
œtjd�W S ||jkr„t
dddd
œtjd�W S t
ddd	d
œtjd�W S W n, tjk
rÊ   t
ddd	d
œtjd� Y S X d S )Nr6   rl   r5   r†   é<   )Úsecondsi‘  z&OTP expired. Please request a new one.T)r   rG   rF   r   éÈ   zOTP VerifiedFé�  zInvalid OTPé”  zOTP not found)Úquery_paramsrI   r
   rL   r�   Úlatestr†   r!   r   r…   r   r   rT   rl   rM   )rW   rX   r6   Zotp_enteredZuser_otpZexpiration_timer[   r[   r\   rI     sH    ýü
ýüýüýüzVerifyotpAPIView.getc                 C   s˜   |d k	r€zJt jj|d�}|jr:|jjdd� d |_| ¡  ttjddœd ddœƒW S  t	k
r~   ttj
ddœd d	dœƒ Y S X ttjddœd
ddœƒS )Nr7   F)rP   r:   r;   z"Profile image deleted successfullyru   ÚfailedzProfile not foundzID not providedzUser ID is required)r	   rL   rI   rQ   ÚdeleterP   r   r   rT   r   rƒ   ÚHTTP_400_BAD_REQUEST)rW   rX   r?   rA   r[   r[   r\   r—   E  s.    
ý

ý
ýzVerifyotpAPIView.deleteN)r_   r`   ra   rI   r—   r[   r[   r[   r\   rŽ     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 k	r¸zxtjj |d�}tjj |jd�}|jrN|jjdkrN|jj}nd}|j|j|j	|j
|j||jdœ}ttjddœd |dœƒW S  tk
r¶   ttjd	dœd
ddœƒ Y S X d S )Nr?   ©r?   r7   z../static/dummy.png)r>   r6   rC   Úf_nameZl_namerA   r?   r~   r;   r   ZFailedTzCompany not foundru   )rI   r   rL   r	   r?   rQ   rS   r>   r6   rC   Ú
first_nameÚ	last_namer   r   rT   r   rƒ   )rW   rX   Úkwargsr?   rY   ÚcompanyÚprrH   r[   r[   r\   rI   j  s6    

ø
ý

ýzProfileupdateAPIView.getc              
   C   sÞ   |j }zD| d¡}tjj|jjd�}||_| ¡  tt	j
ddœd ddœƒW S  tk
r’ } z*tt	jddœdd	t|ƒ› �dœƒ W Y ¢S d }~X Y nH tk
rØ } z*tt	jddœdd
t|ƒ› �dœƒ W Y ¢S d }~X Y nX d S )NÚ
prof_photor7   r:   r;   zProfile updated successfullyru   r–   TúMissing required field: zAn error occurred: )rH   rI   r	   rL   rY   r?   rQ   rP   r   r   ÚHTTP_201_CREATEDÚKeyErrorr˜   rV   ri   rŠ   )rW   rX   rH   ZphoZtakern   r[   r[   r\   r]   ’  s.    

ý

ý
ýzProfileupdateAPIView.postc                 C   s  |j }|j d¡}zÀtjj|d�}tjj|d�}| d|j¡|_| d|j¡|_| d|j¡|_| d|j	¡|_	| 
¡  | d|j	¡|_	| d|j¡|_| d|j¡|_|r²||_| 
¡  ttjd	d
œd ddœƒW S  tk
�r    ttjdd
œdddœƒ Y S X d S )Nr¡   r7   rš   rœ   Zfirst_namesr�   Zemail_idZphone_nor:   r;   úUser updated successfullyru   r–   TzUser not found)rH   ÚFILESrI   r	   rL   r   r3   rœ   r�   r6   rP   rC   r>   rQ   r   r   rT   r   rƒ   )rW   rX   r?   rH   ÚphotoÚmmÚsdr[   r[   r\   Úput¸  s6    
ý

ýzProfileupdateAPIView.putN)r_   r`   ra   r+   Úpermission_classesrI   r]   rª   r[   r[   r[   r\   r™   f  s   (&r™   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚRegisterAPIViewc           
      K   sx  |  d¡}|d k	r¤z`tjj |d�}|j|j|j|j|j|j|j	|j
rR| |j
j¡nd dœ}tt	jddœd |dœƒW S  tjk
r    tt	jddœdd	d
œƒ Y S X nÐzŠtjjdddgd� d¡}g }t|dƒD ]F\}}| ||j|j|j|j|j	|j|j
�r
| |j
j¡nd dœ¡ qÎtt	jddœd |dœƒW S  tk
�rr }	 z$tt	jddœdt|	ƒd
œƒ W Y ¢S d }	~	X Y nX d S )Nr?   r7   )r?   r3   rC   r4   r6   rD   r   rZ   r:   r;   r   r–   TúNo student foundru   é   é   r   )Zrole__inú-created_atr   )Úrowr?   ZemployeeNamer6   rC   r   rD   r§   )rI   r	   rL   r8   r>   rC   r4   r6   rD   r   rQ   rR   rS   r   rT   r   rM   rƒ   r�   Úorder_byÚ	enumerateÚappendri   r˜   rV   )
rW   rX   rž   r?   ÚstudentrH   Z	employeesZemployee_listÚindexrn   r[   r[   r\   rI   ä  sb    
ö
ý

ý÷

ý

ýzRegisterAPIView.getc              
   C   sö   |j }|j d¡}z’| d¡}| d¡}| d¡}| d¡}| d¡}t|ƒ}	tjj|||	d�}
|j d¡}tjj|||||
j||d�}t	d	d
dœd ddœt
jd�W S  tk
rð } z.t	dddœddt|ƒ› �dœt
jd� W Y ¢S d }~X Y nX d S )NrZ   r3   r6   rC   r4   rD   )r3   r6   r4   )r>   r6   rC   rD   r8   r4   rQ   éÉ   r:   r;   zEmployee created successfullyru   r   r’   r–   TúError: )rH   r¦   rI   r   r   rL   r„   r	   r?   r   r   r£   ri   rV   r˜   )rW   rX   rH   r§   r3   r6   rC   r4   rD   Úhashed_passwordZvanrA   rn   r[   r[   r\   r]      sN    




ýù
ýüýüzRegisterAPIView.postc                 C   s  |j }|j d¡}zÆ|j d¡}| d¡}| d¡}| d¡}| d¡}| d¡}	tjj|d�}
tjj|d�}||
_||
_||
_|	|
_	||
_
|r–||
_|
 ¡  t|ƒ}||_||_||_
| ¡  ttjd	d
œd ddœƒW S  tk
�r   ttjdd
œdddœƒ Y S X d S )NrZ   r3   r6   rC   r4   rD   r7   rš   r:   r;   r¥   ru   r–   TúSomething went wrong)rH   r¦   rI   r	   rL   r   r>   r6   rC   rD   r4   rQ   rP   r   r3   r   r   r£   r   r˜   )rW   rX   r?   rH   r§   r3   r6   rC   r4   rD   r¨   r©   Zpassesr[   r[   r\   rª   R  sF    





ý

ýzRegisterAPIView.putc                 O   s‚   |  d¡}zFtjj |d�}| ¡  tjj |d�}| ¡  ttjddœd ddœƒW S  tk
r|   ttj	ddœd	d
dœƒ Y S X d S )Nr?   r7   rš   r:   r;   zCompany deleted successfullyru   r–   TúNo data found)
rI   r	   rL   r—   r   r   r   rT   r   rƒ   )rW   r}   rž   Z
company_idr    rŸ   r[   r[   r\   r—   ~  s"    

ý

ýzRegisterAPIView.deleteN©r_   r`   ra   rI   r]   rª   r—   r[   r[   r[   r\   r¬   ã  s   <2,r¬   c                   @   s   e Zd Zdd„ ZdS )Ú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k
râ   t
tjddœdddœƒ Y S X d S )Nr   ©r…   ©Úcreated_by_idr�   rv   é   é   é   é	   é   r®   )Ú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:   r;   r   r–   Tr»   ru   )Údjango.utils.timezoner…   rY   r?   r   rL   r�   Úcountr    r!   r   r   rT   r   rƒ   )rW   rX   r…   ÚoprÆ   r!   Úcurrent_daterÌ   rÇ   rÈ   rÉ   rË   rÊ   rÎ   rÍ   rÏ   rÐ   rÑ   rÒ   rH   r[   r[   r\   rI   ™  sZ    ó
ý

ýzCompanydashboardAPIView.getN©r_   r`   ra   rI   r[   r[   r[   r\   r½   –  s   r½   c                   @   s   e Zd Zdd„ ZdS )ÚAdmindashboardAPIViewc              	   C   s`  �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œ¡ q�tjjdd	� ¡ }d}d}tjjdd	�}|D ] }zW qà tjk
rþ   Y qàX qà||||||	d
œ}ttjddœd |dœƒW S  tk
�rZ   ttjddœdddœƒ Y S X d S )Nr   r¾   r   )r   rD   r®   ©r    r1   )Ú	monthnameÚcounts)rD   )ÚpaidcompanyÚunpaidcompanyÚtotalcompanyÚactivecompanyÚinactivecompanyrË   r:   r;   r   r–   Tr»   ru   )rÓ   r…   rY   r?   r	   rL   r�   rÔ   Úcalendarr    ÚyearÚmonthÚdjango.db.modelsr"   ÚrangeÚ
month_abbrr´   ZPaymentrM   r   r   rT   r   rƒ   )rW   rX   r…   rÕ   rÖ   rß   rà   rá   r    rË   Úcurrent_yearÚcurrent_monthZbakr"   rã   Ú
month_nameÚpaymentrÞ   rÜ   rÝ   ZqpÚbrH   r[   r[   r\   rI   Ý  s^    


þ

	ø

ý

ýzAdmindashboardAPIView.getNr×   r[   r[   r[   r\   rØ   Ú  s   rØ   c                   @   s   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|||ƒ |sZ|sZ|sZ|rÐtƒ }|rr|t|d�O }|r„|t|d�O }|r–|t|d	�O }|r¨|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 )NrC   r6   r3   Ú	gstnumberÚgstzCheck Params:©r>   )rC   r5   )rí   r:   r;   )r   rF   r‚   r–   Tz!No phone, email, or GST provided.ru   r   )r”   rI   rj   r'   r	   rL   r�   r‚   r   r   rT   r˜   )	rW   rX   r?   rC   r6   r>   rí   Úqueryr‚   r[   r[   r\   rI   1  s8    
ý
ýüzCheckcompanyAPIView.get)Nr×   r[   r[   r[   r\   rì   0  s   rì   c                   @   s4   e Zd ZefZd
dd„Zdd„ Zdd„ Zdd	„ ZdS )ÚProductAPIViewNc              L   C   s:  |d k	�r˜�zZt jj|d�}|j|j|j|j|j|j|j	|j
|j|j|j|j|j|j|j|j|j|j|j|j|j|j|j|j|j|j|j|j|j|j |j!|j"|j#|j$|j%|j&|j'|j(|j)|j*|j+|j,|j-|j.|j/|j0|j1|j2|j3|j4|j5|j6|j7|j8|j9|j:|j;|j<|j=|j>|j?|j@|jA|jB|jC|jD|jE|jF|jG|jH|jI|jJ|jK|jL|jMdœK}tNtOjPddœd |dœƒW S  tQk
�r”   tNtOjRddœddd	œƒ Y S X nžznd
}g }t jjS|jTjd�}|D ]4}|d7 }| U||j|j|j|j|j|jOdœ¡ �q¸tNtOjPddœd |dœƒW S  tQk
�r4   tNtOjRddœddd	œƒ Y S X d S )Nrš   )Kr?   Úcompany_nameÚapplicationÚproject_nameÚcountryÚ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:   r;   r   r–   Tr»   ru   r   r¿   r   )r±   r?   rò   ró   rô   rõ   r   )Vr   rL   rI   r?   rò   ró   rô   rõ   rö   r÷   rø   rù   rú   rû   rü   rý   rþ   rÿ   r   r  r  r  r  r  r  r  r  r	  r
  r  r  r  r  r  r  r  r  r  r  r  r  r  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   rT   r   rƒ   r�   rY   r´   )rW   rX   r?   rŸ   rH   r¶   Ú	companiesZproductsr[   r[   r\   rI   Z  sè    
žo
ý

ý÷
ý

ýzProductAPIView.getc              M   C   sB  |j }�zî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 |d |d |d |d |d |d |d  |d! |d" |d# |d$ |d% |d& |d' |d( |d) |d* |d+ |d, |d- |d. |d/ |d0 |d1 |d2 |d3 |d4 |d5 |d6 |d7 |d8 |d9 |d: |d; |d< |d= |d> |d? |d@ |dA |dB |dC |dD |dE |dF |dG |dH |dI |dJ |jdK�K}| ¡  ttjdLdMœd dNdOœƒW S  t	k
�r< } z&ttj
dPdMœdQdR|› �dOœƒ W Y ¢S d }~X Y nX d S )SNrò   rô   ró   rõ   r÷   rö   rø   rù   rú   rû   rü   rý   rþ   rÿ   r   r  r  r  r  r  r  r  r  r	  r
  r  r  r  r  r  r  r  r  r  r  r  r  r  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;  )Krò   rô   ró   rõ   r÷   rö   rø   rù   rú   rû   rü   rý   rþ   rÿ   r   r  r  r  r  r  r  r  r  r	  r
  r  r  r  r  r  r  r  r  r  r  r  r  r  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;  Ú
created_byr:   r;   zProduct created successfullyru   r–   Tr¢   )rH   r   rL   r„   rY   rP   r   r   r£   r¤   r˜   ©rW   rX   rH   rŸ   rn   r[   r[   r\   r]     s¶    ¤^
ý

ýzProductAPIView.postc              
   C   sR  |j }�zÐt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  tRk
�r   tOtPjSdPdMœdQdRdOœƒ Y S  tTk
�rL } z(tU|ƒ tOtPjVdPdMœdQdSdOœƒ W Y ¢S d }~X Y nX d S )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	  r
  r  r  r  r  r  r  r  r  r  r  r  r  r  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;   zProduct updated successfullyru   r–   Tr»   rº   )WrH   r   rL   rI   rò   rô   ró   rõ   r÷   rö   rø   rù   rú   rû   rü   rý   rþ   rÿ   r   r  r  r  r  r  r  r  r  r	  r
  r  r  r  r  r  r  r  r  r  r  r  r  r  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;  rP   r   r   rT   r   rƒ   ri   rj   r˜   )rW   rX   r?   rH   rŸ   rn   r[   r[   r\   rª   y  sÀ    
ý

ý
ýzProductAPIView.putc                 C   sl   |d k	rhz0t jj|d�}| ¡  ttjddœd ddœƒW S  t jk
rf   ttjddœd ddœƒ Y S X d S )Nrš   r:   r;   zProduct deleted successfullyru   r–   zNo product found)	r   rL   rI   r—   r   r   rT   rM   rƒ   )rW   rX   r?   Úproductr[   r[   r\   r—   ÿ  s    
ý

ýzProductAPIView.delete)N)	r_   r`   ra   r+   r«   rI   r]   rª   r—   r[   r[   r[   r\   rñ   W  s   
 ,t rñ   c                   @   s   e Zd Zddd„Zdd„ ZdS )ÚClientAPIViewNc           	      C   sH  |d k	r°zxt jj|d�}z|jr(|jjnd }W n tk
rF   d }Y nX |j|j|j|j	|j
||jdœ}ttjddœd |dœƒW S  tk
r¬   ttjddœddd	œƒ Y S X n”zdd
}g }tj ¡ }|D ]2}|d7 }| ||j|j|j|j|j|jdœ¡ qÈttjddœd |dœƒW S  tk
�rB   ttjddœddd	œƒ Y S X d S )Nrš   ©r?   r>   r<   ÚdescriptionÚspecificationÚsfiler   r:   r;   r   r–   Tr»   ru   r   r   )r±   r?   Úclient_namerC   r6   ÚaddressÚdoj)r   rL   rI   rD  rS   Ú
ValueErrorr?   r>   r<   rB  rC  r   r   rT   r   rƒ   r   Úallr´   rE  rC   r6   rF  rG  )	rW   rX   r?   rŸ   ÚflrH   r¶   r<  Úclientr[   r[   r\   rI   #  sh    
ø
ý

ý
ø

ý

ýzClientAPIView.getc              
   C   sœ   |j }zLtjj|d |d |d d�}| ¡  ttjddœd d|j|j	dœd	œƒW S  t
k
r– } z&ttjd
dœdd|› �dœƒ W Y ¢S d }~X Y nX d S )NZ
clientNameÚmobilenumberrF  )rE  rC   rF  r:   r;   zClient created successfully)r?   rK  rE   r–   Tr¢   ru   )rH   r   rL   r„   rP   r   r   r£   r?   rE  r¤   r˜   r>  r[   r[   r\   r]   t  s,    ü
þü
	
ýzClientAPIView.post)N©r_   r`   ra   rI   r]   r[   r[   r[   r\   r@     s   
Qr@  rÙ   c                   @   s   e Zd Zdd„ ZdS )ÚDashboardStatsAPIViewc              	      sV  ˆj  dd ¡}ˆj  dd ¡‰ ˆj  dd ¡‰t d¡‰|rHt |d¡ ¡ nt ¡  ˆ¡ ¡ ‰t	j
jdd�}|jddgd	�}|jd
dgd	�}‡ ‡‡‡fdd„}t|ddƒjddd�ƒ}t|d
dƒjddd�ƒ}t|dd
ƒjddd�ƒ}	t|d
d
ƒjddd�ƒ}
dd„ ‰‡‡fdd„}||||ƒ\}}|||	|
ƒ\}}tdddœ||||ˆ d¡dœdœƒS )Nr   Ú	from_timeÚto_timezAsia/Muscatú%Y-%m-%dr   r   r¯   ©ZsportType__inr®   c                    sœ   t jjˆ| |dd�}ˆ r˜ˆr˜zft ˆ d¡ ¡ }t ˆd¡ ¡ }ˆ t ˆ|¡¡ t	j
¡}ˆ t ˆ|¡¡ t	j
¡}|j||d�}W n tk
r–   Y nX |S )NÚPresent)r   Úsession_typeÚ	sportTyper   ú%H:%M)Zcreated_at__gteZcreated_at__lte)r   rL   r�   r    Ústrptimer,   ÚlocalizeÚcombineÚ
astimezoneÚpytzÚutcrH  )rT  Zattendance_sport_typeÚqsÚftÚttZfrom_utcZto_utc)rO  Úoman_tzÚtarget_daterP  r[   r\   Útime_filtered_qsû  s     üz3DashboardStatsAPIView.get.<locals>.time_filtered_qsÚ
student_idT)Úflatc                 S   s   |dkrt | | d ƒS dS )Nr   éd   )Úint)ÚpÚtr[   r[   r\   Úpct  s    z&DashboardStatsAPIView.get.<locals>.pctc              	      sü   | j ddgd� ¡ }| j ddgd� ¡ }t‡ fdd„| D ƒƒ}t‡fdd„| D ƒƒ}||ˆ||ƒdœ||ˆ||ƒdœd	œ}g }| D ]p}	|	jd
k}
|	jdk}| |	j|	jˆ kr°dn
|
r¸dnd|	jˆkrÈdn
|rÐdnd|	jræˆ |	jj	¡nd |dœ¡ q‚||fS )Nr   r¯   )ZclassType__inr®   c                 3   s   | ]}|j ˆ krd V  qdS ©r   Nrš   ©Ú.0Ús)Ún_idsr[   r\   Ú	<genexpr>  s     
 zADashboardStatsAPIView.get.<locals>.build_block.<locals>.<genexpr>c                 3   s   | ]}|j ˆ krd V  qdS rj  rš   rk  )Ús_idsr[   r\   ro    s     
 )ZpresentÚtotalÚpercent)Zn_dataZs_data)r   r¯   )r®   r¯   ÚPÚAz--)r>   Ún_statusÚs_statusr§   Z
is_special)
r�   rÔ   ÚsumÚ	classTyper´   ÚstudentNamer?   r§   rR   rS   )Zstudents_qsrn  rp  Zn_totalZs_totalZ	n_presentZ	s_presentrH   Ústudent_listrµ   Zis_n_elgZis_s_elg)ri  rX   )rn  rp  r\   Úbuild_block  s&    þ

û
z.DashboardStatsAPIView.get.<locals>.build_blockr‘   r:   r;   )Úcricket_dataÚfootball_dataÚcricket_listÚfootball_listZselected_date©r   rH   )r”   rI   r[  r   r    rW  r   r…   rZ  r   rL   r�   ÚsetÚvalues_listr   Ústrftime)rW   rX   Zdate_strZall_studentsZcricket_studentsZfootball_studentsrb  Zcricket_n_idsZcricket_s_idsZfootball_n_idsZfootball_s_idsr{  r|  r~  r}  r  r[   )rO  r`  ri  rX   ra  rP  r\   rI   è  s:    
ÿýûþzDashboardStatsAPIView.getNr×   r[   r[   r[   r\   rN  ç  s   rN  c                   @   s   e Zd Zdd„ ZdS )ÚStudentClassCountAPIViewc              
   C   s’   zPt jj|dd� ¡ }t jj|dd� ¡ }t||dƒ tdddœ||dœd	œƒW S  tk
rŒ } ztd
t|ƒitj	d� W Y ¢S d }~X Y nX d S )Nr   )rc  rT  r®   Zjsabdbsdsmdbasmdbsandr‘   r:   r;   )Únormal_countÚspecial_countr€  rF   r   )
r   rL   r�   rÔ   rj   r   ri   rV   r   r˜   )rW   rX   r?   r…  r†  rn   r[   r[   r\   rI   ’  s    þþ
zStudentClassCountAPIView.getNr×   r[   r[   r[   r\   r„  ‘  s   r„  )ÚContentFile)r   c                   @   s6   e Zd Zdd„ Zddd„Zdd„ Zdd	„ Zd
d„ ZdS )ÚStudentAPIViewc              
   C   s°   d|j kr|j d S | d¡}| ddtt ¡ ƒ› d�¡}|r¬z6d|krV| d¡d }| ¡ }t |¡}t||d�W S  t	k
rª } zt
d	|› �ƒ W Y ¢d
S d
}~X Y nX d
S )u˜  
        à®Žà®²à¯�à®²à®¾ device / country-à®²à®¯à¯�à®®à¯� photo handle à®ªà®£à¯�à®±à¯‹à®®à¯�:

        Method 1 â†’ request.FILES['photo']
                    Android native multipart
                    Web direct blob (India Netlify)

        Method 2 â†’ data['photo_base64']
                    iOS Safari (Oman, à®Žà®¨à¯�à®¤ country-à®²à®¯à¯�à®®à¯�)
                    FileReader base64 string
        r§   Úphoto_base64Úphoto_filenameZphoto_z.jpgú,r   rï   z[Photo] Base64 decode error: N)r¦   rI   rf  r,   ÚsplitÚstripÚbase64Ú	b64decoder‡  ri   rj   )rW   rX   rH   r‰  rŠ  Z
image_datarn   r[   r[   r\   Ú_handle_photo´  s    



zStudentAPIView._handle_photoNc           	      C   sœ  |d k	r¾z~t jj|d�}|j|j|j|j|j|j|j	|j
|j|j|j|j|j|jr`| |jj¡nd dœ}ttjddœd |dœtjd�W S  t jk
rº   ttjddœdd	d
œtjd� Y S X nÚzŽt j ¡  d¡}g }t|dƒD ]N\}}| ||j|j|j|j|j	|j|j|j|j�r"| |jj¡nd dœ
¡ qÞttjddœd |dœtjd�W S  tk
�r– } z*ttjddœdt|ƒd
œtjd� W Y ¢S d }~X Y nX d S )Nrš   )r?   ry  Ú
parentNamerL  ÚagerF  rx  Úmonthly_feesÚnormal_feesÚspecial_feesrU  ÚdateOfJoiningr   r§   r:   r;   r   r   r–   Tr­   ru   r°   r   )
r±   r?   ry  r‘  rL  rx  rU  r   r’  r§   )r   rL   rI   r?   ry  r‘  rL  r’  rF  rx  r“  r”  r•  rU  r–  r   r§   rR   rS   r   rT   rM   rƒ   rI  r²   r³   r´   ri   r˜   rV   )	rW   rX   r?   rµ   rH   Ústudentsrz  r¶   rn   r[   r[   r\   rI   Û  s€    ñ
ýü
ýüö

ýü
ýüzStudentAPIView.getc                 C   s8  |j }| d¡pd ¡ }| d¡p$d ¡ }|r^tjj|d� ¡ r^ttj	ddœddd	œtj	d
�S |rÎtjj|d� 
¡ }|rÎddddœ}| |jd¡}|r d|› �nd}ttj	ddœd|› d|› d�d	œtj	d
�S |  ||¡}	�zt| dd¡pîdƒ}
t| dd¡�pdƒ}|
| }| dd¡}t|tƒ�rRzt |¡}W n tk
�rP   g }Y nX d}d|k�rpd|k�rpd}nd|k�r~d}tjj| d¡| d¡| d¡| d¡| d¡| d ¡||
||| d!¡|	dd"�}ttjd#dœd$d%œtjd
�W S  tk
�r2 } z(ttj	ddœt|ƒd%œtj	d
� W Y ¢S d }~X Y nX d S )&Nry  Ú rL  ©rL  r–   r;   Tú>This mobile number is already registered with another student.ru   r   ©ZstudentName__iexactÚCricketÚFootballúCricket and Football©r   r®   r¯   ú and is already registered for ú already existszv. To add another sport for this student, please open the existing student's Edit page instead of creating a new entry.r”  r   r•  rx  z[]r   ÚNormalÚSpecialr¯   r®   r‘  r’  rU  rF  r–  )ry  r‘  rL  r’  rU  rF  r“  r”  r•  rx  r–  r§   r   r:   zStudent created successfully©r   rG   )rH   rI   r�  r   rL   r�   r‚   r   r   r˜   ÚfirstrU  r�  ÚfloatÚ
isinstancerV   ÚjsonÚloadsri   r„   r£   )rW   rX   rH   Zstudent_nameZmobile_numberÚexisting_studentÚsport_labelsÚexisting_sportÚ
sport_noter§   Ún_feesÚs_feesZ
total_feesZfrontend_classZfinal_class_idrµ   rn   r[   r[   r\   r]     sˆ    
ýü
üø


ó
þý
þýzStudentAPIView.postc              
   C   s  |j }ztjj|d�}W n2 tjk
rJ   ttjddœddœtjd� Y S X | d¡p^|jp^d 	¡ }| d	¡pv|j
pvd 	¡ }|r¸tjj|d
�j|d� ¡ r¸ttjddœdddœtjd�S |�r6tjj|d�j|d� ¡ }|�r6ddddœ}| |jd¡}	|	�rd|	› �nd}
ttjddœd|› d|
› d�dœtjd�S |  ||¡}�zz| d¡}|d k	�r„zt|ƒ|_W n ttfk
�r‚   Y nX d|k�rš| d¡|_d|k�r°| d¡|_zFt| d¡�pÊ|j�pÊdƒ}t| d¡�pæ|j�pædƒ}|| |_W n tk
�r   Y nX | d|j¡|_| d|j¡|_| d	|j
¡|_
| d|j¡|_| d|j¡|_| d|j¡|_d|k�r„| d¡|_|�r�||_| ¡  ttj ddœd |j› d!�dœtj d�W S  tk
�r } z(ttjddœt!|ƒdœtjd� W Y ¢S d }~X Y nX d S )"Nrš   r–   r;   úStudent not foundr¤  r   ry  r˜  rL  r™  Trš  ru   r›  rœ  r�  rž  rŸ  r   r¡  zT. To add another sport for that student, please edit their existing profile instead.rx  r”  r•  r   r‘  rU  r’  rF  r   r:   zStudent z updated successfully.)"rH   r   rL   rI   rM   r   r   rƒ   ry  r�  rL  r�   Úexcluder‚   r˜   r¥  rU  r�  rf  rx  rH  Ú	TypeErrorr”  r•  r¦  r“  ri   r‘  r’  rF  r§   rP   rT   rV   )rW   rX   r?   rH   rµ   Únew_nameZ
new_mobilerª  r«  r¬  r­  r§   Z
class_dataÚnrm  rn   r[   r[   r\   rª   g  sž    
þý
ýüÿþ

üø






þý
þýzStudentAPIView.putc                 C   s®   |d k	rªzlt jj|d�}tjj|d� ¡  tjj|d� ¡  tjj|d� ¡  | ¡  tt	j
ddœd ddœt	j
d�W S  t jk
r¨   tt	jddœd d	dœt	jd� Y S X d S )
Nrš   ©rc  r:   r;   z4Student and all related records deleted successfullyru   r   r–   r­   )r   rL   rI   r   r�   r—   r   r   r   r   rT   rM   rƒ   ©rW   rX   r?   rµ   r[   r[   r\   r—   Ç  s,    
ýü
ýüzStudentAPIView.delete)N)r_   r`   ra   r�  rI   r]   rª   r—   r[   r[   r[   r\   rˆ  ±  s
   '
>N`rˆ  c                   @   s.   e Zd Zd
dd„Zdd„ Zdd„ Zdd	„ ZdS )ÚTurfAPIViewNc           
   
   C   s$  |d k	rtz<t jj|d�}|j|j|j|jdœ}ttjddœ|dœƒW S  t j	k
rr   tddidd	œtj
d
� Y S X zlt j ¡ }|j d¡}|rœ|j|d�}|j d¡}|d k	r¼|j|d
�}dd„ |D ƒ}ttjddœ|dœƒW S  tk
�r }	 ztdt|	ƒitjd
� W Y ¢S d }	~	X Y nX d S )Nrš   ©r?   r>   Ú
sport_typer   r:   r;   r€  r<   r“   úTurf not foundr¤  r   r¹  ©r¹  r   c                 S   s"   g | ]}|j |j|j|jd œ‘qS )r¸  r¸  )rl  rh  r[   r[   r\   Ú
<listcomp>	  s   ûüz#TurfAPIView.get.<locals>.<listcomp>rF   )r   rL   rI   r?   r>   r¹  r   r   rT   rM   rƒ   rI  r”   r�   ri   rV   r˜   )
rW   rX   r?   ÚturfrH   Úturfsr¹  Zstatus_paramZ	turf_listrn   r[   r[   r\   rI   ì  sD    ü
þ
þ
ù

þ
zTurfAPIView.getc              
   C   sê   |j }z¢| d¡pd ¡ }| dd¡}|s>tdditjd�W S tjj||d� 	¡ }|rxtdd	|› d
|› d�itj
d�W S tjj||| dd¡d�}td|jdœtjd�W S  tk
rä } ztdt|ƒitjd� W Y ¢S d }~X Y nX d S )Nr>   r˜  r¹  rœ  rG   úTurf name is required.r   ©Zname__iexactr¹  ú"ú" already exists under Ú.r   r   )r>   r¹  r   zTurf added successfully!©rG   r?   )rH   rI   r�  r   r   r˜   r   rL   r�   r‚   rŒ   r„   r?   r£   ri   rV   )rW   rX   rH   r>   r¹  r‚   r½  rn   r[   r[   r\   r]   	  sB    þ ÿ
 ÿþ
ýþýzTurfAPIView.postc           	   
   C   s4  |j }zÄtjj|d�}| d¡p$|j ¡ }| d|j¡}|sPtdditj	d�W S tjj
||d�j|d� ¡ }|r’tdd|› d	|› d
�itjd�W S ||_||_| d|j¡|_| ¡  tdddœtjd�W S  tjk
rò   tdditjd� Y S  tk
�r. } ztdt|ƒitj	d� W Y ¢S d }~X Y nX d S )Nrš   r>   r¹  rG   r¿  r   rÀ  rÁ  rÂ  rÃ  r   r:   zTurf updated successfully!r¤  rº  )rH   r   rL   rI   r>   r�  r¹  r   r   r˜   r�   r±  r‚   rŒ   rP   rT   rM   rƒ   ri   rV   )	rW   rX   r?   rH   r½  r>   r¹  r‚   rn   r[   r[   r\   rª   @	  sJ    þ ÿþ
 ÿþþýzTurfAPIView.putc                 C   sf   z.t jj|d�}| ¡  ttjddœddœƒW S  t jk
r`   ttjddœddœtjd� Y S X d S )	Nrš   r:   r;   zTurf deleted successfullyr¤  r–   rº  r   )	r   rL   rI   r—   r   r   rT   rM   rƒ   )rW   rX   r?   r½  r[   r[   r\   r—   e	  s    
þ

þýzTurfAPIView.delete)Nr¼   r[   r[   r[   r\   r·  é  s   
1#%r·  )r#   r"   )r   c                   @   s   e Zd Zdd„ ZdS )ÚBookingReportAPIViewc              
   C   s¢  |j  d¡}|j  d¡}|j  d¡}|r,|s>tdditjd�S tjj||gd�}|r`|j|d�}| d	d¡j	t
d
ƒtdƒd� d¡}| d¡j	t
d
ƒtdƒd� d¡}| dd¡j	t
d
ƒtdƒtdƒd� d¡}g }	|D ]D}
|
d pæd}|
d pòd}|	 |
d |
d |
d ||| |dœ¡ qØ|	jdd„ dd� |jt
d
ƒtdƒtdƒd�}| d¡�pZd}| d¡�pjd}|| |d< td||d œt|ƒt|ƒ|	|d!œtjd�S )"NÚ	from_dateÚto_dater¹  rG   z)Please provide both from_date and to_dater   )Zbooking_date__ranger»  Únet_selectionr?   Úamount)Útotal_bookingsZtotal_revenuez-total_revenueÚcustomer_namerC   Úpending_amount)rÊ  Útotal_amountÚtotal_pendingrÍ  r   rÎ  rÊ  )rË  rC   rÊ  rÍ  Z
total_paidrÎ  c                 S   s   | d S )NrÎ  r[   )Úxr[   r[   r\   Ú<lambda>¬	  ó    z*BookingReportAPIView.get.<locals>.<lambda>T)ÚkeyÚreverse)Zgrand_total_bookingsÚgrand_total_revenueÚgrand_total_pendingrÔ  rÕ  Zgrand_total_paidr:   )ÚfromÚto)r   Z
date_rangeZdetailed_reportÚsport_summaryÚcustomer_summaryZoverall)r”   rI   r   r   r˜   r   rL   r�   ÚvaluesÚannotater#   r"   r²   r´   ÚsortÚ	aggregateÚlistrT   )rW   rX   rÆ  rÇ  r¹  Úbase_qsÚreport_datarØ  Zcustomer_qsrÙ  ÚcrÍ  rÎ  Zoverall_statsrÔ  rÕ  r[   r[   r\   rI   z	  sz    þþý
þýýüú
	ýúùzBookingReportAPIView.getNr×   r[   r[   r[   r\   rÅ  y	  s   rÅ  c              	   C   s6   zt  | d¡ d¡W S  ttfk
r0   |  Y S X dS )zKConvert stored 24hr 'HH:MM' -> display '09:00 AM'. Falls back to raw value.rV  z%I:%M %pN)r    rW  rƒ  rH  r²  )Ztime_strr[   r[   r\   Úto_12hrÌ	  s    râ  c                   @   s<   e Zd Zddd„Zeddd„ƒZdd„ Zdd	„ Zd
d„ ZdS )ÚBookingAPIViewNc                 C   sZ  |d k	rÂzŠt jj|d�}|j|j|j|j|j|j|j	|j
 d¡|jrP|j d¡nd |jt|jƒ|jt|jƒ|j|j|jdœ}ttjddœ|dœƒW S  t jk
rÀ   tddid	d
œtjd� Y S X �zR|j d¡}|j d¡}t|j dd¡ƒ ¡ dk}t ¡  ¡ }|�rt j ¡ }	nD|�r,t  |d¡ ¡ n|}
|
|k�rJt jj!|
d�}	nt jj!|
|
d�}	|�rl|	j!|d�}	|	 "dd¡}	g }t#|	dƒD ]x\}}| $||j|j|j|j|j|j|j	|j
 d¡|j�rÎ|j d¡nd |jt|jƒ|jt|jƒ|j|j|jdœ¡ �q†ttjddœ|dœƒW S  t%k
�rT } ztdt|ƒitj&d� W Y ¢S d }~X Y nX d S )Nrš   rQ  )r?   rË  rC   r6   r¹  rÈ  Úbooking_typeÚbooking_dateÚend_dateÚ
start_timeÚstart_time_displayÚend_timeÚend_time_displayrÉ  rÌ  Úpayment_statusr:   r;   r€  r<   r“   úBooking not foundr¤  r   r   r¹  rI  r˜  )Ú1ÚtrueÚyes)Úend_date__gte)Úbooking_date__lterð  r»  z-booking_datez-start_timer   )r±   r?   rË  rC   r6   r¹  rÈ  rä  rå  ræ  rç  rè  ré  rê  rÉ  rÌ  rë  rF   )'r   rL   rI   r?   rË  rC   r6   r¹  rÈ  rä  rå  rƒ  ræ  rç  râ  ré  rÉ  rÌ  rë  r   r   rT   rM   rƒ   r”   rV   Úlowerr   r…   r   rI  r    rW  r�   r²   r³   r´   ri   r˜   )rW   rX   r?   ÚbookingrH   Ztarget_date_strr¹  Zshow_allÚtodayÚbookingsra  Zbooking_listr¶   rë   rn   r[   r[   r\   rI   ×	  s˜    
ð
þ
þÿþ
þ
ï
þ
zBookingAPIView.getc                 C   s2   t jj| ||||d�}|dk	r*|j|d�}| ¡ S )aª  
        A real double-booking only happens when the DATE ranges overlap
        AND the TIME ranges overlap, for the SAME net/turf.

        Standard interval-overlap test:  A.start < B.end  AND  A.end > B.start
        Applied on both the date axis and the time axis.

        start_time/end_time must be 24hr "HH:MM" strings so the string
        comparison here is actually correct (that's the bug this replaces).
        )rÈ  rñ  rð  Zstart_time__ltZend_time__gtNrš   )r   rL   r�   r±  r‚   )ÚnetÚ
start_dateræ  rç  ré  Ú
exclude_idr]  r[   r[   r\   Ú_has_conflict;
  s    ûzBookingAPIView._has_conflictc                 C   sª  |j }�z^| dd¡}| dd¡}| d¡}| d¡}| d¡}|sXtdd	itjd
�W S t | d¡d¡ ¡ }|dkrªt | d¡d¡ ¡ }	|	|k r®tdditjd
�W S n|}	|r¾|r¾||krÒtdditjd
�W S |  |||	||¡�rtdd|› d�itj	d
�W S t
jj| d¡| d¡| d¡|||||	||| d¡| dd¡| dd¡d�}
td|
jdœtjd
�W S  tk
�r¤ } ztdt|ƒitjd
� W Y ¢S d }~X Y nX d S )Nrä  ÚDayr¹  rœ  rÈ  rç  ré  rG   zPlease select a turf/net.r   rå  rQ  ÚMonthræ  ú)End date cannot be before the start date.ú&End time must be after the start time.zSlot already booked! z- is not available for the selected date/time.rË  rC   r6   rÉ  rÌ  r   rë  ÚPending)rË  rC   r6   r¹  rÈ  rä  rå  ræ  rç  ré  rÉ  rÌ  rë  zBooking confirmed successfully!rÄ  )rH   rI   r   r   r˜   r    rW  r   rù  rŒ   r   rL   r„   r?   r£   ri   rV   )rW   rX   rH   Úb_typer¹  rö  Ú	raw_startÚraw_endr÷  ræ  ró  rn   r[   r[   r\   r]   R
  sj    


þ
þ 
ÿþ

óþýzBookingAPIView.postc              
   C   s:  |j }�zÆtjj|d�}| d|j¡}| d|j¡}| d|j¡}| d¡}|r`t |d¡ 	¡ n|j
}	| d|j¡}
| d|j¡}|d	krÌ| d
¡}|r¨t |d¡ 	¡ n|j}||	k rÐtdditjd�W S n|	}|
rà|rà||
krôtdditjd�W S | j||	||
||d��r(tdd|› d�itjd�W S | d|j¡|_| d|j¡|_| d|j¡|_||_||_||_|	|_
||_|
|_||_| d|j¡|_| d|j¡|_| d|j¡|_| ¡  tdddœtjd�W S  tjk
�rø   tdditjd� Y S  tk
�r4 } ztdt|ƒitjd� W Y ¢S d }~X Y nX d S )Nrš   rä  r¹  rÈ  rå  rQ  rç  ré  rû  ræ  rG   rü  r   rý  )rø  zUpdate failed! z. is already booked for the selected date/time.rË  rC   r6   rÉ  rÌ  rë  r:   zBooking updated successfully!r¤  rì  )rH   r   rL   rI   rä  r¹  rÈ  r    rW  r   rå  rç  ré  ræ  r   r   r˜   rù  rŒ   rË  rC   r6   rÉ  rÌ  rë  rP   rT   rM   rƒ   ri   rV   )rW   rX   r?   rH   ró  rÿ  r¹  rö  Zstart_date_strr÷  r   r  Zend_date_strræ  rn   r[   r[   r\   rª   �
  sz    
ÿþ
ÿþþ
þ 
ÿþþýzBookingAPIView.putc                 C   sn   |d k	rjz.t jj|d�}| ¡  ttjddœddœƒW S  t jk
rh   ttjddœddœtjd� Y S X d S )	Nrš   r:   r;   z!Booking slot deleted successfullyr¤  r–   zNo booking foundr   )	r   rL   rI   r—   r   r   rT   rM   rƒ   )rW   rX   r?   ró  r[   r[   r\   r—   Ò
  s    
þ

þýzBookingAPIView.delete)N)N)	r_   r`   ra   rI   Ústaticmethodrù  r]   rª   r—   r[   r[   r[   r\   rã  Ô	  s   
d;Erã  c                   C   s   dd  tjtjdd�¡ S )NZRECr˜  rv   )Úk)ÚjoinÚrandomÚchoicesÚstringÚdigitsr[   r[   r[   r\   Úgenerate_receipt_noã
  s    r	  )r   r   r   c                   @   s   e Zd Zddd„Zdd„ ZdS )ÚFeesAPIViewNc                 C   s  t  ¡ j}t  ¡ j}|�rˆ�z<tjj|d�}tjj|d� 	¡ }t
tjj|d||d�jtdƒd�d pfdƒ}t
tjj|d	||d�jtdƒd�d p’dƒ}t
|jp dƒ}	|rÚ|dkrÎt
|jƒ|	k rÎt
|jƒ|	 }
qÞt
|jƒ}
n|	}
t
|jpèdƒ}|�r(|dk�rt
|jƒ|k �rt
|jƒ| }n
t
|jƒ}n|}|j|j|	||
|||d
œ}tddi|dœƒW S  tjk
�r‚   tddiddœƒ Y S X �n|tjjdd�}g }|D �]P}tjj|d� 	¡ }t
tjj|d||d�jtdƒd�d �pàdƒ}t
tjj|d	||d�jtdƒd�d �pdƒ}t
|j�pdƒ}	|�r^|dk�rRt
|jƒ|	k �rRt
|jƒ|	 }
n
t
|jƒ}
n|	}
t
|j�pndƒ}|�r®|dk�r¢t
|jƒ|k �r¢t
|jƒ| }n
t
|jƒ}n|}| |j|j�rÐ| |jj¡nd |j|j|	||
|||dœ
¡ �qžtddi|dœƒS d S )Nrš   ©rµ   ÚNORMAL)rµ   Úfee_typeÚpayment_date__monthÚpayment_date__yearÚamount_paid©rq  rq  r   ÚSPECIAL)ry  rx  r”  Únormal_paidÚnormal_balancer•  Úspecial_paidÚspecial_balancer<   r‘   r€  r“   r°  r¤  r   r   )
r?   r§   ry  rx  r”  r  r  r•  r  r  )r    r…   rã   râ   r   rL   rI   r   r�   r¥  r¦  r   rÝ  ÚDSumr”  r  r•  r  ry  rx  r   rM   r´   r?   r§   rR   rS   )rW   rX   r?   rè   rç   rµ   Z
fee_recordZn_paid_this_monthZs_paid_this_monthr®  Z	n_balancer¯  Z	s_balancerH   r—  Ú	data_listr[   r[   r\   rI   í
  sÖ    

  þýýý  þýýýø

  þýýý  þýýýõzFeesAPIView.getc              
   C   sF  �z t jj|d�}|j}t| dd¡ƒ}t| dd¡ƒ}| d¡}tjj|d�\}}	|	r†t|jpbdƒ|_t|jprdƒ|_t	 
¡  ¡ |_|dkrªt|jp˜dƒ| |_||_n"|dkrÌt|jp¼dƒ| |_||_| ¡  tjj|||t	 
¡  ¡ d	� td
diddœƒW S  tk
�r@ }
 ztd
dit|
ƒdœƒ W Y ¢S d }
~
X Y nX d S )Nrš   Zpaid_amountr   Zbalance_amountr  r  r  r  )rµ   r  r  Úpayment_dater<   r‘   zPayment Recorded Successfullyr¤  r’   )r   rL   rI   rH   r¦  r   Úget_or_creater”  r•  r    r…   r   r  r  r  r  r  rP   r   r„   r   ri   rV   )rW   rX   r?   Zstudent_objÚdZpaid_nowZnew_balancer  ZfeeÚcreatedrn   r[   r[   r\   rª   ^  s6    

üzFeesAPIView.put)N)r_   r`   ra   rI   rª   r[   r[   r[   r\   r
  ì
  s   
qr
  c                   @   s   e Zd Zdd„ ZdS )ÚFeesHistoryAPIViewc              
   C   sœ  ddl m} �zJtjj|d�}|j ¡ }t ¡  ¡ }t	jj
|d�}tƒ }|D ]&}	|	j d¡› d|	j› �}
| |
¡ qLg }|jdd�}||k�r>| d¡}d	D ]�}|› d|› �}||krü|j|j|j|d
�}| |j| d¡t|jƒ|j d¡|jddœ¡ qœ| d| d¡› d|› �| d¡dd |ddœ¡ qœ||dd�7 }q„| ¡  tddi|dœƒW S  tk
�r– } ztddit|ƒdœƒ W Y ¢S d }~X Y nX d S )Nr   )Úrelativedeltarš   rµ  z%m-%Yú-r   )Úday)r  r  )r  r  r  z%B %Yz%d-%m-%YZPAID)r?   ré   r  r  r  r   zunpaid-ZNOT_PAID)Úmonthsr<   r‘   r€  r’   r¤  )Zdateutil.relativedeltar  r   rL   rI   Ú
created_atr   r    r…   r   r�   r�  r  rƒ  r  ÚaddÚreplacerã   râ   r´   r?   r¦  r  rÓ  r   ri   rV   )rW   rX   rc  r  rµ   Z	join_daterÖ   Zhistory_recordsZpaid_monthsÚhrÒ  Z
final_dataZ	temp_dateZ
month_yearZf_typeZ	check_keyÚrecordrn   r[   r[   r\   rI   ‡  sV    


ý
ú
ú

zFeesHistoryAPIView.getNr×   r[   r[   r[   r\   r  †  s   r  c                   @   s   e Zd Zdd„ ZdS )ÚStudentStatusAPIViewc                 C   st   zHt jj|d�}|jdkr"d|_nd|_| ¡  tdddœ|jddœƒW S  t jk
rn   td	d
idd� Y S X d S )Nrš   r   r®   r‘   r:   r;   úStatus updated successfully©r   Z
new_statusrG   rF   r°  r“   r   )r   rL   rI   r   rP   r   rM   r¶  r[   r[   r\   ÚpatchÛ  s    
ý
zStudentStatusAPIView.patchN©r_   r`   ra   r*  r[   r[   r[   r\   r'  Ú  s   r'  c                   @   s   e Zd Zdd„ ZdS )ÚEmployeeStatusAPIViewc                 C   st   zHt jj|d�}|jdkr"d|_nd|_| ¡  tdddœ|jddœƒW S  tjk
rn   td	d
idd� Y S X d S )Nr7   r   r®   r‘   r:   r;   r(  r)  rF   r°  r“   r   )r	   rL   rI   r   rP   r   r   rM   r¶  r[   r[   r\   r*  î  s    
ý
zEmployeeStatusAPIView.patchNr+  r[   r[   r[   r\   r,  í  s   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 |j dd¡ƒ}t ||¡d }tj	| d d… }g }t
d|d ƒD ] }	| |	|› d|	d›�d	œ¡ q‚tjj|dgd
�}
|rÎ|dkrÎ|
j|d�}
tjj|||d�}g }|
D �]B}i }d}d}d}d}|D ]î}|d }	|j|j|	dd� ¡ }|j|j|	dd� ¡ }|�rT|jdk�rTdn|�r^dnd}|�rx|jdk�rxd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 }n|dk�r|d7 }�q| |j|j�r| |jj¡nd |j|||||dœ¡ qèt|||dœƒS )Nrã   râ   rc  r¹  r   r¯   ú Ú02d)Úday_numÚdisplayrR  rI  rš   )Zdate__monthZ
date__yearrU  r   r0  )rc  Z	date__dayrT  r®   rS  rs  rt  r  Zday_Z_nZ_s)r>   r§   rx  Ú
attendanceÚ	total_n_pÚ	total_n_aÚ	total_s_pÚ	total_s_a)ÚdaysÚreportr¹  )rf  r”   rI   r    r…   rã   râ   rá   Ú
monthrangeré   rå   r´   r   rL   r�   r   r?   r¥  r   ry  r§   rR   rS   rx  r   )rW   rX   rã   râ   Zstudent_id_paramr¹  Znum_daysré   Z	days_listr  r—  Zattendance_recordsrà  rµ   Zstudent_attr3  r4  r5  r6  Zday_objZn_recZs_recru  rv  r[   r[   r\   rI   
  s„    þ
ý
  ÿ
  ÿ
$$





ø
ýzMonthlyAttendanceAPIView.getN)r_   r`   ra   r+   r«   rI   r[   r[   r[   r\   r-    s   r-  ©r   )r   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚAttendanceAPIViewc           
      C   s  zÂ|j  dt ¡  ¡ ¡}|j  d¡}|j  d¡}tjj|d� d¡}|rT|j|d�}|rd|j|d�}g }t	|dƒD ]6\}}| 
||j|jj|jj|j|j|j|jd	œ¡ qrttjd
dœd |dœƒW S  tk
�r }	 z$ttjddœdt|	ƒdœƒ W Y ¢S d }	~	X Y nX d S )Nr   rT  r¹  r:  r°   )rT  )rU  r   )r±   r?   Ú	studentIdry  r   rT  rU  r   r:   r;   r   r–   Tru   )r”   rI   r   rô  Ú	isoformatr   rL   r�   r²   r³   r´   r?   rµ   ry  r   rT  rU  r   rT   ri   r˜   rV   )
rW   rX   Z
query_daterT  r¹  ÚattendancesZattendance_listr¶   Zattrn   r[   r[   r\   rI   ã  s@    ø

ý

ýzAttendanceAPIView.getc              
   C   s  |j }z¸| d¡}| dt ¡  ¡ ¡}| d¡}| dd¡}| d¡}tjj||||d� ¡ }|rv||_	| 
¡  d}	ntjj|||||d	�}d
}	tt	jddœd |	|j|jj|j	|jdœdœƒW S  tk
�r }
 z*tt	jddœddt|
ƒ› �dœƒ W Y ¢S d }
~
X Y nX d S )Nr<  r   rT  rU  r   r   ©rc  r   rT  rU  zAttendance updated successfully)rc  r   rT  rU  r   zAttendance marked successfullyr:   r;   )r?   ry  r   rU  rE   r–   Tr¸   ru   )rH   rI   r   rô  r=  r   rL   r�   r¥  r   rP   r„   r   r£   r?   rµ   ry  rU  ri   r˜   rV   )rW   rX   rH   rc  Úatt_dateÚsessionZsportZ
att_statusZattendance_objrG   rn   r[   r[   r\   r]     sR    


ü
û
üü

ýzAttendanceAPIView.postc           	   
   C   sè   z¦|j  d¡}|j  d¡}|j  d¡}|j  d¡}|rB|rB|rB|sVtddiddœƒW S tjj||||d	� ¡ \}}|d
kr�tdddœddœƒW S tddiddœƒW S W n< tk
râ } ztddit|ƒdœƒ W Y ¢S d }~X Y nX d S )Nr<  r   rT  r¹  r<   r’   z2studentId, date, session_type, sport_type requiredr¤  r?  r   r‘   r:   r;   zAttendance deleted successfullyr“   zAttendance record not found)	r”   rI   r   r   rL   r�   r—   ri   rV   )	rW   rX   rc  r@  rT  r¹  Zdeleted_countÚ_rn   r[   r[   r\   r—   E  s<    þ
üþ
þþzAttendanceAPIView.deleteN)r_   r`   ra   rI   r]   r—   r[   r[   r[   r\   r;  ß  s   )9r;  c                   @   s   e Zd Zddd„Zdd„ ZdS )ÚLoanAPIViewNc                 C   sÞ  |d k	r²zxt jj|d�}z|jr(|jjnd }W n tk
rF   d }Y nX |j|j|j|j	|j
||jdœ}ttjddœd |dœƒW S  tk
r¬   ttjddœddd	œƒ Y S X �n(zøg }tjjd
d�}|D ],}tjj|jd�}	| |j|	j|	jdœ¡ qÊd}
g }tj ¡ }|D ]€}|
d7 }
tjj|jd�}tjj|jd�jtdƒd�d �pNd}| |
|jdt|jƒ ||j|j|j|j|j|j|j dœ¡ �qttjddœd ||dœƒW S  tk
�rØ   ttjddœddd	œƒ Y S X d S )Nrš   rA  r:   r;   r   r–   Tr»   ru   ÚActive©Úloan_status)Úloan_idr>   rC   r   r   ©rG  Úcollectedamonutr  rq  ÚL00)r±   r?   rG  ÚpaidrE  Zclient_phoneÚloan_amountÚloan_tenure_monthsÚcollection_typeÚcollection_dayrF  )r   rF   rH   Ú
activeloan)!r   rL   rI   rD  rS   rH  r?   r>   r<   rB  rC  r   r   rT   r   rƒ   r   r�   r   Ú	client_idr´   rE  rC   rI  r   rÝ  r"   rV   rL  rM  rN  rO  rF  )rW   rX   r?   rŸ   rJ  rH   rP  ÚloaÚiÚclientsr¶   r<  ÚloanrK  Úcollectedamountr[   r[   r\   rI   m  s”    
ø
ý

ýý

ÿþþô
ü

ýzLoanAPIView.getc                 C   sÂ   |j }zrd}tjj|d |d |d ||d |d | dd¡|d	 |d
 | dd¡d�
}| ¡  ttjddœd ddœƒW S  t	k
r¼ } z&ttj
ddœdd|› �dœƒ W Y ¢S d }~X Y nX d S )Nr   ZclientIdZ
loanAmountZloanDateZ
loanTenureZemiStartDateZcollectionTypeZDailyZavgRateZ
loanStatusÚremarksr˜  )
rQ  rL  Ú	loan_dateÚinterest_raterM  Úemi_start_daterN  rO  rF  rW  r:   r;   úLoan created successfullyru   r–   Tr¢   )rH   r   rL   r„   rI   rP   r   r   r£   r¤   r˜   )rW   rX   rH   ZraterŸ   rn   r[   r[   r\   r]   Ø  s6    

î
ý

ýzLoanAPIView.post)NrM  r[   r[   r[   r\   rC  j  s   
krC  c                   @   s   e Zd Zddd„ZdS )ÚDashboardAPIViewNc              	   C   s(  |d k	rîz´g }t jj|d�}|D ]$}| |j|j|j|j|jdœ¡ q t jj|d�j	t
dƒd�d pfd}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k
rè   ttjdd
œdddœƒ Y S X �n6�zd}
g }ddlm} tjjdd� ¡ }tjjdd� ¡ }tj 	t
dƒ¡d �pBd}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k
�r"   ttjdd
œdddœƒ Y S X d S )NrH  ©r?   rI  ÚmethodrG  r   rI  r  rq  r   rš   ©rE  rC   rL  ÚtenurerF  rK  r:   r;   ©r   rF   rH   Údatasr–   Tr»   ru   r   rD  rE  ÚClosedrL  Úloan_amount__sumÚcollectedamonut__sumrO  Zcollection_day__sum)Zcreated_at__date)ÚactiveÚinactiveÚtotal_disbursedÚtotal_collectedÚtotal_outstandingÚexpected_dailyÚactual_dailyZfdddgdgfdgdfgdfgfdgfdgfdr   ) r   rL   r�   r´   r?   rI  r^  rG  r"  rÝ  r"   r   rI   r   rQ  rE  rC   rL  rM  rF  r   r   rT   r   rƒ   Údjango.utilsr   rÔ   r¦  r…   r   rj   )rW   rX   r?   ÚdogoÚ
collectionÚmrV  rR  ÚclirH   r¶   r<  r   rf  rg  rh  ri  rj  rk  rô  rl  rb  r[   r[   r\   rI   d  s�    û

ÿþþú

ü

ý""ù

ý

ýzDashboardAPIView.get)Nr×   r[   r[   r[   r\   r\  a  s   r\  )r   r   c                   @   s   e Zd Zdd„ ZdS )ÚMonthlyReportAPIViewc           	   
   C   s  |j  d¡}|j  d¡}|r |s4t ¡  ¡ }|}|}z–tjj||gd� t	dƒ¡d pXd}t
jj||gd� t	dƒ¡d p|d}tjj||gd� ¡ }td	||t|ƒt|ƒ ||› d
|› �dœdœtjd�W S  tk
�r
 } z tdt|ƒdœtjd� W Y ¢S d }~X Y nX d S )Nr÷  ræ  )Zcreated_at__date__rangerL  rd  r   rI  re  r:   z to )rh  ri  Znet_flowÚnew_loans_countÚperiodr€  r   rF   r¤  )r”   rI   r   r…   r   r   rL   r�   rÝ  r"   r   rÔ   r   r¦  r   rT   ri   rV   r˜   )	rW   rX   r÷  ræ  rô  Z	disbursedÚ	collectedrs  rn   r[   r[   r\   rI   Ñ  sR    ÿþþþÿþþþÿ
ûþ	÷zMonthlyReportAPIView.getNr×   r[   r[   r[   r\   rr  Ð  s   rr  c                   @   s   e Zd Zddd„Zdd„ ZdS )ÚCollectionAPIViewNc                 C   s¦  |d k	rìz´g }t jj|d�}|D ]$}| |j|j|j|j|jdœ¡ q t jj|d�j	t
dƒd�d pfd}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k
rè   ttjdd
œdddœƒ Y S X n¶z†d}
g }tj ¡ }|D ]T}|
d7 }
tjj|jd�}| |
|jdt|jƒ |j|j|j|j|j|jdœ	¡ �qttjd	d
œd |dœƒW S  tk
�r    ttjdd
œdddœƒ Y S X d S )NrH  r]  rI  r  rq  r   rš   r_  r:   r;   ra  r–   Tr»   ru   r   rJ  ©	r±   r?   rG  rE  rL  rM  rN  rO  rF  r   )r   rL   r�   r´   r?   rI  r^  rG  r"  rÝ  r"   r   rI   r   rQ  rE  rC   rL  rM  rF  r   r   rT   r   rƒ   rI  rV   rN  rO  )rW   rX   r?   rn  ro  rp  rV  rR  rq  rH   r¶   r<  rU  rŸ   rK  r[   r[   r\   rI   ý  sŠ    û

ÿþþú

ü

ý
ó
ý

ýzCollectionAPIView.getc              
   C   sê   |j }zš|d }|d }|d }| dd¡}tjj||||d�}tjj|d�jtdƒd	�d
 p`d}tjj|d�}	|	j	|krˆd|	_
|	 ¡  ttjddœd ddœƒW S  tk
rä }
 z&ttjddœdd|
› �dœƒ W Y ¢S d }
~
X Y nX d S )NZloanIdZamountCollectedZpaymentModerW  r˜  )rG  rI  r^  rW  rH  rI  r  rq  r   rš   rc  r:   r;   r[  ru   r–   Tr¢   )rH   rI   r   rL   r„   r�   rÝ  r"   r   rL  rF  rP   r   r   r£   r¤   r˜   )rW   rX   rH   rG  Zamount_collectedÚpayment_moderW  ro  Zcollected_totalrU  rn   r[   r[   r\   r]   ^  sD    ü	ÿþþ

ý

ýzCollectionAPIView.post)NrM  r[   r[   r[   r\   rv  ú  s   
arv  c                   @   s   e Zd Zddd„ZdS )ÚGetclientAPIViewNc                 C   s  |d k	rzzBt jj|d�}|j|j|j|j|jdœ}tt	j
ddœd |dœƒW S  tk
rv   tt	jddœddd	œƒ Y S X n„zTd
}g }t j ¡ D ]&}|d7 }| ||j|j|jdœ¡ qŽtt	j
ddœd |dœƒW S  tk
� rü   tt	jddœddd	œƒ Y S X d S )Nrš   )r?   Ú
vendornamerC   r6   rF  r:   r;   r   r–   Tr»   ru   r   r   )r±   r?   rK  rC   )r   rL   r�   r?   rz  rC   r6   rF  r   r   rT   r   rƒ   rI  r´   rE  )rW   rX   r?   rŸ   rH   r¶   r<  r[   r[   r\   rI   ’  sT    û
ý

ýü

ý

ýzGetclientAPIView.get)Nr×   r[   r[   r[   r\   ry  �  s   ry  c                   @   s   e Zd Zddd„ZdS )ÚOldloanAPIViewNc                 C   sJ  |d k	r’zZg }t jj|d�}|D ](}| |j|j|j|j|j|j	dœ¡ q t
tjddœd |dœƒW S  tk
rŽ   t
tjddœddd	œƒ Y S X n´z„d
}g }t j ¡ }|D ]R}	|d7 }tjj|	jd�}
| ||	jdt|	jƒ |
j|	j|	j|	j|	j|	j	dœ	¡ qªt
tjddœd |dœƒW S  tk
�rD   t
tjddœddd	œƒ Y S X d S )N)rQ  )r`  rL  rG  ZemisdateZemildaterF  r:   r;   r   r–   Tr»   ru   r   r   rš   rJ  rw  )r   rL   r�   r´   rM  rL  r?   rZ  rX  rF  r   r   rT   r   rƒ   rI  r   rI   rQ  rV   rE  rN  rO  )rW   rX   r?   rn  ro  rp  r¶   r<  rU  rŸ   rK  r[   r[   r\   rI   Î  sj    ú

ý

ý
ó

ý

ýzOldloanAPIView.get)Nr×   r[   r[   r[   r\   r{  Ë  s   r{  c                   @   s   e Zd Zdd„ ZdS )Ú	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
k
r¨ } z&ttjd	dœd
d|› �dœƒ W Y ¢S d }~X Y nX d S )Nrs   r6   r4   r5   r:   r;   zPassword reset successfullyru   r–   Tr¢   )rH   rI   r   r   rL   r4   rP   r   r   rT   r¤   r˜   )	rW   rX   rH   rs   r6   r4   r¹   Zmanrn   r[   r[   r\   r]   &  s(    


ý

ýzFpAPIView.postNr^   r[   r[   r[   r\   r|  "  s   r|  c                   @   s&   e Zd ZefZddd„Zddd„ZdS )ÚNotificationAPIViewNc                 C   s   |d k	rtz:t jj|d�}|j|j|jdœ}ttjddœd |dœƒW S  t	k
rn   ttj
ddœddd	œƒ Y S X �nˆd
dlm} d
dlm} �z(d
}g }|jj}	tjj|	d�}
|
jdk�r˜tjjddgd� d¡}|D ] }|d7 }z|jrò|jjnd}W n tjk
�r   d}Y nX |jdk�r.d|› �}n|jdk�rF|› d�}nd}| ||j|j||j||j|ƒ ƒd dœ¡ qÖttjddœd |t|ƒdœƒW S ttjddœddg dœƒW S W nD tk
�rú } z$ttjddœdt|ƒd	œƒ W Y ¢S d }~X Y nX d S )Nrš   )r?   rz  rC   r:   r;   r   r–   Tr»   ru   r   )Ú	timesincer¾   r7   r   ZnewuserZpaymentuser)Ztype__inr°   ÚUnknownzNew Company Registered: z made a paymentzUnknown notification typez ago)r±   r?   ÚtyperG   r"  Ztime_ago)r   rF   rH   rÔ   Ú	forbiddenz1You do not have permission to view notifications.rE   ) ZVendorrL   rI   r?   rz  rC   r   r   rT   r   rƒ   Údjango.utils.timesincer~  rÓ   r…   rY   r	   rD   r   r�   r²   r3   r   rM   r€  r´   r"  ÚlenZHTTP_403_FORBIDDENri   rŠ   rV   )rW   rX   r?   rŸ   rH   r~  r…   r¶   ZnoterÕ   rA   Únotificationsr´  r3   rG   rn   r[   r[   r\   rI   N  sˆ    ý
ý

ý	ÿþ
ú


ü
	
ü
ýzNotificationAPIView.getc              
   C   sâ   zp|d k	r:t jj|d�}| ¡  ttjddœd ddœƒW S |jj}t jj	|d� ¡  ttjddœd ddœƒW S W nl t
k
rœ   ttjddœd	d
dœƒ Y S  tk
rÜ } z$ttjddœd	t|ƒdœƒ W Y ¢S d }~X Y nX d S )Nrš   r:   r;   z!Notification deleted successfullyru   r7   z&All notifications deleted successfullyr–   TzNotification not found)r   rL   rI   r—   r   r   rT   rY   r?   r�   r   rƒ   ri   rŠ   rV   )rW   rX   r?   ÚnotificationrÕ   rn   r[   r[   r\   r—   §  s8    
ý

ý
ý
ýzNotificationAPIView.delete)N)N)r_   r`   ra   r+   r«   rI   r—   r[   r[   r[   r\   r}  K  s   
Yr}  c                   @   s   e Zd Zdd„ ZdS )Ú ProductactivestatusupdateAPIViewc              
   C   sš   zPt jj|d�}|jdkr*d|_| ¡  nd|_| ¡  ttjddœd ddœƒW S  tk
r” } z&ttjddœd	d
|› �dœƒ W Y ¢S d }~X Y nX d S )Nrš   r   r®   r:   r;   zQuote accepted successfullyru   r–   Tr¢   )	r   rL   rI   r   rP   r   r£   r¤   r˜   )rW   rX   r?   Zvenrn   r[   r[   r\   rª   Î  s$    


ý

ýz$ProductactivestatusupdateAPIView.putN)r_   r`   ra   rª   r[   r[   r[   r\   r†  Ì  s   r†  )uÚdjango.confr   Zdjango.shortcutsr   Zrest_framework.viewsr   Zrest_framework.responser   Úrest_frameworkr   Úmodelsr	   r
   r   r   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   rm  r   Zdjtzr    r   r!   Úrequestsrä   r"   r#   Údjango.httpr$   rŽ  Zrest_framework.parsersr%   r&   r'   Zrest_framework.genericsr(   r)   Úserializersr*   Zrest_framework.permissionsr+   r,   r¨  Údjango.core.mailr-   Zschool.settingsr.   ZpdfkitrJ   r‡   r/   Údjango.utils.cryptor0   r2   ro   rp   rq   rr   r‹   rŽ   r™   r¬   r½   rØ   rì   rñ   r@  r[  rN  r„  Údjango.core.files.baser‡  rˆ  r·  rÅ  râ  rã  r  r  r	  r  r
  r  r'  r,  rá   r-  r;  rC  r\  rr  rv  ry  r{  r|  r}  r†  r[   r[   r[   r\   Ú<module>   s,  <e& I} 4DV'   L C +    : 
H   T R  xh* <W) 