
    vgI                        d Z ddlZddlZddlZddlZddlmZ ddlmZ ddl	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mZ ddlmZ ddlmZ ddlm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+ ddl,m-Z-m.Z.m/Z/m0Z0 ddl1m2Z2m3Z3 ddl4m5Z5 ddl6m7Z7 ddl8m9Z9 ddl:m;Z; ddl<m=Z=  ej|                  e?      Z@ G d dej                        ZA G d deA      ZB G d deA      ZC G d deA      ZD G d d ej                        ZF G d! d"eA      ZG G d# d$eA      ZH G d% d&ej                        ZI G d' d(eA      ZJ G d) d*eJ      ZKg d+ZL G d, d-ej                        ZN G d. d/ej                        ZO G d0 d1ej                        ZP G d2 d3ej                        ZQ G d4 d5eA      ZR G d6 d7ej                        ZS G d8 d9eA      ZTd: ZU G d; d<eA      ZV G d= d>eA      ZW G d? d@eA      ZXy)Aa  
forms.py

This module contains the form classes used in the application.

Each form represents a specific functionality or data input in the
application. They are responsible for validating
and processing user input data.

Classes:
- YourForm: Represents a form for handling specific data input.

Usage:
from django import forms

class YourForm(forms.Form):
    field_name = forms.CharField()

    def clean_field_name(self):
        # Custom validation logic goes here
        pass
    N)
month_name)OrderedDict)AnyDict)forms)apps)ValidationError)QuerySet)DateTimeInputrender_to_string)format_html)gettext_lazy)AttendanceFilters)
AttendanceAttendanceActivityAttendanceLateComeEarlyOutAttendanceOverTimeAttendanceRequestCommentAttendanceValidationConditionBatchAttendance	GraceTimeWorkRecordsattendance_date_validatestrtime_secondsvalidate_time_format)filtersubordinatesemployeemodelget_working_daysis_reportingmanagerreload_queryset)CompanyEmployeeShift)EmployeeFilter)Employee)horilla_middlewares)HorillaMultiSelectField)HorillaMultiSelectWidgetc                   "     e Zd ZdZ fdZ xZS )	ModelFormzC
    Overriding django default model form to apply some styles
    c                    t        |   |i | t        | j                         t	        t
        j                  dd       }| j                  j                         D ]  \  }}|j                  }t        |t        j                        r#t        j                  j                         |_        t        |t        j                   t        j"                  t        j$                  f      rMt'        |j(                  j+                               }|j                  j,                  j/                  d|d       nRt        |t        j0                  f      rd}|j(                  t'        |j(                        }t'        d      j3                  |      |_        | j                  |   j                  j,                  j/                  dt7        j8                         dd	       nt        |t        j:                        r@t'        |j(                        }|j                  j,                  j/                  d|d
dd       nQt        |t        j<                  t        j>                  f      r'|j                  j,                  j/                  ddi       t        |t        j                        rt        j                  ddd      |_        t        |t        j@                        rt        j                  ddd      |_        	 |jB                  jD                  | j                  d   _        	 |jB                  jD                  jH                  | j                  d   _         y # tF        $ r Y Bw xY w# tF        $ r Y w xY w)Nrequestoh-input w-100classplaceholder z---Choose {label}---labeloh-select oh-select-2 w-100zheight:50px;border-radius:0;)r.   idstyle   (   )r.   r/   rowscolsr.   zoh-switch__checkboxdatetyper.   attrstimeemployee_id
company_id)%super__init__r    fieldsgetattrr%   _thread_localsitemswidget
isinstancer   	DateInputdatetimer:   todayinitialNumberInput
EmailInput	TextInput_r2   titler>   updateSelectformatempty_labeluuiduuid4TextareaCheckboxInputCheckboxSelectMultiple	TimeInputuseremployee_get	Exceptionget_company)	selfargskwargsr+   
field_namefieldrH   r2   	__class__s	           $/var/www/horilla/attendance/forms.pyrC   zModelForm.__init__M   s   $)&)$-<<iN!%!2!2!4 >	J\\F&5??4 ( 3 3 5**E,<,<eooN %++++-."")).uE FU\\O4;;*ekkNE$%&<$=$D$D5$D$Q!J'..44;;!>"jjl!? FU^^5%++""))!1', ! "	 ''00 ""))74I*JK&%//2$#)4DE  &%//2$#)4DE 5<\\5N5NM*2LL--99 L)1u>	l    s$   4(M2M"	MM"	M/.M/__name__
__module____qualname____doc__rC   __classcell__rf   s   @rg   r)   r)   H   s    C C    r)   c                   B     e Zd ZdZ G d d      Zd Z fdZd Z xZS )AttendanceUpdateFormz
    This model form is used to direct save the validated query dict to attendance model
    from AttendanceUpdateForm. This form can be used to update existing attendance.
    c                       e Zd ZdZdZg dZeZ eddi       eddi       eddi       eddi       eddi      dZ	y	)
