B
    c,                @   sp  d dl Z d dlmZ d dlZd dl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 d d
lmZ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$ 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/m0Z0 d dlm1Z1m2Z2 d dl3m4Z4 d dl5m6Z6 d dl7m8Z8 G dd dej9Z:G dd dej9Z;G dd deZ<G d d! d!eZ=G d"d# d#ej9Z>G d$d% d%eZ?G d&d' d'ej9Z@G d(d) d)eZAd*d+ ZBd,d- ZCd.d/ ZDd0d1 ZEd2d3 ZFd4d5 ZGd6d7 ZHd8d9 ZId:d; ZJd<d= ZKd>d? ZLd@dA ZMdBdC ZNdDdE ZOdFdG ZPdHdI ZQdJdK ZRdLdM ZSdS )N    N)OrderedDict)datetime	timedeltadate)Q)ModelChoiceField)render)gettext_lazy)transaction)cache)SumF)get_in_out_timings)formsZKModelAction)AdminRuntimeWarning)Leave)APPLICATIONAUDIT_STATUSAUDIT_SUCCESSREFUSECANCEL_AUDIT_SUCCESS)Employee)db_const)AttRule)LeaveSchedule)LeaveSettings)LeaveCategory)get_current_company_idget_weekend_days)Holiday)TimeInterval)check_leave_combinationc                   sr   e Zd ZejedddZeedej	
 dZejedddejd	Zejed
dejdZ fddZ  ZS )AddLeaveFormZleave_field_employeeF)labelrequiredZleave_field_leaveCategory)r$   ZquerysetZstaff_leave_leaveTypeT   )r$   r%   initialchoicesZleave_field_reason)r$   r%   
max_lengthc                sR   t t| j|| t }tjj|d }|r>dd |D }ng }|| jd _	d S )N)companyc             S   s   g | ]}|d  |d fqS )idcategory_name ).0Zptr-   r-   9G:\easytimepro\master/mysite/att\actions\leave_actions.py
<listcomp>/   s    z)AddLeaveForm.__init__.<locals>.<listcomp>category)
superr#   __init__r   r   objectsfiltervaluesZfieldsr(   )selfargskwargs
company_idr1   )	__class__r-   r/   r3   *   s    zAddLeaveForm.__init__)__name__
__module____qualname__r   ZEmployeeManyToManyField_empr   r   r4   allr1   ChoiceFieldr   ZLEAVE_PAYMENT_TYPEleave_payment_type	TextFieldZMAX_APPLY_REASONreasonr3   __classcell__r-   r-   )r;   r/   r#   #   s   
r#   c               @   s6   e Zd ZejedeedZej	edde
jdZdS )ApproveFormZleave_field_approvalState)r$   r'   r(   Zleave_field_approvalReasonF)r$   r%   r)   N)r<   r=   r>   r   rB   r?   r   r   audit_statusrD   r   ZMAX_AUDIT_REASONaudit_reasonr-   r-   r-   r/   rG   6   s   rG   c               @   sF   e Zd ZedZedZedZeZe	j
dd Zdd Zdd	 Zd
S )AddLeaveZleave_action_newZleave_action_newDescriptionZleave_action_newHelpTxtc             O   s  | j jj}| j jd}| j jd}tjjdt| j jj	dd d
 }t|d d }d }}	d
| krt|d	 }t|d
 }	d| krt|d }
nd}
| j jd}|sttdtjj|d ddd}dd |D }|d}|d}t|dd }tjj|d}|
dkr8ttdyt| j jd}W n   ttdY nX t|dkrttdtt| }|
dkr"yHt||||||	}t||||||
}x|D ]}| |||| qW W n6 tk
r } ztd t|W d d }~X Y nX n|yBd| krBt|d }nd}|d r\t|d nd}|d rvt|d nd}t||||||	}t||||||
}x|D ]}||	 |d	< |d
< |dkr| |||| n|d dkrttd |d! j t |d" |d# kr.ttd$|d! j|d% f dd&g}|||||d'}| !|||||||| qW W n6 tk
r } ztd t|W d d }~X Y nX d S )(Ndayszday-typeZglobal_att_rule_- )Z
param_namer   Zparam_valueprefixsuffixZleavemng_conditionerroremployeeZselect_employee)r+   r+   Zdepartment__idc             S   s   g | ]}|d  |d dqS )r   r&   )r+   department_idr-   )r.   xr-   r-   r/   r0   V   s    z#AddLeave.action.<locals>.<listcomp>r1   rE   rC   Zatt_leave_management_conditionZleave_applied_dataZatt_leave_apply_date_validationr&   TZ	fullmonthZleave_calculation_start_dayZleave_calculation_end_dayleave_scheduleZ&att_leave_schedule_settings_validationr@   
total_daysleave_balance!att_leave_balance_used_validation
start_time   )r1   rC   day_typerE   r*   )"requestusercurrent_companyPOSTgetr   r4   r5   strreplacer6   jsonloadskeysintZgetlistr   r?   r   Zvalues_listr   lenr   sorteditemscheck_continuous_days$check_all_applied_days_have_schedule
save_leave	Exceptionr
   Zset_rollback
