B
    bZ                 @   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)request_validstamp2datetimeinterface_responseonline_employee_newSUCCESS_CODEMESSAGE_CODESYSTEM_EXCEPTIONDATA_EXCEPTIONdatetime2stamp
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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 )BioTimeAppManualLogu   
    【Manual Log】
    )Zrtypec          
   C   s  ddl m} ddlm} t|}|jjj}y|d|d}	dd |	D }
||
}t }xL|D ]D}t	||kr~|t	| 
| qZt |t	|< |t	| 
| qZW |t| }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  
        get manual log 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":["code": ID, "name":""]}
            fail
                {"code": -10001, "error": "", "describe": "exception state", "message": "Pop-up message", "data":""}
        r   )get_func_key)remove_empty_from_dictN)key
company_idc             S   s   g | ]}|d  |d dqS )r      )codename ).0Zchoicer   r   >G:\easytimepro\master/mysite/mobile\services\app_manual_log.py
<listcomp>%   s    z0BioTimeAppManualLog.category.<locals>.<listcomp> 
successful)mysite.att.att_paramr   mysite.mobile.utilsr   r   
departmentcompanyiddictlenappendlistmaxr   r   jsondumps	Exception	traceback	print_excr	   r
   )selfsourcedevice_tokenlanguagetokenr   r   empr   choicesZdata_valuesZdata_removed_empty_keysZactual_valuesvalueZ
final_dataer*   r   r   r   category   s(    

zBioTimeAppManualLog.categoryc          
   C   s   ddl m} yRt|}|jjj}|jj|ddd}g }	|rLd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 d
S )u  
        get workcode
        @param source:              data source(1: IOS， 2：Android)
        @param device_token:        push message Token
        @param language:
        @param token:
        @rtype:
            success
                {"code": 1, "error": "", "describe": "", "message": "", "data":["code": ID, "name":""]}
            fail
                {"code": -10001, "error": "", "describe": "exception state", "message": "Pop-up message", "data":""}
        r   )TerminalWorkCode)r   r!   aliasc             S   s   g | ]}|d  |d dqS )r!   r7   )r   r   r   )r   objr   r   r   r   K   s    z1BioTimeAppManualLog.work_code.<locals>.<listcomp>r   r   N)Zmysite.iclock.modelsr6   r   r   r    r!   objectsfiltervaluesr   r   r'   r(   r)   r*   r+   r
   )r,   r-   r.   r/   r0   r6   r1   r   Zobjsr2   r4   r*   r   r   r   	work_code5   s    
zBioTimeAppManualLog.work_codec	          
   C   s  ddl m}	 ddlm}
 ddlm} ddlm} ddl}t	|}||j
 krtd}dtd	}dtd	}ttd
|||S t|}|
jj|j|dj|	j|	jgd}|rt| d pt| d }td}dtd| }dtd| }ttd
|||S |jj||d }|dkr`td}dtd}dtd}ttd
|||S |std}dtd}dtd}ttd
|||S y|r|jj|d}|r|d j}n td}td}ttd
d
||S |
 }|j|_||_||_||_|p
d
|_d|_|   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 manual log
        @param punch_time:      (stamp)
        @param punch_type:      (data source: BioTimeAppManualLog -> category)
        @param work_code:       (data source: BioTimeAppManualLog -> work_code)
        @param remark:          apply reason
        @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   )models_choices)	ManualLog)Transaction)r6   NZapp_manuallog_wrong_dataz{0}Zmanual_log_time_greater_nowr   )employee_id
punch_time)Zaudit_status__inr   Zmanual_log_repeat)r1   rA   Zmanual_log_category_required)r!   Z!app_manuallog_work_code_not_foundZapp_manuallog_data_exceptionmessageZrequest_already_processingr   )(
mysite.attr=   Z!mysite.att.models.model_manuallogr>   Z&mysite.iclock.models.model_transactionr?   Z#mysite.iclock.models.model_workcoder6   datetimer   now_formatr   r	   r   r9   r:   r!   excludeREFUSECANCEL_AUDIT_SUCCESSstrsplitcountr   r@   rA   apply_reasonpunch_stater<   audit_statussaver   r'   r(   r)   r*   r+   r
   )r,   rA   Z
punch_typer<   remarkr-   r.   r/   r0   r=   r>   r?   r6   rD   Z
check_timeerrordescriberB   r1   Ztmp_logZtrsZwcsr8   datar4   r*   r   r   r   applyR   sj     
zBioTimeAppManualLog.applyc          
      sl  ddl m}m} ddlm}	 ddlm ddlm}
 |dkrNt	|}|j
jj |pVd}|sbd}nd	| }d
}|dkrzd
}ddt|j d |d }yt|ddd|ddd}t|||}||}|
g d}|rt|	j fdd|D }||d< 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 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":""}
            fail
                {"code":-10001,"error":"","describe":"","message":"Pop-up message","data":""}
        r   )get_sqlp_query)r=   )r   )CATEGORY_MANUAL)r   r         r   z audit_status in (2, 3) z audit_status in (%s) 
apply_time)r   z3 u.employee_id = %(applier)s and %(audit_status)s  ")ZapplierrP   sqlZmanual_punch_applicationmobiler   )whereorder_by)ZsqlidZappZparams)r5   itemsc                s   g | ]}|d  |d |d t |d t|d |d t|d  dt|d |d d	|d |d |d
 t|d dqS )r   r   rZ   r[         )r         z{0}	   
   )r   pinr   photorA   rR   r5   r\   approve_statusapprove_describeapproved_remarkapproved_time)r   r   rK   rG   get)r   r)r   r   statusr   r   r      s   z6BioTimeAppManualLog.my_application.<locals>.<listcomp>rb   r   Nz"parameter approve_status={0} error)Zmysite.sql_utilsrW   rX   rC   r=   r   r   Zmysite.mobile.choicesrY   r   r   r    r!   rK   r   r"   ALL_AUDIT_STATUSr   r   r'   r(   r)   r*   r+   r	   r
   rG   r   )r,   rk   page_numr-   r.   r/   r0   rW   rX   r=   rY   r1   _approve_statusZ	sort_namer`   r^   ZrowsrU   rb   r4   r*   rT   r   )r   r   rq   r   my_application   sF    


 
