B
    cz                 @   s  d dl Z d dlZd dlZd dlmZ d dlmZmZmZ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 ZdZdZd	d
 Zdd Zdd Zdd Zee j e j e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"d# Z%d$d% Z&d&d' Z'd(d) Z(d*d+ Z)d,d- Z*d.d/ Z+d0d1 Z,d2d3 Z-d4d5 Z.d6d7 Z/d8d9 Z0d:d; Z1d<d= Z2dSd>d?Z3d@dA Z4dTdCdDZ5dEdF Z6dUdGdHZ7dVdIdJZ8dKdL Z9dMdN Z:dOdP Z;dQdR Z<dS )W    N)settings)SumIntegerField	TimeFieldValueCaseWhen)Cast	TruncDateCoalesce)	sql_utils)
C_ATT_RULE      c             C   s   dt |  d }|S )N')str)valresult r   .G:\easytimepro\master/mysite/att\calc\utils.pyformat_emp_id   s    r   c       
      C   s   d}d}d}t | }|| dkr(|| p2|| d }xhtt|D ]X}|d7 }| || |d |  }d|ddd |D f }	||	7 }||k rB|d	7 }qBW d
| d S )zU
        Used for Oracle fixed 'maximum number of expressions in a list is 1000'
     i  r   r   z
%s in (%s),c             S   s   g | ]}t |qS r   )r   ).0ir   r   r   
<listcomp>$   s    zemp_where.<locals>.<listcomp>z or ())lenrangeintjoin)
empidscol_nameZs_wZcnttZlenstimesr   ZeulZo_wr   r   r   	emp_where   s     r&   c             C   s   t | |}|S )z)
        generate parameter employee
    )r&   )r"   r#   	param_empr   r   r   param_emp_where+   s    
r(   c             C   sf   ddl m} |jj| ||dd}|jdd}|dddd	d}d
d t|t	dD }|S )Nr   )Leave)employee_id__instart_time__lteend_time__gte
start_timer   )audit_statusemployee_idend_timeidc             S   s   i | ]\}}t ||qS r   )list)r   keyitemsr   r   r   
<dictcomp>:   s    z"dict_leave_obj.<locals>.<dictcomp>)
mysite.att.modelsr)   objectsfilterorder_byvalues	itertoolsgroupbyoperator
itemgetter)r'   
start_dateend_dater)   querysetpayloadr   r   r   dict_leave_obj3   s    rC   )r'   r?   r@   returnc                sX   ddl m} ddlm} dd   fdd| D }|jj||fd|d}|jf |}|S )	Nr   )PayloadBase)REGULARc             S   s$   t ttt| tddt ddS )Nr   )Zemp__idZthen)output_fieldr   )r   r   r   r   r   r   )empr   r   r   <lambda>B   s   z!dict_absent_obj.<locals>.<lambda>c                s   i | ]} ||qS r   r   )r   rH   )absent_annotationr   r   r5   D   s    z#dict_absent_obj.<locals>.<dictcomp>)Zatt_date__rangeZ
absent__gtday_off)r6   rE   Zmysite.att.models_choicesrF   r7   r8   Z	aggregate)r'   r?   r@   rE   rF   Zall_annotationsrB   r   )rJ   r   dict_absent_obj>   s    rL   c             C   s  ddl m} |d|d| d}ddddgi}tj}td	d
d||}t|}i }	|rx|D ]}
|
d }|
d }|
d }|rt|j	|j
|j|j|j}t|j	|j
|j|j|j}||	krg |	|< |	| |
d |||
d |
d |
d ||
d f qdW |	S )Nr   )CATEGORY_TRAININGz%Y-%m-%d %H:%M:%S)r?   r@   rH   andr?   r@   rH   calcZget_trainingatt   r   r            )Zmysite.att.models_constrM   strftimer   ZATT_WITHOUT_SECONDr   get_sqlp_querydatetimeyearmonthdayhourminuteappend)r'   r?   r@   rM   paramsid_partZwithout_secondsqlrowsZall_training_dictobjrH   r-   r0   r   r   r   dict_training_objJ   s,    

6rd   c             C   sx   ddl m} |jj| ||dddd}|jdd}|jtdd	}|dd
dddd}dd t	|t
dD }|S )Nr   )Overtime)r*   r+   r,   r/   r-   Zovertime_typer   )r.   )daterf   r0   r1   c             S   s   i | ]\}}t ||qS r   )r2   )r   r3   r4   r   r   r   r5   s   s    z%dict_overtime_obj.<locals>.<dictcomp>)r6   re   r7   r8   r9   annotater
   r:   r;   r<   r=   r>   )r'   r?   r@   re   rA   rB   r   r   r   dict_overtime_objg   s    
