B
    c,[                 @   s  d dl mZ d dlZd dlZd dlmZ d dlm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mZmZmZ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% d dl&m'Z' G dd dZ(G dd de(Z)G dd de(Z*G dd de(Z+G dd de(Z,dd Z-dd Z.d d! Z/d"d# Z0d$d% Z1ed&gd'd( Z2ed&gd)d* Z3ed&gd+d, Z4ed&gd-d. Z5ed1d/d0Z6dS )2    )unicode_literalsN)ContentType)login_required)HttpResponseHttpResponseBadRequestHttpResponseNotFound)render)api_view)OperationNotAllowed   )WorkflowInstance)NODE_APPROVEDNODE_PENDING	NODE_VOIDNODE_REJECTEDNODE_REVOKENODE_WITHDRAW)workflow_approve_signal)LeaveSettingsLeave)AttRule)Reimbursement)get_current_company_id)check_leave_combinationc               @   s$   e Zd Zdd Zdd Zdd ZdS )AbstractViewc             C   sH   |dkrt jj|dd}nt jj|dd}tjj||d jd}|d S )Nreimbursementpayroll)model	app_labelattr   )exception_idcontent_type)r   objectsfilterr   id)selfr    
model_namer!   ZWorkflowInstance_obj r'   .G:\easytimepro\master/mysite/workflow\views.pyget_workflow_instance_id   s    z%AbstractView.get_workflow_instance_idc          
   C   s  ddl m} d}|j}|jdd }|jdd }i }|jjrLt|jj}nt|jj}|st|d|d< d|d	< t	t
||d
S y| ||jd }	W nF tk
r   ddl m} t|d|d< d|d	< tt
||d
S X y~| |	||| |	j d}
tjjd|dd d }t
|d d }t|d }|dkr|
d jj}|
d jjj}|
d jj}|dkrt jj|ddd}|r|d d dkrt!|| t"jj|ddd}|d d |d d  }t"jj|dj#|d d}xb|
D ]Z}|j$dkrF|j%t&kr|j'dkr0qd}d|_$|(  q|rd|_$|(  P qW W nH t)k
r } z(t|j*|d< d|d	< t+t
||d
S d }~X Y nX |jd |d< d|d< d|d	< t+t
||d
S )Nr   )gettext_lazyzapplication/jsonremarkworkflow_instance_idworkflow_instance_id_is_missingresultr   
error_code)r!   r&   !workflow_instance_does_not_existsorderglobal_att_rule_- )
param_nameparam_valueleavemng_condition   )r$   leave_payment_typedays)employee_idleave_balancemax_leave_per_month)r<   FTOK),django.utils.translationr*   userPOSTgetis_employeestr
company_idcurrent_companyr   jsondumpsr)   data	Exceptionr   	operationnodeinstance_setallorder_byr   r"   r#   replacevaluesloadsintworkflow_instancer;   	exceptionaudit_statusr    r   r   r   updateis_next_nodestater   Zis_last_nodesaver
   errorsr   )r%   request_mimetypeapprover_auth_userr+   r,   rI   rE   rS   ZNodeInstance_obj	leave_calleave_cal_jsonleave_management_conditionemp_idapprove_statusleave_idleave_methodleave_balance_checkr<   Zsingal_is_next_nodeZNodeInstance_obj_ier'   r'   r(   operate_over_workflow$   sz    



 z"AbstractView.operate_over_workflowc             C   s   d S )Nr'   )r%   rS   r^   r+   r[   r'   r'   r(   rK   l   s    zAbstractView.operationN)__name__
__module____qualname__r)   rh   rK   r'   r'   r'   r(   r      s   	Hr   c               @   s   e Zd Zdd ZdS )ApproveWorkflowc             C   s   | || d S )N)Zapprove_current_node_by)r%   rS   r^   r+   r[   r'   r'   r(   rK   q   s    zApproveWorkflow.operationN)ri   rj   rk   rK   r'   r'   r'   r(   rl   p   s   rl   c               @   s   e Zd Zdd ZdS )RejectWorkflowc             C   s@   | || |jjtdd}x|D ]}t|_|  q&W d S )N)rX   r1   )reject_current_node_byrL   r#   r   rN   r   rX   rY   )r%   rS   r^   r+   r[   workflow_nodeinstance_objworkflow_nodeinstance_obj_ir'   r'   r(   rK   v   s    
zRejectWorkflow.operationN)ri   rj   rk   rK   r'   r'   r'   r(   rm   u   s   rm   c               @   s   e Zd Zdd Zdd ZdS )RevokeWorkflowc          
   C   s  ddl m} ddlm} d}|j}|jdd }|jdd }i }|spt|d|d< d	|d