z"BioTimeAppManualLog.my_applicationc       "      C   s4  ddl m} ddlm}	 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}|svd	d
g}n ||jfkr|j|jg}n|g}t|}|jjj}|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 j|jd}|rx|D ]}|d }|jj|ddddddd d!}|r|d }|d |d" |d# t|d" d$t|d |d	 d$|t |d% |d&t|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t-d/}!t$t+d-d-|!t.S d S )0Nr   )Q)ContentType)NodeInstance)r=   )r>   )r   )r   r   rZ   r[   rd   rc   re   rZ   r[   ZattZ	manuallog)0workflow_instance__workflow_engine__content_typenode_engine__approver__in	state__inapprover_admin_idZapprover_employee_idT)ry   rz   r{   r|   is_next_node)ry   Z node_engine__approver_by_overallZdepartmentsrz   r{   r}   r|   Fr!   )Zflat)Zid__inZworkflow_instance__exception_idworkflow_instance__employeestaterR   r\   )r~   )r!   rA   rO   rN   Zemployee__emp_codeZemployee__first_name
audit_timerd   rc   z{0}r   )r   re   )r   ri   r   rj   rA   rR   r5   r\   rk   rl   rm   rn   c             S   s   | d S )Nrn   r   )kr   r   r   <lambda>A      z3BioTimeAppManualLog.approval_list.<locals>.<lambda>)r   reversec             S   s   | d S )Nr\   r   )r   r   r   r   r   C  r   r   r   zapprove_status_not_in (0,1,2,3))/Zdjango.db.modelsrv   Z"django.contrib.contenttypes.modelsrw   mysite.workflow.modelsrx   rC   r=   mysite.att.modelsr>   r   r   Zmysite.workflowr"   rr   ZAPPLICATIONZAUDITINGr   r   r    r!   Z	flow_roleallr9   Zget_by_natural_keyr:   Zvalues_listZdistinctrH   r   rG   r   rK   ro   r$   sortedr   r   r'   r(   r)   r*   r+   r	   r
   rF   r   )"r,   rk   rs   ra   r-   r.   r/   r0   rv   rw   rx   r=   r>   r   Z
node_staterq   rt   r1   r   Z	emp_rolesrU   Zct_otZNodeInstance_objZNodeInstance_obj_without_departZNodeInstance_obj_with_departZapprove_nodesrp   Zexception_idZ	apply_objZres_dataZdata_filtered_listr4   r*   rT   r   r   r   approval_list   s    





&







 z!BioTimeAppManualLog.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 }|rn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td}ttdd|tS ntd}ttdd|tS d S )Nr   )r>   )r=   )rx   )WorkflowInstanceZ!param_approve_status_out_of_ranger   )abstractexception_ptr_idr   )Zworkflow_instance__exceptionorderFT)Z	exceptionr[   )r!   )r   rB   z{0}OKr   Zobject_not_foundZobject_id_not_found)/r   r>   rC   r=   r   rx   Z(mysite.workflow.models.workflow_instancer   rD   AUDIT_SUCCESSrI   rF   r   r	   r   r   r9   r:   firstrE   audit_reasonrK   rL   approverr   rQ   ZworkflowinstanceZapprove_current_node_byr   ra   	enumerater}   is_last_nodeZreject_current_node_byr   Znodeinstance_setr   r!   updaterG   r   r'   r(   r)   r*   r+   r
   )r,   r   rk   rR   r-   r.   r/   r0   r>   r=   rx   r   rD   rT   r   r8   r   ZnodesiZnodeindexZset_next_nodeZcurrent_noder   Z	next_nodeZstate_Zworkflow_instanceZnode_setrU   r4   r*   r   r   r   approveM  s|    



 zBioTimeAppManualLog.approvec             C   s   t | 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)r>   )r   rJ   )r!   zRevoke by {0} and Remark is {1}rB   z{0}r   Zrevoked_successfulr   Z$only_approved_records_can_be_revokedZ!workflow_instance_does_not_exists)printrD   r   r>   Zmysite.att.models_choicesr   rJ   r9   r:   r   rP   r   rG   r   r   r   rE   r   Z_approve_userrQ   rF   r   r   r'   r(   r	   r   )r,   r   rR   r-   r.   r/   r0   rD   r>   r   rJ   r8   userrU   rB   rT   r   r   r   revoke  s*    

zBioTimeAppManualLog.revokeN)__name__
__module____qualname____doc__r   r   intrK   r5   r<   rV   ru   r   r   r   r   r   r   r   r      s   $$K ="p"Fr   )r'   Zdjango.utils.translationr   rF   Zmysite.ladon.ladonizerr   r   r   r   r   r   r   r	   r
   r   r   r   r   objectr   r   r   r   r   <module>   s   4