B
    cf                 @   sr  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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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- d\Z.Z/Z0Z1G dd dej2Z3G dd deZ4G dd dej5e"Z6dd Z7d\Z.Z/Z0Z1G dd de8Z9dS )    N)OrderedDict)QSumCaseWhenValueIntegerField)Coalesce)gettext_lazyactivate)	FilterSet)mixinsserializers)action)Response)JsonResponse)NoneSerializer)ReportUtilGenericViewSet)Employee)global_cache)models_choices)STATUS_VALIDSTATUS_RESIGN)PayloadBase)r            c               @   s   e Zd ZejeddddZejddddZejeddddZejed	d
ddZ	ejeddddZ
ejeddddZG dd dZdS ) EmployeeScheduleReportSerializerZemp_field_localizedNameZnicknameT)labelsourceZ
allow_null zdepartment.idZdepartment_field_codezdepartment.dept_codeZemployee_field_departmentzdepartment.dept_nameZposition_field_codezposition.position_codeZemployee_field_positionzposition.position_namec               @   s   e Zd ZeZdZdS )z%EmployeeScheduleReportSerializer.Meta)idZemp_codeZ
first_name	last_name	nick_nameZgenderdepartment_id	dept_code	dept_nameposition_codeposition_nameN)__name__
__module____qualname__r   modelfields r.   r.   EG:\easytimepro\master/mysite/att\api\views\view_report_empschedule.pyMeta0   s   r0   N)r)   r*   r+   r   Z	CharField_r#   r$   r%   r&   r'   r(   r0   r.   r.   r.   r/   r   "   s   r   c               @   sV   e Zd ZejddZejddZejddZdd Zdd Z	d	d
 Z
G dd dZdS )EmployeeScheduleReportFilteremployee_filter)methoddepartment_filterarea_filterc             C   sZ   |rt |dkr|S |d}ydd |D }W n tk
rH   g }Y nX |j|d}|S )Nz-1,c             S   s   g | ]}|rt |qS r.   )str).0ir.   r.   r/   
<listcomp>A   s    z@EmployeeScheduleReportFilter.employee_filter.<locals>.<listcomp>)Zid__in)r8   split
ValueErrorfilter)selfquerysetnamevalueobjsr.   r.   r/   r3   <   s    

z,EmployeeScheduleReportFilter.employee_filterc             C   s   |rt |dkr|S |d}ydd |D }W n tk
rH   g }Y nX |j|d}| jjjsl| jjj}n| jjjj	j
}ddlm} || jjj t || jjjd}|d	kr|ttd
td d
B }|S )Nz-1r7   c             S   s   g | ]}|rt |qS r.   )r8   )r9   r:   r.   r.   r/   r;   L   s    zBEmployeeScheduleReportFilter.department_filter.<locals>.<listcomp>)Zdepartment_id__inr   )
C_ATT_RULE
resign_emp0)status)r8   r<   r=   r>   requestuseris_employeecurrent_company
departmentcompanyr!   mysite.att.global_cacherD   action_initgetr   r   )r?   r@   rA   rB   rC   
company_idrD   rE   r.   r.   r/   r5   G   s"    


