+
    Wi                       ^ RI Ht ^ RIt^ RIt^ RIt^ RIHtHt ^ RIHt ^ RI	H
t
 ^ RIHt ^ RIHt ^ RIHtHtHt ^ R	IHt ^ R
IHtHt ^ RIHt ^ RIHtHt ]P:                  ! ]4      tR R lt R R lt!R R lt"R R lt#R R lt$R R lt%R R lt&R R lt'R R lt(R+R R  llt)R! R" lt*R# R$ lt+R% R& lt,R' R( lt-R) R* lt.R# ),    )annotationsN)datetime	timedelta)Any)text)Session)get_settings)
has_column	has_tabletable_columns)audit_trail)campaign_contacts_tablecampaigns_table)delete_queue_for_campaign)	format_dtnow_appc                    V ^8  d   QhRRRR/# )   waiting_time_rawr   returnint )formats   "app\services\campaign_core.py__annotate__r      s      s s     c                V   V f   ^ # \        V 4      P                  4       pVR8X  g   VR8X  d   ^ # RV9   d<   VP                  R4      ^ ,          P                  4       p \        \	        V4      4      #  \        \	        V4      4      #   \
         d     ^ # i ; i  \
         d     ^ # i ; i)z3PHP-style: first numeric segment or cast of string. 0,)strstripsplitr   float
ValueError)r   sfirsts   &  r    _parse_waiting_minutes_for_retryr(      s    ##%ABw!s(
axQ%%'	uU|$$58}  		  s$   B 3B BBB('B(c               $    V ^8  d   QhRRRRRR/# r   sessionr   business_idr   r   dict[str, Any]r   )r   s   "r   r   r   )   s&     b bW b3 b> br   c                4    V P                  \        R 4      RV/4      P                  4       pV'       g   RRRR/# V^ ,          e
   V^ ,          M^ pV^ 8:  d	   RRRRRV/# RR	RV/#   \         d'   p\        P                  R
T4       RRRR/u Rp?# Rp?ii ; i)zBSELECT remain_min FROM businesses WHERE business_id = :bid LIMIT 1bidvalidFmessagezBusiness not foundNzXInsufficient remaining minutes. Please recharge or upgrade your plan to start campaigns.
remain_minTz$Error checking remaining minutes: %sz3Error checking remaining minutes. Please try again.)executer   r'   	Exceptionloggererror)r+   r,   rowr2   es   &&   r   check_remaining_minutesr9   )   s    booUVK 
 %' 	 UI/CDD"1v1SVq
?uj 
 |Z88 b;Q?	+`aabs(   8A& $A&  A& &B1BBBc               $    V ^8  d   QhRRRRRR/# r*   r   )r   s   "r   r   r   >   s&     ^0 ^0 ^0c ^0n ^0r   c                b   R p V P                  \        R4      RV/4      P                  4       pV'       g   RRRV/# V^ ,          p\        V\        4      '       d0    \
        P                  ! V4      p\        V\        4      '       d   Tp\        V\        4      '       g   RRRV/# \        4       pVP                  R4      P                  4       pVP                  V4      pV'       d   \        V\        4      '       g   RRRVRVRVR	VP                  R
4      /# VP                  RR4      p	V	RJ d   RRRVRVRVR	VP                  R
4      /# . p
VP                  R4      '       d?   \        VR,          \        4      '       d"   \        VR,          4      ^ 8  d   VR,          p
M_VP                  R4      '       d.   VP                  R4      '       d   RVR,          RVR,          /.p
MRRRVRVRVR	VP                  R
4      /# RpV
 EF  pVP                  R4      pVP                  R4      pV'       d	   V'       g   K8   \        P                   ! \	        V4      R
4      P#                  VP$                  VP&                  VP(                  VP*                  R7      p\        P                   ! \	        V4      R
4      P#                  VP$                  VP&                  VP(                  VP*                  R7      pYo8  g   K  TT8:  g   EK  Rp M	  V'       g   RRRVRVRVR	VP                  R
4      /# RRRVRVR	VP                  R
4      /#   \
        P                   d     ELi ; i  \,         d     EKn  i ; i  \.         d+   p\0        P3                  RTRT/R7       RRRT/u Rp?# Rp?ii ; i)zVPlease check the business,if you wan to allow the campaign call edit the business timezESELECT business_time FROM businesses WHERE business_id = :bid LIMIT 1r/   r0   Fr1   z%Abusiness_timecurrent_daycurrent_timez%H:%MenabledT	timeSlotsstartend)yearmonthdaytzinfoz Error checking business time: %sr,   )extraN)r3   r   r'   
isinstancer!   jsonloadsdictJSONDecodeErrorr   strftimelowergetlistlenr   strptimereplacerC   rD   rE   rF   r%   r4   r5   r6   )r+   r,   msgr7   r<   decodednowday_key
day_config
is_enabled
time_slotsis_within_any_slotslotrA   rB   stetr8   s   &&                r   check_business_time_windowr_   >   s   
bC\0ooXYK 
 %' 	 UIs33AmS))**]3gt,,$+M -..UIs33i,,t$**,"&&w/
J!=!=3wW 5   ^^It4
3wW 5  ,.
>>+&&:j6Mt+T+TY\]ghs]tYuxyYy#K0J^^G$$)>)>"Jw$7
5@QRSJ 3wW 5  #DHHW%E((5/C&&s5z7;CC

 D  &&s3x9AA

 B 
 ySBY%)"! $ "3wW 5  T]7CLL1	
 	
M '' n  *  07=R]B^_	3//0s   8M9 M9 .M
 M9 'A2M9 2M9 M9 &AM9 ;M9 0M9 9M9 =M9  B6M&6M9 >M9 M9 M9 1M9 
M#M9 "M##M9 &M61M9 5M66M9 9N.N)#N.)N.c               (    V ^8  d   QhRRRRRRRR/# )	r   r+   r   r,   r   	exenumberr!   r   
int | Noner   )r   s   "r   r   r      s*     $ $' $ $PS $Xb $r   c                   VR 8X  d   R#  \        V R4      '       g   R# \        V R4      pRV9   pRV9   pV'       g   R# V'       d   \        R4      pM\        R4      pV P                  VRVRV/4      P	                  4       pV'       d   V^ ,          R
9   d   R#  \        V^ ,          4      #   \        \        3 d     R# i ; i  \         d"   p\        P                  R	T4        Rp?R# Rp?ii ; i)r   Ndid_numbersbot_id
exe_numberz
                SELECT bot_id FROM did_numbers
                WHERE business_id = :bid AND (did_no = :ex OR exe_number = :ex)
                LIMIT 1
                z
                SELECT bot_id FROM did_numbers
                WHERE business_id = :bid AND did_no = :ex
                LIMIT 1
                r/   exz"getBotIdFromCampaignDid failed: %sNr   )r   r   r   r3   r'   r   	TypeErrorr%   r4   r5   debug)	r+   r,   ra   cols
has_bot_idhas_exe_numberqr7   r8   s	   &&&      r   get_bot_id_from_campaign_didro      s    B!-00Wm4%
%-A A ooa%dI!FGMMOc!f
*	s1v;:& 		 91=sL   C C C AC 
C B- -C>C CC C1C,,C1c               (    V ^8  d   QhRRRRRRRR/# )r   session_clusterr   r,   r   re   rb   r   r   )r   s   "r   r   r      s*      g C Q[ `j r   c                   Ve   VR8X  d   R # V R2p \        W4      '       g   R # V P                  \        RV R24      RV/4      P                  4       pV'       g   R # V^ ,          p\	        WR4      '       d8   \        V\        \        34      '       d   \        V4      ^ 8  d   \        V4      # \        V\        4      '       dc    \        P                  ! V4      pVP                  R4      ;'       g    VP                  R4      pVe   \        V4      ^ 8  d   \        V4      # R # R #   \        P                   d     R # i ; i  \         d"   p\        P                  R	T4        R p?R # R p?ii ; i)
Nr   _botszSELECT concurrent_calls FROM `z` WHERE bot_id = :bid LIMIT 1r/   concurrent_callslimitconcurrent_calls_limitz getBotConcurrentLimit failed: %s)r   r3   r   r'   r
   rH   r   r$   r!   rI   rJ   rO   rL   r4   r5   warning)	rq   r,   re   
