
    6Ih.                     T    d dl  d dlmZ d dlZd dlZ G d dej
                        Zy)    )*)cmf_sdesk_sla_cycleNc                        e Zd Zej                  j
                  dgz   Zeddd       Zed        Z	ed        Z
ed        Zd Zd	 Z fd
Z fdZd Zd Zd Zd Zd Zd Zd Z xZS )CmfSDeskSlaCycle
sdesk_listN)fieldsc                   |sg }dD ]  }||vs|j                  |         | j                  |d|i|}|rt        d |      }g }t        |      D ]i  }t        j	                  |d       t        j	                  |j
                  d       t        j	                  |j                  d       |j                  |       k |S t        |      S )N)parentslasla_goalr   c                 6    | j                   j                         S N)r
   _sdesk_check_access)cs    3./modules/servicedesk/models/cmf_sdesk_sla_cycle.py<lambda>z-CmfSDeskSlaCycle.sdesk_list.<locals>.<lambda>   s    !((668     read)appendlistfiltercmfutilacl_set_policyr   r   )clsr   argskwargsfieldresitemsobjs           r   r   zCmfSDeskSlaCycle.sdesk_list   s     F2 	%EF"e$	% chh6V6v68C
 ECy "&&sF3&&sww7&&s||V<S!	"
 LCyr   c                 >   d }t         j                  j                  | g ddg      }|D ]p  }|j                  s|} |S t	        j
                  |j                  j                        }t         j                  j                  dd|j                  g|g      sm|} |S  |S )N)	goal_timebqlcalendarzcalendar.timezoneorderno)r
   r   order_byid=)r   )	modelsCmfSDeskSlaGoalr   r#   jsonloadsCmfTaskexistsr'   )r   taskr   possible_sla_goalspossible_sla_goalr#   s         r   r1   z"CmfSDeskSlaCycle.possible_sla_goal'   s     #3388 MALU; 9 X!3 	$((, 	 **.22778C~~$$dC-A3,G$H,	 r   c                    t         j                  j                  | d g d      }|D ]  }t         j                  j                  |j                  |       }|rT|j
                  |k7  rE|j                  r9||_        d|_        |j                  j                          |j                          nv|r|j                  sd|_        |j                  d       nN|rL|j
                  |k(  r=|j                  r1|j                  r%|j                  sd|_        |j                  d       t        d|j                   d|j                          ! y )N)r   r   sla_goal.goal_timecurrent
show_cycle)r
   	stop_timer   TF	only_datau   Цикл =  )r)   r   r   r1   r   r   r"   r5   last_time_updateset_nowsaver4   print)r/   cyclescycler   s       r   update_cycle_goalsz#CmfSDeskSlaCycle.update_cycle_goals8   s   
 ((--TT S
-   	DE..@@DQHENNh68;M;M!)#' &&..0

X%7%7 $) 

T
*enn8X=O=OTYTaTajojzjz#' 

T
*Ka0@0@/ABC#	Dr   c                 V   t         j                  j                  |d| g d      }|rD|j                  r8d|_        d|_        t        j                  |d       |j                  d       d }|rn|j                  rad|_	        |j                  j                          |j                  j                          t        j                  |d       |j                          y t         j                  j                  | |      }|r|j                  sy t         j                         }||_        | |_        ||_        t%        j&                  t%        j(                  t+        |j"                  j,                  j&                  xs d                  }t$        j$                  j/                         j1                  |      }t         j2                  j5                  |j"                  j,                  |      }t         j2                  j7                  |j"                  j,                  |      }||_        ||_        |r#||j<                  _        ||j                  _        n4|j<                  j                          |j                  j                          t        j                  |d       |j                          y )	NT)pausedwithin_calendar_hoursr6   next_time_update)r
   r4   r   r   Fwriter7   r   seconds) r)   r   getr6   r4   r5   r   r   r<   rB   pause_interval_stop_timer;   r:   r1   r"   r
   r   r   datetimetimezone	timedeltaintr$   now
astimezoneCmfCalendarget_sla_cycle_next_time_updateget_sla_cycle_calendar_pausedrD   calendar_paused
start_timevalue)r   r/   r?   r   tzrN   rD   rS   s           r   start_cyclezCmfSDeskSlaCycle.start_cycleS   s   ''++433w , y  %#(  &&ug6

T
*||$..668&&..0&&ug6

**<<S$Gx11'')	! x11#enn>U>U>^>^>cbc:def##%004!--LLU^^MdMdfij ,,JJ5>>KbKbdgh!1 / %5E"+;E""($$&""**,ug.