first_namefloatupdate_leave_settings)r7   r8   r9   r*   rU   rZ   Z	leave_calZleave_cal_jsonrN   rO   leave_management_conditionempsZemployee_datarQ   r1   rE   rC   leave_apply_detailscontinuous_daysZemployee_leave_datadataefull_month_calleave_cal_start_dateleave_cal_end_datestatus
leave_datar-   r-   r/   actionB   s    
"








zAddLeave.actionc	             C   s   dddddddg}	t ||||d ||d	 |d
 |d ||d |d |d |d }
|
dkr|d  |	kr|dkr~t|| n
t|| tjj|d jdjt	d|d  d dS )z'
        Update Leave Settings
        r   r&   rY               r@   max_leave_per_monthrT   leave_monthly_scheduleeffective_dateincrement_datecontinous_daysleave_type_for_datesrX   )employee_idrV   rU   )rV   N)
check_leave_balanceZweekday%non_continuous_days_leave_combination!continuous_days_leave_combinationr   r4   r5   r+   updater   )r7   rv   rw   rx   rt   ry   r1   rs   rz   Zweekday_valuesZ	check_balr-   r-   r/   ro      s    
zAddLeave.update_leave_settingsc             C   sF   t |d |d |d |j||d |d | jjd|d	}|  d S )Nr@   rX   end_timerU   rT   zday-type)	rQ   rX   r   category_idrC   rK   rT   rZ   apply_reason)r   r+   r[   r^   r_   save)r7   rt   r1   rC   rE   objr-   r-   r/   rk      s    zAddLeave.save_leaveN)r<   r=   r>   r?   verbose_nameshort_descriptionhelp_txtr#   action_formr
   Zatomicr{   ro   rk   r-   r-   r-   r/   rJ   <   s   VrJ   c               @   s4   e Zd ZdZedZedZedZeZ	dd Z
dS )LeaveApproveTZatt_action_approvec             O   s  | j jd| j jddr0t| j | jddiS x| jD ]}|d |_t|d |_	| j j
j|_t |_| j j
|_|  t|d dkr| j j
j}t|j| tjj|jdd	d
d}|r8tjjtdd |jd }|dkr8tjj|jdj|d d d q8W d S )NpopuprM   
form_titleZleave_approverI   rH   r|   )r   rV   r   rK   )rH   r   )rV   )r[   r^   r_   GETr   action_templater4   rI   re   rH   r\   usernameapproverr   now
audit_time_approve_userr   r]   r"   r+   r   r5   r   r6   r   r   countr   )r7   r8   r9   r   r:   rV   leaver-   r-   r/   r{      s&    



