B
    "fch                 @   s   d dl Z d dlZd dlZd dl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mZ d dlmZmZmZmZmZmZ G dd	 d	eZd
d Zdd Zejdd ZdS )    N)transaction)gettext_lazy)Q)ladonize)MESSAGE_CODESUCCESS_CODESYSTEM_EXCEPTIONDATA_EXCEPTIONpaging)request_validdatetime2stampstamp2datetimeinterface_responseonline_employee_new
user_photoc               @   s   e Zd ZdZeeeeeeeddd Zeeeeeeeeeeeeeddd Z	eeeeeeeeddd Z
eeeeeeeeeedd	d
 Zeeeeeeeeeeddd Zeeeeeeeeeddd ZdS )BioTimeAppLeaveu   
    【Leave】
    )Zrtypec       !   
   C   sV  ddl m} ddlm} ddlm}m}m}	m}
m	} t
 }yt|}|jjj}|t|}|rrdd |D }n|j dd}d	d |D |d
< t|}|jj|tj  tj  dj}|	jj|tj  tj  ddj}|
jj|jjtj  tj  dj}| r|	jj|tj  tj  dd}tjtddd |d jj}|d jj}|tj|d }|d jj}|d jj}d |!d|d ||!dd |!d|!dd |!d|!dd|d< t"t#t$%|ddS | r|jj|tj  tj  d}|j&}|jj|ddd j}tjtddd |j}|j}|tj|d }|j}|j}d |!d|d ||!dd |!d|!dd |!d|!dd|d< t"t#t$%|ddS | r|
jj|jjtj  tj  d}|j&}|jj|ddd j}tjtddd |j}|j}|tj|d }|j}|j}d |!d|d ||!dd |!d|!dd |!d|!dd|d< t"t#t$%|ddS t"t'dddt(dS W n@ t)k
rP } z ddl*} | +  t"t'dd|t,S d}~X Y nX dS )u>  
        Get leave category
        @param source:          data source(1: IOS， 2：Android)
        @param device_token:    Token for push message
        @param language:
        @param token:
        @rtype:
            success
                {
                    "code": 1,
                    "error": "",
                    "describe": "",
                    "message": "",
                    "data": {"leave category": [], "leave type": []}
            fail
                {"code":-10001,"error":"","describe":"","message":"Pop-up message","data":""}
        r   )C_LEAVE_CLASS)LeaveCategory)AttScheduleShiftDetailTempScheduleDepartmentScheduleTimeIntervalc             S   s   g | ]}|j |jd qS ))idcategory_name)r   r   ).0obj r   9G:\easytimepro\master/mysite/mobile\services\app_leave.py
<listcomp>3   s    z,BioTimeAppLeave.category.<locals>.<listcomp>r   r   c             S   s   g | ]}|d  |d dqS )r   r   )codenamer   )r   r   r   r   r   r   6   s    Zleave_category)employeestart_date__lteend_date__gteF)r"   Zstart_time__dateZend_time__dateZtime_interval__isnull)department_idr#   r$   i     )Zminutesz{}-{}z%H:%M:%S)Zfirst_half_day_intervalZsecond_half_day_intervalZsingle_day_intervalZmultiple_day_interval
leave_type 
successful)shiftZtime_interval_id__isnullz>you are not assigned with a schedule at this moment contact HRN)-Zmysite.att.global_cacher   %mysite.att.models.model_leavecategoryr   mysite.att.modelsr   r   r   r   r   dictr   
departmentcompanyr   getstrobjectsallvaluesfilterdatetimenowdateexistsZcombineZtime_intervalin_timeduration	timedeltafirst_half_out_timesecond_half_in_timeformatstrftimer   r   jsondumpsr*   r   _	Exception	traceback	print_excr   )!selfsourcedevice_tokenlanguagetokenr   r   r   r   r   r   r   choicesemp
company_idZleavesZemp_schedule_is_existsZtemp_schedule_is_exitsZdepartment_schedule_is_existsZtemp_scheduler:   r;   Zout_timer=   r>   Zemp_scheduleZ	emp_shiftZemp_time_intervalZdepartment_scheduleZ
dept_shiftZdept_time_intervalerE   r   r   r   category   s    

