B
    bc.                 @   s<  d dl m Z  d dlZd dlmZmZmZmZmZmZ d dl	m
Z
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mZ d dlmZ d dl m!Z! G dd deZ"G dd dej#Z$G dd de!ej%ej&Z'G dd dej(Z)G dd deZ*G dd de!ej%ej+Z,dS )    )datetimeN)QValue	TextFieldWhenCase	Aggregate)responsestatus)serializersmixins)	FilterSet)gettext_lazy)Response)viewsets)PayloadBase)att_calculate)STATUS_VALIDSTATUS_RESIGN_PENDING)Transaction)APPCustomizeResponseModelMixinc                   s@   e Zd Z fddZ fddZ fddZ fddZ  ZS )	GroupContactc                sH   d| _ d| _tt| j||f|\}}|dd}|jddd}||fS )zZ
        SQL Server 2017 Support STRING_AGG
        STRING_AGG(column, separator)
        ZSTUFFz%(function)s((
            SELECT ',' + %(expressions)s
            FROM [{table}] as {copy}
            WHERE {copy}.[emp_id] = [{table}].[emp_id]
            FOR xml path('')
        ), 1, 1, '')z[att_payloadbase]z{copy}Zatt_payloadbasea)tablecopy)functiontemplatesuperr   as_sqlreplaceformat)selfcompiler
connectionextra_contextsqlparams)	__class__ AG:\easytimepro\master/mysite/mobile\api_rest\views\view_report.pyr      s    zGroupContact.as_sqlc       	         sj   ddl m} |d}|r"|d p$d}|dkr<d| _d| _nd| _d	| _tt| j||f|\}}||fS )
Nr   )	sql_utilsz7select DISTINCT(VERSION) from product_component_version z11.0ZlistaggzB%(function)s(%(expressions)s, ',') within group(order by att_date)Z	WM_CONCATz%(function)s(%(expressions)s))mysiter*   Zp_query_oner   r   r   r   r   )	r!   r"   r#   r$   r*   Zrowsversionr%   r&   )r'   r(   r)   	as_oracle)   s    
zGroupContact.as_oraclec                s.   d| _ d| _tt| j||f|\}}||fS )NZGROUP_CONCATz%(function)s(%(expressions)s))r   r   r   r   r   )r!   r"   r#   r$   r%   r&   )r'   r(   r)   as_mysql6   s    zGroupContact.as_mysqlc                s.   d| _ d| _tt| j||f|\}}||fS )NZARRAY_TO_STRINGz-%(function)s(ARRAY_AGG(%(expressions)s), ','))r   r   r   r   r   )r!   r"   r#   r$   r%   r&   )r'   r(   r)   as_postgresql<   s    zGroupContact.as_postgresql)__name__
__module____qualname__r   r.   r/   r0   __classcell__r(   r(   )r'   r)   r      s   r   c               @   s,   e Zd Ze Ze Ze Zdd ZdS )AttCalculateSerializerc          
   C   s   |d }|d }|d }y2t |d|d< t |d|d< |d|d< W n4 tk
r~ } ztd}t|W d d }~X Y nX |S )N
start_dateend_date	employeesz%Y-%m-%d,zQAttCalculate format error. start_date/end_date:%Y-%m-%d; employees: emp_id,emp_id)r   strptimesplit	Exception_r   ZValidationError)r!   Zattrsr6   r7   r8   emsgr(   r(   r)   validateH   s    zAttCalculateSerializer.validateN)	r1   r2   r3   r   	CharFieldr6   r7   r8   r@   r(   r(   r(   r)   r5   C   s   r5   c               @   s    e Zd ZeZdd Zdd ZdS )AttCalculateViewc             O   sB   | j |jd}|jdd |j}| || tjddgitjdS )N)dataT)Zraise_exceptionmessage
successful)r
   )	get_serializerrC   Zis_validZvalidated_datado_calr	   r   r
   HTTP_200_OK)r!   requestargskwargs
serializerZ
valid_datar(   r(   r)   createY   s
    zAttCalculateView.createc             C   sJ   |j j}|d }|d }|d }t|||t|d tjddgitjdS )Nr6   r7   r8   )
