
    si                        d Z ddlZddl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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mZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z& ddl'm(Z( ddl)m*Z*  ejV                  e,      Z- G d dej\                        Z. G d de.      Z/ G d de.      Z0 G d de.      Z1 G d de.      Z2 G d de.      Z3 G d de.      Z4 G d de.      Z5g d  ed!      fd" ed#      fd$ ed%      fd& ed'      fd( ed)      fd* ed+      fd, ed-      fd. ed/      fd0 ed1      fd2 ed3      fd4 ed5      fd6 ed7      fd8 ed9      fd: ed;      fd< ed=      fd> ed?      fd@ edA      fdB edC      fdD edE      fdF edG      fdH edI      fdJ edK      fdL edM      fdN edO      fdP edQ      fdR edS      fdT edU      fdV edW      fdX edY      fdZ ed[      fd\ ed]      fd^ ed_      fd` eda      fdb edc      fdd ede      fdf edg      fdh edi      fdj edk      fdl edm      fdn edo      fdp edq      fdr eds      fZ6g dtZ7 G du dvejp                        Z9 G dw dxejp                        Z: G dy dze.      Z; G d{ d|ejx                        Z= G d} d~ej|                        Z? G d de.      Z@ G d de.      ZA G d de.      ZB G d de.      ZC G d de.      ZD G d de.      ZE G d dej\                        ZF G d dej\                        ZGy)a  
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)datedatetime)Any)forms)User)Q)	DateInput	TextInputrender_to_string)gettext)gettext_lazy)eval_validatereload_queryset)
Actiontype
BonusPointDisciplinaryActionEmployeeEmployeeBankDetailsEmployeeGeneralSettingEmployeeNoteEmployeeTagEmployeeWorkInformation	NoteFilesPolicyPolicyMultipleFile)horilla_middlewares)AccountBlockUnblockc                   "     e Zd ZdZ fdZ xZS )	ModelFormzK
    Override of Django ModelForm to add initial styling and defaults.
    c           	         t        |   |i | t        | j                         t	        t
        j                  dd       }t        j                         }t        j                         }d}d}d}| j                  j                         D ]4  \  }	}
|
j                  }|
j                  rt        |
j                        nd}t        |t         j"                        r[||
_        d|_        d|_        dg|
_        |j,                  j/                  d|      }|j,                  j1                  | d	|d
       t        |t         j2                        r\||
_        d|_        d|_        dg|
_        |j,                  j/                  d|      }|j,                  j1                  | d	|d
       !t        |t         j4                  t         j6                  t         j8                  t         j:                  t         j<                  f      rn|j,                  j/                  d|      }|j,                  j1                  | d	|
j                  r#t        |
j                  j?                               ndd
       t        |t         j@                        rut        |
t         jB                        s t        d      j)                  |      |
_"        |j,                  j/                  d|      }|j,                  j1                  d|i       ut        |t         jF                        rA|j,                  j/                  d|      }|j,                  j1                  | d	|ddd       t        |t         jH                  t         jJ                  f      s|j,                  j/                  d|      }|j,                  j1                  d|i       7 |rt	        |jL                  dd       }|rd| j                  v r6| jN                  jP                  jR                  dvr|| j                  d   _        d| j                  v rG| j                  d   }t	        |dd       }|r(|jT                  }||v r|n|jW                         |_        y y y y y )Nrequestoh-input w-100/oh-select oh-select-2 select2-hidden-accessibleoh-switch__checkbox r   z%Y-%m-%dclassz form-controlr'   placeholdertime%H:%M---Choose {label}---label   (   )r'   r)   rowscolsemployee_getemployee_id)r   
company_idget_company),super__init__r   fieldsgetattrr   _thread_localsr   todayr   nowitemswidgetr.   _
isinstancer   r	   initial
input_typeformatinput_formatsattrsgetupdate	TimeInputNumberInput
EmailInputr
   	FileInputURLInputtitleSelectModelMultipleChoiceFieldempty_labelTextareaCheckboxInputCheckboxSelectMultipleuser_metamodel__name__querysetfirst)selfargskwargsr"   r<   r=   default_input_classselect_classcheckbox_class
field_namefieldr?   r.   existing_classemployeecompany_fieldcompanyrY   	__class__s                     2/var/www/python-projects/worksol/employee/forms.pyr8   zModelForm.__init__?   s   $)&)$-<<iN

lln.H.!%!2!2!4 M	?J\\F&+kkAekkNrE &%//2 %$*! *'1l#!'!1!1';N!O##$2#3=!A', FEOO4 #$*! ''.i#!'!1!1';N!O##$2#3=!A', %%$$OOOONN	 "(!1!1';N!O##$2#3=!AAFq):):)<'=RT FELL1!%)G)GH()*@(A(H(Hu(H(UE%!'!1!1'<!H##Wn$=> FENN3!'!1!1';N!O##$2#3=!A', ! "	 ,,e.J.JK "(!1!1'>!J##Wn$=>[M	?` w||^TBH DKK/DJJ4D4D4M4M V 5 :BDKK.64;;.$(KK$=M%htDG#0#9#9'.(':G@P &-  /      )rX   
__module____qualname____doc__r8   __classcell__rg   s   @rh   r    r    :   s    m mri   r    c                   $    e Zd ZdZ G d d      Zy)UserForm
    Form for User model
    c                       e Zd ZdZdZeZy)UserForm.Meta7
        Meta class to add the additional info
        )groupsNrX   rj   rk   rl   r9   r   rW    ri   rh   Metars      s    	 ri   rx   NrX   rj   rk   rl   rx   rw   ri   rh   rp   rp           ri   rp   c                   $    e Zd ZdZ G d d      Zy)UserPermissionFormrq   c                       e Zd ZdZdZeZy)UserPermissionForm.Metart   )ru   user_permissionsNrv   rw   ri   rh   rx   r~      s    	 0ri   rx   Nry   rw   ri   rh   r|   r|      rz   ri   r|   c                   R     e Zd ZdZ G d d      Z fdZd Z fdZd Zd Z	 xZ
