
    siH                    6   d Z ddlZddlZddlZddlmZ ddlmZmZmZ ddl	m
Z
 ddlmZmZ ddlZddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZmZ ddlmZmZ ddlmZm Z m!Z! ddl"m#Z# ddl$m%Z% ddl&m'Z( ddl&m)Z* ddl+m,Z, ddl-m.Z. ddl/m0Z0 ddl1m2Z2 ddl3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z< ddl=m>Z>m?Z?m@Z@ ddlAmBZB ddlCmDZDmEZEmFZFmGZGmHZHmIZI ddlJmKZK ddlLmMZM ddlNmOZOmPZP ddlQ ddlR ddlS ddlTmUZUmVZVmWZWmXZXmYZY ddlZ ddlZm[Z[ dd l\m]Z] dd!l^m_Z_ d" Z`eF eId#      d$               Zad% ZbeF eId&      d'               ZceFeD eGd&      d(                      ZdeFeD eId&      d)                      ZeeF eId*      d+               ZfeF eId,      d-               ZgeFeD eGd.      d/                      Zhd0 ZieFeD eGd.      dd1                     ZjeF eGd2      d3               ZkeF eGd2      d4               Zldd5ZmeF eGd2      d6               ZneFeDd7               ZoeFeD eGd8      d9                      ZpeFeD eGd:      d;                      ZqeF eGd8      dd<              ZreF eGd8      d=               ZseF eGd8      d>               ZteF eGd8      dd?              ZueFeDd@               ZveFeD eGd2      dA                      ZweFeD eGdB      dC                      ZxeF eGdD      dE               ZyeFeD eGdD      dF                      ZzeFeD eGdD      dG                      Z{eFeD eGdB      dH                      Z|eFeD eGdI      dJ                      Z}eFeD eGdK      dL                      Z~ e,dMg       eIdK      dN               ZdO ZeF eGdB      dP               ZeFdQ        ZeFeDdR               ZeFeD eIdS      dT                      ZeFdU        ZeFeDdV               ZeFeD eIdW      dX                      ZeFeD eIdY      dZ                      ZeFeD eIdY      d[                      ZeF eIdS      d\               ZeF eIdS      d]               ZeFeDd^               ZeFeDd_               ZeFeDd`               ZeFeDda               ZeFdb        ZeFeDdc               ZeFeDdd               ZeF eGd2      de               ZeFdf        ZeF eId:      dg               ZeFdh        ZeFdi        ZeFdj        ZeFdk        ZeFdl        ZeFdm        ZeFdn        ZeFeDdo               ZeFdp        ZeFdq        ZeFeDdr               ZeFeDds               ZeFeDdt               ZeFeD e       du                      ZeF e       dv               ZeFeD e       dw                      ZeFeD e       dx                      ZeFdy        ZeFdz        ZeF e,dMg       eGd:      d{                      ZeFd|        ZeFd}        Z e,dMg      eFd~               ZeFd        ZeFd        ZeFeDd               ZeFeD eGd      d                      ZeFeDd               ZeFeDd               ZeFeDd               ZeFeDd               ZeFeDd               ZeFd        ZeFeDd               ZeF eId      d               ZeF eId      d               ZeFeDd               ZeFd        Z ej~                  d      rddlZmZmZ eFd        ZeFd        ZeFeDd               ZeF eū       d               ZeF eū       eDd                      ZeF eū       eDdd                     ZeF eū       eD eHded      d                             ZeF eū       eD eGd      d                             ZeF eū       eD eGd      d                             ZeF eū       eDd                      ZeF eū       eDd                      ZeF eū       eDd                      Z ej~                  d      rd ZeF eId      d               ZeFd        ZeFd        ZeFd        ZeFd        Zy)z

views.py
    N)defaultdict)datedatetime	timedelta)BytesIO)parse_qsunquote)apps)messages)	Paginator)transaction)ProtectedErrorQ)HttpResponseJsonResponse)get_object_or_404redirectrender)reverse	force_str)gettext)gettext_lazy)require_http_methods)pisa)PenaltyFilter)PenaltyAccountForm)	choosesubordinatesclosest_numberseval_validateexport_datafiltersubordinatesget_key_instancesget_paginationis_reportingmanagersortby)CompanyLeavesHolidaysPenaltyAccounts)Employee)hx_request_requiredloggerlogin_requiredmanager_can_enterowner_can_enterpermission_required)group_by_queryset)DYNAMIC_URL_PATTERNS)get_horilla_model_classremove_dynamic_url)*)attendance_dayscalculate_requested_dayscompany_leave_dates_list filter_conditional_leave_requestholiday_dates_list)leave_requested_dates)LeaveMailSendThread)notifyc                 n   | D ]D  }|j                         D ]/  \  }}||v r|j                  ||          |j                  d       1 F |j                         D cg c]  \  }}t        d |D              s| }}}|D ]  }||=  t        j                  ||j                               }|j                  j                  d t        j                  ddddf         }t        d      d| d	d
<   t        j                  d      }	|j                  |	dd       |	j                  d   }
|
j                  dd       |	j                          fd}ddlm}m} dt$        j'                          |j                   ||             t)        j                         d S c c}}w )zG
    Function used to generate error excle file for imported datas
    Nc              3   $   K   | ]  }|d u  
 y wN ).0vs     //var/www/python-projects/worksol/leave/views.py	<genexpr>z(generate_error_report.<locals>.<genexpr>Q   s     7QaT	7Qs   columnsc                      y)Nztext-align: centerrA   xs    rD   <lambda>z'generate_error_report.<locals>.<lambda>W   s        )subsetapplication/ms-excelcontent_typezattachment; filename=""Content-Disposition
xlsxwriter)engineFSheet1)index
sheet_namezA:Z   c                     t               S r@   )r4   )request	path_inforesponses    rD   get_error_sheetz.generate_error_report.<locals>.get_error_sheeta   s    9%rL   r   )pathurlpatternszerror-sheet-)namezleave/)itemsappendallpd	DataFramekeysstyleapplymap
IndexSlicer   ExcelWriterto_excelsheets
set_columnclose
leave.urlsr^   r_   uuiduuid4r2   )
error_list
error_data	file_nameitemkeyvaluekeys_to_remove
data_framestyled_data_framewriter	worksheetr]   r^   r_   r[   r\   s                 @@rD   generate_error_reportr}   F   s     #$**, 	#JCd{T#Y'T"		## )..0UC7Q57Q4QN   sOj*//2CDJ"((11&r}}QT/B 2  )?@H(>yk&KH"#^^H\:FvUxHh'I#
LLN -tzz|n-ItIYGH	*$I7s   F1:F1zleave.add_leavetypec                 8   t               }| j                  dk(  rst        | j                  | j                        }|j	                         rC|j                          t        j                  | t        d             t        t        d            S t        | dd|i      S )z
    function used to create leave type.

    Parameters:
    request (HttpRequest): The HTTP request object.

    Returns:
    GET : return leave type creation template
    POST : return leave view
    POSTzNew leave type Created..	type-viewz)leave/leave_type/leave_type_creation.htmlform)LeaveTypeFormmethodr   FILESis_validsaver   success_r   r   r   )rZ   r   s     rD   leave_type_creationr   n   sx     ?D~~W\\7==9==?IIKWa(B&CDGK011'FQUWWrL   c                 P    t        | t                     }|j                  |      } | S )z-
    function used to paginate query set
    )r   r$   get_page)qrysetpage_number	paginators      rD   paginator_qryr      s(     &."23I,FMrL   zleave.view_leavetypec           	      |   t         j                  j                         j                  d      }t        j                  j                         rFt        j                  j                         j                  rt         j                  j                         }| j                  j                  d      }t        ||      }| j                  j                         }t               }t        j                  t        |j                  dd                  }|j!                         sd}nd}t#        | |||j$                  ||d      S )	z
    function used to view leave type.

    Parameters:
    request (HttpRequest): The HTTP request object.

    Returns:
    GET : return leave type template
    T)is_compensatory_leavepageidflatz+leave/leave_type/leave_type_empty_view.htmlz%leave/leave_type/leave_type_view.html)leave_typesr   rd   requests_ids)	LeaveTypeobjectsrc   excludeLeaveGeneralSettingfirstcompensatory_leaveGETgetr   	urlencodeLeaveTypeFilterjsondumpslistvalues_listexistsr   r   )rZ   querysetr   page_objprevious_dataleave_type_filterr   template_names           rD   leave_type_viewr      s       $$&..T.JH##))+''--/BB$$((*++//&)KX{3HKK))+M')::d8#7#74#7#HIJL??E?#%**(		
	 	rL   c                 &   t         j                  |      }| j                  j                  d      }| j                  j                  d      }||d}|r3t	        j
                  |      }t        ||      \  }}||d<   ||d<   ||d<   t        | d|      S )z
    function used to view one leave type.

    Parameters:
    request (HttpRequest): The HTTP request object.

    Returns:
    GET : return one leave type view template
    instances_idscompensatory)
leave_typer   previousnextr   z0leave/leave_type/leave_type_individual_view.html)r   findr   r   r   loadsr   r   )	rZ   r   r   requests_ids_jsonr   contextr   previous_idnext_ids	            rD   leave_type_individual_viewr      s     #J8;;??>2L'FGzz"34.|R@W)
!"3'MwWWrL   c           	         t         j                  j                         }| j                  j	                  d      }t        | j                  |      j                  }t        ||      }| j                  j                         }t        j                  t        |j                  dd                  }t        |      }t        t         |       t        | d||||d      S )z
    function used to filter view leave type.

    Parameters:
    request (HttpRequest): The HTTP request object.

    Returns:
    GET : return leave types template
    r   r   Tr   z!leave/leave_type/leave_types.html)r   rd   filter_dictr   )r   r   rc   r   r   r   qsr   r   r   r   r   r   r   r#   r   )rZ   r   r   r   r   r   r   	data_dicts           rD   r   r      s       $$&H++//&)K'X>AA.<HKK))+M::d#4#@#@D#@#QRSL'Ii++#$(		
	 	rL   zleave.change_leavetypec                 r   	 t         j                  j                  |      }t        |      }| j                  j                  d      }t        d      }|rt        }| j                  dk(  rlt        | j                   | j"                  |      }|j%                         r:|j'                          t        j(                  | t        d             t        |      S t+        | d||d	      S # t         j                  t        t
        f$ r1 t        j                  | t        d             t        t              cY S w xY w)
z
    function used to update leave type.

    request (HttpRequest): The HTTP request object.
    id : leave type id

    Returns:
    GET : return leave type update template
    POST : return leave type view
    r   zLeave type not foundinstancer   r   r   z$Leave type is updated successfully..z'leave/leave_type/leave_type_update.html)r   r   )r   r   r   DoesNotExistOverflowError
ValueErrorr   errorr   r   r   UpdateLeaveTypeFormr   r    compensatory_leave_settings_viewr   r   r   r   r   r   r   )rZ   r   kwargsr   r   r   redirect_url	form_datas           rD   leave_type_updater      s   )&&**b*1
 
3D;;??>2L;'L7~~'LL'--*
	 NNWa(N&OPL))1|4 ! ""M:> )w"8 9:(()s    C' 'AD65D6zleave.delete_leavetypec           	      6   	 t         j                  j                  |      j                          t	        j
                  | t        d             | j(                  j                  d      dk(  r| j(                  j                  d	      d
k(  rx| j*                  j                  d      }t-        j.                  |      }||v r|j1                  |       t3        t-        j.                  |      |      \  }}	t5        d|	 d|       S t5        d| j*                  j7                                S t5        t9        d            S # t         j                  t        t        f$ r# t	        j                  | t        d             Y .t        $ r}t               }|j                  D ]0  }|j                  t        |j                   j"                               2 dj%                  |      }t	        j                  | t        dj'                  |                   Y d}~d}~ww xY w)z
    function used to delete leave type.

    Parameters:
    request (HttpRequest): The HTTP request object.
    id : leave type id

    Returns:
    GET : return leave type view template
    r   z!Leave type deleted successfully..Leave type not found.,z*This leave types are already in use for {}NHTTP_HX_REQUESTtrueHTTP_HX_TARGETobjectDetailsModalTargetr   z"/leave/leave-type-individual-view/z?instances_ids=z/leave/type-filter?r   )r   r   r   deleter   r   r   r   r   r   r   r   setprotected_objectsadd___metaverbose_namejoinformatMETAr   r   r   remover   r   r   r   )
rZ   obj_idemodels_verbose_name_setsobjmodels_verbose_name_strr   instances_listprevious_instancenext_instances
             rD   leave_type_deleter     s   
(//1!$G"HI  ||)*f4<<,-1KK#KKOOO<M!ZZ6N'%%f-/>

=)60,} 4]O?SaRbc  -gkk.C.C.E-FGHHGK())9 ""M:> <w"9 :; 
#&5 && 	EC$((CII,B,B)CD	E#&**-E"F<CC+	
 	

s   AD= ==H=HBHHleave.add_leaverequestc                 H   | j                   j                  d      }| j                   j                  d      r(| j                   j                  d      dk(  r
t               n	t               }|rat	        t
        |      }t        j                  j                  |j                  j                  dd            }||j                  d   _        n0t        j                  j                         |j                  d   _        t        d	|d|j                  d   d
      }t        |      S )Nemployee_idr   LeaveRequestUpdationFormr   leave_type_idTr   id__inz)leave/leave_request/leave_type_field.html)r   
field_namefield)r   r   r   LeaveRequestCreationFormr   r*   r   r   filteravailable_leaver   fieldsr   nonerender_to_stringr   )rZ   r   r   employeeassigned_leave_typesleave_type_field_htmls         rD   get_employee_leave_typesr   F  s     ++//-0K ;;??6"KKOOF#'AA 	!" &'	 	 $X+>(0077++77d7S  8  
 1EO$-090A0A0F0F0HO$-,3)[[1	
 -..rL   c                 H   t         j                  j                  |       }|j                  d      j                  d      }|j                  d      j                  d      }g }|D ]  }|j	                  |j
                          |j                         r	||||d}|S d}|S )Nleave_request_idFis_approvedsequenceT)managersapproved	requested	approvals)LeaveRequestConditionApprovalr   r   order_byrb   
manager_idr   )r   r  requested_queryapproved_queryr   managerresults          rD   multiple_approvals_checkr  f  s    -55<<b<QI&&5&9BB:NO%%$%7@@LNH ,**+, &("	
 M MrL   c                    | j                   j                  d      j                  d      D cg c]
  }|dk7  s	| }}| j                  j	                         j                  d      r0t        | j                  j	                               t        d      d }n?| j                  j                         }d|v r|j                  d       |j	                         }t               }| r|j                  d   j                  }| j                  j                  d      }	|j                  |	      j                         xs> | j                   j"                  |v r| j                   j"                  n|j                         }
|
rQ|
j$                  j'                  d	d
      }t(        j*                  j                  |      }||j                  d	   _        |r|r||d}t        |      }t-        | |d      }| j.                  dk(  rt        | j                  | j0                        }|j                  d	   _        t-        | |d      }|j3                         r|j5                  d      }d
}|j6                  j8                  dk(  r |j:                  }|j6                  }t<        j*                  j                  ||      }| j                   j"                  |_        |j5                          |j@                  |jB                  kD  rM|j@                  |jB                  z
  }|jB                  |_"        d|_!        |jF                  |z
  |_#        ||_$        n/|jB                  |j@                  z
  |_!        |j@                  |_"        d|_%        |r&| j                   j"                  |_        |j5                          	 j5                          tM        |jN                        rtM        |jN                        }g }|d   D ]  }|jQ                  |jR                          tU        jV                  tX              5  t[        j\                  | j                   j"                  |d   ddddddd|jN                   	       ddd       t_        | |d       }|ja                          tc        jd                  | tg        d!             tU        jV                  tX              5  t[        j\                  | j                   j"                  |j:                  jh                  jj                  jR                  d"|j:                   d#d$|j:                   d#d%|j:                   d#d&|j:                   d#d'|j:                   d#dtm        d(      d)|jN                   z   	       ddd       t               }|d*   d+k(  rto        d,      S tp        j*                  js                         }t        |      d-k(  rto        d.      S | j                   j                  dd      }ddju                  |j                  d      d/d       z   }|dk(  rtm        d0      }d1}nd2}d3}tw        | d4||||d5      S c c}w #  Y xY w# 1 sw Y   xY w# 1 sw Y   xY w)6z
    function used to create leave request.

    Parameters:
    request (HttpRequest): The HTTP request object.

    Returns:
    GET : return leave request form template
    POST : return leave request view
    HTTP_REFERER/ pd=Nconfirmr   r   r   Tr   r   r   r   initialr   r   Fcommitnor   r  r   )You have a new leave request to validate.?   لديك طلب إجازة جديد يجب التحقق منه.3Sie haben eine neue Urlaubsanfrage zur Validierung.6Tiene una nueva solicitud de permiso que debe validar.4   Vous avez une nouvelle demande de congé à valider.people-circle/leave/request-view?id=	recipientverbverb_arverb_deverb_esverb_friconr   rZ   type$Leave request created successfully..New leave request created for .0   تم إنشاء طلب إجازة جديد لـ u"   Neuer Urlaubsantrag erstellt für 'Nueva solicitud de permiso creada para (   Nouvelle demande de congé créée pour request-view?id=zemployee-view*<script>window.location.reload();</script>   )<script>window.location.reload()</script>   zleave-request-and-approvez#leaveApproveCardBody/leave/request-filter?z#leaveRequestz+leave/leave_request/leave_request_form.html)r   rd   hx_url	hx_target)<r   r   splitr   r   