z.EmployeeScheduleReportFilter.department_filterc             C   s   |rt |dkr|S |d}ydd |D }W n tk
rH   g }Y nX |j|d}| jjjsl| jjj}n| jjjj	j
}ddlm} || jjj t || jjjd}|d	kr|ttd
td d
B }|S )Nz-1r7   c             S   s   g | ]}|rt |qS r.   )r8   )r9   r:   r.   r.   r/   r;   `   s    z<EmployeeScheduleReportFilter.area_filter.<locals>.<listcomp>)area__inr   )rD   rE   rF   )rG   )r8   r<   r=   r>   rH   rI   rJ   rK   rL   rM   r!   rN   rD   rO   rP   r   r   )r?   r@   rA   rB   rC   rQ   rD   rE   r.   r.   r/   r6   [   s"    


z(EmployeeScheduleReportFilter.area_filterc               @   s   e Zd ZeZdddgZdS )z!EmployeeScheduleReportFilter.Meta	employeesdepartmentsareasN)r)   r*   r+   r   r,   r-   r.   r.   r.   r/   r0   o   s   r0   N)r)   r*   r+   django_filtersZ
CharFilterrS   rT   rU   r3   r5   r6   r0   r.   r.   r.   r/   r2   7   s   r2   c                   s   e Zd ZeZej ZeZ	e
e
dZedededededededd	Z fd
dZdd Zdd Z fddZedgdddd ZdddZ  ZS )EmployeeScheduleReportViewSet)listexportZreport_column_workDayZreport_column_totalDurationHrsZreport_column_breakDurationHrsZreport_column_leaveDurationZreport_column_totalDayOffZreport_column_totalWeekendZreport_column_totalHoliday)total_workdaytotal_durationtotal_breaktotal_leavetotal_dayofftotal_weekendtotal_holidayc                s   | j jjs| j jj}| j jj}| j jj}d| j jji}tt| 	 j
f |}| j jjsi }| rn| |d< | r| |d< | r| |d< |r|j
f |}| }|jtdS d S )NrQ   Zdepartment__inrR   Zposition__in)rG   )rH   rI   rJ   Zget_auth_deptZget_auth_areaZget_auth_posrK   superrW   get_querysetr>   Zis_superuserexistsallZdistinctZexcluder   )r?   Z	auth_deptZ	auth_areaZauth_posZbase_filterr@   filters)	__class__r.   r/   rb      s$    




z*EmployeeScheduleReportViewSet.get_querysetc             C   s   | j | jtS )N)serializer_dictrP   r   r   )r?   r.   r.   r/   get_serializer_class   s    z2EmployeeScheduleReportViewSet.get_serializer_classc             C   s   t d tdS )NZenZmenu_att_scheduleView)r   r1   )r?   r.   r.   r/   get_file_title   s    z,EmployeeScheduleReportViewSet.get_file_titlec                sb   t t| |}xLt|D ]@\}}| r|d d d |dd  d |dd   ||< qW |S )N   -   )ra   rW   get_headers_translation	enumerateisdigit)r?   export_headersZresult_listr:   v)rf   r.   r/   rm      s
    4z5EmployeeScheduleReportViewSet.get_headers_translationrP   F)methodsZdetailc             C   s"  |j ddd| _|j dd | _|j dd| _|j dd| _|j dd| _|j d	d| _|j d
d| _	| j
|dd}t|stdddS |j dd}|dkr| | j|}n^|dkr| || j|}nD|dkr| | j|}n,|dkr| | j|}nttdgdd}|S )Nrp   r    r7   Zexport_style	page_wiseF
start_dateend_datezpdf-page-sizeorientationT)report_flagzno datas)codemsgexport_typeZcsvZxlsZtxtZpdf)r{   zInvalid file formati  )rG   )query_paramsrP   r<   rp   Zgroup_byrs   rt   ru   Zpdf_page_sizerv   rX   lenr   Zexport_to_csvZexport_to_xlsZexport_to_txtZexport_to_pdfr   r   )r?   rH   	data_listZfile_formatZresponser.   r.   r/   rY      s*    	
z$EmployeeScheduleReportViewSet.exportNc       -   
   O   sd  |  |  }|jdd }|jdd }tj|d}tj|dtjddd }g }| |}	| j|	ddj	}
d	d
 |
D }| j
jjrtjj| j
jjd}|jjj}n|jj}t||||}x|
D ]}t|}|d }|d }ttd |d |g }ttd |d |g }ttd |d |g }ttd |d |g }d } } } } } }}t|||frg }xv|D ]n}d}x:|D ]2} t| d |d t| d |d k rd}P qW |st|}!|!d|i ||! qW || t|||||||d |}"|" }#|#j t!"dd |d |d}$||$7 }xt#j$|#t!"ddD ]\}%}&|%%d}'t|&}(tdd
 |(D })|)t&j'krd(dd
 |(D ||'< |t)dd
 |(D 7 }|t)dd
 |(D 7 }|t)dd
 |(D 7 }|d7 }ng }*x8|(D ]0}+|+d  d!kr|+d" d!kr|*|+d#  qW |*r`d(|*||'< |d7 }n|)t&j*krd$t+d% ||'< |d7 }nv|)t&j,krd$t+d& ||'< d'd
 |(D },|,d d k	r|d7 }|d8 }|d7 }n$|)t&j-krfd$t+d( ||'< |d7 }qfW ||d)< ||d*< |d+ |d,< |d+ |d-< ||d.< ||d/< ||d0< || qW |rZ|S | .|S )1Nrt   ru   z%Y-%m-%dr   rx   )daysminutesT)Zmanyc             S   s   g | ]}|d  qS )r!   r.   )r9   r:   r.   r.   r/   r;      s    z6EmployeeScheduleReportViewSet.list.<locals>.<listcomp>)r!   r$   r!   department_schedulesemployee_schedulestemporary_schedulesleavesr   Fempshift_detailatt_date)keyabsent_countsz%Y%m%dc             S   s   g | ]}|d  qS )day_offr.   )r9   tbr.   r.   r/   r;     s    r7   c             S   s   g | ]}|d  qS )time_interval__aliasr.   )r9   r   r.   r.   r/   r;     s    c             S   s   g | ]}|d  pdqS )
break_timer   r.   )r9   r   r.   r.   r/   r;     s    c             S   s    g | ]}t t|d  pg qS )r   )r}   rX   )r9   r   r.   r.   r/   r;     s    c             S   s    g | ]}|d  |d pd qS )durationr   r   r.   )r9   r   r.   r.   r/   r;     s    priorityr   sch_typer   z%sZreport_exceptionDisplay_day_offZreport_exceptionDisplay_weekendc             S   s   g | ]}|d  qS )r   r.   )r9   r   r.   r.   r/   r;     s    Zreport_exceptionDisplay_HolidayrZ   r]   <   r[   r\   r^   r_   r`   )/Zfilter_querysetrb   r|   rP   datetimestrptime	timedeltaZpaginate_querysetZget_serializerdatarH   rI   rJ   r   objectsr!   rL   rM   rK   get_related_paramscopydeepcopyrX   r>   anymaxminupdateappendextendScheduleProcessing
processingsortoperator
itemgetter	itertoolsgroupbystrftimemcZREGULARjoinsumDAY_OFFr1   WEEKENDHOLIDAYZget_paginated_response)-r?   rH   rw   argskwargsr@   rt   ru   ZpayloadZpager~   Zemp_idsr   rK   item_itemrL   employeeZdept_schedulesZemp_schedulesZtmp_schedulesr   r\   r[   Z	work_daysZday_off_daysZweekend_daysZholiday_daysr]   	schedulesZdsZoverlapZesZ_dsZsp	valid_tbsZ
emp_absentr   itemsZrow_keyZ_itemsr   tmpr   Zleave_countr.   r.   r/   rX      s    




&

"





z"EmployeeScheduleReportViewSet.list)N)r)   r*   r+   r   r,   r   rb   r@   r2   Zfilter_classr   rg   r1   Zextra_headers_translation_dictrh   ri   rm   r   rY   rX   __classcell__r.   r.   )rf   r/   rW   t   s$   
"rW   c          
   C   sZ   ddl m} || |||| |||| |||||| |||| ||d}|S )Nr   )utils)r   r   r   r   r   r   )Zmysite.att.calcr   Zdepartment_scheduleZemployee_scheduleZemployee_temp_scheduleZdict_shift_detailZdict_leave_objZdict_absent_obj)Zempsrt   ru   rK   r   r   r.   r.   r/   r   1  s    r   c               @   sp   e Zd Zdd Zedd Zdd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd ZdS )r   c	       	      C   sf   || _ || _|| _|| _|| _|| _|| _|  | _| 	 | _
t | _|  | _| || _i | _d S )N)rt   ru   r   rL   r   tmp_schr   get_company_idrQ   get_att_ruleatt_rulesetholiday_dateget_employee_holidaysholidaysget_period_leavesperiod_leavesshift_weekend)	r?   rt   ru   r   rL   scheduler   r   r   r.   r.   r/   __init__C  s    


zScheduleProcessing.__init__c       	      C   s   t ||  jd}d\}}|dkr>d}d}||d | d  }nN|dkr`| }|d d }d}n,|dkr|jd }d}t |j| j | d}|| }||| | |  }||fS )Nr   )r   r   r      r      )r   r   weekdayZdaymonth)	Zschedule_startrt   cycleunitr   ZbeginZ	unit_daysr   Z
cycle_daysr.   r.   r/   get_start_and_intervalR  s"    
z)ScheduleProcessing.get_start_and_intervalc             C   s   t jj| jdjjj}t|S )N)r!   )r   r   rP   r   rL   rM   r!   r8   )r?   rQ   r.   r.   r/   r   f  s    z!ScheduleProcessing.get_company_idc             C   s2   t j| j}t j| j}|r.|| j|}|S )N)r   rD   rP   rQ   ZC_DEPT_ATT_RULErL   )r?   r   Z
dept_rulesr.   r.   r/   r   j  s
    zScheduleProcessing.get_att_rulec             C   s   t j| j}|di }tjj| jdj}|rH||ji }|	| xX|
 D ]L\}}|dd}|d}x,t|D ] }	|tj|	d }
