
    yMj:                        d Z ddlZddlZddlmZmZ ddlmZ ddlZddlZddl	Z	 ej                  d      Zdededefd	Zd
edededefdZdedefdZddZddZedk(  rc ej,                  ej.                  d ej0                  ej2                         ej4                         g        e	j6                           e        yy)u   
Worker de follow-up. Roda em loop, a cada N segundos consulta o banco,
determina quais notificações venceram e envia via DinastiAPI.
    N)datetimetimezone)Optionalzpx3_followup.workerphonebodyreturnc                    t         j                  j                  d       t         j                   }dt         j                  d}| |d}	 t        j                  |||d      }|j                  dk\  r0t        j                  d|j                  | |j                  d d	        y
t        j                  d|        y# t        $ r!}t        j                  d| |       Y d }~y
d }~ww xY w)N/zapplication/json)zContent-Typetoken)PhoneBody   )jsonheaderstimeouti  z(DinastiAPI erro %s ao enviar para %s: %si,  Fu   Notificação enviada para %sTz$Falha ao enviar WhatsApp para %s: %s)configDINASTIA_URLrstripDINASTIA_SEND_ENDPOINTDINASTIA_TOKENrequestspoststatus_codelogerrortextinfo	Exception	exception)r   r   urlr   payloadrespes          ;/opt/mia/workspace/clientes/px3lab/followup_notif/worker.pysend_whatsappr%      s      '',-f.K.K-L
MC*&&G t,G}}SwLs"II:  %4C 0%8 <eQGs   AB: #B: :	C$CC$event	tag_labeldelay_hoursc           
          d| j                  d      xs d d| j                  d      xs d d| dt        j                  |       d		S )
Nu(   🔔 PX3 - Follow-up necessário

Lead: contact_namez
(sem nome)z
Telefone: contact_phonez(sem telefone)z	
Evento: u   
Tempo: há z

Retorne agora.)getr   delay_label)r&   r'   r(   s      r$   build_messager.   .   se    	>*:l; <YY/C3CD E+ ((56 7		    valuec                     | j                  d      r| j                  dd      } t        j                  |       }|j                   |j                  t
        j                        }|S )zA
    Aceita ISO com/sem timezone. Se vier naive, assume UTC.
    Zz+00:00)tzinfo)endswithreplacer   fromisoformatr3   r   utc)r0   dts     r$   	_parse_tsr9   <   sS     ~~cc8,				&B	yyZZx||Z,Ir/   c            	         t        j                  t        j                        } t	        j
                         }t        j                  dt        |             |D ]  }|d   }t        j                  j                  |      }|s+t        |d         }| |z
  j                         dz  }|d   D ]  }||k  r ^t	        j                  |d   |      r$|j                  d      xs d}t        j                  j                  |      }	|	s6t        j!                  d	||d   ||       t	        j"                  |d   |       t%        ||d
   |      }
t'        |	|
      }|st	        j"                  |d   |          y)uo   
    Percorre todos os eventos e envia as notificações que já venceram
    e ainda não foram enviadas.
    z+Worker rodando - %d evento(s) monitorado(s)tagtag_added_atg      @delays_hoursidassigned_user_id zDSem WhatsApp para assignedTo=%s (event %s, tag=%s, delay=%sh) - skiplabelN)r   nowr   r7   dblist_all_eventsr   r   lenr   TAGS_CONFIGr,   r9   total_secondsnotification_already_sentUSER_PHONE_MAPwarningmark_notification_sentr.   r%   )rB   eventsr&   r;   cfgr<   elapsed_hoursdelayassignedr   r   oks               r$   process_pendingrR   K   s_   
 ,,x||
$C!FHH:CKH >El  $$S) ~!67|+::<vE( 	>Eu$++E$K?yy!34:H))--h7EZeDk3
 ))%+u= Ge<Dud+B))%+u=-	>>r/   c                  >   t         j                  dt        j                  t	        t        j
                  j                                      	 	 t                t        j                  t        j                         /# t        $ r t         j                  d       Y Dw xY w)Nz)Worker iniciado - intervalo=%ss - tags=%szErro no ciclo do worker)r   r   r   WORKER_INTERVAL_SECONDSlistrF   keysrR   r   r   timesleep r/   r$   run_foreverrZ   y   sx    HH3&&V$$&'
 	5 	

6112   	5MM34	5s   
A; ;BB__main__z1%(asctime)s [%(levelname)s] %(name)s: %(message)s)levelformathandlers)r   N)__doc__loggingrW   r   r   typingr   r   r   rC   	getLoggerr   strboolr%   dictintr.   r9   rR   rZ   __name__basicConfigINFOFileHandlerLOG_PATHStreamHandlerinit_dbrY   r/   r$   <module>rn      s      '    	g-. C D 2 # C C 	S 	X 	(>\3 zGllBG0!G!!#
 BJJLM r/   