r   c                     | j                   sLd| _         | j                  j                          | j                  j                          | j	                          y y )NT)rB   pause_interval_start_timer;   r:   r<   selfs    r   pausezCmfSDeskSlaCycle.pause   sB    {{DK**224!!))+IIK	 r   c                    | j                   j                          | j                  r!d| _        | j                  j                          | j                  j                          t
        j                  | d       | j                          y )NFrE   )r6   r;   rB   rI   r:   r   r   r<   rZ   s    r   stopzCmfSDeskSlaCycle.stop   s]     ;;DK))113%%'tW-		r   c                 .    g d}t         |          |z   S )N)r
   r   r3   sla_goal.calendarzsla_goal.calendar.timezonerC   rY   rI   rB   paused_timerT   )supersave_preload_fields)r[   r   	__class__s     r   rc   z$CmfSDeskSlaCycle.save_preload_fields   s    
 w*,V33r   c                     | j                          | j                          | j                          | j                          | j	                          | j                          t        |   |i |S r   )_calc_paused_time_calc_elapsed_time_calc_remaining_time_calc_breach_time_calc_breached_clear_pause_intervalsrb   r<   )r[   r   r   rd   s      r   r<   zCmfSDeskSlaCycle.save   s_     !!!# ##%w|T,V,,r   c                 T    | j                   r| j                  rd| _         d| _        yyy)uq   
        Сброс зафиксированных интервалов паузы по триггеру
        N)rY   rI   rZ   s    r   rk   z'CmfSDeskSlaCycle._clear_pause_intervals   s.    
 ))d.K.K-1D*,0D) /L)r   c           	          | j                  dg       | j                  r| j                  rt        j                  t        j
                  t        | j                  j                  j                  xs d                  }| xj                  t        j                  j                  | j                  j                  | j                  j                  j                  |      | j                  j                  j                  |            z  c_	        yyy)ue  
        Вычисляет величину паузы по триггеру с учетом календаря
        - Пауза накопительная на протяжении всего цикла
        - Вычисляется в момент срабатывания триггера start если обе даты не пустые
        r`   r   rF   N)load_fieldsrY   rI   rJ   rK   rL   rM   r   r$   ra   r)   rP   get_duration_minutesrU   rO   r[   rV   s     r   rf   z"CmfSDeskSlaCycle._calc_paused_time   s     	-./))d.K.K
 ""8#5#5c$--BXBXBaBaBfef>g#hiB 2 2 G G&&..44??C--33>>rB!  /L)r   c                 0   t        j                  t        j                  t        | j                  j
                  j                  xs d                  }t        | j                  j                  | j                  j                  z
  j                         dz        t        j                  j                  | j                  j
                  | j                  j                  j                  |      | j                  j                  j                  |            z
  S )u   
        Возвращает количество минут не рабочего времени по календарю на интервале
        r   rF   <   )rJ   rK   rL   rM   r   r$   r:   rU   rT   total_secondsr)   rP   ro   rO   rp   s     r   _calc_non_working_timez'CmfSDeskSlaCycle._calc_non_working_time   s    
 x11#dmm>T>T>]>]>bab:cde""((4??+@+@@OOQTVV
33MM""DOO$9$9$D$DR$H$J_J_JeJeJpJpqsJtvv 	vr   c                    t        j                  t        j                  t        | j                  j
                  j                  xs d                  }| j                  j                  j                  | j                  j                  z   }t        j                  j                  | j                  j
                  | j                  j                  j                  |      |      | _        d}y)u   
        Вычисляет дату/время нарушения цикла (цели) с учетом пауз по триггеру и календаря
        r   rF      N)rJ   rK   rL   rM   r   r$   r"   rU   ra   r)   rP   get_date_by_durationrT   rO   breach_time)r[   rV   deltar^   s       r   ri   z"CmfSDeskSlaCycle._calc_breach_time   s    
 x11#dmm>T>T>]>]>bab:cde''--0@0@0F0FF!--BBMM""DOO$9$9$D$DR$H% r   c                     t        | j                  j                  | j                  j                  z
  j	                         dz        | j
                  j                  z
  | j                         z
  | _        | j                  j                          y)u   
        Вычисляет величину истекшего времени в мин. с учетом пауз по триггеру и календаря
        rr   N)
rM   r:   rU   rT   rs   ra   rt   elapsed_timeelapsed_time__addon_startr;   rZ   s    r   rg   z#CmfSDeskSlaCycle._calc_elapsed_time   sx      ""((4??+@+@@OOQTVV
""#%)%@%@%BC 	&&..0r   c                     | j                   j                  j                  | j                  z
  | _        | j
                  j                          y)u   
        Вычисляет величину оставшегося времени в мин. с учетом пауз по триггеру и календаря
        N)r   r"   rU   r{   remaining_timeremaining_time__addon_startr;   rZ   s    r   rh   z%CmfSDeskSlaCycle._calc_remaining_time   s9     #mm55;;d>O>OO((002r   c                     | j                   j                  | j                   j                         k  r| j                  sd| _        yyy)u8   
        Флаг нарушения цикла
        TN)rx   rU   rN   rB   breachedrZ   s    r   rj   zCmfSDeskSlaCycle._calc_breached  s>     !!T%5%5%9%9%;;DKK DM EP;r   )__name__
__module____qualname__r   r   api_methodsclassmethodr   staticmethodr1   r@   rW   r\   r^   rc   r<   rk   rf   rt   ri   rg   rh   rj   __classcell__)rd   s   @r   r   r      s    %66BBF
 
K &*  4    D D4 4 4l4 -1(	v
1	3!r   r   )cmf.includemodules.servicedesk.fieldsr   rJ   r+   r    r   r   <module>r      s&     :  !*;; !r   