AttendanceUpdateForm.Meta7
        Meta class to add the additional info
        __all__)overtime_secondat_work_secondattendance_dayrequest_descriptionapproved_overtime_secondrequest_typerequested_datais_validate_requestis_validate_request_approvedattendance_overtime	is_active
is_holidayr<   r?   r=   r:   attendance_clock_inattendance_clock_outattendance_clock_out_dateattendance_dateattendance_clock_in_dateN)
ri   rj   rk   rl   rD   excluder   modelr   widgets ro   rg   Metars      sd    	 
 #07G#H$18H$I)6ff=M)N,FF3CD(5VV<L(M
ro   r   c           
          | j                   |   j                  j                  j                  t	        t        j                               ddddddd       y)4Update the widget attributes for worked hour fields.#attendanceUpdateForm%#id_attendance_worked_hour_parent_div	outerHTML$/attendance/update-worked-hour-fieldchange delay:300msr4   
hx-include	hx-targethx-swapz	hx-selecthx-getz
hx-triggerNrD   rH   r>   rS   strrW   rX   ra   rd   s     rg   update_worked_hour_hx_fieldsz1AttendanceUpdateForm.update_worked_hour_hx_fields   J    J&&,,33$**,'5D&D@2
	
ro   c                 N   |j                  d      x}rt        j                  j                         }|r!|j                  rt        |j                        nd}|j                  j                  d      |j                  j                  d      |j                  j                  d      d}|j                  <|j                  j                  d      |d<   |j                  j                  d      |d<   ||d<   t        | 4  |i | | j                  d	   j                  j                   j#                  d
t%        t'        j(                               i       | j                  d   j                  j                   j#                  t%        t'        j(                               dddd       dD ]  }| j+                  |        | j                  d   j                  j                   j#                  ddi       | j                  d   j                  j                   j#                  d
t%        t'        j(                               i       t-        d      | j                  d   _        t-        d      | j                  d   _        |=|j0                  s1t        |j2                        k  s|j4                  s| j                  d= t7        | j                  d   j8                        dgz   | j                  d   _        | j                  d   j                  j                   j#                  ddi       y )Ninstancer   %Y-%m-%d%H:%Mr   r   r   r   r   rM   r@   r4   shift_idr   %/attendance/update-fields-based-shiftr4   r   r   r   r   r   r   r   r   onchangeattendanceDateChange($(this))work_type_idzApprove overtime?attendance_overtime_approvezValidate Attendance?attendance_validatedbatch_attendance_iddynamic_createzDynamic createdynamicBatchAttendance($(this)))getr   objectsfirstminimum_overtime_to_approver   r   strftimer   r   r   r   rB   rC   rD   rH   r>   rS   r   rW   rX   r   rQ   r2   r   r   r   listchoices)ra   rb   rc   r   	conditionrM   re   rf   s          rg   rC   zAttendanceUpdateForm.__init__   s   zz*--8- 6==CCEI !F!F  	 E EF  $,#;#;#D#DZ#P'/'C'C'L'LW'U,4,M,M,V,V-G 11=11::7C ./ 66??
K 34 !(F9$)&)M"))//66c$**,>O7PQJ&&,,33$**,'54A		

 	5E --e4	5 	%&--33::;	

 	N#**0077s4::<?P8QR;<=P;Q128456L4M*+1 88 < <=	I44 9:59KK-.666
1263)*2 	)*1177>>=	
ro   c                 &    d| i}t        d|      }|S S
        Render the form fields as HTML table rows with Bootstrap styling.
        formzattendance_form.htmlr   ra   rb   rc   context
table_htmls        rg   as_pzAttendanceUpdateForm.as_p	        4.%&<gF
ro   )	ri   rj   rk   rl   r   r   rC   r   rm   rn   s   @rg   rq   rq      s#    

 
:
C
Jro   rq   c            	            e Zd ZdZ eej                  j                  d       ede	dd       e
d      	      Z G d
 d      Zd Z fdZd fd	Zd Zdeeef   f fdZd Z xZS )AttendanceFormz)
    Model form for Attendance model
    F)employee_work_info__isnullzemployee-widget-filterfzemployee_filters.html)filter_route_namefilter_classfilter_instance_contex_namefilter_template_path	EmployeesquerysetrH   r2   c                       e Zd ZdZeZdZg dZ eddi       eddi       eddi       eddi       eddi      dZ	y	)
AttendanceForm.Metart   ru   )r   attendance_overtime_calculationrw   rv   rx   ry   rz   r{   r|   r}   r~   r   r   r   r<   r?   r=   r:   r   N)
ri   rj   rk   rl   r   r   rD   r   r   r   r   ro   rg   r   r   "  sd    	 
" $17G#H$18H$I)6ff=M)N,FF3CD(5VV<L(M
ro   r   c           
          | j                   |   j                  j                  j                  t	        t        j                               ddddddd       y)r   #attendanceCreateFormr   r   r   r   r   Nr   r   s     rg   r   z+AttendanceForm.update_worked_hour_hx_fieldsA  r   ro   c                 R   |j                  di       }t        j                  j                         j                         j	                  d      t        j                  j                         j                         j	                  d      d}|j                  d      x}r|j                  |j                  j	                  d      |j                  j	                  d      |j                  j	                  d      d       |j                  <|j                  j	                  d      |d<   |j                  j	                  d      |d<   |j                  |       ||d<   t        | 8  |i | t        | j                          | j                   d	   j"                  j$                  j                  d
