
    vg#                       d Z ddlZddlmZ ddlmZmZmZ ddlmZ ddl	m
Z
 ddlZddlZddlmZ ddlmZmZ dd	lmZmZmZ dd
lmZmZmZ ddlmZ ddlmZ ddlm Z  ddl!m"Z# ddl$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+ ddl,m-Z- ddl.m/Z/m0Z0 ddl1m2Z2m3Z3m4Z4m5Z5 ddl6m7Z7 ddl8m9Z9 ddl:m;Z; ddl<m=Z= ddl>m?Z?m@Z@mAZA ddlBmCZCmDZDmEZE ddlFmGZGmHZH ddlImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQ ddlRmSZS  e#d       e#d       e#d       e#d      d ZTd! ZUe3 e5d"      d#               ZVe3 e5d$      d%               ZWe3e2 e5d$      d&                      ZXe3 e5d$      d'               ZYe3 e5d$      d(               ZZe3e2 e5d)      d*                      Z[e3 e5d+      d,               Z\e3 e4d+eJ      d-               Z]e3e2 e5d+      d.                      Z^e3 e5d/      d0               Z_e3 e5d1      d2               Z`d3 Zae3 e5d1      d4               Zbe3d5        Zce3d6        Zde3 e5d7      d8               Zee3 e5d"      d9               Zfe3 e5d+      d:               Zge3d;        Zhd< Zie3d=        Zjd> Zkd? Zle3 e5d7      d@               Zme3 e5d1      dA               Zne3 e5d"      dB               Zoe3 e5d)      dC               ZpdD ZqdXdEZrdF Zse3 e5d+      dG               Zte3dH        Zue3dI        Zve3dJ        Zwe3dK        Zxe3e2dL               Zye3dM        Zze3dN        Z{e3 e5dO      dP               Z|e3 e5dQ      dR               Z}e3e2 e5dS      dYdT                     Z~e3 e5dS      dU               Ze3e2 e5dV      dW                      Zy)ZzM
views.py

This module is used to define the method for the path in the urls
    N)defaultdict)datedatetime	timedelta)groupby)parse_qs)messages)ProtectedErrorQ)HttpResponseHttpResponseRedirectJsonResponse)get_object_or_404redirectrender)render_to_string)reverse)timezone)gettext_lazy)closest_numberseval_validateexport_datagenerate_colorsgenerate_pdfget_key_instancessortby)Company)EmployeeEmployeeWorkInformation)hx_request_requiredlogin_requiredowner_can_enterpermission_required)group_by_queryset)HORILLA_DATE_FORMATS)notify)get_active_employees)ContractFilterContractReGroupPayslipFilter)ContractExportFieldFormPayrollSettingsFormPayslipAutoGenerateForm)paginator_qrysave_payslip)ContractFilingStatusPayrollGeneralSettingPayslipPayslipAutoGenerateReimbursementReimbursementFileReimbursementrequestComment)PayrollSettingsDraftzReview Ongoing	ConfirmedPaid)draftreview_ongoing	confirmedpaidc                 N    t        d      }t        d      }||d}t        |      S )NzName of EmployeesAmount)scale_x_textscale_y_text)_r   )requestrB   rC   responses       '/var/www/horilla/payroll/views/views.pyget_language_coderH   J   s+    ()LX;L ,lKH!!    zpayroll.add_contractc                 .   ddl m}  |       }| j                  dk(  rk || j                  | j                        }|j                         r>|j                          t        j                  | t        d             t        t              S t        | dd|i      S )z
    Contract create view
    r   ContractFormPOSTzContract Createdpayroll/common/form.htmlform)payroll.forms.formsrL   methodrM   FILESis_validsaver	   successrD   r   contract_viewr   )rE   rL   rO   s      rG   contract_createrW   Q   su     1>D~~GLL'--8==?IIKWa(:&;<M**'5~FFrI   zpayroll.change_contractc                    ddl m} t        j                  j	                  |      j                         }|s.t        j                  | t        d             t        t              S  ||      }| j                  dk(  rm || j                  | j                  |      }|j                         r>|j                          t        j                   | t        d             t        t              S t#        | dd	|i      S )
a3  
    Update an existing contract.

    Args:
        request: The HTTP request object.
        contract_id: The ID of the contract to update.

    Returns:
        If the request method is POST and the form is valid, redirects to the contract view.
        Otherwise, renders the contract update form.

    r   rK   idz The contract could not be found.instancerM   zContract updatedrN   rO   )rP   rL   r0   objectsfilterfirstr	   inforD   r   rV   rQ   rM   rR   rS   rT   rU   r   )rE   contract_idkwargsrL   contractcontract_forms         rG   contract_updatere   c   s     1&&+&6<<>Hgq!CDE&& (3M~~$W\\7==8T!!# Wa(:&;<M**"M	
 rI   c                 
   ddl m} | j                  j                         }| j                  dk(  rSt
        j                  j                  |      }| j                  j                  d      rg| j                  j                  d      }|t        |j                        j                         v rd}|dv rt
        j                  j                  d	|j                  
      j                         }t
        j                  j                  d|j                  
      j                         }|d	k(  r|s|dk(  r=|r;d}t        j                   | t#        d      j%                  ||j                               |rV||_        |j)                          t        j*                  | t#        d             nt        j,                  | t#        d             t/        d|       S  || j                  | j0                  |      }	|	j3                         r:|	j)                          t        j*                  | t#        d             t;        d      S |	j4                  j7                         D ]  }
|
D ]  }t        j8                  | |        ! t;        d      S y )Nr   rK   rM   rY   viewstatusTactiver<   rj   contract_statusemployee_idr<   F$An {} contract already exists for {}2The contract status has been updated successfully.z2You selected the wrong option for contract status./payroll/contract-filter?r[   zContract status updatedz3<script>$('#reloadMessagesButton').click()</script>)rP   rL   GET	urlencoderQ   r0   r]   getrM   dictCONTRACT_STATUS_CHOICESkeysr^   rm   existsr	   r`   rD   formatrl   rT   rU   warningr   rR   rS   errorsvalueserrorr   )rE   ra   rL   previous_datarc   rh   rT   active_contractdraft_contractrd   rz   r|   s               rG   contract_status_updater      s;    1KK))+M~~##'';'7<<F#\\%%h/Fh>>?DDFF00&.&6&6&=&=(0h>R>R '> 'fh $ &.%5%5%<%<(/X=Q=Q &= &fh # (*')n$ #DELL &(<(< /5H,MMO$$#W!X   QST 7GHH$W\\7==8T!!# Wa(A&BC
 QRR (..557 3# 3ENN7E233 QRRY  rI   c                    | j                   j                  d      }t        | j                   j                  d            }t        j                  j                         }|j                  |      }|D ]  }d}|dv r|j                  d|j                        j                         }|j                  d|j                        j                         }|dk(  r|s|dk(  r=|r;d	}t        j                  | t        d
      j                  ||j                               |s||_        |j                          t        j                  | t        d              t!        d      S )Nrh   idsid__inTri   rj   rk   r<   Frn   ro   rU   )rM   rs   r   r0   r]   allr^   rm   rw   r	   r`   rD   rx   rl   rT   rU   r   )	rE   rh   r   all_contracts	contractsrc   rT   r~   r   s	            rG   bulk_contract_status_updater      sP    \\h'F