S )	EmployeeFormz!
    Form for Employee model
    c                       e Zd ZdZeZdZdZ eddd       e	j                  dd	i       e	j                  dd	i      d
Zy)EmployeeForm.Metart   __all__)employee_user_idadditional_infois_from_onboardingis_directly_converted	is_activer   dob)typeidrF   r'   zoh-select oh-select-2)r   gendermarital_statusN)rX   rj   rk   rl   r   rW   r9   excluder
   r   rO   widgetsrw   ri   rh   rx   r      sX    	 
 F%#@A"ell'3J)KL*ell';R1ST
ri   rx   c                 (   t        |   |i | | j                  d   j                  j                  j                  ddi       d| j                  d   j                  j                  d<   d| j                  d   j                  j                  d<   d| j                  d   j                  j                  d<   |j                  d      x}r2i }|j                  |j                  j                  d      |d	<   ||d
<   y d| j                         i| _
        y )Nemailr   id_personal_emailautocompletephoneaddressinstancer+   r   rB   badge_id)r7   r8   r9   r?   rF   rH   rG   r   strftimeget_next_badge_idrB   )r[   r\   r]   r   rB   rg   s        rh   r8   zEmployeeForm.__init__   s    $)&) 	G##))00$8K1LM<CG##)).9<CG##)).9>GI%%++N;zz*--8-
 G||'!)!6!6w!? 'F9&(>(>(@ADLri   c                 "    d| i}t        d|      S Nformz,employee/create_form/personal_info_as_p.htmlr   r[   r\   r]   contexts       rh   as_pzEmployeeForm.as_p       4. NPWXXri   c                 <   t         |          }|j                  d      }|s|S t        j                  j                         j                  |      }| j                  r<| j                  j                  r&|j                  | j                  j                        }|j                         }|rod }t        |d      r"|j                  r|j                  j                  }|rt        dj                  |            }nt        d      }t!        j"                  d|i      |S )Nr   )r   )r   employee_work_infoz8An Employee with this Email already exists in company {}z*An Employee with this Email already exists)r7   cleanrG   r   objectsentirefilterr   r   r   rZ   hasattrr   r5   r@   rD   r   ValidationError)r[   cleaned_datar   queryexisting_employeer5   error_messagerg   s          rh   r   zEmployeeForm.clean   s    w}  )  '')00u0===T]]--MMT]]%5%5M6E!KKMJ)+?@%88.AALL
 !NUU"! !""N O''-(@AAri   c                 z   ddl m} ddlm}  |d      d   } |       }g }	 |D ]  }|D ]  }t	        |t
              s|j                         j                  |j                               sB|j                  |      }|dz   t        |      k  se||dz      }t        j                  d|      }  |rg }d}	t        |      D ]  }t        |      }
