B
    b/                 @   s   d dl 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 G d
d deZdd Zdd ZdS )    N)	ModelFormValidationError)models)gettext_lazy)forms)db_const)widgets)AttSchedule)CYCLE_UNITSSHIFT_OT_TYPEc                   s*  e Zd Ze ZejedddejdZ	ejede
jdZejedde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ed	ZejeddddZejedded	ZejeddddZG dd dZ fddZ fddZd fdd	Z  ZS )AttScheduleCreationFormweekend   F)label
max_lengthrequiredZwidgetalias)r   r   
cycle_unit   )r   initialchoicesshift_cycle)r   r   Z!replace_existing_shift_even_using)r   r   r   Zremove_overlap_scheduleZenable_work_on_weekend_asTZ	work_typer   Zenable_work_on_day_off_as
auto_shiftc               @   s   e Zd ZeZdZdgZdS )zAttScheduleCreationForm.Meta__all__r   N)__name__
__module____qualname__r	   ZmodelfieldsZexclude r   r   ;G:\easytimepro\master/mysite/att\forms\attschedule_forms.pyMeta   s   r    c                s   t t| j|| t | jd _tj }|d| jd _|tj	dd d}tj
|dtj	dd }|d| jd _d S )	Nr   z%Y-%m-01
start_date   )daysz%Y-%m-%dend_date)superr   __init__get_weekendr   r   datetimenowstrftime	timedeltastrptime)selfargskwargsr*   Znext_month_firstZthis_month_last)	__class__r   r   r'   $   s    
z AttScheduleCreationForm.__init__c                s   t t|  }t| | |S )N)r&   r   cleandata_pre_check)r.   cleaned_data)r1   r   r   r2   -   s    
zAttScheduleCreationForm.cleanc                s   t t| jdd}|  |S )NF)commit)r&   r   save)r.   r5   Z	save_data)r1   r   r   r6   2   s    zAttScheduleCreationForm.save)T) r   r   r   r   Z	CharFieldr#   _r   ZZKHiddenInputr   r   ZMAX_SHIFT_ALIASr   ZChoiceFieldr
   r   ZIntegerFieldr   ZBooleanFieldshift_coverschedule_coverwork_weekendr   weekend_typework_day_offday_off_typer   r    r'   r2   r6   __classcell__r   r   )r1   r   r      s    	r   c       :      C   s  ddl m}m}m} |dd }|dd }|d}|d}|d}	|dd }
