B
    c_c                 @   sH  d dl Z d dl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 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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% G dd deZ&e	ej'e&ddd Z(e	ej)e&ddd Z*dd Z+dd Z,dd Z-dd  Z.d!d" Z/dS )#    N)models)QF)signals)receiver)timezone)	force_str)gettext_lazy)AdminRuntimeWarning)db_const)AUDIT_SUCCESSREFUSECANCEL_AUDIT_SUCCESSWITHDRAW_AUDIT_SUCCESS)Employee)AbstractException)LeaveSettings)LeaveCategory)AttRule)get_weekend_daysc                   sj  e Zd ZejeedejdZeje	edejdZ
ejeddddZejeddddZejedejddd	Zejed
ejddZejedejddd	ZejedddddZejedddddZejeddddddZejedejddddZejedddejdZej eddddZ!ejedddej"dZ#ejdddZ$ejdddZ%ejdddZ& fddZ'ede'_(e)e'Z*dd Z+ede+_(e,dd  Z- fd!d"Z. fd#d$Z/d%d& Z0d'd( Z1d)d* Z2d+d, Z3d-d. Z4d/d0 Z5d1d2 Z6d3d4 Z7ed5e7_(d6d7 Z8ed8e8_(d9d: Z9ed;e9_(d<d= Z:ed>e:_(d?d@ Z;edAe;_(G dBdC dCZ<  Z=S )DLeaveZleave_field_employee)verbose_nameZ	on_deleteZleaveCategoryZleave_field_startTimeT)nullblankZleave_field_endTimeZleave_field_applyReason)
max_lengthr   r   Zleave_field_applyTimeF)defaulteditableZleave_field_approvalRemarkZleave_field_approvalTime)r   r   r   Zleave_field_approvalLevelZleave_field_approverd   )r   r   r   r   Zleave_field_day_type)r   r   choicesZleave_field_daysZstaff_leave_leaveTypen   )r   r   c                s   t t| j}|s| jS |S d S )N)superr   last_approverapprover)selfZlastApprover)	__class__ 6G:\easytimepro\master/mysite/att\models\model_leave.pyget_last_approver3   s    zLeave.get_last_approverc             C   s.   | j }| jtks| jtkr*| jr&| jn|}|S )N)audit_reasonaudit_statusr   r   Zrevoke_reason)r$   r)   r&   r&   r'   get_audit_reason=   s    zLeave.get_audit_reasonc               C   sv   ddddddt tddd	d
t tddddt tddddt tddddt tdddddddggS )Nid   Zcheckbox)fieldwidthtypeemployee   Zleave_employee)r.   r/   titlecategory   Zovertime_type
start_timeend_timeauditStatusr*   rightz15%centerz#model_leave_toolbar)Zfixedr/   ZalignZtoolbar)r   _r&   r&   r&   r'   get_col_modelE   s    
zLeave.get_col_modelc                sf  ddl m} d}| jjr:| jj| j kr:td| j }nV| jrtj	j
| jd}| jtkrh|jttfksr|jtkr| jtkr|jtkrntd}tj	j| jdt| jdt| jd	B j| jdttd
ttd
B }|rtd| j }|rt||j	j| jdt| jdt| jdB ttd
ttd
B }|rJttd| jjj}t|}	tj	jd|	 dd}
t|
d d }t|d }ddddg}|dkrP| j|kr<| jdks| jdks| jdkr| jdkrtj	j| jjddd}| jdks| jdkrXtj	j| jjdj |d d | j! d d| _"t#t| j$|| nR| j"dkrpttdtj	j| jjdj |d d | j! d t#t| j$|| nt#t| j$|| nz| j"dkr(tj	j| jjddd}tj	j| jjdj |d d | j! d d| _"t#t| j$|| nt#t| j$|| nt#t| j$|| nt#t| j$|| d S )Nr   )	ManualLog Z!leave_time_invalid_range_hiredate)pkZleave_approve_audit)r1   )Zstart_time__gt)Zend_time__lt)r*   Zleave_time_overlap)Zpunch_time__gt)Zpunch_time__ltZ'emp_has_manual_punch_cannot_apply_leaveglobal_att_rule_)
param_nameparam_valueleavemng_condition            )employee_idleave_balancemax_leave_per_month)rI   yZatt_leave_reject_validationr   )%Z!mysite.att.models.model_manuallogr=   r1   Z	hire_dater6   dater;   r?   r   objectsgetr*   r   r   r   r   filterZexcluder   r7   r
   companyhex_idstrr   valuesjsonloadsintleave_payment_typer   r,   updatedaysrevoke_typer!   save)r$   argskwargsr=   messageobjtmpZvalidate_manua_logemployee_company_idcompany_hex_id	leave_calleave_cal_jsonleave_management_conditionr8   rI   )r%   r&   r'   r[   T   st    
