B
    Ib                 @   s   d dl 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mZmZ d dlmZmZ d dlmZmZ d d	lmZ d
ZdZG dd de	jZG dd de
ZG dd de	jZG dd de
Zdd ZdS )    N)gettext_lazy)ValidationError)db_const)formsZKModelAction)BOOLEANS
BOOLEAN_NOBOOLEAN_YES)models_constmodels_choices)TimeInterval	BreakTime)AdminRuntimeWarning))r   )r   )r   )r   r   ))r   r   )   r   )   r   )   r   c                   s  e Zd ZejedejdZej	eddddZ
ejeddd	Zejedd
Zejeddd	Zejedd
Zejeddd	Zejedd
Zejeddd	Zejedd
Zejeddd	Zejedd
Zejeddd	ZejeddddZejeddddZejeddddZejeddddZejeddedddZejedddedd Z ej	ed!d"d#d$ed%d&Z!ejed'e"#dddd	Z$ejed(de%j&d)Z'ejed*ddedd+Z(ejed,de%j&d)Z)ejed-ddedd+Z*ejed.de%j+d)Z,ej-ed/ddd0ed1d2Z.ej-ed3ddd0ed1d2Z/ej-ed4ddd0ed1d2Z0ejed5e1j2d	Z3ejed6e1j4d	Z5ejed7e6e7d)Z8ejed8e6e7d)Z9ejed9ddedd+Z:ejed:ddedd+Z;ejed;de%j<d)Z=ejed<d0d0edd+Z>ejed=de%j7d)Z?ejed>dd?Z@d@dA ZAdBdC ZBdDdE ZCdFdG ZDdHdI ZEdJdK ZFdLdM ZGdNdO ZH fdPdQZI  ZJS )RAddNormalTimetableFormtimeInterval_field_alias)label
max_lengthZtimeInterval_field_typer   F)r   initialrequiredtimeInterval_field_checkInz09:00:00)r   r   )choicesr   timeInterval_field_checkOutz18:00:00ZtimeInterval_field_checkInStartz08:00:00ZtimeInterval_field_checkInEndz10:00:00Z timeInterval_field_checkOutStartz17:00:00ZtimeInterval_field_checkOutEndz19:00:00 timeInterval_field_inAheadMargin<    timeInterval_field_inAboveMargin!timeInterval_field_outAheadMargin!timeInterval_field_outAboveMargin#timeInterval_field_workTimeDurationi  *timeInterval_field_workTimeDurationHelpTxt)r   r   	help_textr   %timeInterval_field_attendanceDurationtime_unit_minute)r   r   r   r%   timeInterval_field_paidDayg      ?g        g#@time_unit_day)r   r   	min_valueZ	max_valuer%   timeInterval_field_dayChangeZtimeInterval_field_earlyIn)r   r   r   timeInterval_field_minEarlyIn)r   r   r*   r%   timeInterval_field_lateOuttimeInterval_field_minLateOut timeInterval_field_overtimeLevel!timeInterval_field_overtimeLevel1r   time_unit_hour)r   r   r*   decimal_placesr%   !timeInterval_field_overtimeLevel2!timeInterval_field_overtimeLevel3#timeInterval_field_firstHalfOutTime#timeInterval_field_secondHalfInTimetimeInterval_field_inRequiredtimeInterval_field_outRequiredtimeInterval_field_allowLate"timeInterval_field_allowLeaveEarly-timeInterval_field_availablePunchIntervalType'timeInterval_field_duplicatePunchPeriod"timeInterval_field_baseOnPunchTypeZtimeInterval_field_breakTime)r   r   c             C   s\   | j dd }| j dd}|d kr(d S tjtddd |}|tjt|d7 }|S )Nout_timeout_time_cross_daysr   i  r   )days)cleaned_datapopdatetimecombinedate	timedeltaint)self	check_out
cross_days rK   @G:\easytimepro\master/mysite/att\actions\timeinterval_actions.pyclean_out_time]   s    z%AddNormalTimetableForm.clean_out_timec             C   s   | j dd }| j dd }| j dd }|d ks:|d kr>dS tjtddd |}tjtddd |}|tjt|d7 }||  d }|S )	Nin_timebegin_inbegin_in_cross_daysr   i  r   )r@   r   )	rA   getrB   rC   rD   rE   rF   rG   total_seconds)rH   check_in
setup_timerJ   rO   marginrK   rK   rL   clean_in_ahead_marginf   s    z,AddNormalTimetableForm.clean_in_ahead_marginc             C   s   | j dd }| j dd }| j dd }|d ks:|d kr>dS tjtddd |}tjtddd |}|tjt|d7 }||  d }|S )	NrN   end_inend_in_cross_daysr   i  r   )r@   r   )	rA   rQ   rB   rC   rD   rE   rF   rG   rR   )rH   rS   rT   rJ   rW   rU   rK   rK   rL   clean_in_above_marginr   s    z,AddNormalTimetableForm.clean_in_above_marginc             C   s   | j dd }| j dd }| j dd}|d ks:|d kr>dS tjtddd |}|tjt|d7 }||  d }|S )	Nr>   	begin_outbegin_out_cross_daysr   i  r   )r@   r   )	rA   rQ   rB   rC   rD   rE   rF   rG   rR   )rH   rI   rT   rJ   rZ   rU   rK   rK   rL   clean_out_ahead_margin~   s    z-AddNormalTimetableForm.clean_out_ahead_marginc             C   s   | j dd }| j dd }| j dd}|d ks:|d kr>dS tjtddd |}|tjt|d7 }||  d }|S )	Nr>   end_outend_out_cross_daysr   i  r   )r@   r   )	rA   rQ   rB   rC   rD   rE   rF   rG   rR   )rH   rI   rT   rJ   r]   rU   rK   rK   rL   clean_out_above_margin   s    z-AddNormalTimetableForm.clean_out_above_marginc             C   sd   | j dd }| j dd }|d kr(dS |d kr4dS tjtddd |}||  d }|S )NrN   r>   r   i  r   r   )rA   rQ   rB   rC   rD   rE   rR   )rH   rS   rI   durationrK   rK   rL   clean_work_time_duration   s    z/AddNormalTimetableForm.clean_work_time_durationc             C   s   | j dd}|S )Nwork_time_durationr   )rA   rQ   )rH   r`   rK   rK   rL   clean_duration   s    z%AddNormalTimetableForm.clean_durationc             C   s   dS )Nr   rK   )rH   rK   rK   rL   clean_use_mode   s    z%AddNormalTimetableForm.clean_use_modec                s  t  ddd }t j || jd }|t j| jd d }| }| |  j}|dkr| | jd   k r| jd   k r|k rq nnttd	n|dkr| | jd k rZt j || jd }t j 	d
d}| | jd k rt j || jd }n0| | jd kr>| jd | krLt j || jd }n| jd | k r>| | jd kr| jd | krt j || jd }n:| jd | k r>t  ddd }t j || jd }nd| | kr| jd | jd k rt j || jd }n&t  ddd }t j || jd }||k rJnttd	q| | jd krt  ddd }t j || jd }t j 	dd}| | jd k r
| jd | krt j || jd }n(| jd | k rpt j || jd }nf| | jd krp| jd | krHt j || jd }n(| jd | k rpt j || jd }||k r|nttd	nttd	n t
t|  }	tdtdtdtdtdtdtdd}
x<|
 D ]0}|d |	krtd}t|j|d dqW tdtdd}x<| D ]0}|d |	kr0td}t|j|d dq0W t|	d }t|	d }t|	d }t|	d }t|	d  }|dk rttd!|dk rttd"|dk rttd#|dk rttd$|dk rttd%t|	d& }t|	d' }|rF||krFttd(| t|	d) }t|	d* }|r~||kr~ttd+| t|	 |	S ),Ni  r   rN   r`   )minutesr   first_half_out_timesecond_half_in_timeinvalid_timez2019-01-01 00:00:00z%Y-%m-%d %H:%M:%Sr   z2019-01-02 00:00:00r(   r,   r.   r0   r3   r4   r<   )work_daymin_early_inmin_late_outovertime_lv1overtime_lv2overtime_lv3available_interval$timeInterval_error_invalidFieldValue)fieldr9   r:   )