bots_tabler7   valrU   ru   r8   s	   &&&      r   get_bot_concurrent_limitrz      sF   ~2=&J55%%1*=Z[\FO
 %' 	 !fo3EFF#U|,,SA3xc3**S/G,UU<T0U$Uau:%  ''   91=sM   E 7E  AE 2E 	-D, 70D, ,EE EE E4E//E4c               (    V ^8  d   QhRRRRRRRR/# )r   rq   r   call_history_tabler!   ra   r   r   r   )r   s   "r   r   r      s*      g 3 [^ cf r   c                   VR 8X  d   ^ #  V P                  \        RV R24      RV/4      P                  4       p\        V4      #   \         do     T P                  \        RT R24      RT/4      P                  4       p\        T4      u #   \         d#   p\
        P                  RT4        Rp? ^ # Rp?ii ; ii ; i)r   SELECT COUNT(*) FROM `z=` WHERE dialstatus IN ('CONNECTING') AND clicktocalldid = :exrg   z8` WHERE dialstatus IN ('CONNECTING') AND exenumber = :exz getBotConnectingCount failed: %sN)r3   r   
scalar_oner   r4   r5   rj   )rq   r|   ra   ne2s   &&&  r   get_bot_connecting_countr      s    B##();(<<yz 9	

 *, 	
 1v 
	'',-?,@@xy y!	
 jl  q6M 	LL;R@	s5   9A B>9B
