
    si                        d 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	 ddl
mZ ddlmZ ddlm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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. ddlm/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7 ddl8m9Z:  ejv                  e<      Z= G d de      Z> G d de      Z? G d de      Z@ G d de$      ZA G d d e      ZBd! 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d0      fd1 ed2      fd3 ed4      fd5 ed6      fd7 ed8      fd9 ed:      fd; ed<      fd= ed>      fd? ed@      fdA edB      fdC edD      fgZC G dE dFej(                        ZDg dGZE G dH dIej(                        ZFddJlGmHZH dK ZI G dL dMe      ZJ G dN dOeJ      ZK G dP dQe      ZL G dR dSe      ZM G dT dUeM      ZN G dV dWej                        ZP G dX dYej                        ZR G dZ d[e      ZS G d\ d]e      ZT G d^ d_e      ZUy)`z
These forms provide a convenient way to handle data input, validation, and customization
of form fields and widgets for the corresponding models in the payroll management system.
    N)Any)forms)appsrender_to_string)timezone)gettext_lazy)Form	ModelForm)reload_queryset)EmployeeFilter)
BonusPointEmployee)horilla_middlewares)_thread_locals)get_horilla_model_class)HorillaFormdefault_select_option_template)HorillaMultiSelectField)HorillaMultiSelectWidget)notify)
tax_models)		AllowanceContract	DeductionLoanAccountMultipleConditionPayslipPayslipAutoGenerateReimbursementReimbursementMultipleAttachment)component_widgetsc                        e Zd ZdZ ej
                  ej                  d      Z ej
                  d      Z	 e
d      Z G d d      Z fdZd	 Z fd
Zddedef fdZ xZS )AllowanceFormz"
    Form for Allowance model
    Fwidgetrequiredr'   r   c                       e Zd ZdZej
                  j
                  j                  ZdZdgZ	d e
j                  ddi      iZy)	AllowanceForm.Meta3
        Meta class for additional options
        __all__	is_activeone_time_datetypedateattrsN)__name__
__module____qualname____doc__payrollmodelsr   modelfieldsexcluder   DateTimeInputwidgets     A/var/www/python-projects/worksol/payroll/forms/component_forms.pyMetar*   7   I    	 %%//-0U007GH
r?   rA   c           
      2   |j                  d      x}r0i }|j                  d|j                  j                  d      i}||d<   t        |   |i | t        t        j                  j                         t        dt        dd| j                        d	
      | j                  d<   | j                  d   j                  j                  j                  ddi       t!        | j                         t        j"                  |       | j                  d   _        y Ninstancer.   z%Y-%m-%dinitialemployee-widget-filterfemployee_filters.html)filter_route_namefilter_classfilter_instance_contex_namefilter_template_pathrE   zSpecific Employees)querysetr&   labelspecific_employeesif_conditiononchangezrangeToggle($(this)))formstyle)getr.   strftimesuper__init__r   r   objectsallr   r   rE   r:   r&   r2   updater   StyleWidget)selfargskwargsrE   rF   	__class__s        r@   rX   zAllowanceForm.__init__C   s   zz*--8- G%%1#X%;%;%D%DZ%P !(F9$)&),C%%))++":+,/%< '
-
() 	N#**00772	

 	$&,&8&8d&CG#r?   c                 &    d| i}t        d|      }|S S
        Render the form fields as HTML table rows with Bootstrap styling.
        rS   zcommon_form.htmlr   r]   context
table_htmls      r@   as_pzAllowanceForm.as_pb         4.%&8'B
r?   c                    t        |   |i |}| j                  j                  d      }| j                  j	                  d      }| j                  j	                  d      }| j
                  j                         D ]  \  }}t        |t              s| j                  j                  |d        |s||st        j                  |di      t         |          }| j
                  |   j                  j                  | j                  j                  |            }	|	||<    t         |          }|j	                  d      dk(  rd|d	<   |j	                  d
      }
|j	                  d      }|
r|r||
k  rt        j                  ddi      |
s|st        j                  ddd      |
st        j                  d
di      |st        j                  ddi      y d |d
<   d |d<   y )NrP   include_active_employeesis_condition_basedThis field is requiredid__inrQ   ranger   	if_amountstart_range	end_range*End range cannot be less than start range.1This field is required when condition is "range".rq   rr   )rW   cleandatagetlistrU   r:   items
isinstancer   errorspopr   ValidationErrorrN   filterr]   r^   r_   cleaned_datarP   include_allcondition_based
field_namefield_instancerw   rq   rr   r`   s               r@   rv   zAllowanceForm.cleanj   s   w}d5f5!YY../CDiimm$>?))--(<=*.++*;*;*= 	0&J.*AB
D1*#++//=U0VWW$w}{{:.77>>99,,Z8 ?  ,0Z(	0 w}N+w6()L%&**=9K$((5IyY+-E++ "NO  y++'Z%X  !++"$WX  ++ "UV  
 +/L'(,L%r?   commitreturnc                 v   | j                   j                  d      }| j                   j                  d      }| j                   j                  d      }|s|s|sd| j                  _        t
        |   |       | j                   j                  d      }| j                   j                  d      }| j                   j                  d      }g }	 | j                  j                  r2| j                  j                  j                         j                          | j                  j                  rHt        |      D ]:  \  }	}