allow_lateallow_leave_earlyZthis_field_is_requiredin_ahead_marginin_above_marginout_ahead_marginout_above_marginrb   Z&timeInterval_error_invalidCheckInStartZ$timeInterval_error_invalidCheckInEndZ'timeInterval_error_invalidCheckOutStartZ%timeInterval_error_invalidCheckOutEndZ"timeInterval_error_invalidCheckOutearly_inrj   Z!timeInterval_error_invalidEarlyInlate_outrk   Z!timeInterval_error_invalidLateOut)rC   rE   rD   rA   rF   timer@   r   _strptimesuperr   cleanitemsformatrG   data_pre_check)rH   currS   rI   check_out_timerJ   first_half_timesecond_half_out_timecur2rA   check_value_field_listrq   msgZcheck_value_fieldsZin_aheadZin_aboveZ	out_aheadZ	out_abover`   rx   rj   ry   rk   )	__class__rK   rL   r~      s    2


(






zAddNormalTimetableForm.clean)K__name__
__module____qualname__r   	CharFieldr{   r   MAX_TIME_INTERVAL_ALIASalias
FloatFielduse_mode	TimeFieldrN   ChoiceFieldABOVE_CROSS_DAYSr?   r>   AHEAD_CROSS_DAYSrP   rO   rX   rW   r[   rZ   r^   r]   IntegerFieldrt   ru   rv   rw   rb   r`   ri   rC   rz   
day_changemcsUNSCHEDULED_POLICYrx   rj   ry   rk   OVERTIME_LEVELovertime_lvDecimalFieldrl   rm   rn   mcFIRST_HALF_OUT_TIMErf   SECOND_HALF_IN_TIMErg   r	   r   in_requiredout_requiredrr   rs   AVAILABLE_PUNCH_TYPEavailable_interval_typero   func_key
off_periodrM   rV   rY   r\   r_   ra   rc   rd   r~   __classcell__rK   rK   )r   rL   r      s   




	r   c               @   s4   e Zd ZedZedZedZeZdZ	dd Z
dS )AddNormalTimetableZ&timeInterval_action_addNormalTimetableZ2timeInterval_action_addNormalTimetable_descriptionZ.timeInterval_action_addNormalTimetable_helpTxt c             O   sl   t | jj}| rh|j }|d}tf |}|  |	 rht
jj|	 dd}||_|  d S )Nr   ,)id__in)r   requestPOSTis_validrA   copyrB   r   savestripr   objectsfiltersplit
break_time)rH   argskwargsfparamsr   tbZobjsrK   rK   rL   action%  s    


zAddNormalTimetable.actionN)r   r   r   r{   verbose_nameshort_descriptionhelp_txtr   action_formaction_templater   rK   rK   rK   rL   r     s   r   c                   s  e Zd ZejedejdZej	ede
ddddZej	ede
ddddZejeddZejed	deed
dZejedddeddZejeddejdZej	ede
ddddZejeddddZejeddddZejeddddZejeddddZejedddeddZejedee dZ!ejedee dZ"ejeddej#dZ$ejedd ded
dZ%ejed!dej&dZ'ej(ed"ddded#d$Z)ej(ed%ddded#d$Z*ej(ed&ddded#d$Z+ej	ed'e,j-dZ.ej	ed(e,j/dZ0ejed)dej1dZ2ejed*dded
dZ3ejed+dej dZ4ejed,e5e dZ6d-d. Z7d/d0 Z8d1d2 Z9d3d4 Z:d5d6 Z; fd7d8Z<  Z=S )9AddFlexibleTimetableFormr   )r   r   r   r   )r   r   r   r   )r   r   r&   r'   )r   r   Zdisabledr%   r(   g      ?r)   )r   r   r*   r%   ZtimeInterval_field_workType)r   r   r   r+   r   F)r   r   r   r    r!   r"   r#   i  r$   r7   r8   r-   r.   r   r/   r0   r1   )r   r   r*   r2   r%   r3   r4   r5   r6   r;   r<   r=   Z#timeInterval_field_useMultiplePunchc             C   s   | j dd }| j dd }| j dd }|d ks:|d kr>dS tjtddd |}tjtddd |}|tjt|d7 }||  d }|S )	NrN   r>   r?   r   i  r   )r@   r   )	rA   rQ   rB   rC   rD   rE   rF   rG   rR   )rH   rN   r>   rJ   rS   rI   rU   rK   rK   rL   rc   b  s    z'AddFlexibleTimetableForm.clean_durationc             C   s   dS )Nr   rK   )rH   rK   rK   rL   rV   n  s    z.AddFlexibleTimetableForm.clean_in_ahead_marginc             C   s   | j ddS )Nr`   r   )rA   rQ   )rH   rK   rK   rL   rY   q  s    z.AddFlexibleTimetableForm.clean_in_above_marginc             C   s   | j ddS )Nr`   r   )rA   rQ   )rH   rK   rK   rL   r\   t  s    z/AddFlexibleTimetableForm.clean_out_ahead_marginc             C   s   dS )Nr   rK   )rH   rK   rK   rL   r_   w  s    z/AddFlexibleTimetableForm.clean_out_above_marginc                s  t  ddd }t j || jd }|t j| jd d }| }| |  j}|dkr| | jd   k r| jd   k r|k rq nnttd	n|dkr| | jd k rZt j || jd }t j 	d
d}| | jd k rt j || jd }n0| | jd kr>| jd | krLt j || jd }n| jd | k r>| | jd kr| jd | krt j || jd }n:| jd | k r>t  ddd }t j || jd }nd| | kr| jd | jd k rt j || jd }n&t  ddd }t j || jd }||k rJnttd	q| | jd krt  ddd }t j || jd }t j 	dd}| | jd k r
| jd | krt j || jd }n(| jd | k rpt j || jd }nf| | jd krp| jd | krHt j || jd }n(| jd | k rpt j || jd }||k r|nttd	nttd	n t
t|  }	tdtdtdtdtdtdtdd}
x<|
 D ]0}|d |	krtd}t|j|d dqW t|	d }t|	d }|dk rBttd||ksV|dk rntdtd j|dt|	d }t|	d }t|	d }t|||dk rttd t|||fr||  kr|ksn ttd!d S )"Ni  r   rN   r`   )re   r   rf   rg   rh   z2019-01-01 00:00:00z%Y-%m-%d %H:%M:%Sr   z2019-01-02 00:00:00r(   r#   r0   r3   r4   r.   r<   )ri   rb   rl   rm   rn   rk   ro   rp   )rq   rb   z%timeInterval_error_invalidCheckIn/Outz%sz.timeInterval_error_flexibleWorkTime_{duration})r`   rl   rm   rn   'timeInterval_error_invalidOvertimeValue,timeInterval_error_invalidCheckOvertimeLevel)rC   rE   rD   rA   rF   rz   r@   r   r{   r|   r}   r   r~   r   r   rG   floatminany)rH   r   rS   rI   r   rJ   r   r   r   rA   r   rq   r   r`   Z	work_timeot1ot2ot3)r   rK   rL   r~   z  s    2






zAddFlexibleTimetableForm.clean)>r   r   r   r   r   r{   r   r   r   r   rC   rz   rN   r>   r   r   r?   r   r   r`   r   ri   r   Z	WORK_TYPEZ	work_typer   rt   ru   rv   rw   rb   r	   r   r   r   r   ry   rk   r   r   r   rl   rm   rn   r   r   rf   r   rg   r   r   ro   r   r   Zmultiple_punchrc   rV   rY   r\   r_   r~   r   rK   rK   )r   rL   r   2  sb   






r   c               @   s4   e Zd ZedZedZedZeZdZ	dd Z
dS )AddFlexibleTimetableZ(timeInterval_action_addFlexibleTimetableZ4timeInterval_action_addFlexibleTimetable_descriptionZ0timeInterval_action_addFlexibleTimetable_helpTxtr   c             O   sB   t | jj}| r>|j }|ddi tf |}|  d S )Nr   r   )	r   r   r   r   rA   r   updater   r   )rH   r   r   r   r   r   rK   rK   rL   r     s    


zAddFlexibleTimetable.actionN)r   r   r   r{   r   r   r   r   r   r   r   rK   rK   rK   rL   r     s   r   c             C   s<  d}t | d}t | d}t | d}t|||dk rJttdt|||frz||  krl|kszn ttd| dd }|r8| d	|}tj||}|tj	| d
d }||kr|tj	dd }dd t
|dD }tjj|d}g }	x|D ]}
t|j|j|j|
jj|
jj}t|j|j|j|
jj|
jjtj	|
j|
j d }||k rt|j|j|j|
jj|
jj}t|j|j|j|
jj|
jjtj	|
j|
j d }||k r|tj	dd7 }||k s||krttddd|
jid|
j||f}|	| q
W t|	}|	r8|dkr8xt|D ]}|	| }|d }xt||D ]}|	| }|d |d   kr|d ksn |d |d   kr|d ksn |d |d   kr|d ksn |d |d   kr|d krfn n ttdd|d |d ddqfW qFW d S )Nz%H:%M:%Srl   rm   rn   r   r   r   r   rN   rb   )re   r   )r@   c             S   s   g | ]}t |qS rK   )rG   ).0irK   rK   rL   
<listcomp>	  s    z"data_pre_check.<locals>.<listcomp>r   )r   z6The break time %(n)s not in valid time interval periodz-1n)coder   r   z0the_breaktime_%(n1)s_and_%(n2)s_has_intersection)Zn1Zn2)r   rQ   r   r   r{   r   strftimerC   r|   rF   strr   r   r   r   ZyearZmonthZdayZperiod_startZhourZminuter`   Z
end_marginr   appendlenrange)dataZTIME_FORMATr   r   r   Z
breaktimesZsch_stZsch_etZbksZbk_listZbkZbk_sZbk_eitemZitsr   ZpitemtmrK   rK   rL   r     sd    



LNr   ) rC   Zdjango.utils.translationr   r{   Zdjango.formsr   Z
mysite.attr   Zmysite.adminr   r   Zmysite.base_choicesr   r   r	   r
   r   r   r   Zmysite.att.modelsr   r   Zmysite.admin.exceptionsr   r   r   ZZKActionFormr   r   r   r   r   rK   rK   rK   rL   <module>   s$      1