B
    bV                 @   sh   d dl Z d dlmZ d dlmZ d dlmZmZm	Z	m
Z
mZmZmZmZmZmZmZ G dd deZdS )    N)gettext_lazy)ladonize)SUCCESS_CODEMESSAGE_CODEinterface_responserequest_validonline_employee_newstamp2datetimedatetime2stampSYSTEM_EXCEPTIONDATA_EXCEPTION
user_photopagingc               @   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d	dd Z	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eddd Zeeeeeeeeeddd ZdS )BioTimeAppOverTimeu   
    【Overtime】
    )Zrtypec             C   sN   dd tdddd tdddd tddg}ttt|d	d
S )uE  
         get overtime category
        @param source:          data source(1: IOS， 2：Android)
        @param device_token:    Token for push message
        @param language:
        @param token:
        @rtype:
            {"code": 1, "error": "", "describe": "", "message": "", "data":[{"code": , "name": ""}}
           z{0}Zovertime_option_normalOvertime)codename   Zovertime_option_weekendOvertime   Zovertime_option_holidayOvertime 
successful)format_r   r   jsondumps)selfsourcedevice_tokenlanguagetokenchoices r!   <G:\easytimepro\master/mysite/mobile\services\app_overtime.pycategory   s    zBioTimeAppOverTime.categoryc	          
   C   s  ddl m}	 ddlm}
 ddlm} ddlm} t|}t|}||krtd	t
d}d	t
d}ttdd||S t|}t| d }|j}|jj||d	d j}|
j|
jg}|	jj|||d
j|d}|rd	t
d| }d	t
d| }ttdd||S yR|	 }||_||_||_||_||_|  dd	t
di}ttt|ddS  t k
r } z ddl!}|"  ttdd|t#S d}~X Y nX dS )u  
        apply overtime
        @param overtime_type: ·（required）（data source BioTimeAppOverTime --> category）
        @param start:         ·（required）end time
        @param end:           ·（required) start time
        @param remark:        ·（required）apply reason
        @param source:          data source(1: IOS， 2：Android)
        @param device_token:    Token for push message
        @param language:
        @param token:
        @rtype:
        r   )Overtime)models_choices)Q)Employeez{0}z%end time can not less then start timer   )emp_code
company_id)employee_idZstart_time__lteZend_time__gte)Zaudit_status__inZovertime_time_overlapmessagezRequest already processingr   N)$ mysite.att.models.model_overtimer$   
mysite.attr%   django.db.modelsr&   Zmysite.personnel.modelsr'   r	   r   r   r   r   r   strsplitr)   objectsfilteridCANCEL_AUDIT_SUCCESSREFUSEexcluder*   
start_timeend_timeovertime_typeapply_reasonsaver   r   r   	Exception	traceback	print_excr   )r   r9   startendremarkr   r   r   r   r$   r%   r&   r'   describer+   applierr(   r)   r*   Zselect_statusZobj_tmpobjdataer=   r!   r!   r"   apply"   sF    zBioTimeAppOverTime.applyc          
      s  ddl m}m} ddlm}	 ddlm}
 |dkrt|}|sTd|	j|	j	|	j
f }nD||	jfkrrd|	j|	jf }n&||	j	fkrd|	j	|	j
f }nd| }d	|j|d
 }d}|dkrd}|pd}y||dddd|id}t|||}||}|
g d}|r*t|	j t|	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(１５items/page)
        @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":{"category":1,"
                items":{"code": ID,"pin":"emp_code","name":"first_name","photo":"photo address","start":
                "start time(stamp)","end":"end time(stamp)","remark":"apply reason","category":"","apply_time":"",
                "approve_status":"int value","approve_describe":"status describe","approved_remark":"approve reason",
                 "approved_time":"approve time"},]}}
            fail
                {"code":-10001,"error":"","describe":"","message":"Pop-up message","data":""}
        r   )get_sqlp_query)r%   )CATEGORY_OVERTIME)r   r   r   r   z audit_status in (%s, %s, %s) z audit_status in (%s, %s) z audit_status in (%s) z0 u.emp_code = %(applier)s and %(audit_status)s  )rC   audit_status
apply_time)r   r   sqlZovertime_applicationmobilewhere)ZsqlidZappZparams)r#   itemsc                s   g | ]}|d  |d |d t |d t|d t|d d|d d|d |d t|d |d	 d |d	 |d	 d|d
 t|d dqS )r   r   r   r      z{0}            
   )r   pinr   photor?   r@   rA   r#   rL   approve_statusapprove_describeapproved_remarkapproved_time)r   r
   r   get).0r)statustypesr!   r"   