| j|
 qzW qRW |S )Nr   )r!   Zduration_dayrt   )r   )r   Z	C_HOLIDAYrP   rQ   r   r   r   locationr!   r   r   ranger   r   r   add)r?   Zall_holidaysr   r   Zlocation_holidayskrq   Zduration_daysrt   r:   r   r.   r.   r/   r   q  s    

z(ScheduleProcessing.get_employee_holidaysc             C   s   |si S g }xr|D ]j}|d   }xX||d   krzt|}|||d |d   d || |tjdd7 }q$W qW dd t	|t
dD }|S )	N
start_timeend_time)dater   r   )r   c             S   s   i | ]\}}t ||qS r.   )rX   )r9   r   r   r.   r.   r/   
<dictcomp>  s    z8ScheduleProcessing.get_period_leaves.<locals>.<dictcomp>r   )r   r   r   r   Ztotal_secondsr   r   r   r   r   r   r   )r?   r   daily_leavesr   Z_startr   r   r.   r.   r/   r     s    

 
z$ScheduleProcessing.get_period_leavesc                s0   | j  d d }|r,t fdd|}|S d S )Nr   c                s$   t  d | d t d | d k S )Ncheck_inr   	check_outr   )r   r   )l)r   r.   r/   <lambda>      z5ScheduleProcessing.get_daily_leaves.<locals>.<lambda>)r   rP   r>   )r?   r   r   Z_leavesr.   )r   r/   get_daily_leaves  s    z#ScheduleProcessing.get_daily_leavesc             C   s   g }x| j D ]}|d }|d }||kr8|tjdd7 }|| j}t|}|tj|dd }|tj|dd }|tj|dd }	|tj|d	d }
|| |||d
|||	|
d	 |	| qW |S )zGet temporary timeintervalsr   r   r   )r   in_ahead)r   in_above	out_ahead	out_abover   )	r   r   r   
cross_daysr   in_startin_end	out_startout_end)
r   r   r   r   r   r   popr   r   r   )r?   tbsr   r   r   r   _tbr   r   r   r   r.   r.   r/   get_temporary_time_tables  s$    