rh   c       	   
   C   s   ddl m}m} ddlm} ddlm} |jj| d	||d||dB 
d j|d	| d
|d| d
|d| d
ddddddddd
d}dd t|tdD }|S )Nr   )Qr   )r	   )DepartmentSchedule)Zdepartment__employee__in)end_date__lt)start_date__gtr?   shift__auto_shift)rG   shift__cycle_unitshift__shift_cycle)
auto_shiftunitcycledepartment_idr@   shift_idrp   rq   rr   r1   c             S   s   i | ]\}}t |t|qS r   )r2   r   )r   r3   r4   r   r   r   r5      s    z'department_schedule.<locals>.<dictcomp>)django.db.modelsri   r   django.db.models.functionsr	   r6   rj   r7   r8   excluder9   Zdistinctrg   r:   r;   r<   r=   r>   )	empsr?   r@   ri   r   r	   rj   rA   rB   r   r   r   department_schedulew   s    
ry   c       
      C   s   ddl m}m}m} ddlm} ddlm} |jj	| d
||d||dB dj|d	|d
dd|d| d|d| d|d| d|d| ddddddddddd	d	}dd t|tdD }	|	S )Nr   )ri   r   	CharField)r	   )AttSchedule)r*   )rk   )rl   r?   r/   $   )Z
max_length)rG   Zemployee__department_idrm   rn   ro   )rH   rs   rp   rq   rr   rH   rs   r@   rt   rp   rq   rr   r1   c             S   s   i | ]\}}t ||qS r   )r2   )r   r3   r4   r   r   r   r5      s    z%employee_schedule.<locals>.<dictcomp>)ru   ri   r   rz   rv   r	   r6   r{   r7   r8   rw   r9   rg   r:   r;   r<   r=   r>   )
rx   r?   r@   ri   r   rz   r	   r{   rA   rB   r   r   r   employee_schedule   s    r}   c       
      C   s   | d| d| d}ddddgi}tddd	||}t|}i }|r~x2|D ]*}|d
 }	|	|krlg ||	< ||	 | qPW |S )Nz%Y-%m-%d %H:%M:%S)r?   r@   rH   rN   rH   r?   r@   rO   Zget_schedulerP   r   )rU   r   rV   rW   r^   )
r'   r?   r@   r_   r`   ra   rb   Zall_schedule_dictrc   emp_pkr   r   r   dict_schedule_obj   s    

r   c          &   C   s  ddl m} |jj| ||ddjtdt dtdt dtdt dtd	t dtd
t dtdt dtdt dtdt dtdt dtdt dtdt dtdt dtdt dtdt dtdt dtdt dtdt dtdt dtdt dtdt dtdt dtdt dtdt dtdt dtdt dtdt dtd d!	d"d#d$d%d&d'dd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdD$
d"}dEdF tj|td"dGD }|S )HNr   )TempScheduleF)r*   Zstart_time__gteZstart_time__ltZtime_interval__isnulltime_interval__duration)rG   time_interval__use_modetime_interval__in_ahead_margintime_interval__in_above_margintime_interval__out_ahead_margintime_interval__out_above_margin!time_interval__work_time_durationtime_interval__work_typetime_interval__day_changetime_interval__allow_late time_interval__allow_leave_earlytime_interval__in_requiredtime_interval__out_requiredtime_interval__early_intime_interval__min_early_intime_interval__late_outtime_interval__min_late_outZ	rule_flagtime_interval__overtime_lvtime_interval__overtime_lv1time_interval__overtime_lv2time_interval__overtime_lv3time_interval__multiple_punchtime_interval__func_key&time_interval__available_interval_type!time_interval__available_interval#time_interval__break_time__duration)durationcategoryin_aheadin_above	out_ahead	out_aboveduty_durationrK   change_time
allow_lateallow_earlyrequires_inrequires_outearly_inmin_early_inlate_outmin_late_outpriorityot_lvot_lv1ot_lv2ot_lv3multiple_punchfunc_keyperiod_typeperiod
break_timer/   r1   time_interval_idtime_interval__aliasr-   r0   Z	work_typer   r   r   r   r   r   r   r   time_interval__work_dayr   rK   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   c             S   s   i | ]\}}t ||qS r   )r2   )r   r3   r4   r   r   r   r5      s    z*employee_temp_schedule.<locals>.<dictcomp>)r3   )r6   r   r7   r8   rg   r	   r   r   r   r:   r9   r;   r<   r=   r>   )rx   r?   r@   r   rA   rB   r   r   r   employee_temp_schedule   sP    
r   c       
      C   s   | d| d| d}ddddgi}tddd	||}t|}i }|r~x2|D ]*}|d
 }	|	|krlg ||	< ||	 | qPW |S )Nz%Y-%m-%d %H:%M:%S)r?   r@   rH   rN   r?   r@   rH   rO   Zget_temp_schedulerP   r   )rU   r   rV   rW   r^   )