d}|D ]  }|d	k(  r|dz   } n |r||d }t	        |t              r|d
   }|	s2t	        t        t        |            t              rt        |      dz   }d}	t	        |t              rdj!                  ||
      }|j#                  dt        |              dj%                  |      }|S # t&        $ r+}t(        j+                  |        |d      d   }Y d}~|S d}~ww xY w)z:
        This method is used to generate badge id
        r   )get_initial_prefix)get_ordered_badge_idsNr      z[a-zA-Z]+|\d+|[^a-zA-Z\d\s]F0Tz{:0{}d}r&   )base.context_processorsr   employee.methods.methodsr   rA   strlower
startswithindexlenrefindallreversedlistr   intrD   insertjoin	Exceptionlogger	exception)r[   r   r   prefixdataresultsublistitemr   incrementedtotal_letterstotal_zero_leadsletteres                 rh   r   zEmployeeForm.get_next_badge_id  s    	?B#D)*>?$&&	D 
X# 	XD!$,1H1H2 !(d 3 19s7|3%,UQY%7F%'ZZ0NPV%WF	X
X #$V, 0D$'IM'($"& !S=/?!/C,$	 (#$4$56!$-#Bx&:mCI6NPS+T"4y1}&*!$,(//mDMM!SY/%0&    	DQ'-.BCF	Ds)   F -F +"F C6F 	F: F55F:c                    | j                   j                  d      }|s|S |rt        j                  j	                         }|j                  |      j                  | j                  r| j                  j                  nd      }|j                         rt        j                  t        d            t        j                  d|      st        j                  t        d            |S )z;
        This method is used to clean the badge id
        r   )r   NpkzBadge ID must be unique.z\dz)Badge ID must contain at least one digit.)r   rG   r   r   r   r   r   r   r   existsr   r   transr   search)r[   r   all_employeesrY   s       rh   clean_badge_idzEmployeeForm.clean_badge_idO  s     $$((4O$,,335M$++X+>FF'+}}4==##$ G H  ++E2L,MNN99UH-++EF  ri   )rX   rj   rk   rl   rx   r8   r   r   r   r   rm   rn   s   @rh   r   r      s.    
 
(B*Y>1fri   r   c                   L     e Zd ZdZ G d d      Zdd fd
Z fdZd Z xZS )	EmployeeWorkInformationForm0
    Form for EmployeeWorkInformation model
    c                   J    e Zd ZdZeZdZdZ eddi       eddi      dZ	y)	 EmployeeWorkInformationForm.Metart   r   )r4   r   
experiencer   r   r   date_joiningcontract_end_dateN
rX   rj   rk   rl   r   rW   r9   r   r	   r   rw   ri   rh   rx   r   i  s;    	 (B &VV,<=!*&&1A!B
ri   rx   F)disablec                    t        |   |i | d| j                  d   j                  j                  d<   | j                  d   j                  j                  j                  ddi       | j                  D ]V  }| j                  |   j                  | j                  |   j                  j                  d<   |sCd| j                  |   _        X dd	d
dddd}ddddddd}| j                  j                         D ]  \  }}t        |t        j                        s"|j                  |v s1|j                  >|j                  |j                        }|j                  j                  t        k7  sw|szt!        |j                        }	t!        d      j#                  |	      }
t        j$                  d|
fgt'        |j                  j)                  d|             z   |j*                  |	|j,                  t        j.                  dd|j                  |j                         dd            | j                  |<   | j                  |   xj0                  dt!        d       j#                  |	      fgz  c_         y )!Nr   r   job_position_idonchangezjobChange($(this))r)   T
departmentjob_positionjob_role	work_typeemployee_typeemployee_shift)
DepartmentJob PositionJob Role	Work TypeEmployee TypeShiftz#dynamicDeptz#dynamicJobPositionz#dynamicJobRolez#dynamicWorkTypez#dynamicEmployeeTypez#dynamicShiftr,   r-   r&   r   r$   zonDynamicCreate(this.value,"z");r'   r   r   )choicesrequiredr.   rB   r?   createzCreate New {} )r7   r8   r9   r?   rF   rH   r.   disabledr>   rA   r   ModelChoiceFieldrG   rY   rW   r   r@   rD   ChoiceFieldr   values_listr   rB   rO   r   )r[   r   r\   r]   rb   field_namesurlsr.   ra   translated_labelrQ   rg   s              rh   r8   z$EmployeeWorkInformationForm.__init__w  sO   $)&)<CG##)).9%&--33::0	
 [[ 	3E=A[[=O=U=UDKK%%++M:.2E"+	3
 '*"$,%
 )1)+3$
 !KK--/ 	LE5%!7!78U[[K=W;;*!,!=J~~++x7J+,U[[>(&'(>&?&F&F"2 'G ' .3->->&(+%6$7"5>>#=#=dzl#TU%V%*^^"2$)MM#(<<-^2NtxxX]XcXcOdNeeh0i'"$.E* E*22%q)9':'A'ABR'ST7 2-	ri   c                 Z    t         |          }d| j                  v r| j                  d= |S )Nr4   )r7   r   errors)r[   r   rg   s     rh   r   z!EmployeeWorkInformationForm.clean  s,    w}DKK'M*ri   c                 "    d| i}t        d|      S r   r   r   s       rh   r   z EmployeeWorkInformationForm.as_p  r   ri   )	rX   rj   rk   rl   rx   r8   r   r   rm   rn   s   @rh   r   r   d  s(    
 
 ', 7rYri   r   c                   <     e Zd ZdZ G d d      Z fdZd Z xZS )!EmployeeWorkInformationUpdateFormr   c                   N    e Zd ZdZeZg dZdZ eddi       eddi      dZ	y)	&EmployeeWorkInformationUpdateForm.Metart   )department_idr   job_role_idwork_type_idemployee_type_idreporting_manager_idr5   tagslocationr   mobileshift_idr   r   basic_salarysalary_hour)r4   r   r   r   r   r   r   Nr   rw   ri   rh   rx   r    s@    	 (
$ C &VV,<=!*&&1A!B
ri   rx   c                 l   t        |   |i | | j                  d   j                  j                  j                  ddi       | j                  d   j                  j                  j                  ddddd	d
       | j                  d   j                  j                  j                  dddddd
       y )Nr   r   id_work_emailr  z#id_job_position_id_parent_divz#id_job_position_idzchange,load	innerHTMLz/employee/get-job-positions-hx)z	hx-targetz
hx-includez
hx-triggerzhx-swapzhx-getr   z#id_job_role_id_parent_divz#id_job_role_idz/employee/get-job-roles-hxr7   r8   r9   r?   rF   rH   r[   r\   r]   rg   s      rh   r8   z*EmployeeWorkInformationUpdateForm.__init__  s    $)&) 	G##))00$1HIO$++1188=3+&:	
 	%&--33::9/+&6	
ri   c                 "    d| i}t        d|      S r   r   r   s       rh   r   z&EmployeeWorkInformationUpdateForm.as_p  r   ri   rX   rj   rk   rl   rx   r8   r   rm   rn   s   @rh   r  r    s    
 
@
2Yri   r  c                        e Zd ZdZ ej
                   ej                  ddd            Z G d d      Z fd	Z	d
 Z
 xZS )EmployeeBankDetailsForm,
    Form for EmployeeBankDetails model
    r/   r0   )r1   r2   r   r?   c                        e Zd ZdZeZdZg dZy)EmployeeBankDetailsForm.Metart   )		bank_nameaccount_numberbranchany_other_code1r   countrystatecityany_other_code2r4   r   r   NrX   rj   rk   rl   r   rW   r9   r   rw   ri   rh   rx   r    s    	 $

 Bri   rx   c                    t        |   |i | d| j                  d   j                  j                  d<   | j                  d   j                  j                  j                  ddi       | j                  d   j                  j                  j                  ddi       | j                         D ]%  }d|j                  j                  j                  d<   ' y )	Nr   r   r   id_bank_addressr"  id_bank_cityr#   r'   )r7   r8   r9   r?   rF   rH   visible_fieldsrb   )r[   r\   r]   visiblerg   s       rh   r8   z EmployeeBankDetailsForm.__init__  s    $)&)>GI%%++N; 	I%%++22D:K3LMF""((//~0FG**, 	CG2BGMM  &&w/	Cri   c                 "    d| i}t        d|      S Nr   z(employee/update_form/bank_info_as_p.htmlr   r   s       rh   r   zEmployeeBankDetailsForm.as_p#      4. JGTTri   )rX   rj   rk   rl   r   	CharFieldrR   r   rx   r8   r   rm   rn   s   @rh   r  r    sB     eoo^U^^1b:Q%RSGB B&	CUri   r  c                   <     e Zd ZdZ G d d      Z fdZd Z xZS )EmployeeBankDetailsUpdateFormr  c                        e Zd ZdZeZdZg dZy)"EmployeeBankDetailsUpdateForm.Metart   r   r$  Nr%  rw   ri   rh   rx   r2  -  s    	 $Ari   rx   c                 0   t        |   |i | | j                         D ]%  }d|j                  j                  j
                  d<   ' | j                  D ]?  }| j                  |   j                  | j                  |   j                  j
                  d<   A y )Nr#   r'   r)   )r7   r8   r)  rb   r?   rF   r9   r.   )r[   r\   r]   r*  rb   rg   s        rh   r8   z&EmployeeBankDetailsUpdateForm.__init__6  s    $)&)**, 	CG2BGMM  &&w/	C[[ 	VE=A[[=O=U=UDKK%%++M:	Vri   c                 "    d| i}t        d|      S r,  r   r   s       rh   r   z"EmployeeBankDetailsUpdateForm.as_p=  r-  ri   r  rn   s   @rh   r0  r0  (  s     B BVUri   r0  r   zBadge IDemployee_first_namez
First Nameemployee_last_namez	Last Namer   Emailr   Phoner   
Experiencer   Genderr   zDate of Birthr   Countryr!  Stater"  Cityr   AddresszipzZip Coder   zMarital StatuschildrenChildrenr   z	Is activeemergency_contactzEmergency Contactemergency_contact_namezEmergency Contact Nameemergency_contact_relationzEmergency Contact Relationemployee_work_info__emailz
Work Emailemployee_work_info__mobilez
Work Phone!employee_work_info__department_idr   #employee_work_info__job_position_idr   employee_work_info__job_role_idr   employee_work_info__shift_idr    employee_work_info__work_type_idr   (employee_work_info__reporting_manager_idzReporting Manager$employee_work_info__employee_type_idr   employee_work_info__locationLocation employee_work_info__date_joiningzDate Joining employee_work_info__basic_salaryzBasic Salaryemployee_work_info__salary_hourzSalary Hour%employee_work_info__contract_end_datezContract End Dateemployee_work_info__company_idCompany employee_bank_details__bank_namez	Bank Nameemployee_bank_details__branchBranch%employee_bank_details__account_numberzAccount Number&employee_bank_details__any_other_code1zBank Code #1&employee_bank_details__any_other_code2zBank Code #2employee_bank_details__countryzBank Countryemployee_bank_details__statez
Bank Stateemployee_bank_details__cityz	Bank City)r   r5  r6  r   r   r   rY  c                   N    e Zd Z ej                  eej                  g d      Zy)EmployeeExportExcelForm)r   r5  r6  r   r   r   rG  rH  rI  rJ  rK  rL  rM  rN  rP  rQ  rR  rS  rT  )r   r?   rB   N)rX   rj   rk   r   MultipleChoiceFieldexcel_columnsrT   selected_fieldsrw   ri   rh   r`  r`  y  s%    /e//++
Ori   r`  c                        e Zd Z ej                  e ed            Z ej                   ej                               Z
 fdZ xZS )BulkUpdateFieldFormzSelect Fields to Update)r   r.   r  c                 2   t        |   |i | | j                  d   j                  D cg c]  \  }}|t        vr||f }}}|| j                  d   _        | j                         D ]%  }d|j                  j                  j                  d<   ' y c c}}w )Nupdate_fieldsz>oh-select oh-select-2 select2-hidden-accessible oh-input w-100r'   )	r7   r8   r9   r   fields_to_remover)  rb   r?   rF   )r[   r\   r]   valuer.   updated_choicesr*  rg   s          rh   r8   zBulkUpdateFieldForm.__init__  s    $)&) !%O < D D
u,, EN
 

 0?O$,**, 	GP MM  &&w/	
s   B)rX   rj   rk   r   ra  rb  r@   rg  r.  HiddenInputbulk_employee_idsr8   rm   rn   s   @rh   re  re    sI    -E--Q'@%AM (/@u/@/@/BC ri   re  c                   L     e Zd ZdZ G d d      Z fdZddedef fdZ xZ	S )	EmployeeNoteFormz%
    Form for EmployeeNote model
    c                       e Zd ZdZeZdZy)EmployeeNoteForm.Metart   )descriptionN)rX   rj   rk   rl   r   rW   r9   rw   ri   rh   rx   rp    s    	 !ri   rx   c                 ~    t        |   |i | t        d      | j                  d<   d| j                  d   _        y )Nfilesr-   
note_filesF)r7   r8   MultipleFileFieldr9   r   r  s      rh   r8   zEmployeeNoteForm.__init__  s9    $)&)$5G$DL!-2L!*ri   commitreturnc                    g }g }d }| j                   j                  d      rt| j                   j                  d      }|d   | j                  _        g }|D ]>  }t	               }||_         |j                          |j                  |j                         @ t        |   |      }|r |j                  j                  |  ||fS )Nrt  r   )rs  getlistr   attachementr   saveappendr   r7   rt  add)r[   rv  rz  multiple_attachment_idsattachementsfile_instancer   rg   s          rh   r{  zEmployeeNoteForm.save  s    "$::l+::--l;L(4QDMM%&(#+ A )&1#""$'..}/?/?@	A
 7<'#H##%<=000ri   ).)
rX   rj   rk   rl   rx   r8   boolr   r{  rm   rn   s   @rh   rn  rn    s/    " "3
14 1# 1 1ri   rn  c                       e Zd ZdZy)MultipleFileInputTN)rX   rj   rk   allow_multiple_selectedrw   ri   rh   r  r    s    "ri   r  c                   *     e Zd Z fdZd fd	Z xZS )ru  c                 X    |j                  dt                      t        |   |i | y )Nr?   )
setdefaultr  r7   r8   r  s      rh   r8   zMultipleFileField.__init__  s)    ($5$78$)&)ri   c                     t         |   }t        |t        t        f      r|D cg c]  } |||       }}n
 |||      g}t        |      dk(  rg g}|d   S c c}w )Nr   )r7   r   rA   r   tupler   )r[   r   rB   single_file_cleandr   rg   s         rh   r   zMultipleFileField.clean  sh    !GMdT5M*=AB'73BFB'g67Fv;!TFay Cs   A)N)rX   rj   rk   r8   r   rm   rn   s   @rh   ru  ru    s    * ri   ru  c                   T     e Zd ZdZdddddZ G d d      Z fdZdd fd	
Z xZS )

PolicyFormz
    PolicyForm
       )rN   bodyis_visible_to_allr5   c                   L    e Zd ZeZdZddgZd ej                  ddd      iZ	y	)
PolicyForm.Metar   attachmentsr   r  r&   zdisplay:none;)zdata-summernotestyler   N)
rX   rj   rk   r   rW   r9   r   r   rR   r   rw   ri   rh   rx   r    s5     +.NENN*,G
ri   rx   c                 X    t        |   |i | t        dd      | j                  d<   y )NAttachementsF)r.   r   
attachment)r7   r8   ru  r9   r  s      rh   r8   zPolicyForm.__init__  s-    $)&)$5 5%
L!ri   Trv  c                b   g }g }d }| j                   j                  d      r`| j                   j                  d      }g }|D ]>  }t               }||_        |j	                          |j                  |j                         @ t        	|   |      }|r |j                  j                  |  ||fS )Nr  )
rs  ry  r   r  r{  r|  r   r7   r  r}  )
r[   rv  r\   r]   
attachemntr~  attachemntsr  r   rg   s
            rh   r{  zPolicyForm.save  s    
"$::l+**,,\:K&(#) A
 2 4+5(""$'..}/?/?@	A
 7<'$H  $$&=>$$ri   )	rX   rj   rk   rl   r2   rx   r8   r{  rm   rn   s   @rh   r  r    s6     "BOD
 

 "& % %ri   r  c                        e Zd Z G d d      Zy)BonusPointAddFormc                   F    e Zd ZeZddgZd ej                  ddi      iZy)BonusPointAddForm.Metapointsreasonr   r   N)	rX   rj   rk   r   rW   r9   r   r
   r   rw   ri   rh   rx   r    s-    H%oeooZ,DE
ri   rx   NrX   rj   rk   rx   rw   ri   rh   r  r    s    
 
ri   r  c                   2     e Zd Z G d d      Z fdZ xZS )BonusPointRedeemFormc                       e Zd ZeZdgZy)BonusPointRedeemForm.Metar  N)rX   rj   rk   r   rW   r9   rw   ri   rh   rx   r    s    ri   rx   c                 :   t         |          }t        j                  j	                  | j
                  j                        j                         }|r|j                  |d   k  rt        j                  ddi      |d   dk  rt        j                  ddi      y )N)r4   r  z!Not enough bonus points to redeemr   z+Points must be greater than zero to redeem.)r7   r   r   r   r   r   r4   rZ   r  r   r   )r[   r   available_pointsrg   s      rh   r   zBonusPointRedeemForm.clean  s    w}%--4411 5 

