B
    c                 @   s,  d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZmZm	Z	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lm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!m"Z" d dlZ#d dl$m%Z% dZ&dZ'dZ(dZ)dZ*d\Z+Z,Z-Z.Z/d\Z0Z1Z2G dd de3Z4dS )    N)
C_ATT_RULEC_TIME_INTERVALC_DEPT_ATT_RULEC_BREAK_TIME)PayloadBasePayloadBreakPayloadOvertimePayloadPunchPayloadExceptionPayloadMulPunchSetLeave)timezone)
monthrange)relativedelta)Q)	TruncDate)MaxMinCount)cache)	timedeltadate)Transaction         )r   r   r   r   )r   r   r   c               @   sz   e Zd Zdd Zdd Zedd Zdd Zd	d
 ZdddZ	dd Z
dd Zdd Zdd Zdd Zdd Zdd ZdS )ResultHandlerc             C   sv   || _ || _|| _|| _||g | _g | _g | _g | _g | _	g | _
g | _g | _g | _|  | _|| _|| _i | _d S )N)employee
company_id
departmentcalculate_resultgetovertimemultiple_transactionsZattendance_detailsZscheduled_transactions	scheduled
attendanceatt_overtime
break_time
exceptionsget_att_ruleatt_ruleall_leave_categoryall_training_categorywhole_day_durations)selfr   r   r    r!   Zall_overtimer,   r-    r0   7G:\easytimepro\master/mysite/att\calc\result_handler.py__init__%   s"    
zResultHandler.__init__c             C   s*   t | j}t| j}|| j|}|S )N)r   r"   r   r   r    )r/   Zglobal_ruleZ
dept_rulesr+   r0   r0   r1   r*   :   s    zResultHandler.get_att_rulec               C   s   t t S )N)struuiduuid4r0   r0   r0   r1   r4   @   s    zResultHandler.uuidc       C      C   s  |d |d  }}|d }|d |d  }}	|r^|d  d}
|
jdd}||d d< |d }|	r|d  d}
|
jdd}||d d< |d }	| d	d }|d
 }d}|rt }d}d}d  }}xTt|D ]F\}}|d |d  }}| ddd }d}||  }| dg }t|}d\}}| dd }d}xlt|D ]^\} }!|! d|! d }"}#d  }$}%|"r|" dd }$|#r|# dd }%|$s| dkr|}&n|$}&| dkr|$}|%s| |d kr|}'n|%}'| |d kr|%}d }(})t|$|%frF|'rF|&rF|(t|'|&  d7 }(|$r6|%r6|)|(7 })||(7 }||)7 }|r^|d r^|d n|d }*|	r~|	d r~|	d n|d t	|d d }+|*|&  k r|'  k r|+k rn nt|'|&  d}n|*|&  k r|+  k r|'k rn nt|+|&  d}n|&|*  k r0|'  k r0|+k rHn nt|'|*  d}nR|*|+  k rl|&  k rl|'k sn |&|'  k r|*  k r|+k rn nd}t|$|%frd  },}-|$r|" dd },t
|  | j||,|| j ddd}.| j|. |%r4|# dd }-t
|  | j||-|| j ddd}.| j|. |dkrD|(}/n|}/|d7 }t| j|d |d
 |d
  ||$|%|)|,|-|/td}0| j|0 n|$r|%sF||7 }qFW |dkr|}||8 }|dkr| dd}1t||1d }t|| d}2|2| ddd k rd}2||krd}2t|| d}3|r2|}3|3| ddd k rLd}3|rh|sh|rh|	shd}3dddddg}4ddddg}5|dkrt||}6| d d}7|2|4|7< | d!d}8|3|5|8< n|}6|s|rd}6|4\}9}:};}<}=|5\}>}?}@}Atttt||6||?|@|A|:|;|<|=|2|3f|}qW t||||d |d |d" |d# |d$ |d% |d& |d' |d( |d) |d* |d+ d,}B| j|B |B|fS d |fS )-Nrequires_inrequires_out
