B
    bH              	   @   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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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"m#Z#m$Z$ d dlm%Z% G dd deej&ej'ej(ej)ej*Z+dS )    N)mixins)APIException)status)Response)action)settings)gettext_lazy)UtilGenericViewSet)ReimbursementListFilter)Reimbursement)serializers)Employee)AllowanceType)PurposeType)NodeInstanceWorkflowNode)SalaryStructurec            
   @   s   e Zd ZdZeZej ddZ	e
ZdZejejejejejejejejejd	ZdediZdd	 Zd
d Zdd ZedgdddddZdS )ReimbursementViewSetz$
    ReimbursementViewSet Class
    employeeworkflow_abstractException)z-id)	listZrequest_listapprove_listZretrievecreateupdateZpartial_updater   Zexport
rmb_remarkZ"reimbursement_field_approvalreasonc             C   s   | j | jtjS )N)serializer_dictgetr   r   ZNoneSerializer)self r   BG:\easytimepro\master/mysite/staff\api\views\view_reimbursement.pyget_serializer_class=   s    z)ReimbursementViewSet.get_serializer_classc       )   
      s8  t j|jd}| r$|jdd}|jd}|jd}tjj|jdd}tjj|d j	d	
 }	|	s|ttd
|rtj|dtj krttd|rtj|dtj krttd|r|rtj|dtj|dkrttd|jdd }
|jdd }|r6|
r6|r6|r6|sBttdt|dkr\ttdtjj|
d}
tjj|d}t|jdd }yt|jdd }W n   g }Y nX g }|jd}d}d}dddddddg}ttj }|rN|rN|d d }tjd| }|dd ttt d!  }x|D ]
}y
|j}W n   ttd"Y nX | d#d}||krn|!d$}|d% }|" }||krttd&|#  |$| d' d% fd(d)t&dD }|d$%| }|$| |' }t(j)%||}t(j)
|s(t(*| t+|d*}|,| W d Q R X q>W t-|dkrhd+%|}nttd"yi }|d |d< ||d< ||d< ||d< ||d< |
d |d< |d |d< |jd,|d,< ||d-< t.jj/f |}|rd|d j	|j	} ||  }!t(j)
|!s t(*|! t(0|}"xT|"D ]L}#t(j)1|#sR|#2d.3d/}#t(j)%||#}$t(j)%|!|#}%t45|$|% q0W ||_6|7  W n< t8k
r }& zt|&dd l9}'|':  W d d }&~&X Y nLX |rt(j)
|rt4;| |d0 }(t(j)
|(rt(0|(st4;|( t<d1d2iS t<|j=t>j?d3S d S )4N)data
rmb_amount rmb_start_datermb_end_dater   )idr   )Zemployee_idzPayroll structure not foundz%Y-%m-%d %H:%M:%S7reimbursement_startdate_cannot_greater_than_current_day5reimbursement_enddate_cannot_greater_than_current_day"leave_time_invalid_range_start_endallowance_typepurpose_type"staff_reimbursement_required_fieldthe_amount_need_lager_than_zeroadditional_employeedelete_filesrmb_filejpgjpegpngbmppdfdocxxlsx
   z{0}/z{0}/{1}/rooti  receipt_file_validation .-reimbursement_receipt_file_format_constraints>ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890c             3   s   | ]}t  V  qd S )N)randomchoice).0x)charsr   r   	<genexpr>~   s    z.ReimbursementViewSet.create.<locals>.<genexpr>wb/r   
apply_timezutf-8gbkzroot/r   success)r   )@r   ReimbursementCreateSerializerr!   is_validr   r   objectsfilterr   r&   existsr   _datetimestrptimetodayfloatr   r   jsondumpsgetlistloadsstrZnowr   REIMBURSEMENT_FILE_ROOTformathexinttimenamereplacesplitlowerpopappendjoinrangereadospathmakedirsopenwritelenr   r   listdirisfileencodedecodeshutilcopyr0   save	Exception	traceback	print_excrmtreer   errorsr   HTTP_400_BAD_REQUEST))r   requestargskwargs
serializerr"   r$   r%   empZsalary_structure_datar*   r+   r.   deleted_filesZ
files_name	rmb_filesZ	rpt_filessource_filefiles_formatrmb_dateZ	file_date	file_rootr0   	file_name	name_listf_format	randomstr	file_data	file_pathfZReimbursementDictobj	path_info	emp_filesZ	img_filesZimgZs_filenew_fileerv   Z	root_pathr   )rD   r   r   A   s    


 











zReimbursementViewSet.createc       %   
      sJ  t j|jd}| r6|jd}tjj|d}|jdd}|jd}|jd}|jd}	|rtj	|d	tj
 krttd
|rtj	|d	tj
 krttd|r|rtj	|d	tj	|d	krttd|jdd }