< tt	
||dS |st|d|d< d	|d
< tt	
||dS y| ||jd }	W n<   ddl m} t|d|d< d	|d
< tt	
||dS y | ||	|| |	j|d W nV tk
rh }
 z6yt|
j}W n   t|
}Y nX |t|ddS d }
~
X Y nX |jd |d< d|d< d|d
< tt	
||dS )Nr   )r*   )JsonResponsezapplication/jsonr+   r,   remark_is_missingr.   r   r/   )r!   r-   r&   r0   )approver)r.   r/   r>   )r?   r*   django.httprr   r@   rA   rB   rD   r   rG   rH   r)   rI   r   rK   Zdo_after_revokerJ   messager   )r%   r[   r\   rr   r]   r^   r+   r,   rI   rS   rg   error_messager'   r'   r(   rh      sH     z$RevokeWorkflow.operate_over_workflowc             C   s  ddl m} ddlm} |jj|kr4|d}t||j| |j	d}|j
jrbt|j
j}	nt|j
j}	tjjd|	dd d	 }
t|
d d
 }t|d }|dkrv|d jj}|d jjj}|d jj}|dkrvtjj|ddd}|rv|d d dkrvt||	 tjj|ddd}|d d |d d  }tjj|dj|d tjj|djdd x*t|D ]\}}t|_ ||_!|"  qW d S )Nr   )AUDIT_SUCCESS)r*   $only_approved_records_can_be_revokedr1   r2   r3   r4   )r5   r6   r7      )r$   r9   r:   )r;   r<   r=   )r<   y)revoke_type)#mysite.att.models_choicesry   r?   r*   rT   rU   rJ   revokerL   rN   r@   rC   rD   rE   rF   r   r"   r#   rO   rP   rG   rQ   rR   rS   r;   r    r   r   r   rV   	enumerater   rX   approver_employeerY   )r%   r[   rS   r^   r+   ry   r\   rw   ro   rE   r_   r`   ra   rb   rc   rd   re   rf   r<   irp   r'   r'   r(   rK      s<    


zRevokeWorkflow.operationN)ri   rj   rk   rh   rK   r'   r'   r'   r(   rq      s   (rq   c               @   s   e Zd Zdd Zdd ZdS )WithdrawWorkflowc          
   C   s  ddl m} ddlm} d}|j}|jdd }|jdd }i }|spt|d|d< d	|d
< tt	
||dS |st|d|d< d	|d
< tt	
||dS y| ||jd }	W n   tjj|d}
|
d }
|
jtkr||
_t|
_tj |
_|
  t }t|| n*t|d|d< d	|d
< tt	
||dS d|d< d|d
< tt	
||dS y | ||	|| |	j|d W nV tk
r } z6yt|j}W n   t|}Y nX |t|ddS d }~X Y nX |jd |d< d|d< d|d
< tt	
||dS )Nr   )r*   )rr   zapplication/jsonr+   r,   rs   r.   r   r/   )r!   r-   r&   )r$   rz   r>   )rt   ru   )r.   r/   )r?   r*   rv   rr   r@   rA   rB   rD   r   rG   rH   r)   rI   r   r"   r#   rU   r   Zaudit_reasonr   datetimeZnowZ
audit_timerY   r   r   r   rK   Zdo_after_withdrawrJ   rw   )r%   r[   r\   rr   r]   r^   r+   r,   rI   rS   objrE   rg   rx   r'   r'   r(   rh      s^     z&WithdrawWorkflow.operate_over_workflowc             C   s  ddl m} ddlm} |jj|kr4|d}t||j| |j	d}|j
jrbt|j
j}	nt|j
j}	tjjd|	dd d	 }
t|
d d
 }t|d }|dkrv|d jj}|d jjj}|d jj}|dkrvtjj|ddd}|rv|d d dkrvt||	 tjj|ddd}|d d |d d  }tjj|dj|d tjj|djdd x*t|D ]\}}t|_ ||_!|"  qW d S )Nr   )ry   )r*   Z%only_approved_records_can_be_withdrawr1   r2   r3   r4   )r5   r6   r7      )r$   r9   r:   )r;   r<   r=   )r<   r|   )r}   )#r~   ry   r?   r*   rT   rU   rJ   withdrawrL   rN   r@   rC   rD   rE   rF   r   r"   r#   rO   rP   rG   rQ   rR   rS   r;   r    r   r   r   rV   r   r   rX   r   rY   )r%   r[   rS   r^   r+   ry   r\   rw   ro   rE   r_   r`   ra   rb   rc   rd   re   rf   r<   r   rp   r'   r'   r(   rK     s<    


zWithdrawWorkflow.operationN)ri   rj   rk   rh   rK   r'   r'   r'   r(   r      s   6r   c             C   sr   t jj|d}|rn|d }|jjtdd}x,|D ]$}|jrDd|_t|_| |_	|
  q4W tjd|t| d d S )N)r    r   )rX   r1   FNodeInstance)senderrS   
