
    *Wiw                         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	m
Z
mZmZ d dlmZ d dlmZ  edd	
      dedefd       Z edd
      defd       Zy)    )shared_task)Session)datetime	timedelta)SessionLocal)NotificationCustomerDeliverySegment)deliver_message)get_settingsTz.app.workers.notifications.enqueue_notification)bindnamenotification_idreturnc           	      N   t               }	 |j                  t              j                  t        j                  |k(        j                         }|sd| d|j                          S g }|j                  rS|j                  t              j                  t        j                  |j                  k(        j                         }|r|g}n|j                  r|j                  t              j                  t        j                  |j                  k(        j                         }|r|j                  xs i }|j                  t              j                  t        j                  |j                  k(        }d|v r1|j                  t        j                  j                  |d               }|j                         }|s-d|_        |j!                          d| d|j                          S |j"                  j$                  xs ddgi}	|	j'                  ddg      }
d}|D ]  }|
D ]  }d	}|d
k(  r|j(                  r|j(                  }n;|dk(  r|j*                  r|j*                  }n|dk(  r|j,                  r|j,                  }|sat/        |j                  ||dd      }|j1                  |       |j3                          t5        j6                  |j                         |dz  }  d|_        |j!                          d| d| |j                          S # |j                          w xY w)aO  
    Expand notification to individual deliveries per customer and channel
    
    Args:
        notification_id: Notification record ID
    
    Flow:
    1. Resolve segment or single customer
    2. For each customer, create Delivery records per channel (based on template.channel_strategy)
    3. Enqueue deliver_message tasks
    znotification:z
:not_foundtagsfailedz:no_recipientsprimaryemailr   Ntelegramvkpending)r   channeltargetstatusattempts   
processingz
:enqueued:)r   queryr   filteridfirstclosecustomer_idr	   
segment_idr   	tenant_idr   overlapallr   committemplatechannel_strategyget
tg_chat_id
vk_user_idr   r
   addflushr   delay)selfr   dbnotification	customerscustomersegmentfilter_configr    r,   channelsdelivery_countr   r   deliverys                  3/var/www/notifications/app/workers/notifications.pyenqueue_notificationr>   
   s    .BCxx-44\__5WX^^`"?"3:>@ 	
{ 	##xx)00@X@X1XY__aH%J	$$hhw'..wzz\=T=T/TU[[]G ' 4"*11(2D2DH^H^2^_]*!LL)>)>}V?T)UVE!IIK	"*LIIK"?"3>BR 	
M (00AA[iRYQZE[#''	G9=! 	(H# (j(X-@-@%00F_)<)<%00F'HNN%^^F '(4 '%(!" H FF8$HHJ $))(++6"a'N3(	(8 +
		/z.9IJ 	

s!   A
L 'E.L &BL  BL L$z&app.workers.notifications.cleanup_logsc                 r   t               }	 t               }|j                  }t        j                         t        |      z
  }|j                  t              j                  t        j                  j                  d      t        j                  |k        j                  d      }|j                          d| d| d|j                          d|j                          S # t        $ r8}|j!                          d	t#        |       cY d}~|j                          S d}~ww xY w# |j                          w xY w)
uE  
    Periodic task to clean up old delivery logs (retention policy)
    
    Удаляет записи доставки старше указанного периода (по умолчанию 90 дней).
    Использует поле sent_at для определения возраста записи.
    Удаляет только записи с установленным sent_at (завершенные доставки).
    Записи без sent_at (pending) не удаляются, так как они могут быть еще в обработке.
    )daysNF)synchronize_sessionzok: deleted z delivery logs older than z days (cutoff: )zerror: )r   r   DELIVERY_LOG_RETENTION_DAYSr   utcnowr   r    r
   r!   sent_atisnotdeleter*   dater$   	Exceptionrollbackstr)r3   r4   settingsretention_dayscutoff_datedeleted_countes          r=   cleanup_logsrQ   _   s    .B>!== oo')*HH *11""4({*
 &U&
+ 	
 			m_,F~FVVefqfvfvfxeyyz{ 	
  "
Q!! 	
" 	
s0   CC   	D!)DD!D$ D!!D$ $D6N)celeryr   sqlalchemy.ormr   r   r   app.db.sessionr   app.db.modelsr   r	   r
   r   app.workers.deliveriesr   app.core.configr   intrK   r>   rQ        r=   <module>r[      sq     " ( ' C C 2 ( $MNQ Q Q OQh $EF## # G#rZ   