r'   r?   r@   r_   r`   ra   rb   Zall_temp_schedule_dictrc   r~   r   r   r   dict_temp_schedule_obj   s    

r   c          #   C   sj  ddl m}m} |jj| d}|jj|d jtdt dtdt	 dtdt	 dtd	t	 dtd
t	 dtdt	 dtdt	 dtdt	 dtdt	 dtdt dtdt	 dtdt	 dtdt	 dtdt	 dtdt	 dtdt	 dtdt	 dtdt	 dtdt	 dtdt	 dtdt	 dtdt	 dtdt	 dtdt	 dtdt	 dtdt	 dt
d d!d"d#dd"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdB!}dCdD tj|td"dED }|jj| dFd dGd"d#d"d#dB}dHdD tj|td"dED }x@| D ]4\}}	||g }
|
rX|| |	 n|	||< q.W |S )INr   )ShiftDetailTimeInterval)
company_id)Ztime_interval__inZtime_interval__in_time)rG   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   )check_inr   r   r   r   r   r   r   rK   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rt   Z	day_indexr   r   r   r   r   r   r   r   r   rK   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   weekend_dayc             S   s   i | ]\}}t ||qS r   )r2   )r   r3   r4   r   r   r   r5     s    z%dict_shift_detail.<locals>.<dictcomp>)r3   r   )Zshift__company_idr   Ztime_intervalc             S   s   i | ]\}}t ||qS r   )r2   )r   r3   r4   r   r   r   r5      s    )r6   r   r   r7   r8   Zselect_relatedrg   r	   r   r   r   r9   r:   r;   r<   r=   r>   r4   getextend)r   r   r   Zmatched_timeintervalobjsrB   Zweekend_shift_objZweekend_payloadkvZ
shift_listr   r   r   dict_shift_detail   s\    

r   c             C   s   ddl m} |tjdd }|jj| ||djdd}|jtdt	t
dt dd	}|d
dddddddd}dd tj|tddD }|S )Nr   )TransactionrQ   )days)Zemp__inZpunch_time__gteZpunch_time__lte)Zterminal__is_attendanceZ
punch_time)rG   )att_dateusedr1   Zemp_idr   Zpunch_stater   c             S   s   i | ]\}}t ||qS r   )r2   )r   r3   r4   r   r   r   r5   7  s    z+dict_initial_record_obj.<locals>.<dictcomp>)r3   )Zmysite.iclock.modelsr   rX   	timedeltar7   r8   rw   rg   r
   r	   r   r   r:   r9   r;   r<   r=   r>   )r'   r?   r@   r   Zextend_daterA   rB   r   r   r   dict_initial_record_obj*  s    
r   c             C   sx   ddl m} |jjd| ddddddd	d
ddddd}i }x2|D ]*}|d }||g }|| |||< qFW |S )Nr   )	BreakTimeF)Ztimeinterval__isnullr   period_startZtimeinterval__idr1   aliasr   Z	calc_typer   available_interval_typeavailable_intervalr   minimum_duration)r6   r   r7   r8   r9   Zvalues_listr   r^   )r   r   r   Zbreak_time_detailrc   Zschclass_idZbksr   r   r   dict_break_time_detail;  s    

r   c             C   sX   d| i}ddgi}t ddd||}t |}i }|rTx|D ]}|d ||d < q<W |S )NrH   rN   rO   get_emp_departmentrP   r   r   )r   rV   rW   )param_emp_idr_   r`   ra   rb   Zemp_deptrc   r   r   r   r   J  s    


r   c             C   sT   d| i}ddgi}t ddd||}t |}i }x|D ]}|d ||d < q8W |S )NrH   rN   rO   get_emp_locationrP   r   r   )r   rV   rW   )r   r_   r`   ra   rb   Zemp_locationrc   r   r   r   r   Z  s    