((/
0C$$((*M$$C$0I ((+22 (h6J6J 3 fh  +11 'X5I5I 2 fh  ("'!n<=DD 4 4 '-H$MMOOP-2 	""rI   c                    | j                   dk(  rt        t        |      }| j                  j	                  d      }	 |r)t
        j                  j	                  t        |            nd }||_        t        j                  | t        d             |j!                          t#        t$              S y # t        t        t
        j                  f$ r" t        j                  | t        d             Y _w xY w)NrM   rY   filing_statusz9The employee filing status has been updated successfully.z0You selected the wrong option for filing status.)rQ   r   r0   rM   rs   r1   r]   intr   r	   rU   rD   
ValueErrorOverflowErrorDoesNotExistry   rT   r   contract_filter)rE   ra   rc   filing_status_idr   s        rG   update_contract_filing_statusr      s     ~~$X+>"<<++O<	 $ $$((C0@,A(B 
 &3H"VW 	((%   M<+D+DE 	MN	s   AB0 0=C0/C0zpayroll.delete_contractc                    	 t         j                  j                  |      j                          t	        j
                  | t        d             | j                  j                  d      }d|v r| j                  j                  d      x}r| j                  j                         }|j                  dd       |j                         }t        j                  |      }t        ||      \  }}||v r|j!                  |       d| d}	d| d	| }
t#        |	|
z         S t%        d
      S t#        d| j                  j                                S # t         j&                  $ r" t	        j(                  | t        d             Y n-t*        $ r" t	        j(                  | t        d             Y nw xY wt-        | j.                  j                  dd            S )z
    Delete a contract.

    Args:
        contract_id: The ID of the contract to delete.

    Returns:
        Redirects to the contract view after successfully deleting the contract.

    rY   zContract deleted/zdelete-contract-modalinstances_idsNz/payroll/single-contract-view/?z&instances_ids=*<script>window.location.reload();</script>rp   Contract not found.z You cannot delete this contract.HTTP_REFERER)r0   r]   rs   deleter	   rU   rD   pathsplitrq   copypoprr   jsonloadsr   remover   r   r   r|   r
   r   META)rE   ra   request_pathr   get_datar}   instances_listprevious_instancenext_instanceurlsparamss              rG   contract_deleter      s   G,335!$6"78||))#."l2 ' @@}@";;++-_d3 ( 2 2 4!%M!:3B"K40!= .0"))+67aH]O?>:JKv.. LMM78M8M8O7PQRR   :w"7 89 Gw"D EFG 0 0 EFFs$   DE 
E '%E 2F+'F+*F+zpayroll.view_contractc                    t         j                  j                         }|j                         rd}nd}t	        || j
                  j                  d            }t        j                  |j                  D cg c]  }|j                   c}      }t        | j
                        }|||t        j                  d}t        | ||      S c c}w )z
    Contract view method
    z#payroll/contract/contract_view.htmlz$payroll/contract/contract_empty.htmlpage)r   fcontract_ids	gp_fields)r0   r]   r   rw   r.   rq   rs   r   dumpsobject_listrZ   r(   r)   fieldsr   )rE   r   templater\   contract_ids_jsonfilter_formcontexts          rG   rV   rV   $  s       $$&I89i)@AI

	@U@U#VHHKK#VW -K)$++	G '8W-- $Ws   6Cc                    | j                   j                         }|j                  dd       |j                         }| j                   j	                  dd      }| j
                  j	                  dd      j                  d      }d|v sd|v rd	nd
}t        j                  |      }||||d}| j                   j	                  d      }	|	r9t        j                  |	      }
t        |
|      \  }}|j                  |||	d       t        | d|      S )z.
    Renders a single contract view page.
    r   N	dashboard r   r   zemployee-viewzemployee-profilez#personal_targetz#objectDetailsModalTarget)rc   r   delete_hx_targetpd)previousnextr   z*payroll/contract/contract_single_view.html)rq   r   r   rr   rs   r   r   r0   findr   r   r   updater   )rE   ra   r   r}   r   HTTP_REFERERSr   rc   r   r   r   previous_idnext_ids                rG   view_single_contractr   >  s    {{!HLL$'&&(MR0ILL$$^R8>>sCM m+/A]/R 	(  }}[)H ,	G  8zz"34.|[IW' 1	
 'GQQrI   c           
         | j                   j                         }t        | j                         }d}|j                  }| j                   j	                  d      }|dk7  r|t        ||| j                   j	                  d      d      }|D cg c]  }|d   	 }}g }|D ].  }	|	j                  D ]  }
|j                  |
j                          0 t        j                  t        |            }d}nit        | |d      }t        || j                   j	                  d            }t        j                  |j                  D 
cg c]  }
|
j                   c}
      }t        |      }t        t         |       |j#                         D 	cg c]  \  }}	|	dgk(  s| }}}	|D ]  }|j%                  |        d	|v r|d	   }t'        |      d
kD  r	|d   g|d	<   t)        | ||||||d      S c c}w c c}
w c c}	}w )z
    Filter contracts based on the provided query parameters.

    Args:
        request: The HTTP request object containing the query parameters.

    Returns:
        Renders the contract list template with the filtered contracts.

    z#payroll/contract/contract_list.htmlfieldr   r   listzpayroll/contract/group_by.htmlorderbyunknownrl      )r   r   filter_dictr   r   )rq   rr   r(   qsrs   r$   r   appendrZ   r   r   r   r   r.   r   r   r0   itemsr   lenr   )rE   query_stringcontracts_filterr   r   r   entrylist_valuesid_listvaluer\   r   	data_dictkeykeys_to_removestatus_lists                   rG   r   r   h  s    ;;((*L%gkk24H ##IKKOOG$E{u(%i8OQWX	2;<uV}<<  	,E!-- ,x{{+,	, !JJtG}53 7Iy9	!)W[[__V-DE	 JJ)2)>)>?XX[[?
 &Ih	*,5OO,=Vjc59+AUcVNV cI% 12{a,7O+<I'("$-	

 
3 = @
 Ws   G'>G,G1G1zpayroll.view_payrollsettingsc                 N   t         j                  j                         }t        |      }| j                  j                  d      }|dk(  s|st        j                  j                         }n t        j                  j                  |      }| j                  dk(  r{t        | j                  |      }|j                         rT|j                          t        j                  | t        d             t!        | j"                  j                  dd            S t%        | d	|||d
      S )z9
    This method is used to render settings template
    r[   selected_companyr   rY   rM   zPayroll settings updated.r   r   z&payroll/settings/payroll_settings.html)currency_form	companiesselected_company_id)r8   r]   r_   r,   sessionrs   r   r   r^   rQ   rM   rS   rT   r	   rU   rD   r   r   r   )rE   r\   r   r   r   s        rG   settingsr     s     &&,,.H':M!//--.@Ae#+>OO'')	OO**.A*B	~~+GLL8L!!# Wa(C&DE'(8(8(MNN0*"#6	
 rI   zpayroll.change_payslipc                    | j                   j                  d      }| j                   j                  d      }t        j                  j	                  |      j                         }|r7||_        |j                          t        j                  | t        d             nt        j                  | t        d             |rddlm} t        |      S |j                  }|j                   |d<   ||d	<   |j#                         |d
<   |j                   j$                  |d
   d<   |j$                  |d
   d	<   ||d<   t'        | d|      S )G
    This method is used to update the payslip confirmation status
    rh   rg   rY   zPayslip status updatedzPayslip not foundr   filter_payslipemployeepayslip	json_datar\   z/payroll/payslip/individual_payslip_summery.html)rM   rs   r3   r]   r^   r_   rh   rT   r	   rU   rD   r|   component_viewsr   r   pay_head_datarm   r   rZ   r   )rE   