t|d	}|d
}|dd }t|d}|dd }t|d}|dd }|dd }|dd }|sttddd|sttddd||	krttddd|r"|dd d }nttddd|j	g}t
|}t|j|j|j}t|	j|	j|	j}d}|| }|| r|d7 }g }xtt|D ]}|| }|d | }||| }tjj||dd |D d}|r|r|| n6|d j}ttdd|j|j|d |	d d!d"qW i } g }!x|D ]}"|"d#d}#|#d }$|#d d$}%g }&t }'x~|%D ]t}(|(| kr|jj|(d%d })|)| |(< n| |(d })|
r|)j}*|'r|*dkrttd&ddn
|'|* nx|&D ]}+tj|)jd'd'},tj|)jd'd'}-|,|-kr:|-tjdd(7 }-tj|+jd'd'}.tj|+jd'd'}/|.|/kr|/tjdd(7 }/|.|,  kr|/ksn |.|-  kr|/krn n&ttd)d|)|+t t|$d d*d"qW |&|) qxW |!|$|&f q>W |jj|d+}0d,}1|0rZ|0d }2|2j!|kr6d-}1|2j"|krFd-}1|2j#|krVd-}1|2j$|krfd-}1|2j%|krvd-}1|2j&|krd-}1|2j'|
krd-}1|jj|2d.}3i }4x:|3D ]2}5t |5j(}$|$|4krg |4|$< |4|$ |5j) qW d/d |4* D }6d0d |!D }7i +|6d1i +|7d1kr"d-}1|sd|1sd|2j,- . dkrdttd2dd3|2id"n
d-}1| }2|1s||2_/||2_!||2_"||2_#||2_$||2_%||2_&|
|2_'|20  |1|2 x$|!D ]}8|2|2|8d |8d  qW |rx|D ]}9|93  qW |2|d3< d S )4Nr   )TimeIntervalAttShiftShiftDetailemployeer#   r   r!   r%   r   r   r   r:   r;   r<   r=   r8   r9   Z
break_timeZplease_select_employeez-1)codeZplease_input_shift_aliasZ%end_date_can_not_less_than_start_date;r$   Zplease_select_time_intervalsi  r   c             S   s   g | ]}t |qS r   )int).0emp_idsr   r   r   
<listcomp>   s    z"data_pre_check.<locals>.<listcomp>)Zstart_date__lteZend_date__gteZemployee__id__inzL%(code)s(%(name)s) this_employee_already_has_schedule_in %(start)s - %(end)sz%Y-%m-%d)rC   namestartend)rC   Zparams-,)idZ>Can_not_using_multiple_timeinterval_with_flexible_timeintervalz%H:%M:%S)r#   zA%(t)s and %(ss)s time_period_are_duplicated! In_section %(d)s day)tZssd)r   TF)shiftc          	   S   s.   g | ]&\}}d |t ttdd |f qS )z%s%sc             S   s   t | ddS )Npk )getattr)xr   r   r   <lambda>       z+data_pre_check.<locals>.<listcomp>.<lambda>)sortedlistmap)rF   kvr   r   r   rH      s    c          
   S   s2   g | ]*}d |d t ttdd |d f qS )z%s%sr   c             S   s   t | ddS )NrR   rS   )rT   )rU   r   r   r   rV      rW   z+data_pre_check.<locals>.<listcomp>.<lambda>r   )rX   rY   rZ   )rF   itemr   r   r   rH      s    rS   z.the_shift(%(shift)s) was_using_can_not_modify.rQ   )4mysite.att.modelsr?   r@   rA   getrE   r   r7   splitrN   lenr)   dateZyearZmonthdayranger	   ZobjectsfilterappendrB   Zemp_codeZ
first_namer+   setZuse_modeaddr-   Zin_timeZout_timer,   strr   r   r:   r;   r<   r=   r   Z	day_indexZtime_intervalitemsfromkeysZattschedule_setallcountr   r6   Zdelete_time_intervalZadd_time_intervaldelete):r.   r4   r?   r@   rA   rG   r#   Zshift_aliasZshift_startZ	shift_endr   Z
shift_unitr   Zcount_weekendr;   Zcount_day_offr=   r8   r9   Zbreak_timesZemp_lenZ
start_timeZend_timeZbatchtimesZexist_scheduleirJ   rK   Ztmp_uidsZuser_schedulesZempZall_schsresultrc   Zday_schsZ_dayZ_schsZtmpsZ_typesZschZscZ_typetmpZscsZsceZtmp_sZtmp_eZshiftscheckrQ   Zshift_detailsZsd_dictZsdresultsZc_resultrZ	query_setr   r   r   r3   i   s   












6





r3   c              C   sD   ddl m}  ddlm} | }| |j | |j}|d }|S )Nr   )
C_ATT_RULE)threadlocalsr   )Zmysite.att.global_cacherv   Zmysite.baserw   Zget_current_userZaction_initZcurrent_companyr_   )rv   rw   Zcurrent_userZatt_ruler   r   r   r   r(   
  s    r(   )r)   Zdjango.formsr   r   Z	django.dbr   Zdjango.utils.translationr   r7   Zmysite.adminr   Z
mysite.attr   Zmysite.admin.formsr   r^   r	   Zmysite.att.models_choicesr
   r   r   r3   r(   r   r   r   r   <module>   s   X "