zBioTimeAppLeave.categoryc             C   s  ddl }ddl}ddlm} ddlm} t|}t|}||krpd}dtd}dtd}t	t
d|||S t|}|j|jg}|jj|jd	t|d
t|dB j|d}|rt| d pt| d }d}dtd| }dtd| }t	t
d|||S yXddtdi}|j}t|}|jjj}t|||||||t| t	tt|ddS  tk
r } z&ddl}|  t	t
dd|d|S d}~X Y nX dS )u  
        Applay leave
        @param leave_type:      leave type  （BioTimeAppLeave --> category ）
        @param start:           start time
        @param end:             end time
        @param leave_payment_type:
        @param day_type
        @param remark:
        @param source:          data source(1: IOS， 2：Android)
        @param device_token:    Token for push message
        @param language:
        @param token:
        @rtype:
            success
                {"code": 1, "error": "", "describe": "", "message": "", "data":{"message":"Pop-up message"}}
            fail
                {"code":-10001,"error":"","describe":"","message":"Pop-up message","data":""}
        r   N)Leave)models_choicesz
Wrong Dataz{0}Zleave_time_invalid_ranger(   )employee_id)Zstart_time__gt)Zend_time__lt)Zaudit_status__inr&   Zleave_time_overlapmessagezRequest already processingr)   )codecsr6   Zmysite.att.models.model_leaverQ   
mysite.attrR   r   r?   rC   r   r   r   REFUSECANCEL_AUDIT_SUCCESSr2   r5   r   excluder   r1   splitr.   r/   
leave_saver   rA   rB   rD   rE   rF   )rG   r'   startendleave_payment_typeday_typeremarkrH   rI   rJ   rK   rU   r6   rQ   rR   errordescriberT   applierZselect_statusZ	tmp_leavedatarS   rM   rN   rO   rE   r   r   r   apply   s@     
zBioTimeAppLeave.applyc          
      sP  ddl m}m} ddlm} ddlm}	 |dkr2t|}
|sDd}nd| }dd	t|
j	 d	 |d
 }d}|dkrxd}|p~d}yn|dddd|id}t
|||}||}|	g d}|rt|j  fdd|D }||d< ttt|ddS  tk
r. } z ddl}|  ttddt|S d}~X Y nX nd|}ttdd|tS dS )u  
        Get own apply record(pending, approve, reject)
        @param approve_status:  0:approved&rejected, 1:pending, 2:approved，3：rejected
        @param page_num:        page number（15items/page）
        @param language:
        @param token:
        @rtype:
           success
                {"code":1,"error":"","describe":"","message":"","data":{"category":1,"items":[{"code":object ID,
                "pin":"emp_code","name":"first_name","photo":"photo address","start":"start time","end":"end time",
                "remark":"apply reason","category":"apply category","apply_time":"apply time","approve_status":
                "approve value(int)","approve_describe":"approve status descripe","approved_remark":"approve reason",
                "approved_time":"audit time"}, ]}}
            fail
                {"code":-10001,"error":"","describe":"","message":"Pop-up message","data":""}
        r   )get_sqlp_query)rR   )CATEGORY_LEAVE)r   r&         z audit_status in (2, 3) z audit_status in (%s) z* u.id = %(applier)s and %(audit_status)s  ")rc   audit_status