zLeaveApprove.actionN)r<   r=   r>   batch_selectr?   r   r   r   rG   r   r{   r-   r-   r-   r/   r      s   r   c               @   s6   e Zd ZejededdZejedej	dZ
dS )ImportLeaveFormZdataImport_field_fileZdata_import_fileHelpTxt)r$   Z	help_textZdataImport_field_type)r$   r(   N)r<   r=   r>   r   Z	FileFieldr?   Zimport_filerB   r   ZIMPORT_TYPEZimport_typer-   r-   r-   r/   r      s   r   c               @   s4   e Zd ZdZedZedZedZeZ	dd Z
dS )LeaveImportFZatt_action_leave_importc             O   s@   | j jdkr<| j| j  x t| jdg D ]}t| q*W d S )Nr^   Z
cache_keys)r[   methodZadminZ
dataimportgetattrr   delete)r7   r8   r9   kr-   r-   r/   r{      s    zLeaveImport.actionN)r<   r=   r>   r   r?   r   r   r   r   r   r{   r-   r-   r-   r/   r      s   r   c               @   s   e Zd ZejedddZdS )
RevokeFormZrevoke_reasonT)r$   r%   N)r<   r=   r>   r   rD   r?   rI   r-   r-   r-   r/   r      s   r   c               @   s4   e Zd ZdZedZedZedZeZ	dd Z
dS )LeaveRevokeTZatt_action_revokec             O   s  | j jd| j jddr0t| j | jddiS x| jD ]}|jtkr|d |_	t
|_| j jj|_t |_| j j|_|  | j jj}t|j| tjj|jdddd	}|rtjjtd
d |jd }|dkrtjj|jdj|d d	 d q8ttdq8W d S )Nr   rM   r   Zleave_revokerI   )r   rV   r   rK   r   )rH   r   )rV   Z$only_approved_records_can_be_revoked) r[   r^   r_   r   r   r   r4   rH   r   rI   r   r\   r   r   r   r   r   r   r   r]   r"   r+   r   r5   r   r6   r   r   r   r   r   r?   )r7   r8   r9   r   r:   rV   r   r-   r-   r/   r{      s(    




zLeaveRevoke.actionN)r<   r=   r>   r   r?   r   r   r   r   r   r{   r-   r-   r-   r/   r      s   r   c             C   sb   | d dkr$t dd | d D }nt dd | d D }| d dkrV| d	 dkrVdS |r^dS d
S )z"
    Check the day continuity
    weekend_typesinglec             s   s   | ]}|d kV  qdS )rY   Nr-   )r.   ir-   r-   r/   	<genexpr>  s    z+checking_days_continuity.<locals>.<genexpr>
differencec             s   s   | ]}|d kV  qdS )r|   Nr-   )r.   r   r-   r-   r/   r     s    rU   r&   lengthr   )any)days_differencevalidating_discontinuityr-   r-   r/   checking_days_continuity  s    r   c                s0  dd |D }d}t t|  } g }g  g }	g i }
xf|  D ]X\}} t|d  fddt D dd }||
d< t||
d	< x|D ]}|d |
d
< qW tdd |D }|| |r~t|d}| t}fddtD dd }|	 }|t
dd }|t
dd }|t
dd }|t
dd }tt|t||||d  }tt|t||||d  }tt|t||||d  }tt|t||||d  }tjj|d}d|
d< t|dd| krxt|dd| krx|t|dd dkr|t|dd dkr|dkrptdd |D }|rj|sjdnd}n|rzdnd}n|t|dd dkrt|dd| krt|t|dd dkrd|
d< t|
}|jr|dks|jr|dkr|nd}nh|t|dd dkr|t|dd| kr||t|dd dkrbd|
d< t|
}|r|d}qt|dd| kr|t|dd dkrt|dd| kr|t|dd dkrd|
d< t|
}nd}nt|dd| krx|t|dd dkrrt|dd| krv|t|dd dkrhd|
d< t|
}nd}nd}nd}|	| d|	k}|rBd}qBW xtt|d D ]v}|| dkr||d  dkrd}nJ|| dkr||d  dkrd}n$|| dkr||d  dkrd}qW |S )z'
    check for the continuoud days
    c             S   s   g | ]}|d  qS )r+   r-   )r.   rS   r-   r-   r/   r0     s    z)check_continuous_days.<locals>.<listcomp>r   z%Y-%m-%dc                s"   g | ]\}}| |d    j qS )r&   )rK   )r.   r   rS   )data_not_weekend_datesr-   r/   r0   )  s    r&   Nr   r   rU   c             s   s   | ]}|d kV  qdS )rY   Nr-   )r.   r   r-   r-   r/   r   /  s    z(check_continuous_days.<locals>.<genexpr>c                s"   g | ]\}}| |d    j qS )r&   )rK   )r.   r   rS   )not_continuous_datesr-   r/   r0   5  s    )rK   rY   )