startswithr	   lencopypopr   r   r   r   r   r   useremployee_getr   r   r   r   r   r   r   r   r   r   require_approvalr   AvailableLeave
created_byrequested_daysavailable_daysapproved_available_dayscarryforward_daysapproved_carryforward_daysstatusr  r   rb   employee_user_id
contextlibsuppress	Exceptionr=   sendr<   startr   r   r   employee_work_inforeporting_manager_idr   r   LeaveRequestrc   r   r   )rZ   type_idemp_idpartreferer_partsr   request_copyr   employee_qspost_emp_idr   leave_type_idsr   initial_dataleave_requestr   r   r   r   leaveconditional_requestsr   r	  mail_threadleave_requestsreferrerr7  r8  s                               rD   leave_request_creationra  y  s    !)).9??DPR
M  {{))%0 5 5 78UF{{'')$Y'$..0#%Dkk-099ll&&}5%%%5;;= 
||((K7 LL%%""$ 	 %55AAd B N $-#4#4#;#;>#;#R 4HDKK(16$!
 (=gt-EFD~~'gmmD0DO$-!'41IJ==? IIUI3MD**;;tC+77 - ; ;"0"8"8"<"<"/[ #= # ,3<<+D+D(""$ ///2P2PP%447U7UU  (66 "9 67O2'99EA $5 @EM< (669U9UU $2 =J<X<XM9'1$+2<<+D+D(""$#((* ,M,<,<=+CMDTDT+U(!H#7
#C B (@(@AB#,,Y7 #LL55&.qk!L$e$Y$\$Z!0'>}?O?O>P%Q
 2] !!#  !,R*ST((3 KK11"/";";"N"N"c"c"t"t=m>W>W=XXYZ"RS`SlSlRmmn o"D]E^E^D__` a"I-JcJcIdde f"J=KdKdJeef g,!(!8T-BRBRAS;T!T
 01 $7'(TUU)11557N>"a'#$OPP||3HSXXhnnS1!"566H345+	)#	5"		
	 	EZ $ s0   
YY*Y $AYB:Y YY Y)leave.view_leaverequestc                    t        | j                        j                  j                  d      j	                         }t        |       j	                         }t        | |d      }| j                  j                  st        j                  j                  dd      }|D  cg c]  } | j                  j                   }} |D cg c]  }|j                  |vs|j                   }}t        j                  j                  |      j	                         }||z  } j                  j                  d      }t!        ||      }t               }	|}
g }t#        j$                  d      re|
D ]`  }t'        dd	      }|j                  j                  |j(                  |j*                  |j,                  g
      }|sP|j/                  |       b |j                  d      j1                         }t3        j4                  t7        |j8                  j;                  dd                  }|j                  d      j1                         }|j                  d      j1                         }| j                  j=                         }t?        |      }tA        t        |       tC        | d|||	jD                  |||tF        jH                  |tK        jL                         ||d      S c c} w c c}w )z
    function used to view leave request.

    Parameters:
    request (HttpRequest): The HTTP request object.

    Returns:
    GET : return leave request view template
    -idrb  Fr   is_rejectedr   r   recruitmentinterviewschedule	app_labelmodelr   interview_date__ranger  rH  r   Tr   r  	cancelledz%leave/leave_request/request_view.html)r_  rd   r   requestsapproved_requestsrejected_requests	gp_fieldsr   current_dater   leave_requests_with_interview)'LeaveRequestFilterr   r   r  distinctr9   r"   r>  is_superuserr  r   r   r   r   rQ  r   r   r
   is_installedr3   r   
start_dateend_daterb   countr   r   r   object_listr   r   r   r#   r   r   LeaveRequestReGroupr   r   today)rZ   r   multiple_approvalsnormal_requestsmulti_approve_requests	multi_idsr\  r   r   leave_request_filterr_  ru  r[  InterviewSchedule
interviewsrp  r   rq  rr  r   r   s                        rD   leave_request_viewr    s    "'++.11::5AJJLH9'BKKM((<UVO<<$$!>!F!F!M!M5 "N "
 AWWWW--00W	W #2
UXXY5NEHH
 

 '..55_5MVVX!33H++//&)KX{3H-/ N$&!'+ 	DM !8'/B! +2299)55!,,!**' : J -44]C!	D$ k288:H::d8#7#7#C#CDt#C#TUVL z:@@B {;AACKK))+M'IlI./&(-- !2!2,33( JJL$-J	
 [ X
s   KKKc                     | j                   j                  d      dk(  r1t               }t               }||j                  d}t        | d|      S t        | t        t        t        dd      S )	Nr   r   )excel_columnexport_filterz5leave/leave_request/leave_requests_export_filter.htmlr   Leave_requestsrb  rZ   rk  filter_class
form_classrt   perm)r   r   LeaveRequestExportFormrv  r   r   r!   rQ  )rZ   r  r  r   s       rD   leave_requests_exportr  j  sx     ||)*f4-/*,(*//

 C
 	

 ')"& rL   c                    	 t        | |      }|rt        |      S t               }t        j                  ||      }|j
                  r"t        j                  d       t        dd      S t        |j                         d      }d|d	<   |S # t        $ r8}t        j                  d       t        d
t        |       d      cY d}~S d}~ww xY w)ae  
    Generate a PDF file from an HTML template and context data.

    Args:
        template_path (str): The path to the HTML template.
        context (dict): The context data to render the template.
        html (bool): If True, return raw HTML instead of a PDF.

    Returns:
        HttpResponse: A response with the generated PDF file or raw HTML.
    )srcdestzError creating PDFzError generating PDFi  rn  zapplication/pdfrO   z$inline; filename="leave_request.pdf"rR   zError generating PDF: N)r   r   r   r   	CreatePDFerrr,   r   getvaluerL  	exceptionstr)template_pathr   htmlhtml_contentr
  
pdf_statusr\   r   s           rD   generate_leave_request_pdfr    s    K'w?--^^6B
>>LL-. 6sCC 1@QR*P&' K/04SVH=cJJKs)   B AB *!B 	C-CCCc           	         i }| j                   j                  d      }|dk(  s|st        j                  j	                         }n.t        j                  j                  |      j                         }t        j                  j                  d      j                  dd      }t        t              }t        t              }|D ]{  }|j                  j                  |j                  r|j                  j                  ndf}||xx   |j                  z  cc<   ||j                  j                     j!                  |       } t"        j                  j	                         }	|	D ]  }
|
j                  }|
d	d	d	|j                  |g       t%               d
d}|
j&                  rA|
j&                  j(                  }|r)t+        j,                         |z
  t/        d      k  rd|d<   t0        j                  j                  |
j2                  j5                  dd            }|D ]h  }|j                  }||d   v r|d   j7                  |       |j8                  xs d	}|dxx   |z  cc<   |j                  ||fd	      }|dxx   |z  cc<   j |d   |d   z
  |d<   t;        |d   d d      }t=        d      D ][  }|t?        |      k  r3||   j@                  |d|dz    d<   ||   jB                  |d|dz    d<   Dd|d|dz    d<   d|d|dz    d<   ] |||<    t        |jE                               }|jG                  d         ||t+        j,                         | d!}d"}tI        ||d
#      S )$z
    Generate a Leave Report as a PDF and return it in an HttpResponse.

    Args:
        request (HttpRequest): The request object.

    Returns:
        HttpResponse: A response containing the PDF content.
    selected_companyrc   r   r  rn  r   r   Nr   F)r   total_leave_daysused_leave_daysremaining_leave_daysr_  leave_types_countednew_hireim  daysTr  r   r   r  r  r  r  r_  c                 H    | j                   | j                  z
  j                  S r@   )r{  rz  r  rI   s    rD   rK   z%create_leave_report.<locals>.<lambda>  s    1::4:: rL   )rv   r   r5  periodr3  _start_endr  c                 (    | d   j                         S )Nr   )get_full_namerI   s    rD   rK   z%create_leave_report.<locals>.<lambda>   s    1Z=+F+F+H rL   )rv   )employee_datacompany_datareport_creation_daterZ   z*leave/leave_request/leave_request_pdf.html)r   r  )%sessionr   Companyr   rc   r   r   rQ  select_relatedr   floatr   r   r   r   rC  rb   r*   r   rO  date_joiningr   r  r   r   r   r   r   
total_dayssortedranger;  rz  r{  valuessortr  )rZ   r  
company_idcompanyr_  used_days_mapleave_request_maplreqrv   	employeesr   r   emp_data	hire_dater   r   r   r  	used_dayssorted_reqsifinal_employee_datar   r  s                           rD   create_leave_reportr    s    M$$%78JU*//%%'//((J(7==?!))00
0CRRN  &M#D) <%)%7%7D!!T
 	cd111$**--.55d;<   $$&I 4.kk  ! $%/33KD#&5
 && 33@@IdjjlY69#;NN'+$(0077++77d7S  8  
 / 	5J&MMM)> ??*+//>#..3!J'(J6(%));*FJI&'94'	5 '(84E+FF 	'( %&:

 q 	2A3{##1<Q1J1J6!A#f-./:1~/F/F6!A#d+,136!A#f-./16!A#d+,	2 &.k"i4.l }3356!HI - $

	G AM%mW5QQrL   c                    | j                   j                         }t        | j                         j                  j	                  d      }|}g }t        j                  d      re|D ]`  }t        dd      }|j                  j                  |j                  |j                  |j                  g      }|sP|j                  |       b | j                   j                  d      }t        |       }	t!        | |d      }| j"                  j$                  st&        j                  j                  dd	      }
|
D  cg c]  } | j(                  j*                   }} |D cg c]  }|j*                  |vs|j*                   }}t,        j                  j                  |
      }|j/                         }|	j/                         }	||	z  }t         j                   |      j                  }| j                   j                  d      }d}| j                   j                  d      rt1        | |d      }|dk7  r|t3        ||| j                   j                  d      d      }|D cg c]  }|d   	 }}g }|D ].  }|j4                  D ]  }|j                  |j*                          0 t7        j8                  t;        |            }d}n\t=        || j                   j                  d            }t7        j8                  |j4                  D cg c]  }|j*                   c}      }g }| j                   j                  d      st?        |      }tA        t,        |       d|v r|d   }tC        |      dkD  r	|d   g|d<   tE        | |||||| j                   j                  d      |tG        jH                         |d      S c c} w c c}w c c}w c c}w )z
    function used to filter leave request.

    Parameters:
    request (HttpRequest): The HTTP request object.

    Returns:
    GET : return leave request view template
    rd  rg  rh  ri  rl  r   rb  Fre  r   r   )z'leave/leave_request/leave_requests.htmlr&   r  r   z!leave/leave_request/group_by.html	dashboardrH  r3  )r_  rd   r   r   r  r   rt  ru  )%r   r   rv  r   r  r
   ry  r3   r   r   r   rz  r{  rb   r   r9   r"   r>  rx  r  r   r   rQ  rw  r&   r1   r}  r   r   r   r   r   r#   r;  r   r   r  )rZ   r   r   r_  ru  r[  r  r  r   r  r  r  r\  r  r   templateentrylist_valuesid_listrw   r   r   r   status_lists                           rD   r  r    s    KK))+M!'++.11::5AH N$&!'+ 	DM !8'/B! +2299)55!,,!**' : J -44]C!	D$ KKOOG$E9'B!'85NOH<<$$!>!F!F!M!M5 "N "
 AWWWW--00W	W +3Pehhi6OEHHPP  ''..h.?  "H+446,,H-gkk8DGG++//&)K;H{{x %g/CXN{u(0 %)@& 
 3GGuV}GG  	,E!-- ,x{{+,	, zz$w-06  - '++//&"9 
 zz)=)I)IJXX[[J
 I;;??;']+	,	29){a#.r?"3Ih2$ 5( JJL-J		
 c X Q& H Ks   5N1N6,N6N;>O leave.change_leaverequestc                    t         j                  j                  |      }| j                  dk(  rt	        | j
                  | j                  |      }t        | |d      }|j                         rq|j                  d      }d}|rZ|j                          t        j                  | t        d             t        j                  t              5  t!        j"                  | j$                  j&                  |j(                  j*                  j,                  j.                  d	|j(                   d
d|j(                   d
d|j(                   d
d|j(                   d
d|j(                   d
dt1        d      d|j2                   z   	       ddd       t5        | d||d      }t7        |j8                  j;                  d      dz         S t	        |      }t        | |d      }t5        | d||d      S # 1 sw Y   ixY w)z0
    function used to update leave request.
    r   r   r   r   Fr  Tz'Leave request is updated successfully..zLeave request updated for r+  u+   تم تحديث طلب الإجازة لـ u    Urlaubsantrag aktualisiert für z&Solicitud de permiso actualizada para u$   Demande de congé mise à jour pour r  r/  r0  r  Nz,leave/leave_request/request_update_form.htmlr   r   utf-8#<script>location.reload();</script>)rQ  r   r   r   r   r   r   r   r   r   r   r   r   rJ  rK  rL  r=   rM  r>  r?  r   rO  rP  rI  r   r   r   r   contentdecode)rZ   r   r[  r   r   r\   s         rD   leave_request_updater  ~  s    !((,,,3M~~'LL'---
 "'41IJ==? IIUI3MD""$  !,U*VW((3 KK11"/";";"N"N"c"c"t"t9-:S:S9TTUV"MmNgNgMhhi j"B=C\C\B]]^ _"HIbIbHccd e"F}G`G`Faab c,!(!8T-BRBRAS;T!T
 "B!,
 $$$++G4;< 
 (?!'41IJ6	
 3 s   B:G22G;zleave.delete_leaverequestc                    | j                   j                         }	 t        j                  j	                  |      }t        j                  | t        d             |j                          | j                  j	                  dd      }|dk(  rGt        j                  j                         }|j!                         rt#        d|       S t%        d	      S t#        t'        d
            S # t        j                  t        t        f$ r" t        j                  | t        d             Y t        $ r" t        j                  | t        d             Y w xY w)z
    function used to delete leave request.

    Parameters:
    request (HttpRequest): The HTTP request object.
    id : leave request id

    Returns:
    GET : return leave request view template
    r   $Leave request deleted successfully..Leave request not found.Related entries existsr   NleaveRequestr6  r2  request-filter)r   r   rQ  r   r   r   r   r   r   r   r   r   r   r   r   rc   r   r   r   r   )rZ   r   r   r[  r8  r_  s         rD   leave_request_deleter    s    KK))+M=$,,00B07!$J"KL
   !148IN"%--113  "4]ODEE LMMG,-.. %%}jA ?w"< => =w": ;<=s   AC' '=E&'EEc                 	    t         j                  j                  |      }|j                  } j                  j
                  sp| j                  j                  k(  rWt        j                   t        d             ||}t        d| d      S t         j                  j                  dd            S |j                  }t        j                  j                  ||      }|j                  |j                   z   }d}|j"                  d	k7  ro||j$                  k\  rE|j$                  |j                   kD  rM|j$                  |j                   z
  }	|j                   |_        d
|_        |j                  |	z
  |_        |	|_        n1|j                   }
|
|j$                  z
  |_        |j$                  |_        d	|_        |j+                         s$|j-                          |j-                          d}n j                  j
                  rTt.        j                  j1                  |      j3                  d       |j-                          |j-                          d}nH|j+                         }t5         fd|d   D        d      }t.        j                  j1                  ||      j7                         }d|_        g }|d   D ]  }|j;                  |j<                          t?        |      |j@                  kD  rntC        jD                  tF              5  tI        jJ                   j                  j                  ||j@                     ddddddd|jL                   	       ddd       |j-                          ||d   d   k(  r"|j-                          |j-                          d}t        jN                   t        d             |rtC        jD                  tF              5  tI        jJ                   j                  j                  |j                  j<                  ddddddtQ        d       d!|jL                   z   	       ddd       tS         |d"#      }|jU                          n9t        j                   | d$       nt        j                   t        d%             ||}t        d| d      S t         j                  j                  dd            S # 1 sw Y   yxY w# 1 sw Y   xY w)&a  
    function used to approve a leave request.

    Parameters:
    request (HttpRequest): The HTTP request object.
    id : leave request id
    emp_id : employee id if the approval operation comes from "/employee/employee-view/{employee_id}/" template.


    Returns:
    GET : If `emp_id` is provided, it returns to the "/employee/employee-view/{employee_id}/" template after approval.
          Otherwise, it returns to the default leave request view template.
    r   z*You cannot approve your own leave request.N/employee/employee-view/r  r  r  Fr  r   Tr   r   c              3   T   K   | ]  }|j                   j                  k(  r| ! y wr@   )r>  r?  )rB   r	  rZ   s     rD   rE   z(leave_request_approve.<locals>.<genexpr>  s+       '&',,*C*CC $s   %(r   r  r   r  r  r  r  r  r  r  r  r  z%Leave request approved successfully..z$Your Leave request has been approveduD   تمت الموافقة على طلب الإجازة الخاص بكz!Ihr Urlaubsantrag wurde genehmigtz&Se ha aprobado su solicitud de permisou*   Votre demande de congé a été approuvéeuser-request-viewr0  approver'  z5 dont have enough leave days to approve the request..zLeave request already approved)+rQ  r   r   r   r>  rx  r?  r   r   r   r   HttpResponseRedirectr   r   rA  rD  rF  rH  rC  rG  rE  r  r   r  r   updater   r   r   rb   rI  r;  r   rJ  rK  rL  r=   rM  r   r   r   r<   rN  )rZ   r   rS  r[  r   r   r   total_available_leavesend_notificationr\  tempr]  approvercondition_approvalr   r	  r^  s   `                rD   leave_request_approver    s     !((,,,3M++K<<$$',,333NN7A&R$ST!$":;-q IJJ'(8(8(MNN!//M$,,00# 1 O 	&&)J)JJ  z) M$@$@@++o.O.OO%447X7XX#55 8 5611@1O1ORW1W.8=5&8848=;W;W4W1;H;W;W8#-M  335""$$$&$(!<<,,199@@)6 A ff.!&&(#((*(,%+8+K+K+M(#+?
+K
  H *G)N)N)U)U#+m *V *eg ' 6:&2!H#7
#C B (@(@AB8}'9'B'BB'00; "KK ' 9 9*23E3N3N*O%P(i(](`(^%4+B=CSCSBT)U
 '++-#7
#CB#GG%**,',,.,0)Wa(O&PQ ((3 KK11"/";";"L"LC f C H L,!()<!= !1!1 23"4 2] !!#NN-TU
 	w"B CD2;-qABB 0 0 EFFa ( s   ASA SSS(c                 V   | j                   dk(  rK| j                  j                  d      }g }|D ]`  }t        j                  j                  t        |            }|j                  | j                  j                  k7  sP|j                  |       b | j                  j                  r|}|D ]  }	 |r)t        j                  j                  t        |            nd }|j                  dk(  rb|j                  t        j                         j!                         k\  s| j                  j#                  d      rt%        | |j&                         n	|j                  dk(  rDt)        j*                  | t-        d      j/                  |j                  |j0                               n|j                  t        j                         j!                         k  rDt)        j2                  | t-        d      j/                  |j                  |j0                               nCt)        j2                  | t-        d	      j/                  |j                  |j0                                t=        d      S # t4        t6        t        j8                  f$ r# t)        j:                  | t-        d
             Y w xY w)Nr   idsr   r  r  r  z{} {} request already approvedz{} {} request date exceededz{} {} can't approve.zLeave request not foundr2  )r   r   getlistrQ  r   r   intr   r>  r?  rb   rx  rH  rz  r   r  r   has_permr  r   r   infor   r   r   warningr   r   r   r   r   )rZ   request_idsfiltered_ids
request_idr[  s        rD   leave_request_bulk_approver  W  s.    ~~ll**51% 	0J(0044J4HM((GLL,E,EE##J/		0
 <<$$&L& "	J!DNL((,,J,@TX  !'';6!,,0@0E0E0GG||,,-HI)'=3C3CD$++z9 #>?FF - 9 9=;V;V '11HNN4D4I4I4KK ((#;<CC - 9 9=;V;V !((#45<< - 9 9=;V;V5"	F DEE |/H/HI w*C(DEs   2F'I''=J('J(c                     | j                   j                  d      }|D ]E  }|r)t        j                  j	                  t        |            nd }t        | |j                         G t        d      S )Nr  r   r2  )	r   r  rQ  r   r   r  leave_request_cancelr   r   )rZ   r  r  r[  s       rD   leave_bulk_rejectr    sk     ,,&&}5K! 8
<FL  $$J$8D 	 	Wm&6&67	8 DEErL   c                    t               }| j                  dk(  rt        | j                        }|j                         rt        j
                  j                  |      }|j                  }|j                  }t        j
                  j                  ||      }|j                  dk7  rK|xj                  |j                  z  c_        |xj                  |j                  z  c_        d|_        d|_        d|_
        d|_        |j!                         r| j"                  j$                  s|j!                         }|d   D 	cg c]  }	|	j&                  | j"                  k(  r|	 }
}	t(        j
                  j+                  |
d   |      j-                         }d|_        d	|_        |j3                          |j4                  d
   |_        |j3                          |j3                          t9               }||_        | j"                  j<                  |_        |j6                  |_        |j3                          tA        jB                  | tE        d             tG        jH                  tJ              5  tM        jN                  | j"                  j<                  |j                  j&                  ddddddtQ        d      d|jR                   z   	       ddd       tU        | |d      }|jW                          ntA        jX                  | tE        d             ||}t[        d| d      S t]        d      S t_        | d||d      S c c}	w # 1 sw Y   zxY w)a  
    function used to Reject leave request.

    Parameters:
    request (HttpRequest): The HTTP request object.
    id : leave request id
    emp_id : employee id if the cancel operation comes from "/employee/employee-view/{employee_id}/" template.

    Returns:
    GET : If `emp_id` is provided, it returns to the "/employee/employee-view/{employee_id}/" template after cancel.
          Otherwise, it returns to the default leave request view template.

    r   r   r  rejectedr   r   r  FTreasonz%Leave request rejected successfully..z%Your leave request has been rejected.u1   تم رفض طلب الإجازة الخاص بكz!Ihr Urlaubsantrag wurde abgelehntz)Tu solicitud de permiso ha sido rechazadau(   Votre demande de congé a été rejetéer  r  r0  r  Nrejectr'  zLeave request already rejected.r  r  r  z$leave/leave_request/cancel_form.htmlr  )0
RejectFormr   r   r   rQ  r   r   r   r   rA  rH  rD  rE  rF  rG  leave_clashes_countr  r>  rx  rI  r  r   r   r   rf  r   cleaned_datareject_reasonLeaverequestCommentr  r?  commentr   r   r   rJ  rK  rL  r=   rM  r   r   r<   rN  r   r   r   r   )rZ   r   rS  r   r[  r   r   r   r]  r	  r  r  r  r^  s                 rD   r  r    s      <D~~',,'==?(00444;M'33K)77M,4488+ 9 O ##z1..-2W2WW.11!<<1 9:5;<8'1$451 335gll>W>W+8+K+K+M( (<J'G #"33w||C   H  
 *G)N)N)U)U#+A; *V *eg ' 6;&259&2&++-.2.?.?.I+""$$$&-/%2"&-ll&?&?#"/"="=  !,S*TU((3 KK11"/";";"L"LD S C K J,!()<!= !1!1 23"4 2'=xX!!#w*K(LM!$":;-q IJJ EFF7$b9Q [ , s   "M.A MMc                 D   t         j                  j                  |      }|j                  }|j                  j
                  | j                  j
                  k(  rt        j                         }|j                  dk(  r|j                  |k\  rt               }| j                  dk(  rt        | j                        }|j                         rs|j                  d   |_        d|_	        |j#                          t%        j&                  | t)        d             t+        | |d      }|j-                          t/        d	      S t1        | d
