+
    i>                        ^ RI Ht  ^ RIt^ RIHt ^ RIHt ^ RIHt ^ RI	H
t
Ht ^ RIHt ^ RIHt ^ R	IHtHt ^ R
IHt ^ RIHtHt ]P0                  ! ]4      tR R ltR R ltR# )    )annotationsN)BackgroundScheduler)text)get_settings)session_scope_clustersession_scope_default)campaigns_table)	has_table)check_remaining_minutes4update_waiting_time_and_retry_for_scheduled_campaign)dispatch_campaign_to_queue)	format_dtnow_appc                   V ^8  d   QhRR/# )   returnNone )formats   "app\scheduler_jobs.py__annotate__r      s     @? @?t @?    c                    \        4       p \        V 4      pV P                  ^ ^ R7      pV P                  ^;RR7      p\        4       ;_uu_ 4       p\	        4       ;_uu_ 4       p\        VR4      '       g    RRR4       RRR4       R# VP                  \        R4      4      P                  4       pV EF  w  p\        V4      p\        WX4      '       g   K$  VP                  \        R4      RVR\        V4      R	\        V4      /4      P                  4       p	V	 EFR  w  rp VP                  \        R
V R24      RV/4      P                  4       P                  4       pV'       g   KO  \        V\        V4      4      pVR,          '       gV   VP                  \        R4      RVR,          RVRV
/4       VP                  \        RV R24      R\        4       RV/4       K  VP                  \        RV R24      R\        4       RV/4       \        WT\        V4      \        V4      4       VP                  \        R4      RVRV
/4       \        V\        V4      \        V4      RR4       EKU  	  EK  	  RRR4       RRR4       R#   \          d#   p\"        P%                  RT4        Rp?EK  Rp?ii ; i  + '       g   i     LJ; i  + '       g   i     R# ; i)z
Simplified port of processScheduledCampaignsCron: pending rows in scheduled_campaigns
for current minute + dispatch queue. Full cluster-table minute window can be extended.
)secondmicrosecondi?B scheduled_campaignsNz:SELECT business_id FROM businesses WHERE status = 'active'z
                    SELECT id, campaign_id, business_id FROM scheduled_campaigns
                    WHERE business_id = :bid AND status = 'pending'
                    AND execute_at BETWEEN :ms AND :me
                    bidmsmezSELECT * FROM `z"` WHERE campaign_id = :cid LIMIT 1cidvalidzdUPDATE scheduled_campaigns SET status = 'failed', error_message = :m, updated_at = :u WHERE id = :idmmessageuidzUPDATE `zA` SET status = 'paused', updated_at = :u WHERE campaign_id = :cidzA` SET status = 'active', updated_at = :u WHERE campaign_id = :cidzSUPDATE scheduled_campaigns SET status = 'completed', updated_at = :u WHERE id = :idFzscheduled row error: %s)r   r   replacer   r   r
   executer   fetchallr	   mappingsfirstr   intr   r   	Exceptionloggererror)nowcurrent_date_timeminute_start
minute_endsdsc
businessesbusiness_id
table_namerows_row_idcampaign_idr   campaignmces                   r   %process_scheduled_campaigns_cron_tickr>      s   
 )C!#;;aQ;7LBF;J		 	 B(=(?(?2233 )@	 	  ZZ%a bclln
(N[(5JR,,:: ;)L1)J/ hj  .2)c?!zzzl:\]^,  hj  $ 0SX>Bg;;

  !G !"Y-6GwW	 

 8J<7x!yz ')UK@ !JJx
|3tuvgi< IQTUXQY[^_j[klJJrs/w? /r3{3CSXuV[\= .2% )	 )@	 	 j ! ?LL!:A>>?k )@(?	 	 	 sv   K	!J6	5K	BJ6	 AJ%J6	'A7JJ6	 B
J*
J6	4K	J3J.'J6	.J33J6	6KK		K	c                   V ^8  d   QhRR/# )r   r   r   r   )r   s   "r   r   r   ^   s      , r   c                     \        \        4       P                  R 7      p V P                  \        R^RR7       V P                  4        V # ))timezoneintervalr   )minutesr%   )r   r   rA   add_jobr>   start)scheds    r   start_schedulerrG   ^   s8    )@)@AE	MM7QShMi	KKMLr   )
__future__r   logging!apscheduler.schedulers.backgroundr   
sqlalchemyr   
app.configr   app.databaser   r   app.utils.cluster_table_namesr	   app.repositories.schema_helperr
   app.services.campaign_corer   r   app.utils.queue_dispatchr   app.utils.timezone_utilr   r   	getLogger__name__r-   r>   rG   r   r   r   <module>rU      sN    "
  A  # E 9 4 @ 6			8	$@?Fr   