B
    Ycr                 @   s`  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mZ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 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ddddddddddddddd d!d"d#Z$d$d%d&d'd(d)d*d+d,d-d.d/d0Z%d ed1fd2ed3fd4ed5fd6ed7fd8ed9fd:ed;fd<ed=ffZ&d>d? Z'd@dA Z(dBdC Z)dDdE Z*dFdG Z+dHdI Z,dJdK Z-dLdM Z.dwdOdPZ/edQdRdxdSdTZ0edQdRdydUdVZ1dWdX Z2dYdZ Z3dzd[d\Z4d{d]d^Z5d_d` Z6d|dadbZ7dcdd Z8dedf Z9dgdh Z:didj Z;dkdl Z<dmdn Z=dodp Z>dqdr Z?dsdt Z@dudv ZAdS )}    N)	lru_cache)Decimal)datedatetime	timedelta)gettext_lazy)Q)models_choices)department_scheduleemployee_schedule)ShiftDetail)TempSchedule)TimeInterval)HolidayAttSchedule)LeaveCategory)AdminRuntimeWarning)Transactionz%Y-%m-%dz%Y/%m/%dz%Y.%m.%dz%d/%m/%Yz%d-%m-%Yz%m/%d/%Yz%m-%d-%Yz%y-%m-%dz%y/%m/%dz%d/%m/%yz%y.%m.%dz%Y%m%dz%Y%d%mz%m%d%Yz%d%m%Yz%y%m%dz%y%d%mz%m%d%yz%d%m%y)123456789101112Z13Z14Z15Z16Z17Z18Z19z%H:%Mz%I:%Mz%H:%M %pz%I:%M %pz%H:%M:%Sz%I:%M:%Sz%H:%M:%S %pz%I:%M:%S %pz%H%Mz%I%Mz%H%M%Sz%I%M%S)r   r   r   r   r   r   r   r   r   r   r   r   Zweekday_option_monday   Zweekday_option_tuesday   Zweekday_option_wednesday   Zweekday_option_thursday   Zweekday_option_friday   Zweekday_option_saturday   Zweekday_option_sundayc              C   s2   ddl m}  |  }|js"|j}n|jj}t|S )Nr   )threadlocals)Zmysite.baser&   Zget_current_userZis_employeeZcurrent_companycompanyidstr)r&   Zcurrent_user
company_id r+   )G:\easytimepro\master/mysite/att\utils.pyget_current_company_idH   s    r-   c             C   s"   ddl m} || }|d }|S )Nr   )
C_ATT_RULEitems)mysite.att.global_cacher.   get)r*   r.   Zatt_ruler/   r+   r+   r,   get_report_settingR   s    
r2   c             C   s>   ddl m} t }||}|dd}tt| }| |S )Nr   )r.   
short_dater    )r0   r.   r-   r1   SHORT_DATE_FORMATr)   strftime)valr.   r*   report_settingr3   _formatr+   r+   r,   short_date_formatY   s    
r9   c             C   sZ   ddl m} t }||}|dd}|dd}tt| d tt|  }| |S )Nr   )r.   r3   r    
short_time )r0   r.   r-   r1   r4   r)   SHORT_TIME_FORMATr5   )r6   r.   r*   r7   r3   r:   r8   r+   r+   r,   short_date_and_time_formatb   s    
r=   c             C   s8   ddl m} ||}|dd}tt| }| |S )Nr   )r.   r3   r    )r0   r.   r1   r4   r)   r5   )r6   r*   r.   r7   r3   r8   r+   r+   r,   short_date_format_for_celeryl   s
    
r>   c             C   s>   ddl m} t }||}|dd}tt| }| |S )Nr   )r.   r:   r    )r0   r.   r-   r1   r<   r)   r5   )r6   r.   r*   r7   r:   r8   r+   r+   r,   short_time_formatt   s    
r?   c              C   s8   ddl m}  t }| |}|dd}tt| }|S )Nr   )r.   r:   r    )r0   r.   r-   r1   r<   r)   )r.   r*   r7   r:   r8   r+   r+   r,   get_short_time_format}   s    
r@   c             C   s   t t| | S )N)dictWEEKDAYr1   )r6   r+   r+   r,   weekday_format   s    rC   Fc          	   C   sn   ddl m} t }t|}|| }	|| |	|||||d}
t|	d }|dkrjdjt|
d t|
d d}
|
S )	Nr   )
deal_param)summary_type_reportwhole_day_durationunitr#   z{hour:0>2d}:{minute:0>2d}<   )hourminute)mysite.att.calc.utilsrD   r-   r2   intformat)r6   keydurationwork_dayrE   rF   rD   r*   r/   itemresultrG   r+   r+   r,   value_format   s    rS      )maxsizec             C   sR   t |}d}| |krN||  d p"d}|dkrN||  d p:d}d| d| d}|S )	N symbol)Npdfreport_colorz#000000z<span style="color: z;">z</span>)r2   )namer*   file_formatr/   rW   rY   r+   r+   r,   get_item_symbol   s    r\   c             C   sf   t |}t| ||}|dkrDd||  d  dt||  d  d}nt||  d  }d||}|S )N)NrX   z<span style="color: rY   z;">rZ   z</span>z{0}({1}))r2   r\   _rM   )rZ   r*   r[   r/   rW   Z	item_nameZunion_name_and_symbolr+   r+   r,   get_item_name_and_symbol   s    (r^   c             C   s>   t jj| d| djddd}|s(dS t|}|d}|S )Nr   )emp_idpunch_statepunch_time__date
punch_timeT)flatrV   z%H:%M)r   objectsfilterr   values_listminr5   )r_   
start_datetransactionZclockinr+   r+   r,   get_clock_in   s    