||d      S t%        j2                  | t)        d             t/        d	      S t%        j2                  | t)        d             t/        d	      S )z
    function used to cancel approved leave request by employee.

    Parameters:
    request (HttpRequest): The HTTP request object.
    id : leave request id

    Returns:
    GET :  it returns to the default my leave request view template.

    r   r  r   r  ro  z&Leave request cancelled successfully..cancelr'  r  z)leave/leave_request/user_cancel_form.htmlr  z$You can't cancel this leave request.zYou don't have the permission.)rQ  r   r   r   rI  r   r>  r   r  rH  r{  r   r   r   r   r  r  r   r   r   r   r<   rN  r   r   r   )rZ   r   r[  r   rt  r   r^  s          rD   user_leave_cancelr    s_    !((,,,3M++K##&&',,//9zz|  J.&&,6<D~~'!',,/==?262C2CH2MM/+6M(!&&($$#K!L #6X#K  %%''(MNN;R( 
 	w"H IJABBNN7A>?@=>>rL   c                 ^   t         j                  j                  |      }|t        j                         | j
                  j                  d      d}| j
                  j                  d      }|r3t        j                  |      }t        ||      \  }}||d<   ||d<   ||d<   t        | d|      S )	z
    function used to view one leave request.

    Parameters:
    request (HttpRequest): The HTTP request object.

    Returns:
    GET : return one leave request view template
    r   r  )r[  rt  r  r   r   r   r   z)leave/leave_request/one_request_view.html)
rQ  r   r   r   r  r   r   r   r   r   )rZ   r   r[  r   r   r   r   r   s           rD   one_request_viewr
  !  s     !((,,,3M&

[[__[1G
  8zz"34.|R@W)
!"3'FPPrL   leave.add_availableleavec                    t               }t        | |d      }t        j                  j	                  |      j                         }|s/t        j                  | t        d             t        | d||d      S | j                  dk(  r|j                  r/t        j                  | t        d             t        | d||d      S t        t        t        | j                   j#                  d                  }t%        t&        j                  j	                  ||	      j)                  dd
            }|j*                  r|j*                  nd}t        t%        |      |z
        }d}|rg }	|D ]  }
t'        ||
|j,                        }|j.                  .|j0                  r"|j3                  |j4                  |      |_        |j6                  dk(  r|s|j4                  }||_        t;        |j<                  |j>                  z   d      |_         t;        |j>                  d      |_        |	jC                  |        t&        j                  jE                  |	       tG        |	      }t        jH                  | t        d      jK                  |             t               }tL        j                  j	                  |      jO                  dd      }|D cg c]G  }tQ        jR                  | jT                  jV                  |jX                  ddddddt[        d      	      I }}tG        |      |k7  r:t        j                  | t        d      jK                  tG        |      |z
               t        | d||d      S c c}w )a   
    Assigns leave types to employees.

    Parameters:
    request (HttpRequest): The HTTP request object.
    obj_id: ID of the leave type.

    Returns:
    GET: Renders the leave type assignment form template.
    POST: Processes and assigns the leave type to selected employees.
    r  r   r   z-leave/leave_assign/leave_assign_one_form.htmlr  r   z4Compensatory leave type cannot be assigned manually.r   )r   employee_id__inTr   Nr   )r   employee_id_idrD  )assigned_dater   carryforward expirez1Successfully assigned leave type to {} employees.r   r   rI  !New leave type is assigned to you/   تم تعيين نوع إجازة جديد لكz+Ihnen wurde ein neuer Urlaubstyp zugewiesenz*Se le ha asignado un nuevo tipo de permiso0   Un nouveau type de congé vous a été attribuér  r  r  z=Leave type is already assigned to some selected {} employees.).LeaveOneAssignFormr   r   r   r   r   r   r   r   r   r   r   r  r   mapr  r   r  r   rA  r   carryforward_expire_dater  
reset_dateresetset_reset_dater  carryforward_typeexpired_datemaxrD  rF  r  rb   bulk_creater;  r   r   r*   onlyr=   rM  r>  r?  rI  r   )rZ   r   r   r   employee_idsexisting_leaves_setexpiry_datenew_employeesassigned_countavailable_leavesr   r\  r  r   notificationss                  rD   leave_assign_oner&  ?  sb    Dgt-GHD ""))V)4::<Jw"9 :;;(
 	
 ~~++MMQR ?V,  CW\\%9%9-%HIJ!""))(, * k-dk3
 22 // 	
 S.1DDE!, /&",#.#-#8#8
 ##+!''+0+?+?*/*=*=u ,@ ,( //3HH&&+&9&9)4E&),((5+B+BBA*& +.e.E.Eq*I' ''.+/. ""../?@ !12NEFMM" &'D ((//}/EJJ(I !*  LL--&77<MIHN($%89
M  |.MMS&\*^;<	 7V$ /s   AM4leave.view_availableleavec                    t        | t        j                  j                         d      }| j                  j                         xs d}| j                  j                  dd      }| j                  j                  d      }t        |j                  d      ||      }t        j                  |D cg c]"  }|d   j                  D ]  }|j                   $ c}}      }| j                  j                         | _        d| j                  d<   t        | d	|t               |t!        |      t"        j$                  t'               |d
      S c c}}w )z
    Function to view assigned employee leaves.

    Parameters:
    request (HttpRequest): The HTTP request object.

    Returns:
    GET : return leave assigned view template
    r'  field=leave_type_idr   r   r   rd  r   Tz#leave/leave_assign/assign_view.html)r$  frd   r   rs  assign_formavailable_leave_ids)r"   rA  r   rc   r   r   r   r1   r  r   r   r}  r   r<  r   AssignedLeaveFilterr   LeaveAssignReGroupr   AssignLeaveForm)	rZ   r   r   r   r   r   r  r   r,  s	            rD   leave_assign_viewr0    s    "''++-/JH KK))+D/DMKKOOG_5E++//&)K !!2!25!95+NH**"*U5=;T;TUxUU
 ++""$GKGKK- ($&#M2+22*,#6	
  	Vs   /'E
c                    | j                   j                         }|j                  dd        |j                         }t        j
                  j                  |      j                         }t        j                  | j                   j                  dd            }|rt        ||      nd\  }}|||t        j                  |      |d}t        | d|      S )Nr   r   z[]NN)r   r   r   instance_ids_jsonrd   z*leave/leave_assign/single_assign_view.htmlr  )r   r<  r=  r   rA  r   r   r   r   r   r   r   r   r   )	rZ   r   get_datar   r   instance_idsr   r   r  s	            rD   available_leave_single_viewr6    s     {{!HLL$'&&(M$,,33v3>DDFO::gkkoootDEL1=f-< %}
 +.&!ZZ5G =w rL   c                 *   t         j                  j                         }t               }t	        | |d      }t        | j                  |      j                  }| j                  j                         }| j                  j                  d      }| j                  j                  d      }d}|j                  d      }| j                  j                  d      rDt        | |d      }t        j                  t        |d      D 	cg c]  }	|	j                   c}	      }
|dk7  rw|ut!        |||      }|D cg c]  }|d	   	 }}g }|D ].  }|j"                  D ]  }	|j%                  |	j                          0 t        j                  t'        |            }
d
}nCt        j                  t        |d      D 	cg c]  }	|	j                   c}	      }
t        ||      }t)        |      }t+        t         |       t-        | |||||||
d      S c c}	w c c}w c c}	w )z
    function used to filter assign leave type to employees.

    Parameters:
    request (HttpRequest): The HTTP request object.

    Returns:
    GET : return leave type assigned view template
    r'  r   r   )z&leave/leave_assign/assigned_leave.htmlrd  r&   Nr  r   z leave/leave_assign/group_by.html)r$  rd   r   r   r+  r,  )rA  r   rc   r/  r"   r-  r   r   r   r   r  r&   r   r   r   r   r1   r}  rb   r   r   r#   r   )rZ   r   r+  assigned_leave_filterr   r   r   r  r$  r   r,  r   r  r  r  rw   r   s                    rD   leave_assign_filterr9    s    %%))+H!#K!'85PQH/XFIIKK))+MKKOOG$E++//&)K:H,55e<{{x !'+;XF"jj)67G)NOXX[[O
 {u($%5ukJ2:;uV};;  	,E!-- ,x{{+,	, #jjg75"jj)67G)NOXX[[O
 !!1;?'Ini0 ($&#6	
 ' P < Ps   >H0H1Hc                    t               }t        | |d      }t        j                  j	                         dk(  }| j
                  dk(  rm| j                  j                  d      }| j                  j                  d      }|r'|r$t        j                  j                  |      }t        j                  j                  |      }t        t        j                  j                  ||      j                  dd            }g }t               }	t               }
|D ]  }|D ]  }|j                  |j                  f}||vrUt        |||j                        }|j                  |       |j!                          |	j#                  |j$                         t|
j#                  |j$                           |rt'        j(                         5  t        j                  j+                  |       |	D ]_  }t-        j.                  t0              5  t3        j4                  | j6                  j8                  |d	d
ddddt;        d      	       ddd       a t=        j>                  | tA        d             ddd       |
r7t=        jB                  | tA        d      jE                  tG        |
                   |rtI        d      S tK        | dd|i      S # 1 sw Y   xY w# 1 sw Y   jxY w)z
    Function to assign multiple leave types to employees.

    Parameters:
    request (HttpRequest): The HTTP request object.

    Returns:
    GET: Render the leave assign form template.
    POST: Handle the leave type assignment.
    r  r   r   r   r   r   )leave_type_id__inr  r   r   rD  r  r  z)Dir wurde ein neuer Urlaubstyp zugewiesenz*Se te ha asignado un nuevo tipo de permisor  r  r  r  Nz"Leave types assigned successfully.z7Some leave types were already assigned to {} employees.r4  z)leave/leave_assign/leave_assign_form.htmlr+  )&r/  r   rA  r   r|  r   r   r  r   r   r*   r   r   r   r  rb   pre_save_processingr   rI  r   atomicr  rJ  rK  rL  r=   rM  r>  r?  r   r   r   r   r  r   r;  r   r   )rZ   r   page_reloadrY  r  r   r  existing_assignmentsnew_assignmentssuccess_messagesinfo_messagesr   r   assignment_keynew_assignmentuser_ids                   rD   leave_assignrG  ;  s    Dgt-GHD ((..0A5K~~ --o>||++M:l#++22.2IK ((//|/DI#&&&--&4l . +o}=$  !O"uEM% E"- EJ&0mmX[[%AN%-AA)7*4(0+5+@+@*
 (..~>&::<(,,X-F-FG%))(*C*CDEE   '') W"**66G#3 '00; "KK ' 9 9*1%H(Y(S(T(Z%4)01D)E
  $$Wa0T.UVW" OPWWM*  KLL<}d>S 3 W Ws$   >K<K?)KK
KKzleave.change_availableleavec                 
   t         j                  j                  |      }t        |      }| j                  j                         xs d}| j                  dk(  rt        | j                  |      }|j                         r|j                         }t        j                  | t        d             t        j                  t              5  t!        j"                  | j$                  j&                  |j(                  j*                  d|j,                   dd|j,                   d	d
|j,                   dd|j,                   dd|j,                   ddt/        d      	       ddd       t1        | d|||d      S # 1 sw Y   xY w)a,  
    function used to update available leave of an assigned leave type of an employee.

    Parameters:
    request (HttpRequest): The HTTP request object.
    id : available leave id

    Returns:
    GET : return available leave update form template
    POST : return leave type assigned  view
    r   r   r)  r   z(Available leaves updated successfully...zYour z leave type updated.u&   تم تحديث نوع الإجازة u    الخاص بك.zIhr Urlaubstyp z wurde aktualisiert.z%Se ha actualizado su tipo de permiso r+  u   Votre type de congé u    a été mis à jour.r  r  r  Nz-leave/leave_assign/available_update_form.htmlr   r   rd   )rA  r   r   AvailableLeaveUpdateFormr   r   r   r   r   r   r   r   r   rJ  rK  rL  r=   rM  r>  r?  r   rI  r   r   r   )rZ   r   rG  r   r   r   s         rD   available_leave_updaterK    s_    "))---4L#\:DKK))+D/DM~~'|L==?"iikOWa(R&ST$$Y/ LL---99JJ !>!> ??STD_EbEbDcctu-o.K.K-LL`aCODaDaCbbcd3O4Q4Q3RRgh($%89
 7R}5  s   
BE99Fzleave.delete_availableleavec                     | j                   j                         }	 t        j                  j	                  |      j                          t        j                  | t        d             | j                   j	                  d      s4t        j                  j                         st        d      S t        d      S | j                   j	                  d      }t        j                   |      }t#        ||      \  }}||v r|j%                  |       t        d| d	| d
      S # t        j                  $ r" t        j                  | t        d             Y t        $ r# t        j                  | t        d             Y w xY w)a  
    Function to delete an assigned leave type of an employee.

    Parameters:
    - request (HttpRequest): The HTTP request object.
    - obj_id (int): Available leave ID.

    Returns:
    - Redirects to the assigned leave type view or refreshes the page.
    r   z$Assigned leave successfully deleted.Assigned leave not found.r  r   r4  z(/leave/assign-filter?field=leave_type_idz#/leave/available-leave-single-view/z/?instances_ids=&deleted=true)r   r   rA  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )rZ   r   rd   r   r   r   r   s          rD   leave_assign_deleterO    s@    
			 B=""f"-446!$J"KL
 ;;???+%%,,. KLLBCC8M2+:>6+R(=^#!!&)1-@PQ_P``mn
 	
 && @w"= >? =w": ;<=s   AD 2E='E=<E=r   c                    | j                   d   }t        j                  |      }d}|D ]8  }	 t        j                  j                  |      }|j                          |dz  }: t        j                  | t        d      j                  |             t        dd	i      S # t        $ r)}t        j                  | t        d             Y d}~d}~ww xY w)
z?
    This method is used to delete bulk of assigned leaves
    r  r   r   r3  rM  Nz({} assigned leaves deleted successfully messageSuccess)r   r   r   rA  r   r   r   rL  r   r   r   r   r   r   )rZ   r  r|  assigned_leave_idassigned_leaver   s         rD   leave_assign_bulk_deleterU    s     ,,u
C
**S/CE  D	D+3377;L7MN!!#QJE	D =>EEeL I.//  	DNN7A&A$BCC	Ds   5B	C(CCc                     	 g d}t        j                  |      }t        d      }d|d<   |j                  |d       |S # t        $ r}t        |      cY d	}~S d	}~ww xY w)
z
    Generate an empty Excel template for asisgn leave type to employee with predefined columns.

    Returns:
        HttpResponse: An HTTP response containing an empty Excel template with predefined columns.
    )Badge ID
Leave TypeAvailable DaysCarry Forward DaysrF   rN   rO   z3attachment; filename="assign_leave_type_excel.xlsx"rR   F)rV   N)rd   re   r   rk   rL  )_requestrG   ry   r\   r  s        rD   assign_leave_type_excelr\    sl    '
 \\'2
-CDA 	&' 	HE2 'I&&'s   ?A 	A 
AA A c           	         g g g g g g g g d}| j                   dk(  r| j                  d   }t        j                  |      }|j	                  d      }t
        j                  j                         D ci c]*  }|j                  s|j                  j                         |, }}t        j                  j                         D ci c]  }|j                  j                         | }}t        j                  j                         D 	ci c]/  }	|	j                  j                  |	j                  j                  f|	1 }
}	g }g }|D ]o  }t!        |j#                  dd            j%                         j                         }|j#                  dd      j%                         j                         }|j#                  dd	      }|j#                  d
d	      }|j#                  |      }|j#                  |      }g }||j'                  t)        d             ||j'                  t)        d             |r7dj+                  d |D              |d|d   v rdnd<   |j'                  |       "|
j#                  |j                  |j                  f      }|r|xs |j,                  |_        |re||_        |j2                  |_        	 |j7                         |_        t;        j<                         |_        |j0                  |j.                  z   |_         |jC                          |dk(  r|j,                  }t        |||      }|re||_        |j2                  |_        	 |j7                         |_        t;        j<                         |_        |j0                  |j.                  z   |_         |j'                  |       r |rt        j                  jE                  |       d}|rtG        ||d      }tI        |      tI        |      z
  tI        |      t)        d      |d}tK        d|      }tM        |      S yc c}w c c}w c c}	w #  Y oxY w#  Y xY w)a  
    This function accepts a POST request containing an Excel file with assigned leave type to employee data.
    It processes the data, checks for errors, and either assigns leave types to employees
    or generates an error report in the form of an Excel file.
    )rW  rX  Badge ID ErrorLeave Type ErrorzAssigned ErrorrY  rZ  zOther Errorsr   assign_leave_type_importrecordsrW  r  rX  rY  0rZ  NzThis badge id does not exist.zThis leave type does not exist. c              3   2   K   | ]  }t        |        y wr@   r   )rB   r   s     rD   rE   z+assign_leave_type_import.<locals>.<genexpr>H  s     B%Yu-Bs   zbadge idr   r^  r_  r<  zAssignLeaveError.xlsxzAssigned Leaves)created_counterror_countrk  r[   zimport_popup.html)'r   r   rd   
read_excelto_dictr*   r   rc   badge_idlowerr   r`   rA  r   r   r   r  r   striprb   r   r   r  rD  rF  r  r  leave_type_next_reset_dater  r   r  r  r  r   r  r}   r;  r   r   )rZ   rs   filery   assign_leave_dictsempr  ltr   alr$  assign_leave_listrr   assign_leaveri  assign_leave_typerD  cfdr   r   errorsexisting_leaver   r[   r   r  s                             rD   r`  r`    s3     	J ~~}}78]]4(
'//	: 2:1A1A1E1E1G
*-3<<CLL #%
	 
 6?5F5F5J5J5LMrrww}}*MM %,,002
   ".."3"34b8
 

 
. B	6L<++J;<BBDJJLH , 0 0r B H H J P P R)--.>DN""#7=C }}X.H$):;JFa ?@A!a ABC HHB6BB (2fQi(?$EW !!,/ .11:==(++2NON0>0W*BWBW-7:N42<2U2UN/&AAC '1
 4<>>3CN0&88>;X;XX #3 ##% "!+!6!6,($-O
 471/9/R/R,1;1V1V1XO. 190@-#558V8VV  0 $$_5EB	6J ""../@A 	-J(?I
 !!34s:Fz?()"	
   3W=D!!Q  
 N
Z,s0   1P-P-"P24P7=P<Q<QQc                     | j                   j                  d      }|r't               }t               }||d}t	        | d|      S t        | t        t        t        dd      S )Nr   )r  export_columnz3leave/leave_assign/assigned_leaves_export_form.htmlr  Assign_Leaver'  r  )r   r   r-  AvailableLeaveColumnExportFormr   r!   rA  )rZ   
hx_requestr  ry  r  s        rD   assigned_leaves_exportr}    sp    !!"34J+-68**
 A
 	

 (1 ( rL   c                     | j                   j                  d      }t               }t        j                  j                  |      |j                  d   _        t        | dd|i      S )N