payslip_idrh   rg   r   r   datas          rG   update_payslip_statusr     s    \\h'F<<F#Doo$$
$399;G!$<"=>w"5 673''  D**DDO		D$+$7$7$:$:Dj!#*::Di D'LdSSrI   c                 6   ddd}| j                   dk(  r{| j                  d   }t        j                  |      }| j                  d   }t        j
                  j                  |      }|j                  |       d|j                          d	d}t        |      S )
r   rU   zPayslip status updated.typemessagerM   r   rh   r   rh   z Payslips status updated.)
rQ   rM   r   r   r3   r]   r^   r   countr   )rE   r   ids_jsonr   rh   slipss         rG   update_payslip_status_no_idr     s     !-FGG~~<<&jj"h'&&c&2F#++-(AB
   rI   c                 j   | j                   d   }t        j                  |      }| j                   d   }|D ]  }t        j                  |      }|d   }t        j                  j                  |      }||d   |d   d}t        j                  j                  di |j                         }	|	|	n	t               }
||
_	        |d   |
_
        |d   |
_        ||
_        |d   |
_        |d	   |
_        |d
   |
_        |d   |
_        |d   |
_        ||
_        |
j'                           t)        ddd      S )zr
    This method is used to update payslip status when generating payslip through
    generate payslip method
    r   rh   r   rY   
start_dateend_date)rm   r   r   	basic_paycontract_wage	gross_paytotal_deductionsnet_payrU   zPayslips status updatedr    )rq   r   r   r   r]   rs   r3   r^   r_   rm   r   r   rh   r   r   r   	deductionr   r   rT   r   )rE   r   pay_datarh   
json_entryr   emp_idr   payslip_kwargsfiltered_instancer\   s              rG   bulk_update_payslip_statusr    sJ    K(Izz)$H[["F 
zz*%j!##''6'2 $|,Z(

 $OO22D^DJJL(9(E$79'"<0 , !+.!%o!6!+.!"45	?!%/2 7PQRRrI   c                 j   ddl m} t        j                  j	                  |      j                         rst        j                  j                  |      }t        j                  j	                  d      j                         }| j                  j                  d      s$|j                  j                  | j                  k(  r| j                  }|j                  }t        j                  j	                  |      }|j                         r`|D ]  }|j                  }	 t        j                  j	                  	      }
|
j                         }|r|j                   r|j                   nd	}nd	}|j"                  }|d
   }|d   }t%        j&                  |d      j)                         }t%        j&                  |d      j)                         }|j+                  d      }|j+                  d      }t-        j.                         D ]  \  }}||k(  s|j+                  |      } t-        j.                         D ]  \  }}||k(  s|j+                  |      } ||d<   ||d<   |d<   |d<   |j                  |d<   ||d<   |j1                         |d<   |j                  j2                  |d   d<   |j2                  |d   d<   ||d<   t4        j                  j                         j6                  |d<   g |d<   |d   |d   |d   |d   |d   |d   fD ]  }|d   j9                  |        |d   j1                         |d<   t;        |d   |d          t=        |d   |d         |d <   | j?                         |d!<   | jA                         rd"nd#|d$<   ||d%<   tC        | d&|'      S tE        |      S tC        | d(      S ))Nr   r   rY   Thqpayroll.view_paysliprm   companyMMM. D, YYYYr   r   %Y-%m-%d	%B %d, %Ymonth_start_namemonth_end_nameformatted_start_dateformatted_end_dater   r   r   r\   currencyall_deductionsbasic_pay_deductionsgross_pay_deductionspretax_deductionspost_tax_deductionstax_deductionsnet_deductions
