
    ^iW                       d dl mZmZmZmZ d dlmZ d dlmZ d dl	m
Z
mZmZmZ d dlmZmZ d dlZd dlZd dlmZ d dlmZmZmZmZmZmZmZmZmZmZm Z  d d	l!m"Z" d d
l#m$Z$ d dl%m%Z%  ejL                  e'      Z( e       Z)dede*de+dz  de*fdZ,e)j[                  dee$          ee       ee"      fdefd       Z.e)j[                  d       ee       ee"      fdefd       Z/e)j[                  d       ee       ee"      fdefd       Z0e)jc                  d       ee       ee"      fde+defd       Z2e)jg                  d       ee       ee"      fde*de+defd       Z4e)jk                  d       ee       ee"      fde*defd       Z6e)j[                  d       ee       ee"      fde*defd        Z7e)j[                  d!       ee       ee"      fdefd"       Z8e)jc                  d!       ee       ee"      fd#e+defd$       Z9e)jg                  d       ee       ee"      fde*d#e+defd%       Z:e)jc                  d&       ee       ee"      fde*defd'       Z;e)jk                  d       ee       ee"      fde*defd(       Z<e)j[                  d)       ee       ee"      fdefd*       Z=e)jc                  d)       ee       ee"      fd+e+defd,       Z>e)jg                  d-       ee       ee"      fd.e*d+e+defd/       Z?e)jk                  d-       ee       ee"      fd.e*defd0       Z@e)j[                  d1       ee       ee"      fdefd2       ZAe)jc                  d1       ee       ee"      fd3e+defd4       ZBe)jg                  d5       ee       ee"      fd6e*d3e+defd7       ZCe)jk                  d5       ee       ee"      fd6e*defd8       ZDy)9    )	APIRouterDependsHTTPExceptionstatus)Session)flag_modified)funcnot_textinspect)ListOptionalN)get_db)TemplateCustomerUserIndustryTemplateIndustryTemplateScheduledNotificationNotificationRecurringScheduleRuleChain	ChainStepSegment)get_current_user)TemplateOut)datetimedb	tenant_id
conditionsreturnc                 $	   |rt        |t              rQt        |      dk(  rC| j                  t              j                  t        j                  |k(        j                         S | j                  t              j                  t        j                  |k(        }d|v rV|d   rQ|d   }t        |t              r<t        |      dkD  r.|j                  t        j                  j                  |            }d|v r|d   r|d   }t        |t              r`d|v r&|j                  t        j                  |d   k(        }nhd|v rd|j                  t        j                  j                  |d               }n2t        |t              r"|j                  t        j                  |k(        }d|v r|d   r|d   }t        |t              r`d|v r&|j                  t        j                  |d   k(        }nhd|v rd|j                  t        j                  j                  |d               }n2t        |t              r"|j                  t        j                  |k(        }d|v r7|d   }t        |t              r"|j                  t        j                   |k(        }d|v rt|d   }t        |t              r_|r/|j                  t        j"                  j%                  d	            }n.|j                  t        j"                  j'                  d	            }d
|v rt|d
   }	t        |	t              r_|	r/|j                  t        j(                  j%                  d	            }n.|j                  t        j(                  j'                  d	            }d|v rt|d   }
t        |
t              r_|
r/|j                  t        j*                  j%                  d	            }n.|j                  t        j*                  j'                  d	            }d|v r|d   r|d   }t        |t              rn|j-                         D ][  \  }}|j                  t        j.                  j%                  d	      t        j.                  |   j0                  t        |      k(        }] |j                         S )u  
    Подсчитывает количество клиентов, подходящих под условия правила.
    
    Args:
        db: Сессия базы данных
        tenant_id: ID тенанта
        conditions: Условия правила в формате JSON (может быть None или пустым dict)
        
    Returns:
        Количество подходящих клиентов
    r   tagsemailequalscontainsphoneopt_outhas_telegramNhas_messenger_maxhas_vkmeta)
isinstancedictlenqueryr   filterr   countlistr#   overlapr$   r&   strr'   boolr(   
tg_chat_idisnotis_max_user_id
vk_user_iditemsr,   astext)r   r   r    r0   r#   email_filterphone_filteropt_out_valuehas_tghas_maxr+   meta_filterkeyvalues                 ,/var/www/notifications/app/api/automation.pycount_matched_customersrG      s    *Z63z?a;Oxx!((););y)HIOOQQ HHX%%h&8&8I&EFE 
6 2&!dD!c$i!mLL!6!6t!<=E *G!4!'*lD)<'X^^|H7M%MN|+X^^%<%<\*=U%VWc*LL<!?@E *G!4!'*lD)<'X^^|H7M%MN|+X^^%<%<\*=U%VWc*LL<!?@E J"9-mT*LL!1!1]!BCE #N+fd#X%8%8%>%>t%DEX%8%8%<%<T%BC j(01gt$X%9%9%?%?%EFX%9%9%=%=d%CD :H%fd#X%8%8%>%>t%DEX%8%8%<%<T%BC 
6 2 (k4()//1 
U MM''-MM#&--U; ;;=    z
/templates)response_modelc                   K   	 | j                  t              j                  t        j                  |j                  k(  t        j                  j                  d            j                         D cg c]  }|j                  r|j                   }}| j                  t              j                  t        j                  |j                  k(        }|r7|j                  t        t        j                  j                  |                  }|j                         }|S c c}w # t        $ r,}t        t        j                  dt        |             d}~ww xY ww)u   Получить все кастомные шаблоны для использования в автоматизации (исключая те, что созданы автоматически для готовых шаблонов индустрии)Nu2   Ошибка получения шаблонов: status_codedetail)r0   r   r1   r   template_idr8   allr   r
   idin_	Exceptionr   r   HTTP_500_INTERNAL_SERVER_ERRORr5   )r   current_userutuser_industry_template_idsr0   	templateses          rF   get_templates_for_automationrY   w   s    

 hh34;;$..,2H2HH$0066t< ce&
 ~~ NN&
" &
 ")),"8"88
 &LLhkkoo6P&Q!RSEIIK	%&
&  
==GAxP
 	

s<   EA-D! 1DBD! ED! !	E*'EEEz/customers/segmentsc                   K   	 dd|j                   ddd|j                   ddd|j                   ddd	|j                   dd
d|j                   dg}|S # t        $ r,}t        t        j                  dt        |             d}~ww xY ww)u[   Получить все сегменты клиентов для автоматизации      Все подписчики)rP   namer      u   VIP клиенты   u   Администраторы   u   Активные клиенты   u   Новые клиентыu4   Ошибка получения сегментов: rK   N)r   rR   r   r   rS   r5   )r   rT   segmentsrX   s       rF   get_customer_segmentsrc      s     
 ;,J`J`a2AWAWX<<KaKab?lNdNde9H^H^_
  
==I#a&R
 	

