B
    bdI              	   @   s  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	 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 d dlmZ d dlmZ d dlmZmZm Z m!Z! G dd deej"Z#G dd deej"Z$G dd de	j%Z&G dd de	j%Z'G dd de	j(Z)G dd dejj*Z+G dd deej,ej"Z-G dd deej.ej/ej0ej"ej1Z2G d d! d!e	j%Z3G d"d# d#eej4Z5dS )$    N)gettext_lazy)Q)mixinsserializers)status)Response)viewsets)Leave)models_choices)stamp2datetime)
leave_save)C_LEAVE_CLASS)LeaveCategory)APPCustomizeResponseModelMixin)AttScheduleShiftDetailTempScheduleDepartmentSchedulec               @   s   e Zd Zdd ZdS )EmployeeLeaveBalanceViewc             C   s  ddl m} |j}|j}ddlm} ddlm} i }|jj|j	|d}|
 r|jj|j	|dd}	|d j|d< |d j|d< |d j|d	< |d j|d
< |d j|d< |d j|d< t|	r|	d d nd}
tjj|j	|djdddjdd}t||}i }x:| D ].}tjj||d }||j|| i qW i }xZ|
 | B D ]F}||
kr||g |
|  ||kr\||g ||  q\W t|  }dd |D }||d< d|i}t!|t"j#dS dt$di}t!|t"j%dS d S )Nr   )Counter)LeaveSchedule)LeaveSettings)employee_idemployee__company_idZleave_detailsZ
start_dateZend_dateZtotal_leave_daysZleave_pendingZleave_allowed_per_monthZcarry_forward Zcategory_idT)Zflat   )leave_payment_type)id
company_idc          	   S   sn   g | ]f}|d  |d d  t |d dkr4|d d nd |d d  t |d dkr\|d d nd  ddqS )r   r   )ZNumber_of_Leaves_AvailableZNumber_of_Leaves_UsedZRemaining_Leaves)Z
Leave_nameleave_balance)len).0Zchoice r"   @G:\easytimepro\master/mysite/mobile\api_rest\views\view_leave.py
<listcomp>4   s   z1EmployeeLeaveBalanceView.list.<locals>.<listcomp>ZResult)r   Zno_leave_balnace_details_found)&collectionsr   userr   mysite.att.modelsr   r   objectsfilterr   existsvaluesZeffective_dateZincrement_datedaysr   Zmax_leave_per_monthZcarry_forward_limitjsonloadsr	   Zvalues_listexcludedictkeysr   firstupdatecategory_name
setdefaultappendlistitemsr   r   HTTP_200_OK_HTTP_406_NOT_ACCEPTABLE)selfrequestr   empr   r   r   dataZ
leave_datachoicesZleave_details_dictleavesr   Zused__leave_dictZeachcategoryresultkeyZfinal_balanceZfinal_balance_detailsresponser"   r"   r#   r7      sH    
$
 
 zEmployeeLeaveBalanceView.listN)__name__
__module____qualname__r7   r"   r"   r"   r#   r      s   r   c               @   s   e Zd Zdd ZdS )LeaveCategoryViewc          	   C   s  |j }|j}i  }}tt|}|r6dd |D }ntjj|ddd}dd |D |d< t	jj|t
j
  t
j
  dj}tjj|t
j
  t
j
  d	d
j}tjj|jjt
j
  t
j
  dj}	| rt	jj|t
j
  t
j
  d}
|
j}tjj|d	dd j}t
j
t

ddd |j}|j}|t
j|d }|j}|j}d|d|d||dd|d|dd|d|dd|d< d|d< t|tjdS | rtjj|t
j
  t
j
  d	d
}t
j
t

ddd |d jj}|d jj}|t
j|d }|d jj}|d jj}d|d|d||dd|d|dd|d|dd|d< d|d< t|tjdS |	 rtjj|jjt
j
  t
j
  d}|j}tjj|d	dd j}t
j
t