department)department_idjob_positionzleave/job_position_field.htmlr   )	r   r   RestrictLeaveFormJobPositionr   r   r   r   r   )rZ   r  r   s      rD   get_job_positionsr    s_     KKOOL1MD+6+>+>+E+E# ,F ,DKK( ':VTNKKrL   zleave.add_restrictleavec                     | j                   j                         }|j                  d      rt        |t	        d      d       }nt        |      }t               }| j                  dk(  rt        | j                        }|j                         rs|j                          t               }t        j                  | t        d             t        j                  j                         j!                         dk(  rt#        d      S t%        | d||d      S )	z
    function used to create restricted days.

    Parameters:
    request (HttpRequest): The HTTP request object.

    Returns:
    GET : return restricted days creation form template
    POST : return restricted days view template
    r  Nr   z%Restricted day created successfully..r3  r2  z!leave/restrict/restrict_form.htmlr   rd   )r   r   r:  r	   r;  r  r   r   r   r   r   r   r   RestrictLeaver   r   r|  r   r   )rZ   query_stringr   r   s       rD   restrict_creationr    s     ;;((*Lu%SZ\ :;-D~~ .==?IIK$&DWa(O&PQ$$++-335:#$PQQ+]+ rL   c                    t         j                  j                         ddd   }| j                  j	                         }| j                  j                  d      }t        ||      }t               }t        | d||j                  |d      S )z
    function used to view restricted days.

    Parameters:
    request (HttpRequest): The HTTP request object.

    Returns:
    GET : return restricted days view  template
    Nr  r   z!leave/restrict/view_restrict.html)restrictdayr   rd   )
r  r   rc   r   r   r   r   RestrictLeaveFilterr   r   )rZ   r   r   r   r   restrictday_filters         rD   restrict_viewr    s     $$((*4R40HKK))+M++//&)KX{3H,.+#&++	
 rL   c                    t         j                  j                         }| j                  j	                         }t        | j                  |      j                  }| j                  j                  d      rt        | |d      }| j                  j                  d      }t        |ddd   |      }t        |      }t        t         |       t        | d|||d      S )z
    function used to filter restricted days.

    Parameters:
    request (HttpRequest): The HTTP request object.

    Returns:
    GET : return restricted days view template
    r&   r   Nr  zleave/restrict/restrict.html)r  rd   r   )r  r   rc   r   r   r  r   r   r&   r   r   r#   r   )rZ   r   r   r  r   r   r   s          rD   restrict_filterr    s     $$((*HKK))+M,W[[(CFF{{x #G-?J++//&)K/"5{CH'ImY/& iP rL   zleave.change_restrictleavec                    | j                   j                         }|j                  d      rt        |t	        d      d       }nt        |      }t
        j                  j                  |      }t        |      }| j                  dk(  rVt        | j                  |      }|j                         r/|j                          t        j                  | t        d             t!        | d|||d      S )	a  
    function used to update restricted days.

    Parameters:
    request (HttpRequest): The HTTP request object.
    id : restricted days id

    Returns:
    GET : return restricted days update form template
    POST : return restricted days view template
    r  Nr   r   r   z%Restricted day updated successfully..z(leave/restrict/restrict_update_form.htmlrI  )r   r   r:  r	   r;  r  r   r   r  r   r   r   r   r   r   r   r   )rZ   r   r  r   r  r   s         rD   restrict_updater    s     ;;((*Lu%SZ\ :;-''++r+2Kk2D~~ D==?IIKWa(O&PQ2R}5 rL   zleave.delete_restrictleavec           	         | j                   j                         }|j                  dd       |j                         }| j                   j                         }	 t        j
                  j                  |      j                          t        j                  | t        d             | j                  j                  d      }|r|dk(  r|| j                   j                  d      }t        j                   |      }||v r3|j#                  |       t%        t        j                   |      |      \  }}	t'        d		 d
| d| d      S t        j
                  j)                         st+        d      S t'        d|       S # t        j                  $ r# t        j                  | t        d             Y 
t        $ r# t        j                  | t        d             Y 4w xY w)z
    function used to delete restricted days.

    Parameters:
    request (HttpRequest): The HTTP request object.
    id : restricted days id

    Returns:
    GET : return restricted days view template
    r   Nr   z%Restricted day deleted successfully..zRestricted day not found.r  r   genericModalBodyz#/leave/restricted-days-detail-view//?&instance_ids=rN  r2  /leave/restrict-filter?)r   r<  r=  r   r  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )
rZ   r   rV  r   r  r8  r   r   r   r   s
             rD   restrict_deleter  4  s    ;;##%L_d+ **,M;;((*L=!!R!(//1!$K"LM   !12IY"448M2!!"%/>

=)20,} 1-=/Q_`n_oo|}
 	
   '')HII-l^<==' %% @w"= >? =w": ;<=s   AE: :2G/'GGc                     | j                   j                         }| j                  dk(  r| j                  j	                  d      }	 t
        j                  j                  |      j                         }t        |      }t        j                  | t        d      j                  |             t#        d|       S # t        t        f$ r" t        j                   | t        d             Y > t        j                   | t        d             Y `xY w)z
    function used to delete multiple restricted days.

    Parameters:
    request (HttpRequest): The HTTP request object.

    Returns:
    GET : return restricted days view template
    r   r  r   z-{} Leave restricted days deleted successfullyzRestricted Days not foundzSomething went wrongr  )r   r   r   r   r  r  r   r   r   r;  r   r   r   r   r   r   r   r   )rZ   rd   restrict_day_idsrestrict_daysr|  s        rD   restrict_days_bulk_deleter  `  s     
			 B~~"<<//6	?)1188' 9 fh  ()EABII%P -bT233	 z* 	DNN7A&A$BC	?NN7A&<$=>s   A'B; ;.D+ Dc                    | j                   j                  d      }|dk(  rt        j                  j	                         }D cg c]  }t        |j                         }}t        |      }||d}t        |      S c c}w )Nr   rc   r  total_count)	r   r   r  r   rc   r  r   r;  r   )rZ   r   r  dayr  r  r   s          rD   restrict_day_selectr    ss     ++//&)Ke%--113/<=CFF==&'K#3KPG   >s   A<c                    | j                   j                  d      }| j                   j                  d      }|rt        j                  |      ni }|dk(  rwt	        |t
        j                  j                               }|j                  }|D cg c]  }t        |j                         }}|j                         }||d}t        |      S y c c}w )Nr   r   rc   r   r  )r   r   r   r   r  r  r   rc   r   r  r   r|  r   )	rZ   r   filteredfiltersr  r  restrictday_idsr  r   s	            rD   restrict_day_select_filterr    s     ++//&)K{{x(H&.djj"BGe0m33779
 022BTU;3{~~.UU(..0'6{SG$$ 
 Vs   Cc                     t        | j                  j                               t        d      d }| j                  j
                  }t        j                  j                  |      }t        ||d      }| j                  dk(  r^t        | j                  | j                  |      }t        j                  | j                  j                  d      d	      }t        j                  | j                  j                  d
      d	      }| j                  j                  d      }| j                  j                  d      }	t        j                  j                  ||      }
|
j                   |
j"                  z   }t%        ||||	      }t'        ||      }|D cg c]  } |j(                          }}t*        j                  j-                         }t/        |      }t0        j                  j-                         }t3        ||      |j4                  dk(  r@|j6                  dk(  r1t9        t;        |z                t=         fd|D              }||z
  }nOd}|j6                  dk(  r|D ]  }||v s|dz  } ||z
  }|j4                  dk(  rt=        fd|D              }||z
  }|j?                         r"|jA                  d      }d}||_!        ||_"        |jB                  jF                  dk(  r|jD                  }|jB                  }t        j                  j                  ||      }
|jH                  |
j                   kD  rM|jH                  |
j                   z
  }|
j                   |_%        d|
_        |
j"                  |z
  |
_        ||_&        n/|
j                   |jH                  z
  |
_        |jH                  |_%        d|_'        |
jA                          |r||_(        |jA                          tS        |jT                        rtS        |jT                        }g }|d   D ]  }|jW                  |jX                          t[        j\                  t^              5  ta        jb                  | j                  j
                  |d   ddddddd|jT                    	       ddd       te        | |d!"      }|jg                          ti        jj                  | tm        d#             t[        j\                  t^              5  ta        jb                  | j                  j
                  |jD                  jn                  jp                  jX                  ddddddts        d$      d%|jT                   z    	       ddd       t        tt        j                  jw                  |&            dk(  s*| jx                  j                  d'      j{                  d(      rt}        d)      S t        | d*||||d+      S t        j                  jw                  |      |j                  d,   _A        t        | d*||||d+      S c c}w # 1 sw Y   xY w# 1 sw Y   xY w)-a  
    function used to create user leave request.

    Parameters:
    request (HttpRequest): The HTTP request object.
    id : leave type id

    Returns:
    GET : return user leave request creation form template
    POST : user my leave view template
    r  Nr   r   r   r  r   r   rz  %Y-%m-%dr{  start_date_breakdownend_date_breakdownyesc              3   &   K   | ]  }|v  
 y wr@   rA   rB   requested_datetotal_leavess     rD   rE   z%user_leave_request.<locals>.<genexpr>  s      $3A,.$   r   r3  c              3   &   K   | ]  }|v  
 y wr@   rA   rB   r  company_leave_datess     rD   rE   z%user_leave_request.<locals>.<genexpr>  s      *& #&99*r  Fr  Tr  r  r  r   r  r  r  r  r  r  r  r  rZ   r'  r)  r/  r0  r   r  zemployee-profile/r2  z'leave/user_leave/user_request_form.html)r   r   r   rd   r   )Br	   r   r   r;  r>  r?  r   r   r   UserLeaveRequestFormr   r   r   r   strptimerA  rD  rF  r7   r;   r   r(   rc   r:   r'   r8   exclude_company_leaveexclude_holidayr   r   sumr   r   r   r   r@  rC  rE  rG  rH  rB  r  r   rb   rI  rJ  rK  rL  r=   rM  r<   rN  r   r   r   rO  rP  r   rQ  r   r   endswithr   r   r   r   )!rZ   r   r   r   r   r   rz  r{  r  r  r   available_total_leaverC  requested_datesr   holidaysholiday_datescompany_leavestotal_leave_countholiday_countr  company_leave_countr[  r   r   r   r\  r]  r   r	  r^  r  r  s!                                  @@rD   user_leave_requestr    s    GKK1134SZ\BM||((H""&&"&-J (:FD ~~#GLL'--(S&&w||'7'7'EzR
$$W\\%5%5j%A:N&||//0FG$\\--.BC(0044 
 5 
 **_-N-NN 	 2"68J
 0
HE3BC49499;CC##'')*84&..2246~zR,,5**e3M4G$G HIL # $ET$ ! ,.??NM))U2&5 +N%6%*+ "0-!?//58&) **9* '# "02E!E==? IIUI3MD*4M'(0M%**;;tC+77 - ; ;"0"8"8"<"<"/[ #= # !///2P2PP%447U7UU  (66 "9 67O2'99EA $5 @EM< (669U9UU $2 =J<X<XM9'1$$$&+3(""$+M,<,<=+CMDTDT+U(!H#7
#C B (@(@AB#,,Y7 #LL55&.qk!L$e$Y$\$Z!0'>}?O?O>P%Q
 2] !!#  !,R*ST((3 KK11"/";";"N"N"c"c"t"tH a U X V,!(!8T-BRBRAS;T!T
  ((//H/E!,,**>:CC' ((TUU5(#		
 		
 -6,=,=,D,D,D,KDKK )1$		
	 	g DH " s    X)AX.6A4X;.X8;Yc                    | j                   j                         }t        j                  j	                  |      }	 | j
                  j                  |j                  k(  r|j                  dk7  rot        |j                  |      }| j                  dk(  r7t        | j                  | j                  ||j                        }|j                         r|j                  d      }|j                  }|j                   }|j"                  }|j$                  }|j&                  }	| j
                  j                  }
t(        j                  j	                  |
|	      }|j*                  |j,                  z   }t/        ||||      }t1        ||      }t2        j                  j5                         }t7        |      }t8        j                  j5                         }t;        ||      |	j<                  d	k(  r@|	j>                  d	k(  r1tA        tC        |z               tE        fd
|D              }||z
  }nOd}|	j>                  d	k(  r|D ]  }||v s|dz  } ||z
  }|	j<                  d	k(  rtE        fd|D              }||z
  }||k  r0|j                          tG        jH                  | tK        d             n|jM                  dtK        d             tO        | d|||d      S tG        jP                  | tK        d             tS        d      S # tT        $ r)}tG        jP                  | tK        d             Y d}~nd}~ww xY wtO        | d||d      S )a  
    function used to update user leave request.

    Parameters:
    request (HttpRequest): The HTTP request object.
    id : leave request id

    Returns:
    GET : return user leave request update form template
    POST : return user leave request view template
    r   r  )r   r   r   )r   r   Fr  r  r  c              3   &   K   | ]  }|v  
 y wr@   rA   r  s     rD   rE   z&user_request_update.<locals>.<genexpr>	  s      0 . +l:0r  r   r3  c              3   &   K   | ]  }|v  
 y wr@   rA   r  s     rD   rE   z&user_request_update.<locals>.<genexpr>	  s      6$2 !/2E E6r  z$Leave request updated successfully..Nz5You dont have enough leave days to make the request..z)leave/user_leave/user_request_update.htmlrI  z&You can't update this leave request...r2  User has no leave request..)+r   r   rQ  r   r   r>  r?  r   rH  r  r   r   r   r   r   rz  r{  r  r  r   rA  rD  rF  r7   r;   r(   rc   r:   r'   r8   r  r  r   r   r  r   r   r   	add_errorr   r   r   rL  )rZ   r   r   r[  r   rz  r{  r  r  r   r   r   r  rC  r  r  r  r  r  r  r  r  r   r  r  s                          @@rD   user_request_updater  A	  sO    KK))+M ((,,,3MWBLL%%)B)BB$$
2'&22]D ~~'+LLMM**66	 ==?$(IIUI$;M!.!9!9J,55H+8+M+M()6)I)I&!.!<!<J&||88H&4&<&<&@&@$,J 'A 'O (66);;< * &>"H.BDV&N '<J&QO'//335H$6x$@M%2%:%:%>%>%@N*B&
+' #88EA&66%?'+C@S0S,T'U,/ 02A0 -) *8:K)K()%55>2A 7#1]#B$1Q$6M7 .<m-KN%;;uD25 66E6 3/ .<>Q-QN%)>>%**, ((#Q'M%N  UV ; '  NN7A&N$OP LMM Bw"? @AAB3	
 s%   HL BL !)L 	L=L88L=c                    | j                   j                  dd      }| j                  j                         }	 t        j
                  j                  |      }| j                  j                  |j                  k(  r/t        j                  | t        d             |j                          |r|dk(  rt!        d      S t        j
                  j#                  | j                  j                  	      st!        d      S t%        d
|       S # t        j                  $ r" t        j                  | t        d             Y t        $ r" t        j                  | t        d             Y w xY w)z
    function used to delete user leave request.

    Parameters:
    request (HttpRequest): The HTTP request object.
    id : leave request id

    Returns:
    GET : return user leave request view template
    r   Nr   r  r  r  r  r2  r  z/leave/user-request-filter?)r   r   r   r   rQ  r   r>  r?  r   r   r   r   r   r   r   r   r   r   r   )rZ   r   r8  r   r[  s        rD   user_request_deleter  	  s&      !148IKK))+M=$,,00B07<<$$(A(AAWa(N&OP  "
 Y"44HII&&7<<3L3L&MHII5m_EFF $$ Bw"? @A =w": ;<=s   A2D	 	2E'='E'&E'c                    	 | j                   j                  }|j                  j                         }| j                  j                         }| j                  j                  d      }t        | j                  |      j                  }t        |      }t        t        |       t        ||      }t        | d|||d      S # t        $ r4}t        j                   | t#        d             t%        d      cY d}~S d}~ww xY w)z
    function used to filter user assigned leave types.

    Parameters:
    request (HttpRequest): The HTTP request object.

    Returns:
    GET : return user assigned leave types view template
    r   z leave/user_leave/user_leave.html)user_leavesrd   r   User is not an employee..r  N)r>  r?  r   rc   r   r   r   r-  r   r   r#   rA  r   r   rL  r   r   r   r   )	rZ   r   r   r   r   r8  r   r   r   s	            rD   user_leave_filterr  	  s    <<,,++//1--/kkoof- 3GKK J M M]+	.)4 !6D.$M)T
 	

  w"= >?}s   B<B? ?	C<)C71C<7C<c                    	 | j                   j                  }|j                  j                         }| j                  j                         }| j                  j                  d      }|}g }t        j                  d      re|D ]`  }t        dd      }|j                  j                  |j                  |j                  |j                  g      }	|	sP|j                  |       b t!        | j                  |      }
t#        |
j$                  j'                  d      |      }t)        j*                  t-        |j.                  j1                  dd	
                  }t2        j                  j                  |j4                        j7                  d	      }t8        j                  j;                         rRt8        j                  j;                         j<                  r*t2        j                  j                  |j4                        }t?        j@                         }tC        | d||
jD                  ||tF        jH                  |||d      S # tJ        $ r4}tM        jN                  | tQ        d             tS        d      cY d}~S d}~ww xY w)z
    function used to view user leave request.

    Parameters:
    request (HttpRequest): The HTTP request object.

    Returns:
    GET : return user leave request view template
    r   rg  rh  ri  rl  r  rd  r   Tr   r  $leave_type_id__is_compensatory_leavez'leave/user_leave/user_request_view.html)r_  r   rd   rt  rs  r  r  ru  r  r  N)*r>  r?  leaverequest_setrc   r   r   r   r
   ry  r3   r   r   r   rz  r{  rb   UserLeaveRequestFilterr   r   r  r   r   r   r}  r   rA  r   r   r   r   r   r   r  r   r   MyLeaveRequestReGroupr   rL  r   r   r   r   )rZ   r>  r   r   r   r_  ru  r[  r  r  user_request_filterr   r  
user_leavert  r   s                   rD   user_request_viewr  	  s-   ;||((((,,.--/kkoof- "(*%]+!/ H %<+3F%! /66== - 9 9%00%..+ > 
 188G!H$ 5W[[8T !4!7!7!@!@!GUjj%%11$T1BC
 $++22tww2GOO15 P 

  ''--/#++113FF'//664776KJzz|5"*+00# ,299*)1N	
 	
  w"= >?}s%   CI E3I 	J)I>8J>Jc           	         	 | j                   j                  }|j                  j                         j	                  d      }| j
                  j                         }| j
                  j                  d      }| j
                  j                  d      }|}g }t        j                  d      re|D ]`  }t        dd      }	|	j                  j                  |j                  |j                  |j                  g      }
|
sP|j!                  |       b t#        | |d      }t%        | j
                  |      j&                  }d	}|d
k7  r|t)        ||| j
                  j                  d      d      }|D cg c]  }|d   	 }}g }|D ].  }|j*                  D ]  }|j!                  |j,                          0 t/        j0                  t3        |            }d}n\t5        || j
                  j                  d            }t/        j0                  |j*                  D cg c]  }|j,                   c}      }t7        |      }t9        t:        |       d|v r|d   }t=        |      dkD  r	|d   g|d<   t>        j                  j                  |j,                        }||||tA        jB                         |||d}tE        | ||      S c c}w c c}w # tF        $ r4}tI        jJ                  | tM        d             tO        d      cY d}~S d}~ww xY w)z
    function used to filter user leave request.

    Parameters:
    request (HttpRequest): The HTTP request object.

    Returns:
    GET : return user leave request view template
    rd  r   r   rg  rh  ri  rl  r&   )z#leave/user_leave/user_requests.htmlr  Nr   zleave/user_leave/group_by.htmlrH  r3  r  r  )r_  rd   r   r   rt  r  r  ru  r  r  r  )(r>  r?  r  rc   r  r   r   r   r
   ry  r3   r   r   r   rz  r{  rb   r&   r  r   r1   r}  r   r   r   r   r   r   r#   rQ  r;  rA  r   r  r   rL  r   r   r   r   )rZ   r>  r   r   r   r   r_  ru  r[  r  r  r  r  r  r  r  rw   r   r   r   r  r  r   r   s                           rD   r  r  ?
  s   N||((((,,.77>--/kkoof-( "(*%]+!/ H %<+3F%! /66== - 9 9%00%..+ > 
 188G!H$ '8X64W[[(KNN;B;5,"3#UGKKOOF,CV# 7JJU5=JKJG$ 0 % 1 1 0HNN8;;/00  ::d7m4L7H #0#W[[__V%<#  ::-@-L-LMML ]+	,	2y #H-K;!#'22&7	(##++22tww2G
 2$ JJL'%-J	
 gx99I K N.  w"= >?}sE   C9K
 <A4K
 0K <BK
 K)BK
  
K
 
	L)L<LLc           	      j   t         j                  j                  |      }	 | j                  j                  d      }|r$t	        j
                  |      }t        ||      \  }}t        | d||d      S # t        $ r4}t        j                  | t        d             t        d      cY d}~S d}~ww xY w)z
    function used to view one user leave request.

    Parameters:
    request (HttpRequest): The HTTP request object.

    Returns:
    GET : return one user leave request view template
    r   r   z&leave/user_leave/user_request_one.html)r[  r   r   r   r  r  N)rQ  r   r   r   r   r   r   r   rL  r   r   r   r   )rZ   r   r[  r   r   r   r   r   s           rD   user_request_oner  
  s     !((,,,3M#KKOOO<::&78L#2<#D K4!.!2'		
 		
  w"? @A}s   AA5 5	B2>)B-'B2-B2c                     t         j                  d      }t        |j                  dd            }t	        j
                         }t        | d|||d      S )z
    function used to view employees are leave today.

    Parameters:
    request (HttpRequest): The HTTP request object.

    Returns:
    GET : return Json response of employee
    r  rn  r   Tr   zleave/dashboard/on_leave.html)leavesr   today_holidays)rQ  employees_on_leave_todayr   r   r(   r  r   )rZ   r  r   r  s       rD   employee_leaver  
  s`     22*2EF**4d*;<L,,.N'(,	
 rL   c                 L   g }g }t         j                  j                         }t        | j                        j
                  }|D ]Q  }|j                  |      j                         }|s&|j                  |j                         |j                  |       S t        ||d      S )z
    function used to view overall leave in the company.

    Parameters:
    request (HttpRequest): The HTTP request object.

    Returns:
    GET : return Json response of labels, data
    .employee_id__employee_work_info__department_id)labelsdata)