%' 	  #3#:#:\(=S#S''3V(WXX!Q&''HI  'ri   )rX   rj   rk   rx   r   rm   rn   s   @rh   r  r    s     
 
ri   r  c            	            e Zd Z G d d      Z ej
                  ej                  j                          e	d       ej                  ddd            Z fd	Zd
 Z xZS )DisciplinaryActionFormc                   J    e Zd ZeZdZddgZd ej                  ddi      iZ	y)	DisciplinaryActionForm.Metar   r   r   
start_dater   r   r   N)
rX   rj   rk   r   rW   r9   r   r   r	   r   rw   ri   rh   rx   r  (  s2    "k*/%//0@A
ri   rx   Actionr$   zactionTypeChange($(this))r   r   )rY   r.   r?   c                 X   t        |   |i | dt        d      fgt        | j                  d   j
                  j                  dd            z   }|| j                  d   _        | j                  j                  /| j                  d   xj                  dt        d      fgz  c_        y y )Nr&   z---Choose Action---actionr   rN   r   zCreate new action type )
r7   r8   r@   r   r9   rY   r   r   r   r   )r[   r\   r]   action_choicesrg   s       rh   r8   zDisciplinaryActionForm.__init__;  s    $)&)q!6789DKK!**66tWE=
 
 )7H%==#KK!))x;T9U.V-WW) $ri   c                 &    d| i}t        d|      }|S )zS
        Render the form fields as HTML table rows with Bootstrap styling.
        r   zcommon_form.htmlr   )r[   r   
table_htmls      rh   r   zDisciplinaryActionForm.as_pD  s      4.%&8'B
ri   )rX   rj   rk   rx   r   r   r   r   allr@   rO   r  r8   r   rm   rn   s   @rh   r  r  '  s^    
 
 $U####'')ku||J7
	FXri   r  c                   <     e Zd ZdddZ G d d      Z fdZ xZS )ActiontypeFormr  )rN   action_typec                       e Zd ZeZdZdgZy)ActiontypeForm.Metar   r   N)rX   rj   rk   r   rW   r9   r   rw   ri   rh   rx   r  Q  s    -ri   rx   c                     t        |   |i | | j                  d   j                  j                  j                  ddi       y )Nr  r   zactionChange($(this))r  r  s      rh   r8   zActiontypeForm.__init__V  sC    $)&)M"))//663	