z,ScheduleProcessing.get_temporary_time_tablesc          !   C   s   g }|rddddd| j |< |s*|| jks.|rd |d d dtddddddddddtddddddddddddddddddd d g}|S )Nr   )ZpolicyZlv1Zlv2Zlv3r   ) shift_id	day_indexZtime_interval_idr   Ztime_interval__work_dayr   r   categoryr   r   r   r   Zduty_durationr   Zchange_timeZ
allow_lateZallow_earlyZrequires_inZrequires_outZearly_inZmin_early_inZlate_outZmin_late_outZot_lvZot_lv1Zot_lv2Zot_lv3Zmultiple_punchZfunc_keyZperiod_typeZperiodr   )r   r   r   time)r?   	daily_tbscurrent_day	cur_indexZunschedule_tbr.   r.   r/   unscheduled_days_tbs  s    


z'ScheduleProcessing.unscheduled_days_tbsc             C   s0  g }x$| j D ]}t|d | j g}| |d ||d |d \}}| j|d g }t|d | j g}|d }dd t	j
|td	d
D }	x||kr&|	|g }
|
r|
r|
d dr| |
||}
x|
D ]}t|}tj||d }|tj|d d }|tj|dd }|tj|dd }|tj|dd }|tj|dd }|| j}||dd|||||||d
 || qW |j}|tjdd7 }|d dkr|j|kr|d | dkr|d|d d  k r|dkr|d|  }n|d }|d | }qW qW |S )Nrt   r   r   r   ru   