t        |
||	   ||	         }|j                          |j                  |       < |r# | j                  j                  j"                  |  |S # t        $ r}t!        |       Y d }~@d }~ww xY w	NrP   rj   rk   Tother_conditionsother_fieldsother_valuesfield	conditionvalue)rw   rx   rU   rE   rj   rW   savepkr   rZ   deleterk   	enumerater   append	Exceptionloggeraddr]   r   rP   r   r   r   r   r   multiple_conditionsindexr   r   er`   s                r@   r   zAllowanceForm.save   sp   !YY../CDiimm$>?))--(<=!+o59DMM2V99,,-?@yy((8yy((8 	}}..224;;=}}//$-l$; :LE5 1#"25"9*51!I
 NN$'..y9: .DMM**..0CD""	  	1II	   B&F 	F8#F33F8.)r3   r4   r5   r6   r   	CharFieldr&   AllowanceConditionalVisibilityloadrT   _verbose_namerA   rX   rg   rv   boolr   r   __classcell__r`   s   @r@   r$   r$   .   so     5??&"G"GRWXDEOOU+E[>L

 

D>0-d#4 ## # #r?   r$   c                        e Zd ZdZ ej
                  ej                  d      Z ej
                  d      Z	 e
d      Z G d d      Z fdZ fd	Zd
 Zddedef fdZ xZS )DeductionFormz"
    Form for Deduction model
    Fr%   r(   r   c                       e Zd ZdZej
                  j
                  j                  ZdZdgZ	d e
j                  ddi      iZy)	DeductionForm.Metar+   r,   r-   r.   r/   r0   r1   N)r3   r4   r5   r6   r7   r8   r   r9   r:   r;   r   r<   r=   r>   r?   r@   rA   r      rB   r?   rA   c           
         |j                  d      x}r0i }|j                  d|j                  j                  d      i}||d<   t        |   |i | t        t        j                  j                         t        dt        dd| j                        d	
      | j                  d<   | j                  d   j                  j                  j                  ddi       t!        | j                         t        j"                  |       | j                  d   _        | j                  j%                         D ]?  \  }}t'        |j                  t(        j*                        s+t,        |j                  _        A y rD   )rU   r.   rV   rW   rX   r   r   rY   rZ   r   r   rE   r:   r&   r2   r[   r   r\   ry   rz   r   Selectr   option_template_name)r]   r^   r_   rE   rF   r   r   r`   s          r@   rX   zDeductionForm.__init__   sF   zz*--8- G%%1#X%;%;%D%DZ%P !(F9$)&),C%%))++":+,/%< '
-
() 	N#**00772	

 	$&,&8&8d&CG#!%!2!2!4 	SJ%,,54R1	Sr?   c                    t        |   |i |}| j                  j                  d      }| j                  j	                  d      }| j                  j	                  d      }| j
                  j                         D ]  \  }}t        |t              s| j                  j                  |d        |s||st        j                  |di      t         |          }| j
                  |   j                  j                  | j                  j                  |            }	|	||<    t         |          }|j	                  d      dk(  rd|d	<   |j	                  d
      }
|j	                  d      }|
r0|r.t        |      t        |
      k  rt        j                  ddi      |
