B
    ¾Obp  ã               @   sX  d dl Z d dlZd dlZd dlZd dlmZ d dlmZmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZ 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' d dl(m)Z) dd„ Z*e'd'dd„ƒZ+dd„ Z,dd„ Z-dd„ Z.dd„ Z/dd„ Z0dd „ Z1d(d!d"„Z2d#d$„ Z3d%d&„ Z4dS ))é    N)ÚTemplateResponse)ÚHttpResponseForbiddenÚHttpResponse)ÚJsonResponse)Úgettext)Úrrule)Úrelativedelta)ÚEmployee)Úatt_calculate)ÚPayloadBaseÚAttRule)ÚPayloadException)ÚLeaveCategory)ÚMonthlySalaryÚSalaryStructureÚExtraIncreaseÚExtraDeductionÚEmpLoanÚReimbursementÚSalaryAdvance)Úcalc_formula)Útime_it)ÚSystemSettingc          
   C   sl  | j dkrddi}t| d|ƒS | j dkrf| j dd ¡}|sTtt dtdƒd	œ¡ƒS ytj 	|d
¡}W n, t
k
r’ } ztd|d	œƒS d }~X Y nX | j dd ¡}|sÌ| j dd ¡}tjj|djddd}| jjrât| jjƒ}nt| jjƒ}|stdtdƒd	œƒS tjjd| dd¡ d ¡ }t |d d ¡}| dd ¡rZ|}	|tddd }nRt|d ƒ}
t|d ƒ}t |j|j|
ddd¡tdd }	t |j|j|d d!d!¡}t||	|| ƒ dtd"ƒd	œ}yt||	|| ƒ W n‚ t k
r } z"dd l!}| "¡  dt|ƒd	œ}W d d }~X Y nB t
k
r\ } z"dd l!}| "¡  dt|ƒd	œ}W d d }~X Y nX t|ƒS t#ƒ S )#NZGETZ
model_nameZreportcalculatorz$payroll/payroll_calculator_view.htmlÚPOSTÚend_dateéÿÿÿÿZ+payrollCalculation_alert_selectdateNotFound)ÚcodeÚmsgz%Y-%méýÿÿÿZempZdept)Zdepartment__inÚidT)ZflatéüÿÿÿZ%attCalculation_alert_employeeNotFoundZglobal_att_rule_ú-Ú )Z
param_namer   Zparam_valueZ	fullmonthé   )ÚmonthsÚsecondsZleave_calculation_start_dayZleave_calculation_end_day)r$   é   é;   Z(attCalculation_alert_calculationFinished)$Úmethodr   r   Úgetr   ÚjsonÚdumpsÚ_ÚdatetimeÚstrptimeÚ	Exceptionr   Zgetlistr	   ÚobjectsÚfilterZvalues_listÚuserZis_employeeÚstrÚ
company_idÚcurrent_companyr   ÚreplaceÚvaluesÚloadsr   ÚintÚyearÚmonthr
   Úpayroll_calculateÚAssertionErrorÚ	tracebackÚ	print_excr   )ÚrequestÚcontextr   Ú	year_mathÚeÚempsZdeptsr4   Zglobal_ruleÚ
start_dateZ	start_dayZend_dayZ
return_msgr>   © rF   ú?G:\easytimepro\master/mysite/payroll\views\report_calculator.pyÚpayroll_calculator_view   sV    
" rH   c       C   
   C   s6  ddl m} ddlm} tjj|jjd 	dd¡}dd„ |D ƒ}d	d