|jdd }|r|
r|r|r|s*ttdt|dkrDttdtjj|
d}
tjj|d}t|jdd }tjjt|d d}|d jd}|d jjdkrttd|}ylt|jdd }xRtt|D ]B}d|| kr|| dd }n|| dd }|||< qW W n   g }Y nX tj}|jd}t|dkrt|t|kr|d dkrttddt |d j!d d |d j"t|d }xN|D ]F}|| d | }yt#$| W n   Y nX ||kr|$| qW yt|jdd }W n   g }Y nX dd d!d"d#d$d%g}|jd}t|d dkr|rdt |d j!d d |d j"t|d }|| }t#j%&|st#'| x|D ]}|j(}|)d&d}||krn|d'}|d }|* }||kr
ttd(|+  |,| d) d- fd*d+tdD } | d'-| }|. }!|,| t/|d | d,}"|"0|! W d Q R X qW t|dkrttdybxT|D ]L}#||#_1||#_2||#_3|
d |#_4|d |#_5||#_6|	|#_7d-||#_|#8  qW t9d-d.iS  t:k
r2 }$ zt|$W d d }$~$X Y nX nt9|j;t<j=d/S d S )0N)r!   r   )r&   r"   r#   r$   r%   r   z%Y-%m-%d %H:%M:%Sr'   r(   r)   r*   r+   r,   r   r-   r.   ZpkrG      Zconfirm_not_modify_auditedZold_delete_files\r=   r0   r:   z{0}/{1}/{2}r8   r/   r1   r2   r3   r4   r5   r6   r7   r;   r<   r>   r?   c             3   s   | ]}t  V  qd S )N)r@   rA   )rB   rC   )rD   r   r   rE   
  s    z.ReimbursementViewSet.update.<locals>.<genexpr>rF   r   rJ   )r   )>r   ReimbursementEditSerializerr!   rL   r   r   rM   rN   rQ   rR   rS   r   rP   rT   r   r   rU   rV   rW   r   r]   r0   ra   r   Zaudit_statusrX   rf   rm   rsplitr   rZ   r[   rY   rH   r&   rh   removeri   rO   rj   r_   r`   rb   rc   rd   re   rg   rk   rl   r"   r$   r%   r*   r+   r.   r   rt   r   ru   ry   r   rz   )%r   r{   r|   r}   r~   r   r"   r$   r%   r   r*   r+   r.   reimbursementold_fileZfiles_namesZold_deleted_filesrC   Zold_deleted_newfiler   r   r   Zdel_filer   r   r   r   r   Z	new_filesr   r   r   r   r   r   r   r   r   )rD   r   r      s    


 .


.









zReimbursementViewSet.updater   F)methodsZdetailc          
   O   s  |j j}|j j}y:ddlm} ddlm}m}	m}
m	} ddl
m} ddlm} ddlm} dd l}t|j j }|jdd}|
jj|j|d	}|jj|j|d
ddd}dd |D }tjj|dd||d B |||jdd}tjj|||d}| |  }|||jdddd||jddddB dd }W n6 tk
r } z| jjj |j d}W d d }~X Y nX |dkr|S | !|}|d k	r| j"|dd}| #|j$S | j"|dd}t%|j$S )Nr   )Q)WorkflowRoler   WorkflowEngineWorkflowInstance)AbstractException)ContentType)NODE_PENDINGZpayrollr   )content_type
company_id)r   Zworkflow_engine__inr&   Zexception_idc             S   s   g | ]}|d  qS )r   r   )rB   ir   r   r   
<listcomp>9  s    z5ReimbursementViewSet.approve_list.<locals>.<listcomp>r   )Zis_next_node)state)node_engine__approver__inZ*workflow_instance__exception__audit_statusZ0workflow_instance__workflow_engine__content_typeorder)Zapprover_employee_idr   Zworkflow_instance_id__inT)Zflat)Z>workflow_abstractException__workflowinstance__nodeinstance__inr   Zaudit_reason)r   )Zmany)&userr&   r   Zdjango.db.modelsr   mysite.workflow.modelsr   r   r   r   Z&mysite.workflow.models.exception_modelr   Z"django.contrib.contenttypes.modelsr   Zmysite.workflow.models_choicesr   astr   Z	flow_roleallrM   Zget_by_natural_keyrN   Zvalues_listZorder_byr   Zfilter_querysetZget_querysetZdeferZdistinctru   modelZexcludeZpaginate_querysetZget_serializerZget_paginated_responser!   r   )r   r{   Zexport_flagr|   r}   r   Zuser_companyr   r   r   r   r   r   r   r   r   Zrolesr   Zworkflow_engineZworkflow_instanceZworkflow_instance_idsZnode_instance_pendingZnode_instance_processedquerysetr   Zpager~   r   r   r   r   %  sX    


$


z!ReimbursementViewSet.approve_listN)F)__name__
__module____qualname____doc__r   r   rM   r   Zselect_relatedr   r
   Zfilter_classZorderingr   ZReimbursementSerializerrK   r   ZReimbursementActionSerializerr   rP   Zextra_headers_translation_dictr    r   r   r   r   r   r   r   r   r      s(   	
uor   ),rQ   rh   rr   r^   rU   r@   Zrest_frameworkr   Zrest_framework.exceptionsr   r   Zrest_framework.responser   Zrest_framework.decoratorsr   Zdjango.confr   Zdjango.utils.translationr   rP   Zmysite.staff.api.utils_classr	   Zmysite.staff.api.filtersr
   Zmysite.payroll.modelsr   Zmysite.staff.apir   Z&mysite.personnel.models.model_employeer   Z)mysite.payroll.models.model_allowancetyper   Z'mysite.payroll.models.model_purposetyper   r   r   r   r   ZListModelMixinZCreateModelMixinZRetrieveModelMixinZUpdateModelMixinZDestroyModelMixinr   r   r   r   r   <module>   s6   