ddd |j}|j}|t
j|d }|j}|j}d|d|d||dd|d|dd|d|dd|d< d|d< t|tjdS i }d|d< t d|d< t|tj!dS d S )Nc             S   s   g | ]}|j |jd qS ))r   r4   )r   r4   )r!   objr"   r"   r#   r$   I   s    z*LeaveCategoryView.list.<locals>.<listcomp>)r   r   r4   c             S   s   g | ]}|d  |d dqS )r   r4   )codenamer"   )r!   rJ   r"   r"   r#   r$   L   s    Zleave_category)employeestart_date__lteend_date__gteF)rM   start_time__dateend_time__dateZtime_interval__isnull)Zdepartment_idrN   rO   )shiftZtime_interval_id__isnullr   i  r   )Zminutesz{}-{}z%H:%M:%S)Zfirst_half_day_intervalZsecond_half_day_intervalZsingle_day_intervalZmultiple_day_interval
leave_typeZ
successfulrC   )r   Zfailedz>you are not assigned with a schedule at this moment contact HRmessage)"r&   r   r   getstrr   r(   r)   r+   r   datetimeZnowdater*   r   r   Z
departmentr   rR   r   Ztime_intervalZcombinein_timedurationZ	timedeltafirst_half_out_timesecond_half_in_timeformatstrftimer   r   r9   r:   r;   )r<   r=   r>   r   describer@   rA   Zemp_schedule_is_existsZtemp_schedule_is_exitsZdepartment_schedule_is_existsZemp_scheduleZ	emp_shiftZemp_time_intervalrY   rZ   Zout_timer[   r\   Ztemp_scheduleZdepartment_scheduleZ
dept_shiftZdept_time_intervalr"   r"   r#   r7   C   s    
zLeaveCategoryView.listN)rF   rG   rH   r7   r"   r"   r"   r#   rI   B   s   rI   c               @   s   e Zd ZG dd dZdS )LeaveListSerializerc               @   s   e Zd ZeZdZdS )zLeaveListSerializer.Meta__all__N)rF   rG   rH   r	   modelfieldsr"   r"   r"   r#   Meta   s   rd   N)rF   rG   rH   rd   r"   r"   r"   r#   r`      s   r`   c               @   sR   e Zd Ze Ze Ze Ze Z	e Z
e Zdd ZG dd dZdS )LeaveCreateSerializerc             C   sT   |d }|d }t |}t |}||kr@dtd}t|||d< ||d< |S )Nstartendz{0}z%end time can not less then start time)r   r]   r:   r   ValidationError)r<   attrsrf   rg   Z
start_timeZend_timerT   r"   r"   r#   validate   s    
zLeaveCreateSerializer.validatec               @   s   e Zd ZeZdZdS )zLeaveCreateSerializer.Meta)rS   rf   rg   r   day_typeapply_reasonN)rF   rG   rH   r	   rb   rc   r"   r"   r"   r#   rd      s   rd   N)rF   rG   rH   r   	CharFieldrS   rf   rg   IntegerFieldr   rl   SerializerMethodFieldrk   rj   rd   r"   r"   r"   r#   re      s   re   c               @   s*   e Zd Ze ZejdddZdd ZdS )LeaveApproveSerializerFT)required
allow_nullc             C   s.   |d }|t jt jfkr*td}t||S )Napprove_statusZ!param_approve_status_out_of_range)r
   ZAUDIT_SUCCESSREFUSEr:   r   rh   )r<   ri   rs   rT   r"   r"   r#   rj      s
    
zLeaveApproveSerializer.validateN)	rF   rG   rH   r   rn   rs   rm   remarkrj   r"   r"   r"   r#   rp      s   rp   c               @   sn   e Zd 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dZ	ej
ddZej
d	dZG d
d dZdS )EmployeeLeaveFilterz
    Leave Filter Class
    rP   Zgte)
field_nameZlookup_exprZlterQ   Zemployee__emp_code)rw   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EmployeeLeaveFilter.MetarM   rB   start_time_gtestart_time_lteend_time_gteend_time_lteZaudit_statusemp_code
first_nameN)rF   rG   rH   r	   rb   rc   r"   r"   r"   r#   rd      s   rd   N)rF   rG   rH   __doc__django_filtersZ
DateFilterrx   ry   rz   r{   Z
CharFilterr|   r}   rd   r"   r"   r"   r#   rv      s   rv   c               @   s&   e Zd ZeZej Ze	Z
dd ZdS )	LeaveViewc             C   s   | j jj}tjj|d}|S )N)r   )r=   r&   r   r	   r(   r)   )r<   r   querysetr"   r"   r#   get_queryset   s    
zLeaveView.get_querysetN)rF   rG   rH   r`   serializer_classr	   r(   allr   rv   filter_classr   r"   r"   r"   r#   r      s   
r   c               @   sR   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dd ZdS )EmployeeLeaveView)Zretriever7   createZapprovec             C   s   | j jj}tjj|d}|S )N)r   )r=   r&   r   r	   r(   r)   )r<   r   r   r"   r"   r#   r      s    
zEmployeeLeaveView.get_querysetc             C   s   | j | jd S )N)serializer_class_dictrU   action)r<   r"   r"   r#   get_serializer_class  s    z&EmployeeLeaveView.get_serializer_classc       	      O   s~   | d|jj}| jjj}tjj||dd}| 	|}| 
|}|d k	rf| j|dd}| |jS | j|dd}t|jS )NZemployee_pk)r   r   z-apply_timeT)Zmany)rU   r&   Zpkr=   r   r	   r(   r)   Zorder_byZfilter_querysetZpaginate_querysetget_serializerZget_paginated_responser?   r   )	r<   r=   argskwargsr>   r   r   Zpage
serializerr"   r"   r#   r7     s    


zEmployeeLeaveView.listc       	   
   O   s   | j |jd}|jdd | ||j}t|tr6|S | |}y<|d k	r`d|i}t|tj	dS dt