allowancesall_allowanceszipped_datahosthttpshttpprotocolr   payroll/payslip/payslip_pdf.htmlr   405.html)#r   r   r3   r]   r^   rw   rs   r   r_   userhas_permrm   employee_user_idemployee_getr   
company_iddate_formatr   r   strptimer   strftimer%   r   r   rZ   r8   currency_symbolextendequalize_lists_lengthzipget_host	is_securer   r   )rE   r   r   r   r  r%  r   r`   r   employee_companycompany_nameemp_companyr*  start_date_strend_date_strr   r   r  r  format_nameformat_stringr  r  deduction_lists                           rG   view_payslip_pdfr;    s    0,335//%%%4//((D(1779LL!!"89""33w||C<<D((H +2299h9OD{{}  7D'+$7&55>N5O*002
 #{'>'>  ++'  -((D!,/N
+L "**>:FKKMJ((zBGGIH)22;?%..{;N /C.H.H.J N*]+-+5+>+>}+M(N /C.H.H.J J*]+-)1):):=)I&J (8D#$%3D!"+?D'();D%&&22D%DO $		D,3,?,?,B,BDj)+2::Di(&D.66<<>NND%'D!"+,+,()*+%&%&# > %&--n=> &*,%7%<%<%>D!"!$|"4d;K6LM"%d<&8$?O:P"QD"++-DL*1*;*;*=w6D%DO'#EtTT''':&&rI   c                    t         j                  j                  |      j                         }|| j                  j                  d      s#|j                  j                  | j                  k(  rs|j                  }|j                  |d<   ||d<   |j                         |d<   |j                  j                  |d   d<   |j                  |d   d<   ||d<   t        | d|      S t        | d      S )	z8
    This method is used to view the saved payslips
    rY   r  r   r   r   r\   z'payroll/payslip/individual_payslip.htmlz404.html)r3   r]   r^   r_   r%  r&  rm   r'  r   r   rZ   r   )rE   r   rb   r   r   s        rG   view_created_payslipr=  q  s     oo$$
$399;G45//7<<? $$"..Z!Y IIK[(/(;(;(>(>[*%'.zz[)$"ZgH$OO':&&rI   zpayroll.delete_payslipc                    ddl m} 	 t        j                  j	                  |      j                          t        j                  | t        d             t        j                  j                         st        d      S t        |      S # t        j                  $ r" t        j                  | t        d             Y ht        $ r" t        j                  | t        d             Y w xY w)zw
    This method is used to delete payslip instances
    Args:
        payslip_id (int): Payslip model instance id
    r   r   rY   zPayslip deletedPayslip not found.zSomething went wrong)<script>window.location.reload()</script>)r   r   r3   r]   rs   r   r	   rU   rD   r   r|   r
   r^   r   r   )rE   r   r   s      rG   delete_paysliprA    s     0;z*113!$5"67
 ??!!#GHHN##  9w"6 78 ;w"8 9:;s   AB	 	2C'='C'&C'c           	      p   | j                   d   }t        j                  j                  |      j	                         }|j
                  |j
                  j                  nd|j                  |j                  j                  nd|j                  |j                  j                  nd|j                  |j                  j                  nd|j                  |j                  j                  nd|j                  |j                  r|j                  nd|j                  r|j                  ndd}t        |      S )zb
    This is an ajax method to return json response to auto fill the contract
    form fields
    rm   r	  r   )
departmentjob_positionjob_roleshift	work_typewagecontract_start_datecontract_end_date)rq   r   r]   r^   r_   department_idrZ   job_position_idjob_role_idshift_idwork_type_idbasic_salarydate_joiningrJ  r   )rE   rm   	work_inforesponse_datas       rG   contract_info_initialrT    s    ++m,K'//66;6OUUWI +4*A*A*MI##&&SU ((4 %%(( )2(=(=(II!!$$r*3*<*<*H##&&b)2)?)?)KI""%%QS&&9B9O9Oy55UW+4+F+FI''B'M, &&rI   c                 H   ddl m} t        j                  j	                  d      }t        j                  j	                  d      }t        j                  j	                  d      }t        j                  j	                  d      } |       }|||||d}t        | d	|
      S )z#
    Dashboard rendering views
    r   )DashboardExportr?   r   r>   r=   r<   )r?   postedr=   r<   export_formzpayroll/dashboard.htmlr#  )rP   rV  r3   r]   r^   r   )rE   rV  r?   rW  r=   r<   rX  r   s           rG   view_payroll_dashboardrY    s     4??!!!0D__##;#7F__++3C+DNOO""'"2E!#K("G '3WEErI   c           	         | j                   j                  d      } |j                  d      d   } |j                  d      d   }g }| j                  j                  d      dk(  }|r| j                  dk(  rt
        j                  j                  t        |      t        |	      z        }g }|D ]  }|j                  |j                          g d
}	t        t
        j                  |	      D ]  \  }
}|j                  |
d   g |d        |D cg c]  }|j                   }}t        t        |            }t        d       }|D ]I  }|j                  |      }|D ]0  }||j                      |xx   t#        |j$                  d      z  cc<   2 K |D ]   }|d   }|D cg c]
  }||   |    c}|d<   " g }|D ],  }|j                  |j&                   d|j(                          . t        |t
        j                        D ]  \  }}
|d   |
d   k(  s|
d   |d<    t        t*        j                  j-                  ddd            }|||t/        d      d}t1        |      S yyc c}w c c}w )z/
    payroll dashboard employee chart data
    period-r   r   X-Requested-WithXMLHttpRequestrq   start_date__monthstart_date__year)zrgba(255, 99, 132, 1)zrgba(255, 206, 86, 1)zrgba(54, 162, 235, 1)zrgba(75, 242, 182, 1)labelr   backgroundColorc                       t        t              S N)r   floatr   rI   rG   <lambda>z*dashboard_employee_chart.<locals>.<lambda>  s    K4F rI   r	     rd  r    rZ   employee_first_nameemployee_last_name%No payslips generated for this month.)datasetlabels	employeesr   N)rq   rs   r   headersrQ   r3   r]   r^   r   r   rm   r0  status_choicesr   setr   rh   roundr   rl  rm  r   values_listrD   r   )rE   r   yearmonthro  is_ajaxemployee_listrp  r   colorschoicecolorrq  total_pay_with_statusrd  payslipsr   r   dataset_labelemployee_labelr   list_of_employeesrF   s                          rG   dashboard_employee_chartr    s    ;;??8$D4::c?1DDJJsOAEGoo!!"459IIG7>>U*..&D)AA
 % 	0HMM(../	0
 !!7!7@ 	MFENN#AY',	 ;HHhX))H	HY(	 +,F G 	E$+++>H# %gnn5e<OOQA <	  	D MMIR@E%m4U;DL	 ! 	H!!//0(2M2M1NO	
 !'*@*@A 	+ME6W~*!'g	+ !((+-A
 $*@A	
 H%% +w0 Is   I-&I2c                 r   | j                   j                  d      } |j                  d      d   } |j                  d      d   }g }t        j                  j                  t        |      t        |      z        }d}|D ]  }||j                  z  } t        |      t        |d      d}t        |      S )	z0
    payroll dashboard payslip details data
    r[  r\  r   r   r_  ra  rj  )	no_of_emptotal_amount)rq   rs   r   r3   r]   r^   r   r   r   ru  r   )rE   r   rw  rx  rz  r  r   rF   s           rG   payslip_detailsr  %  s    
 ;;??8$D4::c?1DDJJsOAEMOO**	E"Q%==M L! )((() 'lA.H !!rI   c           	         | j                   j                  d      } |j                  d      d   } |j                  d      d   }dg g ddg}g }g }| j                  j                  d      d	k(  }|r| j                  d
k(  rtt
        j                  j                  t        |      t        |      z        }|D ];  }	|j                  |	j                  j                  j                  j                         = t        t        |            }|D ]  }
|j                  |
dd        |D ]]  }	|	j                  j                  j                  j                  }|D ],  }
|
d   |k(  s|
dxx   t!        |	j"                  d      z  cc<   . _ t%        t'        |            }dg |dg}t)        ||      D ](  \  }}
|
|d   k(  s|d   d   j                  |d          * |||t+        d      d}t-        |      S yy)z1
    payroll dashboard department chart data
    r[  r\  r   r   r   )z#8de5b3z#f0a8a6z#8ed1f7z#f8e08ez#c2c7ccrc  r]  r^  rq   r_  ra  )rC  amountrC  r  rj  r   rn  )ro  rp  department_totalr   N)rq   rs   r   rr  rQ   r3   r]   r^   r   r   rm   employee_work_inforK  rC  r   rt  ru  r   r   r   r0  rD   r   )rE   r   rw  rx  ro  rC  r  ry  rz  r   departemployee_departmentr{  depart_totalrF   s                  rG   dashboard_department_chartr  <  s0    ;;??8$D4::c?1DDJJsOAE V	
G Joo!!"459IIG7>>U*..&D)AA
 & 	H$$77EEPP	
 #j/*
  	IF##6Q$GH	I & 	CH$$77EEPP   + C,'+>>8$h.>.>(BB$C	C !Z1 #)
 %((8*$E 	B L&l33
6")),x*@A	B
   0@A	
 H%%W +wrI   c                 Z   | j                   j                  d      } |j                  d      d   } |j                  d      d   }| j                   j                  d      dk(  rL|dk(  rd}t        |      dz   }t        j
                  j                  t        |      dz   t        |            }n3t        j
                  j                  t        |      t        |            }g }|D ]*  }|j                  |j                  |j                  d	       , |t        d
      d}t        |      S )z8
    payroll dashboard contract ending details data
    r[  r\  r   r   initialLoadtrue12)contract_end_date__monthcontract_end_date__year)contract_namera   zNo contracts ending this month)contract_endr   )rq   rs   r   r   r0   r]   r^   r   r  rZ   rD   r   )rE   r   rx  rw  r  ending_contractrc   rF   s           rG   contract_endingr  ~  s   
 ;;??8$DDJJsOAE4::c?1D{{}%/D=Et9q=D''..%(Z!^SQUY / 
  ''..%(ZT / 
 O  
&44X[[Q	

 (56H !!rI   c                    | j                   j                  d      }| j                   j                  d      }| j                   j                  d      }| j                   j                  d      }| j                   j                  d      r| j                   j                  d      nt        d      d   j	                  dd	
      }g }d}g }g }	g }
g }g }t
        j                  j                         }|r|j                  |      }|r|j                  |      }|r|j                  |      }|r|j                  |      }|D ]I  }t
        j                  j                  |      }|r!t
        j                  j                  ||      }|r5t
        j                  j                  ||      }|r|j                  |      }|j	                  dd	
      }g }|D ]  }|d   D ]%  }|j                  d      s|j                  |       ' |d   D ]%  }|j                  d      s|j                  |       ' |d   D ]%  }|j                  d      s|j                  |       ' |d   D ]%  }|j                  d      s|j                  |       ' |d   D ]%  }|j                  d      s|j                  |       ' |d   D ]  }|j                  |         |j                  d        t        |d       D ci c]  \  }}|t        |       }}}|j                         D ]c  \  }}t        d |D              }	 t        d |D              }|dkD  s1|j                  t        j                  j                  |       ||d!       e L | j                   j"                  }|rA|D ]:  }t$        j                  j                  |"      j'                         }|rW|j(                  }t*        j                  j                  |#      j'                         }|r|j,                  r|j,                  nd$}nd$}t/        |j0                        } t/        |j2                        }!t5        j6                  | d%      j9                         }t5        j6                  |!d%      j9                         }t;        j                         D ]  \  }"}#|"|k(  s|j=                  |#      }$ t;        j                         D ]  \  }"}#|"|k(  s|j=                  |#      }% |j                  |j>                  j@                   d&|j>                  jB                   $%tE        |jF                  d'      tE        |jH                  d'      tE        |jJ                  |jF                  z
  d'      tE        |jJ                  d'      tE        |jL                  d'      tN        j                  |jP                        d(	       = n|j                  d)d)d)d)d)d)d)d)d)d(	       |D ];  }|j                  |j>                  jR                  jT                  jV                         = t        tY        |            }|D ]  }&|	j                  |&dd*        |D ]]  }|j>                  jR                  jT                  jV                  }'|	D ],  }&|&d+   |'k(  s|&d,xx   tE        |jL                  d'      z  cc<   . _ |s|	j                  d)dd*       tZ        j                  j                         }(|sb|s`|(j                  t]        t5        j^                         j`                  -      t]        t5        j^                         jb                  .      z        }(|r|(j                  |/      }(|rO|s;|(j                  t]        |0      t]        t5        j^                         /      z        }(n|(j                  |0      }(d1g i}
|(D ]   })|
d1   j                  |)jd                         " |(s|
d1   j                  d)       |D ]  }|tE        |jL                  d'      z  } tg        |      |gd2}ti        jj                  |      }*ti        jj                  |	      }+ti        jj                  |
      },ti        jj                  |      }-ti        jj                  |      }.|*jm                  d3d4d5d6d7d8d9d:d;<      }*|,jm                  d1|r
|rd=| d>| nd?i<      },|-jm                  d@dAd2<      }-|.jm                  d1|r
|rdB| d>| nd?i<      }.to        dCD      }/dE|/dF<   ti        jp                  |/dGH      }0|*js                  |0dIdJdKL       |+js                  |0dIdJtg        |*      dKz   dKz   L       |,js                  |0dIdJtg        |*      dKz   tg        |+      z   dMz   L       |.js                  |0dIdJtg        |*      dKz   tg        |+      z   tg        |,      z   dNz   L       |-js                  |0dIdJtg        |*      dKz   tg        |+      z   tg        |,      z   tg        |.      z   dOz   L       |0jt                  }1|0jv                  dI   }2ty        tg        |*jz                        tg        |+jz                        tg        |,jz                        tg        |-jz                        tg        |.jz                              }3|1j}                  d	dPdQdRdSdTdU      }4|2j                  ddV       |2j                  ddd|3dWz
  |r
|rdX| d>| ndY|4       |1j}                  dSd	d	dZ      }5t        |*jz                  j                        D ]  \  }6}7|2j                  dK|6|7|5       t        d[|6z         }8ty        tg        |7      d'z   tg        |*|7   j                  t.              jy                               d'z         }9|2j                  |8 d\|8 |9        t        |+jz                  j                        D ]  \  }6}7|2j                  tg        |*      dKz   dKz   |6|7|5       t        d[|6z         }8ty        tg        |7      d'z   tg        |+|7   j                  t.              jy                               d'z         }9|2j                  |8 d\|8 |9        t        |,jz                  j                        D ]  \  }6}7|2j                  tg        |*      dKz   tg        |+      z   dMz   |6|7|5       t        d[|6z         }8ty        tg        |7      d'z   tg        |,|7   j                  t.              jy                               d'z         }9|2j                  |8 d\|8 |9        t        |.jz                  j                        D ]N  \  }6}7|2j                  tg        |*      dKz   tg        |+      z   tg        |,      z   dNz   |6|7|5       t        d[|6z         }8P t        |-jz                  j                        D ]  \  }6}7|2j                  tg        |*      dKz   tg        |+      z   tg        |,      z   tg        |.      z   dOz   |6|7|5       t        d[|6z         }8ty        tg        |7      d'z   tg        |-|7   j                  t.              jy                               d'z         }9|2j                  |8 d\|8 |9        |2j                  tg        |*      tg        |+      z   dNz   dV       |0j                          |/S c c}}w #  d}Y xY w)]z
    payroll dashboard exporting to excell data

    Args:
    - request (HttpRequest): The HTTP request object.
    - contract_id (int): The ID of the contract to view.

    r   r   rq  rh   contributionsNr'   rZ   T)flatr   )start_date__gte)end_date__lte)employee_id__inr   )employee_id__id)r  r  )r  r  r   r  deduction_idr  r  r  r  r  c                     | d   S Nr  r   xs    rG   ri  z payslip_export.<locals>.<lambda>  s    a&7 rI   )r   c                     | d   S r  r   r  s    rG   ri  z payslip_export.<locals>.<lambda>  s    .@Q rI   c              3   &   K   | ]	  }|d      yw)r  Nr   .0items     rG   	<genexpr>z!payslip_export.<locals>.<genexpr>  s     'I4X'I   c              3   &   K   | ]	  }|d      yw)employer_contribution_amountNr   r  s     rG   r  z!payslip_export.<locals>.<genexpr>  s      ,=AD78,r  rY   )r   zEmployer ContributionzEmployee Contributionr	  r
  r  r  rk  rj  )	r   r   r   r   r   	allowancer   r   rh   None)
DepartmentrA   r  rA   )r  )r  )contract_end_date__lte)contract_end_date__gter  )no_of_payslip_generatedr  r   z
Start DatezEnd Date	Deduction	Allowancez	Gross PayzNet PayStatus)r   r   r   r   r  r   r   rh   )columnszContract Ending  to zContract EndingzNumber of payslips generatedzTotal Amountz"Employee - Employer Contributions zAapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheetcontent_typez!attachment; filename=payslip.xlsxContent-Disposition
xlsxwriter)enginezPayroll Dashboard detailsF   )
sheet_nameindexstartrow   	         centervcenterz#eb7968   )bold	font_sizealignvalignbg_colorr     r   zPayroll details zPayroll details)r  r  	text_wrapA   :)HrM   rs   getlistr'   rv  r3   r]   r   r^   r   sortr   r   r   sumr   r%  r(  r   r_   r)  r   r*  strr   r   r   r+  r   r%   r,  rm   rl  rm  ru  r   r   r   r   rs  rh   r  rK  rC  rt  r0   r   nowrx  rw  r  r   r   	DataFramerenamer   ExcelWriterto_excelbooksheetsmaxr  
add_formatset_rowmerge_range	enumerater{   writechrastype
set_columnclose):rE   r   r   r   rh   r  rC  r  table1_datatable2_datatable3_datatable4_datatable5_dataemployee_payslip_listemployr  	pay_heads
deductionsheadr   r   groupgrouped_deductionsr  employee_contributionemployer_contributionempr   r`   r3  r4  r*  r6  r7  r8  r9  r  r  r  r  r  rc   	df_table1	df_table2	df_table3	df_table4	df_table5rF   writerworkbook	worksheetmax_columnsheading_formatheader_formatcol_numr   
col_letterheader_widths:                                                             rG   payslip_exportr    s    !!,/J||
+H||##K0H\\h'F <<0 	_-!$'(>?KKt L 
  JLKKKKK#OO//1 5 < <Z < X 5 < <8 < T 5 < <X < V 5 < <F < K 7??))&)A-- &h . H -- &
 . H #???B((t(D	
 	-D!"89 1	==0%%i01 ""89 1	==0%%i01 ""56 1	==0%%i01 ""78 1	==0%%i01 ""23 1	==0%%i01 ""23 -	!!),-!	-& 	78 &j6QR