node_statenode_approver)r   r"   r#   rL   r   rN   rW   r   rX   approver_adminrY   r   send)r^   rS   employeer!   r    workflow_instancesro   rp   r'   r'   r(   approve_by_admin(  s    
r   c             C   sb   t jj|d}|r^|d }|j| d| j d |jjtdd}x|D ]}t|_	|
  qHW d S )N)r    r   z
reject by )r+   )rX   r1   )r   r"   r#   rn   usernamerL   r   rN   r   rX   rY   )r^   rS   r   r!   r    r   ro   rp   r'   r'   r(   reject_by_admin7  s    
r   c       	      C   sn   ddl m} | }tjj|d }tjd|t| d |rj|j	
d}t| |r^t| || nt| || dS )z
    :param approver_auth_user:   app revoke also use this method
    :param workflow_instance:
    :param employee:
    :param content_type:
    :param exception_id:
    :return:
    r   )get_user_model)r    r   )r   rS   r   r   r1   N)Zdjango.contrib.authr   r   r"   r#   firstr   r   r   rL   rN   
isinstancerevoke_from_userrevoke_from_app)	r^   rS   r   r!   r    r   ZUserZworkflow_instro   r'   r'   r(   revoke_by_adminB  s    	

r   c             C   s<   x6t |D ]*\}}t|_| |_d| j|_|  q
W d S )Nzrevoked by->{0})r   r   rX   r   formatr   r+   rY   )r^   r    ro   r   rp   r'   r'   r(   r   Y  s
    r   c             C   s<   x6t |D ]*\}}t|_| |_d| j|_|  q
W d S )Nzrevoked by->{0})r   r   rX   r   r   namer+   rY   )r^   r    ro   r   rp   r'   r'   r(   r   b  s
    r   rA   c             C   sB   | j ddr6tjj| j d dj}d| j _|| j d< t | S )Nis_ui_approver4   r,   )r$   T)rI   rB   r   r"   r    _mutablerl   rh   )r[   rS   r'   r'   r(   approvej  s
    
r   c             C   sB   | j ddr6tjj| j d dj}d| j _|| j d< t | S )Nr   r4   r,   )r$   T)rI   rB   r   r"   r    r   rm   rh   )r[   rS   r'   r'   r(   rejects  s
    
r   c             C   s4   t jj| jd dj}d| j_|| jd< t | S )Nr,   )r$   T)r   r"   rB   rI   r    r   rq   rh   )r[   rS   r'   r'   r(   r   |  s    
r   c             C   s   t  | S )N)r   rh   )r[   r'   r'   r(   r     s    r   c       
   	   C   sv  ddl m} ddlm} ddlm} |d kr6| jd }| jd dkr\tjj	| jd dd	}ntjj	| jd d
d	}| jd dkrt
jj	||d jd}|stjj| jd dj}d| j_t
jj|dj| jd< t
jj	| jd |d jd}nt
jj	||d jd}|r|d }nd|d dd}||S |jd |jj|jj|jj|jjt|j|jj|jd}	|| d|	S )Nr   )r*   )TemplateResponse)rr   r,   r&   r   r   )r   r   r   )r    r!   )r$   T)r    )r$   r!   z%sZdid_not_have_match_workflowr   )r.   r/   r1   )Z	node_listZworkflow_content_typeZworkflow_employee_first_nameZworkflow_employee_last_nameZworkflow_employee_codeZworkflow_instance_issue_dateworkflow_nameZworkflow_intance_idz6workflow/workflowinstance/actions/WorkflowDisplay.html)r?   r*   Zdjango.template.responser   Zmysite.utilsrr   ZGETr   r"   r#   r   r$   r   rB   Zworkflow_abstractException_idr   rL   rN   rM   Zworkflow_enginer!   r   Z
first_name	last_nameZemp_coderD   Z
issue_dater   )
r[   Zworkflow_idr\   r   rr   r!   rS   Zreimbursement_idrI   contextr'   r'   r(   details  sD    



r   )N)7Z
__future__r   rG   r   Z"django.contrib.contenttypes.modelsr   Zdjango.contrib.auth.decoratorsr   rv   r   r   r   Zdjango.shortcutsr   Zrest_framework.decoratorsr	   Z9mysite.workflow.exceptions.workflow_validation_exceptionsr
   Zmodelsr   Zmysite.workflow.models_choicesr   r   r   r   r   r   Zmysite.workflow.signalsr   Zmysite.att.modelsr   r   Zmysite.att.models.model_attruler   Zmysite.payroll.modelsr   Zmysite.att.utilsr   Zmysite.att.models.model_leaver   r   rl   rm   rq   r   r   r   r   r   r   r   r   r   r   r   r'   r'   r'   r(   <module>   s@    W
N[			