t'        t)        j*                               i       | j                   d   j"                  j$                  j                  t'        t)        j*                               dddd       dD ]  }| j-                  |        | j                   d   j"                  j$                  j                  ddi       | j                   d   j"                  j$                  j                  d
t'        t)        j*                               i       t/        | j                   d   j0                        dgz   | j                   d   _        | j                   d   j"                  j$                  j                  ddi       y )NrM   r   r   )r   r   r   r   r   r   r@   r4   r   r   r   r   r   r   r   r   r   r   r   r   )poprK   rL   r:   r   r?   r   rS   r   r   r   r   r   rB   rC   r    rD   rH   r>   r   rW   rX   r   r   r   )ra   rb   rc   view_initialrM   r   re   rf   s          rg   rC   zAttendanceForm.__init__O  s   zz)R0 *2):):)@)@)BTVXj!$,$5$5$;$;$=$B$B$D$M$Mg$V	
 zz*--8-NN'/'?'?'H'H'T+3+G+G+P+P, 190Q0Q0Z0Z"1
 11=11::7C ./ 66??
K 34
 	|$#y$)&)$M"))//66c$**,>O7PQJ&&,,33$**,'54A		

 	5E --e4	5 	%&--33::;	

 	N#**0077s4::<?P8QR59KK-.666
1263)*2 	)*1177>>=	
ro   c                    t         |   d      }| j                  j                  d      D ]  }t	        |      t	        |j
                  j                        k7  s/| j                  j                         }|j                  dt        |      i       t        |      j                  d      }|j                           |r|j                          |S )NFcommitr@   )rB   savedatagetlistintr@   r4   copyrS   r   rq   )ra   r   r   emp_id	data_copy
attendancerf   s         rg   r   zAttendanceForm.save  s    7<u<-ii''6 	"F6{c("6"6"9"9:: IINN,	  -V!=>1)<AAAO
!	" MMOro   c                 &    d| i}t        d|      }|S r   r   r   s        rg   r   zAttendanceForm.as_p  r   ro   returnc                    t         |           t        j                  j	                  | j
                  j                  d            j                         | j                  _	        | j                  j                  dd        | j                  j                  t        dt        d      i      t         |           | j
                  j                  d      }t        j                  j	                  | j
                  d         j	                  |      }|j!                         rG|D cg c]  }|j                  j#                          }}t        dddj%                  |       d	i      y c c}w )
Nr@   )r4   zThis field is requiredr   )r   )employee_id__id__inzAlready attendance exists for z, z
 employees)rB   cleanr$   r   filterr   r   r   r   r@   errorsr   r	   rQ   r   r   exists__str__join)ra   employee_idsexisting_attendancer   employee_namesrf   s        rg   r   zAttendanceForm.clean  sE   $,$4$4$;$;yy}}]+ %< %

%' 	! 	t,==$$,!=!4L2M"NOOyy((7(0077 II&78 8 

&\&
2 	 %%'CV5?
&&..0N  "!%CDIInD]C^^h#i 	 (s   (!E,c                 Z   | j                   d   }|D ]d  }t        j                  j                  || j                  d         j                         }|Bt        t        dj                  |                   |j                         t        t        d            |j                         S )z4
        Used to validate employee_id field
        r@   r   r@   r   z0Attendance for the date already exists for {emp})empzEmployee not chosen)	cleaned_datar   r   r   r   r   r	   rQ   rU   )ra   employeer   r   s       rg   clean_employee_idz AttendanceForm.clean_employee_id  s     $$]3 	C#++22;L1M 3 eg  %%KSS # T  	 >>#!!$9":;;~~ro   T)ri   rj   rk   rl   r&   r$   r   r   r'   r#   rQ   r@   r   r   rC   r   r   r   r   r   r   r   rm   rn   s   @rg   r   r     s     *!!((E(J'6'(+!8	
 n	K
 
>
G
R
tCH~ 0 ro   r   c                   6     e Zd ZdZ G d d      Z fdZ xZS )AttendanceActivityFormz1
    Model form for AttendanceActivity model
    c                   n    e Zd ZdZeZdZ eddi       eddi       eddi       eddi      dZy)	AttendanceActivityForm.Metart   ru   r<   r?   r=   r:   )clock_in	clock_outclock_in_dateclock_out_dateN)	ri   rj   rk   rl   r   r   rD   r   r   r   ro   rg   r   r     sN    	 #%VV,<=&ff-=>*&&1AB+662BC	