U e
 

 $6#;#;#= 	L%$''I5'I$I!*(+ ,EJ, )%
 %q(""$,$4$4$8$8F$8$C1F1F	Q7r ,,
#
#C, *	G*2299c9JPPRD#'?? &55>N5OUUW $(@(@ !,,'  - !3!34Nw//0L "**>:FKKMJ((zBGGIH.B.H.H.J N*]+-+5+>+>}+M(N /C.H.H.J J*]+-)1):):=)I&J #*#6#6#J#J"K1WM`M`MsMsLt u"6 2!&w'8'8!!<!&w'8'8!!<!&w'8'87;L;L'La!P!&w'8'8!!<$W__a8,00@
=*	X 	"$"####! 
	
 * 
  33AALL	


 c*o&J @&A>?@ * ?  33AALL 	 " 	?Fl#'::x E(*:*:A$>> 	?? !&A>?##'')Lh#**x||~';';<(;(;<=
 #**(*K'..48<<>:;L
 (..j.QL$b)K  F%&--h.D.DEF %&--f5) 3h..223 $''<#=%K
 [)I[)I[)I[)I[)I  "&"$$$ 	
 ! I   ( #:,d8*=&	
 ! I   'E*
 ! I   ( 5ZLXJO&	
 ! I XH 'JH"#^^H\:F6ea   .Y!#a'	   .Y!#c)n4q8	   .Y!#c)n4s9~EI	   .Y

i. i. i.	
 	  
 {{H9:IIIIIIK ((!	
	N a			a h zl$xj9" ''4@M $I$5$5$<$<= I7E=9g&
3u:>3y/?/F/Fs/K/O/O/Q+RUV+VW
|1ZL9<HI $I$5$5$<$<= II*Q.Ng&
3u:>3y/?/F/Fs/K/O/O/Q+RUV+VW
|1ZL9<HI $I$5$5$<$<= I	NQY/!3We]	
 g&
3u:>3y/?/F/Fs/K/O/O/Q+RUV+VW
|1ZL9<HI $I$5$5$<$<= '	NQY/#i.@1D		
 g&
' $I$5$5$<$<= 
I	NQY/#i.@3y>QTVV		
 g&
3u:>3y/?/F/Fs/K/O/O/Q+RUV+VW
|1ZL9<H
I c)ns9~592>
LLNOm	
*()%s   ;{={{c                 b   | j                   d   }t        j                  |      }|D ]  }	 t        j                  j                  |      }|j                   d|j                   }|j                          t        j                  | t        d      j                  |j                  |              t#        d	d
i      S # t        j                  $ r" t        j                  | t        d             Y t         $ r3 t        j                  | t        d      j                               Y w xY w)z8
    This method is used to bulk delete for Payslip
    r   rY   r  z${employee} {period} payslip deleted.)r   r[  r?  zYou cannot delete {payslip})r   r   Success)rM   r   r   r3   r]   rs   r   r   r   r	   rU   rD   rx   rm   r   r|   r
   r   )rE   r   rZ   r   r[  s        rG   payslip_bulk_deleter  )  s    ,,u