s)   BAA B	B'BBBz	/triggersc                   K   	 |j                   }	 | j                  t              j                  t        t        j
                  t        j                  k(        j                  t        j                   |k(  t        j                  j                  d            j                         }g }|D ]K  }| j                  t              j                  t        j                  |j
                  k(        j                         }|r|j                  s`|j                  xs |j                   }|j                  }	| j                  t#        j$                  t&        j                              j                  t&        j                   |k(  t&        j(                  |j                  k(  t&        j*                  dk(        j-                         xs d}
| j                  t&              j                  t&        j                   |k(  t&        j(                  |j                  k(  t&        j*                  dk(        j/                  t&        j0                  j3                               j                         }|r&|j0                  r|j0                  j5                         nd}|j7                  |j                  ||	|j8                  xs |j                  |d|j:                  |
||j<                  r|j<                  j5                         ndd
       N |S # t        $ r&}t        j                  d| d       g cY d}~S d}~ww xY w# t        $ r,}t?        t*        j@                  dtC        |       	      d}~ww xY ww)
uh   Получить все триггеры из реальных шаблонов пользователяNzError loading user templates: Texc_infosentr   
rP   r]   eventrN   template_namer    enabled
executionslast_triggered
created_atu4   Ошибка получения триггеров: rK   )"r   r0   r   joinr   industry_template_idrP   r1   trigger_typer8   rO   rR   loggererrorfirstcustom_namer]   r	   r2   r   user_template_idr   scalarorder_bysent_atdesc	isoformatappendrN   	is_activern   r   rS   r5   )r   rT   r   user_templatesdb_errortriggersuser_templateindustry_templaterj   rq   executions_countlast_scheduledrm   rX   s                 rF   get_triggersr      s    @
 **			XX&:;@@ "6"K"KO_ObOb"bf$..); --33D9 ce  + (	M ")9 : A A ##}'I'II!eg  %,=,J,J)55O9J9O9OM,99L  "xx

3H3K3K(LMTT%//9<%66-:J:JJ%,,6  fh	  	   XX&;<CC%//9<%66-:J:JJ%,,6 h,4499;<UUW	  DRVdVlVl^33==?rvNOO#&&%%,88LM<L<L!."(22."0FSF^F^m66@@Bdh ;(	T a  	LL9(DtLTI	b  
==I#a&R
 	

s_   M$L, BK: %IL, 9M$:	L)L$L)L, #M$$L))L, ,	M!5'MM!!M$trigger_datac                   K   	 |j                   }| j                  d      }| j                  d      }| j                  d      }d}|rU|j                  t              j	                  t        j
                  |k(  t        j                   |k(        j                         }|r3d|_        |r||_        |j                          |j                  |       n|st        t        j                  d      |j                  t              j	                  t        j                  |k(        j                         }|st        t        j                   d| d	      t#        ||xs |j$                  | d
|j&                   d
t)        j*                         j-                          |j.                  j                  d      xs9 |j.                  j                  d      xs |j.                  j                  dd      |j0                  |j2                  dd      }	|j5                  |	       |j7                          t        ||j
                  |	j
                  d|j2                  |r|nd      }|j5                  |       |j                          |j                  |       |j                  t              j	                  t        j
                  |j8                  k(        j                         }|st        t        j:                  d      |j                  xs |j$                  }
|j                  }d}d}|j
                  |
||j<                  xs |j
                  |
| j                  d      |j                  |||j>                  r|j>                  jA                         d
S dd
S # t        $ r  tB        $ r<}|jE                          t        t        j:                  dtG        |             d}~ww xY ww)u(   Создать новый триггерrN   ri   r]   NTuP   Не указано событие (event) или шаблон не найденrK   u$   Шаблон для события 'uj   ' не найден. Сначала установите готовые шаблоны индустрии.-telegrammessenger_maxr$    F)primaryfailover)r   r]   slugcontent	variableschannel_strategy)r   rp   rN   r}   channelsru   ;   Ошибка получения данных шаблонаr   r    rh   u0   Ошибка создания триггера: )$r   getr0   r   r1   rP   rt   r}   ru   commitrefreshr   r   HTTP_400_BAD_REQUESTr   rq   HTTP_404_NOT_FOUNDr   r]   rD   r   utcnow	timestampr   r   r   addflushrp   rS   rN   rn   r{   rR   rollbackr5   )r   r   rT   r   rN   ri   r]   r   r   templaterj   rq   r   rm   rX   s                  rF   create_triggerr      s    i
 **	"&&}5  )' HH%9:AA$'';6$..); eg 
 &*M#,0)IIKJJ}% # & ; ;m  !#)9 : A A --6!eg  %# & 9 9A%  Is  t   #3.33!{!$5$9$9#:!HOO<M<W<W<Y;Z[)1155jA  bEVE^E^EbEbcrEs  b  xI  xQ  xQ  xU  xU  V]  _a  xb+55099 %"
H FF8HHJ 1#%6%9%9$KK*33$(DdM FF=!IIKJJ}% HH%56===#E#EE

%' 	 !"AAT 
 &11K5F5K5K(55   ""!!(44H8H8H*&**<8$..*,BOBZBZ-22<<>
 	
 ae
 	
   

==Ec!fXN
 	

s5   O)NN O)N O)O&*7O!!O&&O)z/triggers/{trigger_id}
trigger_idc                 t  K   	 |j                   }|j                  t              j                  t        j                  | k(  t        j                   |k(        j                         }|st        t        j                  d      d|v r
|d   |_	        d|v r
|d   |_
        d}d|v r|d   r|d   }|j                  t              j                  t        j                  |j                  k(        j                         }|rl|j                  |k7  r]|j                  t              j                  t        j                  |k(        j                         }	|	r|	j                  |_        nd| d}|j                          |j                  |       |j                  t              j                  t        j                  |j                  k(        j                         }
|
st        t        j                   d	      |j                  xs |
j"                  }|j                  t%        j&                  t(        j                              j                  t(        j                   |k(  t(        j*                  |j                  k(  t(        j                  d
k(        j-                         xs d}|j                  t(              j                  t(        j                   |k(  t(        j*                  |j                  k(  t(        j                  d
k(        j/                  t(        j0                  j3                               j                         }|r&|j0                  r|j0                  j5                         nd}|j                  ||
j                  |j6                  xs |j                  ||j9                  d      |j                  |||j:                  r|j:                  j5                         ndd
}|r||d<   |S # t        $ r  t<        $ r<}|j?                          t        t        j                   dtA        |             d}~ww xY ww)u   Обновить триггер    Триггер не найденrK   rk   r]   Nri   u   Событие 'u   ' не изменено: для этого события нет готового шаблона индустрии. Установите готовые шаблоны для этого события.r   rg   r   r    rh   warningu4   Ошибка обновления триггера: )!r   r0   r   r1   rP   rt   r   r   r   r}   ru   r   rp   rq   r   r   rS   r]   r	   r2   r   rv   rw   rx   ry   rz   r{   rN   r   rn   rR   r   r5   )r   r   r   rT   r   r   warning_message	new_eventcurrent_industry_templatenew_industry_templater   rj   r   r   rm   updated_triggerrX   s                    rF   update_triggerr   l  s    i
 **	 !56== ##z1 **i7
 %' 	
 "559  $&29&=M#\!(4V(<M% l"|G'<$W-I(*1A(B(I(I ##}'I'II)eg &
 )-F-S-SW`-`(*1A(B(I(I$11Y>)%' & )9N9Q9QM6 )9  DM  'NO 			


=! HH%56===#E#EE

%' 	 !"AAT 
 &11K5F5K5K 88DJJ/D/G/G$HIPP!++y8!22m6F6FF!((F2
 &(	 	 	 "78??!++y8!22m6F6FF!((F2
 ((00557
8	 	 @NR`RhRh//99;nr  ""!&33(44H8H8H*&**<8$..*,BOBZBZ-22<<>`d
 )8OI&  