s|st        j                  ddd      |
st        j                  d
di      |s!t        j                  ddi      d |d
<   d |d<   | j                  j	                  d      3| j                  j	                  d      dk7  r| j                  j                  d      Gt!        | j                  j                  d            dk(  r t        j                  dt#        d      i      | j                  j	                  d      >| j                  j	                  d      dk(  r t        j                  dt#        d      i      | j                  j	                  d      >| j                  j	                  d      dk(  r t        j                  dt#        d      i      |S )NrP   rj   rk   rl   rm   rQ   ro   r   rp   rq   rr   rs   rt   ru   update_compensation z You need to choose the employee.r.   zThis field is required.amount)rW   rv   rw   rx   rU   r:   ry   rz   r   r{   r|   r   r}   rN   r~   intlenr   r   s               r@   rv   zDeductionForm.clean   s   w}d5f5!YY../CDiimm$>?))--(<=*.++*;*;*= 	0&J.*AB
D1*#++//=U0VWW$w}{{:.77>>99,,Z8 ?  ,0Z(	0 w}N+w6()L%&**=9K$((5IyS^s;?O-O++ "NO  y++'Z%X  !++"$WX  ++ "UV  +/L'(,L% IIMM/0<		34: 		!!"67?		))*>?@AE++)1-O+PQ 
 		o.6IIMM/2b8++$a(A&BC  yy}}X&.499==3Jb3P++Xq9R7S,TUUr?   c                 &    d| i}t        d|      }|S rb   r   rd   s      r@   rg   zDeductionForm.as_p:  rh   r?   r   r   c                 v   | j                   j                  d      }| j                   j                  d      }| j                   j                  d      }|s|s|sd| j                  _        t
        |   |       | j                   j                  d      }| j                   j                  d      }| j                   j                  d      }g }	 | j                  j                  r2| j                  j                  j                         j                          | j                  j                  rHt        |      D ]:  \  }	}
t        |
||	   ||	         }|j                          |j                  |       < |r# | j                  j                  j"                  |  |S # t        $ r}t!        |       Y d }~@d }~ww xY wr   )rw   rx   rU   rE   rj   rW   r   r   r   rZ   r   rk   r   r   r   r   printr   r   s                r@   r   zDeductionForm.saveB  sp   !YY../CDiimm$>?))--(<=!+o59DMM2V99,,-?@yy((8yy((8 	}}..224;;=}}//$-l$; :LE5 1#"25"9*51!I
 NN$'..y9: .DMM**..0CD""	  	!HH	r   r   )r3   r4   r5   r6   r   r   r&   DeductionConditionalVisibilityr   rT   r   r   rA   rX   rv   rg   r   r   r   r   r   s   @r@   r   r      sq     5??&"G"GRWXDEOOU+E[>L

 

SBHT#4 ## # #r?   r   c                   B     e Zd ZdZddddZ fdZ G d d      Z xZS )PayslipForm
    Form for Payslip
       employee_id
start_dateend_datec                    t        |   |i | t        j                  j	                  d      }|D cg c]:  }|j
                  j                  r"|j
                  j                  |j
                  f< c}| j                  d   _	        | j                  d   j                  j                  j                  dddddd	       | j                  j                  gt        j                   j#                         j%                  d
      | j&                  d<   t        j                   j#                         | j&                  d<   y y c c}w )Nactive)contract_statusr   "/payroll/check-contract-start-date#contractStartDateDiv#payslipCreateFormchange delay:300ms	innerHTML)hx-get	hx-target
hx-include
hx-triggerhx-swap   dayr   r   )rW   rX   r   rY   r~   r   r-   idr:   choicesr&   r2   r[   rE   r   datetimer0   todayreplacerF   )r]   r^   r_   active_contractscontractr`   s        r@   rX   zPayslipForm.__init__k  s   $)&)#++2282L -.
##-- !!$$h&:&:;.
M"*
 	M"))//66>422&	
 ==#)1)<)<)>)F)F1)F)MDLL&'/}}':':'<DLL$ $.
s   ?D?c            	           e Zd ZdZej
                  j
                  j                  Zg dZdgZ	 e
j                  dddddd	d
       e
j                  ddi      dZy)PayslipForm.Metar+   r   r-   r0   r   r   r   r   r   )r/   r   r   r   r   r   r1   r/   r   r   N)r3   r4   r5   r6   r7   r8   r   r9   r:   r;   r   	DateInputr=   r>   r?   r@   rA   r     st    	 %%--

 -)%//"B!8"6"6*	 (F
r?   rA   )r3   r4   r5   r6   colsrX   rA   r   r   s   @r@   r   r   `  s)    
 D=*
 
r?   r   c            	       \    e Zd ZdZ ej
                  dd      Z eej                  j                          ededd      d	d
      Z ej                   ej                  ddi            Z ej                   ej                  ddi            Z fdZ fdZ G d d      Z xZS )GeneratePayslipFormr   z
Batch nameTrO   r'   rG   rH   rI   )rJ   rK   rL   rM   r   )rN   r&   rO   r'   r/   r0   r1   )r&   c                 L   t         |          }|j                  d      }|j                  d      }t        j                  j                         }||k  rt        j                  ddi      ||kD  rt        j                  ddi      ||kD  rt        j                  ddi      |S )Nr   r   z=The end date must be greater than or equal to the start date.z'The start date cannot be in the future.z%The end date cannot be in the future.)rW   rv   rU   r   r0   r   r   r}   )r]   r   r   r   r   r`   s        r@   rv   zGeneratePayslipForm.clean  s    w}!%%l3
##J/##%j '' _ 
 ''FG  e''DE  r?   c                    t        |   |i | t        j                  j	                  ddd      | j
                  d   _        | j
                  d   j                  j                  j                  dt        j                         d       | j
                  d   j                  j                  j                  d	d