„ |D ƒ}t
jjd|jjd}	|	rxt |	d j¡}	ni }	|	 dd¡}
i }tj ¡  ddddd¡}xZ| D ]R}|j||d d¡}| ¡ rØ|d ||< qªtjj|dj}dsªtd||f ƒ‚qªW tj |j dd ¡d¡}|}tj|j|j|jd}tjj| |d  ¡  |tj!|jd }|tj!|jd }|tj!dd }t"| ||ƒ}t#| ||ƒ}t$| ||ƒ}t%| ||ƒ}t&| ƒ}t'| ||ƒ}i }d |d!< d |d"< t( )|j|j¡d |d#< d |d$< d |d%< d |d&< d |d'< d |d(< d |d)< d |d*< d |d+< d |d,< d |d-< ||jjƒ}x|D ]}d ||< qLW xÐ| D ]Æ}| |¡}| *¡ } |j+| d.< xÚ| t,|ƒg ¡D ]Ä}!|!j-dkr¾| d$  d7  < | d!  t.|!j/ƒ7  < | d"  t.|!j0ƒ7  < yè| d%  |!j1j2r
t.|!j1j2ƒnd7  < | d&  |!j1j3r0t.|!j1j3ƒnd7  < | d'  |!j1j4rVt.|!j1j4ƒnd7  < | d(  |!j1j5r|t.|!j1j5ƒnd7  < | d)  |!j1j6r¢t.|!j1j6ƒnd7  < | d*  |!j1j7rÈt.|!j1j7ƒnd7  < W n t8k
rè   Y nX | d+  t.|!j9ƒ7  < | d,  t.|!j:ƒ7  < | d-  t.|!j;ƒ7  < |!j< ¡ }"x(|"D ] }| ||j=j>   |j?7  < q<W qœW |
dkrL| d!  d/  < | d"  d/  < | d%  d/  < | d&  d/  < | d'  d/  < | d(  d/  < | d)  d/  < | d*  d/  < | d+  d/  < | d,  d/  < | d-  d/  < x(|D ] }|| kr&| |  d/  < q&W nÚ| d!  d0  < | d"  d0  < | d%  d0  < | d&  d0  < | d'  d0  < | d(  d0  < | d)  d0  < | d*  d0  < | d+  d0  < | d,  d0  < | d-  d0  < x(|D ] }|| kr| |  d0  < qW t@| d! dƒ| d!< || d" |d1 ƒ| d"< || d% |d2 ƒ| d%< || d& |d2 ƒ| d&< || d' |d2 ƒ| d'< || d( |d2 ƒ| d(< || d) |d2 ƒ| d)< || d* |d2 ƒ| d*< || d+ |d3 ƒ| d+< || d, |d4 ƒ| d,< || d- |d5 ƒ| d-< x*|D ]"}|| krt@| | dƒ| |< qW i }#tA||ƒ}$x&|$ B¡ D ]\}%}&tC|&| |ƒ|#|%< qXW tD|$ƒ}'i }(i })i }*xN|D ]F}||#krª|#| |(|< ||'kr|'| d |)|< |'| d |*|< qW |(rä|(ni }(|)rò|)ni })|*r |*ni }*t|d6}+|j+|+_E|jF|+_F||+_G|# d%d¡|+_H|# d&d¡|+_I|# d'd¡|+_J|# d(d¡|+_5|# d)d¡|+_6|# d*d¡|+_7|# d,d¡|+_K|# d-d¡|+_;|# d+d¡|+_L|# d7d¡|+_M|# d8d¡|+_Nt O|(¡|+_P|' d%d9g¡d |+_Q|' d&d9g¡d |+_R|' d'd9g¡d |+_S|' d(d9g¡d |+_T|' d)d9g¡d |+_U|' d*d9g¡d |+_V|' d,d9g¡d |+_W|' d-d9g¡d |+_X|' d+d9g¡d |+_Y|' d7d9g¡d |+_Z|' d8d9g¡d |+_[t O|)¡|+_\|' d%d9d9g¡d |+_]|' d&d9d9g¡d |+_^|' d'd9d9g¡d |+__|' d(d9g¡d |+_T|' d)d9g¡d |+_U|' d*d9g¡d |+_V|' d,d9d9g¡d |+_`|' d-d9d9g¡d |+_a|' d+d9d9g¡d |+_b|' d7d9d9g¡d |+_c|' d8d9d9g¡d |+_dt O|*¡|+_eg },g }-g }.g }/xZ|' B¡ D ]N\}%}0|%d:k
rô|, f|0d ¡ |- f|0d ¡ n|. f|0d ¡ |/ f|0d ¡ 
qÄW d}1xB| t,|ƒg ¡D ].}2|1|2jg7 }1|, ft,|2jgƒ¡ |- fd;d< ¡ q,W d}3xF| t,|ƒg ¡D ]2}2|3|2jg7 }3|. fd=t,|2jgƒ ¡ |/ fd;d> ¡ qtW d}4d}5x¦| t,|ƒg ¡D ]’}6||6jh  krâ|krn n(|4|6ji7 }4|, ft,|6jiƒ¡ |- fd;d? ¡ ||6jh  kr(|krÄn n(|5|6ji7 }5|. ft,|6jiƒ¡ |/ fd;d@ ¡ qÄW d}7d}8d}9d}:x| t,|ƒg ¡D ]ü};||;jj  krœ|krÈn n(|7|;jk7 }7|, ft,|;jkƒ¡ |- fd;dA ¡ |;jj|  k rä|;jlkrn n(|:|;jm7 }:|. ft,|;jmƒ¡ |/ fd;dB ¡ |;jj|k r2||;jlkr2|8|;jk7 }8|;jj|  krN|;jlkr~n n&tnjntnjo||;jldC p¡ }<|9|;jm|< 7 }9q~W d}=xB| t,|ƒg ¡D ].}2|=|2jq7 }=|, ft,|2jqƒ¡ |- fd;dD ¡ q”W dE r|,¡},dE r|-¡}-dE r|.¡}.dE r|/¡}/ts|,| ƒ\}>}?|>s(tjj|d}@|>s(tdF|@j|?f ƒ‚ts|.| ƒ\}>}A|>sbtjj|d}@|>sbtdF|@j|Af ƒ‚|1|+_t|3|+_u|8|+_v|9|+_w|8|9 |+_x|:|+_y|7|+_z|4|+_{|5|+_||=|+_}|,|+_~|-|+_|,j€f | Ž|+_|?|+_‚|.|+_ƒ|/|+_„|.j€f | Ž|+_…|A|+_†| d. }B|B|?7 }B|B|A8 }B|B|+_‡dG| d. |?|A|+j‡f |+_ˆt O| ¡|+_‰|+ Š¡  qfW dHS )INr   )Úget_report_setting)Úreport_deal_param)r4   r   Úcategory_namec             S   s   g | ]}t |d  ƒ‘qS )rK   )r3   )Ú.0ÚirF   rF   rG   ú
<listcomp>\   s    z%payroll_calculate.<locals>.<listcomp>c             S   s   i | ]}t |d  ƒ|d “qS )rK   r   )r3   )rL   rM   rF   rF   rG   ú
<dictcomp>]   s    z%payroll_calculate.<locals>.<dictcomp>Úpayroll_setting)Únamer4   ZunitZhourÚdeductionformulaÚexceptionformulaÚincreasementformulaÚleaveformulaÚovertimeformula)Úemployee_idZeffective_date__ltz-effective_date)r   Fz)emp:%s has no payroll structure before %sr   z%Y-%m)r:   r;   Úday)Úemployee_id__inÚ	calc_time)Zdaysr#   )r%   g        zRequired WorkzActual WorkzSchedule PeriodzSchedule DaysÚOT1ÚOT2ÚOT3z	Normal OTz
Weekend OTz
Holiday OTÚAbsencezLate InzEarly LeavezBasic Salaryi  é<   ÚdurationÚovertimeÚabsentZlate_inZ	early_out)rW   ÚincreasementÚ	deductionr"   )r[   r\   r]   z	Normal OTz
Weekend OTz
Holiday OTrc   z(%s)zextra increasez%szextra deductionzsalary advance increasezsalary advance deductionzemp_loan increasezemp_loan deduction)ZdtstartZuntilzreimbursement increasez + z%s:%sz%s + %s - %s = %sT)‹Zmysite.att.utilsrI   Úmysite.payroll.utilsrJ   r   r0   r1   r2   r5   r7   r   r*   r8   Úvaluer)   r   ÚallZprefetch_relatedZorder_byÚexistsr	   Zall_objectsÚemp_coder=   r-   r.   r   Údater:   r;   rX   r   ÚdeleteZ	timedeltaÚget_all_att_detailsÚget_all_extra_increaseÚget_all_extra_deductionÚget_all_advanceÚget_all_loanÚget_all_reimbursementÚcalendarZ
monthrangeÚcopyZsalary_amountr3   Zday_offÚfloatZduty_durationZtotal_workedra   Zot_lv1Zot_lv2Zot_lv3Z	normal_otZ
weekend_otZ
holiday_otr/   rb   ZlateZearly_leaveZpayloadexception_setÚitemÚcategory_idr`   ÚroundÚget_emp_formula_listÚitemsÚformula_list_to_resultÚformula_list_to_formulaZbasic_salaryZeffective_daterZ   Zot1Zot2Zot3Z	late_timeZabsent_timeZincreaserd   r+   ZleaveZot1_formulaZot2_formulaZot3_formulaZnormal_ot_formulaZweekend_ot_formulaZholiday_ot_formulaZlate_time_formulaZearly_leave_formulaZabsent_time_formulaÚincrease_formulaÚdeduction_formulaZleave_formulaZot1_formula_nameZot2_formula_nameZot3_formula_nameZlate_time_formula_nameZearly_leave_formula_nameZabsent_time_formula_nameZincrease_formula_nameZdeduction_formula_nameZleave_formula_nameÚappendZamountZadvance_timeZadvance_amountZ	loan_timeZloan_amountZloan_clean_timeZper_cycle_refundr   ZMONTHLYÚcountZ
rmb_amountÚjoinr   Úextra_increaseÚextra_deductionÚtotal_loan_amountÚunrefund_loan_amountZrefund_loan_amountÚloan_deductionÚloan_increaseÚadvance_increaseÚadvance_deductionÚreimbursementZtotal_increase_formulaZtotal_increase_formula_nameÚformatZtotal_increase_expressionZtotal_increaseZtotal_deduction_formulaZtotal_deduction_formula_nameZtotal_deduction_expressionZtotal_deductionÚtotal_salaryZtotal_salary_expressionÚformat_dictZsave)CrD   rE   r   r@   rI   rJ   Zleave_dict_listÚleave_categorysÚleave_categorys_dictrP   Zatt_param_unitZemp_formulaZsalary_structure_qsrW   Zsalary_structureri   rB   Ztemp_datetimerZ   Zlast_last_monthZlast_start_dateZlast_end_dateÚatt_details_dictZall_extra_increase_dictZall_extra_deduction_dictZall_advance_dictZall_loan_dictZall_reimbursement_dictZformat_dict_tmpZatt_report_ruleZ
each_leaveZemp_salary_structurerŒ   ÚrecordZleavesZcalc_resultÚformula_list_dictÚkeyÚformula_listÚformula_dictZ
leave_infoZleave_formula_infoZleave_formula_name_infoÚmr|   Zincrease_namer}   Zdeduction_nameÚformulaZextra_increase_amountÚeachZextra_deduction_amountr‡   rˆ   Úadvancer†   rƒ   r„   r…   ÚloanZmonth_countZreimbursement_amountr,   Zincrease_resultÚemp_objZdeduction_resultr‹   rF   rF   rG   r<   V   s   




&&&&&*

&

















 

 






r<   c             C   sR   i }t jj| ||d d¡}x0|D ](}|j|kr:g ||j< ||j  |¡ q"W |S )N)Z
emp_id__inZatt_date__gteZatt_date__ltZ	timetable)r   r0   r1   Zselect_relatedZemp_idr~   )rD   rE   r   r   Zatt_details_qsr—   rF   rF   rG   rl   Ñ  s    


rl   c             C   sL   i }t jj| ||d}x0|D ](}|j|kr4g ||j< ||j  |¡ qW |S )N)rY   Úissued_time__gteZissued_time__lt)r   r0   r1   rW   r~   )rD   rE   r   Zextra_increase_dictr   r—   rF   rF   rG   rm   ß  s    


rm   c             C   sL   i }t jj| ||d}x0|D ](}|j|kr4g ||j< ||j  |¡ qW |S )N)rY   r›   Zissued_time__lte)r   r0   r1   rW   r~   )rD   rE   r   Zextra_deduction_dictr‚   r—   rF   rF   rG   rn   í  s    


rn   c             C   sL   i }t jj| ||d}x0|D ](}|j|kr4g ||j< ||j  |¡ qW |S )N)rY   Zadvance_time__gteZadvance_time__lt)r   r0   r1   rW   r~   )rD   rE   r   Zadvance_dictr˜   r—   rF   rF   rG   ro   û  s    


ro   c             C   sH   i }t jj| d}x0|D ](}|j|kr0g ||j< ||j  |¡ qW |S )N)rY   )r   r0   r1   rW   r~   )rD   Z	loan_dictr™   r—   rF   rF   rG   rp   	  s    


rp   c             C   sL   i }t jj| ||d}x0|D ](}|j|kr4g ||j< ||j  |¡ qW |S )N)rY   Zapply_time__gteZapply_time__lt)r   r0   r1   rW   r~   )rD   rE   r   Zreimbursement_dictr‰   r—   rF   rF   rG   rq     s    


rq   c             C   sh   d}x^| D ]V}t |j|ƒ\}}|sX|rLtjj|d}|sXtd|j|f ƒ‚n|sXt|ƒ‚||7 }q
W |S )zZ
    input: model Formula formula_list
    return: sum of formula_list.formula result
    r   )r   z%s:%s)r   r–   r	   r0   r)   r=   ri   )r“   rŒ   rW   Úresultr—   r,   Úresrš   rF   rF   rG   rz   "  s    
rz   c             C   sv  t  ¡ }dd„ | j ¡ D ƒ|d< dd„ | j ¡ D ƒ|d< dd„ | j ¡ D ƒ|d< dd„ | j ¡ D ƒ|d	< d
d„ | j ¡ D ƒ|d< dd„ | j ¡ D ƒ|d< dd„ | j ¡ D ƒ|d< dd„ | j ¡ D ƒ|d< dd„ | j ¡ D ƒ|d< dd„ | j ¡ D ƒ|d< dd„ | j ¡ D ƒ|d< i }x2|D ]*}g |t|d ƒ< t|d ƒ||d < qW x(| j ¡ D ]}|||j	   
|¡ qTW |S )zy
    emp_structure: model SalaryStructure object
    return: OrderedDict formula_list_dict {formula_type: list[obj]}
    c             S   s   g | ]}|j d kr|‘qS )r#   )Úovertime_level)rL   rM   rF   rF   rG   rN   ;  s    z(get_emp_formula_list.<locals>.<listcomp>r[   c             S   s   g | ]}|j d kr|‘qS )é   )rž   )rL   rM   rF   rF   rG   rN   =  s    r\   c             S   s   g | ]}|j d kr|‘qS )é   )rž   )rL   rM   rF   rF   rG   rN   ?  s    r]   c             S   s   g | ]}|j d kr|‘qS )é   )rž   )rL   rM   rF   rF   rG   rN   A  s    z	Normal OTc             S   s   g | ]}|j d kr|‘qS )é   )rž   )rL   rM   rF   rF   rG   rN   C  s    z
Weekend OTc             S   s   g | ]}|j d kr|‘qS )é   )rž   )rL   rM   rF   rF   rG   rN   E  s    z
Holiday OTc             S   s   g | ]}|j d kr|‘qS )r#   )Úexception_type)rL   rM   rF   rF   rG   rN   H  s    zLate Inc             S   s   g | ]}|j d kr|‘qS )rŸ   )r¤   )rL   rM   rF   rF   rG   rN   J  s    zEarly Leavec             S   s   g | ]}|j d kr|‘qS )r    )r¤   )rL   rM   rF   rF   rG   rN   L  s    r^   c             S   s   g | ]}|‘qS rF   rF   )rL   rM   rF   rF   rG   rN   O  s    rc   c             S   s   g | ]}|‘qS rF   rF   )rL   rM   rF   rF   rG   rN   P  s    rd   rK   r   )ÚcollectionsÚOrderedDictrV   rg   rS   rT   rR   r3   rU   rv   r~   )Úobjr   r‘   rŽ   r—   rF   rF   rG   rx   5  s&    
rx   c             C   sr   t  ¡ }xd|  ¡ D ]X\}}d}dd„ |D ƒ}d |¡}d}dd„ |D ƒ}d |¡}|rd| d| g||< qW |S )zi
    formula_list_dict: {model Formula queryset}
    return: formula_dict, {[formula, formula_name]}
    r"   c             S   s   g | ]
}|j ‘qS rF   )r–   )rL   rM   rF   rF   rG   rN   g  s    z+formula_list_to_formula.<locals>.<listcomp>z) + (c             S   s   g | ]
}|j ‘qS rF   )rQ   )rL   rM   rF   rF   rG   rN   k  s    z((%s)))r¥   r¦   ry   r€   )r‘   r”   r’   r“   Ztemp_formulaZformulasZtemp_formula_nameZformulas_namerF   rF   rG   r{   ]  s    

r{   )N)N)5r-   r*   r¥   rr   Zdjango.template.responser   Zdjango.http.responser   r   Zdjango.httpr   Zdjango.utils.translationr   r,   Zdateutilr   Zdateutil.relativedeltar   Zmysite.personnel.modelsr	   Zmysite.att.calc.viewsr
   Zmysite.att.modelsr   r   r   Z%mysite.att.models.model_leavecategoryr   Zmysite.payroll.modelsr   r   r   r   r   r   r   re   r   Zmysite.admin.helpersr   Zmysite.base.modelsr   rH   r<   rl   rm   rn   ro   rp   rq   rz   rx   r{   rF   rF   rF   rG   Ú<module>   s@   $9  |
(