$

$z
Leave.savec                sp  t | dr6| jj }x|D ]}|  qW | j  | jjj}t|}t	j
jd| d }t|d d }t|d }|dkr^| jdkr^tj
j| jd}|jdkrt| j| tj
j| jjd	d
dd}	|	r^tj
j| jjd	 }
|
dkrtj
j| jjd	j|	d d d n@|jdks6|jdkr^tj
j| jjd	j|	d d
 | j d tt|   d S )Nworkflowinstancer@   )rA   r   rB   rC   )r,   )r    rD   rE   rF   )rH   rI   rJ   rY   r    )rI   rD   )hasattrrf   Znodeinstance_setalldeleter1   rP   rQ   rR   r   rM   rO   rS   rT   rU   rV   rW   r   rN   r,   r*   check_leave_combinationr   countrX   rY   r!   )r$   Zinstance_nodesZnodera   rb   rc   rd   re   ZleaverI   leave_count)r%   r&   r'   ri      s2    





zLeave.deletec             C   s   | j S )N)r6   )r$   r&   r&   r'   get_start_date   s    zLeave.get_start_datec             C   s   | j S )N)r7   )r$   r&   r&   r'   get_end_date   s    zLeave.get_end_datec             C   s   | j S )N)rY   )r$   r&   r&   r'   get_days   s    zLeave.get_daysc             C   s   | j S )N)leave_schedule)r$   r&   r&   r'   get_leave_schedule   s    zLeave.get_leave_schedulec             C   s   | j S )N)r4   )r$   r&   r&   r'   get_category   s    zLeave.get_categoryc             C   s   | j jS )N)r4   Zcategory_name)r$   r&   r&   r'   get_sub_category   s    zLeave.get_sub_categoryc             C   s   | j S )N)rW   )r$   r&   r&   r'   get_leave_payment_type   s    zLeave.get_leave_payment_typec             C   s   | j }|jS )N)r1   Zemp_code)r$   empr&   r&   r'   get_emp_code   s    zLeave.get_emp_codeZemp_field_employeeCodec             C   s   | j }|jS )N)r1   Z
first_name)r$   ru   r&   r&   r'   get_emp_first_name   s    zLeave.get_emp_first_nameZemp_field_firstNamec             C   s   | j }|jS )N)r1   	last_name)r$   ru   r&   r&   r'   get_emp_last_name   s    zLeave.get_emp_last_nameZemp_field_lastNamec             C   s   | j }|jS )N)r1   Zposition)r$   ru   r&   r&   r'   get_emp_job   s    zLeave.get_emp_jobZemployee_field_positionc             C   s   | j }|jS )N)r1   Z
department)r$   ru   r&   r&   r'   get_emp_dept   s    zLeave.get_emp_deptZemployee_field_departmentc               @   s(   e Zd ZdgZejZedZeZ	dZ
dS )z
Leave.Metar,   Zatt_model_leave)ri   ZchangeviewN)__name__
__module____qualname__Zorderingr   Z	APP_LABELZ	app_labelr;   r   Zverbose_name_pluralZdefault_permissionsr&   r&   r&   r'   Meta   s
   r   )>r}   r~   r   r   Z