di}t|tjdS W n4 tk
r } zd|i}t|tjdS d }~X Y nX d S )N)r?   T)Zraise_exceptionZleave_id_details)r   rT   Z,please_check_with_schedule_details_and_apply)r   r?   Zis_validleave_apply_checkZvalidated_data
isinstancer   perform_creater   ZHTTP_201_CREATEDr:   r;   	Exception)	r<   r=   r   r   r   datasr?   rE   er"   r"   r#   r     s    

zEmployeeLeaveView.createc             C   s(   yt f |}|S  tk
r"   Y nX d S )N)r   r   )r<   r   Zobj_idr"   r"   r#   r   %  s
    
z EmployeeLeaveView.perform_createc       
      C   s   |d }|d }i }|j }tjtjg}tjj|jdt	|dt	|dB j|d}|r~d
td| }	td	|	gitjd
S ||d< ||d< |d |d< |jd|d< |j|d< t|j|d< |d |d< |d |d< |S )Nrf   rg   )r   )Zstart_time__gt)Zend_time__lt)Zaudit_status__inz{0}Zleave_time_overlaprT   )r   rS   rk   r   r   rl   ru   r   )r&   r
   rt   ZCANCEL_AUDIT_SUCCESSr	   r(   r)   r   r/   r   r]   r:   r   r   r;   r?   rU   rV   r   )
r<   r=   r   rf   rg   Z	obj_datasZapplierZselect_statusZ	tmp_leaver_   r"   r"   r#   r   ,  s&    
z#EmployeeLeaveView.leave_apply_checkN)rF   rG   rH   rv   r   r`   re   rp   r   r	   rb   r   r   r7   r   r   r   r"   r"   r"   r#   r      s   r   c               @   s   e Zd ZejedddZejddZe Z	ejedddd	Z
e Ze Zejed
ddd	Ze ZejeddZdd Zdd Zdd ZG dd dZdS )EmployeeTeamLeaveSerializerZemp_field_employeeCodezemployee.emp_code)labelsourcezemployee.first_name)r   Zstaff_leave_leaveCategoryzcategory.category_nameT)r   r   rr   Zapproval_field_approvalStatusZget_audit_status_displayZleave_field_leavepayment_type)r   c             C   s   |j jsdS dj|j jjdS )Nr   z/files/{path})path)rM   photor]   rL   )r<   rJ   r"   r"   r#   	get_photoO  s    z%EmployeeTeamLeaveSerializer.get_photoc             C   sB   |j }d }|dkrtd}n"|dkr.td}n|dkr>td}|S )Nr   zFull Day   z
First Half   zSecond Half)rk   r:   )r<   rJ   r,   rk   r"   r"   r#   get_day_typeT  s    

z(EmployeeTeamLeaveSerializer.get_day_typec             C   s0   |j }d }|dkrtd}n|dkr,td}|S )Nr   z
Paid Leaver   zUnpaid Leave)r   r:   )r<   rJ   r   leave_paymentr"   r"   r#   get_leave_payment_  s    
z-EmployeeTeamLeaveSerializer.get_leave_paymentc               @   s   e Zd ZeZdZdS )z EmployeeTeamLeaveSerializer.Metara   N)rF   rG   rH   r	   rb   rc   r"   r"   r"   r#   rd   i  s   rd   N)rF   rG   rH   r   rm   r:   r|   rL   ro   r   r4   ZReadOnlyFieldZlast_approverZworkflow_current_state_nameZaudit_status_stringrk   r   r   r   r   rd   r"   r"   r"   r#   r   B  s   


r   c               @   s   e Zd ZeZeZeZdZ	dS )EmployeeTeamLeaveViewsTN)
rF   rG   rH   r   r   rv   r   r	   rb   Zteam_member_typer"   r"   r"   r#   r   n  s   r   )6rW   r   Zdjango.utils.translationr   r:   Zdjango.db.modelsr   Zrest_frameworkr   r   r   Zrest_framework.responser   r-   Zmysite.mobile.api_restr   r'   r	   Z
mysite.attr
   Zmysite.mobile.utilsr   Z mysite.mobile.services.app_leaver   Zmysite.att.global_cacher   Z%mysite.att.models.model_leavecategoryr   Z(mysite.mobile.api_rest.app_customize_mixr   r   r   r   r   ZGenericViewSetr   rI   ZModelSerializerr`   re   Z
Serializerrp   Z	FilterSetrv   ZNotificationMixinr   ZListModelMixinZCreateModelMixinZRetrieveModelMixinZApproveFlowMixinr   r   ZGenericApprovalListViewr   r"   r"   r"   r#   <module>   sB   +eM,