i       | j
                  d   j                  j                  j                  d	d
i       | j
                  d   j                  j                  j                  d	d
i       t        j                  j                         j                  d      | j                   d<   t        j                  j                         | j                   d<   y )NTFr   )r-   contract_set__isnullcontract_set__contract_statusr   oh-select oh-select-2)classr   r   r   oh-input w-100
group_namer   r   r   )rW   rX   r   rY   r~   r:   rN   r&   r2   r[   uuiduuid4r   r0   r   r   rF   r]   r^   r_   r`   s      r@   rX   zGeneratePayslipForm.__init__  s:   $)&).6.>.>.E.E!&*2 /F /
M"+
 	M"))//66-TZZ\B	
 	L!((..55w@P6QRL!((..55w@P6QRJ&&,,33W>N4OP%-]]%8%8%:%B%Bq%B%I\"#+==#6#6#8Z r?   c                   f    e Zd ZdZ ej
                  ddi       ej
                  ddi      dZy)GeneratePayslipForm.Metar+   r/   r0   r1   r   N)r3   r4   r5   r6   r   r   r=   r>   r?   r@   rA   r     s6    	
 *%//0@A'vv.>?
r?   rA   )r3   r4   r5   r6   r   r   r   r   r   rY   noner   r   r   	DateFieldr   r   r   rv   rX   rA   r   r   s   @r@   r   r     s     !J
 *!!&&('6'(+!8	
 
K !vv>N(OPJuoeooVV<L&MNH.9 
 
r?   r   c                   $    e Zd ZdZ G d d      Zy)PayrollSettingsFormz(
    Form for PayrollSettings model
    c                   ,    e Zd ZdZej
                  ZdZy)PayrollSettingsForm.Metar+   r,   N)r3   r4   r5   r6   r8   PayrollSettingsr9   r:   r>   r?   r@   rA   r     s    	 &&r?   rA   Nr3   r4   r5   r6   rA   r>   r?   r@   r   r     s     r?   r   r   r   r   Batchr   z
Start Dater   zEnd Datecontract_wagezContract Wage	basic_pay	Basic Pay	gross_payz	Gross Pay	deductionr   net_payzNet PaystatusStatus-employee_id__employee_bank_details__bank_namez	Bank Name*employee_id__employee_bank_details__branchBranch2employee_id__employee_bank_details__account_numberzAccount Number3employee_id__employee_bank_details__any_other_code1zBank Code #13employee_id__employee_bank_details__any_other_code2zBank Code #2+employee_id__employee_bank_details__countryCountry)employee_id__employee_bank_details__stateState(employee_id__employee_bank_details__cityCityc                   N    e Zd Z ej                  eej                  g d      Zy)PayslipExportColumnForm)r   r   r   r   r   r   r   r   r   r&   rF   N)r3   r4   r5   r   MultipleChoiceFieldexcel_columnsCheckboxSelectMultipleselected_fieldsr>   r?   r@   r	  r	    s%    /e//++	
Or?   r	  )r   contract_documentr-   noter  
created_atc            
       &   e 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 )ContractExportFieldFormr   )contract_namer   contract_start_datecontract_end_date	wage_typewagefiling_statusr   r
  N)r3   r4   r5   r   _meta
get_fieldsmodel_fieldshasattrnameexclude_fieldsr   field_choicesr   r  r  r  ).0r   r  r  s   0000r@   r  r  !  s    >>,,.L " 5.)ejj.N 
U''(M
 0e//++	
Os   =B
r  )r}   c                 h    | dk  rt        t        d            | dkD  rt        t        d            y)z
    Percentage validator
    r   zRate must be greater than 0d   zRate must be less than 100N)r}   r   )r   s    r@   rate_validatorr$  ;  s9     qya =>??s{a <=>> r?   c                       e Zd ZdZ ej
                  d      Z ej                   ej                         d      Z	 ej                  d ej                               Z ej                  dd	d ej                         
      Z ej                   dd      Z ej$                  dgd      Z ej(                  egdd      ZddZ fdZ xZS )	BonusForm
    Bonus Creating Form
    r#  )
max_lengthFr%   r   )rO   r&   zIs FixedT)rO   rF   r'   r&   Amountr   )	BASIC_PAYr   )r   r'   Rate)
validatorsrO   r'   c                    | j                   d   }| j                   d   }| j                   d   }| j                   d   }| j                   d   }| j                   d   }t               }||_        ||_        d|_        ||_        ||_        ||_        |j                          d|_	        |j                  j                  |g       |j                          |S )	Ntitler0   r   r   is_fixedrateTF)r   r   r.  r.   only_show_under_employeer   r/  r0  r   rj   rP   set)	r]   r   r.  r0   r   r   r/  r0  bonuss	            r@   r   zBonusForm.save]  s    !!'*  (''6""8,$$Z0  (")-&!


).&  $$k]3

r?   c                 t   t        |   |i | | j                  j                         D ],  \  }}|j                  j
                  j                  ddi       . t        j                  ddd      | j                  d   _        | j                  d   j                  j
                  j                  ddi       y )Nr   r   r0   r/   r   r1   r/  oh-switch__checkbox)	rW   rX   r:   ry   r&   r2   r[   r   r   )r]   r^   r_   r   r   r`   s        r@   rX   zBonusForm.__init__s  s    $)&)!%!2!2!4 	CJLL%%w0@&AB	C%*__!,<=&