==I#a&R
 	

s)   P8O"O' &P8'P597P00P55P8c                 ^  K   	 |j                   }j                  t              j                  t        j                  | k(  t        j                   |k(        j                         }|st        t        j                  d      fd} |d      r/	 j                  t        d      | |d       j                           |d      r/	 j                  t        d      | |d       j                           |d	      r/	 j                  t        d
      | |d       j                           |d      r/	 j                  t        d      | |d       j                          	 j                  t        d      | |d       j                          dddS # t        $ r j                          Y w xY w# t        $ r j                          Y w xY w# t        $ r j                          Y w xY w# t        $ r j                          Y w xY w# t        $ r<}j                          t        t        j                  dt!        |             d}~ww xY w# t        $ r  t        $ r<}j                          t        t        j                  dt!        |             d}~ww xY ww)u   Удалить триггер (полное удаление пользовательского шаблона и связанных объектов)r   rK   c                 r    	 t        j                        }| |j                         v S # t        $ r Y yw xY w)NF)r   bindget_table_namesrR   )
table_name	inspectorr   s     rF   table_existsz$delete_trigger.<locals>.table_exists  s<    #BGG,	!Y%>%>%@@@ s   &* 	66ruleszQDELETE FROM rules WHERE user_template_id = :trigger_id AND tenant_id = :tenant_id)r   r   chain_stepszWDELETE FROM chain_steps WHERE user_template_id = :trigger_id AND tenant_id = :tenant_idrecurring_scheduleszvUPDATE recurring_schedules SET user_template_id = NULL WHERE user_template_id = :trigger_id AND tenant_id = :tenant_idscheduled_notificationszzUPDATE scheduled_notifications SET user_template_id = NULL WHERE user_template_id = :trigger_id AND tenant_id = :tenant_idzUDELETE FROM user_industry_templates WHERE id = :trigger_id AND tenant_id = :tenant_idu0   Ошибка удаления триггера: NTu   Триггер удаленsuccessmessage)r   r0   r   r1   rP   rt   r   r   r   executer   r   rR   r   r   rS   r5   )r   r   rT   r   r   r   rX   s    `     rF   delete_triggerr     s    S
 **	 !56== ##z1 **i7
 %' 	
 "559 	  

4 st)3)LN

 &

4 yz)3)LN

 -.

4  !Y  Z)3)LN

 12

4  !]  ^)3)LN

		JJtst%/iHJIIK  ,IJJW          	KKM"AAI#a&R 	   

==Ec!fXN
 	

s   J-BI .F ?I .F7 6I ?.G -I 6.G5 %.H I J-F41I 3F44I 7GI GI G2/I 1G22I 5HI HI 	I7III J*.7J%%J**J-z/schedules/{schedule_id}schedule_idc                 	  K   	 |j                   }|j                  t              j                  t        j                  | k(  t        j                   |k(        j                         }|st        t        j                  d      d}|j                  r\|j                  t              j                  t        j                  |j                  k(        j                         }|r|j                  }n|j                  r|j                  t              j                  t        j                  |j                  k(        j                         }|ri|j                  t              j                  t        j                  |j                  k(        j                         }|r|j                   xs |j                  }d}	|j"                  r|j"                  }	n5|j$                  dk(  rd}	n#|j$                  dk(  rd}	n|j$                  d	k(  rd
}	|j&                  rd|j&                   nd}
d}|j(                  ry|j(                  }t+        |t,              r	 t/        j0                  |      }t+        |t8              r7d|v r|d   }n-d|v r)d|v r%|d   }|d   }t;        |      ddt;        |      d}|sz|j"                  rn	 |j"                  j=                         }t?        |      dk\  rE|d   }|d   }|jA                         r+|jA                         rt;        |      ddt;        |      d}i d|j                  d|j                  d|j                  d|j                  d|d|	d|j$                  d |j"                  xs dd|d!|j&                  d"|
d#|jB                  d$|jD                  r|jD                  jG                         ndd%|jH                  r|jH                  jG                         ndd&|jJ                  d'|jL                  r|jL                  jG                         S dS # t2        $ r(}t4        j7                  d|  d|        i }Y d}~d}~ww xY w# t2        $ r&}t4        j7                  d|  d|        Y d}~ad}~ww xY w# t        $ r  t2        $ r,}t        t        jN                  d(t-        |             d}~ww xY ww))u6   Получить одно расписание по ID(   Расписание не найденоrK      Шаблон не выбранr   daily   Ежедневноweekly   Еженедельноmonthly   Ежемесячно   Сегмент r\   Nz:Error parsing schedule_config as JSON string for schedule : timehourminute02d:r^   r   r[   z-Error extracting time from cron for schedule rP   r]   rN   rv   rj   scheduleschedule_typecron
segment_idsegmentrk   next_runlast_run
sent_countrn   u6   Ошибка получения расписания: )(r   r0   r   r1   rP   rt   r   r   r   rN   r   r]   rv   r   r   rp   ru   cron_expressionr   r   schedule_configr-   r5   jsonloadsrR   rr   r   r.   intsplitr/   isdigitr}   next_run_atr{   last_run_atr   rn   rS   )r   r   rT   r   r   rj   r   r   r   schedule_displaysegment_name
time_valueconfig_dictrX   r   r   
cron_partss                    rF   get_scheduler   <  s    f
 **	 88-.55  K/''94
 %' 	
 "55A  9xx)00@T@T1TU[[]H (&&HH%9:AA$''8+D+DDeg  $&HH-=$>$E$E$''=+M+MM%%' " %$1$=$=$WARAWAWM ##'77##w.3##x/7##y05 CKBUBU)<)<(=>[x 