ri   )rX   rj   rk   r2   rx   r8   rm   rn   s   @rh   r  r  M  s!    +D   

 
ri   r  c                   $    e Zd ZdZ G d d      Zy)EmployeeTagFormz
    Employee Tags form
    c                   :    e Zd ZdZeZdZdgZd eddd      iZ	y)	EmployeeTagForm.Metaz3
        Meta class for additional options
        r   r   colorzheight:50px)r   r  r   N)
rX   rj   rk   rl   r   rW   r9   r   r
   r   rw   ri   rh   rx   r  e  s.    	 -IW},UVWri   rx   Nry   rw   ri   rh   r  r  `  s    X Xri   r  c                        e Zd Z G d d      Zy) EmployeeGeneralSettingPrefixFormc                   l    e Zd ZeZdgZ ej                  ddi       ej                  ddi      dZ	y)%EmployeeGeneralSettingPrefixForm.Metar   r'   r#   r   zoh-select oh-select-2 w-100)badge_id_prefixr5   N)
rX   rj   rk   r   rW   r   r   r
   rO   r   rw   ri   rh   rx   r  r  s=    &+.ug?O5PQ&%,,g7T-UV
ri   rx   Nr  rw   ri   rh   r  r  p  s    
 
ri   r  c                        e Zd ZdZ ej
                   ej                  ddd      dd      Z ej
                   ej                  dd	d      dd
      Z G d d      Z	 fdZ
 fdZd Zd fd	Z xZS )UserLoginDetailsFormzI
    Form for creating and managing user login details for employees
    r#   zEnter passwordr(   r   FzFLeave blank to keep current password or if not creating a user account)r?   r   	help_textzConfirm passwordzConfirm the passwordc                       e Zd ZeZg dZ ej                  ddd       ej                  ddd       ej                  ddd       ej                  ddd       ej                  d	d
i      dZ
y)UserLoginDetailsForm.Meta)usernamer   
first_name	last_namer   r#   Usernamer(   r   zEmail addressz
First namez	Last namer'   r%   N)rX   rj   rk   r   rW   r9   r   r
   rK   rS   r   rw   ri   rh   rx   r    s    N'8HYc.de%U%%6FWf,gh)%//:J[g0hi(9IZe/fg,,,G=R3ST
ri   rx   c                 
   t        |   |i | | j                  d   j                  j                  j                  ddi       | j                  d   j                  j                  j                  ddi       | j                  d   j                  j                  j                  ddi       | j                  d   j                  j                  j                  dd	i       | j                  d
   j                  j                  j                  ddi       | j                  d   j                  j                  j                  ddi       | j                  d   j                  j                  j                  ddi       | j                  r?| j                  j                  r)d| j                  d   _        d| j                  d   _        y d| j                  d   _        d| j                  d   _        d| j                  d   _        y )Nr  r   id_login_usernamer   id_login_emailr  id_login_first_namer  id_login_last_namer   id_login_is_activepasswordid_login_passwordconfirm_passwordid_login_confirm_passwordTF)	r7   r8   r9   r?   rF   rH   r   r   r   r  s      rh   r8   zUserLoginDetailsForm.__init__  s   $)&) 	J&&,,33T;N4OPG##))00$8H1IJL!((..55t=R6STK ''--44d<P5QRK ''--44d<P5QRJ&&,,33T;N4OP&'..44;;TC^<_`==T]]--/3DKK