ro   r   c                    |j                  d      x}r|j                  j                  d      |j                  j                  d      |j                  j                  d      d}|j
                  <|j
                  j                  d      |d<   |j                  j                  d      |d<   ||d<   t        |    |i | y )Nr   r   r   )r   r   r   r   r   rM   )	r   r   r   r   r   r   r   rB   rC   )ra   rb   rc   r   rM   rf   s        rg   rC   zAttendanceActivityForm.__init__  s    zz*--8-
 $,#;#;#D#DZ#P!)!7!7!@!@!L$--66w?G
 !!-'/'9'9'B'B7'K$,4,C,C,L,LZ,X() 'F9$)&)ro   )ri   rj   rk   rl   r   rC   rm   rn   s   @rg   r   r     s    
 
* *ro   r   c                   "     e Zd ZdZ fdZ xZS )MonthSelectFieldz 
    Generate month choices
    c                     t        dd      D cg c]9  }t        |   j                         t        t        |   j	                               f; }}t        |   |d|i| y c c}w )N      r   )ranger   lowerrQ   
capitalizerB   rC   )ra   rb   rc   ir   rf   s        rg   rC   zMonthSelectField.__init__  sg    LQRSUWL
GHZ]  "Ajm&>&>&@$AB
 
 	4::6:
s   >A"rh   rn   s   @rg   r   r     s    ; ;ro   r   c                   Z     e Zd ZdZ e ed            Z G d d      Z fdZd Z	 xZ
S )AttendanceOverTimeFormz1
    Model form for AttendanceOverTime model
    Monthr1   c                   l    e Zd ZdZeZdZg dZ ed       ed       ed       ed       ed      d	Z	y
)AttendanceOverTimeForm.Metart   ru   )hour_account_secondrv   month_sequencehour_pending_secondr   r$   YearzWorked HourszPending HoursOvertime)r@   yearworked_hourspending_hoursovertimeN)
ri   rj   rk   rl   r   r   rD   r   rQ   labelsr   ro   rg   r   r	    sH    	 #
 Z=fIn-/*
ro   r   c                     t        |   |i | | j                  d   j                  j                  j                  dt        t        j                               i       y )Nr@   r4   )	rB   rC   rD   rH   r>   rS   r   rW   rX   ra   rb   rc   rf   s      rg   rC   zAttendanceOverTimeForm.__init__(  sH    $)&)M"))//66c$**,>O7PQro   c                 &    d| i}t        d|      }|S r   r   r   s        rg   r   zAttendanceOverTimeForm.as_p,  r   ro   )ri   rj   rk   rl   r   rQ   monthr   rC   r   rm   rn   s   @rg   r  r    s-     1W:.E
 
,Rro   r  c                   $    e Zd ZdZ G d d      Zy)AttendanceLateComeEarlyOutFormz>
    Model form for attendance AttendanceLateComeEarlyOut
    c                       e Zd ZdZeZdZy)#AttendanceLateComeEarlyOutForm.Metart   ru   N)ri   rj   rk   rl   r   r   rD   r   ro   rg   r   r  :  s    	 +ro   r   Nri   rj   rk   rl   r   r   ro   rg   r  r  5  s     ro   r  c                      e Zd ZdZ ej
                  dd ej                  ddd       e ed       ed	            
      Z	 ej
                  dd ej                  ddd       ed      
      Z
 ej
                  dd ej                  ddd       ed      
      Z ej                   ed      ej                  j                         d ej                   ddi            Z G d d      Zy)!AttendanceValidationConditionFormz6
    Model form for AttendanceValidationCondition
    Tz00:00r,   z09:00r-   r=   zn<span title='Do not Auto Validate Attendance if an Employee Works More Than this Amount of Duration'>{}</span>z'Worked Hours(At Work) Auto Approve Till)requiredrM   rH   r2   z00:30z Minimum Hour to Approve Overtimez02:00z Maximum Allowed Overtime Per Dayr!   Fr.   r3   )r2   r   r  rH   c                       e Zd ZeZdZdgZy)&AttendanceValidationConditionForm.Metaru   r   N)ri   rj   rk   r   r   rD   r   r   ro   rg   r   r!  l  s    --ro   r   N)ri   rj   rk   rl   r   	CharFieldrP   r   rQ   validation_at_workr   overtime_cutoffModelMultipleChoiceFieldr!   r   allSelectMultiplerA   r   r   ro   rg   r  r  C  s    )u,WE
  A 78	
 #2%//u,WE
 23# &eoou,WE
 23O 0//	l$$&#u##74Q*RS	J   ro   r  c                   X     e Zd ZdZd Z fdZ G d d      Zd Zd
dede	f fd	Z
 xZS )AttendanceRequestFormz
    AttendanceRequestForm
    c           
          | j                   |   j                  j                  j                  t	        t        j                               ddddddd       yr   #attendanceRequestFormr   r   r   r   r   Nr   r   s     rg   r   z2AttendanceRequestForm.update_worked_hour_hx_fieldsw  J    J&&,,33$**,'6D&D@2
	
ro   c                    |j                  d      x}r|j                  j                  d      |j                  j                  d      |j                  j                  d      d}|j
                  <|j                  j                  d      |d<   |j
                  j                  d      |d<   ||d<   t        |    |i | d| j                  d   _
        d| j                  d   _
        | j                  d	   j                  j                  j                  t        t        j                                d
dddd       dD ]  }| j#                  |        | j                  d   j                  j                  j                  ddi       | j                  d   j                  j                  j                  dt        t        j                                i       t%        | j                  d   j&                        dgz   | j                  d   _        | j                  d   j                  j                  j                  ddi       y )Nr   r   r   r   r   r   rM   Fr   r,  z#attendanceRequestDivr   r   )r4   r   r   r   r   r   r   r   r   r   r4   r   r   r   )r   r   r   r   r   r   r   rB   rC   rD   r  rH   r>   rS   r   rW   rX   r   r   r   )ra   rb   rc   r   rM   re   rf   s         rg   rC   zAttendanceRequestForm.__init__  s   zz*--8- $,#;#;#D#DZ#P'/'C'C'L'LW'U,4,M,M,V,V-G 11=11::7C ./ 66??
K 34 !(F9$)&)<A/097<*+4J&&,,33$**,'64&A	

 	5E --e4	5 	%&--33::;	

 	N#**0077s4::<?P8QR59KK-.666
1263)*2 	)*1177>>=	
ro   c                       e Zd ZdZeZg dZy)AttendanceRequestForm.Meta3
        Meta class for additional options
        )r   r   r   r   r   r   r   attendance_worked_hourminimum_hourry   r   Nri   rj   rk   rl   r   r   rD   r   ro   rg   r   r0    s    	 
ro   r   c                 &    d| i}t        d|      }|S r   r   r   s        rg   r   zAttendanceRequestForm.as_p  r   ro   r   r   c                 "    t         |   d      S )NF)rB   r   )ra   r   rf   s     rg   r   zAttendanceRequestForm.save  s    w|E""ro   ).)ri   rj   rk   rl   r   rC   r   r   boolr   r   rm   rn   s   @rg   r)  r)  r  s:    
3
j
 
(#4 ## # #ro   r)  c                   B     e Zd ZdZ fdZd Zdeeef   f fdZ	 xZ
S )NewRequestFormz
    NewRequestForm class
    c                    t        |   |i | |j                  di       }| j                  }t	        j
                  t        j                  j                  d      t        d      t	        j                  dddd	      |j                  d
            t	        j                  dt        d      t	        j                  dddd	            d}t        d      | j                  d   _        |j                  |       || _        ||d<   y )NrM   Tr   r$   r3   #id_shift_id_divz)/attendance/get-employee-shift?bulk=Falser.   r   r   r=   r@   )r   r2   rH   rM   FCreate Bulkoh-checkbox#objectCreateModalTargetz,/attendance/request-new-attendance?bulk=Truer  r2   rH   )r@   create_bulkzRequest descriptionry   )rB   rC   r   rD   r   ModelChoiceFieldr$   r   r   rQ   rT   r   BooleanFieldrZ   r2   rS   )ra   rb   rc   r   old_dictnew_dictrf   s         rg   rC   zNewRequestForm.__init__  s    $)&)zz)R0;; 11!))0040@
m||!>%7"M %((7 !--&**!.%?"P

2 455J3K)*0!(yro   c                 &    d| i}t        d|      }|S )r   r   z)requests/attendance/request_new_form.htmlr   ra   rb   rc   r   	form_htmls        rg   r   zNewRequestForm.as_p  s$     4.$7
	 ro   r   c                    t         	|           | j                  d   }| j                  d   }t        j                  j                  ||      }|r t        |d      st        t        d            ||| j                  d   | j                  d   | j                  d   | j                  d	   | j                  d
   | j                  d   | j                  d   | j                  d   d
}|j                         r"|j                  |d<   t        |      |d<   | j                  d   |d<   | j                  d   |d<   |d   dk(  rd n|d   |d<   |d	   dk(  rd n|d	   |d	<   | j                  d   |d<   | j                  d
   |d
<   |j                         }|j                         D ]  \  }}t        |      ||<    t        j                   |      |_        d|_        |j&                  dk7  rd|_        | j                  d   |_        |j+                          d | _        y t        di |}d|_        d|_        | j                  d   |_        d|_        || _        y )Nr@   r   r   employee_work_infoEmployee work info not foundr   r   r   r   r   r   r2  r3  )
r@   r   r   r   r   r   r   r   r2  r3  NoneTcreate_requestupdate_requestry   Fr   )rB   r   r   r   r   r   hasattrr	   rQ   r   r   r4   r   r   rG   jsondumpsr|   r}   r{   ry   r   new_instancer   )
ra   r   r   attendancesr   r   keyvaluerS  rf   s
            rg   r   zNewRequestForm.clean  s   $$]3++,=> ((// / 0 
 GH.BC!!$B"CDD#.(,(9(9:T(U#'#4#45J#K$($5$56L$M)-):):;V)W))*5 --n=&*&7&78P&Q IIn5
 "*++D&)/&:D"#/3yy9S/TD+,*.))4I*JD&' ./69 01 '( 34> 56 ,-
 $(99^#<D #yy4D$**,J"jjl '
UJS	'(,

4(8J%-1J*&&*::*:
'-1YY7L-MJ*OO $D!)D)+/(,1)+/995J+K($4!(ro   )ri   rj   rk   rl   rC   r   r   r   r   r   rm   rn   s   @rg   r9  r9    s,    #)J9tCH~ 9 9ro   r9  )r4   attendance_id__employee_idin_datetimeout_datetimer|   rw   rz   r}   r~   ry   r{   r  r   horilla_historyc            
       *   e Zd ZdZej
                  j                         ZeD  cg c]8  }t        |d      r*|j                  t        vr|j                  |j                  f: c}}}} Z ej                  eej                  g d      Zyc c}}}} w )AttendanceExportFormz
    This form allows users to choose which fields of the `Attendance` model
    they want to include in the export excel file as column. The fields are
    presented as a list of checkboxes, and the user can select multiple fields.
    verbose_name)
r@   r   r   r   r   r   r   r   r2  r   r   rH   rM   N)ri   rj   rk   rl   r   _meta
get_fieldsmodel_fieldsrP  nameexcluded_fieldsr]  field_choicesr   MultipleChoiceFieldr[   selected_fields.0re   rP  rc  s   0000rg   r\  r\  ]  s     ##..0L " 5.)ejj.O 
U''(M 0e//++
O   =B
r\  c            
       B   e Zd ZdZej
                  j                         ZeD  cg c]8  }t        |d      r*|j                  t        vr|j                  |j                  f: c}}}} Zej
                  j                         ZeD  cg c];  }t        |d      r-|j                  t        vrd|j                  z   |j                  f= c}}}} Zeez   Z e ej&                  e            Z ej*                  eej,                  g d      Zyc c}}}} w c c}}}} w )LateComeEarlyOutExportForma   
    This form allows users to choose fields from both the `AttendanceLateComeEarlyOut`
    model and the related `Attendance` model to include in the export excel file.
    The fields are presented as checkboxes, and users can select multiple fields.
    r]  attendance_id__)r@   r<   attendance_id__attendance_date'attendance_id__attendance_clock_in_date"attendance_id__attendance_clock_in(attendance_id__attendance_clock_out_date#attendance_id__attendance_clock_outr^  N)ri   rj   rk   rl   r   r_  r`  ra  rP  rb  rc  r]  field_choices_1r   model_fields_2field_choices_2rd  r   r   fromkeysr   re  r[   rf  rg  s   0000rg   rk  rk  }  s    .33>>@L " 5.)ejj.O 
U''(O
  %%002N $ 5.)ejj.O 
UZZ	'););<O
 $o5M---m<=M/e//++
Os   =D
A D
rk  c            
       *   e Zd ZdZej
                  j                         ZeD  cg c]8  }t        |d      r*|j                  t        vr|j                  |j                  f: c}}}} Z ej                  eej                  g d      Zyc c}}}} w )AttendanceActivityExportFormz
    This form allows users to choose specific fields from the `AttendanceActivity`
    model to include in the export excel file. The fields are presented as checkboxes,
    enabling users to select multiple fields.
    r]  )r@   r   r   r   r   r   r^  N)ri   rj   rk   rl   r   r_  r`  ra  rP  rb  rc  r]  rd  r   re  r[   rf  rg  s   0000rg   rw  rw         &++668L " 5.)ejj.O 
U''(M
 0e//++
Ori  rw  c            
       *   e Zd ZdZej
                  j                         ZeD  cg c]8  }t        |d      r*|j                  t        vr|j                  |j                  f: c}}}} Z ej                  eej                  g d      Zyc c}}}} w )AttendanceOverTimeExportFormz
    This form allows users to choose specific fields from the `AttendanceOverTime`
    model to include in the export. The fields are presented as checkboxes,
    enabling users to select multiple fields.
    r]  )r@   r  r  r  r  r  r^  N)ri   rj   rk   rl   r   r_  r`  ra  rP  rb  rc  r]  rd  r   re  r[   rf  rg  s   0000rg   rz  rz    rx  ri  rz  c                       e Zd ZdZ ej
                  ej                  j                         d e	d            Z
 G d d      Zy)GraceTimeForm.
    Form for create or update Grace time
    Fz1Allcocate this grace time for Check-In Attendance)r   r  	help_textc                   n    e Zd ZdZeZdZ ej                          ej                  ddi      dZ
g dZy)	GraceTimeForm.Metar1  ru   r/   z00:00:00 Hoursr=   )
is_defaultallowed_time)r   allowed_time_in_secsr   N)ri   rj   rk   rl   r   r   rD   r   HiddenInputrP   r   r   r   ro   rg   r   r    sD    	 +%++-+EOO=BR2ST

 Cro   r   N)ri   rj   rk   rl   r   r%  r"   r   r&  rQ   shiftsr   r   ro   rg   r|  r|    sE     ,U++&&**,GHFC Cro   r|  c                        e Zd ZdZ ej
                  ej                  j                               Z	 e
d      Zd Z fdZ xZS )GraceTimeAssignFormr}  )r   zAssign Shiftsc                 &    d| i}t        d|      }|S r   r   zcommon_form.htmlr   rH  s        rg   r   zGraceTimeAssignForm.as_p        4.$%7A	ro   c                 p    t        |   |i | d| j                  d   j                  j                  d<   y )Nzoh-select w-100 oh-select-2r  r.   )rB   rC   rD   rH   r>   r  s      rg   rC   zGraceTimeAssignForm.__init__  s4    $)&)6SH$$**73ro   )ri   rj   rk   rl   r   r%  r"   r   r&  r  rQ   r]  r   rC   rm   rn   s   @rg   r  r    sK     ,U++&&**,F _%LT Tro   r  c                   $    e Zd ZdZ G d d      Zy)AttendanceRequestCommentFormz'
    AttendanceRequestComment form
    c                       e Zd ZdZeZdZy)!AttendanceRequestCommentForm.Metar1  )commentN)ri   rj   rk   rl   r   r   rD   r   ro   rg   r   r    s    	 )ro   r   Nr  r   ro   rg   r  r    s     ro   r  c                 T   t        ||      }|d   }|j                          g }t        |      dkD  rt        j                  d      r6ddlm}  ||d   |d   dd      }|j                  j                  | 	      }nt               j                         }g }t        |      dkD  r|D ]  }	||	j                         z  } t        |d   |d   d
      }
|
j                  j                  | 	      }t        |j                  dd            }|D cg c]  }||vr|vr| }}|S c c}w )zA
    This method will return a list of company working dates
    working_days_onr   leave)LeaveRequestFilterapproved)	from_dateto_datestatusr   )r@   )attendance_date__gteattendance_date__lter   T)flat)r   sortlenr   is_installedleave.filtersr  qsr   r
   nonerequested_datesr   r   values_list)r@   r  r  working_datesworking_date_listattendance_datesr  approved_leave_dates_filteredapproved_leave_datesr  attendance_filtersr   r:   	date_lists                 rg   get_date_listr    su    %Y8M%&78
!W%8,>!21!504(-) -J,L,L,S,S' -T -) -5JOO,=)!,-16 @$(=(=(??$@.(9!(<(9"(=
 133::{:S++,=D+I
 &''D8L,L 	I 
 s   D%c                       e Zd ZdZ ej
                  ej                  j                  d       ej                  ddd       e
d      	      Z ej                  d
d e
d       ej                  dddd            Z ej                  d
 e
d       ej                   ddd            Z ej                  d
 e
d       ej                   ddd            Z ej
                  ej                  j)                         d
d ej                  ddi            Z G d d      Zd Z fdZd Zd! fd 	Z xZS )"BulkAttendanceRequestFormz-
    Bulk attendance request create form
    Tr;  r<  z(/attendance/get-employee-shift?bulk=True)r   r   r=   r$   r   Fr>  r?  r@  z-/attendance/request-new-attendance?bulk=Falser=  )r  rM   r2   rH   z	From Dater:   zform-controlr;   rA  zTo DateBatchr   r   )r   r  r2   rH   c                       e Zd ZdZeZdZy)BulkAttendanceRequestForm.Metar1  )r@   rB  r  r  r   r   r   r   r3  r2  ry   Nr4  r   ro   rg   r   r  t  s    	 
ro   r   c           
          | j                   |   j                  j                  j                  t	        t        j                               ddddddd       yr+  r   r   s     rg   r   z6BulkAttendanceRequestForm.update_worked_hour_hx_fields  r-  ro   c                 .   t        t        j                  dd       }|j                  j                  }t        |   |i | |r6t        |d      r*|j                  j                  }|| j                  d   _        dD ]  }| j                  |        |j                  j                  d      st        |      rjt        |t         j"                  j%                         d      }|t         j"                  j'                  |j                        z  | j                  d	   _        n<t         j"                  j'                  |j                        | j                  d	   _        t+        | j                  d
   j,                        dgz   | j                  d
   _        y )Nr+   rK  r   )r   r   zattendance.add_attendancezpms.add_feedback)perm)employee_user_idr@   r   r   )rE   r%   rF   r]   r^   rB   rC   rP  rK  r   rD   rM   r   has_permr   r   r$   r   r&  r   r   r   r   )	ra   rb   rc   r+   r   shiftre   	employeesrf   s	           rg   rC   z"BulkAttendanceRequestForm.__init__  sm   -<<iN<<,,$)&)*>?//88E.3DKK
#+
 	5E --e4		5
 <<  !<=ATB
 8))--/6HI 3<h>N>N>U>U!( ?V ? 3DKK&/ 3;2B2B2I2I!( 3J 3DKK&/ 6:KK-.666
1263)*2ro   c                    | j                   }|j                  d      }|j                  d      }|j                  d      }|j                  d      }|j                  d      }|j                  d      }t        j                  j                         j	                         }t        j                  j                         j                         }	t        |       t        |       t        |       t        |       t        |||      }
|r|r||kD  rt        dt        d      i      ||	k(  r||kD  rt        dd| d	i      |r t        |d
      st        t        d            t        |
      dk  rt        t        d            |S )Nr  r  r2  r3  r   r@   z!To date should be after from datez-Check out time is in the future for the date .rK  rL  r   zKThere is no valid date to create attendance request between this date range)r   r   rK   nowr?   rL   r:   r   r   r  r	   rQ   rP  r  )ra   r   r  r  r2  r3  r   r@   r  rL   r  s              rg   r   zBulkAttendanceRequestForm.clean  sz   (( $$[1	""9-!-!1!12J!K#''7+//0FG"&&}5##%**,!!'')..034\* + )!+y'B	Y%8!9a0S.T"UVVe 4s :!*GyPQR  w{4HI!!$B"CDDy>Q!a 
 ro   c           
      f   | j                   }|j                  d      }|j                  d      }|j                  d      }|j                  d      }|j                  d      }|j                  d      }|j                  d      }	|j                  d      }
|j                  d	      }|j                  j                  }t	        |||      }|j                  d
      r|j                  d
      nd }||||||
d||	d	}|D ]  }|j                  |||d       t        |      }|j                         rH|j                  d      }d|_	        ||_
        d|_        d|_        |r||_        |j                          |t        |j                          t         | !  d      }|r|j                          |S )Nr@   r  r  r   r   r   ry   r2  r3  r   T)	r@   r   r   r   r   r2  r}   r3  ry   )r   r   r   r  Fr   rN  )r   r   rK  r   r  rS   r9  is_validr   r}   r@   r{   is_bulk_requestr   loggerr   rB   )ra   r   r   r@   r  r  r   r   r   ry   r2  r3  r   r  batchinitial_datar:   r   r   rf   s                      rg   r   zBulkAttendanceRequestForm.save  s   (("&&}5 $$[1	""9-##J/*../DE+//0FG*../DE!-!1!12J!K#''7"55BB!+y'B	  56 23 	 ' (#6$8&<#'(#6

  	$D'+0415 "|4D}}99E92/3,'2$(8%+/(38H0t{{#'	$( 7<u<-MMOro   r   )ri   rj   rk   rl   r   rC  r$   r   r   rT   rQ   r@   rD  rZ   rB  	DateFieldrJ   r  r  r   r&  r   r   r   rC   r   r   rm   rn   s   @rg   r  r  H  sX    )%((!!((4(8u||/D
 
m	K %%$$"u""&7I
	K  nuf~%NOI
 eoo	luf~%NOG
 1%00 ((,,.u||:/P"QR	
 
(
3:!F7 7ro   r  c                   $    e Zd ZdZ G d d      Zy)WorkRecordsFormz
    WorkRecordForm
    c                       e Zd ZdZdZeZy)WorkRecordsForm.Metar1  ru   N)ri   rj   rk   rl   rD   r   r   r   ro   rg   r   r    s    	 ro   r   Nr  r   ro   rg   r  r    s     ro   r  c                   L     e Zd ZdZ ed      Z G d d      Zd Z fdZ xZ	S )BatchAttendanceFormz
    BatchAttendanceForm
    zCreate attendance batchc                       e Zd ZdZdZeZdgZy)BatchAttendanceForm.Metar1  ru   r   N)ri   rj   rk   rl   rD   r   r   r   r   ro   rg   r   r  %  s    	 -ro   r   c                 &    d| i}t        d|      }|S r  r   rH  s        rg   r   zBatchAttendanceForm.as_p.  r  ro   c                 r    t        |   |i | | j                  j                  rt	        d      | _        y y )NzUpdate batch attendance)rB   rC   r   pkrQ   r]  r  s      rg   rC   zBatchAttendanceForm.__init__6  s5    $)&)== !"; <D ro   )
ri   rj   rk   rl   rQ   r]  r   r   rC   rm   rn   s   @rg   r  r    s.     ./L   = =ro   r  )Yrl   rK   rQ  loggingrW   calendarr   collectionsr   typingr   r   djangor   django.appsr   django.core.exceptionsr	   django.db.models.queryr
   django.formsr   django.template.loaderr   django.utils.htmlr   django.utils.translationr   rQ   attendance.filtersr   attendance.modelsr   r   r   r   r   r   r   r   r   r   r   r   base.methodsr   r   r   r    base.modelsr!   r"   employee.filtersr#   employee.modelsr$   horillar%   2horilla_widgets.widgets.horilla_multi_select_fieldr&   &horilla_widgets.widgets.select_widgetsr'   	getLoggerri   r  r)   rq   r   r   ChoiceFieldr   r  r  r  r)  r9  rc  Formr\  rk  rw  rz  r|  r  r  r  r  r  r  r   ro   rg   <module>r     s  .      #    2 + & 3 ) 6 0     / + $ ' V K			8	$H HV|9 |~F Y F R!*Y !*H	;u(( 	;'Y 'TY ,  , ^f#I f#Rm* m`$5:: @! !H5:: 65:: 6CI C4T%** T.9 /dE	 EPi =) =ro   