Departmentr   rc   rv  r   r   r   r|  rb   r  r   )rZ   r  r  departmentsr_  r  r|  s          rD   overall_leaver  
  s     FD$$((*K'477N! 
%%;E & 

%' 	 MM*//0KK 64899rL   c                    t        j                         }t        j                  j	                  |d      }t        j                  j	                  d|j
                        }t        j                  j	                  d|j
                        }t        j                  j	                  |      }|r|j                  d      j                         nd}||||d	|j                  d
      |j                  d      j                  d
      t        |j                  |j
                  t        j                  |j                  |j
                        d         j                  d
      d}t        | d|      S )z
    function used to view Admin dashboard in the leave module.

    Parameters:
    request (HttpRequest): The HTTP request object.

    Returns:
    GET : return Admin dasboard template.
    r  )start_date__gterH  r  )rH  start_date__monthr  r  rz  Nr  r  r3  )r  )r  r  r  next_holidayr  r  	first_daylast_dayzleave/dashboard.html)r   r  rQ  r   r   monthr(   r  r   strftimereplaceyearcalendar
monthranger   )rZ   r  r  r  r  r  r  r   s           rD   r  r  
  s7    JJLE$$++E++VI##**U[[ + H ##**U[[ + H &&u&=H>F8$$\288:DL $ 
+]]q])22:>JJX%8%8U[[%QRS%T

(:
G '17;;rL   c                    t        j                         }t        j                  j	                  | j
                        }t        j                  j                  |      }|j                  d      }|j                  d      }|j                  d      }t        j                  j                  |      }|j                         r|j                  d      j                         nd	}|||||d
d}	t        | d|	      S )z
    function used to view Employee dashboard in the leave module.

    Parameters:
    request (HttpRequest): The HTTP request object.

    Returns:
    GET : return Employee dasboard template.
    rI  r  r  rn  r  r  r  rz  Nr  )r_  r  r  r  r  r  zleave/employee_dashboard.html)r   r  r*   r   r   r>  rQ  r   r(   r   r  r   r   )
rZ   r  r>  r_  r  r  r  r  r  r   s
             rD   employee_dashboardr    s     JJLE>D!))00T0BN%%[%9I$$J$7H$$J$7H&&u&=H3;??3D,'--/$ 
 )$ G ':GDDrL   c                     g }t        j                         }| j                  j                  d      }| j                  j
                  }t        j                  j                  |      }|r>t        j                  |d      }|j                  |j                  |j                        }n'|j                  |j                  |j                        }|D  cg c]  } | j                   }} |d|d}t         d|      S c c} w )z
    function used to view leave request table.

    Parameters:
    request (HttpRequest): The HTTP request object.

    Returns:
    GET : return leave requests table.
    r   r  %Y-%mr  start_date__yearr  )r_  r  r   z1leave/leave_request/dashboard_leave_requests.html)r   r  r   r   r>  r?  rQ  r   r   r   r  r  r  r   r   )rZ   r   r  r  r   r_  r   s          rD   dashboard_leave_requestr   9  s     LJJLE
++//&
!C||((H!))00X0FN
W-'..!ii#(( / 
 (..#kkEJJ / 
 /==7GJJ=L=( $G
 'NPWXX >s   C;c                    t         j                  j                  | j                        }t        j                  j                  |      j                  d      }g }g }|D ]O  }|j                  |j                  |j                  z          |j                  |j                  j                         Q t        d      |dg}||t        d      d}t        |      S )	z
    function used to generate available leave chart in employee dashboard.

    Parameters:
    request (HttpRequest): The HTTP request object.

    Returns:
    GET : return Json response of labels, dataset, message.
    r  r  r   )rD  zTotal leaves availablelabelr  z0Oops!! No leaves available for you this month...r  datasetrQ  )r*   r   r   r>  rA  r   r   rb   rD  rF  r   r`   r   r   )rZ   r>  r$  leave_countr  r\  r  r\   s           rD   available_leave_chartr  ]  s     >D%--444FNN O  KF! 05//%2I2IIJe))../0 /0	
G GHH
 !!rL   c           	         t        j                         }| j                  j                  d      r1| j                  j                  d      }t	        j
                  |d      }t        j                  j                  dd      }|j                  |j                  |j                        }|j                  dd      }g }g }|j                  |j                  |j                        D ]  }|j                  |j                          t        t        |            D ]  }|j                  |g d	        t        t        |            }t!        d
       }|D ]i  }	|j                  |	|j                  |j                        }
|
D ]:  }||j"                  j$                     |	xx   t'        |j(                  d      z  cc<   < k |D ]   }|d   }|D 	cg c]
  }	||   |	    c}	|d<   " g }t        t        |            D ],  }|j                  |j*                   d|j,                          . ||t/        d      d}t1        |      S c c}	w )z
    function used to generate employee leave chart in Admin dashboard.

    Parameters:
    request (HttpRequest): The HTTP request object.

    Returns:
    GET : return Json response of labels, dataset, message.
    r   r  Tr  )employee_id__is_activerH  r  leave_type_id__namer   r  c                       t        t              S r@   )r   r  rA   rL   rD   rK   z&employee_leave_chart.<locals>.<lambda>  s    E0B rL   )r   r  r     r  r  rc  zNo leave request this monthr  )r   r  r   r   r   r  rQ  r   r   r  r  r   rb   r   r   r   r   r   r`   roundrC  employee_first_nameemployee_last_namer   r   )rZ   r  r_  r   r  r  r   r   total_leave_with_typer  r  r\  r  dataset_labelemployee_labelr\   s                   rD   employee_leave_chartr    s^    **,C{{vkkoof%W-!))00#J 1 N $**))chh + N !,,-B,NKFG"))))chh *  , 	h**+,
 3{+, 

#	

 #f+F'(BC &&SXX ' 
  	E!%"5"5":":;EBe$$aG B		  YWQWX-m<UCXVY NV% 
++,Ah.I.I-JK	


 !23H
 !! Ys   Ic                    t        j                         }| j                  j                  d      r1| j                  j                  d      }t	        j
                  |d      }t        j                  j                         }|D ci c]  }|j                  d }}t        j                  j                  d      }|j                  |j                  |j                        }g }g }|D ]  }|j                         D ]"  }	|j                  |	j!                  d             $ |D ]G  }||j"                  j$                  j&                  k(  s'||j                  xx   |j(                  z  cc<   I  |j+                         D ]  \  }
}|dk7  s|j                  |
        t-        |j/                               }|D cg c]
  }|dk7  s	| }}t1        d      |d	g}||t1        d
      d}t3        |      S c c}w c c}w )z
    function used to generate department leave chart in Admin dashboard.

    Parameters:
    request (HttpRequest): The HTTP request object.

    Returns:
    GET : return Json response of labels, dataset.
    r   r  r   r  rn  r  r  r  r  z!No leave requests for this month.r  )r   r  r   r   r   r  r  r   rc   r  rQ  r   r  r  r  rb   r  r   rO  r  rC  ra   r   r  r   r   )rZ   r  r  depdepartment_countsr[  leave_datesr  r\  
leave_dater  r|  r  rw   r  r\   s                   rD   department_leave_chartr    s    **,C{{vkkoof%W-$$((*K6ABs*BB ((//z/BM!(())chh ) M KF J//1 	@Jz22:>?	@  	JCe''::HHH!#..1U5I5II1	J	J /446 &
EA:MM*%& #**,-F!'65A:e6F6 rU	
G 89H
 !!? C& 7s   G28
G7G7c                 J   t        j                         }| j                  j                  d      r1| j                  j                  d      }t	        j
                  |d      }t        j                  j                         }|D ci c]  }|j                  d }}t        j                  j                  d      }|j                  |j                  |j                        }|D ]:  }|D ]3  }||j                  k(  s||j                  xx   |j                  z  cc<   5 < g }|j!                         D ]  \  }	}
|
dk7  s|j#                  |	        t%        |j'                               }|D cg c]
  }|dk7  s	| }}|d|igt)        d      d	}t+        |      S c c}w c c}w )
z
    function used to generate leave type chart in Admin dashboard.

    Parameters:
    request (HttpRequest): The HTTP request object.

    Returns:
    GET : return Json response of labels, dataset.
    r   r  r   r  rn  r  r  z0No leave requests for any leave type this month.r  )r   r  r   r   r   r  r   r   rc   r`   rQ  r   r  r  r   rC  ra   rb   r   r  r   r   )rZ   r  r   typesleave_type_countr[  r\  levr  r   r|  r  rw   r\   s                 rD   leave_type_chartr    s    **,C{{vkkoof%W-##'')K3>?%

A?? ((//z/BM!(())chh ) M  C 	CCe))) *e.B.BB*	CC F-335 &
EA:MM*%& "))+,F!'65A:e6F6  

 GHH !!7 @  7s   F-
F 8F c                    t        j                         }|t        |j                               z
  }t	        d      D cg c]  }|t        |      z    }}g }t
        j                  j                  d      }g }|D ](  }|j                         D ]  }	|j                  |	        * |D 
cg c]6  }
|
j                  |j                  k(  r|
j                  |j                  k(  r|
8 }}
|D ]<  }g }|D ]  }||k(  s	|j                  |        |j                  t        |             > t        d      |df}|D cg c]  }|j                  d       }}||d}t        |      S c c}w c c}
w c c}w )	z
    function used to generate leave over a week chart in Admin dashboard.

    Parameters:
    request (HttpRequest): The HTTP request object.

    Returns:
    GET : return Json response of labels, dataset.
    r     r  rn  zLeave Trendsr  z%d-%m-%Y)r  r  )r   r  r   weekdayr  rQ  r   r   r  rb   r  r  r;  r   r  r   )rZ   r  start_of_weekr  
week_datesleave_in_weekr[  r  r\  r  r  filtered_dates	week_dater  filtered_dater  r  r\   s                     rD   leave_over_periodr(  (  s    JJLEI5==?;;M=B1XF-)"33FJFM ((//z/BMK +//1 	+Jz*	++ 99#EJJ(> 	N 
   (	+ 	+M	)M*	+ 	SY'( ~&!	
G ?IIi  ,IFI H !!G G& Js   E',;E,=E1c                 H	   t        | j                  j                               t        d      d }| j                  j
                  }|j                  }t        |      }| j                  dk(  rt        | j                  | j                  |      }t        |j                  d         t        |      k(  rq|j                         rP|j                  d      }d}|j                  j                   d	k(  r|j"                  }|j                  }t$        j&                  j)                  ||
      }	|j*                  |	j,                  kD  rM|j*                  |	j,                  z
  }
|	j,                  |_        d|	_        |	j0                  |
z
  |	_        |
|_        n/|	j,                  |j*                  z
  |	_        |j*                  |_        d|_        |	j                          |r;| j                  j
                  |_        |j                          t9        |j                        rt9        |j                        }g }|d   D ]  }|j;                  |j<                          t?        j@                  tB              5  tE        jF                  | j                  j
                  |d   ddddddd|j                   	       ddd       tI        jJ                  | tM        d             t?        j@                  tB              5  tE        jF                  | j                  j
                  |j"                  jN                  jP                  j<                  d|j"                   dd|j"                   dd|j"                   dd|j"                   dd|j"                   ddtS        d      d|j                   z   	       ddd       tU        | |d !      }|jW                          t        |      }t        tX        j&                  j[                  |"            d#k(  rt]        d$      S t_        | d%||d&      S tI        j`                  | tM        d'             t_        | d%d(|i      }t]        |jb                  je                  d)      d*z         S t_        | d%||d&      S # 1 sw Y   xY w# 1 sw Y   xY w)+z
    function used to create leave request from calendar.

    Parameters:
    request (HttpRequest): The HTTP request object.

    Returns:
    GET : return leave request form template
    POST : return leave request view
    r  Nr  r   r   Fr  Tr  r  r   r  r   r  r  r  r  r  r  r  r  r)  r*  r+  r,  u   Neuer Urlaubsantrag für z
 erstellt.r-  r.  r/  r0  rZ   r'  r  r3  r2  z"leave/user_leave/request_form.htmlr  You don't have permissionr   r  r  )3r	   r   r   r;  r>  r?  r   UserLeaveRequestCreationFormr   r   r   r  r  r   r   r   r@  r   rA  r   r   rC  rD  rE  rF  rG  rH  rB  r  rb   rI  rJ  rK  rL  r=   rM  r   r   r   rO  rP  r   r<   rN  rQ  r   r   r   r   r  r  )rZ   r   ro  rS  r   r[  r   r   r   r   r\  r]  r   r	  r^  r\   s                   rD   leave_request_creater,  [  sh    GKK1134SZ\BM
,,
#
#CVVF'5D~~+GLL'--RUVtyy'(CK7}} $			 7 ..??4G"/";";K$1$?$?M&4&<&<&@&@&3 'A 'O %33o6T6TT)88-<<= 
 ,:: &= :;6+==E (9 DI@ ,::+::; (6
 *88 &= ,6M(#((*/6||/H/HM,!&&(/0@0@A/G),,0, $&';J'G FG$OOG,D,DEF'00; "KK ' 9 9*21+%P(i(](`(^%4+B=CSCSBT)U
 $$Wa0V.WX#,,Y7 #LL55&3&?&?&R&R&g&g&x&x#A-B[B[A\\]!^&VWdWpWpVqqr$s&?@Y@Y?ZZd$e&MmNgNgMhhi$j&N}OhOhNiij$k!0%,^%< $]%5%5$67&8 #6Y#K  %%'7ED<//6666JKqP+H   4 '  NN7A&A$BC=~H    ''03XX  ,	
 k  s   0AR3B:RRR!c                 Z   d}| j                   d   r| j                   d   }nd}| j                   j                  dd      }| j                   d   r| j                   d   r| j                   d   }t        j                  j	                  |      j                         }t        j                  j	                  t        |j                        t        |      z        }|D ]  }|j                  } |r(	 ||j                         j                         |d d    z  }t        ||d	      S #  Y xY w)
Nr  r   r   r   r   r   r     )r  r   )r   r   r   r   r   r   rA  r   r   rD  forcasted_leavesr   )rZ   balance_countr   r   r   r   balancer  s           rD   employee_leave_detailsr3    s   M||M"<<.<<FB'D||L!gll=&A\2&&---?EEG
 ((//JMM*Q8-DD
  	-A,,M	-!A!A!CD!H!MM 8LMMs   1'D& &D*c           	         | j                   j                  }t        j                  j	                         j                  d      }t        | j                  |      j                  }t        | |d      }| j                  j                  d      }t        ||      }t        j                  t        |j                  j!                  dd                  }t        j                  j#                  |j$                        j                  d      }t        | j                  |      j                  }| j                  j                  d      }t        ||      }t        j                  t        |j                  j!                  dd                  }t               }	| j                  j'                         }
t)        |
      }t+        t        |      }|||
|	j,                  |t.        j0                  ||d	}t3        | d
|      S )z
    function used to view leave allocation request.

    Parameters:
    request (HttpRequest): The HTTP request object.

    Returns:
    GET : return leave allocation request view template
    rd  !leave.view_leaveallocationrequestr   r   Tr   r  m_page)leave_allocation_requestsmy_leave_allocation_requestsrd   r   r   rs  r   my_requests_idszAleave/leave_allocation_request/leave_allocation_request_view.htmlr  )r>  r?  LeaveAllocationRequestr   rc   r  LeaveAllocationRequestFilterr   r   r"   r   r   r   r   r   r}  r   r   r   r   r   r#   r   LeaveAllocationRequestReGroupr   r   )rZ   r   r   r   r7  r   r8  my_page_numberr9  leave_allocation_request_filterr   r   r   s                rD   leave_allocation_request_viewr?    s    ||((H%--113<<UCH+GKKBEEH!>H ++//&)K -h D::&22>>t$>OPL $:#A#A#H#HKK $I $huo ! $@1$b ! [[__X.N#0$n$  jj)55AA$TARSO 'C&D#KK))+M'I!"8)DI%>(D/44 299$*	G K rL   c                 R   d}| j                   j                  d      dk(  rd}| j                   j                  d      }|r$t        j                  |      }t	        ||      \  }}t
        j                  |      }|||| j                   j                  d      d}t        | d|	      S )
z
    function used to present the leave allocation request detailed view.

    Parameters:
    request (HttpRequest): The HTTP request object.
    req_id : leave allocation request id

    Returns:
    return leave allocation request single view
    F
my_requestTrueTr   r  )leave_allocation_requestrA  r   r   r   r  zHleave/leave_allocation_request/leave_allocation_request_single_view.htmlr  )r   r   r   r   r   r:  r   r   )	rZ   req_idrA  r   r   r   r   rC  r   s	            rD   $leave_allocation_request_single_viewrE  +  s     J{{|$.
8zz"34.|VDW5::6B$< *[[__[1G R rL   c                    | j                   j                  }t        d|i      }t        | |d      }|j                  d   j
                  t        j                  j                  | j                         z  |j                  d   _        | j                  dk(  rt        | j                  | j                        }|j                         rY|j                  d      }d|_        |j                          t        j                   | t#        d             t%        j&                  t(              5  t+        j,                  | j                   j                  |j.                  j0                  j2                  j4                  d	|j.                   d
d|j.                   d
d|j.                   d
d|j.                   d
d|j.                   d
dt7        d      d|j8                   z   	       ddd       t;        | dd|i      }t=        |j>                  jA                  d      dz         S d|i}t;        | d|      S # 1 sw Y   QxY w)z
    function used to create leave allocation request.

    Parameters:
    request (HttpRequest): The HTTP request object.

    Returns:
    GET : return leave allocation request form template
    POST : return leave allocation request view
    r   r   leave.add_leaveallocationrequestr  r   Fr  z'New Leave allocation request is createdz)New leave allocation request created for r+  u;   تم إنشاء طلب تخصيص إجازة جديد لـ u0   Neue Anfrage zur Urlaubszuweisung erstellt für u7   Nueva solicitud de asignación de permisos creada para u5   Nouvelle demande d'allocation de congé créée pour people-cicleleave-allocation-request-viewr0  r  NzCleave/leave_allocation_request/leave_allocation_request_create.htmlr   r  $<script>location. reload();</script>r  )!r>  r?  LeaveAllocationRequestFormr   r   r   r*   r   r   r   r   r   r   r   skip_historyr   r   r   rJ  rK  rL  r=   rM  r   rO  rP  rI  r   r   r   r   r  r  )rZ   r   r   rC  r\   r   s         rD   leave_allocation_request_createrM  O  s)    ||((H%}h.GHDgt-OPD*.+++h!!((',,(G+HDKK' ~~)',,F==?'+yyy'>$49$1$))+Wa(Q&RS$$Y/ LL--6BBUUjj{{DE]EiEiDjjklYZrZ~Z~Y  @A  BNOgOsOsNttuvUVnVzVzU{{|}STlTxTxSyyz{'$%DE5889:; UH
    ''089  tnGM / s   *B:H44H=c                    | j                   j                  d      }| j                  j                  }| j                   j                  d      }| j                   j                  d      }| j                   j	                         }d}t        | j                         j                  j                  d      }t        j                  j                  |j                        j                  d      }t        | j                   |      j                  }t        | |d      }| j                   j                  d      rt        | |d      }|rt        |||d      }	t        |||d      }
