B
    ObO              	   @   s  d dl Z d dlZd dlZd dlZ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 d dlmZ d dlm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 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- d dl.m/Z/ G dd de/ej0Z1G dd de/ej0Z2G dd dej3Z4G dd dej3Z5G dd deZ6G dd  d ej7Z8G d!d" d"e/ej9ej:ej;ej0ej<Z=G d#d$ d$ej3Z>G d%d& d&e/ej?Z@dS )'    N)Image)settings)gettext)mixins)serializers)Response)status)action)	FilterSet)	force_str)PUNCH_STATES)viewsets)ReimbursementAllowanceTypePurposeType)SalaryStructure)Employee)stamp2datetime)models_choices)NodeInstance)APPCustomizeResponseModelMixinc               @   s   e Zd Zdd ZdS )ReimbursementAllowanceTypeViewc             O   s>   |j }|jj}tjj|dd}dd |D }t|tj	dS )N)companyidc             S   s   g | ]}|j |jd qS ))r   allowance_type)r   Zallowance_name).0obj r   HG:\easytimepro\master/mysite/mobile\api_rest\views\view_reimbursement.py
<listcomp>,   s    z7ReimbursementAllowanceTypeView.list.<locals>.<listcomp>)r   )
userr   r   r   objectsfilterorder_byr   r   HTTP_200_OK)selfrequestargskwargsemp
company_idr   choicesr   r   r   list(   s
    z#ReimbursementAllowanceTypeView.listN)__name__
__module____qualname__r,   r   r   r   r   r   &   s   r   c               @   s   e Zd Zdd ZdS )ReimbursementPurposeTypeViewc             O   s>   |j }|jj}tjj|dd}dd |D }t|tj	dS )N)r   r   c             S   s   g | ]}|j |jd qS ))r   purpose_type)r   Zpurpose_name)r   r   r   r   r   r   6   s    z5ReimbursementPurposeTypeView.list.<locals>.<listcomp>)r   )
r    r   r   r   r!   r"   r#   r   r   r$   )r%   r&   r'   r(   r)   r*   r1   r+   r   r   r   r,   2   s
    z!ReimbursementPurposeTypeView.listN)r-   r.   r/   r,   r   r   r   r   r0   0   s   r0   c               @   sF   e Zd ZejddZejddZejeddddZG dd	 d	Z	d
S )ReimbursementListSerializerzallowance_type.allowance_name)sourcezpurpose_type.purpose_nameapproval_field_approvalStatusaudit_statusT)labelr3   
allow_nullc               @   s   e Zd ZeZdZdS )z ReimbursementListSerializer.Meta__all__N)r-   r.   r/   r   modelfieldsr   r   r   r   Meta?   s   r;   N)
r-   r.   r/   r   	CharFieldr   r1   _audit_status_stringr;   r   r   r   r   r2   :   s
   

r2   c               @   sJ   e Zd Ze Ze Ze Ze Ze	 Z
e	 ZG dd dZdS )ReimbursementCreateSerializerc               @   s   e Zd ZeZdZdS )z"ReimbursementCreateSerializer.Metar8   N)r-   r.   r/   r   r9   r:   r   r   r   r   r;   L   s   r;   N)r-   r.   r/   r   r<   rmb_start_datermb_end_dater   r1   ZSerializerMethodFieldrmb_fileadditional_employeer;   r   r   r   r   r?   D   s   r?   c               @   s\   e Zd ZejdddZejdddZejdddZejdd	Z	ejd
d	Z
G dd dZdS )ReimbursementFilterr5   exact)
field_nameZlookup_exprZrmb_start_date__dateZgteZrmb_end_date__dateZlteZemployee__emp_code)rF   Zemployee__first_namec            	   @   s&   e Zd ZeZddddddddd	g	Zd
S )zReimbursementFilter.Metaemployeermb_start_date_gtermb_end_date_lterB   
rmb_amount
rmb_remarkr5   emp_code
first_nameN)r-   r.   r/   r   r9   r:   r   r   r   r   r;   X   s   r;   N)r-   r.   r/   django_filtersZ
CharFilterr5   Z
DateFilterrH   rI   rL   rM   r;   r   r   r   r   rD   Q   s   rD   c               @   s*   e Zd Ze ZejdddZdd ZdS )ReimbursementApproveSerializerFT)requiredr7   c             C   s4   |d }|t jt jfkr0td}td|gi|S )Napprove_statusZ!param_approve_status_out_of_rangemessage)r   AUDIT_SUCCESSREFUSEr=   r   ZValidationError)r%   ZattrsrQ   rR   r   r   r   validateb   s
    z'ReimbursementApproveSerializer.validateN)	r-   r.   r/   r   ZIntegerFieldrQ   r<   remarkrU   r   r   r   r   rO   ^   s   rO   c               @   sv   e Zd ZeZeeeedZe	Z