start_dater   r   rL   rM   Weekoffc             s   s   | ]}|d kV  qdS )rY   Nr-   )r.   r   r-   r-   r/   r   H  s    Zdoubler|   )r|   r&   rY   )r   rg   rh   appendr   strptime	enumeraterf   r   r   r   r   r`   r    r4   r5   ra   rd   r   rN   rO   range)rr   r1   rq   r*   rN   rO   Zemp_idsZcontinuous_statusZdata_day_typeZcontinuity_listr   abZdate_list_differenceZday_differenceZvalidate_discontinuityZentered_datedays_lengthZnon_continuous_days_differenceprev_daynext_dayprev_two_daysnext_two_dayscheck_weekendcheck_weekend2check_weekend3check_weekend4holidayZvalidate_non_continuous_daysr   r   r-   )r   r   r/   ri     s    





.


   
ri   c             C   s  g }x| D ]}t jj|d}i }	i }
d}g }xx| D ]j\}}tjj|jd }|rx|d d }|d d }nd}d}t||||}|r||j	r|j	|d 
 krttd	| tjj|d
t|d dt|d dB jddttdttdB }|rttd| |dkrtjj|j|d 
 |d 
 ddddd}|sttd|j|d 
 f nttd|j|f |dkri }	||	d< |d |	d< |d |	d< ||	d< ||	d< |dkr|d d nd|	d< |dkr|d d nd|	d< |dkr|nd|	d< |dkr8|d d nd|	d< |dkrV|d d nd|	d< |d |d i|	d< |dkr|ndg|	d< ||	 q<|d |
|d < ||dkr|nd |dkr||	d< |d |	d< ||	d< ||	d< |t|kr|d |	d< |dkr|d d nd|	d< |dkr:|d d nd|	d< ||	d< |dkr`|d d nd|	d< |dkr~|d d nd|	d< |
|	d< ||	d< ||	 |d7 }q<W qW |S ) z9
    checking leave applied date has schedule or not
    )r+   r&   )r   r   Zleave_detailsZmonthly_leave_detailsrM   rX   Z!leave_time_invalid_range_hiredate)rQ   r   )Zstart_time__gt)Zend_time__ltN)Zpk)rH   Zleave_time_overlap)r   Zeffective_date__lteZincrement_date__gterV   r   r   r   Z)att_leave_balance_for_employee_validationZatt_leave_schedule_validationr@   rT   r   g      ?rU   r   r   )r   r4   r_   rh   r   r5   r+   r6   r   Z	hire_dater   rl   r?   r   Zexcluder   r   r   r   rm   r   rf   )rq   rr   r*   rs   rU   rp   rt   emp_idr@   Znew_dataZ&leave_date_with_shift_schedule_timingsjr   r   r   Zleave_schedule_queryrT   r   Zsft_detailstmprV   r-   r-   r/   rj   {  s    





rj   c          
   C   s  d}d}d}d}t |}|dkr.t |}ni }x| D ]\}}| dkr|jt|j|jd d}t|jd t|j d td }t|jd t|j d t|j	 }n|jdkrn|j	|kr t|jd t|j d t| }t|jd t|jd  d t| }nJt|jd d td d t| }t|jd t|j d t| }nR|jdkr|j	|krt|jd td d t| }t|jd td d t| }nLt|jd t|jd  d t| }t|jd t|j d t| }n|j	|krtt|jd t|j d t| }t|jd t|jd  d t| }nLt|jd t|jd  d t| }t|jd t|j d t| }||j
 rt||j
 dk rttd|j|j
|f |r||kr||krd}tjj|dd	|||d
td}|d rL|d nd}||7 }||kst|| |kst|| || krttd|j|f ||j
 dkrRtjj|dd	||j||dtd}|d r|d nd}||7 }|||j
 ks8t|| ||j
 ks8t|| ||j
 | krRttd|j|j
|f tjj|dd	||j|	|
dtd}|d r|d nd}||7 }t|t||j
 krttd|j|j
|f |d7 }|d7 }|}|}q>W dS )z/
    check the leave balance for employees
    r   rM   r&   )dayrL      g      ?Z*att_leave_balance_category_wise_validationn)rQ   rC   revoke_typeaudit_status__instart_time__date__gteend_time__date__lterK   	days__sumg        rW   )rQ   rC   r   r   r   r   r   /att_leave_balance_used_category_wise_validationT)rb   rc   rh   ra   calendarZ