apply_time)r&   r&   sqlZleave_applicationmobilewhere)ZsqlidZappZparams)rP   itemsc                s   g | ]}|d  |d |d t |d t|d t|d d|d |d t|d |d	 d |d	 |d	 d|d
 t|d dqS )r   r&   ri   rj      z{0}            
   )r    pinr!   photor\   r]   r`   rP   rm   approve_statusapprove_describeapproved_remarkapproved_time)r   r   r?   r0   )r   r)statusr   r   r      s   z2BioTimeAppLeave.my_application.<locals>.<listcomp>rq   r(   r)   Nz"parameter approve_status={0} error)Zmysite.sql_utilsrf   rg   rV   rR   Zmysite.mobile.choicesrh   r   r1   r   r
   r-   ALL_AUDIT_STATUSr   r   rA   rB   rD   rE   rF   r   r   r?   r	   )rG   rz   page_numrI   rJ   rK   rf   rg   rR   rh   rM   _approve_statusrp   Z	sort_namern   Zrowsrd   rq   rO   rE   rb   r   )r   r   my_application   s@    



 
zBioTimeAppLeave.my_applicationc             C   s   ddl m} ddlm}	 ddlm}
 ddlm} ddlm	} |dkrt
|j}|s^dd	g}n ||jfkrx|j|jg}n|g}t|}|j }g }y.|rt|
jd
d}|dgkr|	jj|j||d |jd}n|	jj|j||d dd}|	jj|jdd ||dd d}|	jj|jd|j||dd d}|	j||jdddd||jddddB ||jddddB ddddd j|jd}|rtx|D ]}|d }|jj|dddddddd d!}|r|d }|d |d" |d# t|d" d$t|d% d$t|d d$|d	 d$|d t|d& |d d$||d |d d$|d	 t|d' d(}|| qW g }|d%krt|d)d* dd+}n|dkrt|d,d* dd+}tt t!"|d-d.S  t#k
r } z dd l$}|%  tt&d-d-|t'S d }~X Y nX nd/}tt&d-d-|t(S d S )0Nr   )rR   )NodeInstance)ContentType)rQ   )r   )r   r&   ri   rj   rr   rs   rt   ri   rj   ZattZleave)0workflow_instance__workflow_engine__content_typenode_engine__approver__in	state__inapprover_admin_idZapprover_employee_idT)r   r   r   r   is_next_node)r   Z node_engine__approver_by_overallZdepartmentsr   r   r   r   Fr   )Zflat)Zid__inZworkflow_instance__exception_idZworkflow_instance__employeestater`   rm   )Zworkflow_instance__employee_id)r   Zcategory__category_name
start_timeend_timeapply_reasonZemployee__emp_codeZemployee__first_name
audit_timers   rt   z{0}r&   rr   ru   )r    rx   r!   ry   r\   r]   r`   rP   rm   rz   r{   r|   r}   c             S   s   | d S )Nr}   r   )kr   r   r   <lambda>o      z/BioTimeAppLeave.approval_list.<locals>.<lambda>)keyreversec             S   s   | d S )Nrm   r   )r   r   r   r   r   q  r   r(   r)   zApprove status not in (0,1,2,3)))rV   rR   mysite.workflow.modelsr   Z"django.contrib.contenttypes.modelsr   r,   rQ   django.db.modelsr   r-   r   ZAPPLICATIONZAUDITINGr   Z	flow_roler3   r2   Zget_by_natural_keyr5   r   r.   Zvalues_listZdistinctrY   r   r?   r   r0   appendsortedr   r   rA   rB   rD   rE   rF   r   r   r	   )rG   rz   r   order_byrH   rI   rJ   rK   rR   r   r   rQ   r   r   r   rM   Z	emp_rolesrd   Zct_otZNodeInstance_objZNodeInstance_obj_without_departZNodeInstance_obj_with_departZapprove_nodesr~   Zexception_idZ	apply_objZres_dataZdata_filtered_listrO   rE   rb   r   r   r   approval_list  s    




&






 zBioTimeAppLeave.approval_listc           
   C   s  ddl m} ddlm}	 ddlm}
 ddlm} dd l}|r||	j	|	j
fkrbd}ttdd|tS t|}|jj|d}|rn|d }y|j }||	j	kr^||_t| d	 |_||_|  |j|| |
jj|d
 d}|rxHt|D ]<\}}|}d}|j}|j}|r P |rd|_|  d}P qW |r||d	  }d|_|  n||	j
kr||_t| d	 |_|  |j||j d}|jj|j d! }|j" d}xB|D ]:}|j#dkr|j#}|dkr|
jj|j$dj%|d qW dd&t'di}tt(t)*|ddS  t+k
rj } z dd l,}|-  ttddt.|S d }~X Y nX nd}ttdd|tS nt'd}ttdd|tS d S )Nr   )rQ   )rR   )r   )WorkflowInstancez!param approve_status out of ranger(   )abstractexception_ptr_idr&   )Zworkflow_instance__exceptionorderFT)Z	exceptionrj   )r   )r   rT   z{0}OKr)   zObject Not FoundzObject ID Not Found)/r,   rQ   rV   rR   r   r   Z(mysite.workflow.models.workflow_instancer   r6   AUDIT_SUCCESSrW   r   r   r	   r   r2   r5   r7   audit_reasonr1   rZ   approverr   saveZworkflowinstanceZapprove_current_node_byr3   r   	enumerater   is_last_nodeZreject_current_node_byr   firstZnodeinstance_setr   r   updater?   rC   r   rA   rB   rD   rE   rF   r   ) rG   r    rz   r`   rH   rI   rJ   rK   rQ   rR   r   r   r6   rb   r   Zobjsr   r   ZnodesiZnodeindexZset_next_nodeZcurrent_noder   Z	next_nodeZstate_Zworkflow_instanceZnode_setrd   rO   rE   r   r   r   approve{  s~    



 zBioTimeAppLeave.approvec             C   s   ddl }ddlm} ddlm}	m}
 |jj|d }|r|j	|	krt