dd Zdd Zdd Zdd	 Zd
d Zedgdddd Zedgdddd ZdS )EmployeeReimbursementView)Zretriever,   createapprovec             C   s   | j jj}tjj|d}|S )N)r   )r&   r    r*   r   r!   r"   )r%   r*   querysetr   r   r   get_querysety   s    
z&EmployeeReimbursementView.get_querysetc             C   s   | j | jd S )N)serializer_class_dictgetr	   )r%   r   r   r   get_serializer_class~   s    z.EmployeeReimbursementView.get_serializer_classc       	      C   s   x|D ]}g }|d rxp|d  dD ]^}tj}d|d  dd }|d d|d |d	 | }|| }tj|r&|| q&W ||d< qW |S )
NrB   /z/{0}
apply_time r   z{0}/{1}/{2}rG   r   )splitr   REIMBURSEMENT_FILE_ROOTformatospathexistsappend)	r%   rZ   datarB   filesetting_path
recpt_root	file_info	file_pathr   r   r   update_data   s    
z%EmployeeReimbursementView.update_datac       
      O   s   | d|jj}| jjj}tjj||dd}| 	|}| 
|}|d k	rp| j|dd}| |j}	| |	S | j|dd}t|jS )NZemployee_pk)employee_idr*   r`   T)many)r]   r    pkr&   r*   r   r!   r"   r#   filter_querysetpaginate_querysetget_serializerro   ri   get_paginated_responser   )
r%   r&   r'   r(   r)   r*   rZ   page
serializerri   r   r   r   r,      s    



zEmployeeReimbursementView.listc       0   
      s  | j |jd}| r
yttj }t|jd}t|jd}|jd}tj	j
|d}|jd}	tj	j
|	d}	t|jd}
|jd}|jd	}|jd
}tj	j
|jjd}|j}|sdtd}t|tjdS ||krdtd}t|tjdS |rB|tj krBdtd}t|tjdS |rt|tj krtdtd}t|tjdS |
sdtd}t|tjdS |
dkrdtd}t|tjdS g }|}g }x|D ]}|| qW d}d}dddddddg}|r\|r\|d d }tjd| }|dd ttt d!  }x|D ]
}d" d fd#d$tdD }|d%}t|j| d& |d  }|d&}|d' }|  }||krtd(}t|tjdS |!  || || t"#t|d) } t$%| }!|!& }"t'j(||}#t'j()|s6t'*| t+|#d*}$|$,|" W d Q R X qLW t-|dkrvd+|}n*dtd,}%dtd,}t|tjdS t.j	j/||d |	d |
||||d-}&|rhd|j|&j}'||' }(t'j()|(st'*|( t'0|})xT|)D ]L}!t'j(1|!s,|!2d.3d/}!t'j(||!}*t'j(|(|!}+t45|*|+ q
W ||&_6|&7  |rt'j()|rt48| |d0 },t'j()|,rt'0|,st48|, d1|&ji}-t|-tj9dS  t:k
r }. zdd l;}/|/<  t|.tjdS d }.~.X Y nX nt|j=tj>dS d S )2N)ri   r@   rA   r   )r   r1   rJ   rB   rC   rK   )rp   z{0}zPayroll structure not found)r   Z"leave_time_invalid_range_start_endZ7reimbursement_startdate_cannot_greater_than_current_dayZ5reimbursement_enddate_cannot_greater_than_current_dayZloan_fields_requiedr   Zthe_amount_need_lager_than_zero ZjpgZjpegZpngZbmpZpdfZdocxZxlsx
   z{0}/z{0}/{1}/rooti  Z>ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890c             3   s   | ]}t  V  qd S )N)randomZchoice)r   x)charsr   r   	<genexpr>   s    z3EmployeeReimbursementView.create.<locals>.<genexpr>@.Z-reimbursement_receipt_file_format_constraints   wbr_   Zreceipt_file_validation)rG   r   r1   rJ   r@   rA   rK   rC   zutf-8gbkzroot/result)?ru   ri   is_validstrdatetimenowr   r]   r   r!   r"   r   floatr   r    r   rd   r=   r   r   HTTP_406_NOT_ACCEPTABLEZtodayrh   r   rc   hexinttimejoinrangerb   rL   lowerpopbase64Z	b64decodeioBytesIOgetvaluere   rf   rg   makedirsopenwritelenr   rX   listdirisfileencodedecodeshutilcopyrB   savermtreeZHTTP_201_CREATED	Exception	traceback	print_excerrorsZHTTP_400_BAD_REQUEST)0r%   r&   r'   r(   rx   Zrmb_dater@   rA   r   r1   ZamountZreceiptsrC   rV   Zsalary_structure_datar)   rR   Z
files_nameZuploaded_filesZ	rmb_filesr}   Z	rpt_filessource_fileZfiles_formatZ	file_dateZ	file_rootrB   Z	randomstrZfind_img_extension	file_nameZ	name_listZf_formatZimageZimgZ	file_datarn   fdescriber   Z	path_infoZ	emp_filesZ	img_filesZs_filenew_fileZ	root_pathZresponseer   r   )r~   r   rX      s    



 












z EmployeeReimbursementView.createZpostT)methodsZdetailc          
   O   s  | j |jd}|jdd |j}d}|j}|d }|d }	|d}
| jjj|d	 }|ry|	t
jkr|jj||
 |jj}tjj|d	 d
}|r*xFt|D ]:\}}|}d}|j}|j}|rP |rd|_|  d}P qW |r*||d  }d|_|  n|	t
jkr*|jj||j ddtdgi}t|tjdS  tk
r } z*dd l }|!  td|j"d gitj#dS d }~X Y nX ntd}td|gitj$dS d S )N)ri   T)Zraise_exceptionFrr   rQ   rV   )r   )Zworkflow_instance__exceptionorderr   rR   z{0}OK)r   r   Zobject_not_found)%ru   ri   r   Zvalidated_datar    r]   r9   r!   r"   firstr   rS   workflow_abstractExceptionZworkflowinstanceZapprove_current_node_byr   r   allr#   	enumerateis_next_nodeis_last_noder   rT   Zreject_current_node_byaudit_reasonrd   r=   r   r   r$   r   r   r   r'   Z&HTTP_451_UNAVAILABLE_FOR_LEGAL_REASONSr   )r%   r&   r'   r(   rx   ZdatasZset_next_nodeapproverZobj_idrQ   rV   r   codeZnodesiZnodeindexZcurrent_noder   Z	next_noderi   r   r   msgr   r   r   rY     sT    

*z!EmployeeReimbursementView.approvec             O   s   |d }| j jj|d }|r|jjtjkr|j}d	|j
|_tj|j_|j
|_tj |_||_|  tdd	tdgitjdS td}td|gitjdS ntd	}td|gitjdS d S )
Nrr   )r   zrevoke by->{0}rR   z{0}r   )r   Z$only_approved_records_can_be_revokedZ!workflow_instance_does_not_exists)r9   r!   r"   r   r   r5   r   rS   r    rd   namer   ZCANCEL_AUDIT_SUCCESSr   r   r   Z
audit_timeZ_approve_userr   r   r=   r   r$   r   )r%   r&   r'   r(   Zmanuallog_idr   r    r   r   r   r   revoke<  s     
z EmployeeReimbursementView.revokeN)r-   r.   r/   rD   filter_classr2   r?   rO   r\   r   r9   r[   r^   ro   r,   rX   r	   rY   r   r   r   r   r   rW   j   s   p0rW   c               @   sv   e Zd ZejddZejddZe Zeje	ddZ
eje	dddd	Zejd
dZejddZG dd dZdS )#EmployeeTeamReimbursementSerializerzemployee.emp_code)r3   zemployee.first_nameworkflow_current_state_name)r6   r4   r5   T)r6   r3   r7   zallowance_type.allowance_namezpurpose_type.purpose_namec               @   s   e Zd ZeZdZdS )z(EmployeeTeamReimbursementSerializer.Metar8   N)r-   r.   r/   r   r9   r:   r   r   r   r   r;   \  s   r;   N)r-   r.   r/   r   r<   rL   r   ZReadOnlyFieldZlast_approverr=   r   r>   r   r1   r;   r   r   r   r   r   R  s   

r   c               @   s0   e Zd ZeZeZeZdd Z	dd Z
dd ZdS )EmployeeTeamReimbursementViewc             C   s"   | j jj}tjj|dd}|S )N)r*   r`   )r&   r    r*   r   r!   r"   r#   )r%   r*   rZ   r   r   r   r[   f  s    
z*EmployeeTeamReimbursementView.get_querysetc       	      C   s   x|D ]}g }|d rxp|d  dD ]^}tj}d|d  dd }|d d|d |d	 | }|| }tj|r&|| q&W ||d< qW |S )
NrB   r_   z/{0}r`   ra   r   z{0}/{1}/{2}rG   r   )rb   r   rc   rd   re   rf   rg   rh   )	r%   rZ   ri   rB   rj   rk   rl   rm   rn   r   r   r   ro   k  s    
z)EmployeeTeamReimbursementView.update_datac          
   O   s  yddl m} tjjddd |jj d}tjjdd|jj|jj d}| 	| 
 }|||jdddd||jddddB  }W n< tk
r } zt| | jjj|jd	}W d d }~X Y nX | |}	|	d k	r| j|	dd
}
| |
j}| |S | j|dd
}
t|
jS )Nr   )Qr   )r   Z node_engine__approver_by_overallZdepartmentsZnode_engine__approver__inr   T)Zflat)Z>workflow_abstractException__workflowinstance__nodeinstance__in)rG   )rq   )Zdjango.db.modelsr   r   r!   r"   r    Z	flow_roler   Z
departmentrs   r[   Zvalues_listZdistinctr   printr9   Zexcludert   ru   ro   ri   rv   r   )r%   r&   r'   r(   r   ZNodeInstance_obj_with_departZNodeInstance_obj_without_departrZ   r   rw   rx   ri   r   r   r   r,   y  s8    $


z"EmployeeTeamReimbursementView.listN)r-   r.   r/   r   Zserializer_classrD   r   r   r9   r[   ro   r,   r   r   r   r   r   a  s   r   )Are   Zjsonr   r   r   r   r|   r   ZPILr   Zdjango.confr   Zdjango.utils.translationr   r=   Zrest_frameworkr   r   Zrest_framework.responser   r   rN   Zrest_framework.decoratorsr	   Zdjango_filters.rest_frameworkr
   Zdjango.utils.encodingr   Zmysite.att.models_choicesr   Zmysite.mobile.api_restr   Zmysite.payroll.modelsr   r   r   Z,mysite.payroll.models.model_salary_structurer   Zmysite.personnel.modelsr   Zmysite.mobile.utilsr   Z
mysite.attr   Zmysite.workflow.modelsr   Z(mysite.mobile.api_rest.app_customize_mixr   ZGenericViewSetr   r0   ZModelSerializerr2   r?   rD   Z
SerializerrO   ZListModelMixinZCreateModelMixinZRetrieveModelMixinZApproveFlowMixinrW   r   ZGenericApprovalListViewr   r   r   r   r   <module>   sT   


 d