F" 	J&&,,33W>S4TUr?   T)r3   r4   r5   r6   r   r   r.  r   r   r0   IntegerFieldHiddenInputr   BooleanFieldCheckboxInputr/  DecimalFieldr   ChoiceFieldbased_on
FloatFieldr$  r0  r   rX   r   r   s   @r@   r&  r&  E  s     EOOs+E5??/%//"3eDD$%$$:>Oe>O>O>QRK!u!!$?Ru?R?R?TH  UF !u  *D)EPUVH5
 D,V Vr?   r&  c                        e Zd Z fdZ xZS )PayslipAllowanceFormc                 p    t        |   |i | t        j                         | j                  d   _        y )Nr0   )rW   rX   r   r9  r:   r&   r   s      r@   rX   zPayslipAllowanceForm.__init__~  s/    $)&)%*%6%6%8F"r?   )r3   r4   r5   rX   r   r   s   @r@   rA  rA  }  s    9 9r?   rA  c                   :    e Zd ZdZ ed      Z G d d      Zd Zy)PayslipDeductionFormr'  r   c                   >    e Zd ZeZg dZd ej                         iZy)PayslipDeductionForm.Meta)r.  r.   r   is_tax	is_pretaxr/  r   r>  r0  employer_ratehas_max_limitmaximum_amountr.   N)	r3   r4   r5   r   r9   r:   r   r9  r=   r>   r?   r@   rA   rF    s(    
 .U..0
r?   rA   c                 &    d| i}t        d|      }|S )rc   rS   zone_time_deduction.htmlr   rd   s      r@   rg   zPayslipDeductionForm.as_p  s      4.%&?I
r?   N)r3   r4   r5   r6   r   r   rA   rg   r>   r?   r@   rD  rD    s!     [>L
 
,r?   rD  c                   J     e Zd ZdZdZ G d d      Zd Z fdZ fdZ xZ	S )LoanAccountFormz
    LoanAccountForm
    zLoan / Advanced Sarlaryc                   r    e Zd ZeZdZddgZ ej                  ddi       ej                  ddi      dZ	y)	LoanAccountForm.Metar,   r-   settled_dater/   r0   r1   )provided_dateinstallment_start_dateN)
r3   r4   r5   r   r9   r:   r;   r   r<   r=   r>   r?   r@   rA   rP    sG    /0U007GH&9e&9&9@P&Q
r?   rA   c                 &    d| i}t        d|      }|S rb   r   rd   s      r@   rg   zLoanAccountForm.as_p  rh   r?   c                    t        |   |i | t        t        j                  j                               | j                  d<   t        t        j                  j                               | j                  d<   | j                  j                  r| j                  j                  | _
        ddg}t        j                  j                  t        | j                  j                  j!                  dd                  j#                         r|g dz   }t        | j                  j$                        | j                  d<   |D ]  }|| j&                  v s| j&                  |=   y y )	NrR  rS  r   r   T)flat)installment_ids__in)loan_amountinstallmentsinstallment_amount)rW   rX   strr   r0   r   rF   rE   r   r.  r   r   rY   r~   listdeduction_idsvalues_listexistsrR  r:   )r]   r^   r_   fields_to_excluder   r`   s        r@   rX   zLoanAccountForm.__init__  s(   $)&)(+HMM,?,?,A(B_%14X]]5H5H5J1K-.== $ 3 3D!.0H I%%$(MM//;;Dt;L% &  fh	
 %6 9 %!
 -00K0K,LDLL)* +DKK'E*+ r?   c                 <   t        |   |i |}| j                  j                  s8|j	                  d      |j	                  d      k  rt        j                  d      |j	                  d      d k7  r)|j	                  d      dk  rt        j                  d      |S )NrS  rR  zGInstallment start date should be greater than or equal to provided daterY  r   z+Installments needs to be a positive integer)rW   rv   rE   r   rU   r   r}   )r]   r^   r_   r   r`   s       r@   rv   zLoanAccountForm.clean  s    w}d5f5}}L$4$4$%