auto_shiftc             S   s   i | ]\}}t ||qS r.   )rX   )r9   r   r   r.   r.   r/   r     s    z6ScheduleProcessing.get_time_tables.<locals>.<dictcomp>r   )r   r   Zweekend_dayr   r   )r   r   r   r   r   r   r   )
r   r   r   r   r   r   r   r   r   r   )r      )r   r   rt   r   r   r   rP   r   ru   r   r   r   r   r   r   r   r   Zcombiner   r   r   r   r   r   )r?   r   r   r   r   Z	cycle_lenr   ru   r   Zdaily_shiftr   r   r   r   r   r   r   r   r   r   Zcurrent_monthr.   r.   r/   get_time_tables  sL    



(
z"ScheduleProcessing.get_time_tablesc                s  d }g }| j }i }|| xtj|tddD ]\}}dd |D }|jtddd |d d  t fdd	|}d }	xh|D ]^}
|rt|d |
d t	|d
 |
d
 k rq|	rt|	d |
d t	|	d
 |
d
 k r|	d dksq|
|	 | |
|
d< | j|
d d |
d< |r<|t|
d  d nd |
d< |
d sn|rf||
d d phd |
d< |
d dkr|
d dkr|
d dkr|
d dks|
d rd|
d< n|
d rd|
d< ||
 |
}	|
d dkr|
}qW q4W |S )Nr   )r   c             S   s   g | ]}|qS r.   r.   )r9   xr.   r.   r/   r;     s    z8ScheduleProcessing.time_table_filter.<locals>.<listcomp>r   r   r   c                s   | d  kS )Nr   r.   )y)r   r.   r/   r     r   z6ScheduleProcessing.time_table_filter.<locals>.<lambda>r   r   r   r   Zholidayweekendr   Z	work_typer   r   r   )r   r   r   r   r   r   r   r>   r   r   remover   r   rP   r8   r   r   )r?   r   Zprer   r   r   r   r   Z
_daily_tbsZpre_tbr   r.   )r   r/   time_table_filter  sB    
"((
&
 8



z$ScheduleProcessing.time_table_filterc             C   sN   t  }|  }|  }|r$|| |r2|| |jtdd | |S )Nr   )r   )rX   r   r   r   r   r   r   r   )r?   Zemployee_tbsZnormal_time_tablesZtmp_time_tablesr.   r.   r/   r     s    

zScheduleProcessing.processingN)r)   r*   r+   r   staticmethodr   r   r   r   r   r   r   r   r   r   r   r.   r.   r.   r/   r   A  s   	-%r   ):r   r   r   r   rV   collectionsr   Zdjango.db.modelsr   r   r   r   r   r   Zdjango.db.models.functionsr	   Zdjango.utils.translationr
   r1   r   Zdjango_filters.rest_frameworkr   Zrest_frameworkr   r   Zrest_framework.decoratorsr   Zrest_framework.responser   Zdjango.httpr   Zmysite.att.api.serializersr   Zmysite.att.api.utils_classr   Zmysite.personnel.modelsr   Z
mysite.attr   r   r   Zmysite.admin.modelsr   r   Zmysite.att.models.model_payloadr   ZNORMALr   r   r   ZModelSerializerr   r2   ZListModelMixinrW   r   objectr   r.   r.   r.   r/   <module>   s8    = >