monthrangeZyearmonthr`   r   r,   rn   rl   r?   rm   r   r4   r5   	aggregater   r+   )rv   Zleavecal_start_dateZleaveCal_end_dater@   ry   Zmonthly_leave_limitrT   r   r1   r   r   continuous_datesr   r   lZlast_item_cal_month_startZlast_item_cal_month_endrS   yZlast_day_monthZcal_month_startZcal_month_endZleave_balance_check_querytotal_leave_takenZleave_type_balance_check_queryZleave_type_taken_leavesoverall_leave_appliedr-   r-   r/   r     s    
$$*&(
(
$*($
r   c          	   C   sH  t | d }||j }| d }| d }| d }d}| d }d}	x| D ]\}
}|
}	qJW tjj| d jd	d
}x,|D ]$}t	|d
 t	| }|t	|7 }qzW ||krt
td| d j|	f tjj| d ddddg|j| d | d dtd
}|d r|d nd}|t	|7 }||krDt
td| d j|j|	f dS )zj
    checking leave balance if leave balance is less than applied leaves then we will raise exception
    rT   r   rV   rU   g        r   rM   r@   )r   rK   rW   r   r   r&   rY   r   r   )rQ   rC   r   r   r   r   r   r   r   T)rb   rc   r,   rh   r   r4   r5   r+   r6   rn   rl   r?   rm   r   r   r   )rt   r1   rT   Zcategory_total_leavesZmonthly_limitrV   rU   r   r   r   rS   r   Zleave_settingsZleave_countrz   r   r-   r-   r/   check_leave_combination_balanceH  s:    


r   c             C   sD   t | d |||d j|d | d | d |d |d d	}|  d	S )
zC
    save the leaves with prefix and suffix leave combinations
    r@   r1   rC   rU   rT   rZ   rE   )	rQ   rX   r   r   rC   rK   rT   rZ   r   N)r   r+   r   )rt   rX   r   rz   r   r-   r-   r/   save_leaves_with_combinationk  s    r   c             C   sb   t | |d }|dkr^t| d | d | d |d j|d | d | d |d	 |d
 d	}|  dS )z:
    save the leaves without checking any combination
    r1   r&   r@   rX   r   rC   rU   rT   rZ   rE   )	rQ   rX   r   r   rC   rK   rT   rZ   r   N)r   r   r+   r   )rt   rz   check_balancer   r-   r-   r/   save_leaves_without_combination{  s    r   c             C   s   i }t jj|d ddddd}dd |D }||d	  t|d	 d d
}ttddd|d	 d }||| 	 | d 	 | d 	 d |S )z 
    get the timetable data
    r*   )r:   in_timefirst_half_out_timesecond_half_in_timedurationc             S   s   g | ]}|qS r-   r-   )r.   Ztimingsr-   r-   r/   r0     s    z&get_timetable_data.<locals>.<listcomp>r   )Zminutesr&   rX   r   )out_timeleave_start_timeleave_end_time)
r!   r4   r5   r6   r   r   r   Zcombiner   time)rt   rz   Ztimetable_valuesZ
time_tabletimetable_datar   Ztmp_datetimer-   r-   r/   get_timetable_data  s    r   c                s  | d t dd }| d t dd }tjj| d}tjj| d}|dkr|dkr~|rzt| d d	 | d< || d< nP|d
kr|rt| d d	 | d< || d< n$|dkr|rl|rl| d d dkr
| d d dkr
t| d d | d< || d< || d< n^| d d dkr:t| d d	 | d< || d< n.| d d dkrt| d d	 | d< || d< nb|rt| d d	 | d< || d< n<|r:t| d dkrt| d d	 | d< | d t dd | d< || d< nZt| |}	|	d |	d kr"|	d |	d kr"t| d d | d< n| d t dd | d< ndd | d D  t fddt d  d  j	D }
t
|
t  }dd |D }tjj|d}|rt| d t|  | d< || 7 }| |fS )z&
    check holiday present or not
    rX   r&   )rK   r   )r   rY   firstrU   g      ?secondthirdr   r   g       @g      ?r   r   r   r   c             S   s   g | ]}|  qS r-   )r   )r.   r   r-   r-   r/   r0     s    z!check_holiday.<locals>.<listcomp>r   c             3   s   | ]} d  t | V  qdS )r   N)r   )r.   rS   )r   r-   r/   r     s    z check_holiday.<locals>.<genexpr>c             S   s   g | ]}|qS r-   r-   )r.   missing_dater-   r-   r/   r0     s    )Zstart_date__in)r   r    r4   r5   r   rn   r   setr   rK   rg   r   )rt   weekend_countrz   r   combinationr   r   Zholiday1Zholiday2r   Zdate_setr   r   r-   )r   r/   check_holiday  s`    

$