_-%. ''Y  N+t3/14++A  r?   )
r3   r4   r5   r6   r   rA   rg   rX   rv   r   r   s   @r@   rN  rN    s-     -L
 
+, r?   rN  c                   .     e Zd Z ed      Z fdZ xZS )AssetFineFormz
Asset Finec                 \   t        |   |i | t        d      | j                  d   _        t        d      | j                  d   _        ddg}|D ]  }|| j                  v s| j                  |=   g d}|D ci c]!  }|| j                  v s|| j                  |   # c}| _        y c c}w )NzFine AmountrX  z	Fine DaterR  r   r/   )r.  rX  rR  descriptionrY  rS  rZ  settled)rW   rX   r   r:   rO   )r]   r^   r_   r`  r   field_orderr`   s         r@   rX   zAssetFineForm.__init__  s    $)&)+,]+;M"(-.{^O$* 
 ' 	'E#KK&	'	
 4?
*/%4;;BVE4;;u%%
 
s   :B)B))r3   r4   r5   r   r   rX   r   r   s   @r@   rc  rc    s    \?L
 
r?   rc  c                       e Zd ZdZy)MultipleFileInputTN)r3   r4   r5   allow_multiple_selectedr>   r?   r@   ri  ri    s    "r?   ri  c                   *     e Zd Z fdZd fd	Z xZS )MultipleFileFieldc                 X    |j                  dt                      t        |   |i | y )Nr&   )
setdefaultri  rW   rX   r   s      r@   rX   zMultipleFileField.__init__  s)    ($5$78$)&)r?   c                     t         |   }t        |t        t        f      r|D cg c]  } |||       }}n
 |||      g}|r|d   S d S c c}w )Nr   )rW   rv   rz   r\  tuple)r]   rw   rF   single_file_cleandresultr`   s         r@   rv   zMultipleFileField.clean  s\    !GMdT5M*=AB'73BFB'g67F"vay,, Cs   A)N)r3   r4   r5   rX   rv   r   r   s   @r@   rl  rl    s    *- -r?   rl  c                        e Zd ZdZddiZdZ G d d      Z fdZd Zd	 Z	d
 Z
d Zd Zd Z fdZddedef fdZ xZS )ReimbursementFormz3
    Optimized Reimbursement / Encashment Form
    re  r   zReimbursement / Encashmentc                       e Zd ZeZdZdgZy)ReimbursementForm.Metar,   r-   N)r3   r4   r5   r    r9   r:   r;   r>   r?   r@   rA   rw  #  s    -r?   rA   c                    t        |   |i | t        t        j                  dd       | _        | j                         | _        | j                  j                  s4t        t        j                  j                               | j                  d<   | j                  r| j                  j                  nd | j                  d<   | j!                          y )Nrequestallowance_onr   )rW   rX   getattrr   r   ry  get_employeeemployeerE   r   r[  r   r0   r   rF   r   configure_fieldsr   s      r@   rX   zReimbursementForm.__init__(  s    $)&)2AA9dS))+}}+.x}}/B/B/D+EDLL(:>--dmm&6&6T]#r?   c                    t        | j                  d      r,| j                  j                  r| j                  j                  S | j                  d   j                  }| j
                  r| j
                  j                  d      nd}|r$|j                  |      j                         x}r|S | j                  ry| j                  j                  j                  x}rW| j                  j                  s||v r|S | j                  j                  r%|j                  | j                  j                  k(  r|S |j                         S )z3Resolves employee either from form data or request.r   N)r   )r  rE   r   r:   rN   rw   rU   r~   firstry  useremployee_getr   r   )r]   employee_qsr   emps       r@   r|  zReimbursementForm.get_employee5  s    4==-0T]]5N5N==,,,kk-0996:iidiimmM2T;#5#5#5#E#K#K#MMCMJ<<DLL$5$5$B$BBSB==##{(:
}}CFFdmm.G.G$G
  ""r?   c                 X    t        dd      }|j                  j                  |dd      S )Nleave	leavetype	app_labelr9   r   T)%employee_available_leave__employee_id/employee_available_leave__total_leave_days__gteis_encashable)r   rY   r~   )r]   r}  	LeaveTypes      r@   get_encashable_leavesz'ReimbursementForm.get_encashable_leavesH  s5    +g[Q	  ''2:<= ( 
 	
r?   c                 ^   g }| j                   r6| j                   j                  j                  d      s|j                  d       | j	                          d| j
                  d   j                  j                  d<   d| j
                  d   j                  j                  d<   t        j                  ddd	
      | j
                  d   _        t        d      | j
                  d<   d| j
                  d   j                  j                  d<   |D ]  }| j
                  j                  |d          y )Nzpayroll.add_reimbursementr   ztoggleReimbursmentType($(this))r/   rR   zgetAssignedLeave($(this))r0   r   r5  r1   rz  Attachments)rO   
attachmentz.jpg, .jpeg, .png, .pdfaccept)ry  r  has_permr   setup_leave_fieldsr:   r&   r2   r   r   rl  r|   )r]   r  r   s      r@   r~  z"ReimbursementForm.configure_fieldsP  s   << 1 1 : :;V W!!-0!7XF""((4 ( 	M"))//	
 .3__!,<=.
N#* %6M$JL!;TL!((..x8 $ 	)EKKOOE4(	)r?   c                 h   t        j                  d      r| j                  syt        dd      }| j	                  | j                        }|j
                  j                  || j                        | _        || j                  d   _	        d| j                  d   _
        d| j                  d   _
        y)z:Setup leave-related fields only if leave app is installed.r  Navailableleaver  )leave_type_id__inr   leave_type_idr   )r   is_installedr}  r   r  rY   r~   assigned_leavesr:   rN   empty_label)r]   AvailableLeaver  s      r@   r  z$ReimbursementForm.setup_leave_fieldsi  s      )0%5
 44T]]C-55<<-4==  =  
 1@O$-37O$015M".r?   c                 n   | j                   r| j                   j                  d      n#| j                  r| j                  j                  nd}| j                  xr | j                  j                  }|dk(  r
|r|g dz  }y|dk(  r|s| j                   r|g dz  }y|dk(  r|s| j                   r|g dz  }yyy)	z0Determine which fields to exclude based on type.r/   Nreimbursement)r  cfd_to_encashad_to_encashbonus_to_encashleave_encashment)r  r   r  bonus_encashment)r  r   r  r  r  )rw   rU   rE   r/   r   )r]   r  r/   is_edits       r@   exclude_fields_by_typez(ReimbursementForm.exclude_fields_by_typez  s     yy IIMM&!'+}}##$ 	
 --4DMM$4$4?"w  N ''W		IIN''W		  N 9B'r?   c                 &    d| i}t        d|      }|S rb   r   rd   s      r@   rg   zReimbursementForm.as_p  rh   r?   c                 p   t         |          }|j                  d      }|j                  d      }|r|s|S |dk(  r| j                  j                  r| j                  j
                  n|j                  d      }t        j                  j                  |      j                         }|<|dk  r| j                  dd       |S |r|j                  |k  r| j                  dd       |S |d	k(  r| j                  j                  r| j                  j                  n|j                  d
      }| j                  j                  r| j                  j                  n|j                  dd      }| j                  j                  r| j                  j                  n|j                  dd      }|s| j                  d
d       |S | j                  |      }	||	vr| j                  d
d       |S t!        dd      }
|
j                  j                  ||      j                         }|r|dk  r| j                  dt#        d             n*||j$                  kD  r| j                  dt#        d             |dk  r| j                  dt#        d             |S ||j&                  kD  r| j                  dt#        d             |S )Nr/   r   r  r  )r   r   z+Points must be greater than zero to redeem.z!Not enough bonus points to redeemr  r  r  r  rl   z!This leave type is not encashabler  r  )r  r   zValue can't be negative.z&Not enough carryforward days to redeemz#Not enough available days to redeem)rW   rv   rU   rE   r   r  r   rY   r~   r  	add_errorpointsr  r  r  r  r   r   carryforward_daysavailable_days)r]   r   type_r}  r  available_points
leave_typer  r  
encashabler  available_leaver`   s               r@   rv   zReimbursementForm.clean  s   w}  (##M2H&& ==## --!%%&78 
  *1188X8NTTV*"a'NN)+Xr m *-=-D-D-VNN)+Nj c (( ==## ++!%%o6  ==## ++!%%oq9  ==## **!%%na8  0HI> ; "77A
Z/NN?4WX6 3 &=WFV%WN&4&<&<&C&C&0h 'D 'eg $ '(1, NN /3M1N +_-N-NN NN / !"J K
 (!+ NN .2L0M  *O,J,JJ NN .2W0X r?   r   r   c                 D   g }| j                   j                   }| j                  j                  d      }|r|d   | j                   _        t
        |   |      }|rj|D cg c]  }t        |       }}t        j                  j                  |      }|D 	cg c]  }	|	j                   }}	 |j                  j                  |  |r	 |j                  j                  j                  }