|	D cg c]  }|d	   	 }}|D cg c]  }|j                  D ]  }|j                   ! }}}t!        j"                  t%        |            }|
D cg c]  }|d	   	 }}|D cg c]  }|j                  D ]  }|j                   ! }}}t!        j"                  t%        |            }d
}nt'        ||      }	t'        ||      }
t!        j"                  t%        |	j                  j)                  dd                  }t!        j"                  t%        |
j                  j)                  dd                  }t+        |      }t-        t        |      }|j/                  dd        |	|
|||||d}t1        | ||      S c c}w c c}}w c c}w c c}}w )Nr   r   r6  zAleave/leave_allocation_request/leave_allocation_request_list.htmlrd  r  r5  r&   r   Eleave/leave_allocation_request/leave_allocation_request_group_by.htmlr   Tr   )r7  r8  rd   r   r   r   r9  r  )r   r   r>  r?  r   r;  r   r  r:  r   r   r   r"   r&   r1   r}  r   r   r   r   r   r   r#   r=  r   )rZ   r   r   r   r=  r   r  "leave_allocation_requests_filtered%my_leave_allocation_requests_filteredr7  r8  r  r  rw   r   r  r   r9  r   r   s                       rD   r>  r>    s    KKOOG$E||((H++//&)K[[__X.NKK))+MRH *F*b% ' -C,J,J,Q,QKK -R -huo * -I:-b * *<35X*&
 {{x -37.
*
 $5.{F%
! (915.((
$
 3LLuV}LL%0
!ARAR
5=HKK

 
 zz$w-02NOuV}OO%0
!ARAR
5=HKK

 
 **T']3S 	 %2.%
! (51>(
$ zz*66BB4dBST
 **-99EEdQUEVW

 'I!"8)DIMM(D! &?(D $*G '8W55U M

 P
s   "K(5$K->K3$K8c                    t         j                  j                  |      }t        |      }t	        | |d      }|j
                  d   j                  t        j                  j                  | j                        z  |j
                  d   _        |j                  dk7  r| j                  dk(  rt        | j                  | j                  |      }|j                         rZ|j                  d	      }d|_        |j                          t#        j$                  | t'        d
             t)        j*                  t,              5  t/        j0                  | j                  j2                  |j4                  j6                  j8                  j:                  d|j4                   dd|j4                   dd|j4                   dd|j4                   dd|j4                   ddt=        d      d|j>                   z   	       ddd       tA        | d||d      }tC        |jD                  jG                  d      dz         S tA        | d||d      S t#        jH                  | t'        d             tC        d      S # 1 sw Y   zxY w)a!  
    function used to update leave allocation request.

    Parameters:
    request (HttpRequest): The HTTP request object.
    req_id : leave allocation request id

    Returns:
    GET : return leave allocation request update template
    POST : return leave allocation request view
    r   r   rG  r   r  r  r   Fr  z1Leave allocation request is updated successfully.z%Leave allocation request updated for r+  u6   تم تحديث طلب تخصيص الإجازة لـ u/   Urlaubszuteilungsanforderung aktualisiert für u6   Solicitud de asignación de licencia actualizada para u1   Demande d'allocation de congé mise à jour pour rH  rI  r0  r  NzCleave/leave_allocation_request/leave_allocation_request_update.htmlr   rD  r  rJ  z You can't update this request...r2  )%r:  r   r   rK  r   r   r   r*   r   r>  rH  r   r   r   r   r   rL  r   r   r   rJ  rK  rL  r=   rM  r?  r   rO  rP  rI  r   r   r   r   r  r  r   )rZ   rD  rC  r   r\   s        rD   leave_allocation_request_updaterT    si     6==AAVAL%/GHDgt-OPD*.+++h!!((',,(G+HDKK'  &&*4>>V#-gmm6ND }}+/99E9+B(8=(5(--/  QRS  ((3 KK11":"F"F"Y"Y"n"n""DE]EiEiDjjkl"XYqY}Y}X~~  !A"QRjRvRvQwwx y"XYqY}Y}X~~  !A"STlTxTxSyyz {+!()H!I !9!<!< =>"? "Y!V4
 $$$++G4<=  QV,
 	
 	w"D EFHII; s   B:I77J c                     t         j                  j                  |      }|j                  dk(  r|j                  }|j
                  j                         j                  |j                        j                         rC|j
                  j                         j                  |j                        j                         }nt        |j                  |      }|xj                  |j                  z  c_        |j                          d|_        |j                          t        j                   | t#        d             t%        j&                  t(              5  t+        j,                  | j.                  j0                  |j                  j2                  ddd	d
ddt5        d      d|j6                   z   	       ddd       nt        j8                  | t#        d             t;        | j<                  j                  dd            S # 1 sw Y   .xY w)a  
    function used to approve a leave allocation request.

    Parameters:
    request (HttpRequest): The HTTP request object.
    req_id : leave allocation request id

    Returns:
    GET :It returns to the default leave allocation request view template.
    r   r  r.  r  r  z.Leave allocation request approved successfullyz/Your leave allocation request has been approvedu=   تمت الموافقة على طلب تخصيص إجازتكz/Ihr Antrag auf Urlaubszuweisung wurde genehmigtu8   Se ha aprobado su solicitud de asignación de vacacionesu7   Votre demande d'allocation de congé a été approuvéer  rI  r0  r  Nz.The leave allocation request can't be approvedr  r  )r:  r   r   rH  r   r   rc   r   r   r   r   rA  rD  rC  r   r   r   r   rJ  rK  rL  r=   rM  r>  r?  rI  r   r   r   r  r   )rZ   rD  rC  r   r   s        rD    leave_allocation_request_approverV    s     6==AAVAL&&+5+77$$((*V":"H"HVIVX
 ((,,.&>&L&LM  -6DD$O 	&&*B*Q*QQ&*4 ' %%'!$T"UV  + 	KK))2>>OOFWIRQ$ !@A144567	 	 	w"R ST 0 0 EFF	 	s   A HHc                 h   t         j                  j                  |      }|j                  dk(  s|j                  dk(  rt	               }| j
                  dk(  rt	        | j                        }|j                         rd|j                  d   |_	        |j                  dk(  r|j                  }|j                  }t        j                  j                  ||j                        j                         }t!        d|j"                  |z
        |_        |j%                          d|_        |j%                          t'        j(                  | t+        d	             t-        j.                  t0              5  t3        j4                  | j6                  j8                  |j                  j:                  d
dddddt=        d      d|j>                   z   	       ddd       tA        d      S tC        | d||d      S t'        jD                  | t+        d             tA        d      S # 1 sw Y   tA        d      S xY w)a   
    function used to Reject leave allocation request.

    Parameters:
    request (HttpRequest): The HTTP request object.
    id : leave allocation request id

    Returns:
    GET : It returns to the default leave allocation request view template.

    r   r  r  r   r  r  r   r  z.Leave allocation request rejected successfullyz/Your leave allocation request has been rejectedu*   تم رفض طلب تخصيص إجازتكz/Ihr Antrag auf Urlaubszuweisung wurde abgelehntu9   Se ha rechazado su solicitud de asignación de vacacionesu5   Votre demande d'allocation de congé a été rejetéer  rI  r0  r  Nr  zHleave/leave_allocation_request/leave_allocation_request_reject_form.htmlrS  .The leave allocation request can't be rejected)#r:  r   r   rH   LeaveAllocationRequestRejectFormr   r   r   r  r  r   rC  rA  r   r   r   r  rD  r   r   r   r   rJ  rK  rL  r=   rM  r>  r?  rI  r   r   r   r   r   )rZ   rD  rC  r   r   rC  r   s          rD   leave_allocation_request_rejectrZ  S  s     6==AAVAL '';6#**j8/1>>V#3GLLAD}}9=9J9J89T(6+22j@!9!G!GJ%=%L%LN&4&<&<&C&C&0$<$H$H 'D ' eg $ 69?99NJ6O2 $((*2<(/(--/  QOP  ((3 KK11":"F"F"W"WN L Q [ W,!()H!I !9!<!< =>"? $$IJJVV,
 	
 	w"R STABB+ $$IJJs   1A HH1c           	         | j                   j                         }|j                  dd       |j                         }	 t        j
                  j                  |      }|j                  dk7  r0|j                          t        j                  | t        d             nt        j                  | t        d             | j                   j                  d	      }| j                   j                         }|rL|d
k(  rGt        j
                  j#                         }|j%                         rt'        d|       S t)        d      S |r|dk(  r|| j                   j                  d      }t+        j,                  |      }||v r3|j/                  |       t1        t+        j,                  |      |      \  }	}
t'        d
 d| d| d      S t'        t3        d            S # t        j                  $ r# t        j                  | t        d             Y Ot        $ r# t        j                  | t        d             Y yt        $ r# t        j                  | t        d             Y w xY w)z
    function used to delete leave allocation request.

    Parameters:
    request (HttpRequest): The HTTP request object.
    id : leave allocation request id

    Returns:
    GET : return leave allocation request view template
    r   Nr   r  z/Leave allocation request deleted successfully..z"Approved request can't be deleted.z#Leave allocation request not found.zRelated entries existr   zleave-allocationz'/leave/leave-allocation-request-filter?r  r  z'/leave/detail-leave-allocation-request/r  r  rN  rI  )r   r<  r=  r   r:  r   r   rH  r   r   r   r   r   r   r   r   r   rc   r   r   r   r   r   r   r   r   )rZ   rD  rV  r   rC  r8  leave_allocationsr   r   r   r   s              rD   leave_allocation_request_deleter]    s    ;;##%L_d+ **,M<#9#A#A#E#E#E#P #**j8$++-LM NN7A&J$KL   !12IKK))+MY"442::>>@##%Em_UVV EFF	y$668M2^#!!&)/>

=)60,} 5m_B}oUcdrcs  tA  B
 	

  ?@AA9 ".. Jw"G HI Jw"G HI <w"9 :;<s   A>G 2I 'I 5'I I c                    | j                   j                  d      }|dk(  rd| j                  j                  d      rt        j
                  j                         }n*t        j
                  j                  | j                        }D cg c]  }t        |j                         }}|j                         }||d}t        |d      S c c}w )Nr   rc   r'  Gemployee_id__employee_work_info__reporting_manager_id__employee_user_idr  r  Fsafe)r   r   r>  r  rA  r   rc   r   r  r   r|  r   rZ   r   r  ro  r  r  r   s          rD   assigned_leave_selectre    s    ++//&)Ke<<  !<=&..224I&..55X_XdXd 6 I ,55CCK5L5//#K+KHGe,, 6   	C	c                 F   | j                   j                  d      }| j                   j                  d      }|rt        j                  |      ni }|dk(  r| j                  j                  d      r*t        |t        j                  j                               }n5t        |t        j                  j                  | j                              }|j                  }|D cg c]  }t        |j                         }}|j                         }||d}	t        |	      S y c c}w )Nr   r   rc   r'  r  r_  ra  )r   r   r   r   r>  r  r-  rA  r   rc   r   r   r  r   r|  r   
rZ   r   r  r  employee_filterfiltered_employeesro  r  r  r   s
             rD   assigned_leave_select_filterrk    s    ++//&)K{{x(H&.djj"BGe<<  !<=1."8"8"<"<">O 2'//66\c\h\h 7 O -///ABCFFBB(..0#/LG$$+   C   Dc                 z   | j                   d   }t        j                  |      }d}|D ]  }	 t        j                  j                  |      }|j                  }|j                  dk(  r|j                          |dz  }n.t        j                  | t        dj                  |                    |dkD  r/t        j                  | t        d	j                  |
                   t!        ddi      S # t        $ rB}t        j                  | t        dj                  t        |                         Y d}~d}~ww xY w)zA
    This method is used to delete a bulk of leave requests.
    r  r   r   r  r3  z%{}'s leave request cannot be deleted.zAn error occurred: {}.Nz/{count}  leave request(s) successfully deleted.)r|  rQ  rR  )r   r   r   rQ  r   r   r   rH  r   r   r   r   r   rL  r  r   r   )rZ   r  r|  r   r[  r   r   s          rD   leave_request_bulk_deletern    s%    ,,u
C
**S/CE P	P(00448H4IM$00H##{2$$&
=DDXNOP qy?FFUFST	

 I.//  	PNN7A&>&E&Ec!f&M$NOO	Ps   A?C//	D:87D55D:c                    | j                   j                  d      }|dk(  rd| j                  j                  d      rt        j
                  j                         }n*t        j
                  j                  | j                        }D cg c]  }t        |j                         }}|j                         }||d}t        |d      S c c}w )Nr   rc   rb  r_  ra  Frb  )r   r   r>  r  rQ  r   rc   r   r  r   r|  r   rd  s          rD   leave_request_selectrp  $  s    ++//&)Ke<<  !:;$,,002I$,,33X_XdXd 4 I ,55CCK5L5//#K+KHGe,, 6rf  c                 F   | j                   j                  d      }| j                   j                  d      }|rt        j                  |      ni }|dk(  r| j                  j                  d      r*t        |t        j                  j                               }n5t        |t        j                  j                  | j                              }|j                  }|D cg c]  }t        |j                         }}|j                         }||d}	t        |	      S y c c}w )Nr   r   rc   rb  r  r_  ra  )r   r   r   r   r>  r  rv  rQ  r   rc   r   r   r  r   r|  r   rh  s
             rD   leave_request_select_filterrr  8  s    ++//&)K{{x(H&.djj"BGe<<  !:;0,"6"6":":"<O 1%--44\c\h\h 5 O -///ABCFFBB(..0#/LG$$+   Crl  c           	         | j                   d   }t        j                  |      }|D ]  }	 t        j                  j                  |      }|j                  }|j                  dk(  r0|j                          t        j                  | t        d             n.t        j                  | t        dj                  |                    t        dd	i      S # t        $ r)}t        j                  | t        d             Y d}~d}~ww xY w)
z?
    This method is used to delete bulk of leaves requests
    r  r   r  zLeave request deleted.z/You cannot delete leave request with status {}.r  NrQ  rR  )r   r   r   rQ  r   r   rH  r   r   r   r   r   r   rL  r   )rZ   r  r   r[  rH  r   s         rD   user_request_bulk_deletert  V  s     ,,u
C
**S/C C	C(00448H4IM"))F##{2$$&  ./
 GNNvVWC" I.//  	CNN7A&@$ABB	Cs   BC	DD  Dc                 @   | j                   j                  d      }| j                  j                  }|dk(  r t        j
                  j                  |      }D cg c]  }t        |j                         }}|j                         }||d}t        |d      S c c}w )Nr   rc   r  ra  Frb  )r   r   r>  r?  rQ  r   r   r  r   r|  r   )rZ   r   r>  r  ro  r  r  r   s           rD   user_request_selectrv  r  s    ++//&)K<<$$De ((//D/A	+45CCK5L5//#K+KHGe,, 6s   Bc                    | j                   j                  d      }| j                   j                  d      }|rt        j                  |      ni }| j                  j
                  }|dk(  ryt        |t        j                  j                  |            }|j                  }|D cg c]  }t        |j                         }}|j                         }	||	d}
t        |
      S y c c}w )Nr   r   rc   r  r  ra  )r   r   r   r   r>  r?  r  rQ  r   r   r   r  r   r|  r   )rZ   r   r  r  r>  ri  rj  ro  r  r  r   s              rD   user_request_select_filterrx    s    ++//&)K{{x(H&.djj"BG<<$$De0l2299d9K

 -///ABCFFBB(..0#/LG$$  Cs   &C%c                    | j                   j                  d      }| j                  j                  d      }| j                   j                  d      }	 t        j                  |d      j                         }| j                  j                  dd       }| j                   j                  d      r| j                   j                  d      d   nd }| j                  j                  d      }|sd|v r| j                  j                  }|r1|r/t        j                  j                  ||	      j                         nd }|r|j                  nd}d}	|rst        | d
d|i      S | j                   j                  d      }|r|d   nd }t        j                  j!                  dd      j                  ||	      j                         }d}d}	d}
|r|j"                  }|j                  }|j%                         }|rV||k\  rQ|j'                  |      }	|j(                  dk(  rd}n)|j(                  dv r|j*                  |k  r|j*                  }||	z  }|j,                  rV|j.                  j0                  j                  d|t        j2                         j                               j5                         }
|||||	|
d}t        | d
|      S #  d }Y RxY w)Nr   r   rz  r  r   r   Refererr  r  z7leave/leave_request/employee_available_leave_count.htmlr8  zno carryforward)carryforwardr  r  )rH  r   r  )r8  r   r   r  forcasted_dayspending_requests)r   r   r   r   r  r   r  headersr>  r?  rA  r   r   r   r  r   r  r   rl  r0  r  carryforward_maxr  r   r  r  r|  )rZ   r   r8  start_date_strrz  r   refererr   r  r|  pending_requests_daysr   
next_resetr   s                 rD   employee_available_leave_countr    s    KKOOO4M  !12I[[__\2N&&~zBGGI
   !148I ;;}- 	M*1- 
 oo!!),G.'9ll// [ 	%%'[ 	& 	

%'  <K77PQN
E)$
 	
 ++%%m4K$/+a.TK 	--o}M	m	E	  N$22
*;;::<
*
2,==jIN++/@@#$ ,,0WW//2BB#-#>#> . ))$3$?$?$P$P$W$W"+ ( 0 5 5 7 %X % eg	 " &*,(1G JG [s   $K K	zbase.add_penaltyaccountsc           	         | j                   j                         }t        j                  j	                  |      }t        |j                        }t        j                  j                  |j                        }| j                  dk(  rt        | j                        }|j                         r|j                  }t               }||_        |j                  |_        |j                  |_        |j                   |_        |j"                  |_        |j$                  |_        |j'                          t               }t)        j*                  | d       t-        | d||||d      S )z5
    This method is used to create the penalties
    r   r  r  r   zPenalty/Fine addedz%leave/leave_request/penalty/form.html)	availabler   r   rd   )r   r   rQ  r   r   r   r   rA  r   r   r   r   r   r)   r   deduct_from_carry_forwardr   minus_leavespenalty_amountr   r   r   r   )rZ   instance_idr   r   r   r  penalty_instancepenaltys           rD   cut_available_leaver    s,    KK))+M##'';'7Hx';';<D&&--(:N:N-OI~~!',,/==?#}}%'G'/G$ :: - #+"6"6G$4$B$BG!#3#@#@G %5%D%DG"LLN%'DW&:;/" 		
	 	rL   c                 	   t         j                  j                  |      j                         }| j                  j
                  }t        |j                  |d      }| j                  j                  d      }|dk(  rdnd}| j                  j                         }| j                  dk(  rt        | j                        }|j                         r||j                  _        ||j                  _        |j#                          t$        j                  j                  |	      j'                  d
      }d}	|j)                         sd}	t        |j                  |d      }t+        j,                  | t/        d             t0        j                  j                  |j                        }