time_cardsclock_in	clock_out
punch_timer   )secondbreak_intervalatt_date)r   r   r   r   r   r   r   r   r   r   r   r   	break_outbreak_inbreak_duration<   )r   r   deduct_ruler   check_induration)Zminutesid2)r4   emp_idskd_idorig_idr>   correct_state3time_interval_id)rH   timetable_idr>   weekday
data_indexr9   r:   
total_timein_idout_idworked_time	data_typer   min_durationZbreak_min_earlyZbreak_min_lateZbreak_early_inZbreak_late_inr   r                  	   
      )r4   r?   r@   rE   takenZactual_durationlateearly_leaveabsent	work_timer#   
weekend_ot
holiday_otearly_inlate_in)r"   replacer4   r5   	enumeratetotal_secondslenanymaxr   r	   r   r+   r%   appendr   rO   
BREAK_TIMEr$   minlistmapsumzipr   r(   )Cr/   uidresult
is_presentis_duty_freer6   r7   r8   rD   	check_outc_data	time_data	intervalsr>   Zeffective_leave
break_uuidZ	sum_itemsZ_indexZfirst_break_outZlast_break_inindexintervalZperiod_startZ
period_endsch_durationtaken_durationeffective_durationtime_card_len_effective_duration_noneffective_durationrC   Zabsent_durationp	time_cardr:   r9   r?   r@   Z
_break_outZ	_break_inZ_effective_dur_taken_durationZ	_check_inZ
_check_outZbreak_out_idZbreak_in_idppZ_rule_durationmtrV   rf   rg   Zearly_in_itemsZlate_in_itemsZrule_durationearly_in_policyZlate_in_policyZearly_in_ignorenwtntwthtZlate_in_ignorer`   	early_outabsenceZ	att_breakr0   r0   r1   break_interval_handlerD   s   
 (((&(








z$ResultHandler.break_interval_handlerc          
   C   s  d}| dd }|d rtjjt|d dt|d d@ | jd}| r|dd	d
}	dd |	D }	||7 }tt	
 ||	d d |	d d |	d d |dd}
| j|
 |d s|d s|d r|d }x|D ]}|d	 |d
  }}t||t||  }t||}d}|rxnt|D ]b\}}| ddd }t||d t||d  }}||k r$|t||  d7 }t||}q$W ||| 7 }tt	
 ||d |||| dd}
| j|
 qW |S )Nr   r=   weekendr>   )Zend_time__date__gte)Zstart_time__date__lte)Zemployee_idrF   
start_timeend_timec             S   s   g | ]}|qS r0   r0   ).0
leave_datar0   r0   r1   
<listcomp>   s    z8ResultHandler.leave_interval_handler.<locals>.<listcomp>r   )r4   rI   Zitem_idr   r   rE   rU   holidayleavesrA   rB   r?   r@   )r"   r   objectsfilterr   r   existsZvalues_listr
   r4   r5   r)   rn   rp   rm   rj   ri   )r/   rv   rD   ry   rE   ru   	sum_leaver|   Z	leave_objr   Zper   lstartendZ	_durationZleave_breakr~   r   r   Zeffective_startZeffective_endr0   r0   r1   leave_interval_handler   sL    




z$ResultHandler.leave_interval_handlerr   c             C   s   |d p
i }|d pi }	t ||	frd  }
}d  }}|rx|d }
|d }t|  | j|||| jddd}| j| |	r|	d }|	d }t|  | j|||| jdd	d}| j| t| j|||	 ||
|||||t
d
}| j| d S )Nr9   r:   r;   rF   rD   0)r4   rH   rI   rJ   r>   rK   ry   1)rH   rN   r>   rO   rP   r9   r:   rR   rS   rQ   rT   rU   )rl   r	   r4   r   r+   r"   r%   rn   r   rO   NORMAL_PUNCHr$   )r/   r   ru   r>   
time_tablepresenttotal_workedrP   r9   r:   	_clock_in
_clock_outZclock_in_idZclock_out_idr   r   r0   r0   r1   punch_transaction_store  s0    
z%ResultHandler.punch_transaction_storec             C   s(  |   }| j}|d }t|d t|d  }}t|d }t|d }|d d }	t|d }
|d	 }d
}|
dks|
dkr|d	 rd}|d }|d |d  }}|d d }|d pdd }|| }|}|d }|d }|d |d  }}|d |d  }}|d d |d d  }}|d d |d d  }}d  }}d }  }! }" }# }$}%d }&d }' }( }) }*}+|d |d  },}-|,r|d d }.|.jdd!}/|/|d d < |d },|d }-|-r|d d }.|.jdd!}/|/|d d < |d }-|d" pg }0d
}1d
}2|d# s|d$ rd}1|s*|s*d}2d }3}4d }5}6|,r.d
}3|,d  }t||  d}"|"|krl|"}(|}7xP|0D ]H}8|8d% |  k r|8d& krvn n|8d% |kr|8d% }7nd }7P qvW |7rt|0r|0d nd }9|9r|9d% |krt||9d&   d}$nt||  d}$|$|kr(|$}*n|$}5nF|s:|},n:x8|0D ]0}8|8d% |  krd|8d& k r@n n|},P q@W |-rhd
}4|-d  }t||  d}#|#|kr|#})|}:xP|0D ]H}8|8d% |  kr|8d& k rn n|8d& |k r|8d& }:nd }:P qW |:r|0r|0d' nd };|;r@|;d& |kr@t||;d%   d}%nt||  d}%|%|krb|%}+n|%}6nF|st|}-n:x8|0D ]0}8|8d% |  k r|8d& krzn n|}-P qzW |3o|4 }<|   }=| |||<|1\}>}?| |||||}@|r|rt||  d} t||@ d}|s(|s(| }'}!|"|# }Ad }B }C}Dd
 }E}F|dk	r|d( d |d) d  }G}H|*|+|'  }C}D}B|d* }I|d+ }J|d, }K|d- }Lt|d. }Mt|d/ }N|d0 }O|d1 }P|d2 }Q|Lr|jd3d4}R|R	d5}Snd|j
|Nkrtj|j|j|Md6}SnBt|j|jd3 }T|N|Tkr*|T}Ntj|j|j|Nd6td3d'd7 }S|IsV|Ortd8| j d }U|Ur~| j|U ks|Ur|U| j d9 |Skr|Upi }U| jddd
d
|Sd:|U| j< |Ir|r|}V|Vt|Gd; }W|U| j d< sTtjj|S|f| jd=d>jtd td d?d}X|Xj|Wd@}Xd|U| j d<< |U| j dA  |X 7  < n ||Wkrt|U| j dA  d37  < |U| j dA |Kkr||Wkr|JdBkr|B|C7 }Bd}Cn|JdCkrd}&|Or|r|}Y|Yt|Hd; }Z|U| j dD sPtjj|S|f| jd=d>jtd td dEd}[|[j|ZdF}[d|U| j dD< |U| j dG  |[ 7  < n ||Zk rp|U| j dG  d37  < |U| j dG |Pkr||Zk r|QdBkr|B|D7 }Bd}Dn|QdCkrd}&t d8| j |U |dkr|C|Gk	r |B|C7 }Bd}Cn|dk	r |C|Gk	r d}&|dk	r"|D|Hk	r:|B|D7 }Bd}Dn|dk	r:|D|Hk	r:d}&|'	s|,	rR|2	r|3	r|d3k	rb|} n2|dk	rr|}Bn"|dk	rd}Fd}Cn|dHk	rd}&|-	r|2	r|4	r|d3k	r|F	s|} n>|dk	r|F	s|}Bn(|dk	r|B	sd}Ed}Dn|dHk	rd}&d}\|>
r`|>j }=|C|>j!7 }C|D|>j"7 }D|B|>j#7 }B|>j$}|A|>j%7 }At&|>j!|>j"|>j#f
spt|>j'| d}\ndI|=dJdK }=t|| |C |D |B |@ d}]t|]t|5d t|6d |\ d}^t||] d}_dddddg}`|
s|`|  |(7  < |`|  |)7  < |`\}a}b}c}d}e|b|c|d|ef\}f}g}h}i|>rN|!sN|f|>j(7 }f|sN|g|>j)7 }g|h|>j*7 }h|i|>j+7 }i|
sdd }f }g }h}it&|F|Efrd }j }^ }] }k}Bnt,|^|ff}jt,|g|h|if}k|j|k }lt|dL }mt-|dM t-|dN t-|dO   }n}o}pd }q }r }s}t|2r|}]d }C }D }B}_|1rd}]|]}ln|1rd } } } }_ }^}]d }C }D}B|d#pX|d$}ut|udP }vt-|udQ t-|udR t-|udS   }n}o}pdddddg}`|st|l| d|`|v< |`\}a}f}g}h}it,|g|h|if}kt|g|h|i}q|vdkrd}ln|dT d3kr|dU dks2|dT dkr||dV dkr||dU dkr||dU d3 }vdddddg}`|sZ|l|`|v< |`\}a}f}g}h}i|kt,|g|h|if7 }kn:|dL dkrd}qn&|dL d3kr|j}qn|dL dkr|k}q| .||||| |l |qdkrF|q|pd d kr|q|pd d  }t|q|od d kr|q|od d  |t }s|q|nd d krF|q|nd d  |s |t }r|r|rdddddddg}w|jsp|1rx6t/0|t12dWD ] \}x}yt,dXdY |yD |w|x< qW |w\}f}g}h}i}r}s}tt,|g|h|ig}k|   }z|
r&t&|f|g|h|i|r|s|tfr&|B|k s|1r&t3|z|f|g|h|i|r|s|t|kdZ	}{| j45|{ ndI|zdJdK }z|,r|-r|d[ dkr| |	k r|@dkrt|@|	krtd}&n|@dkrd}&|@dkr|d[ dkrd3}d\6tj	|d5| j}|| j7||d}}||} | j7||< t8|| j||9 |||||||| |A|_|]|^|l|C|D|B|@|d[ |=|z||&d]}~| j:5|~ d S )^Nr>   miss_inmiss_outZmins_late_absentZmins_early_absenthalf_day_workrB   use_ototsFr   r   TrM   rD   ry   rE   r(   r   time_interval__work_dayr8   r6   r7   rf   late_outmin_early_inmin_late_outZ
allow_lateZallow_earlyr9   r:   r;   )r<   r   r   r   r   r   r   Zmins_late_absentsZmins_early_absentstimecheckintimecheckinminchoicestimecheckinmin	fullmonthleave_calculation_start_dayleave_calculation_end_daytimecheckouttimecheckoutmintimecheckoutminchoicesr   )dayz%Y-%m-%d)yearmonthr   )ZdaysZmonthsZlateDatastart_month)emp
late_countearly_leave_count	late_flagearly_leave_flagr   )Zsecondsr   )Zpunch_time__date__ranger   Zemp__emp_code)r>   r9   )Zclock_in__time__gtr   r   rG   r   )r>   r:   )Zclock_out__time__ltr   rX   UNKW- ot_lvot_lv1ot_lv2ot_lv3policylv1lv2lv3ZpriorityZ	work_typeZsch_typeovertime_typec             s   s"   | ]}|d  |d    V  qdS )r   r   N)rj   )r   itemr0   r0   r1   	<genexpr>  s    z:ResultHandler.normal_time_table_handler.<locals>.<genexpr>)	r4   	normal_wt	normal_otrd   re   r   r   r   total_otday_offz{}_{})r4   rH   r>   rO   rN   rD   ry   rE   duty_durationr9   r:   rQ   unscheduled	remainingduty_workedactual_workedr   r`   ra   rb   leaver   break_time_idovertime_idwork_dayhalf_day);r4   r+   intr"   rh   rm   rj   r   r   strftimer   datetimer   r   calendarr   r   r   r   r   keysr   r   r   r   valuesZannotater   r   Zorder_bycountr   setr`   ra   rb   rE   rf   rl   r_   rc   r#   rd   re   rs   floatr   	itertoolsgroupbyoperator
itemgetterr   r'   rn   formatr.   r   rO   r&   )r/   rv   ru   r+   r>   Zmiss_in_ruleZmiss_out_ruleZmins_late_ruleZmins_early_ruler   ot_ruler   approve_ot_priorityr   rD   ry   rE   r(   r   Zatt_dutyr   r8   r6   r7   r   late_out_policyr   r   Zallow_late_inZallow_early_outZpunch_inZ	punch_outr   r   rf   r   rg   r   r   Zsch_absenceZsch_early_inZsch_late_outZsch_late_inZsch_early_outr9   r:   rz   r{   r   rx   is_punch_freer   r   Zignore_late_inZignore_early_outZ	_punch_inr   Zfirst_leaveZ
_punch_outZ
last_leaverw   r}   Zbreak_summaryZbreak_leaver   r   Zrule_absenceZ	rule_lateZ
rule_earlyZallow_pending_outZallow_pending_inZmax_late2absenceZmax_early2absencer   r   r   r   r   r   r   r   r   ZfirstdayofmonthZstartmonthdateZcurrent_month_daysZlate_or_early_cacheZcheck_in_timeZstart_checkinZlate_exceeds_countZcheck_out_timeZend_checkoutZearly_exceeds_countZignore_breakr   r   r   extra_ot_itemsextra_ignoreZ	extra_nwtZextra_ntZextra_wtZextra_htr   r   r   r   total_wtr   r   _ot_lv_ot_lv1_ot_lv2_ot_lv3	ot_lv_sumr   r   r   	ot_policyr   ot_itemskeyitemsovertime_uuidatt_otwhole_day_duration_keywhole_day_duration_valobjr0   r0   r1   normal_time_table_handler+  s   
	