r   c             C   sj   |d }|d }|dkr d|fS |dkrH|   }|d d }||d fS |dkrf| j}|d |d fS dS )z,
    Get shift start index and duration
    r   r   r         N)Zweekdayr[   )startZshift_attrsZ
cycle_unitZshift_cycleZwdindexr[   r   r   r   get_start_indexi  s    r   c             C   s$   t  | j| j| j|j|j|j}|S )N)rX   rY   rZ   r[   r\   r]   second)rf   timer   r   r   r   get_datetimez  s    r   c             C   s   t |}x,t|D ] \}}t|tjr| ||< qW |d |d  }}|dd \}}}	}
t| |}||kr~|tjdd7 }t| |}||k r|tjdd7 }t||	}|	|kr|tjdd7 }t||
}|
|k r|tjdd7 }||||fS )u   
    cross day handler
    e [shift_id, day_index，timeinterval_id，break_time, check_in ，check_out，in_start，in_end，out_start，out_end]
    rR   rS   rT   
   )r   r   )r2   	enumerate
isinstancerX   r   r   r   )Zbeginender   r   r   	check_outZin_startZin_endZ	out_startZout_endZcheck_in_startZcheck_in_endZcheck_out_startZcheck_out_endr   r   r   deal_cross_day  s&    



r   c       
   
   C   s   g }x|D ]}|dd \}}t j | j| j| j|j|jd}|| k rbt j |j|j|j|j|jd}|t j|d }|||d |d |d |d |d	 |d
 d}	||	 q
W |S )NrQ   rS   )rY   rZ   r[   r\   r]   )Zminutesr                  )r   Z
period_endZbreak_idr   r   r   r   r   )rX   rY   rZ   r[   r\   r]   r   r^   )
r   r   Zbreak_timesZbtsZbtZ	break_outr   r-   r0   Zbkr   r   r   deal_break_time  s&    
r   c             C   sB   i }x8| D ]0}|d  d}||kr,g ||< || | q
W |S )Nr   z%Y-%m-%d)rU   r^   )ZtimeintervalsZtimeinterval_dictZtiZ
check_dater   r   r   get_timeinterval_dict  s    
r   c             C   s  d}|j dkr|| d d 7 }|j dkr8|| d d 7 }|j dkrR|| d d 7 }|js^|jrn|| d	 d 7 }|jr|jd
ks|| d d 7 }|jr|js|| d d 7 }|jd
kr|| d d 7 }|jd
kr|| d d 7 }|jd
kr|| d d 7 }|jd
kr|| d d 7 }|S )Nr   rQ   r   Zreport_symbolr   r   r   r      r   r      rS   rT      	   )	Z	data_typeZclock_in_timeZclock_out_timeZno_check_inZabsent_timeZno_check_outZ	late_timeZearly_leaveovertime)Z
calc_itemsZattdaysZsymbolsr   r   r   get_symbols  s,    





r   c             C   sR   | d d | d d f}| d d | d d f}| d d | d d f}|||fS )Nr   r   r   r   )dataZleaveZtrainingZholidayr   r   r   parse_leave  s    r   c             C   sP   | d }| d }d}|r$|dk r$d}||krH|rH|| }||d krH|}||fS )Nuse_overtime_ftminimum_overtime_ftr   r   <   r   )ZtimeintervalZtotal_work_timeZtimeinterval_durationot_typer   r   r   _valr   r   r   get_flexible_overtime  s    r   c             C   s(   ddl m}m} |t| |d|S )Nr   )Decimal
ROUND_DOWNz0.000)decimalr   r   r   Zquantize)r   r   r   r   r   r   decquan  s    r   c             C   s  ddl }|dkrd}t|}|dkry^|dkrx|dkrLt| t| | }q|t| |t| |t| }nt| }W n    ddl}|  | }Y nX |dkr|dkrx|dkrt| t| |d d krt| t| | | }nt| t| | }nht| d t|d  |d d d krZt| d t|d  | | }nt| d t|d  | }n(| d d dkrt| d }nt| }|dkr|dkr|dkrt|d	kr,t|d
 dkr,t| t| dkrt| t| d t| }nt| t| t| }n\t| d t|d  dkrlt| d t|d  | | }nt| d t|d  | }n\t| d t|d  dkrt| d t|d  | | }nt| d t|d  | }n(| d d dkrt| d }nt| }|S )zn
    round data
    @source: source data (char)
    @min_unit: min unit (int)
    @flag: round flag (int)
    r   Nr   r   gHz>i  i  rQ      r   )r   r    r   r   	traceback	print_exc)sourcemin_unitflagr   retr   r   r   r   
