U
    dDe#                     @   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gd}|D ]@}t j|j| }|r|j|kr|jr||_|j  |	  qd S )Nr   r   )r   	stop_timer   )
r!   r   r   r&   r   r   r   last_time_updateset_nowsave)r%   Zcyclescycler   r   r   r   update_cycle_goals3   s    
z#CmfSDeskSlaCycle.update_cycle_goalsc                 C   s   t jj|d | ddgd}|rH|jrDd|_|j  |j  |  d S t j| |}|r`|j	sdd S t  }||_
| |_||_|j  |j  t|d |  d S )Npausedwithin_calendar_hours)r   r'   r   r   Fwrite)r!   r   getr-   pause_interval_stop_timer)   r(   r*   r&   r   r   r   r   
start_timer   r   )r   r%   r+   r   r   r   r   start_cycleA   s*    




zCmfSDeskSlaCycle.start_cyclec                 C   s&   d| _ | j  | j  |   d S )NT)r-   pause_interval_start_timer)   r(   r*   selfr   r   r   pause\   s    

zCmfSDeskSlaCycle.pausec                 C   s   | j   |   d S r	   )r'   r)   r*   r5   r   r   r   stopb   s    
zCmfSDeskSlaCycle.stopc                    s"   ddddddddg}t   | S )	Nr   r   zsla_goal.goal_timesla_goal.calendarzsla_goal.calendar.timezoner.   r4   r1   )supersave_preload_fields)r6   r   	__class__r   r   r;   f   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*   )r6   r   r   r<   r   r   r*   s   s    zCmfSDeskSlaCycle.savec                 C   s   | j r| jrd| _ d| _dS )uq   
        Сброс зафиксированных интервалов паузы по триггеру
        N)r4   r1   r5   r   r   r   rC   }   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 если обе даты не пустые 
        r9   r   ZsecondsN)Zload_fieldsr4   r1   datetimetimezone	timedeltaintr   r   paused_timer!   CmfCalendarget_duration_minutesvalue
astimezoner6   tzr   r   r   r>      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   rD   <   )rE   rF   rG   rH   r   r   r(   rL   r2   total_secondsr!   rJ   rK   rM   rN   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   rD   N)rE   rF   rG   rH   r   r   r   rL   rI   r!   rJ   Zget_date_by_durationr2   rM   breach_time)r6   rO   Zdeltar   r   r   rA      s       z"CmfSDeskSlaCycle._calc_breach_timec                 C   s<   t | jj| jj  d | jj |   | _| j	  dS )u   
        Вычисляет величину истекшего времени в мин. с учетом пауз по триггеру и календаря
        rP   N)
rH   r(   rL   r2   rQ   rI   rR   elapsed_timeZelapsed_time__addon_startr)   r5   r   r   r   r?      s    z#CmfSDeskSlaCycle._calc_elapsed_timec                 C   s    | j jj| j | _| j  dS )u   
        Вычисляет величину оставшегося времени в мин. с учетом пауз по триггеру и календаря
        N)r   r   rL   rT   Zremaining_timeZremaining_time__addon_startr)   r5   r   r   r   r@      s    z%CmfSDeskSlaCycle._calc_remaining_timec                 C   s   | j j| j  krd| _dS )u8   
        Флаг нарушения цикла
        TN)rS   rL   ZnowZbreachedr5   r   r   r   rB      s    zCmfSDeskSlaCycle._calc_breached)__name__
__module____qualname__classmethodr   staticmethodr&   r,   r3   r7   r8   r;   r*   rC   r>   rR   rA   r?   r@   rB   __classcell__r   r   r<   r   r      s&   



	r   )Zcmf.includeZmodules.servicedesk.fieldsr   rE   r"   r   r   r   r   r   <module>   s   