|
j)                         r|j                  j2                  j4                  	 p| j                  j
                  j                  |j                  j                  k(  r|j                  j2                  j4                  j6                  }t9        j:                  | j                  j
                  ||j                   dd|j                   d|j                   dd|j                   dd|j                   dt=        d      d|j                   z   d	       n| j                  j
                  j                  |j                  j2                  j4                  j                  k(  rc|j                  j6                  }t9        j:                  | j                  j
                  |dddddt=        d       d|j                   z   d	       n1|j                  j6                  |j                  j2                  j4                  j6                  g}t9        j:                  | j                  j
                  ||j                   dd|j                   d|j                   dd|j                   dd|j                   dt=        d      d|j                   z   d	       na|j                  j6                  }t9        j:                  | j                  j
                  |dddddt=        d       d|j                   z   d	       t?        | d!||	||d"      S t?        | d!||||||d#      S )$zP
    This method renders form and template to create Leave request comments
    r   r   r  r  targetr  r  user-request-filterr   r  -created_atFTComment added successfully!r  z('s leave request has received a comment.u   تلقت طلب إجازة     تعليقًا.z-s Urlaubsantrag hat einen Kommentar erhalten.zLa solicitud de permiso de  ha recibido un comentario.u   La demande de congé de     a reçu un commentaire.r/  r0  chatbox-ellipsesr   r!  r"  r#  r$  r%  r   r&  z*Your leave request has received a comment.u,   تلقى طلب إجازتك تعليقًا.z/Ihr Urlaubsantrag hat einen Kommentar erhalten.z2Tu solicitud de permiso ha recibido un comentario.u/   Votre demande de congé a reçu un commentaire.r  &leave/leave_request/leave_comment.html)commentsno_commentsr  r[  )r   r  rd   r  urlr[  ) rQ  r   r   r   r>  r?  LeaverequestcommentFormr   r   r   r   r   r   r   r   r   r  r   r  r  r   r   r   r   EmployeeWorkInformationrO  rP  rI  r=   rM  r   r   )rZ   leave_idr\  ro  r   r  r  r   r  r  	work_inforecs               rD   create_leaverequest_commentr    sf      ''8'4::<E
,,
#
#C" #h?D [[__X&F$6
<QCKK))+M~~&w||4==?(+DMM%',DMM$IIK*2299X9NWWH  K??$"*(+hGD Wa(E&FG/77>>!-- ? I !%%88MM  ||0033u7H7H7K7KK!--@@UUff  #LL55&)$)$5$5#66^!_&A%BSBSATTd$e','8'8&99f$g&A%BSBSATTo$p&>u?P?P>QQi$j%,^%<ehhZ?P%P!3
  1144 ,,??TTWWX $//@@#LL55&)!M$R$U$X$U%,-@%Ad588*DU%U!3
 "-->>!--@@UUff #LL55&)$)$5$5#66^!_&A%BSBSATTd$e','8'8&99f$g&A%BSBSATTo$p&>u?P?P>QQi$j%,^%<ehhZ?P%P!3
  ++<<CKK11"%I N Q T Q!()<!=$uxxj@Q!Q/
 8 (#."*%*		 	 0""	
 rL   c                    t         j                  |      }| j                  j                  |j                  k(  sQ| j                  j                  d      s6t        |       s+t        j                  | t        d             t        | d      S t        j                  j                  |      j                  d      }d}|j                         sd}| j                   r| j                   j#                  d      }| j$                  d	   }t        j                  j'                  |
      }g }|D ]4  }	t)               }
|	|
_        |
j-                          |j/                  |
       6  |j0                  j2                  |  t        | d|||d      S )z<
    This method is used to show Leave request comments
    zleave.view_leaverequestcommentr*  decorator_404.htmlr  r  FTfiles
comment_idr   r  )r  r  r[  )rQ  r   r>  r?  r   r  r%   r   r  r   r   r  r   r   r  r   r   r  r   r   LeaverequestFilerm  r   rb   r  r   )rZ   r  r[  r  r  r  r  r  attachmentsrm  file_instances              rD   view_leaverequest_commentr    s_    !%%h/M!!]%>%>><<  !ABw'!$?"@Ag344"**11X1FOOH K??}}%%g.[[.
%--11Z1@ 	.D,.M!%M }-		.
 	;'0 &*	
 rL   c                 V	   | j                   j                         }t        j                  j	                  |      j                         }| j                  j                  }t        |j                  |d      }| j                  dk(  rt        | j                        }|j                         r||j                  _        ||j                  _        |j!                          t"        j                  j	                  |      j%                  d      }d}|j'                         sd}t        |j                  |d      }t)        j*                  | t-        d	             t.        j                  j	                  |j                  
      }|j'                         r|j                  j0                  j2                  	 p| j                  j                  j                  |j                  j                  k(  r|j                  j0                  j2                  j4                  }	t7        j8                  | j                  j                  |	|j                   dd|j                   d|j                   dd|j                   dd|j                   dt;        d      d|j                   z   d	       n| j                  j                  j                  |j                  j0                  j2                  j                  k(  rc|j                  j4                  }	t7        j8                  | j                  j                  |	dddddt;        d      d|j                   z   d	       n1|j                  j4                  |j                  j0                  j2                  j4                  g}	t7        j8                  | j                  j                  |	|j                   dd|j                   d|j                   dd|j                   dd|j                   dt;        d      d|j                   z   d	       na|j                  j4                  }	t7        j8                  | j                  j                  |	dddddt;        d      d|j                   z   d	       t=        | d|||d      S t=        | d|||d      S )zU
    This method renders form and template to create Allocation request comments
    r   r  r  r   r  r  FTr  r  z3's leave allocation request has received a comment.u/   تلقت طلب تخصيص الإجازة لـ r  z<s Anfrage zur Urlaubszuweisung hat einen Kommentar erhalten.u+   La solicitud de asignación de permisos de r  u%   La demande d'allocation de congé de r  rI  r0  r  r  z5Your leave allocation request has received a comment.uI   تلقى طلب تخصيص الإجازة الخاص بك تعليقًا.z=Ihr Antrag auf Urlaubszuweisung hat einen Kommentar erhalten.uB   Tu solicitud de asignación de permisos ha recibido un comentario.u<   Votre demande d'allocation de congé a reçu un commentaire.<leave/leave_allocation_request/leave_allocation_comment.htmlr  r  r  )r   r  rd   )r   r   r:  r   r   r   r>  r?  !LeaveallocationrequestcommentFormr   r   r   r   r   r   r  r   LeaveallocationrequestCommentr  r   r   r   r   r  rO  rP  rI  r=   rM  r   r   )
rZ   r  r   r\  ro  r   r  r  r  r  s
             rD    create_allocationrequest_commentr    sQ    KK))+M"**11X1>DDFE
,,
#
#C, #h?D ~~0>==?(+DMM%',DMM$IIK4<<CC# D h}%   K??$"4(+hGD Wa(E&FG/77>>!-- ? I !%%88MM  ||0033u7H7H7K7KK!--@@UUff  #LL55&)$)$5$5#66i!j&UV[VgVgUhhx$y','8'8&99u$v&QRWRcRcQdd  %A&KEL]L]K^^v$w%,-L%M $UXXJ/&0!3  1144 ,,??TTWWX $//@@#LL55&)!X$o$c$h$b%,-L%M $UXXJ/&0!3 "-->>!--@@UUff #LL55&)$)$5$5#66i!j&UV[VgVgUhhx$y','8'8&99u$v&QRWRcRcQdd  %A&KEL]L]K^^v$w%,-L%M $UXXJ/&0!3  ++<<CKK11"%T k _ d ^!()H!I 
+",/ N (#."*  FX]C rL   c           	         t         j                  |      }| j                  j                  |j                  k(  sQ| j                  j                  d      s6t        |       s+t        j                  | t        d             t        | d      S t        j                  j                  |      j                  d      }d}|j                         sd}| j                   r| j                   j#                  d      }| j$                  d	   }t        j                  j'                  |
      }g }|D ]4  }	t)               }
|	|
_        |
j-                          |j/                  |
       6  |j0                  j2                  |  t        | d||||d      S )zA
    This method is used to show Allocation request comments
    z(leave.view_leaveallocationrequestcommentr*  r  r  r  FTr  r  r   r  )r  r  r  leave_alloc_request)r:  r   r>  r?  r   r  r%   r   r  r   r   r  r   r   r  r   r   r  r   r   r  rm  r   rb   r  r   )rZ   r  r  r  r  r  r  r  r  rm  r  s              rD   view_allocationrequest_commentr  7  sh    155h?!!%8%D%DD<<  !KLw'!$?"@Ag344,44;; < h}  K??}}%%g.[[.
/77;;z;J 	.D,.M!%M }-		.
 	;'F &"#6		
	 	rL   c                    d}t         j                  |      }|j                  j                  }| j                  j
                  |j                  k(  s&| j                  j                  d      st        |       r:|j                          t        j                  | t        d             t        |      S d| d}t        j                  | t        d             t        |      S )zC
    This method is used to delete Allocation request comments
    r  z*leave.delete_leaveallocationrequestcommentComment deleted successfully!zJ
                    <span hx-get="/leave/allocation-request-view-comment/zK/" hx-target="#commentContainer" hx-trigger="load"></span>
                r*  )r  r   r  r   r>  r?  r   r  r%   r   r   r   r   r  r   )rZ   r  scriptr  r  s        rD    delete_allocationrequest_commentr  d  s     F+00<G##&&J!!W%8%88<<  !MNw'!$C"DE 	JJT V 	!$?"@ArL   c                 D   d}| j                   j                  d      }| j                   d   }| j                   d   }t        j                  |      }| j                  j
                  |j                  k(  s&| j                  j                  d      st        |       rXt        j                  j                  |      j                          t        j                  | t        d             t#        |      S t        j                   | t        d             d	| d
}t#        |      S )#
    Used to delete attachment
    r  r  r  r  leave.delete_leaverequestfiler   File deleted successfullyr*  zF
                <span hx-get='/leave/allocation-request-view-comment/zK/' hx-target='#commentContainer' hx-trigger='load'></span>
                )r   r  r  r   r>  r?  r   r  r%   r  r   r   r   r   r   r   r  r   rZ   r  r  r  r  r  s         rD   delete_allocation_comment_filer  |  s    
 F
++

e
$C{{:&H\*J+00<G!!W%8%88<<  !@Aw'  ''s'3::<!$?"@A 	 	!$?"@AFFNZ P rL   c                    t        t        |      }|j                  dk(  s|j                  dk(  r\t        j                  j	                         }t        j                  j	                         }t        j                  j	                         }nJt        j                  j                  t        |j                  j                  j                        t        |j                  j                  j                        z  t        |j                  j                  j                        z  |j                  |j                        j                  |      j                  t        d      t        d      z        }|j                  |j                  j                  j                        }|j                  |j                  j                  j                        }t        | j                   |      j"                  }t%        || j                   j'                  d	            }t)        j*                  |j,                  D cg c]  }|j.                   c}      }t1        | d
||t3        j4                         |||d      S c c}w )zA
    This method is used to filter or view the leave clashes
    r   r  ro  r  )0employee_id__employee_work_info__job_position_id)+employee_id__employee_work_info__company_id)start_date__lteend_date__gtern  r   z&leave/leave_request/leave_clashes.html)r[  ra  rt  r   clashed_due_to_departmentclashed_due_to_job_position)r   rQ  rH  r   r   r   r   r   rO  r  job_position_idr  r{  rz  r   rv  r   r   r   r   r   r   r}  r   r   r   r  )	rZ   r   recordoverlapping_requestsr  r  r  r   r   s	            rD   view_clashesr    s    |0@AF}}
"fmm{&B+3388:$0$8$8$=$=$?!&2&:&:&?&?&A#   ''GMGYGYGlGlGzGz IOI[I[InInI~I~ @F@R@R@e@e@p@p
 !'$// (  W(W)WQk*Qj-AAB# 	( %9$?$?;A;M;M;`;`;n;n %@ %