|
r|
j                  rt!        j"                  |j                  |
j                  d|j                   dd|j                   dd|j                   dd	|j                   dd
|j                   ddd|j$                   	       ||fS ||fS c c}w c c}	w # t&        $ r Y ||fS w xY w)Nr  r   )r   )r  z4You have a new reimbursement request to approve for .uf   لديك طلب استرداد نفقات جديد يتعين عليك الموافقة عليه لـ uB   Sie haben einen neuen Rückerstattungsantrag zur Genehmigung für z:Tienes una nueva solicitud de reembolso para aprobar para uB   Vous avez une nouvelle demande de remboursement à approuver pour informationz/payroll/view-reimbursement?id=)	recipientverbverb_arverb_deverb_esverb_friconredirect)rE   r   filesrx   r  rW   r   r!   rY   bulk_createother_attachmentsr   r   employee_work_inforeporting_manager_idemployee_user_idr   sendr   r   )r]   r   multiple_attachment_idsis_newattachmentsrE   fileattachment_objscreated_attachmentsobjmanagerr`   s              r@   r   zReimbursementForm.save  s   "$]]%%%jj((6'21~DMM$7<v<.MXEI/4@O  #B"I"I"U"U# :M&M#svv&M#&M*H&&**,CD"..AAVVw77KK ,,")":":ST\ThThSiijk #I  JR  J^  J^  I_  _`  !a"demeyeydzz{ |"\]e]q]q\rrs t"demeyeydzz{ |*#B8;;-!P
 $$x$$7 'N$  $$s   "FFB3F 	FFr7  )r3   r4   r5   r6   r   r   rA   rX   r|  r  r~  r  r  rg   rv   r   r   r   r   r   s   @r@   ru  ru    se     2D/L   
 #&
)26"6L\&%4 &%3 &% &%r?   ru  c                   $    e Zd ZdZ G d d      Zy)ConditionFormz!
    Multiple condition form
    c                       e Zd ZeZg dZy)ConditionForm.Metar   N)r3   r4   r5   r   r9   r:   r>   r?   r@   rA   r    s    