##"22K+s+%"&**["9K
 +t,[(!,V!4J{*x;/F&v.D(2F$'Ic?!CK3D!EJ h66c%55;;=
z?a'']F%a=D~~'DLLN(+D	#aFC7H%I

(++
HMM
 8//
  9 9	

 ]
 (
 X33
 H,,2
 J
 (--
 |
 x))
 H<P<P,,668VZ
 H<P<P,,668VZ
 (--
  X=P=P(--779!
 	
  W[!
 	
1 ! %NN%_`k_llnopnq#rs"$K%*  c!N{m[]^_]`abbc*   
==KCPQF8T
 	

s   S
IR	 P# AR	 3A-Q  C?R	 S
 R	 "S
#	Q,Q	R	 QR	 	R R;R	 RR	 	S'SSS
z
/schedulesc                 <	  K   	 |j                   }	 | j                  t              j                  t        j                   |k(        j	                         }g }|D ]  }d}|j                  r\| j                  t              j                  t        j                  |j                  k(        j                         }|r|j                  }n|j                  r| j                  t              j                  t        j                  |j                  k(        j                         }	|	ri| j                  t              j                  t        j                  |	j                   k(        j                         }
|
r|	j"                  xs |
j                  }d}|j$                  r|j$                  }n5|j&                  dk(  rd}n#|j&                  dk(  rd	}n|j&                  d
k(  rd}|j(                  rd|j(                   nd}d}|j*                  ry|j*                  }t-        |t              r	 t/        j0                  |      }t-        |t2              r7d|v r|d   }n-d|v r)d|v r%|d   }|d   }t5        |      ddt5        |      d}|sz|j$                  rn	 |j$                  j7                         }t9        |      dk\  rE|d   }|d   }|j;                         r+|j;                         rt5        |      ddt5        |      d}|j=                  i d|j                  d|j                  d|j                  d|j                  d|d|d|j&                  d|j$                  xs dd|d|j(                  d|d |j>                  d!|j@                  r|j@                  jC                         ndd"|jD                  r|jD                  jC                         ndd#|jF                  d$|jH                  r|jH                  jC                         nd        |S # t
        $ r6}dt        |      v sdt        |      j                         v rg cY d}~S |d}~ww xY w#  i }Y "xY w#  Y gxY w# t
        $ r,}tK        tL        jN                  d%t        |       &      d}~ww xY ww)'uO   Получить все расписания из реальных данныхdoes not existno such tableNr   r   r   r   r   r   r   r   r   r\   r   r   r   r   r   r^   r   r[   rP   r]   rN   rv   rj   r   r   r   r   r   rk   r   r   r   rn   u6   Ошибка получения расписаний: rK   )(r   r0   r   r1   rO   rR   r5   lowerrN   r   rP   rt   r]   rv   r   r   rp   ru   r   r   r   r   r-   r   r   r.   r   r   r/   r   r|   r}   r   r{   r   r   rn   r   r   rS   )r   rT   r   schedules_dbr   	schedulesr   rj   r   r   r   r   r   r   r   r   r   r   rX   s                      rF   get_schedulesr     s    h
 **		88$56==!++y8ce  	$ Q	H<M##88H-44X[[HDXDX5XY__a$,MMM** ")= > E E(++x/H/HH!%'  !(*1A(B(I(I(++}/Q/QQ)eg & )(5(A(A([EVE[E[  "''#+#;#; ''72#7 ''83#; ''94#9  GOFYFY_X-@-@,AB_|L J''&66k3/)&*jj&= k40,%0%8