! ';&A&A=C=O=O=b=b=r=r 'B '
# .gkk;OPSS()=w{{v?VW::%9%E%EFFL 0#+ JJL()B+F	
  	Gs   8I8zleave.view_leavegeneralsettingc                    t         j                  j                         xr( t         j                  j                         j                  }t
        j                  j                  dddd      \  }}||d}t        | d|      S )NTzCompensatory Leave Typepaid)r`   payment)r   defaults)enabled_compensatoryr   zcompensatory_settings.html)r   r   r   r   r   r   get_or_creater   )rZ   r  r   creater   s        rD   r   r     s     	##**, 	C''--/BB  #**88"3G 9 J (<:VG'7AArL   zleave.add_leavegeneralsettingc                    t         j                  j                         }|r|n	t               }d| j                  j	                         v |_        |j                          d| j                  j	                         v r*t        j                  | t        d             t        d      S t        j                  | t        d             t        d      S )zN
    This method is used to enable/disable the compensatory leave feature
    r   z+Compensatory leave is enabled successfully!z,Compensatory leave is disabled successfully!r  )r   r   r   r   rf   r   r   r   r   r   r   )rZ   r   s     rD   enable_compensatory_leaver    s     -44::<06I6K  -AGKKDTDTDV,V)w{{//11!$Q"RS  	!$R"STrL   c                    d}t         j                  |      }| j                  j                  |j                  k(  s&| j                  j                  d      st        |       r:|j                          t        j                  | t        d             t        |      S t        j                  | t        d             d|j                  j                   d}t        |      S )z>
    This method is used to delete Leave request comments
    r   leave.delete_leaverequestcommentr  r*  =
            <span hx-get="/leave/leave-request-view-comment/\/?&amp;target=leaveRequest" hx-target="#commentContainer" hx-trigger="load"></span>
        )r  r   r>  r?  r   r  r%   r   r   r   r   r  r  r   r   )rZ   r  r  r  s       rD   delete_leaverequest_commentr    s     F!&&z2G!!W%8%88<<  !CDw'!$C"DE 	 	!$?"@A==D=O=O=R=R<S T	 rL   c                 D   d}| j                   j                  d      }| j                   d   }| j                   d   }t        j                  |      }| j                  j
                  |j                  k(  s&| j                  j                  d      st        |       rXt        j                  j                  |      j                          t        j                  | t        d             t#        |      S t        j                   | t        d             d	| d
}t#        |      S )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  s         rD   delete_leave_comment_filer    s    
 F
++

e
$C{{:&H\*J!&&z2G!!W%8%88<<  !@Aw'  ''s'3::<!$?"@A 	 	!$?"@A==EJ G	 rL   
attendance)CompensatoryLeaveRequestCompensatoryLeaverequestCommentc                 h   | j                   j                  d      rt        j                  j                  | j                   j                  d            }t	        |      }t        |j                  dd            }t               }||j                  d   _	        t        dd|i      }t        |       S y)	z
        function used to return attendance dates that taken on leave days .

        Parameters:
        request (HttpRequest): The HTTP request object.

        Returns:
        GET : return attendance dates
        r   r   r   attendance_dateattendance_idz+leave/compensatory_leave/attendance_id.htmlr   N)r   r   r*   r   get_leave_day_attendancer   r   CompensatoryLeaveFormr   choicesr   r   )rZ   r   holiday_attendanceattendance_datesr   r  s         rD   get_leave_attendance_datesr  (  s     ;;??=)''++w{{}/M+NH!9(!C#"..t5FG  )*D3CDKK(0,=DM  =/33 *rL   c                 @   | j                   j                  d      }t        j                  j	                  |      j                          | j                   d   }t        j                  j                         }| j                  j                  d      s|j	                  | j                        }| j                   j                  d      r$|j	                  |      j                  d      }d	}n#|j	                  |      j                  d      }d
}t        | |||d      S )z+
        Used to delete attachment
        r  r   r  ,leave.delete_compensatoryleaverequestcommentemployee_id__employee_user_idr   r  r  8leave/compensatory_leave/compensatory_leave_comment.htmlr  )r  r  )r   r  r  r   r   r   r  rc   r>  r  r   r  r   )rZ   r  r  r  r  s        rD    delete_comment_compensatory_filer  D  s    
 kk!!%(  ''s'3::<;;z*2::>>@||$$%STW\\RH;;??>*(;DD]SHQH(;DD]SH?H$&
 	
rL   c                 \   | j                   j                  d      rZt        j                  j	                  |      }| j
                  j                  d      s|j	                  | j
                        }d}nYt        j                  j	                  |      }| j
                  j                  d      s|j	                  | j
                        }d}|j                         j                  j                  }|j                          t        j                  | t        d             t        ||      S )	zF
        This method is used to delete Leave request comments
        r   r   r  r  zview-compensatory-leave-commentr  zleave-request-view-commentr  )r   r   r  r   r   r>  r  r  r   r  r   r   r   r   r   r   )rZ   r  r  r   r  s        rD   (delete_leaverequest_compensatory_commentr  ^  s     ;;??>*5==DD
DSG<<((> "..w||.T<L)1188J8GG<<(()KL!..w||.T7L==?--00!$C"DEh//rL   c           	         | j                   j                  }t        j                  j	                         j                  d      }t        | j                  |      j                  }t        | |d      }| j                  j                  d      }t        ||      }t        j                  t        |j                  j!                  dd                  }t        j                  j#                  |j$                        j                  d      }t        | j                  |      j                  }| j                  j                  d      }t        ||      }t        j                  t        |j                  j!                  dd                  }t               }	| j                  j'                         }
t)        |
      }t+        t        |      }|||
|	j,                  |t.        j0                  ||d	}t3        | d
|      S )z
        function used to view compensatory leave requests.

        Parameters:
        request (HttpRequest): The HTTP request object.

        Returns:
        GET : return compensetory leave request view template
        rd  z#leave.view_compensatoryleaverequestr   r   Tr   r  r6  )my_comp_leave_requestscomp_leave_requestsrd   r   r   rs  r   r9  z5leave/compensatory_leave/compensatory_leave_view.html)r>  r?  r  r   rc   r  CompensatoryLeaveRequestFilterr   r   r"   r   r   r   r   r   r}  r   r   r   r   r   r#   r   r<  r   r   )rZ   r   r   r   r  r   r  r=  r9  comp_leave_requests_filterr   r   r   s                rD   view_compensatory_leaver  u  s    <<,,+33779BB5I1'++xHKK%XD
 kkoof-+HkBzz$00<<T<MN
 ":!A!A!H!H  "I "

(5/ 	 "@KK/"

" 	 !2!./E~!V**'33??4?PQ
 &D%E"--/]+	%&>	J	&<#6.33$6==(.	
 Lg
 	
rL   c                    | j                   j                  d      }| j                  j                  }| j                   j                  d      }| j                   j                  d      }| j                   j	                         }d}t        | j                         j                  j                  d      }t        j                  j                  |j                        j                  d      }t        | j                   |      j                  }t        | |d      }| j                   j                  d      rt        | |d      }t        | |d      }|rt        |||d      }	t        |||d      }
|	D cg c]  }|d	   	 }}|D cg c]  }|j                  D ]  }|j                   ! }}}t!        j"                  t%        |            }|
D cg c]  }|d	   	 }}|D cg c]  }|j                  D ]  }|j                   ! }}}t!        j"                  t%        |            }d
}nt'        ||      }	t'        ||      }
t!        j"                  t%        |	j                  j)                  dd                  }t!        j"                  t%        |
j                  j)                  dd                  }t+        |      }t-        t        |      }|j/                  dd       |	|
|||||d}t1        | ||      S c c}w c c}}w c c}w c c}}w )zD
        function used to view compensatory leave requests.
        r   r   r6  z9leave/compensatory_leave/compensatory_leave_req_list.htmlrd  r  r5  r&   r   rO  r   Tr   N)r  r  rd   r   r   r   r9  r  )r   r   r>  r?  r   r  r   r  r  r   r   r   r"   r&   r1   r}  r   r   r   r   r   r   r#   r=  r   )rZ   r   r   r   r=  r   r  comp_leave_requests_filteredmy_comp_leave_requests_filteredr  r  r  r  rw   r   r  r   r9  r   r   s                       rD   filter_compensatory_leaver    s    (<<,,kkoof- 2--/N (FKK(

"XXe_ 	% +C*J*J*Q*Q  +R +

(5/ 	( +IKK8+

" 	( (:13V(
$
 ;;??8$+15x,( /58(/+
 "3,e[&# &7/&"
 7JJU5=JKJ)4 %UEVEV9AG   ::d7m4L6LMU5=MKM)4 %UEVEV9AG  #jjg7OW  #0,k# &3/&"  ::(44@@D@QRL #jj+77CCDtCTUO
 ]+	%&>	J	h% $7&<$(.
 gx99U K
 Ns   /K5$K:L $Lc                    | j                   j                  }d}d}|dk7  r t        j                  j	                  |      }t        |      }| j                  dk(  rt        | j                  |      }|j                         r|j                         }t        |j                  |j                  j                               |_        |j                          |dk7  r*t        j                   | t#        d             t%        d      S t        j                   | t#        d             t%        d      S ||d	}t'        | ||      S )
a  
        function used to create or update compensatory leave request.

        Parameters:
        request (HttpRequest): The HTTP request object.

        Returns:
        GET : return leave allocation request form template
        POST : return leave allocation request view
        z-leave/compensatory_leave/comp_leave_form.htmlNr   r   r   zCompensatory Leave updated.zCompensatory Leave created.r2  )r   r   )r>  r?  r  r   r   r  r   r   r   r   r6   r   r  rc   rC  r   r   r   r   r   )rZ   comp_idr   r  r   r   comp_reqr   s           rD   create_compensatory_leaver    s    <<,,Bd?/77;;w;GH$h7>>V#(ID}}99;*9(((*@*@*D*D*F+' d?$$Wa0M.NO $$PQQ $$Wa0M.NO#$PQQ !
 gx11rL   z%leave.delete_compensatoryleaverequestT)r  rk  manager_accessc                 Z   	 t         j                  j                  |      j                         }t	        j
                  | t        d             | j                  j                  d      dk(  rt        t              S t        d      S #  t	        j                  | t        d             Y [xY w)z
        function used to delete compensatory leave request,
        and reload the list view of compensatory leave requests.
        r   z#Compensatory leave request deleted.Sorry, something went wrong!r   rB  r  )r  r   r   r   r   r   r   r   r   r   r  r   rZ   r  comp_leave_reqs      rD   delete_compensatory_leaver  ,  s    	G5==AAWAMTTVNWa(M&NO ;;??6"f,566 EFF	GNN7A&D$EFs   AB !B*z%leave.change_compensatoryleaverequest)r  c                    	 t         j                  j                  |      }|j                  dk(  rd|_        |j	                          |j                          t        j                  | t        d             t        j                  t              5  t        j                  | j                  j                  |j                   j"                  ddddd	t%        d
      d|j&                   z          ddd       nt        j(                  | t        d             | j,                  j                  d      rt/        d      S t1        t2              S # 1 sw Y   >xY w#  t        j*                  | t        d             Y dxY w)z
        function used to approve compensatory leave request,
        and reload the list view of compensatory leave requests.
        r   r  r  z$Compensatory leave request approved.z1Your compensatory leave request has been approveduQ   تمت الموافقة على طلب إجازة الاعتذار الخاص بكz0Ihr Antrag auf Freizeitausgleich wurde genehmigtz6Su solicitud de permiso compensatorio ha sido aprobadau8   Votre demande de congé compensatoire a été approuvéeview-compensatory-leaver0  r   r!  r"  r#  r$  r%  r   Nz@The compensatory leave request is not in the 'requested' status.r  
individualr  )r  r   r   rH  assign_compensatory_leave_typer   r   r   r   rJ  rK  rL  r=   rM  r>  r?  r   rI  r   r   r  r   r   r   r   r  r  s      rD   approve_compensatory_leaver  D  sD   	G5==AAWAMN$$3(2%==?##%  !,R*ST((3 KK11"0"<"<"M"MP s R X Z!()B!C !2!2 34"5
  Z ;;??<( EFF122/ &	GNN7A&D$EFs%   BE AE/(E EE !E;c                 h   t         j                  j                  |      }|j                  dk(  s|j                  dk(  r4t	               }| j
                  dk(  r
t	        | j                        }|j                         r|j                  d   |_	        d|_        |j                          |j                          t        j                  | t        d             t        j                   t"              5  t%        j&                  | j(                  j*                  |j,                  j.                  dd	d
ddt1        d      d|j2                   z          ddd       t5        d      S t7        | d||d      S t        j8                  | t        d             t5        d      S # 1 sw Y   t5        d      S xY w)a'  
        function used to Reject compensatoey leave request.

        Parameters:
        request (HttpRequest): The HTTP request object.
        comp_id : compensatory leave request id

        Returns:
        GET : It returns to the default compensatory leave request view template.

        r   r  r  r   r  r  z$Compensatory Leave request rejected.z1Your compensatory leave request has been rejectedu6   تم رفض طلبك للإجازة التعويضيةz0Ihr Antrag auf Freizeitausgleich wurde abgelehntz5Se ha rechazado su solicitud de permiso compensatoriou6   Votre demande de congé compensatoire a été rejetéer  r0  r  Nr  z=leave/compensatory_leave/compensatory_leave_reject_form..html)r   r  rX  )r  r   r   rH  "CompensatoryLeaveRequestRejectFormr   r   r   r  r  exclude_compensatory_leaver   r   r   r   rJ  rK  rL  r=   rM  r>  r?  r   rI  r   r   r   r   r   )rZ   r  r   r   s       rD   reject_compensatory_leaver  m  sy     299===I  K/>3H3HJ3V57D~~'9',,G==?373D3DX3NN0,6N)"==?"'')$$Wa0V.WX#,,Y7 #LL55&4&@&@&Q&Q!T$\$V$[$\%,-F%G $^%6%6$78&9
 ((MNNO'2  NN7A&V$WX EFF) ((MNNs   2AFF1c                 4   | j                   j                  d      }|r$t        j                  |      }t	        ||      \  }}t
        j                  j                  |      }|t        | j                   j                  d            |d}t        | d|      S )a#  
        function used to present the compensatory leave request detailed view.

        Parameters:
        request (HttpRequest): The HTTP request object.
        comp_leave_id : compensatory leave request id

        Returns:
        return compensatory leave request single view
        r   r   rA  )r   rA  r   r   r   z:leave/compensatory_leave/individual_view_compensatory.htmlr  )	r   r   r   r   r   r  r   r    r   )rZ   comp_leave_idr   r   r   r   r   r   s           rD   "compensatory_leave_individual_viewr    s     $KKOOO<::&78L#2<#O K199===O,'(EF.#
 H
 	
rL   c                    t         j                  j                  |      j                  d      }d}|j	                         sd}| j
                  r| j
                  j                  d      }| j                  d   }t         j                  j                  |      }g }|D ]4  }t               }	||	_
        |	j                          |j                  |	       6  |j                  j                  |  t        | d|||d	      S )
zD
        This method is used to show Leave request comments
        r  r  FTr  r  r   r  r  )r  r   r   r  r   r   r  r   r   r  rm  r   rb   r  r   r   )
rZ   r  r  r  r  r  r  r  rm  r  s
             rD   view_compensatory_leave_commentr    s     3::AA$ B 

(=
! 	  K==MM))'2E \2J5==AAZAPGK 2 0 2%)"""$""=1	2
 GMM{+F$*+
 	
rL   c                 	   t         j                  j                  |      j                         }| j                  j
                  }t        |j                  |d      }| j                  j                  d      }|dk(  rdnd}| j                  j                         }| j                  dk(  rt        | j                        }|j                         r||j                  _        ||j                  _        |j#                          t$        j                  j                  |	      j'                  d
      }d}	|j)                         sd}	t        |j                  |d      }t+        j,                  | t/        d             t0        j                  j                  |j                        }
|
j)                         r|j                  j2                  j4                  	 r| j                  j
                  j                  |j                  j                  k(  r|j                  j2                  j4                  j6                  }t9        j:                  | j                  j
                  ||j                   dd|j                   dd|j                   dd|j                   dd|j                   dt=        d      d|j                   z   d	       n| j                  j
                  j                  |j                  j2                  j4                  j                  k(  rc|j                  j6                  }t9        j:                  | j                  j
                  |ddddd t=        d      d|j                   z   d	       n2|j                  j6                  |j                  j2                  j4                  j6                  g}t9        j:                  | j                  j
                  ||j                   d!d"|j                   dd|j                   dd#|j                   dd|j                   dt=        d      d|j                   z   d	       na|j                  j6                  }t9        j:                  | j                  j
                  |ddddd t=        d      d|j                   z   d	       t?        | d$||	|d%      S t?        | d$|||||d&      S )'z]
        This method renders form and template to create Compensatory leave comments
        r   r  r  r  r  r  r  r   r  r  FTr  r  z5's Compensatory leave request has received a comment.u1   تلقى طلب إجازة الاعتذار لـ r  z%Der Antrag auf Freizeitausgleich von z hat einen Kommentar erhalten.z)La solicitud de permiso compensatorio de r  u&   La demande de congé compensatoire de r  r  r0  r  r  z7Your compensatory leave request has received a comment.uE   تلقى طلب إجازة العوض الخاص بك تعليقًا.z>Ihr Antrag auf Freizeitausgleich hat einen Kommentar erhalten.z@Su solicitud de permiso compensatorio ha recibido un comentario.u=   Votre demande de congé compensatoire a reçu un commentaire.z5's compensatory leave request has received a comment.u/   تلقى طلب إجازة التعويض لـ z&El pedido de permiso compensatorio de r  r  )r   r  rd   r  r  ) r  r   r   r   r>  r?  #CompensatoryLeaveRequestcommentFormr   r   r   r   r   r   r   r   r   r  r   r  r  r   r   r   r   r  rO  rP  rI  r=   rM  r   r   )rZ   r  
comp_leavero  r   r  r  r   r  r  r  r  s               rD   !create_compensatory_leave_commentr    s    .55<<<NTTV
ll''2$'FF*E
 *"(N":@U--/>>V#6w||DD}},/)+5(		:BBII) J (=)  $("&K:,/FF*M   !,I*JK3;;BB * 6 6 C 	 ##%"..AAVV#$ #<<4477:;Q;Q;T;TT * 6 6 I I ^ ^ o o   #KK ' 9 9*-(2(>(>'??t%u*[\f\r\r[s  tD  )E*OPZPfPfOg  hF  )G*ST^TjTjSk  lG  )H*PQ[QgQgPh  iA  )B)01J)K$("8*9%7 $LL5588)55HH]]``a #-"8"8"I"IC"KK ' 9 9*-%^(o(h(j(g)01J)K$("8*9%7 !+ 6 6 G G * 6 6 I I ^ ^ o o#C #KK ' 9 9*-(2(>(>'??t%u*YZdZpZpYq  rB  )C*OPZPfPfOg  hF  )G*PQ[QgQgPh  iD  )E*PQ[QgQgPh  iA  )B)01J)K$("8*9%7 )44EE#LL55&)!Z$k$d$f$c%,-F%G $Z]]O4&5!3 N$,'2&3  F+# 

 
	
rL   rg  c                    | j                   j                  d      }| j                   j                  d      }| j                   j                  d      }	 t        j                  |d      }t        j                  |d      }||z
  }t	        |j
                  dz         D cg c]  }|t        |      z    }}t        dd	      }	|	j                  j                  ||
      }
dt        |
j                  dd            i}t        |      S c c}w # t        $ r*}t        j                  |       t        |      cY d }~S d }~ww xY w)Nrz  r{  r   r  r3  r  rg  rh  ri  )r   interview_date__inr  candidate_id__nameTr   )r   r   r   r  r  r  r   r3   r   r   r   r   r   rL  r,   r   )rZ   rz  r{  r   start_date_objend_date_objdeltar  	date_listr  r  r\   r   s                rD   check_interview_conflictsr  a  s1   [[__\2
;;??:.kkoom4	#%..z:FN#,,XzBL"\1E<A%**q.<Q78!22I  !8'/B! +2299'I : J
 d**+?d*KH
  ))!"  	#LLO?"	#s2   AD D	4AD 	D 	ED<6E<Ec                 6   t         j                  j                         }|s t         j                  j                  d      }| j                  dk(  r<| j
                  j                  d      }|rd|_        nd|_        |j                          t        | dd|i      S )NT)enabledr   r  Fz,leave/settings/past_leave_restrict_view.htmlenabled_restriction)
EmployeePastLeaveRestrictr   r   r  r   r   r   r  r   r   )rZ   r  r  s      rD   employee_past_leave_restrictionr!    s     4;;AAC7??FFtFT~~,,""9-*.'*/'  "6	 34 rL   c           
         | j                   }| j                   j                  }t        j                  d      rt        j
                  j                  |      }|j                  j                         j                  d      }t        j
                  j                         rGt        j
                  j                         j                  r|j                  j                         }nd}d}|r-t        j                  |D cg c]  }|j                   c}      nt        j                  g       }t!        j"                         }t$        j'                         }t)        | d|||||d      S c c}w )z>
    This method is used to view own profile of employee.
    r\  r  Tr  Nz"employee/profile/profile_view.html)r   r  leave_request_idsrt  now)r>  r?  r
   ry  rQ  r   r   r   rc   r   r   r   r   r   r   r   r   r  timezoner$  r   )	rZ   r>  r   	instancesr  r   r#  r  r$  s	            rD   employee_profile_leave_tabr'    s+   
 <<D||((H! ((//H/E	..224<<15 = 
  ''--/#++113FF"22668K	  	

	:HHKK:;ZZ^ 
 NNE
,,.C, &!2!	

 
 ;s   <E&c                 @   t         j                  j                  |      }t        j                  d      r t
        j                  j                  |      nd}|r-t        j                  |D cg c]  }|j                   c}      nt        j                  g       }|j                  j                         }| j                  j                  dg       }t         j                  j                  |      }	t        j                  t        |	| j                  j                  d            j                  D cg c]  }|j                   c}      }
t!        |
t"              rt%        j&                  |
      n|
}|j                  }d}d}t)        |      D ]8  \  }}||k(  s|t+        |      dz
  k(  rd}n||dz      }|d	k(  rd}n||dz
     } n ||||t-        j.                         |d
}| j0                  j2                  |k(  r||d<   n||d<   t5        | d|      S c c}w c c}w )z=
    This method is used to view profile of an employee.
    r   r\  r  Nrj  r   r   r3  r   )r   r   r   r   rt  r#  r  employee_leavesztabs/leave-tab.htmlr  )r*   r   r   r
   ry  rQ  r   r   r   r   r   rc   r  r   r   r}  
isinstancer  astliteral_eval	enumerater;  r   r  r>  r?  r   )rZ   pkr   r   r&  r   r#  r)  filtered_employee_idsrj  request_ids_strr   r   r   r   rV   rD  r   s                     rD   "employee_view_individual_leave_tabr1    s   
 ##r#*H W% 	###9   	

	:HHKK:;ZZ^ 
 ..224O#OO//0DbI!))008M0Njj *"GKKOOF$;k		
 KK	
O os+ 	)  ++KKG"<0 v[ L)A--&uqy1z"*5195 $

.G ||  H,!0%4!"'0'BBo ;	
s   -H2Hc                 h   | j                   j                         }| j                   j                  d      }t        j                  j                  ddt        j                               }t        | |d      }t        j                  j                  dd      }|rA|D  cg c]  } | j                  j                   }} |D cg c]  }|j                  |vs| }}t        ||      }t        j                  |D cg c]  }|j                   c}      }t         d|||d	      S c c} w c c}w c c}w )
Nr   r  T)rH  r	  r  r  Fre  z*leave/dashboard/leave_request_approve.html)r_  r   rd   )r   r   r   rQ  r   r   r   r  r"   r  r   r   r   r   r   r   )	rZ   r   r   r_  r  r  r\  r   leave_requests_idss	            rD   leave_request_and_approver4    s1   KK))+M++//&)K!))00#

 1 N
 (!<N
 ;BBIIu J  @VWWW--00W	W  .
1JE
 
 #>;?N$PXX[[$PQ4,.	
	 	 X

 %Qs   D%D*D*:D/c                 f   | j                   j                         }| j                   j                  d      }t        j                  j                  dd      }t        | |d      }t        ||      }t        j                  |D cg c]  }|j                   c}      }t        | d|||d      S c c}w )Nr   r  T)rH  r	  r5  z-leave/dashboard/leave_allocation_approve.html)allocation_reqestsreqests_idsrd   )r   r   r   r:  r   r   r"   r   r   r   r   r   )rZ   r   r   r6  r   allocation_reqests_idss         rD   leave_allocation_approver9  +  s    KK))+M++//&)K/77>>4 ?  ,#%H ''9;G!ZZ%788 7"41	
	 	 	9s   B.r2  )Fr@   )__doc__r+  rJ  r   collectionsr   r   r   r   ior   urllib.parser   r	   pandasrd   django.appsr
   django.contribr   django.core.paginatorr   	django.dbr   django.db.modelsr   r   django.httpr   r   django.shortcutsr   r   r   django.urlsr   django.utils.encodingr   django.utils.translationr   r   r   r   django.views.decorators.httpr   	xhtml2pdfr   base.filtersr   
base.formsr   base.methodsr   r   r    r!   r"   r#   r$   r%   r&   base.modelsr'   r(   r)   employee.modelsr*   horilla.decoratorsr+   r,   r-   r.   r/   r0   horilla.group_byr1   horilla.horilla_settingsr2   horilla.methodsr3   r4   leave.decoratorsleave.filtersleave.formsleave.methodsr6   r7   r8   r9   r:   leave.modelsr;   leave.threadingr<   notifications.signalsr=   r}   r   r   r   r   r   r   r   r   r  ra  r  r  r  r  r  r  r  r  r  r  r  r  r
  r&  r0  r6  r9  rG  rK  rO  rU  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,  r3  r?  rE  rM  r>  "leave_allocation_change_permissionrT  "leave_allocation_reject_permissionrV  rZ  "leave_allocation_delete_permissionr]  re  rk  rn  rp  rr  rt  rv  rx  r  r  r  r  r  r  r  r  r  r   r  r  r  ry  r  r  r  r  r  is_compensatory_leave_enabledr  r  r  r  r  r  r  r  r  r  r!  r'  r1  r4  r9  rA   rL   rD   <module>r_     sV      # . .  *   # + ! . 2 @ @  + 2 6 =  & )
 
 
 A @ $  / 9 G      . / (%P *+X , X* +,# - #L )*X +  X. +, -  < -.! / !H -.** / **Z +,/ -  /:& +,V -  Vr ,-P . Pf ,- . 0KD ,-bR . bRJ k  k\ ./1 0  1h .// 0  /< ./|G 0 |G~ ./.F 0 .Fb ./	F 0 	F ./S 0 Sl ,?  ,?^ ,-Q .  Q6 -.v /  vr ./' 0 'T ./ 0  . ./4 0  4n -.P /  Pf 01$ 2  $N 01 
 2   
L vh230 4  0('2 -.y" / y"x  0 L  L ./ 0  D  4   4 12 3  > 12&> 3  &>R 124 3  4: ./! 0 ! ./% 0 %  ^  ^B n  nb G  GB   : E EP X  Xv   > ,- . 0 : :2 01!< 2 !<H E EB  Y  YF " "D B" B"J /" /"d +" +"\ /" /"d {  {| N N. 4 4n   D 3  3l P6  P6f #%;J &  ;J| #%1G & 1Gh #%<C &  <C~ #%5B &  5Bp - -& % %: vh./0 0   0> - -& % %: vh0   04 - - % %, V  Vr -.! /  !H u  up (  (V p  pf (  (V     ,    0 9  9x 56
B 7 
B 45 6 "     *    0 4\"V4 46 
 
2 0  0* "$0
 % 0
d "$V:  % V:p "$#2  % #2J "$4&
G  % G  "$CD#3 E  % #3J "$CD+G E  % +GZ "$
  % 
: "$
  % 
B "$w
  % w
t 4]##> 56 7 & % %P BC BCJ # #L  rL   