r?   rA   Nr   r>   r?   r@   r  r    s    
 
r?   r  c                   &    e Zd Z G d d      Zd Zy)PayslipAutoGenerateFormc                       e Zd ZeZg dZ ej                  ddi       ej                  ddi       ej                  ddi      dZ	y)PayslipAutoGenerateForm.Meta)generate_day
company_idauto_generater   r   r1   r6  N)
r3   r4   r5   r   r9   r:   r   r   r;  r=   r>   r?   r@   rA   r  $  sQ    #@(ELL9P/QR&%,,g7N-OP0U00AV7WX
r?   rA   c                 &    d| i}t        d|      }|S rb   r   rd   s      r@   rg   zPayslipAutoGenerateForm.as_p-  rh   r?   N)r3   r4   r5   rA   rg   r>   r?   r@   r  r  #  s    
 
r?   r  )Vr6   r   loggingr   typingr   djangor   django.appsr   django.template.loaderr   django.utilsr   django.utils.translationr	   r   payroll.models.modelsr7   
base.formsr
   r   base.methodsr   employee.filtersr   employee.modelsr   r   horillar   horilla.horilla_middlewaresr   horilla.methodsr   horilla_widgets.formsr   r   2horilla_widgets.widgets.horilla_multi_select_fieldr   &horilla_widgets.widgets.select_widgetsr   notifications.signalsr   payroll.modelsr   r8   r   r   r   r   r   r   r   r    r!   payroll.widgetsr"   r&   	getLoggerr3   r   r$   r   r   r   r   r  r	  r  r  django.core.exceptionsr}   r$  r&  rA  rD  rN  rc  ClearableFileInputri  	FileFieldrl  ru  r  r  r>   r?   r@   <module>r     s\  
       3 ! 6  & ( + 0 ' 6 3 M V K ( /
 
 
 8			8	$I#I I#Xc#I c#L<
) <
~G
+ G
T)  AjM"1W:1\?#:a()!K.!!K.!!K.!)q{4anE11X;?91=M;NO:An<MN:An<MN2AiLA0!G*=/6;%,ejj " Xejj . 3?5V 5Vp99 9#9 #L=i =@
O 
>#00 #- -w%	 w%t
I 
i r?   