&r   c             C   s0  d|  krdkr0n nt | d | | d< nd|  krDdkrdn nt | d | d | d< nd|  krxdkrn nt | d | d	 | d< nd
|  krdkrn nt | d | d | d< n\d|  krdkrn nt | d | d | d< n&d|  krdkr8n nt | d | d | d< nd|  krPdkrnn nt | d | d | d< nd|  krdkrn nt | d | d | d< nd|  krdkrn nt | d | d | d< nNd|  krdkrn nt | d | d | d< nt | d | d | d< | d S ) z2
    check single weekend leaves combinations
    rY   r~   rU   r      g      ?r      g       @      g      @      g      @   #   g      @$   )   g      @*   /   g      @0   5   g       @6   ;   g      "@g      $@)rn   )rt   r   r   r-   r-   r/    single_weekend_leave_combination  s,    r  c             C   s  d|  krdkr0n nt | d | | d< nhd|  krDdkrdn nt | d | d | d< n4d|  krxdkrn nt | d | d	 | d< n d
|  krdkrn nt | d | d | d< nd|  krdkrn nt | d | d | d< nd|  krdkr:n nt | d | d | d< n^d|  krRdkrrn nt | d | d | d< n&d|  krdkrn nt | d | d | d< nd|  krdkrn nt | d | d | d< nd|  krdkrn nt | d | d | d< nd|  kr,d krJn nt | d | d! | d< nNd"|  krbd#krn nt | d | d$ | d< nt | d | d% | d< | d S )&z1
    check double weekend leave combinations
    r&   r}   rU   r~   	   g       @
      g      @      g      @   r   g       @   r   g      $@r   "   g      (@r   '   g      ,@(   ,   g      0@-   1   g      2@2   r   g      4@7   r  g      6@g      8@)rn   )rt   r   r   r-   r-   r/    double_weekend_leave_combination  s4    r  c             C   sb  t | |}|d |d kr|d |d kr|dkr| d tdd }tjj| d	}|rft| | qt| d
 | | d
< t| |d }|dkrt	| || d | n
t| | n|d |d kr^|d |d kr^|dkrT| d tdd }	tjj|	 d}
|
rt| | n>t| d
 | | d
< t| |d }|dkr^t	| | d || n
t| | dS )z-
    checking half day leave combination
    r   r   r   r   rY   rX   r&   )rK   )Zend_time__daterU   r1   r   r   r   r|   )Zstart_time__dateN)
r   r   r   r4   r5   r   r   rn   r   r   )rt   half_day_typerz   r   r   r   prev_day_start_timeprev_day_existr   next_day_start_timenext_day_leave_existr-   r-   r/   checking_half_day_continuous  s2    


r  c             C   sn  | d r`|d j dkr`| d d }d}t| d }|dkrJ| d d }| d tdd	 }tjj|d
}|dkr|dkrt| |||dd\} }t| d | | d< t| |d }	|	dkr| d tdd	 }
t	| |
| d | qj|dkr|dkrt
| | qj|dkr&|dkr&t
| | qj|dkr|dkr| d t|d	 }tjj|d
}|rlt
| | nl|dkrt| |||dd\} }t| ||| d< nt| ||| d< t| |d }	|	dkr^t	| || d | n|dkrJ|rt
| |S t| |||dd\} }t| d | | d< t| |d }	|	dkr^t	| || d | nd}t| |||| n
t
| | dS )z9
    checking leave combination weekend previous day
    rO   r1   r&   r   r   rM   rY   r   )rK   )r   g      ?r   )r   rU   rX   g      ?g       @N)rO   rf   r   r   r4   r5   r   rn   r   r   r   r  r  r  )rt   rz   r   r   rK   days2r   Zprev_day_end_timer  r   r  prev_day_checkingprev_day_checking_existr  r-   r-   r/   prev_day_weekend7  sT    