ForeignKeyr   r;   ZCASCADEr1   r   r4   ZDateTimeFieldr6   r7   Z	TextFieldr   ZMAX_APPLY_REASONZapply_reasonr   ZnowZ
apply_timeZMAX_AUDIT_REASONr)   Z
audit_timeZSmallIntegerFieldZapproval_levelZ	CharFieldZaudit_user_idZMAX_APPROVER_NAMEr#   ZLEAVE_DAY_TYPEZday_typeZ
FloatFieldrY   ZLEAVE_PAYMENT_TYPErW   rp   rZ   Zleave_applied_datar(   Zshort_descriptionpropertyr"   r+   staticmethodr<   r[   ri   rm   rn   ro   rq   rr   rs   rt   rv   rw   ry   rz   r{   r   __classcell__r&   r&   )r%   r'   r      s`   



F




r   )senderc             K   s    ddl m} |j||f| d S )Nr   )build_workflow_for_leave)mysite.att.tasksr   delay)signalr   Zcreatedr]   r   r&   r&   r'   save_signal_receiver   s    r   c             K   sh   ddl m} |jj|jd}|r(|  |jtkrdddlm	} |j
}|j}|j|jg||d |jd d S )Nr   )AppNotification)source)!auto_calculation_approved_records)Zrequest
company_id)Z'mysite.mobile.models.model_notificationr   rM   rO   r,   ri   r*   r   r   r   r6   r7   r   rH   r   )r   instancer]   r   Zdelete_notificationsr   Zd1Zd2r&   r&   r'   delete_employee   s    
r   c             C   s   |dkr,|  d}dd |D }|d d S |dkrf|  dd}dd |D }|d d |d d	 fS |d
kr|  dd}dd |D }|d d |d d	 fS d S )Nboth_weekendsrY   c             S   s   g | ]}|qS r&   r&   ).0leaves_datar&   r&   r'   
<listcomp>	  s    z$check_leave_days.<locals>.<listcomp>r   	start_dayr7   c             S   s   g | ]}|qS r&   r&   )r   r   r&   r&   r'   r     s    r    end_dayr6   c             S   s   g | ]}|qS r&   r&   )r   r   r&   r&   r'   r     s    )values_list)Zleave_queryZweekendZ	day_countr   r&   r&   r'   check_leave_days  s    
r   c             C   s  t jjtddtddB t| dt| dB | d}t jjtddtddB | | d}t jjtddtddB t| dt| dB | d}	t|d }
}|	r&|
rt jj| | dj|
| |d	 t jj| | dj|
| |d
 |dkrtjj| djtd|d  d n|r|dkrt jj| | dj|| |d	 |dkrtjj| djtd| d nd|rt|d}|dkrt jj| | dj|| |d
 |dkrtjj| djtd| d d S )Nr    )r*   rD   )start_time__date)end_time__date)rH   )rH   r   r   )rY   r7   )rY   r6   rE   rI   )rI   g      ?)	r   rM   rO   r   rL   r   rX   r   r   )emp_idprev_daynext_two_daysnext_dayrl   prev_day_end_timeweekend_countZprev_day_leave_existZnext_day_leave_existZboth_leave_existZtwo_day_daysprev_day_daysnext_day_daysr&   r&   r'   check_both_days_weekend  sJ    





r   c             C   s  t jjtddtddB t| dt| dB | d}|rt|d\}}|dkrh|tjdd	 }	n|tjdd	 }	|dkrt jjt| dt| dB | dj|| |d
 |dkrt	jj| djt
d| d n|dkr|dkrTt jj| |d}
|
rt jj| | dj|| |	d
 |dkrt	jj| djt