;.8{3J*62!,X!6(+D	#aFC7H%I
 (":":!)!9!9!?!?!AJ:!+!+A)!}!>>+,/Ic?!CK;L)MJ
  hkk x33 #H$=$=	
   ,  !7!7 006B 
 h11 < 8-- @T@TH00::<Z^ @T@TH00::<Z^ h11  ATATh11;;=Z^! AQ	f w  	3x=0Os8}GZGZG\4\	N		`)&(&.  
==KCPQF8T
 	

s   RQ$ AP GQ$ "Q7AQ$ A-Q:DQ$ R	Q)Q
QQ$ RQ

QQ$ QQ$ Q!Q$ $	R-'RRRschedule_datac                 
  K   	 |j                   }| j                  dd      }| j                  dd      }|rd}i }|dk7  rd| v r| d   r| d   }	 t        |      j                         }d|v r]|j	                  d      \  }	}
t        |	j                               }	t        |
j                               }
|	dd|
d|d<   |	|d<   |
|d	<   nt        j                  d
| d       t        || j                  dd      | j                  d      | j                  d      | j                  d      |||| j                  dd      dd      }|j                  |       |j                          |j                          |j                  |       d}|j                  r\|j!                  t"              j%                  t"        j&                  |j                  k(        j)                         }|r|j*                  }n|j,                  r|j!                  t.              j%                  t.        j&                  |j,                  k(        j)                         }|rz|j!                  t0              j%                  t0        j&                  |j2                  k(        j)                         }|r|j4                  xs |j*                  }n|j4                  xs d}|j6                  xs |}d}|j8                  r|j8                  }t;        |t              r	 t=        j>                  |      }t;        |t@              r@|j                  d      }|s-d|v r)d	|v r%|d   }	|d	   }
t        |	      ddt        |
      d}i d|j&                  d|j*                  d|j                  d|j,                  d|d|d|jB                  d|j6                  xs dd|d|jD                  d|jD                  rd|jD                   ndd|jF                  d |jH                  r|jH                  jK                         ndd!|jL                  r|jL                  jK                         ndd"|jN                  d#|jP                  r|jP                  jK                         S dS # t        $ r%}t        j                  d| d       Y d}~d}~ww xY w#  i }Y xY w# t        $ r<}|jS                          tU        tV        jX                  d$t        |       %      d}~ww xY ww)&u.   Создать новое расписаниеr   r   r   Nr   r   r   r   r   Time value 'z ' does not contain ':', skippingz*Error processing time in create_schedule: Tre   r]   u   Новое расписаниеrN   rv   r   rk   r   )r   r]   rN   rv   r   r   r   r   r}   r   r   r   #   Неизвестный шаблонrP   rj   r   r   r   r   r\   r   r   r   rn   u4   Ошибка создания расписания: rK   )-r   r   r5   stripr   r   rr   r   rR   rs   r   r   r   r   r   rN   r0   r   r1   rP   rt   r]   rv   r   r   rp   ru   r   r   r-   r   r   r.   r   r   r}   r   r{   r   r   rn   r   r   r   rS   )r   r   rT   r   r   r   r   r   time_strr   r   rX   new_schedulerj   r   r   r   r   r   s                      rF   create_scheduler     s+    v
 **	 &))/7C'++FD9"M  F"&=+@*62
b":446Hh'/~~c':f"4::<0!$V\\^!459#Jas|2L/26/4:1hZ?_'`a )""6+LM%))-8*../AB$((6++'#''	48
 	|


		


<  9##xx)00@X@X1XY__aH (**HH%9:AA$''<+H+HHeg  $&HH-=$>$E$E$''=+M+MM%%' " %$1$=$=$WARAWAWM$1$=$=$fAfM (77H= 
''&66K+s+%"&**["9K +t,(__V4
!f&;K@W&v.D(2F$'Ic?!CK3D!EJ
,//
L%%
 <33
  = =	

 ]
 (
 \77
 L006B
 J
 ,11
 lF]F])@)@(AB  dA
 |--
 @X@X00::<^b
 @X@X00::<^b
 ,11
  AXAX,11;;=!
 	
  _c!
 	
A ! bLL#MaS!Q\`Laabl%"$K6  

==I#a&R
 	

sz   TA	R> BR !HR>  R4 E*R> ?T R> T	R1R,&R> ,R11R> 4R;8R> >	T7S>>TTc                   K   	 |j                   }|j                  t              j                  t        j                  | k(  t        j                   |k(        j                         }|st        t        j                  d      d|v r
|d   |_	        d|v r |d   }||j                  t              j                  t        j                  |k(  t        j                   |k(        j                         }|r||_        d|_        n|j                  t              j                  t        j                  |k(  t        j                   |k(        j                         }|r||_        d|_        n-t        t        j                  d| d      d|_        d|_        d|v r|d   }	|	|j                  t              j                  t        j                  |	k(  t        j                   |k(        j                         }|st        t        j                  d	|	 d      |	|_        d|_        nd|vrd|_        d|_        d
|v r
|d
   |_        d|v r|d   |_        |d   rd|_        d|v r
|d   |_        |j"                  dk7  rd|v r}|d   }
|
r|
dk7  r|
	 t%        |
      j'                         }d|v r|j)                  d      \  }}t+        |j'                               }t+        |j'                               }i }|j,                  r/t/        |j,                  t0              rt1        |j,                        }|dd|d|d<   ||d<   ||d<   ||_        t3        |d       nt4        j7                  d| d|         n|j,                  r|t/        |j,                  t0              rbt1        |j,                        }|j=                  dd       |j=                  dd       |j=                  dd       |r|ni |_        t3        |d       d|v r
|d   |_        tA        jB                         |_"        |jG                          |jI                          |jK                  |       d}|j                  r\|j                  t              j                  t        j                  |j                  k(        j                         }|r|j                  }n|j                  r|j                  t              j                  t        j                  |j                  k(        j                         }|rz|j                  tL              j                  tL        j                  |jN                  k(        j                         }|r|jP                  xs |j                  }n|jP                  xs d}|j                   xs |j"                  }d}
|j,                  r|j,                  }t/        |t$              r	 tS        jT                  |      }t/        |t0              r@|jW                  d      }
|
s-d|v r)d|v r%|d   }|d   }t+        |      ddt+        |      d}
i d|j                  d|j                  d|j                  d|j                  d|d|d|j"                  d|j                   xs dd|
d
|j                  d |j                  rd!|j                   nd"d|j>                  d#|jX                  r|jX                  j[                         ndd$|j\                  r|j\                  j[                         ndd%|j^                  d&|j`                  r|j`                  j[                         S dS # t8        $ r(}t4        j;                  d|  d| d       Y d}~d}~ww xY w#  i }Y xY w# t        $ r  t8        $ r<}|jc                          t        t        jd                  d't%        |             d}~ww xY ww)(u%   Обновить расписаниеr   rK   r]   rN   N   Шаблон с ID     не найденrv   u4   Пользовательский шаблон с ID r   r   r   r   r   r   r   r   r   r   r   z.' does not contain ':', skipping for schedule u?   Ошибка обработки времени для schedule r   Tre   rk   r   r   rP   rj   r   r   r   r\   r   r   r   rn   u8   Ошибка обновления расписания: )3r   r0   r   r1   rP   rt   r   r   r   r]   r   rv   rN   r   r   r   r   r   r5   r   r   r   r   r-   r.   r   rr   r   rR   rs   popr}   r   r   
updated_atr   r   r   r   rp   ru   r   r   r   r   r{   r   r   rn   r   rS   )r   r   r   rT   r   r   template_id_valuer   r   user_template_id_valuer   r   r   r   
new_configrX   rj   r   r   r   s                       rF   update_scheduler     s    P
 **	 88-.55  K/''94
 %' 	
 "55A  ]")&1HM M) -m < , ")= > E E(++/@@(22i?! %' 
 !0AH-+/H(  "xx188 '88 **i7  eg   /@,481+(.(C(C%89J8KK]#^  (,$,0).%23E%F"%1 ")= > E E(++/EE(22i?! %'  %'$*$?$?!UVlUmm   A  -C)'+$ !504H-+/H(=("/"=H]"'4V'<H$V$)/&m+%2?%CH" !!V+&*62