$


$
	
$


$



























"



((
*
.
$

z'ResultHandler.normal_time_table_handlerc             C   s@   x:| j D ]0}dtj|jd|j}| j||j|_	qW d S )Nz{}_{}z%Y-%m-%d)
r&   r   r   r   r>   rH   r.   r"   rE   Zwhole_day_duration)r/   recordr  r0   r0   r1   whole_day_durations_handler  s    z)ResultHandler.whole_day_durations_handlerc       Y      C   s  |   }| j}t|d }|d }d}|dks>|dkrB|d rBd}|d }|d }|d	 |d
  }	}
|d |d  }}|d d }|d }|d }d } }}|   }|   }|d d  }}d } }}|d pg }|d s|d rd}|s|sd}| ||	|
||}d } }}d }}d  } }!|rd}"t|}#xt|D ]\}$}%|"d7 }"|%dd |%dd  }&}'d  }(})|&rd}|&dd }(|$dkr|(} |'rd}|'dd })|$|#d kr|)}!d }* }+ },}-|(r|)rt|)|(  d}*||*7 }d }.}/|(s |s |$dkr |	}0d}.n|(}0|)sH|sH|$|#d krH|
}1d}/n|)}1|0r|1r|1|0  }+xH|D ]@}2t|2d |0t	|2d |1 }3}4|3|4k rjt|4|3  d}-qjW |+|- },t
|.|/frt	|,|},||,7 }| |%||||*|,|" ||,8 }qBW t||f }t|| d}5t|5| d}6t||5 d}7t	|5|}8t||frN|5}|7|d d krd|7nd}9|d }:dddddg};|s|;|:  |97  < |;\}<}=}>}?}@|8|= }At|>|?|@f}B|A|B }Ct|d }Dt|d t|d  t|d!   }E}F}Gd }H }I }J}K|r d}|rd}5|5}Cn|rd } }}5d }}6|dpN|d}Lt|Ld" }Mt|Ld# t|Ld$ t|Ld%   }E}F}Gdddddg};|s|C|5 |;|M< |;\}<}=}>}?}@t|>|?|@f}Bt|>|?|@}H|Mdkrd}Cn|d& dkrtd }}6|d |d d  }M}Ndddddg};|s:|C|5 }O|O|Nkr2|Ond|;|M< |;\}<}=}>}?}@t|>|?|@}H|Ddkrdd}Hn|Ddkr|A}Hn.|Ddkrd}Hn|Ddkr|A}Hn|Ddkr|B}H|Hr|H|Gd d kr|H|Gd d  }K|H|Fd d kr|H|Fd d  |K }J|H|Ed d kr|H|Ed d  |J |K }I|r|rdddddddg}Px6t|td'D ] \}Q}Rtd(d) |RD |P|Q< qLW |P\}=}>}?}@}I}J}K|rt
|=|>|?|@|I|J|Kfrt||=|>|?|@|I|J|K|Bd*	}S| j|S nd+|d,d- }d+|d,d- }|d. d }T| r|!r|C|Tkr|d& dkrdnd }Ud/tj|d0| j}V| j|Vd}W||W | j|V< t|| j|| ||	|
||| |!||8|8|7|Cd||||d& ||||6|Ud1}X| j|X d S )2Nr   r   Fr   r   Tr>   rM   rD   ry   r6   r7   rE   rB   r   r8   r   r   r   r   r   r   r9   r:   r;   r   r   r   r   r   r   r   r   r   r   r   r   r   r   c             s   s"   | ]}|d  |d    V  qdS )r   r   N)rj   )r   r   r0   r0   r1   r   k  s    z<ResultHandler.flexible_time_table_handler.<locals>.<genexpr>)	r4   r   r   rd   re   r   r   r   r   r   r   r   r   z{}_{}z%Y-%m-%d)r4   rH   r>   rO   rN   rD   ry   rE   r   r9   r:   rQ   r   r   r   r   r`   ra   rb   r   r   r   r   r   r   r   )r4   r+   r   r   rk   ri   r"   rm   rj   rp   rl   r   allrs   r   r   r   r   r   r   r'   rn   rh   r   r   r   r   r.   r   rO   r&   )Yr/   rv   ru   r+   r   r   r   r>   r   rD   ry   r6   r7   rE   r   r8   r   Zearlyr   r}   r  r   Zduty_balancerx   r   rw   r   r   r   r   r   r   Zfirst_clock_inZlast_clock_outrP   r   r   r   Zlog_inZlog_outr9   r:   Z_presentr   r   r   Zfake_inZfake_outr   r   r   Zeffective_inZeffective_outZeffective_dutyr   r   Zeffective_wtr   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  r0   r0   r1   flexible_time_table_handler  s@   