d| d n`t jj| |d}
|
st jj| | dj|| |	d
 |dkrt	jj| djt
d| d d S )Nr    )r*   rD   )r   )r   )rH   r   g      ?)rY   )rY   r7   rI   )rI   g      ?g       @)rH   r7   )rH   r   )rH   r6   )r   rM   rO   r   rL   r   datetime	timedeltarX   r   r   )r   r   r   rl   rY   r   Zprev_two_days_leave_existr   Zprevious_day_end_timeZprev_day_end_timesZprev_two_second_halfr&   r&   r'   check_start_day_weekend=  sP    



r   c             C   s  t jjtddtddB | | d}|rt|d\}}	|dkrT|	tjdd }
n|	tjdd }
|dkrt jj| | dj|| |d |dkrt	jj| d	jt
d
| d n|dkr|dkr,t jj| |	d}|rt jj| | dj|| |
d |dkrt	jj| d	jt
d
| d np|tjdd }t jj| |d}|st jj| | dj|| |
d |dkrt	jj| d	jt
d
| d d S )Nr    )r*   rD   )rH   r   r   g      ?)rY   )rY   r6   )rH   rI   )rI   g      ?g       @)rH   r6   )rH   r7   )r   rM   rO   r   rL   r   r   r   rX   r   r   )r   r   r   rl   rY   r7   r   Znext_two_days_leave_existr   Znext_day_start_timer6   Znext_two_first_halfZnext_two_days_end_timer&   r&   r'   check_end_day_weekendj  s@    



r   c                s  t jj| ddddd}dd |D   fddtd	d
D \}}}}d\}}t jj|d }	|rtjj|ddd}
dd |
D }|tjdd }|tj|d }|tjdd }|tjdd }|tj|d }|tjdd }|tjdd }|tjdd }|tjdd }t	t
| t
| ||| }t	t
| t
| ||| }t	t
| t
| ||| }t	t
| t
| ||| }t
| dd| krt
| dd| kr|t
| dd dkr|t
| dd dkrt
| dd| krt
| dd| kr|t
| dd dkr|t
| dd dkrd}t|||||	|| nt|||||	|| n|t
| dd dkrJt
| dd| kr|t
| dd dkr6d}t||||	|| nt||||	|| n|t
| dd dkrt
| dd| kr|t
| dd dkrd}t||||	||| nt||||	||| d S )N)r,   r6   r7   rH   rY   c             S   s   g | ]}|qS r&   r&   )r   
leave_datar&   r&   r'   r     s    z+check_leave_combination.<locals>.<listcomp>c                s   g | ]} d  | qS )r   r&   )r   i)r   r&   r'   r     s    r      )r>   g      ?)rH   r,   Zdepartment__idc             S   s   g | ]}|d  |d dqS )r   r    )r,   Zdepartment_idr&   )r   xr&   r&   r'   r     s    r    )rY   rD   -r>   ZWeekoffg       @)r   rM   rO   r   rangerk   r   r   r   r   rR   rL   replacekeysr   r   r   )Zleave_idr   Zleave_settingsr6   r7   r   rY   r1   r   rl   Zemp_datar   r   r   Znext_two_days_start_timeZprev_two_daysr   Zprev_two_days_end_timeZstart_time_next_dayZend_time_prev_dayZcheck_weekendZcheck_weekend2Zcheck_weekend3Zcheck_weekend4r&   )r   r'   rj     sl     





rj   )0rT   r   Z	django.dbr   Zdjango.db.modelsr   r   r   Zdjango.dispatch.dispatcherr   Zdjango.utilsr   Zdjango.utils.encodingr   Zdjango.utils.translationr	   r;   Zmysite.admin.exceptionsr
   Z
mysite.attr   Zmysite.att.models_choicesr   r   r   r   Z&mysite.personnel.models.model_employeer   Z&mysite.workflow.models.exception_modelr   Z%mysite.att.models.model_leavesettingsr   Z%mysite.att.models.model_leavecategoryr   Zmysite.att.models.model_attruler   Zmysite.att.utilsr   r   Z	post_saver   Zpost_deleter   r   r   r   r   rj   r&   r&   r&   r'   <module>   s4    Y(-%