#,/4DKK
#, 04DKK
#,/3DKK
#,7;DKK*+4ri   c                     t         |          }|j                  d      }|j                  d      }|r|r||k7  rt        j                  d      |S )Nr  r  zPasswords do not match)r7   r   rG   r   r   )r[   r   r  r  rg   s       rh   r   zUserLoginDetailsForm.clean  sW    w}##J/'++,>?(++++,DEEri   c                 .   | j                   j                  d      }|rwt        j                  j	                  |      j                  | j                  r| j                  j                  nd       }|j                         rt        j                  d      |S )Nr  )r  r   zUsername already exists)r   rG   r   r   r   r   r   r   r   r   r   )r[   r  existing_users      rh   clean_usernamez#UserLoginDetailsForm.clean_username  sy    $$((4 LL///BJJbfbobodmmN^N^uyJzM##%++,EFFri   c                     t         |   d      }| j                  j                  d      }|r|j	                  |       t        |d      rd|_        |r|j                          |S )NFr  r  is_new_employee)r7   r{  r   rG   set_passwordr   r  )r[   rv  rU   r  rg   s       rh   r{  zUserLoginDetailsForm.save  s`    w|5|)$$((4h' 4*+#(D IIKri   )T)rX   rj   rk   rl   r   r.  PasswordInputr  r  rx   r8   r   r  r{  rm   rn   s   @rh   r  r  |  s     u"u""3CTd)efZH
 'u"u""3CTf)gh(	
 	
