U
    fH(                     @   s:   d dl T d dlmZ d dlZd dlZG dd dejZdS )    )*)cmf_sdesk_sla_cycleNc                       s   e Zd ZeddddZedd Zedd Zed	d
 Zdd Z	dd Z
 fddZ fddZdd Zdd Zdd Zdd Zdd Zdd Zdd  Z  ZS )!CmfSDeskSlaCycleN)fieldsc                O   s   |sg }dD ]}||kr| | q| j|d|i|}|rtdd |}g }t|D ]6}t|d t|jd t|jd | | qV|S t|S )N)parentslasla_goalr   c                 S   s
   | j  S N)r   Z_sdesk_check_access)c r   3./modules/servicedesk/models/cmf_sdesk_sla_cycle.py<lambda>       z-CmfSDeskSlaCycle.sdesk_list.<locals>.<lambda>read)appendlistfiltercmfutilacl_set_policyr   r   )clsr   argskwargsZfieldresitemsobjr   r   r   
sdesk_list   s&    zCmfSDeskSlaCycle.sdesk_listc                 C   sl   d }t jj| ddddgdgd}|D ]B}|js6|} qht|jj}t jjdd|jg|gd	r$|} qhq$|S )
N	goal_timebqlcalendarzcalendar.timezoneZorderno)r   r   Zorder_byid=)r   )	modelsZCmfSDeskSlaGoalr   r   jsonloadsZCmfTaskexistsr   )r   taskr   Zpossible_sla_goalspossible_sla_goalr   r   r   r   r&   "   s$       z"CmfSDeskSlaCycle.possible_sla_goalc                 C   s   t jj| d dddddgd}|D ]}t j|j| }|rh|j|krh|jrh||_d|_|j	  |
  nP|rr|jsd|_|j
dd	 n2|r|j|kr|jr|jr|jsd|_|j
dd	 td
|j d|j  q d S )Nr   r   sla_goal.goal_timecurrent
show_cycle)r   	stop_timer   TFZ	only_datau   Цикл =  )r!   r   r   r&   r   r   r   r)   last_time_updateset_nowsaver(   print)r%   Zcyclescycler   r   r   r   update_cycle_goals3   s*    
    


 z#CmfSDeskSlaCycle.update_cycle_goalsc                 C   s   t jj|d| dddgd}|r@|jr@d|_d|_|jdd d }|rp|jrld|_|j	  |j
	  |  d S t j| |}|r|jsd S t  }||_| |_||_|j	  |j
	  t|d |  d S )	NTpausedwithin_calendar_hoursr*   )r   r(   r   r   Fr+   write)r!   r   getr*   r(   r)   r/   r3   pause_interval_stop_timer.   r-   r&   r   r   r   r   
start_timer   r   )r   r%   r1   r   r   r   r   start_cycleN   s6    




zCmfSDeskSlaCycle.start_cyclec                 C   s,   | j s(d| _ | j  | j  |   d S )NT)r3   pause_interval_start_timer.   r-   r/   selfr   r   r   pauseq   s
    

zCmfSDeskSlaCycle.pausec                 C   s   | j   d| _|   d S )NF)r*   r.   r3   r/   r;   r   r   r   stopx   s    
zCmfSDeskSlaCycle.stopc                    s"   ddddddddg}t   | S )	Nr   r   r'   sla_goal.calendarzsla_goal.calendar.timezoner4   r:   r7   )supersave_preload_fields)r<   r   	__class__r   r   rA   }   s    
z$CmfSDeskSlaCycle.save_preload_fieldsc                    s>   |    |   |   |   |   |   t j||S r	   )_calc_paused_time_calc_elapsed_time_calc_remaining_time_calc_breach_time_calc_breached_clear_pause_intervalsr@   r/   )r<   r   r   rB   r   r   r/      s    zCmfSDeskSlaCycle.savec                 C   s   | j r| jrd| _ d| _dS )uq   
        Сброс зафиксированных интервалов паузы по триггеру
        N)r:   r7   r;   r   r   r   rI      s    z'CmfSDeskSlaCycle._clear_pause_intervalsc              	   C   sn   |  dg | jrj| jrjttjt| jjjp.dd}|  j	t
j| jj| jj|| jj|7  _	dS )uf  
        Вычисляет величину паузы по триггеру с учетом календаря
        - Пауза накопительная на протяжении всего цикла
        - Вычисляется в момент срабатывания триггера start если обе даты не пустые 
        r?   r   ZsecondsN)Zload_fieldsr:   r7   datetimetimezone	timedeltaintr   r   paused_timer!   CmfCalendarget_duration_minutesvalue
astimezoner<   tzr   r   r   rD      s     z"CmfSDeskSlaCycle._calc_paused_timec                 C   sd   t t jt| jjjpdd}t| jj| jj 	 d t
j| jj| jj|| jj| S )u   
        Возвращает количество минут не рабочего времени по календарю на интервале
        r   rJ   <   )rK   rL   rM   rN   r   r   r-   rR   r8   total_secondsr!   rP   rQ   rS   rT   r   r   r   _calc_non_working_time   s       z'CmfSDeskSlaCycle._calc_non_working_timec                 C   sV   t t jt| jjjpdd}| jjj| jj }t	j
| jj| jj||| _dS )u   
        Вычисляет дату/время нарушения цикла (цели) с учетом пауз по триггеру и календаря
        r   rJ   N)rK   rL   rM   rN   r   r   r   rR   rO   r!   rP   Zget_date_by_durationr8   rS   breach_time)r<   rU   Zdeltar   r   r   rG      s       z"CmfSDeskSlaCycle._calc_breach_timec                 C   s<   t | jj| jj  d | jj |   | _| j	  dS )u   
        Вычисляет величину истекшего времени в мин. с учетом пауз по триггеру и календаря
        rV   N)
rN   r-   rR   r8   rW   rO   rX   elapsed_timeZelapsed_time__addon_startr.   r;   r   r   r   rE      s    z#CmfSDeskSlaCycle._calc_elapsed_timec                 C   s    | j jj| j | _| j  dS )u   
        Вычисляет величину оставшегося времени в мин. с учетом пауз по триггеру и календаря
        N)r   r   rR   rZ   Zremaining_timeZremaining_time__addon_startr.   r;   r   r   r   rF      s    z%CmfSDeskSlaCycle._calc_remaining_timec                 C   s   | j j| j  krd| _dS )u8   
        Флаг нарушения цикла
        TN)rY   rR   ZnowZbreachedr;   r   r   r   rH      s    zCmfSDeskSlaCycle._calc_breached)__name__
__module____qualname__classmethodr   staticmethodr&   r2   r9   r=   r>   rA   r/   rI   rD   rX   rG   rE   rF   rH   __classcell__r   r   rB   r   r      s&   


"
	r   )Zcmf.includeZmodules.servicedesk.fieldsr   rK   r"   r   r   r   r   r   <module>   s   