C
**S/C 	oo))R)0G**+40@0@/ABFNN89@@$00 A $ I.// ## 	=NN7A&:$;< 	NN/0777H	s   BB??2D.37D.-D.c                     | j                   d   }| j                   d   }t        j                  j                  |      j	                  |       t        dd|d      S )z@
    This method is used to update the group of the payslip
    newNamepreviousName)
group_namerU   zBatch name updated.)r   r   new_name)rM   r3   r]   r^   r   r   )rE   r  r  s      rG   slip_group_name_updater  F  s[     ||I&Hn-JOOj188H8M'<(S rI   c                     | j                   j                  d      }|r't               }t               }||d}t	        | d|      S t        | t        t        t        d      S )NHTTP_HX_REQUEST)export_filterexport_columnz,payroll/contract/contract_export_filter.htmlr#  Contract_export)rE   modelfilter_class
form_class	file_name)r   rs   r(   r+   r   r   r0   )rE   
hx_requestr  r  contents        rG   contract_exportr  T  so     !!"34J&(/1**
 :
 	

 #*# rI   c                 .   | j                   d   }t        j                  |      }|D ]o  }	 t        j                  j                  |      }|j                   }|j                          t        j                  | t        d      j                  |             q t!        dd	i      S # t        j                  $ r" t        j                  | t        d             Y t        $ r2 t        j                  | t        d      j                               Y w xY w)
z5
    This method is used to bulk delete Contract
    r   rY   z{name} deleted.)namer   zYou cannot delete {contract})rc   r   r  )rM   r   r   r0   r]   rs   r  r   r	   rU   rD   rx   r3   r   r|   r
   r   )rE   r   rZ   rc   r  s        rG   contract_bulk_deleter  m  s     ,,u
C
**S/C 	''++r+2H,,-DOO#$+++6  I.// ## 	>NN7A&;$<= 	NN0188(8K	s   A,B&&2D7DDc                     t        |      }t        |       }||k  r|j                  ddd       |dz  }||k  r||k  r| j                  ddd       |dz  }||k  r|| fS )a=  
    Equalize the lengths of two lists by appending empty dictionaries to the shorter list.

    Args:
    deductions (list): List of dictionaries representing deductions.
    allowances (list): List of dictionaries representing allowances.

    Returns:
    tuple: Tuple containing two lists with equal lengths.
    r   )titler  r   )r   r   )r  r  num_deductionsnum_allowancess       rG   r/  r/    s     _N_N
>
)B"56! >
) >
)B"56! >
) z!!rI   c                    	 t        | |      }|rt        |d      S dddddddd}t        j                  |d|	      }t        |d
      }d|d<   |S # t        $ r#}t        dt        |       d      cY d}~S d}~ww xY w)ae  
    Generate a PDF file from an HTML template and context data.

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

    Returns:
        HttpResponse: A response with the generated PDF file or raw HTML.
    z	text/htmlr  A410mmzUTF-8N)z	page-sizez
margin-topzmargin-bottomzmargin-leftzmargin-rightencodingzenable-local-file-accessF)optionszapplication/pdfzinline; filename=payslip.pdfr  zError generating PDF: i  r   )r   r   pdfkitfrom_string	Exceptionr  )template_pathr   htmlhtml_contentpdf_optionspdfrF   es           rG   generate_payslip_pdfr0    s    K'w? ;GG  #!"(,
   ukJ  2CD*H&' K4SVH=cJJKs"   A 5A 	A?A:4A?:A?c                 r   ddl m} t        j                  j	                  |      j                         rt        j                  j                  |      }t        j                  j	                  d      j                         }| j                  j                  d      s$|j                  j                  | j                  k(  r_| j                  }|j                  }t        j                  j	                  |      }|j                         r_|D ]  }|j                  }	 t        j                  j	                  	      }