<,	 ri   r  )Hrl   loggingr   r   r   typingr   djangor   django.contrib.auth.modelsr   django.db.modelsr   django.formsr	   r
   django.template.loaderr   django.utils.translationr   r@   r   r   base.methodsr   r   employee.modelsr   r   r   r   r   r   r   r   r   r   r   r   horillar   horilla_audit.modelsr   	getLoggerrX   r   r    rp   r|   r   r   r  r  r0  rb  rh  Formr`  re  rn  ClearableFileInputr  	FileFieldru  r  r  r  r  r  r  r  r  rw   ri   rh   <module>r     s  .  	 #   +  - 3 1 : 7    ( 4			8	$r rjy  V9 VrTY) TYn@Y	 @YF'Ui 'UTUI U4+z"#+E,/0+ 5-.+ eGn	+
 eGn+ 5&'+ uX+ E/"#+ i !+ eGn+ U6]+ i !+ E*+ u-./+ z"#+  %$%!+" % 345#+$ u%=>?%+& "5)E#FG'+( !%"56)+* "5#67++, )%*=>-+. +E.,AB/+0 'j(9:1+2 $U7^43+4 ({);<5+6 07J1KL7+8 ,U?-CD9+: $U:%67;+< (~)>?=+> (~)>??+@ 'm(<=A+B -e4G.HIC+D &uY'78E+F ({);<G+H %eHo6I+J -e4D.EFK+L .u^/DEM+N .u^/DEO+P &u^'<=Q+R $U<%89S+T #E+$67U+X ejj 8%** (#1y #1L#00 #  &% &%R
	 
9 $#Y #L
Y 
&Xi X 	
u 	
R5?? Rri   