round_data  sZ    



*"


 ""r  c             C   s<   d}y&x | d dkr&| d9 } |d7 }qW W n   Y nX |S )Nr   r   r   r   )r   digitsr   r   r   get_decimal_digits;  s    r  Fc             C   sH  ddl m} |sd}| }t|d }	|	dkrBt|t| d }n|	dkr`t|t| d }n|	dkr|dkrt|d	d}
|s|
tkrt|t| || }qt|t| || t| }n(|
tkrt|t| || t| }nt|t| d
 t| }t	t
|d }t|t
|d |d }t||}|S )Nr   )r   rq   )r   rR   r   r   i  rQ   work_day_related_displayip  r  Z	round_off)r   r   r    r   r   r   r   WORK_DAY_DISPLAY_BY_AUTO_CAL WORK_DAY_DISPLAY_BY_TOTAL_RECORDr  floatr  round)valueargZ	work_timeZwork_dayr   Zsummary_type_reportZwhole_day_durationr   r  rq   r  r  r   r   r   
deal_paramF  s.    
""
r  c             C   sP   | }|d dkr| d }n.|d dkr0| d }n|d dkrH| d d }t |S )Nrq   r   i  )r   rR   r   rQ      )r    )r  r  r  r   r   r   take_value_secondsc  s    

r  c             C   sT   | d }| d }|rP|rP||k rP||   }|r@||kr<|p>|}||d krP|S dS )Nahead_overtimeminimum_ahead_overtimer   r   )total_seconds)Zattrsr   Zclock_in	work_more	duty_doner  r  r   r   r   r   get_normal_ahead_overtimen  s    r  c       
      C   sd   |d }|d }|dk r d}d} |r\d}	|r2|}	n|rH||krH|| j }	|	|d kr\| |	7 } || fS )Nabove_overtimeminimum_above_overtimer   r   r   )Zseconds)
Z	real_longZtimeinterval_attrZset_outZatt_outr   r  r  r  r  r   r   r   r   get_normal_above_overtime{  s    
r  c             C   sJ   ddl m} ddlm} |jj| d}i }x|D ]}||||j< q0W |S )Nr   )model_to_dict)LeaveCategory)r   )django.forms.modelsr  r6   r  r7   r8   pk)r   r  r  Zall_leave_categoryZall_leave_category_dictZlcr   r   r   dict_leave_type  s    
r  c             C   sJ   ddl m} ddlm} |jj| d}i }x|D ]}||||j< q0W |S )Nr   )r  )TrainingCategory)r   )r  r  r6   r   r7   r8   r  )r   r  r   Zall_training_categoryZall_training_category_dictZtcr   r   r   dict_training_type  s    
r!  c             C   s   t t| |  S )N)r    r  r  )r   r   r   r   r   r    s    r  c             C   s  ddl m} |jj| d}|jtdt dtdt dtdt dtdt dtd	t dtd
t dtdt dtdt dtdt dtdt dtdt dtdt dtdt dd}|dddddddddddddd 	dd}d!d" t
|tdD }|S )#Nr   )r   )r   Zbreak_time__calc_type)rG   Zbreak_time__period_startZbreak_time__durationZbreak_time__end_marginZbreak_time__early_inZbreak_time__min_early_inZbreak_time__late_inZbreak_time__min_late_inZbreak_time__func_keyZ#break_time__available_interval_typeZbreak_time__available_intervalZbreak_time__multiple_punchZbreak_time__minimum_duration)deduct_rulebreak_startbreak_durationmarginbreak_early_inbreak_min_earlybreak_late_inbreak_min_late
break_funcr   r   	mul_punchmin_durationr1   r#  r$  r%  r&  r'  r(  r)  r"  r*  r   r   r+  r,  c             S   s   i | ]\}}t ||qS r   )r2   )r   r3   r4   r   r   r   r5     s    z'get_timetable_break.<locals>.<dictcomp>)r6   r   r7   r8   rg   r	   r   r   r:   r9   r;   r<   r=   r>   )r   r   rA   rB   r   r   r   get_timetable_break  s.    r-  )r   )NFN)r   F)r   F)=rX   r;   r=   Zdjango.confr   ru   r   r   r   r   r   r   rv   r	   r
   r   mysiter   Zmysite.att.global_cacher   r
  Z WORK_DAY_DISPLAY_BY_EVERY_RECORDr	  r   r&   r(   rC   r2   dictrL   rd   rh   ry   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   <module>   s\    /4
H