|
j                         }|r|j                   r|j                   nd	}|j"                  }|d
   }|d   }t%        j&                  |d      j)                         }t%        j&                  |d      j)                         }t+        j,                         D ]-  \  }}|k(  s|j/                  |      }|j/                  |      }/ |j1                  |j/                  d      |j/                  d      |j                  ||j3                         t4        j                  j                         j6                  g |d   j3                         | j9                         | j;                         rdnd|d       |d   |d   |d   |d   |d   |d   fD ]  }|d   j=                  |        t?        |d   |d          tA        |d   |d         |d<   d}tC        ||d      S tE        |      S tG        | d      S )a  
    Generate the payslip as a PDF and return it in an HttpResponse.

    Args:
        request (HttpRequest): The request object.
        id (int): The ID of the payslip to generate.

    Returns:
        HttpResponse: A response containing the PDF content.
    r   r   rY   Tr  r  r	  r
  r  r   r   r  r  r  r  r   )r  r  r  r  r   r   r   r  r  r  r  r!  r  r  r  r  r  r  r  r  r  r"  F)r   r+  r$  )$r   r   r3   r]   r^   rw   rs   r   r_   r%  r&  rm   r'  r(  r   r)  r*  r   r   r+  r   r%   r   r,  r   r   r8   r-  r1  r2  r.  r/  r0  r0  r   r   )rE   rZ   r   r   r  r%  r   r`   r   r3  r4  r5  r*  r6  r7  r   r   r8  r9  r  r  r:  r*  s                          rG   payslip_pdfr2    s    0$++-//%%%,//((D(1779LL!!"89""33w||C<<D((H +2299h9OD{{}  7D'+$7&55>N5O*002
 #{'>'>  ++'  ((D!,/N
+L "**>:FKKMJ((zBGGIH /C.H.H.J J*]+-+5+>+>}+M()1):):=)I&J KK(2(;(;K(H&.&7&7&D,@*< ' 3 3&!% / 7 7 = = ? O O&(&*<&8&=&=&?#,,.+2+<+<+>F&( +,+,()*+%&%&# > %&--n=> "$|"4d;K6LM"%d<&8$?O:P"QD>M't%PP''':&&rI   c                    | j                   j                  d      }|dk(  rt        j                  j	                         }D cg c]  }t        |j                         }}|j                         }||d}t        |d      S c c}w )Nr   r   r   total_countFsafe)	rq   rs   r0   r]   r   r  rZ   r   r   )rE   page_numberrq  r  r   r5  r   s          rG   contract_selectr9  (  su     ++//&)Ke$$((*	+45CCK5L5//#K+KHGe,, 6s   Bc                    | j                   j                  d      }| j                   j                  d      }|rt        j                  |      ni }|dk(  rwt	        |t
        j                  j                               }|j                  }|D cg c]  }t        |j                         }}|j                         }||d}	t        |	      S y c c}w )Nr   r^   r   querysetr4  )rq   rs   r   r   r(   r0   r]   r   r   r  rZ   r   r   )
rE   r8  filteredfiltersr   filtered_employeesr  r   r5  r   s
             rG   contract_select_filterr@  8  s    ++//&)K{{x(H&.djj"BGe(8;K;K;O;O;QR -///ABCFFBB(..0#/LG$$  C   Cc                    | j                   j                  d      }|dk(  rd| j                  j                  d      rt        j
                  j                         }n*t        j
                  j                  | j                        }D cg c]  }t        |j                         }}|j                         }||d}t        |d      S c c}w )Nr   r   r  employee_id__employee_user_idpayslip_idsr5  Fr6  )rq   rs   r%  r&  r3   r]   r   r^   r  rZ   r   r   )rE   r8  rq  r  rF  r5  r   s          rG   payslip_selectrG  L  s    ++//&)Ke<<  !78++-I...5ll / I +4433svv;4K4//#K)+FGe,, 5s   	C	c                    | j                   j                  d      }| j                   j                  d      }|rt        j                  |      ni }|dk(  rwt	        |t
        j                  j                               }|j                  }|D cg c]  }t        |j                         }}|j                         }||d}	t        |	      S y c c}w )Nr   r^   r   r;  rE  )rq   rs   r   r   r*   r3   r]   r   r   r  rZ   r   r   )
rE   r8  r=  r>  payslip_filterr?  r  rF  r5  r   s
             rG   payslip_select_filterrJ  `  s    ++//&)K{{x(H&.djj"BGe&w9L9L9NO ,...@Ass366{AA(..0"-kJG$$  BrA  c                 "   ddl m} t        j                  j	                  |      j                         }| j                  j                  } ||j                  |d      }| j                  dk(  r || j                        }|j                         rm||j                  _        ||j                  _        |j                          t         j                  j	                  |      j#                  d      }d	}|j%                         sd
} ||j                  |d      }t'        j(                  | t+        d             |j                  j,                  j.                  @| j                  j                  j                  |j                  j                  k(  r|j                  j,                  j.                  j0                  }t3        j4                  | j                  j                  ||j                   dd|j                   d|j                   dd|j                   dd|j                   dt7        d      d	       n| j                  j                  j                  |j                  j,                  j.                  j                  k(  rS|j                  j0                  }t3        j4                  | j                  j                  |dddddt7        d      d	       n|j                  j0                  |j                  j,                  j.                  j0                  g}t3        j4                  | j                  j                  ||j                   dd|j                   d|j                   dd|j                   dd|j                   dt7        d      d	       nQ|j                  j0                  }t3        j4                  | j                  j                  |dddddt7        d      d	       t9        | d|||d      S t9        | d||d      S )zX
    This method renders form and template to create Reimbursement request comments
    r   )ReimbursementRequestCommentFormrY   )rm   
request_id)initialrM   rM  -created_atFTzComment added successfully!z0's reimbursement request has received a comment.u*   تلقى طلب استرداد نفقات u    تعليقًا.u6   s Rückerstattungsantrag hat einen Kommentar erhalten.z'La solicitud de reembolso de gastos de z ha recibido un comentario.z(La demande de remboursement de frais de u    a reçu un commentaire.zview-reimbursementzchatbox-ellipses)	recipientverbverb_arverb_deverb_esverb_frr   iconz2Your reimbursement request has received a comment.u;   تلقى طلب استرداد نفقاتك تعليقًا.u8   Ihr Rückerstattungsantrag hat einen Kommentar erhalten.z4Tu solicitud de reembolso ha recibido un comentario.u6   Votre demande de remboursement a reçu un commentaire.0payroll/reimbursement/reimbursement_comment.html)commentsno_commentsrM  )rO   rM  )rP   rL  r5   r]   r^   r_   r%  r(  rZ   rQ   rM   rS   r\   rm   rM  rT   r7   order_byrw   r	   rU   rD   r  reporting_manager_idr'  r&   sendr   r   )	rE   
payroll_idrL  payrollr  rO   rY  rZ  recs	            rG   create_payrollrequest_commentra  t  s   
 D##**j*9??AG
,,
#
#C* #jAD ~~.w||<==?(+DMM%'.DMM$IIK2::AA% B h}%   K??$"2(+jID Wa(E&FG""55JJV<<,,//73F3F3I3II++>>SSdd  KK11"% ' 3 344de"LWM`M`Laaq r#*#6#6"77m n"I'J]J]I^^y z"J7K^K^J__w x!()=!>/
 LL--00**==RRUUV "-->>CKK11"%Q ] Z V X!()=!>/
  ++<<++>>SSddC KK11"% ' 3 344de"LWM`M`Laaq r#*#6#6"77m n"I'J]J]I^^y z"J7K^K^J__w x!()=!>/
 ))::LL--!MYVRT$%9:+
 B (#.",  :Z0 rI   c           	      @   t         j                  j                  |      j                  d      }t        j                  j                  |      }d}|j                         sd}| j                  r| j                  j                  d      }| j                  d   }t         j                  j                  |      }g }|D ]4  }	t               }
|	|
_        |
j                          |j                  |
       6  |j                  j                  |  t!        | d||||d	      S )
zD
    This method is used to show Reimbursement request comments
    rO  rP  rY   FTfiles
comment_idrX  )rY  rZ  rM  req)r7   r]   r^   r[  r5   rs   rw   rR   r  rq   r6   filerT   r   rc  addr   )rE   r^  rY  re  rZ  rc  rd  commentattachmentsrf  file_instances              rG   view_payrollrequest_commentrk    s    +2299 : h}  


#
#z
#
2CK??}}%%g.[[.
-5599Z9H 	.D-/M!%M }-		.
 	;': &$		
	 	rI   c                     d}t         j                  j                  |      }|j                          t	        j
                  | t        d             t        |      S )zF
    This method is used to delete Reimbursement request comments
    r   rY   zComment deleted successfully!)r7   r]   r^   r   r	   rU   rD   r   )rE   rd  scriptrh  s       rG   delete_payrollrequest_commentrn    sM    
 F)1188J8GGNNWa ?@ArI   c                 ^   d}| j                   j                  d      }t        j                  j	                  |      }| j
                  j                  d      s|j	                  | j
                        }|j                          t        j                  | t        d             t        |      S )z#
    Used to delete attachment
    r   r   r   zpayroll.delete_reimbursmentfilerC  zFile deleted successfully)rq   r  r6   r]   r^   r%  r&  r   r	   rU   rD   r   )rE   rm  r   recordss       rG   !delete_reimbursement_comment_filerq    s    
 F
++

e
$C''..c.:G<<  !BC..w||.LNNWa ;<=rI   z!payroll.add_payrollgeneralsettingc                    t        | j                  d         }t        j                  j	                         }|r|n	t               }t        |d      |_        |j                          t        j                  | t        d             | j                  j                  d      r
t               S t        | j                  j                  dd            S )z@
    This method is used to set initial value notice period
    notice_periodr   z8The initial notice period has been successfully updated.r  r   r   )r   rq   r2   r]   r_   r  rs  rT   r	   rU   rD   r   rs   r   r   )rE   rs  r   s      rG   initial_notice_periodrt  "  s     "'++o">?M$,,224H#x)>)@H 2HMMOMN ||)*~ 0 0 EFFrI   z payroll.view_PayslipAutoGeneratec                 `    t         j                  j                         }d|i}t        | d|      S )Npayslip_auto_generatez+payroll/settings/auto_payslip_settings.html)r4   r]   r   r   )rE   rv  r   s      rG   auto_payslip_settings_viewrw  8  s4     077;;=&(=>G'H'RRrI   z"payroll.change_PayslipAutoGeneratec                    d }|r t         j                  j                  |      }t        |      }| j                  dk(  rt        | j
                  |      }|j                         rX|j                         }|j                  r|j                  nd}t        j                  | t        d| d             t        d      S t        | dd	|i      S )