((






,z)ResultHandler.flexible_time_table_handlerc             C   s:   |d dkr|  | n|d dkr.| | |   d S )Ncategoryr   r   )r  r
  r  )r/   rv   r0   r0   r1   _result_handler  s
    
zResultHandler._result_handlerc             C   s   x| j D ]}| | qW d S )N)r!   r  )r/   rr0   r0   r1   result_handler  s    zResultHandler.result_handlerc             C   s(  ddl m} |jdkrx| jD ]}|  qW x| jD ]}|  q6W x| jD ]}|  qNW x| jD ]}|  qfW x| jD ]}|  q~W x| j	D ]}|  qW n|| jrt
j| j | jrtj| j | jrtj| j | jrtj| j | jrtj| j | j	r$tj| j	 d S )Nr   )settingsZoracle)Zdjango.confr  ZDATABASE_ENGINEr%   Zsaver$   r&   r'   r(   r)   r	   r   Zbulk_creater   r   r   r   r
   )r/   r  r   ZmpZpbober0   r0   r1   save_attendance_details_to_db  s4    
z+ResultHandler.save_attendance_details_to_dbc             C   s   |    d S )N)r  )r/   r0   r0   r1   save_result_to_db  s    zResultHandler.save_result_to_dbN)r   )__name__
__module____qualname__r2   r*   staticmethodr4   r   r   r   r  r  r
  r  r  r  r  r0   r0   r0   r1   r   #   s$    "*
   ' 6r   )5timer   r   r   r   r4   Zmysite.att.global_cacher   r   r   r   Zmysite.att.modelsr   r   r   r	   r
   r   r   Zdjango.utilsr   r   Zdateutil.relativedeltar   Zdjango.db.modelsr   Zdjango.db.models.functionsr   r   r   r   Zdjango.core.cacher   r   r   ZDTZ&mysite.iclock.models.model_transactionr   ZCOVER_INZ	COVER_OUTZ
COVER_FULLr   ro   ZSCHEDULE_WORKZNORMAL_WORKZ	NORMAL_OTZ
WEEKEND_OTZ
HOLIDAY_OTZCALCULATION_OTZAPPROVAL_OTZAPPROVAL_OT_PRIORITYobjectr   r0   r0   r0   r1   <module>   s2   $