rj   c             C   s>   t jj| d| djddd}|s(dS t|}|d}|S )Nr    )r_   r`   ra   rb   T)rc   rV   z%H:%M)r   rd   re   r   rf   maxr5   )r_   rh   ri   Zclockoutr+   r+   r,   get_clock_out   s    

rl   c             C   s"  ddl m} tj }td||}td||}|jj| | | ddd}d }	|	 rt
jj| | | djd	d
d }
|
rtjj|
djdd
d }tjj|ddddd}|d d }|d d }|d d }|d d }t|d}ttddd||  }|d d  }|d d  }|jjt| dt| d@ | d	 }|jjt| d| d	 }|jjt| d| d	 }t| |}t| |}|jj| | | ddjdd
d}|	 rt|dkr@|j|d djdd
d }|j|d djdd
d }| d| S |j|d djdd
d }	|r,d }}||kr||krt|dkrt|dkr|	 d| }	n|	 d| }	nn||kr||krt|dkrt|dkr| d|	 }	n| d|	 }	n|j|d djdd
d }	n|r||krF||ksZ||kr||krt|dkrt|dkr| d|	 }	n| d|	 }	n|r ||kr||ks||kr||krt|dkrt|dkr|	 d| }	n|	 d| }	n|j|d djdd
d }	|	S )Nr   )LeaveZhalf_dayZabsent)employee__idstart_time__date__lteend_time__date__gte
start_timeend_time)rn   start_date__lteend_date__gteshift_idT)rc   )shifttime_interval)r(   in_timefirst_half_out_timesecond_half_in_timerO   r    r!   r"   )minutes)Zstart_time__date)Zend_time__date)employee_idZcategory_idZreport_symbol+F)Zmysite.att.models.model_leaverm   r   rd   allr\   re   r   rf   existsr   firstr   r   r   r   combinetimer   rj   rl   Zorder_bylen)r_   rh   r*   r[   rm   Zleave_categoriesZhalf_day_symbolZabsence_symbolZ
leave_timeZleave_symbolZschedule_dataZtimeinterval_idZ
time_tableZcheck_inZfirst_half_check_outZsecond_half_check_inZcheck_out_durationZdeltaZ	check_outZleave_startZ	leave_endZ	leave_objZ
leave_obj1Z
leave_obj2Zclock_inZ	clock_outdataZfirst_leave_symbolZsecond_leave_symbolr+   r+   r,   get_item_symbols   s    





r   c             C   sL   i }xB||krF| d}t| |||}|d k	r6|||< |tdd7 }qW |S )Nz%Y/%m/%dr    )days)r5   r   r   )r_   rh   end_dater*   r[   Z	data_dictZst_dateZdatasr+   r+   r,   dates_function+  s    

r   c             C   sP   | | |ji  kr(ttd|j ||j |  dkrLttd|j d S )NZ"att_leave_apply_weekend_validationZWeekoff)r1   r(   keysr   r]   
first_name)check_weekend_keycheck_weekendempr+   r+   r,   validate_weekend6  s    r   c             C   s&  i }|sZ| d j j}| d j j}| d j j}t|dd}|t| d j jd d }	nH| d j}| d j}| d j}t|dd}|t| d jd d }	|dkrt	|||d< t	||	
 |d< |d |d k rt	|tdd |	
 |d< n |d	krZt	|||d< t	|||d< |d |d k r"t	|tdd ||d< n|d
kr"t	|||d< t	||	
 |d< |d |d k rt	|tdd |	
 |d< nht	||}
t	||}||
k s|d |k r"t	|tdd ||d< t	|tdd |	
 |d< |S )Nr   z%H:%M:%SrH   )Zhoursr    rq   rr   )r   r!   r"   )rw   rx   ry   rz   r   strptimer5   r   rO   r   r   )querysetday_typerh   temp_scheduleZall_schedule_timingsrx   ry   rz   Zdtime_conversionZdtime_conversion1Zfirst_start_time_empZfirst_end_time_empr+   r+   r,   get_schedule_timings>  sJ    






r   c             C   s  i }i }i }| j g}| j | jj dg}t||||}	|dd}
t|d }| d d }| jj }ytj	j
||| jj d}W n   tj	j
||d}Y nX |rtj	j
| j ||d	 }|sttd
| j tj	j
| j ||d	}|rtj	j
|d jd}|rt|||dd}|r,t|
|	|  |S t|||}|r|tj	dj
|| j  d d |djdd}|r|t|||}|rt|
|	|  |S t|||}|rtj	dj
|t| d d |djdd}|rt|||}|rt|
|	|  |S dS )z2getting schedule and shift details of the employee)r(   department_id-rV   z%Y-%m-%dr       )rh   r*   Zlocation_id)rh   r*   )r|   Zstart_time__date__gteZend_time__date__lteZ0att_leave_apply_holiday_employee_wise_validationr   )r(   T)r   rw   ru   )ru   Z	day_index)Ztime_interval_id__isnullN)r(   
departmentget_weekend_daysreplacer   r   r   Zweekdayr   rd   re   locationr   r   r   r]   r   r   Ztime_interval_idr   r   r   r   Zselect_relatedZexcluder
   r)   )r   rq   r   r'   Zall_temp_schedule_timingsZall_emp_schedule_timingsZall_dept_schedule_timingsemp_idsZ_empsr   r   rh   Z
week_indexr   Zholiday_queryZtempr   Z	queryset1Zall_scheduleZemp_querysetZall_department_scheduleZdept_querysetr+   r+   r,   get_in_out_timingsp  s\     r   c       &   
   C   s  ddl m}m} t| d} t|dtddd }i }dd |D }||| ||}xH|D ]>}	d	|	d	 i}
t|	d
 }|	d	 }td |d |g }td |d |g }td |d |g }td |d |g }d } } } } } }}t	|||frTg }xv|D ]n}d}x:|D ]2}t
|d |d t|d |d k rd}P qW |st|}|d|i || qW ||d |g  || ||||||d |}| }|jtdd xtj|tddD ]j\}} |d}!t| }"t
dd |"D }#|#tjkrd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!  qW |$rd|$|
|!< |d7 }np|#tjkrd"td# |
|!< |d7 }nJ|#tjkr*d"td$ |
|!< |d7 }n$|#tj krd"td% |
|!< |d7 }qW ||
d&< ||
d'< |d( |
d)< |d( |
d*< ||
d+< ||
d,< ||
d-< |
||< q\W |S ).Nr   )get_related_paramsScheduleProcessingz%Y-%m-%dr    )r   r{   c             S   s   g | ]}|d  qS )r(   r+   ).0xr+   r+   r,   
<listcomp>  s    z$get_weekend_days.<locals>.<listcomp>r(   r   Zdepartment_schedulesZemployee_schedulesZtemporary_schedulesleavesFrh   r   Tr   Zshift_detailZatt_date)rN   z%Y%m%dc             S   s   g | ]}|d  qS )day_offr+   )r   tbr+   r+   r,   r     s    ,c             S   s   g | ]}|d  qS )time_interval__aliasr+   )r   r   r+   r+   r,   r     s    c             S   s   g | ]}|d  pdqS )
break_timer   r+   )r   r   r+   r+   r,   r     s    c             S   s    g | ]}t t|d  pg qS )r   )r   list)r   r   r+   r+   r,   r     s    c             S   s    g | ]}|d  |d pd qS )rO   r   r   r+   )r   r   r+   r+   r,   r     s    Zpriorityr!   Zsch_typer   z%sZreport_exceptionDisplay_day_offZreport_exceptionDisplay_weekendZreport_exceptionDisplay_HolidayZtotal_workdaytotal_leaverH   total_durationtotal_breakZtotal_dayoffZtotal_weekendZtotal_holiday)!Z,mysite.att.api.views.view_report_empscheduler   r   r   r   r   r)   re   r1   anyrk   rg   copyZdeepcopyupdateappendextendZ
processingsortoperator
itemgetter	itertoolsgroupbyr5   r   mcZREGULARjoinsumZDAY_OFFr]   ZWEEKENDZHOLIDAY)&rh   r   Zempsr'   r   r   Zpayloadsr   kwargsr   Z_itemr   employeeZdept_schedulesZemp_schedulesZtmp_schedulesr   r   r   Z	work_daysZday_off_daysZweekend_daysZholiday_daysr   Z	schedulesZdsZoverlapZesZ_dsZspZ	valid_tbsrN   r/   Zrow_keyZ_itemsr   tmpr   r+   r+   r,   r     s    

&
"





r   c       
      C   sb   ddl m} t|}|| }|| ||||}t|d }	|	dkr^djt|d t|d d}|S )Nr   )rD   rG   r#   z{hour:0>2d}:{minute:0>2d}rH   )rI   rJ   )rK   rD   r2   rL   rM   )
r6   rN   rO   rP   r*   rD   r/   rQ   rR   rG   r+   r+   r,   value_format_mobile  s    r   c       	      C   s|   ddl m} d}|||d}|r(|d nd}|dkrf| rftd}td	}| | | }|rbt|d
S dS | rtt| d
S dS dS )ziTD/MD
    Get the real temp value to report
    celsius to celsius/fahrenheit
    :return: real temp
    r   )get_system_settingtemp_mask_setting)r*   tem_unitNfz1.8Z32r    rV   )mysite.utilsr   r   round)	celsiusr*   r   setting_namer   r   ZcoefficientZ
diff_valueZ
fahrenheitr+   r+   r,   temperature_update  s    

r   c             C   s   ddl m} d}|||d}|r(|d nd}|r| r|d }|d }|rr|rrt||   krht|krn qd	S n2|r|s| t|krd	S n|r|st|| krd	S d
S )zTD/MD
    Check the real temp and max/min in setting to judge display warn temp color or not
    :param celsius:
    :param company_id:
    :return:  bool
    r   )r   r   )r*   warning_temp_limit_enableNwarn_temp_minwarn_temp_maxTF)r   r   r   )r   r*   r   r   r   r   r   r   r+   r+   r,   check_use_warn_temp  s"     r   c             C   s   ddl m} d}|||d}|r(|d nd}|r| r|d }|d }|rr|rrt||   krht|krn qd	S n2|r|s| t|krd	S n|r|st|| krd	S d
S )zTD/MD
    Check the real temp and max/min in setting to judge display high temp color or not
    :param celsius:
    :param company_id:
    :return: bool
    r   )r   r   )r*   high_temp_limit_enableNhigh_temp_minhigh_temp_maxTF)r   r   r   )r   r*   r   r   r   r   r   r   r+   r+   r,   check_use_high_temp9  s"     r   c             C   s6   | sdS t | |}t| |}d}|r*d}n|r2d}|S )z
    Get the status by temp
    :param celsius:
    :param company_id:
    :return: '0'-green Normal; '1'-orange Warning; '2'-red High, '-1'-not display
    z-10r   r   )r   r   )r   r*   use_warn_tempuse_high_tempstatusr+   r+   r,   get_temp_statusS  s    

r   c             C   sR   ddl m} d}|||d}t| |}t| |}d}|rB|d }n|rN|d }|S )zw
    Get the real color after judge high and warning
    :param celsius:
    :param company_id:
    :return: color
    r   )r   r   )r*   rV   Zhigh_temp_colorZwarn_temp_color)r   r   r   r   )r   r*   r   r   r   r   r   Zcolorr+   r+   r,   get_real_colorg  s    


r   c             C   s    | dkrdS | dkrdS dS dS )z
    Used for display diff color/status in report
    mask_flag: user have mask mask or not when punch
    mask_enable: enable mask display with color or not in setting
    :return: 1-green yes; 2-red no; 3-black yes; 4-black no
    r    ZYesr   ZNorV   Nr+   )Z	mask_flagr*   r+   r+   r,   get_mask_value|  s
    r   c             C   sx   ddl m}m}m} |jj| j||d }|r4dS |jj| j||d }|rTdS |jj| j||d }|rtdS dS )Nr   )r   r   DepartmentSchedule)r|   rs   rt   T)r|   ro   rp   )r   rs   rt   F)	mysite.att.modelsr   r   r   rd   re   r(   r   r   )r   rb   r   r   r   Zemp_scheduler   Zdept_scheduler+   r+   r,   has_schedule  s    r   )FN)N)N)N)N)F)Br   r   r   	functoolsr   Zdecimalr   r   r   r   Zdjango.utils.translationr   r]   Zdjango.db.modelsr   Z
mysite.attr	   r   rK   r
   r   Z#mysite.att.models.model_shiftdetailr   Z$mysite.att.models.model_tempscheduler   Z$mysite.att.models.model_timeintervalr   r   r   r   Z%mysite.att.models.model_leavecategoryr   Zmysite.admin.exceptionsr   Zmysite.iclock.modelsr   r4   r<   rB   r-   r2   r9   r=   r>   r?   r@   rC   rS   r\   r^   rj   rl   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r+   r+   r+   r,   <module>   s   






	
		

c

2<Q