B>B:B5.B>5B::B>c               (    V ^8  d   QhRRRRRRRR/# )r   session_defaultr   rq   campaign_idr   r   rb   r   )r   s   "r   r   r      s,      /6EHr   c                   \        V R 4      '       dU   V P                  \        R4      RV/4      P                  4       pV'       d"   V^ ,          '       d   \	        V^ ,          4      # V P                  \        R4      4      P                  4       pV Fg  w  p\        V4      p\        W4      '       g   K#  VP                  \        RV R24      RV/4      P                  4       pV'       g   K\  \	        V4      u # 	  R# )scheduled_campaignszLSELECT business_id FROM scheduled_campaigns WHERE campaign_id = :cid LIMIT 1cidz:SELECT business_id FROM businesses WHERE status = 'active'zSELECT 1 FROM `"` WHERE campaign_id = :cid LIMIT 1N)r   r3   r   r'   r   fetchallr   )r   rq   r   r7   rowsr/   tnamerg   s   &&&     r    resolve_business_id_for_campaignr      s     "788%%_`K 
 %' 	 3q66s1v;""IJhj 	 $_,, ((ug-OPQ$ eg  r3x  r   c          
     ,    V ^8  d   QhRRRRRRRRR	R/# )
r   r   r   r,   r   retry_logicr!   custom_attempt_valueszlist[Any] | Noner   r   )r   s   "r   r   r     s:     ( ((( ( ,	(
 	(r   c           	     :   RpVR8X  EdI    V P                  \        R4      RV/4      P                  4       pV'       d
   V^ ,          MRpTp\        V\        4      '       d   \
        P                  ! V4      p\        V\        4      '       d   V'       d   . pVP                  4        F  w  r\        V
\        \        34      '       gB   \        V
\        4      '       g   K9  V
P                  RR^4      P                  4       '       g   Kb  VP                  \        \        V
4      4      4       K  	  V'       d   RP                  R V 4       4      pV# VR	8X  d   T;'       g    . p\        V\         4      '       dh   V'       d`   . pV F?  p
 V
e   \        V
4      MR
pVP                  \        \'        V^<,          4      4      4       KA  	  RP                  R V 4       4      pV# VR8X  d   RpV#   \         d    Rp T# i ; i  \"        \$        3 d    R
p L|i ; i)zFMatches CampaignController::store waiting_time / retry_logic branches.r   business_logicESELECT retry_attempt FROM businesses WHERE business_id = :bid LIMIT 1r/   N.r    c              3  8   "   T F  p\        V4      x  K  	  R # 5iNr!   .0xs   & r   	<genexpr>8compute_waiting_time_for_new_campaign.<locals>.<genexpr>0       2J6a3q666   custom_logicg        c              3  H   "   T F  q^ 8  g   K  \        V4      x  K  	  R# 5i)r   Nr   )r   ms   & r   r   r   =  s     *M7a1f63q667s   ""	not_retry)r3   r   r'   rH   r!   rI   rJ   rK   itemsr   r$   rS   isdigitappendjoinr4   rP   ri   r%   round)r   r,   r   r   waiting_time_valuesr7   radatavalues_kvcustom_valuesminutesr   s   &&&&          r   %compute_waiting_time_for_new_campaignr     s    &&	%!))\]$ eg  QDBD$$$zz$'$%%$$&!ZZ\EB!!c5\22z!S7I7IaiiX[]_abNcNkNkNmNmc%(m4 * *-((2J62J*J'   
	&-33mT**}!#G"$%MasA s5R=12 # #&((*M7*M"M  
	#   	%"$ 	% ":. As=   B	G0 AG0 !$G0 
.G0 9G0 H0H HHHc          
     ,    V ^8  d   QhRRRRRRRRRR	/# )
r   r   r   r,   r   did_noz
str | Nonebot_namer   r!   r   )r   s   "r   r   r   C  s4      +.8BNXr   c                   V'       g   R #  \        V R4      pRV9   pRV9   pR.pV'       d   VP                  R4       VP                  R4       RVRV/pV'       d   VP                  R	4       W8R
&   V'       d   VP                  R4       VP                  R4       V P                  \        RP	                  V4      4      V4      P                  4       p	V	'       dK   V'       d1   \        V	4      ^8  d!   V	^,          R9  d   \        V	^,          4      # \        V	^ ,          4      # V#   \         d#   p
\        P                  RT
4       Tu Rp
?
# Rp
?
ii ; i)r   rd   	directionrf   zSELECT did_noz, exe_numberz< FROM did_numbers WHERE business_id = :bid AND did_no = :didr/   didz AND bot_id = :botbotz AND direction = 'outbound'z LIMIT 1 Nz#Error fetching executive number: %srh   )r   r   r3   r   r   r'   rQ   r!   r4   r5   r6   )r   r,   r   r   rk   has_directionrm   sqlparamsr7   r8   s   &&&&       r   fetch_executive_numberr   C  s     _m<#t+%-
 JJ~&

QR"'eV!DJJ+,$5MJJ45

:%%d388C=&96BHHJ#c(Q,3q63K3q6{"s1v; :A>s=   AD( D( :A)D( $/D( D( &D( (E3E
EEc               D    V ^8  d   QhRRRRRRRRRRR	R
RR
RR
RR
RRRR/# )r   rq   r   call_idr   
contact_idr   r   r,   
table_namer!   campaigns_table_namenumberr|   retry_already_decrementedboolr   r-   r   )r   s   "r   r   r   d  s     m3 m3m3m3 m3 	m3
 m3 m3 m3 m3 m3  $m3 m3r   c
           
        T	p
 \         P                  ! ^4       \        V4      pV P                  \	        RV R24      RV/4      P                  4       pV'       g0   V P                  \	        RV R24      RV/4      P                  4       pRpV'       d,   V^,          e!   \        V^,          4      P                  4       pRVR\        4       /p\        WR4      '       d	   Ve   WR&   VEe   VP                  4       R8X  d   RVR	&   \        P                  R
W'4       EMYV P                  \	        RV R24      RVRV/4      P                  4       P                  4       pV P                  \	        RV R24      RV/4      P                  4       P                  4       pV'       d   \        VR,          ;'       g    ^ 4      M^ pV'       d
   VR,          M^ p\        V4      pWR	&   V^ 8  d[   \        WR4      '       dH   V^ 8  d+   \        4       \        VR7      ,           p\!        V4      VR&   MK\!        \        4       4      VR&   M4\        WR4      '       d   RVR&   \        P                  RVV4       MRVR	&   \        WR4      '       d   ^ VR&   RP#                  R VP%                  4        4       4      p/ VCRVRV/CpV P                  \	        RV RV R24      V4      p\        P                  RVVP&                  4       \        VP)                  R	R4      4      P                  4       R8X  d    \+        V \,        WC4       RR RVR	VP)                  R	4      R!R /#   \.         d!   p\        P1                  RT4        Rp?L?Rp?ii ; i  \.         d   p\        P3                  R"TT4        R	RRTR\        4       /p\        YR4      '       d   ^ TR&   RP#                  R# TP%                  4        4       4      pT P                  \	        RT RT R24      / TCRTRT/C4       M.  \.         d!   p\        P3                  R$T4        Rp?MRp?ii ; iRR%R&\        T4      /u Rp?# Rp?ii ; i)'   z SELECT callid, dialstatus FROM `z` WHERE callid = :cid LIMIT 1r   Nr   
updated_at
dialstatusANSWERstatusz;Call answered for contact %s (Number: %s) - no retry neededz!SELECT id, `retry`, status FROM `z/` WHERE id = :id AND campaign_id = :cid LIMIT 1idz'SELECT campaign_id, waiting_time FROM `r   retrywaiting_timeretry_at)r   z0No retries remaining for contact %s (Number: %s)pendingpriority, c              3  2   "   T F  pR V RV 2x  K  	  R# 5i`z` = :Nr   r   ks   & r   r   /fetch_dial_status_and_update.<locals>.<genexpr>  s     E2DQ1QCuQC2D   UPDATE `` SET z& WHERE id = :id AND campaign_id = :cidz5Updated contact %s with dialstatus from mcube rows=%sr   z4Failed to check campaign completion after ANSWER: %ssuccessTupdatedz4Error fetching dialstatus from mcube for call %s: %sc              3  2   "   T F  pR V RV 2x  K  	  R# 5ir   r   r   s   & r   r   r     s     @iq5_ir   z"Failed fallback contact update: %sFr6   )timesleepr!   r3   r   r'   r"   r   r
   upperr5   infomappingsr   r(   r   r   r   keysrowcountrO   !check_and_mark_campaign_completedr   r4   rw   r6   )rq   r   r   r   r,   r   r   r   r|   r   _call_id_strr7   dial_statusupdate_datacontactcampaigncurrent_retryr   waiting_minutesr   setsr   resr8   fbr   s   &&&&&&&&&&                 r   fetch_dial_status_and_updater   d  s[    	"A`3

1'l%%34F3GGdefK 
 %' 	 !))78J7KKhij  eg 
 3q6%c!f+++-K'0'<&So<@@[E\(3%"  "h.(0H%Y[en)11<ZLHwxy:uk: (*UUW  +22ABVAWWyz K(	
 (*UUW  ?FGG$4$9$9 :1?G8N#;Q "BCS"T(3H% 1$!/zJJ*Q.'.y9_3U'UH6?6IK
36?	6JK
3!/zJJ26J/KKJ" %.K!o:>>&'K
#yyE+2B2B2DEEFKFz5+F%%8J<vdV3YZ[
 	CLL	
 {x,-335AZ1/?T_m 4{HkooV^F_ajlpqq  ZUWXYYZ  3KWVWX
	CIy'<SB/zBB!":99@bggi@@D##x
|6$7]^_<2<tZ<  	CLL=rBB	C5'3q6223s   BN	 D"N	 8N	 	E'N	 1M N	 N&N<N	 NN	 	Q+Q&,A7P$#Q&$Q/Q
Q&
QQ& Q+&Q+c          
     ,    V ^8  d   QhRRRRRRRRRR/# )	r   rq   r   r   r,   r   r   r   r   r   )r   s   "r   r   r     sA     u uuu u 	u
 
ur   c                V    \        V4      p\        V4      pV P                  \        R V R24      RV/4      P	                  4       P                  4       pV'       g   R# VP                  R4      ;'       g    RpVR8X  d   \        W#4       R# V P                  \        RV R24      RV/4      P                  4       p\        V4      pV^ 8X  d   R# VP                  R	4      p	V	e   \        V	4      P                  4       MRp
V
R8X  g   V
R8X  dO   V P                  \        RV R24      R\        4       RV/4       \        W#4       \        P                  RV4       R# V P                  \        RV R24      RV/4      P                  4       p\        V4      pW8X  dV   V^ 8  dO   V P                  \        RV R24      R\        4       RV/4       \        W#4       \        P                  RV4       R# V P                  \        RV R24      RV/4      P                  4       pV P                  \        RV R24      RV/4      P                  4       p\        V4      p\        V4      pV^ 8H  ;'       d    V^ 8  ;'       d    W8H  p\        P                  RVVVVV4       V'       Ed>   \        VP                  R4      ;'       g    ^ 4      ^ 8H  pVP                  R	4      pVe   \        V4      P                  4       MRpVR8g  ;'       d    VR8g  pVR8w  d   V'       d+   V'       g#   \        P                  R4       \        WW#4       M&V'       d   V'       d   \        P!                  RV4       V P                  \        RV R24      R\        4       RV/4       \        P                  RV4       R# V'       d)   VR8X  d"   \        P                  R4       \        WW#4       R# \        P                  RV4       R#   \"         d"   p\        P%                  RT4        R
p?R# R
p?ii ; i)SELECT * FROM `r   r   Fr   unknown	completedr~   z` WHERE campaign_id = :cidr   Nr   r   r   zD` SET status = 'completed', updated_at = :u WHERE campaign_id = :ciduz1Campaign %s marked completed (waiting_time empty)TzK` WHERE campaign_id = :cid AND UPPER(TRIM(COALESCE(status, ''))) = 'ANSWER'z)Campaign %s marked completed (all ANSWER)z.` WHERE campaign_id = :cid AND call_id IS NULLz2` WHERE campaign_id = :cid AND call_id IS NOT NULLzacheckAndMarkCampaignCompleted campaign=%s total=%s attempted=%s not_attempted=%s all_attempted=%srun_nowz5Run_now first pass done - updating waiting_time/retryz(Campaign %s already has waiting_time setzA` SET status = 'active', updated_at = :u WHERE campaign_id = :cidz(Campaign %s set active (first pass done)z6Campaign completed but waiting_time empty, updating...z-Campaign not ready for completion campaign=%sz'checkAndMarkCampaignCompleted error: %s)r   r   r3   r   r   r'   rO   r   r   r   r!   r"   r   r5   r   .update_waiting_time_and_retry_after_completionrj   r4   r6   )rq   r   r,   r   r   r   r   current_statustotal_contactswaiting_raw
wt_trimmedanswer_contactsnot_attempted	attemptedall_attempted
is_run_nowcur_wtcur_trimwaiting_time_already_setr8   s   &&&&                r   r   r     s   o,[9
.{;"**?#7"88Z[\K 
 (*UUW 	 !h/<<9[(%k?(00)*5OPQK 
 *, 	 ^,Qll>21<1HS%++-b
zS0##x 455yz{gi4 &k?KKC )11( 5C C K 
 *, 	 o.,!1C##x 455yz{gi4 &k?KKC[Q'//)*5cdeK 
 *, 	 $++)*5ghiK 
 *, 	 M*	N	%*aa~/AaaiFao	
 =X\\)499:a?J\\.1F.4.@s6{((*bH'/2~'I'I(c/$,&>KK WXB'+  $<LL!K[Y''8$8#99z{|')UK8 FT2~$\]F+k C[Q >Bs   AO< O< 7O< AO< B
O< BO< 2BO< ?'O< 'O< AO< 
O< O< ')O< O< AO< 2O< :(O< $O< <P(P##P(c          
     ,    V ^8  d   QhRRRRRRRRRR	/# )
r   rq   r   r   r   r,   resultr-   r   Noner   )r   s   "r   r   r   L  s:     (< (<(<(< (< 	(<
 
(<r   c           	        \        V4      p\        W4      '       g   R # V P                  \        RV R24      RV/4      P	                  4       P                  4       pV'       g   R # VP                  R4      RJ g   R # VP                  R4      ;'       g    Rp\        V\        4      '       d   RV9   d   VP                  R4       Uu. uFa  qwP                  4       '       g   K  VP                  4       P                  R	R
^4      P                  4       '       g   KQ  VP                  4       NKc  	  ppV Uu. uF  p\        \        V4      4      NK  	  p	pMR\        V4      P                  R	R
^4      P                  4       '       d   \        \        V4      4      M^ p
V
^ 8  d   V
.M. p	V	'       g   R # V	P                  ^ 4       V	'       d   RP!                  R V	 4       4      MR
pRV/pVR
8X  d   RVR&   \#        4       VR&   RP!                  R VP%                  4        4       4      pV P                  \        RV RV R24      / VCRV/C4       VR
8X  d   \'        W!4       R # R # u upi u upi )Nr   r   r   r   Tr   r   r    r   r   c              3  8   "   T F  p\        V4      x  K  	  R # 5ir   r   r   s   & r   r   2update_waiting_time_after_retry.<locals>.<genexpr>i  s     ;{!s1vv{r   r   r   r   r   c              3  2   "   T F  pR V RV 2x  K  	  R# 5ir   r   r   s   & r   r   r  n  s     =nq5_nr   r   r   z WHERE campaign_id = :cid)r   r   r3   r   r   r'   rO   rH   r!   r#   r"   rS   r   r   r$   popr   r   r   r   )rq   r   r,   r  r   r   r   r   arrwaiting_arrsingleupdated_waitingpayloadr   s   &&&&          r   update_waiting_time_after_retryr  L  s    +;7_;;&&344VWX	 hj  JJy!T),,~.55#K+s##{(:"-"3"3C"8r"8QGGIy!'')J[J[\_acefJgJoJoJqyqwwy"8r.12cs58}c2,/,<,D,DS"a,P,X,X,Z,ZU;'(`a"(1*vh"OOA?Jchh;{;;PRO/G"' '	99=glln==Dx,-VD69RST'7'E;' "!+; ' s2s   I%$2I%I%5I*c          
     ,    V ^8  d   QhRRRRRRRRRR/# 	r   rq   r   r   r,   r   r   r   r  r   )r   s   "r   r   r   w  s;     4T 4T4T/64TEH4TWZ4T	4Tr   c                x   \        V4      p\        V4      p V P                  \        R V R24      RV/4      P	                  4       P                  4       pV'       g   R# \        VP                  R4      ;'       g    ^ 4      ^8w  d   R# Rp^ p VP                  \        R4      RV/4      P                  4       p	V	'       d
   V	^ ,          MRp
T
p\        V\        4      '       d   \        P                  ! V4      p\        V\        4      '       d   V'       d   . pVP                  4        F  w  r\        V\        \        34      '       gB   \        V\        4      '       g   K9  VP                  RR^4      P!                  4       '       g   Kb  VP#                  \        \        V4      4      4       K  	  V'       d+   R	P%                  R
 V 4       4      p\'        V4      ^,           pT'       d.   T P                  \        RT R24      RTR\/        4       RT/4       \1        Y4      '       d2   T P                  \        RT R24      RTR\/        4       RTRT/4       R# R#   \(         d!   p\*        P-                  RT4        Rp?LRp?ii ; i  \(         d"   p\*        P-                  RT4        Rp?R# Rp?ii ; i)r   r   r   Nr   r   r   r/   r   r    c              3  8   "   T F  p\        V4      x  K  	  R # 5ir   r   r   s   & r   r   Gupdate_waiting_time_and_retry_for_scheduled_campaign.<locals>.<genexpr>  r   r   retry_attempt fetch error: %sr   B` SET waiting_time = :wt, updated_at = :u WHERE campaign_id = :cidwtr   S` SET `retry` = :r, updated_at = :u WHERE campaign_id = :cid AND business_id = :bidrz8update_waiting_time_and_retry_for_scheduled_campaign: %sr   r   r3   r   r   r'   r   rO   rH   r!   rI   rJ   rK   r   r$   rS   r   r   r   rQ   r4   r5   r6   r   r   rq   r   r,   r   r   contacts_tabler   r   retry_attempt_countr7   retry_attemptr   r   r   r   r8   s   &&&&            r   4update_waiting_time_and_retry_for_scheduled_campaignr#  w  se    !-J,[9N/T"**?:,.PQRK 
 (*UUW 	 x||I&++!,1 	=!))\]$ eg  '*CFtM D$$$zz$'$%%$!ZZ\EB!!c5\22z!S7I7IaiiX[]_abNcNkNkNmNmc%(m4 * *-((2J62J*J'*-f+/' ##x
|+mno*CE;O
 _55##~. /F F )3	5+uVab 6  	=LL8!<<	="  TOQRSSTsu   AJ J <J 
J B	I AI $$I .I <*I &J .A-J J
*J J J

J J9J44J9c          
     ,    V ^8  d   QhRRRRRRRRRR/# r  r   )r   s   "r   r   r     s;     3N 3N3N/63NEH3NWZ3N	3Nr   c                h   \        V4      p\        V4      p V P                  \        R V R24      RV/4      P	                  4       P                  4       pV'       g   R# \        VP                  R4      ;'       g    ^ 4      ^8X  d   R# Rp^ p VP                  \        R4      RV/4      P                  4       p	V	'       d
   V	^ ,          MRp
T
p\        V\        4      '       d   \        P                  ! V4      p\        V\        4      '       d   V'       d   . pVP                  4        F  w  r\        V\        \        34      '       gB   \        V\        4      '       g   K9  VP                  RR^4      P!                  4       '       g   Kb  VP#                  \        \        V4      4      4       K  	  V'       d+   R	P%                  R
 V 4       4      p\'        V4      ^,           pT P                  \        RT R24      RTR\/        4       RT/4       \1        Y4      '       d2   T P                  \        RT R24      RTR\/        4       RTRT/4       R# R#   \(         d!   p\*        P-                  RT4        Rp?LRp?ii ; i  \(         d"   p\*        P-                  RT4        Rp?R# Rp?ii ; i)r   r   r   Nr   r   r   r/   r   r    c              3  8   "   T F  p\        V4      x  K  	  R # 5ir   r   r   s   & r   r   Aupdate_waiting_time_and_retry_after_completion.<locals>.<genexpr>  r   r   r  r   r  r  r   r  r  z2update_waiting_time_and_retry_after_completion: %sr  r  s   &&&&            r   r   r     sa    !-J,[9N.N"**?:,.PQRK 
 (*UUW 	 x||I&++!,1 	=!))\]$ eg  '*CFtM D$$$zz$'$%%$!ZZ\EB!!c5\22z!S7I7IaiiX[]_abNcNkNkNmNmc%(m4 * *-((2J62J*J'*-f+/' 	8J<'ijk&WY{K	

 _55##~. /F F )3	5+uVab 6  	=LL8!<<	=   NI1MMNso   AJ J <J 
J B	I AI $$I .I <*I &A-J J"I=8J =JJ J1J,,J1c               0    V ^8  d   QhRRRRRRRRRRR	R
/# )r   rq   r   r   r,   r   r   contactszlist[dict[str, Any]]r   r-   r   )r   s   "r   r   r     sT     H^ H^H^H^ H^ 	H^
 #H^ H^r   c                   \        V4      p\        V4      p\        W4      '       g   \        R V R24      hV P	                  \        RV R24      RV/4      P                  4       P                  4       p^ pRp	Rp
V'       Ed   \        VP                  R4      ;'       g    ^ 4      ^ 8H  p	VP                  R4      ;'       g    RpVR	8X  d   ^pR
p
EM]V	'       Ed@   VP                  R4      pVe   \        V4      P                  4       R8w  d   \        V4      P                  R4       Uu. uFa  qP                  4       '       g   K  VP                  4       P                  RR^4      P                  4       '       g   KQ  VP                  4       NKc  	  ppV'       d   \        V4      ^,           M^pEM~VR	8X  g   VR8w  d   ^pR
p
\         P#                  R4       EMU VP	                  \        R4      RV/4      P                  4       pV'       d
   V^ ,          MRpTp\%        V\        4      '       d   \&        P(                  ! V4      p\%        V\*        4      '       d   V'       d   . pVP-                  4        F  w  pp\%        V\        \.        34      '       gB   \%        V\        4      '       g   K:  VP                  RR^4      P                  4       '       g   Kc  VP1                  \        \/        V4      4      4       K  	  V'       d   \        V4      M^pM^pM\         P#                  R4       . pV F  pVP                  R4      ;'       g    RpVP                  R4      ;'       g    VP                  R4      ;'       g    RpV	'       d   TM^ pTP1                  RTRTRTRTRVP                  R4      ;'       g    RRRRVR\7        4       R \7        4       /	4       K  	  . R3OpR!P9                  R" V 4       4      pR!P9                  R# V 4       4      pV F(  pV P	                  \        R$V R%V R&V R'24      V4       K*  	  V	'       Ed   V'       Edv   V
'       Egm   V^ 8:  Ed   V'       Ed   VP                  R4      pVe   \        V4      P                  4       R8w  d   \        V4      P                  R4       Uu. uFa  qP                  4       '       g   K  VP                  4       P                  RR^4      P                  4       '       g   KQ  VP                  4       NKc  	  ppV'       d   \        V4      M^pEM@ VP	                  \        R4      RV/4      P                  4       pV'       d
   V^ ,          MRpTp\%        V\        4      '       d   \&        P(                  ! V4      p\%        V\*        4      '       d   V'       d   . pVP-                  4        F  w  pp\%        V\        \.        34      '       gB   \%        V\        4      '       g   K:  VP                  RR^4      P                  4       '       g   Kc  VP1                  \        \/        V4      4      4       K  	  V'       d   \        V4      M^pM^p V^ 8  d1   V P	                  \        R(V R)24      R*VR+\7        4       RVRV/4       M\         P5                  R,4       V P	                  \        R-V R.24      RVRVR/\        V4      /4      P                  4       P;                  4       pR0R
R1\        V4      R2\=        V4      /# u upi   \2         d$   p^ p\         P5                  RT4        Rp?EL-Rp?ii ; iu upi   \2         d    ^p Li ; i)4zCampaign contacts table z does not existr   r   r   Fr   r   r   r   Tr   Nr    r   r   z@storeCampaignContacts - not_retry or empty waiting_time, retry=1r   r/   z.storeCampaignContacts business retry error: %sz)Scheduled campaign, retry set when startsnamer   phone_numberr,   r   r   sourcer   r   r   
created_atr   r   c              3  ,   "   T F
  pR V 2x  K  	  R# 5i):Nr   r   cs   & r   r   *store_campaign_contacts.<locals>.<genexpr>6  s     3dqWds   c              3  .   "   T F  pR V R 2x  K  	  R# 5i)r   Nr   r1  s   & r   r   r3  7  s     /$Q!A3a$s   zINSERT INTO `z` (z
) VALUES ()r   z` SET `retry` = :r, updated_at = :u WHERE campaign_id = :cid AND business_id = :bid AND (`retry` != :r OR `retry` IS NULL OR `retry` = 0)r  r   z5storeCampaignContacts could not determine retry_valuez@SELECT id, number, status, name, campaign_id, business_id FROM `zM` WHERE campaign_id = :cid AND business_id = :bid ORDER BY id DESC LIMIT :limlimr   inserted_countr)  )	r,   r   r+  r   r-  r   r   r.  r   )r   r   r   RuntimeErrorr3   r   r   r'   r   rO   r!   r"   r#   rS   r   rQ   r5   r   rH   rI   rJ   rK   r   r$   r   r4   rw   r   r   allrP   )rq   r   r,   r   r)  r   r   r   retry_valuer  is_not_retry_campaigncampaign_retry_logicr  r   r  r7   r   r   r   r   r   r8   contact_rowsr2  r+  r   final_retryrk   placeholderscollistinserteds   &&&&&                          r   store_campaign_contactsrB    s^    )5J*;7_115j\QRR&&344VWX	 hj 
 KJ!xi055A6!;
'||M:@@b;.K$(!Zn-B~#b'--/R"725b'--2D~2DQ	yVWV]V]V_VgVghkmoqrVsV{V{V}yqwwy2D~6Ac+.2q';6:NRb:b"#K,0)KK bc\-55 !hi"K0  %'  (+SV!%dC00#'::d#3D%dD11d%'F)-A#-a#u#>#>:aQTCUCUZ[ZcZcdgikmnZoZwZwZyZy$*MM#eAh-$@ *6 :@#f+QK*+K
 KKCDLuuV}""y!@@QUU>%:@@b%/kQ{{&!%%///R)gigi
	
	 $ uD993d33Lii/$//G=Cy
<.PQRS	
  zhh'<'<!n-B~#b'--/R"725b'--2D~2DQ	yVWV]V]V_VgVghkmoqrVsV{V{V}yqwwy2D~2=c+.1$)11de, eg  $'QDBD!$,,#zz$/!$--$!#%)ZZ\EB)!c5\::z!S?Q?QVWV_V_`cegijVkVsVsVuVu &c%(m < &2 6<c&k&' ?##zl +| | k3	5+ukZ NNRS&&Nzl [Z Z	
 
UKL8IJ hj  t-s</@*dS[n]]S 2 % \&''WYZ[[\L ( ! $"#K$s   *\.2\.=\.B	\3 %A\3 1$\3 .\3 	\3 \3 >]$2]$]$?B	]) 	A]) $]) >.]) -]) ;]) 3]!>]]!)]98]9)F)/
__future__r   rI   loggingr   r   r   typingr   
sqlalchemyr   sqlalchemy.ormr   
app.configr	   app.repositories.schema_helperr
   r   r   app.services.audit_logr   app.utils.cluster_table_namesr   r   app.utils.rabbitmq_campaignr   app.utils.timezone_utilr   r   	getLogger__name__r5   r(   r9   r_   ro   rz   r   r   r   r   r   r   r  r#  r   rB  r   r   r   <module>rP     s    "    (   " # O O . R A 6			8	$&b*^0B$N>24(VBm3`up(<V4Tn3NlH^r   