r  c             C   s@  | d r<|d j dkr<| d d }d}t| d }|dkrJ| d d }|dkr|dkr|dkrt| |||d	d
\} }t| ||| d< nt| ||| d< t| |d }|dkrt| | d | d | q<|dkr|dkrt| d | | d< t| |d }|dkr8t| | q<|dkr||dkr|t| |||dd
\} }t| d | | d< t| |d }|dkr8t| | q<|dkr|dkrd}|dkr| d d }|dkrt| d | | d< t| |d }|dkrt| | n|dkrDt| |||dd
\} }t| d | | d< t| |d }|dkrt| | nLt| |||dd
\} }t| d | | d< t| |d }|dkr8t| | n|dkr$| d t	dd }	t
jj|	d}
|
rt| | nTt| |||d	d
\} }t| d | | d< t| |d }|dkr8t| | d || nd}t| |||| n | d r2|d jdkr2| d d }d}t| d }|dkr| d d }|dkr|dks|dkr|dks|dkr|dks|dkr&|dkr&t| d | | d< t| |||d	d
\} }t| |d }|dkr0t| | n
t| | n
t| | dS )z5
    checking leave combination weekend next day
    rN   r1   r&   r   r   rM   rY   g       @r   )r   rU   rX   r   g      ?r   g        r|   g      ?r   )rK   )rX   rO   N)rN   rf   r   r  r  r   r   rn   r   r   r   r4   r5   r  rO   )rt   rz   r   r   rK   r  r   r   Zdays3r  r  r  r-   r-   r/   next_day_weekendl  s    











<
r  c             C   s@  | d r2|d j dkr2| d tdd }| d }| d d }d}t| d }|d	krd| d d }|dkr|dkr|d
krf| d d dkr$| d t|d }	| d t|d }
tjt|	dt|
dB }|rt| | n>t| d | d | d< t	| |d }|dkrbt
| ||| n>t| d | | d< t	| |d }|dkrt
| || d | q0| d t|d }
tjj|
d}|rt| | n|dkrN| d d dkrt| | | d }t| |||dd\} }t| ||| d< | d }d	|  krdkr"n n||kr"|| d< t	| |d }|dkrt
| | d || n:t| ||| d< t	| |d }|dkr0t
| | d || n|dkr|dkr| d d dkrt| | nTt| |||dd\} }t| d | | d< t	| |d }|dkr0t
| | d || n|dkr<|dkr<t| | n
t| | dS )z;
    checking leave combination two days after weekend
    rN   r1   r&   rX   )rK   r   r   rM   rY   r   r   r   )r   )rX   rU   g      ?g       @g      ?r   )r   r}   N)rN   r   rf   r   r4   r5   r   r   rn   r   r   r   r  r  )rt   rz   next_end_time_dayr   r   rX   rK   r  r   r  Znext_day_checkingr  r   Znext_day_checking_existZstart_time_beforeZstart_time_afterr-   r-   r/   check_two_days_after_weekend  sv    










r  c             C   s  | d r|d j dkr| d d }d}t| d }|dkrF| d d }|dkr|dkr|dkrt| |||d	d
\} }t| ||| d< nt| ||| d< t| |d }|dkrt| | d | d | n4t| d | | d< t| |d }|dkrt| | n| d rx|d j	dkrxt| d dkrl| d d dkr|dkr|t| ||t| d d	d
\} }t| t| d || d< nt| t| d || d< t| |d }|dkrjt| | d | d | n| d d dkr`|dkrt| ||t| d d	d
\} }t| t| d || d< nt| t| d || d< t| |d }|dkrjt| | d | d | n
t| | n
t| | n
t| | dS )z:
    checking leave combination one day after weekend
    rN   r1   r&   r   r   rM   rY   g       @r   )r   rU   rX   r   rO   g      ?N)
rN   rf   r   r  r  r   r   rn   r   rO   )rt   rz   r   rK   r  r   r   r-   r-   r/   check_day_after_weekend  sZ    





r   c             C   s
  | d j }| d j | d jj dg}| d tdd }| d tdd }| d tdd }| d tdd }| d tdd }| d tdd }	| d tdd }
| d tdd }| d tdd }| d tdd }| d tdd }tt| t| ||d	 | }tt| t| ||d	 | }tt| t| ||d	 | }tt| t| ||d	 | }tt| t| ||d	 | }tt|	 t|	 ||d	 | }tt| t| ||d	 | }tt| t| ||d	 | }tt| t| ||d	 | }d
}t| dd| krt| dd| kr|t| dd dkr|t| dd dkrt| dd| kr|t| dd dkrjt| dd| krX|t| dd dkrHd}t| ||| nt| ||| nt| ||| qt| dd| krv|t| dd dkrt| dd| kr|t| dd dkrd}t	| || nt	| || nt	| || qt|	 dd| krj|t|	 dd dkrt
| d }|d
kr|t| dd dkrd}t| ||| nt| ||
| n
t| | nt| dd| kr^|t| dd dkrRt
| d }|d
krF|t| dd dkr6d}t| ||| nt| ||
| n
t| | n
t| | n
t| | n
t| | n
t| | n
t| | 
q|t| dd dkr:t| dd| kr|t| dd dkrZt| dd| krJ|t| dd dkr:d}t| ||| nt| ||| nt| ||| nnt| dd| kr|t| dd dkrd}t| ||| nt| ||| nt| ||| nnt| dd| kr*|t| dd dkrd}t| ||| nt| ||| nt| ||| n|t| dd dk
rt|	 dd| kr|t|	 dd dkrd}t| ||| nt| ||
| nt| ||
| nt| dd| kr|t| dd dkrvt| dd| krf|t| dd dkrVd}t| ||| nt| ||| nt| ||| n
t| | n.t| dd| k
r|t| dd dk	r2t|	 dd| k	r |t|	 dd dk	rd}t| ||| nt| ||
| nt| ||
| 
qt| dd| k
r|t| dd dk	rt| dd| k	r|t| dd dk	rd}t| ||| nt| ||| nt| ||| nt| dd| k
r|t| dd dk
rt| dd| k
rv|t| dd dk
rhd}t	| || nt	| || nt	| || n
t| | n
t| | n
t| | n
t| | dS )z8
    function for continuous days leave combination
    r@   )r+   rR   rX   r&   )rK   rY   r   r|   r*   g      ?rL   rM   r   g       @rU   N)r+   
departmentr   r   r`   r   ra   rd   r  r   rn   r  r   r  )rt   rz   r   r@   r   r   Zprev_end_time_dayZprev_end_time_two_daysr   r   next_day_end_timenext_two_days_end_timeZnext_end_time_two_daysr  Znext_three_daysr   r   r   r   Zcheck_weekend5Zcheck_weekend6Zcheck_weekend7Zcheck_weekend8Zcheck_weekend9r   r   r-   r-   r/   r   F  s   
 