NrY   r[   rM   All companyzPayslip Auto generate for z created successfully r@  z3payroll/settings/auto_payslip_create_or_update.htmlrO   )r4   r]   rs   r-   rQ   rM   rS   rT   r)  r	   rU   rD   r   r   )rE   auto_idauto_paysliprO   r  s        rG   create_or_update_auto_payslipr|  A  s     L*2266'6B"L9D~~&w||lK==?99;L+7+B+B''  7y@VWX   KLLFQU rI   c                 D   | j                   j                  d      }| j                   j                  d      }t        j                  j                  |      }|dk(  rd|_        dt        d      d}nd	|_        dt        d
      d}|j                          t        |      S )z
    ajax function to update is active field in PayslipAutoGenerate.
    Args:
    - isChecked: Boolean value representing the state of PayslipAutoGenerate,
    - autoId: Id of PayslipAutoGenerate object
    	isCheckedautoIdrY   r  TrU   z,Auto paslip generate activated successfully.r   Fz.Auto paslip generate deactivated successfully.)rM   rs   r4   r]   auto_generaterD   rT   r   )rE   r~  r  payslip_autorF   s        rG   activate_auto_payslip_generater  Y  s       -I\\h'F&..22f2=LF%)"GH

 &+"IJ
 !!rI   z"payroll.delete_PayslipAutoGeneratec                    	 t         j                  j                  |      }|j                  sN|j                  r|j                  nd}|j                          t        j                  | t        d| d             nt        j                  | t        d             t        d      S # t         j                  $ r" t        j                  | t        d             Y nw xY wt        | j                  j                  dd	            S )
z
    Delete a PayslipAutoGenerate object.

    Args:
        auto_id: The ID of PayslipAutoGenerate object to delete.

    Returns:
        Redirects to the contract view after successfully deleting the contract.

    rY   ry  zPayslip auto generate for z deleted successfully.z-Active 'Payslip auto generate' cannot delete.r   z Payslip auto generate not found.r   r   )r4   r]   rs   r  r)  r   r	   rU   rD   r`   r   r   r|   r   r   )rE   rz  r{  r  s       rG   delete_auto_payslipr  u  s    G*2266'6B))+7+B+B''  !7y@VWX MM'1'T#VWHII++ Gw"D EFG 0 0 EFFs   B#B& &2CC)Frg  )__doc__r   collectionsr   r   r   r   	itertoolsr   urllib.parser   pandasr   r'  django.contribr	   django.db.modelsr
   r   django.httpr   r   r   django.shortcutsr   r   r   django.template.loaderr   django.urlsr   django.utilsr   django.utils.translationr   rD   base.methodsr   r   r   r   r   r   r   base.modelsr   employee.modelsr   r   horilla.decoratorsr    r!   r"   r#   horilla.group_byr$   horilla.horilla_settingsr%   notifications.signalsr&   payroll.context_processorsr'   payroll.filtersr(   r)   r*   payroll.forms.component_formsr+   r,   r-   payroll.methods.methodsr.   r/   payroll.models.modelsr0   r1   r2   r3   r4   r5   r6   r7   payroll.models.tax_modelsr8   rs  rH   rW   re   r   r   r   r   rV   r   r   r   r   r   r  r;  r=  rA  rT  rY  r  r  r  r  r  r  r  r  r  r/  r0  r2  r9  r@  rG  rJ  ra  rk  rn  rq  rt  rw  r|  r  r  r   rI   rG   <module>r     sy    # . .  !   # . H H @ @ 3  ! 6     =  / 9 ( ; J J 
 @	 	 	 6
 wZ();fI	" +,G - G  ./  0  F ./0S 0  0Sf ./# 0 #D ./) 0 ), ./$G 0  $GN ,-. . .0 ((3$R 4 $RN ,-6 .  6r 34 5 @ -.T / T6!$ -."S / "SJ Q' Q'h ' '* -.$ / $( +,' - '@ ,-F . F* J& J&Z". >& >&B "FEP -.0 / 06 -.	 / 	 +, - . ./0 0 02"2(KVY'x ,-- . - % %& - -& % %& i iX !  !H         89G : G( 78S 9 S 9: ;  * 9:" ; "4 9:G ;  GrI   