company_idrD   rE   )r
   )userrN   r   strr	   r   r
   rH   )r!   rI   ZdatasrN   r6   r7   r8   r(   r(   r)   rG   `   s    zAttCalculateView.do_calN)r1   r2   r3   r5   serializer_classrM   rG   r(   r(   r(   r)   rB   V   s   rB   c               @   s   e Zd ZejddZejdddZejdddZejdddd	Zejd
ddd	Z	ejdddd	Z
ejdddd	Zejdddd	Zejdddd	Zejdddd	Zejdddd	Zejdddd	Ze ZG dd dZdS )EmployeeReportSerializerzemp.emp_code)sourcezemp.first_nameT)rS   
allow_nullzemp.last_namezbreak_time.break_outr+   )rS   rT   defaultzbreak_time.break_inzbreak_time.break_durationr   zovertime.normal_ot_displayzovertime.weekend_ot_displayzovertime.holiday_ot_displayzovertime.ot_lv1zovertime.ot_lv2zovertime.ot_lv3c               @   s   e Zd ZeZdZdS )zEmployeeReportSerializer.Meta)emp_code
first_name	last_nameatt_dateZcheck_inZ	check_outclock_in	clock_outZ
total_time	break_outbreak_inbreak_durationZleave	normal_ot
weekend_ot
holiday_otot_lv1ot_lv2ot_lv3r
   N)r1   r2   r3   r   modelfieldsr(   r(   r(   r)   Metax   s   rg   N)r1   r2   r3   r   rA   rV   rW   rX   r\   r]   r^   r_   r`   ra   rb   rc   rd   r
   rg   r(   r(   r(   r)   rR   i   s   rR   c                   s   e Zd ZejddZejddZejddZejdddZ	ejdddZ
ejd	dZd
d Zdd Zdd Ze fddZG dd dZ  ZS )ReportGenericFilteremployee_filter)methoddepartment_filterZarea_filterrY   Zgte)Z
field_nameZlookup_exprZltesearchItem_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-1r9   c             S   s   g | ]}|rt |qS r(   )rP   ).0ir(   r(   r)   
<listcomp>   s    z7ReportGenericFilter.employee_filter.<locals>.<listcomp>)Z
emp_id__in)rP   r;   
ValueErrorfilter)r!   querysetnamevalueobjsr(   r(   r)   ri      s    

z#ReportGenericFilter.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}ddlm} | jjjsx| jjj	}n| jjj
jj}|| t ||d}|d	kr|ttd
td d
B ttd
B }|S )Nz-1r9   c             S   s   g | ]}|rt |qS r(   )int)rm   rn   r(   r(   r)   ro      s    z9ReportGenericFilter.department_filter.<locals>.<listcomp>)Zemp__department_id__inr   )
C_ATT_RULE
resign_emp0)Zemp__status)rP   r;   rp   rq   Zmysite.att.global_cacherw   rI   rO   is_employeecurrent_company
departmentcompanyidZaction_initgetr   r   r   )r!   rr   rs   rt   ru   rw   rN   rx   r(   r(   r)   rk      s$    



 z%ReportGenericFilter.department_filterc             C   sV   |s|S | j jjs| j jj}n| j jjjj}|j|d}|t|dt|dB }|S )N)emp__company_id)Zemp__first_name__icontains)Zemp__emp_code__icontains)	rI   rO   rz   r{   r|   r}   r~   rq   r   )r!   rr   rs   rt   rN   r(   r(   r)   rl      s    
z%ReportGenericFilter.searchItem_filterc                s   t t| j}|jddS )NT)Zemp__isnull)r   rh   qsZexclude)r!   rr   )r'   r(   r)   r      s    zReportGenericFilter.qsc               @   s   e Zd ZeZddddgZdS )zReportGenericFilter.Metar8   departmentsr6   r7   N)r1   r2   r3   r   re   rf   r(   r(   r(   r)   rg      s   rg   )r1   r2   r3   django_filtersZ
CharFilterr8   r   ZareasZ
DateFilterr6   r7   Z
searchItemri   rk   rl   propertyr   rg   r4   r(   r(   )r'   r)   rh      s   rh   c               @   s0   e Zd ZeZeZeZdd Z	dd Z
dd ZdS )EmployeeReportViewc             C   s   t jj| jjjdd}|S )N)r   rY   )r   objectsrq   rI   rO   rN   Zorder_by)r!   rr   r(   r(   r)   get_queryset   s    zEmployeeReportView.get_querysetc             C   s   i }t ttdtddtdtddtdtddtdtdd	tdtd
dtdtddtdtddtdtddtdtdd	t d|d< |jf |}|S )N   ZWO)Zday_offthen      Hr   ZHD)Zhalf_dayr   L)Z	leave__gtr   A)Z
absent__gtr   ZLT)Zlate__gtr   ZEL)Zearly_leave__gtr   P)Zduty_worked__gtr   )Zoutput_fieldr
   )r   r   r   r   r   Zannotate)r!   rr   valuesr(   r(   r)   annotate_queryset   s"    
z$EmployeeReportView.annotate_querysetc             O   s  |  |  }| |}| |}|d k	r| j|dd}|j}| jjj}xV|D ]L}	d|	d< d|	d< d|	d< d|	d< |	d d kr|	d	 d krn*|	d d krd
|	d< n|	d	 d krd|	d< |	d d k	r0t	j
j||	d |	d d}
|
 r0|
d j|	d< |
d jdkr(|
d jd k	r(|
d jjnd|	d< |	d	 d k	rRt	j
j||	d |	d	 d}
|
 rR|
d j|	d< |
d jdkr|
d jd k	r|
d jjnd|	d< qRW | |jS | j|dd}t|jS )NT)Zmanyr+   Zcheckin_punch_typeZcheckout_punch_typeZcheckin_punched_deviceZcheckout_punched_devicerZ   r[   ZMIr
   ZMOrV   )rN   rV   Z
punch_timer   r   )Zfilter_querysetr   r   Zpaginate_querysetrF   rC   rI   rO   rN   r   r   rq   existsrS   ZterminalaliasZget_paginated_responser   )r!   rI   rJ   rK   rr   ZpagerL   resultrN   ZrDataZtransaction_detailsr(   r(   r)   list   s>    





48zEmployeeReportView.listN)r1   r2   r3   rR   rQ   rh   Zfilter_classr   re   r   r   r   r(   r(   r(   r)   r      s   r   )-r   r   Zdjango.db.modelsr   r   r   r   r   r   Zrest_frameworkr	   r
   r   r   Zdjango_filters.rest_frameworkr   Zdjango.utils.translationr   r=   Zrest_framework.responser   Zmysite.mobile.api_restr   Zmysite.att.modelsr   Zmysite.att.calc.viewsr   Zmysite.admin.modelsr   r   Zmysite.iclock.modelsr   Z(mysite.mobile.api_rest.app_customize_mixr   r   Z
Serializerr5   ZGenericViewSetZCreateModelMixinrB   ZModelSerializerrR   rh   ZListModelMixinr   r(   r(   r(   r)   <module>   s&    -=