<listcomp>   s   z5BioTimeAppOverTime.my_application.<locals>.<listcomp>rP   r   r   Nz"parameter approve_status={0} error)Zmysite.sql_utilsrH   rI   r-   r%   Zmysite.mobile.choicesrJ   r   AUDIT_SUCCESSr5   r4   APPLICATIONAUDITINGZpkr   dictALL_AUDIT_STATUSOVERTIME_TYPEr   r   r   r   r<   r=   r>   r   r   r   r   )r   rY   page_numr   r   r   r   rH   rI   r%   rJ   emp_approve_statusrO   Z	sort_namerM   ZrowsrE   rP   rF   r=   rB   r!   )r`   ra   r"   my_applicationW   sP    


 
z!BioTimeAppOverTime.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rft
|j}t
|j}|shdd	g}n ||jfkr|j|jg}n|g}t|}|j }g }y|r|
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d j|jd}|rg }x4|D ]*}|d }|d }|s|dd	gdgfkr֐q||krq|jj|dddd d!dd"d#d$}|r|d }||d% |d& t|d% t|d' t|d d(|d	 rX|d	 pZd)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rt|d0d. dd/}t t!t"#|d)d1S  t$k
rb } z ddl%} | &  t t'd)d)t(|S d}~X Y nX nt)d2}!t t'd)d)|!t*S dS )3u  
        get approve list
        @param approve_status:  ·（required）0:approved&rejected, 1:pending, 2:approved，3：rejected
        @param page_num:        page number(１５items/page)
        @param order_by:        sort(1: apply time，２：approve time), application page default１，approve page default２
        @param source:           data source(1: IOS， 2：Android)
        @param device_token:    Token for push message
        @param language:
        @param token:
        @rtype:
            {"code": 1, "error": "", "describe": "", "message": "", "data":[{"id": ID, "pin": "emp_code", "name":"first_name",
            "photo":"photo address", "start": "", "end": "", "remark":"apply reason", "approve_status": ""},]}
        r   )r%   )NodeInstance)ContentType)r$   )r&   )r   r   r   r   rQ   rR   rS   r   r   ZattZovertimeN)0workflow_instance__workflow_engine__content_typenode_engine__approver__in	state__inapprover_admin_idZapprover_employee_idT)ro   rp   rq   rr   is_next_node)ro   Z node_engine__approver_by_overallZdepartmentsrp   rq   rs   rr   Fr3   )Zflat)Zid__inZworkflow_instance__exception_idZworkflow_instance__employeestaterA   rL   is_last_node)Zworkflow_instance__employee_id)r3   r9   r7   r8   r:   Zemployee__emp_codeZemployee__first_name
audit_timerR   rS   r   z{0}r   rQ   rT   )r   rW   r   rX   r?   r@   rA   r#   rL   rY   rZ   r[   r\   c             S   s   | d S )Nr\   r!   )kr!   r!   r"   <lambda>      z2BioTimeAppOverTime.approval_list.<locals>.<lambda>)keyreversec             S   s   | d S )NrL   r!   )rx   r!   r!   r"   ry     rz   r   zapprove_status_not_in (0,1,2,3))+r-   r%   mysite.workflow.modelsrm   Z"django.contrib.contenttypes.modelsrn   mysite.att.modelsr$   r.   r&   rf   rg   rh   rd   re   r   Z	flow_roleallr1   Zget_by_natural_keyr2   r3   Z
departmentZvalues_listZdistinctr6   r   r
   r   r]   appendsortedr   r   r   r   r<   r=   r>   r   r   r   r   )"r   rY   ri   order_byr   r   r   r   r%   rm   rn   r$   r&   r`   ra   rk   rj   Z	emp_rolesrE   Zct_otZNodeInstance_objZNodeInstance_obj_without_departZNodeInstance_obj_with_departZapprove_nodesZprv_exceptionr_   Zexception_idZ	last_nodeZ	apply_objZres_dataZdata_filtered_listrF   r=   rB   r!   r!   r"   approval_list   s    





&









 z BioTimeAppOverTime.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rftd}ttdd|tS t|}|jj|d	}|rvy|d }|j }||	j	krf||_t| d
 |_||_|  |j|| |
jj|d d}|rxLt|D ]@\}}|}d}|j}|j}|r$P |r d|_|  d}P q W |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
rr } z ddl,}|-  ttddt.|S d}~X Y nX ntd}ttdd|tS ntd}ttdd|tS dS )uX  
        overtime approve
        @param code:                ID
        @param approve_status:      ·(required）audit status(approved/rejected)
        @param source:              data source(1: IOS， 2：Android)
        @param device_token:        push message Token
        @param language:
        @param token:
        @rtype:
        r   )r$   )r%   )rm   )WorkflowInstanceNZ!param_approve_status_out_of_ranger   )abstractexception_ptr_idr   )Zworkflow_instance__exceptionorderFT)Z	exceptionr   )r3   )rt   r+   z{0}OKr   Zobject_not_foundZobject_id_not_found)/r,   r$   r-   r%   r}   rm   Z(mysite.workflow.models.workflow_instancer   datetimerc   r5   r   r   r   r   r   r1   r2   nowaudit_reasonr/   r0   approverrw   r;   ZworkflowinstanceZapprove_current_node_byr   r   	enumeraters   ru   Zreject_current_node_byr   firstZnodeinstance_setrt   r3   updater   r   r   r   r<   r=   r>   r   ) r   r   rY   rA   r   r   r   r   r$   r%   rm   r   r   rB   r   ZobjsrD   rw   ZnodesiZnodeindexZset_next_nodeZcurrent_noderu   Z	next_nodeZstate_Zworkflow_instanceZnode_setrE   rF   r=   r!   r!   r"   approve#  s~    



 zBioTimeAppOverTime.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 ttddt|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)r$   )rc   r4   )r3   zRevoke by {0} and Remark is {1}r+   z{0}r   Zrevoked_successfulr   Z$only_approved_records_can_be_revokedZ!workflow_instance_does_not_exists)r   r~   r$   Zmysite.att.models_choicesrc   r4   r1   r2   r   rK   r   r   r   r   r   r   rw   Z_approve_userr;   r   r   r   r   r   r   r   )r   r   rA   r   r   r   r   r   r$   rc   r4   rD   userrE   r+   rB   r!   r!   r"   revokeu  s*    

zBioTimeAppOverTime.revokeN)__name__
__module____qualname____doc__r   r   intr/   r#   rG   rl   r   r   r   r!   r!   r!   r"   r   
   s   $4 G" "Qr   )r   Zdjango.utils.translationr   r   Zmysite.ladon.ladonizerr   Zmysite.mobile.utilsr   r   r   r   r   r	   r
   r   r   r   r   objectr   r!   r!   r!   r"   <module>   s   4