*"2z7MJ#&z?#8#8#:(?+3>>#+>LD&#&tzz|#4D%(%8F *,J'77JxG_G_ae<f-1(2J2J-K
48:Qvcl1KJv.15Jv.39Jx07AH4 *(4EF"NN\(Cqr}q~+  A  //Jx?W?WY]4^%)(*B*B%C
"vt4"vt4"x6AK:QS0%h0AB %!.y!9H 'oo/ 	

		 	

8 9xx)00@T@T1TU[[]H (&&HH%9:AA$''8+D+DDeg  $&HH-=$>$E$E$''=+M+MM%%' " %$1$=$=$WARAWAWM$1$=$=$fAfM $33Mx7M7M 
##"22K+s+%"&**["9K +t,(__V4
!f&;K@W&v.D(2F$'Ic?!CK3D!EJ
(++
HMM
 8//
  9 9	

 ]
 (
 X33
 H,,2
 J
 (--
 (BUBU)<)<(=>[x
 x))
 H<P<P,,668VZ
 H<P<P,,668VZ
 (--
  X=P=P(--779!
 	
  W[!
 	
K % J'fgrfssuvwux%y  EI  J  JJt%"$K8   

==McRSfXV
 	

sz   _-J^ C%] 6I$^ ^ 0E*^ _-^ _-	^'^
^ 
^^ ^^ _*.7_%%_**_-z/schedules/{schedule_id}/runc                   K   	 |j                   }|j                  t              j                  t        j                  | k(  t        j                   |k(        j                         }|st        t        j                  d      |j                  st        t        j                  d      d}|j                  r`|j                  t              j                  t        j                  |j                  k(  t        j                   |k(        j                         }n|j                  r|j                  t              j                  t        j                  |j                  k(  t        j                   |k(        j                         }|r_|j                  t              j                  t        j                  |j                  k(  t        j                   |k(        j                         }|st        t        j                  d      g }d}|j                  r|j                  t               j                  t         j                  |j                  k(  t         j                   |k(        j                         }|r|j                  t"              j                  t"        j                   |k(  t"        j                  |j                  k(        j%                         }nC|j                  t"              j                  t"        j                   |k(        j%                         }|sR|j                  r+|r)t        t        j                  d|j&                   d      t        t        j                  d      d	d
lm}	 d	}
|D ]g  }t-        ||j                  |j                  i d      }|j/                  |       |j1                          |	j3                  |j                         |
dz  }
i |xj4                  |
z  c_        t7        j8                         |_        |j=                          dd|
 |
dS # t        $ r  t>        $ r<}|jA                          t        t        jB                  dtE        |             d}~ww xY ww)u6   Запустить расписание вручнуюr   rK   u   Расписание отключено. Включите расписание, чтобы запустить отправку.Nux   Шаблон не найден. Выберите другой шаблон в настройках расписания.u   В сегменте "u}   " нет клиентов. Добавьте клиентов в этот сегмент или выберите другой.ut   Нет клиентов для отправки. Сначала добавьте клиентов в систему.r   )enqueue_notificationpending)r   rN   customer_idpayloadr   r[   TuN   Расписание запущено. Создано уведомлений: )r   r   notifications_createdu2   Ошибка запуска расписания: )#r   r0   r   r1   rP   rt   r   r   r   r}   r   rN   r   rv   r   r   r   r   rO   r]   app.workers.notificationsr   r   r   r   delayr   r   r   r   r   rR   r   rS   r5   )r   r   rT   r   r   r   r   	customersr   r   created_countcustomernotificationrX   s                 rF   run_scheduler  t  s    w
 **	 88-.55  K/''94
 %' 	
 "55A 
 !!"77 Y  xx)00x333""i/ eg  &&HH%9:AA$''8+D+DD$..); eg  88H-44KK=#<#<<&&)3 %' 
 "77 R  	hhw'..

h111!!Y. eg 
 HHX.55&&)3''7::5 #%  *11""i/ce  ""w# & ; ;3GLL>  B@  A  $ & ; ; R  	C ! 	H'#$KK$KK L FF< HHJ !&&|7QM	  	},'0
		 ghugvw%2
 	

   

==GAxP
 	

s)   Q4PP# "Q4#Q157Q,,Q11Q4c                   K   	 |j                   }|j                  t              j                  t        j                  | k(  t        j                   |k(        j                         }|st        t        j                  d      |j                  |       |j                          dddS # t        $ r  t        $ r<}|j                          t        t        j                  dt        |             d}~ww xY ww)u#   Удалить расписаниеr   rK   Tu#   Расписание удаленоr   u4   Ошибка удаления расписания: N)r   r0   r   r1   rP   rt   r   r   r   deleter   rR   r   rS   r5   )r   r   rT   r   r   rX   s         rF   delete_scheduler	    s     
 **	 88-.55  K/''94
 %' 	
 "55A  			(
		,QRR  

==I#a&R
 	

)   C9B#B( 'C9(C6:7C11C66C9z/rulesc                 n  K   	 |j                   }	 | j                  t              j                  t        j                   |k(        j	                         }g }|D ]  }d}|j                  r\| j                  t              j                  t        j                  |j                  k(        j                         }|r|j                  }n|j                  r| j                  t              j                  t        j                  |j                  k(        j                         }	|	ri| j                  t              j                  t        j                  |	j                   k(        j                         }
|
r|	j"                  xs |
j                  }t%        | ||j&                        }|j)                  |j                  |j                  |j                  xs |j                  ||j&                  t        |j&                        ||j*                  |j,                  r|j,                  j/                         ndd	        |S # t
        $ r6}dt        |      v sdt        |      j                         v rg cY d}~S |d}~ww xY w# t
        $ r,}t1        t2        j4                  dt        |             d}~ww xY ww)	uI   Получить все правила из реальных данныхr   r   Nr   r   r   r    	rP   r]   rN   rj   r    conditions_detailmatched_customersrk   rn   u.   Ошибка получения правил: rK   )r   r0   r   r1   rO   rR   r5   r   rN   r   rP   rt   r]   rv   r   r   rp   ru   rG   r    r|   r}   rn   r{   r   r   rS   )r   rT   r   rules_dbr   r   rulerj   r   r   r   matched_customers_countrX   s                rF   	get_rulesr    sF    :
 **		xx~,,)+ce   #	D<M88H-44X[[DDTDT5TU[[]$,MMM&& ")= > E E(++t/D/DD!%'  !(*1A(B(I(I(++}/Q/QQ)eg & )(5(A(A([EVE[E[ '>#??'# LLgg		#//H43H3H!."oo%(%9%<>>=A__doo779RV
 
3#	J [  	3x=0Os8}GZGZG\4\	N		\  
==CCF8L
 	

se   J5I= AH; G&I= :J5;	I:)I5-I:.I= 2J53I55I::I= =	J2'J--J22J5	rule_datac                   K   	 |j                   }| j                  d      }d}|r|j                  t              j	                  t        j
                  |k(  t        j                   |k(        j                         }|r|}d}nv|j                  t              j	                  t        j
                  |k(  t        j                   |k(        j                         }|st        t        j                  d| d      t        || j                  dd      ||| j                  di       | j                  d	d
            }|j                  |       |j                          |j                  |       d}	|j                  r\|j                  t              j	                  t        j
                  |j                  k(        j                         }|r|j                   }	n|j"                  r|j                  t              j	                  t        j
                  |j"                  k(        j                         }|ri|j                  t$              j	                  t$        j
                  |j&                  k(        j                         }
|
r|j(                  xs |
j                   }	|j
                  |j                   |j                  xs |j"                  |	|j*                  t-        |j*                        t/        |||j*                        |j0                  |j2                  r|j2                  j5                         d	S dd	S # t6        $ r<}|j9                          t        t        j:                  dt-        |             d}~ww xY ww)u(   Создать новое правилоrN   Nr   r   rK   r]   u   Новое правилоr    rk   T)r   r]   rN   rv   r    r}   r   r  r  u.   Ошибка создания правила: )r   r   r0   r   r1   rP   rt   r   r   r   r   r   r   r   r   rN   r]   rv   r   rp   ru   r    r5   rG   r}   rn   r{   rR   r   rS   )r  r   rT   r   rN   rv   r   r   new_rulerj   r   rX   s               rF   create_ruler  [  s
    N
 **	  mmM2 HH%9:AA$'';6$..); eg  #. " 88H-44KK;.&&)3 %'   '$*$?$?!4[MAST 
 v'BC#- }}\26mmIt4
 	x
		


8 9xx)00@T@T1TU[[]H (&&HH%9:AA$''8+D+DDeg  $&HH-=$>$E$E$''=+M+MM%%' " %$1$=$=$WARAWAWM ++MM#//L83L3L*"--!$X%8%8!9!8##.."
  ))=E=P=P(--779
 	
 W[
 	
  

==CCF8L
 	

s5   M=L,L5 0M=1L5 4M=5	M:>7M55M::M=z/rules/{rule_id}rule_idc                   K   	 |j                   }|j                  t              j                  t        j                  | k(  t        j                   |k(        j                         }|st        t        j                  d      d|v r
|d   |_	        d|v r|d   }d}|r|j                  t              j                  t        j                  |k(  t        j                   |k(        j                         }|r|}d}nz|j                  t              j                  t        j                  |k(  t        j                   |k(        j                         }	|	s#t        t        j                  d| d      d}d}||_        ||_        d|v r
|d   |_        d	|v r
|d	   |_        t#        j$                         |_        |j)                          |j+                  |       d
}
|j                  r\|j                  t              j                  t        j                  |j                  k(        j                         }	|	r|	j                  }
n|j                  r|j                  t              j                  t        j                  |j                  k(        j                         }|ri|j                  t,              j                  t,        j                  |j.                  k(        j                         }|r|j0                  xs |j                  }
|j                  |j                  |j                  xs |j                  |
|j                  t3        |j                        t5        |||j                        |j                   |j6                  r|j6                  j9                         d	S dd	S # t        $ r  t:        $ r<}|j=                          t        t        j>                  dt3        |             d}~ww xY ww)u   Обновить правило"   Правило не найденоrK   r]   rN   Nr   r   r    rk   r   r  r  u2   Ошибка обновления правила: ) r   r0   r   r1   rP   rt   r   r   r   r]   r   r   r   rN   rv   r    r}   r   r   r   r   r   r   rp   ru   r5   rG   rn   r{   rR   r   rS   )r  r  r   rT   r   r  rN   rv   r   r   rj   r   rX   s                rF   update_ruler    s    a
 **	xx~$$GGwNNi'
 %' 	
 "55;  Y!&)DII%#M2K#  ")= > E E(++{:(22i?! %'  !'2$"&K  "xx188 {2 **i7  eg  $+(.(C(C%8EW#X  ##' *D$4D!9$'5DO	!&y1DN"//+
		


4 9xx)00@P@P1PQWWYH (""HH%9:AA$''4+@+@@eg  $&HH-=$>$E$E$''=+M+MM%%' " %$1$=$=$WARAWAWM ''II++Dt/D/D*//!$T__!5!8#??"
 ~~9=$//335
 	
 OS
 	
   

==GAxP
 	

s5   O3NN" O3N" !O3"O047O++O00O3c                   K   	 |j                   }|j                  t              j                  t        j                  | k(  t        j                   |k(        j                         }|st        t        j                  d      |j                  |       |j                          dddS # t        $ r  t        $ r<}|j                          t        t        j                  dt        |             d}~ww xY ww)u   Удалить правилоr  rK   Tu,   Правило успешно удаленоr   u.   Ошибка удаления правила: N)r   r0   r   r1   rP   rt   r   r   r   r  r   rR   r   rS   r5   )r  r   rT   r   r  rX   s         rF   delete_ruler    s     
 **	xx~$$GGwNNi'
 %' 	
 "55; 
 			$
		,Z[[  

==CCF8L
 	

r
  z/chainsc                   K   	 |j                   }	 | j                  t              j                  t        j                   |k(        j	                         }g }|D ]$  }g }|j                  D ]x  }d}	|j                  r\| j                  t              j                  t        j                  |j                  k(        j                         }
|
r|
j                  }	n|j                  r| j                  t              j                  t        j                  |j                  k(        j                         }|ri| j                  t               j                  t         j                  |j"                  k(        j                         }|r|j$                  xs |j                  }	|j'                  |j(                  |j                  xs |j                  |	|j*                  xs d|	d       { |j-                  d        |j'                  |j                  |j                  |j.                  ||j0                  xs d|j2                  xs d|j4                  |j6                  r|j6                  j9                         ndd	       ' |S # t
        $ r6}dt        |      v sdt        |      j                         v rg cY d}~S |d}~ww xY w# t
        $ r,}t;        t<        j>                  d
t        |             d}~ww xY ww)uI   Получить все цепочки из реальных данныхr   r   Nr   r   orderrN   rj   delay_minutesr]   c                     | d   S Nr    xs    rF   <lambda>zget_chains.<locals>.<lambda>t  s
    QwZ rH   rD   rP   r]   trigger_eventstepsactive_chainscompleted_chainsrk   rn   u0   Ошибка получения цепочек: rK   ) r   r0   r   r1   rO   rR   r5   r   r+  rN   r   rP   rt   r]   rv   r   r   rp   ru   r|   r   r!  sortr*  active_chains_countcompleted_chains_countr}   rn   r{   r   r   rS   )r   rT   r   	chains_dbr   chainschainr+  steprj   r   r   r   rX   s                 rF   
get_chainsr5  @  s    @
 **		..9,ce   )	EE  @##!xx188HXHX9XY__aH(0**$&HH-A$B$I$I,//43H3HH%eg " %,.HH5E,F,M,M,//=3U3UU-%' * -,9,E,E,_IZI_I_M!ZZ#'#3#3#Lt7L7L%2%)%7%7%<1) %6 JJ/J0MMhh

!&!4!4!&!:!:!?a$)$@$@$EA ??>C>N>Ne..88:TX	 	A)	V g  	3x=0Os8}GZGZG\4\	N		h  
==Ec!fXN
 	

se   K<K AJ H-K K<	K)J<4K5K 9K<:J<<KK 	K9'K44K99K<
chain_datac                   K   	 |j                   }t        || j                  dd      | j                  d      | j                  dd      dd      }|j                  |       |j	                          | j                  dg       }|D ]A  }|j                  d	      }d
}|r|j                  t              j                  t        j                  |k(  t        j                   |k(        j                         }	|	r|}d
}nv|j                  t              j                  t        j                  |k(  t        j                   |k(        j                         }
|
st        t        j                  d| d      t        |j                  |j                  dt        |      dz         |||j                  dd            }|j                  |       D |j!                          |j#                  |       g }|j$                  D ]x  }d}|j&                  r\|j                  t              j                  t        j                  |j&                  k(        j                         }
|
r|
j(                  }n|j*                  r|j                  t              j                  t        j                  |j*                  k(        j                         }	|	ri|j                  t,              j                  t,        j                  |	j.                  k(        j                         }|r|	j0                  xs |j(                  }|j3                  |j4                  |j&                  xs |j*                  ||j6                  xs d|d       { |j9                  d        |j                  |j(                  |j:                  ||j<                  xs d|j>                  xs d|j@                  |jB                  r|jB                  jE                         dS d
dS # tF        $ r<}|jI                          t        t        jJ                  dtM        |             d
}~ww xY ww)u(   Создать новую цепочкуr]   u   Новая цепочкаr*  rk   Tr   )r   r]   r*  r}   r/  r0  r+  rN   Nr   1    не найден для шага цепочкиrK   r   r[   r!  chain_idr   rN   rv   r!  r   r  c                     | d   S r#  r$  r%  s    rF   r'  zcreate_chain.<locals>.<lambda>  
    7 rH   r(  r)  u.   Ошибка создания цепочки: )'r   r   r   r   r   r0   r   r1   rP   rt   r   r   r   r   r   r/   r   r   r+  rN   r]   rv   r   rp   ru   r|   r   r!  r.  r*  r/  r0  r}   rn   r{   rR   r   rS   r5   )r6  r   rT   r   	new_chain
steps_data	step_datarN   rv   r   r   r4  r+  rj   r   rX   s                   rF   create_chainr@    s    c
 **	 (CD$..9 nnY5 !#$
	 	y

  ^^GR0
# !	I#--6K#  ")= > E E(++{:(22i?! %'  !'2$"&K  "xx188 {2 **i7  eg  $+(.(C(C%8Ev#w 
 "mmGS_q-@A'!1'mmOQ?D FF4LC!	F 			


9 OO 	D<M88H-44X[[DDTDT5TU[[]$,MMM&& ")= > E E(++t/D/DD!%'  !(*1A(B(I(I(++}/Q/QQ)eg & )(5(A(A([EVE[E[LL#//H43H3H!.!%!3!3!8q% #	2 	

+
, ,,NN&44&::?a ) @ @ EA **>G>R>R)..88:	
 		
 Y]	
 		
  

==CCF8L
 	

s5   QO6O? :Q;O? >Q?	Q7P??QQz/chains/{chain_id}r:  c                 
  K   	 |j                   }|j                  t              j                  t        j                  | k(  t        j                   |k(        j                         }|st        t        j                  d      d|v r
|d   |_	        d|v r
|d   |_
        d|v r
|d   |_        d|v r|j                  t              j                  t        j                  |j                  k(        j                          |d   }|D ]A  }|j                  d      }d}	|r|j                  t               j                  t         j                  |k(  t         j                   |k(        j                         }
|
r|}	d}nv|j                  t"              j                  t"        j                  |k(  t"        j                   |k(        j                         }|st        t        j$                  d	| d
      t        |j                  |j                  dt'        |      dz         ||	|j                  dd            }|j)                  |       D t+        j,                         |_        |j1                          |j3                  |       |j3                  |       |j4                   g }|j4                  D ]x  }d}|j6                  r\|j                  t"              j                  t"        j                  |j6                  k(        j                         }|r|j                  }n|j8                  r|j                  t               j                  t         j                  |j8                  k(        j                         }
|
ri|j                  t:              j                  t:        j                  |
j<                  k(        j                         }|r|
j>                  xs |j                  }|jA                  |jB                  |j6                  xs |j8                  ||jD                  xs d|d       { |jG                  d        |j                  |j                  |j                  ||jH                  xs d|jJ                  xs d|j                  |jL                  r|jL                  jO                         dS ddS # t        $ r  tP        $ r<}|jS                          t        t        jT                  dtW        |             d}~ww xY ww)u   Обновить цепочку"   Цепочка не найденаrK   r]   r*  rk   r+  rN   Nr   r8  r   r[   r!  r   r9  r   r  c                     | d   S r#  r$  r%  s    rF   r'  zupdate_chain.<locals>.<lambda>_  r<  rH   r(  r)  u2   Ошибка обновления цепочки: ),r   r0   r   r1   rP   rt   r   r   r   r]   r*  r}   r   r:  r  r   r   r   r   r/   r   r   r   r   r   r   r+  rN   rv   r   rp   ru   r|   r   r!  r.  r/  r0  rn   r{   rR   r   rS   r5   )r:  r6  r   rT   r   r3  r>  r?  rN   rv   r   r   r4  r+  rj   r   rX   s                    rF   update_chainrD    sm    v
 **	&&HH OOy(
 %' 	
 "55;  Z#F+EJj(",_"=E
"(3EO j HHY&&y'9'9UXX'EFMMO $G,J' !	'mmM:#'  $&HH-A$B$I$I,//;>,66)C% eg " %+6(&* $&88H#5#<#<$KK;6$..);$  %' !  ("/,2,G,G)<[MIz'{# 
 !"XX#--Z11DE +%5"+--"C tC!F $??,
		


5 	

5 KK 	D<M88H-44X[[DDTDT5TU[[]$,MMM&& ")= > E E(++t/D/DD!%'  !(*1A(B(I(I(++}/Q/QQ)eg & )(5(A(A([EVE[E[LL#//H43H3H!.!%!3!3!8q% #	2 	

+
, ((JJ"00"66;! % < < A:?:J:J%**446	
 		
 QU	
 		
   

==GAxP
 	

s5   TR,R5 0T1R5 4T5T7S>>TTc                   K   	 |j                   }|j                  t              j                  t        j                  | k(  t        j                   |k(        j                         }|st        t        j                  d      |j                  |       |j                          dddS # t        $ r  t        $ r<}|j                          t        t        j                  dt        |             d}~ww xY ww)u   Удалить цепочкуrB  rK   Tu,   Цепочка успешно удаленаr   u.   Ошибка удаления цепочки: N)r   r0   r   r1   rP   rt   r   r   r   r  r   rR   r   rS   r5   )r:  r   rT   r   r3  rX   s         rF   delete_chainrF  t  s     
 **	&&HH OOy(
 %' 	
 "55;  			%
		,Z[[  

==CCF8L
 	

r
  )Efastapir   r   r   r   sqlalchemy.ormr   sqlalchemy.orm.attributesr   
sqlalchemyr	   r
   r   r   typingr   r   r   loggingapp.db.sessionr   app.db.modelsr   r   r   r   r   r   r   r   r   r   r   app.api.depsr   app.api.schemasr   r   	getLogger__name__rr   routerr   r.   rG   r   rY   rc   r   postr   putr   r  r   r   r   r   r   r  r	  r  r  r  r  r5  r@  rD  rF  r$  rH   rF   <module>rV     s   = = " 3 0 0 !   ! n  n  n  n ) ' 			8	$	` `C `TD[ `UX `F Lk):;&/+,

 <
D !"&/+,

 #
. K&/+,E
E
 E
N [ &/+,o
o
o
 o
b $% &/+,	p
p
p
 	p
 &p
d '( &/+,Y
Y
Y
 )Y
x &' &/+,l
l
l
 (l
\ L&/+,m
m
 m
^ \ &/+,|
|
|
 |
| &' &/+,	W
W
W
 	W
 (W
r +, &/+,}
}
}
 -}
~ )* &/+,!
!
!
 +!
H H&/+,?
?
 ?
B X &/+,T
T
T
 T
l  &/+,	h
h
h
 	h
  h
T !" &/+,


 #
D I&/+,E
E
 E
N Y &/+,i
i
i
 i
V  ! &/+,	}
}
}
 	}
 "}
~ #$ &/+, 
 
 
 % 
rH   