r   c             C   s\  d}| d t dd }| d t dd }| d t dd }| d t dd }| d t dd }| d t dd }| d j| d jjdg}	tt| t| |	|d	 | d j }
tt| t| |	|d	 | d j }tt| t| |	|d	 | d j }tt| t| |	|d	 | d j }t| d
d|
 krt| d
d| kr|
t| d
d dkr|t| d
d dkrt| | qX|
t| d
d dkrNt| d
d| kr>|t| d
d dkr.d}t	| ||| nt	| ||| nt	| ||| n|t| d
d dkrXt| d
d| kr|t| d
d dkrd}t
| ||| nt
| ||| nt
| ||| nzt| d
d|
 kr|
t| d
d dkrt| d
d| krz|t| d
d dkrjd}t	| ||| nt	| ||| nt	| ||| n
t| | nt| d
d| krN|t| d
d dkrBt| d
d| kr2|t| d
d dkr"d}t
| ||| nt
| ||| nt
| ||| n
t| | n
t| | dS )z<
    function for not continuous days leave combination
    g      ?rX   r&   )rK   rY   r   r@   )r+   rR   r*   rL   rM   r   g       @N)r   r+   r!  r   r`   r   ra   rd   r   r  r  )rt   rz   r   r   r   r   r   r"  r#  Zemp_datar   r   r   r   r-   r-   r/   r     sl     r   )Trb   collectionsr   r   r   r   r   Zdjango.db.modelsr   Zdjango.formsr   Zdjango.shortcutsr   Zdjango.utils.translationr	   r?   Z	django.dbr
   Zdjango.core.cacher   r   r   Zmysite.att.utilsr   Zmysite.adminr   r   Zmysite.admin.exceptionsr   Zmysite.att.modelsr   Zmysite.att.models_choicesr   r   r   r   r   Zmysite.personnel.modelsr   Z
mysite.attr   Zmysite.att.models.model_attruler   Z%mysite.att.models.model_leavescheduler   Z%mysite.att.models.model_leavesettingsr   Z%mysite.att.models.model_leavecategoryr   r   r   Zmysite.att.models.model_holidayr    Z$mysite.att.models.model_timeintervalr!   Zmysite.att.models.model_leaver"   ZZKActionFormr#   rG   rJ   r   r   r   r   r   r   ri   rj   r   r   r   r   r   r   r  r  r  r  r  r  r   r   r   r-   r-   r-   r/   <module>   sh   }`Vw#9!#5WI: 7