|}d|j||_|
|_	|j|_|j  |_||_|  ddtd	i}td
}ttt|dd|S td}ntd}|rttddt|S dS )u*  
        revoke approve
        @param code:            Obj ID
        @param remark:          audit_reason
        @param source:          data source (1: IOS， 2：Android)
        @param device_token:    Push message Token
        @param language:
        @param token:
        @rtype:
        r   N)rQ   )r   rX   )r   zRevoke by {0} and Remark is {1}rT   z{0}r   Zrevoked_successfulr(   Z$only_approved_records_can_be_revokedZ!workflow_instance_does_not_exists)r6   r,   rQ   Zmysite.att.models_choicesr   rX   r2   r5   r   rl   r   r?   r!   r   r   r7   r   Z_approve_userr   rC   r   r   rA   rB   r   r	   )rG   r    r`   rH   rI   rJ   rK   r6   rQ   r   rX   r   userrd   rT   rb   r   r   r   revoke  s(    

zBioTimeAppLeave.revokeN)__name__
__module____qualname____doc__r   r   intr1   rP   re   r   r   r   r   r   r   r   r   r      s    (:<"k"Gr   c	             C   s   ddl m}	 ddlm}
 ddlm} |
| |||d ||d |d |d ||d	 |d
 |d |d }|dkrt|||||}|jj|d j	dj
|	d|d  d |S d S )Nr   )F)check_leave_balance)LeaveSettingsrM   Zmax_leave_per_monthleave_scheduleZleave_monthly_scheduleZeffective_dateZincrement_dateZcontinous_daysZleave_type_for_datesr&   )rS   leave_balance
total_days)r   )r   r    mysite.att.actions.leave_actionsr   Z%mysite.att.models.model_leavesettingsr   
save_leaver2   r5   r   r   )full_month_calZleave_cal_start_dateZleave_cal_end_daterd   r   rP   r^   r_   r`   r   r   r   Z	check_balr   r   r   r   update_leave_settings  s    
r   c             C   sL   ddl m} || d | d | d |j|| d | d |d |d	}|  |S )	Nr   )rQ   rM   r   r   r   r   )	r"   r   r   Zcategory_idr^   daysr   r_   r   )r,   rQ   r   r   )rd   rP   r^   r_   r`   rQ   r   r   r   r   r     s    r   c       #      C   sF  ddl m} ddlm}	 ddlm}
 ddlm}m} |	j	j
d|dd d	 }t|d d
 }d }}d| krt|d }t|d }|j	j| d}|j|jjdg}d| krt|d }nd}t|tkr|g}n|}|}|
j	j|d}i }d}t|dkrN|d dkrN|d |t| < ||d dkrDdnd7 }n|| }|jdkr|d dkrtdn|d |t| < |d7 }n|d dkrdn|d |t| < |d7 }|jd }xtd|jd D ]t}||d kr*|d dkr dn|d |t| tj|d < |d7 }n$d|t| tj|d < |d7 }qW |dkryJ|||||||}|| g|||||}x|D ]}t|||||}qW W n6 tk
r } ztd t|W d d }~X Y nX n\y"d| krt|d }nd}|d rt|d nd} |d r8t|d nd}!|||||||}|| g|||||}x|D ]}|dkrt|||||}nx|d dkrtt d|d j! t"|d |d krtt d|d j!|d  f dd!g}"t#|| |!||"||||	}qhW W n6 tk
r> } ztd t|W d d }~X Y nX |jS )"Nr   )Employee)AttRule)r   )check_continuous_days$check_all_applied_days_have_scheduleZglobal_att_rule_-r(   )Z
param_nameZparam_valueprefixsuffix)r   )r   r%   Zleavemng_conditionra   r&   rr   g      ?)r   TZ	fullmonthZleave_calculation_start_dayZleave_calculation_end_dayr   Z&att_leave_schedule_settings_validationrM   r   r   Z!att_leave_balance_used_validationr   ri   )$Zmysite.personnel.modelsr   Zmysite.att.models.model_attruler   r+   r   r   r   r   r2   r5   replacer4   rA   loadskeysr   r0   r   r.   typelenr1   r8   r   ranger6   r<   r   rD   r   Zset_rollbackrC   Z
first_namefloatr   )#rS   r\   r]   r_   r'   r^   r`   rN   r   r   r   r   r   Z	leave_calZleave_cal_jsonr   r   Zemp_datar"   Zleave_management_conditionrP   Zleave_apply_detailsr   Z	diff_daysZlast_iterationr   Zcontinuous_daysZemployee_leave_datard   r   rO   r   ZleaveCal_start_dateZleaveCal_end_dater   r   r   r   r[   
  s    &
&
 








r[   )rA   timer6   ZcalendarZ	django.dbr   Zdjango.utils.translationr   rC   r   r   Zmysite.ladon.ladonizerr   Zmysite.mobile.utilsr   r   r   r	   r
   r   r   r   r   r   r   objectr   r   r   Zatomicr[   r   r   r   r   <module>   s        \