
    *;h^j                     f   d dl Z d dlmZmZmZmZmZ d dlmZ d dl	Z	d dl
mZ d dlmZ d dlmZ d dlZd dlZd dlmZ d dlZd dlZ e              e	j        d          Z ee	          Z ed
          ZdedefdZd Zedefd            Zededefd            Zededefd            Zededefd            Zededefd            Z ededefd            Z!edededededede"fd            Z# edd eddgd           g!          Z$ ed"d#e$ge!ee eeee#g$          Z%d% Z&d& Z'dS )'    N)AgentRunnerfunction_toolModelSettingsFileSearchTool)OpenAI)load_dotenv)Any)datetime)ImageOPENAI_API_KEY)api_keyrequired)tool_choiceusrEmailusrPassc                    d}dd| |d}ddi}t          j        |||          }	 |                                }|                    d          rEd	|v rA|d	                             d
          }|d	         d                             d          }||dS d|                    dd          iS # t          $ r}	ddt          |	           icY d }	~	S d }	~	ww xY w)N#https://api.sistemaml.net/app/loginuser_compratelia
1nt3l14p1$emailpasswordapp_usernameapp_passwordContent-Type!application/x-www-form-urlencodeddataheaderssuccessr   access_tokenuserid)r"   user_iderrormessageAuthentication failed.Failed to parse response: requestspostjsonget	Exceptionstr)
r   r   urlpayloadr    responser   tokenr%   es
             (/var/www/FlaskApp/agent_test2_Spanish.pyget_Token_and_Idr7   #   s6   
/C $  	 G 	;G
 }Sw@@@H
}}88I 
	6T>>L$$^44E6l6*..t44G %"   )-EFF   
 
 
:#a&&::
 	
 	
 	
 	
 	
 	

s$   A-B, B, ,
C6C	CCc                 H   t           j                            |           d                                         }|dk    r=t	          | d          5 }|                                }d d d            n# 1 swxY w Y   ny|dv rft          j        |                               d          }t          j	                    }|
                    |d           |                                }nt          d          t          j        |                              d	          }d
                    |                                                                          }	 t          j        |            t          j        |d           n"# t*          $ r}t          d          |d }~ww xY w|S )N   z.pdfrb)z.jpgz.jpegz.pngRGBPDF)formatzIFormato de archivo no soportado. Usa PDF o una imagen (.jpg, .jpeg, .png)utf-8 T)validatez$Base64 encoding failed or is invalid)ospathsplitextloweropenreadr   convertioBytesIOsavegetvalue
ValueErrorbase64	b64encodedecodejoinstrip
splitlinesremove	b64decoder/   )		file_pathfile_extf	pdf_bytesimage
pdf_buffer
pdf_base64pdf_base64_cleanr5   s	            r6   prepare_invoice_base64r]   K   s   w	**1-3355H 6)T"" 	!aI	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	!	.	.	.
9%%--e44Z\\


:e
,,,''))		deee !),,33G<<Jwwz//11<<>>??H
	))D99999 H H H?@@aGH s*   A//A36A3*F   
F
FFc           	      p    d}d| i}ddddddd	d
d}t          j        |||          }t          |          S )Nz,https://api.sistemaml.net/app/password/emailr   no-cachePostmanRuntime/7.43.4*/*gzip, deflate, br
keep-aliver   r   r   )Cache-Control
User-AgentAcceptAccept-Encoding
Connectionr   r   r   r   )r+   r,   r0   )r   r1   r2   r    r3   s        r6   reset_passwordri   n   s_    
8C 	G $-."":	 	G }Sw@@@Hx==    c           
      (   t          | |          }|d         }|d         }d| }d| ddddd	d
}t          j        ||          }|                                }g }	|                    dg           D ]l}
|	                    |
                    dd          |
                    dd          |
                    dd          |
                    dd          d           mdt          |	           dt          |	          |	d}t          |          S )Nr"   r%   z,https://api.sistemaml.net/app/preAlert/list/Bearer r_   r`   ra   rb   rc   Authorizationrd   re   rf   rg   rh   r    r   trackingr?   descriptionpriceinstructions)rp   rq   rr   rs   Tz prealertas encontrados.)r!   r'   totalr   )r7   r+   r.   r-   appendlenr0   )r   r   credsAccess_tokenr%   r1   r    r3   response_data	prealertsitemoutputs               r6   prealertlist_processr}      sN    Xw//E(LIG
 C
B
BC .|--)* G |C000HMMOOMI!!&"--  R0088M266XXgr** HH^R88	
 
 	 	 	 	 )nn>>>Y	 F v;;rj   c           
         t          | |          }|d         }|d         }d| }d| ddddd	d
}t          j        ||          }|                                }g }	d}
|                    dg           D ]}|                    dd          }|                    dd          }|                    dd          }|                    dd          }|                    dd          }|                    dd          }|                    dg           }|                    dg           }|r*|D ]&}|||||||d}|	                    |           |
dz  }
'|||||||d}|	                    |           |
dz  }
|
|	d}t          |          S )Nr"   r%   z'https://api.sistemaml.net/app/shs/list/rl   r_   r`   ra   rb   rc   rm   ro   r   r   r$   r?   fechastatuslbpago_verificar	trackingswrsshsubszSH#r   r   librasr   r   r   r9   SHr   r   r   r   r   r   total_shsubspackagesr7   r+   r.   r-   ru   r0   )r   r   rw   rx   r%   r1   r    r3   r   resultr   packagesh_idsh_fecha	sh_status	sh_librassh_pagosh_trackingssh_wrsr   shsubentryr|   s                          r6   shsList_processr      s	    Xw//E(LIG
 >G
=
=C .|--)* G |C000H==??D F L 88FB'' $ $D"%%;;w++KK"--	++dA&&	,R00{{;33UB''Xr** 	 " " %'&%,!-!  e$$$!" !#"!() E MM%   ALL % F
 v;;rj   c           
         t          | |          }|d         }|d         }d| }d| ddddd	d
}t          j        ||          }|                                }g }	d}
|                    dg           D ]}|                    dd          }|                    dd          }|                    dd          }|                    dd          }|                    dd          }|                    dd          }|                    dg           }|                    dg           }|r*|D ]&}|||||||d}|	                    |           |
dz  }
'|||||||d}|	                    |           |
dz  }
|
|	d}t          |          S )Nr"   r%   z+https://api.sistemaml.net/app/shs/listSent/rl   r_   r`   ra   rb   rc   rm   ro   r   r   r$   r?   r   r   r   r   r   r   r   r   r9   r   r   r   )r   r   rw   rx   r%   r1   r    r3   r   r   r   r   r   r   r   sh_pesor   r   r   r   r   r   r|   s                          r6   shsListSent_processr     s
    Xw//E(LIG B
A
AC .|--)* G |C000H==??D F L 88FB'' $ $D"%%;;w++KK"--	D!$$,R00{{;33UB''Xr** 	 " " %'$%,!-!  e$$$!" !# !() E MM%   ALL % F
 v;;rj   c                    t          | |          }|d         }|d         }d| }d| ddddd	d
}t          j        ||          }|                                }g }	d}
|                    dg           D ]}|                    dd          }|                    dd          }|                    dd          }|                    dg           D ]a}||||                    dd          |                    dd          |                    dd          d}|	                    |           |
dz  }
b|
|	d}t          |          S )Nr"   r%   z'https://api.sistemaml.net/app/wrs/list/rl   r_   r`   ra   rb   rc   rm   ro   r   r   rp   r?   r$   
verificadowrsubs	contenidotipor   )rp   	wr_numberr   r   r   r   r9   )total_wrsubsr   r   )r   r   rw   rx   r%   r1   r    r3   r   r   r   r   rp   WRr   wrsubr   r|   s                     r6   wrsList_processr   Y  s    Xw//E(LIG
 >G
=
=C .|--)* G |C000H
 ==??D F L 88FB''  ;;z2..;;tB;;|B//
[[2.. 
	 
	E$'"YY{B77		&"--))Ha00 E MM%   ALL
	 % F v;;rj   c                 `   d}dd| |d}ddi}t          j        |||          }	 |                                }|                    d          rd	|v r|d	                             d
          }|d	         d                             d          }|d	         d                             d          }	|d	         d                             d          }
|||	|
|                    dd          dS d|                    dd          iS # t          $ r}ddt          |           icY d }~S d }~ww xY w)Nr   r   r   r   r   r   r   r!   r   r"   r#   r$   agentidRnamer'   zLogin success.)r"   r%   agent_idclient_namer'   r&   r(   r)   r*   )r   r   r1   r2   r    r3   r   r4   r%   r   r   r5   s               r6   get_credentialsr     s   
/C $  	 G 	;G
 }Sw@@@H
}}88I 	6T>>L$$^44E6l6*..t44GF|G,0077Hff%))&11D !&"$"88I/?@@   )-EFF   
 
 
:#a&&::
 	
 	
 	
 	
 	
 	

s$   CD -D 
D-D("D-(D-invoicePathtrackdescripfobc           	         t          |            t          |           t          |           t          |           t          |           t          |           t          | |          }|d         }t          |d                   }|}	t          |	          }
|dd|||d|
d}d}d| d	d
ddddd}d}t	          |dd          5 }t          j        ||dd           d d d            n# 1 swxY w Y   t          j        |||          }|                                }t          t          |                     |	                    d          r|	                    d          }n|	                    d          }t          |          S )Nr"   r%   Amazon   prueba)consigneeIdshipper	carrierIdrp   rq   rr   rs   invoicez-https://api.sistemaml.net/app/preAlert/createrl   r_   PostmanRuntime/7.44.0application/jsonra   rb   rc   rn   rd   re   r   rf   rg   rh   zchat_log.jsonwr>   )encodingF   )ensure_asciiindentr-   r    r!   r'   )
printr7   r0   r]   rE   r-   dumpr+   r,   r.   )r   r   r   r   r   r   rw   rx   r%   invoice_file_pathinvoice_base64json_payloadr1   r    rU   rW   r3   ry   r|   s                      r6   createPrealert_proccessr     s    
(OOO	'NNN	+	%LLL	'NNN	#JJJ
 Xw//E(L%	"##G#+,=>>N  !	 	L 
9C .|--)%* G  I 
iw	/	/	/ A1	,a@@@@A A A A A A A A A A A A A A A }Sl7CCCHMMOOM	#m

 ## ,  ++  ++v;;s   C,,C03C0zcompany agenta  Eres un agente encargado de proveer al TRIAGE AGENT con respuestas a preguntas de los clientes que tengan que ver acerca de datos de la empresa courier como direccion fisica,
    horarios de operacion, servicios y costos, asi como datos de los procedimientos aduanales en Ecuador, materiales prohibido segun la aduana de Ecuador,
    impuestos aplicados segun descripcion del producto   #vs_6824df08a0f88191b086dc004d6b1c6cT)max_num_resultsvector_store_idsinclude_search_results)r   rs   toolszTriage agentu  
    Eres un asistente de atención al cliente de la empresa COMPRATELIA.
    No procedas con ninguna solicitud hasta que el cliente haya sido autenticado.

    🔐 Flujo de Autenticación:
    Pide al cliente su usuario y contraseña para verificar su identidad.
    Ejemplo: "Antes de continuar, ¿podrías proporcionarme tu usuario y contraseña para verificar tu cuenta?"
    Usa la herramienta **get_credentials** con las credenciales proporcionadas.
    Si las credenciales son válidas:
    Guarda en memoria el [nombre del cliente:client_name], el [identificacion de usuario:user_id], y las credenciales [nombre de usuario:usrEmail, password:usrPass] para su uso futuro.
    Dirígete al cliente por su nombre a partir de ese momento.
    Ejemplo: "Gracias, [client_name]. Tus credenciales son válidas. ¿En qué puedo ayudarte hoy?"
    Si las credenciales son inválidas:
    Informa al cliente de manera educada.
    Permite hasta tres intentos.
    Después de 3 fallos, ofrece restablecer la contraseña por correo electrónico:
    Ejemplo: "Parece que has ingresado credenciales incorrectas varias veces. ¿Te gustaría restablecer tu contraseña y recibir una temporal por correo electrónico?"
    Si el cliente acepta, pide su correo electrónico y usa la herramienta **reset_password**.
    Dile al cliente: "Te he enviado una contraseña temporal a tu correo electrónico. Por favor, revisa tu bandeja de entrada y proporciona las nuevas credenciales aquí para verificar tu cuenta."

    ✅ Después de una Autenticación Exitosa:
    Redirige según el tipo de solicitud descrito a continuación.

    📦 Lógica de Enrutamiento y Manejo de Paquetes:
        
    Si el cliente desea:
    Consultar sobre paquetes que ya han sido enviados o el mensaje del cliente incluye palabras como "enviado", "entregado","en transito","ya estan en camino" o equivalentes, usa la herramienta **shsListSent_process** para obtener dicha lista.
    Consultar sobre paquetes que están listos para enviar desde el almacén o el mensaje del cliente incluye palabras como "listo para envio", "aun no enviados","preparados para salir" o equivalentes, usa la herramienta **shsList_process** para obtener dicha lista.
    Consultar sobre paquetes actualmente en el almacén o el mensaje del cliente incluye palabras como "en Miami", "llegados","recibidos en almacen" o equivalentes,usa la herramienta **wrsList_process** para obtener dicha lista.
    
    En el caso de los paquetes actualmente en el almacén (se obtuvieron a traves de la herramienta **wrsList_process** revisar lo siguiente:
    Si verificado es 0 → "El cliente debe proporcionar la factura del paquete."
    Si verificado es 1 → "Esperando a que el cliente solicite el envío."
    
    Si el cliente proporciona un número de seguimiento, tracking number o número WR:
    Consulta las siguientes herramientas 
    **wrsList_process**
    **shsListSent_process** 
    **shsList_process** 
    para obtener las listas de todos los paquetes y busca el número que el cliente dio dentro de cada lista.
    Si se encuentra:
    Proporciona todos los detalles disponibles.
    Solo si aparece en una lista de obtenida de los tools  **shsListSent_process**, aplica:
    status: "ABIERTO" → "El paquete está en proceso de consolidación."
    status: "PROCESADO" y pago_verificar: 0 → "El paquete está esperando pago."
    status: "PROCESADO" y pago_verificar: 1 → "El paquete está en Miami, listo para ser despachado."
    Si no se encuentra:
    Responde: "El número de información que proporcionaste no fue encontrado."
    Sé siempre amable, claro y servicial. Nunca omitas el paso de autenticación.

    
    Tu puedes trabajar con las prealertas como se explica a continuacion:
    1. 📄 **Consultar Prealertas Realizadas**:
   Si el cliente solicita ver sus prealertas anteriores o utiliza frases como:
   - "ver mis prealertas"
   - "consultar mis prealertas"
   - "ya hice una prealerta"
   - "quiero ver las prealertas"
   
   Usa la herramienta **prealertlist_process** para obtener la lista de prealertas registradas.

   → Ejemplo de respuesta:  
   "Estas son tus prealertas registradas hasta el momento, [client_name]: [mostrar lista con detalles como tracking, descripción, precio]."

2. 📦 **Crear una Nueva Prealerta**:
   Si el cliente dice frases como:
   - "quiero hacer una prealerta"
   - "necesito registrar una prealerta"
   - "Hice una compra y quiero notificarla"
   - "quiero subir la factura"

   Solicita al cliente la siguiente información de forma clara y ordenada:
   - **Número de tracking**
   - **Descripción del contenido del paquete**
   - **Precio del paquete (USD)**
   - **Factura del paquete en formato PDF o imagen**

   ➕ Una vez que tengas todos los datos, utiliza la herramienta **create_prealert** y envia la siguiente informacion que es extraida de la conversacion:
   - usrEmail, usrPass ,la direccion del archivo que acaba de enviar,el tracking number o numero de seguimiento,la descripcion del paquete a ser prealertado y el precio del producto o productos.


    
    Si el cliente pregunta por informacion acerca de datos de la empresa courier como direccion fisica,
    horarios de operacion, servicios y costos, asi como datos de los procedimientos aduanales en Ecuador, materiales prohibido segun la aduana de Ecuador,
    impuestos aplicados segun descripcion del producto debes enrutar estos requerimientos al agente  **company_agent**.
    
    No le digas al cliente que lo vas vas a transferir, solo hazlo y espera el resultado.
)r   rs   handoffsr   c                    d}d}d}|}t          |           D ]G}t          |t                    r0|                    d          dk    r|                    d          } nHt          |           D ]X}t          |t                    rA|                    dd                              d          r|                    dd          } nYt          |           D ]}t          |t                    r|                    d          dk    r|                    d	d          }t          |t
                    rV	 t          j        |          }	t          |	t                    rd
|	v rt          |	d
                   } n# t          $ r Y w xY wt          j
                                        d          }
|||||
|d}d}d}dddd}t          j        d|||d          }|                                }|d         }t          |           d}d| ddddddd}t          j        |||          }|                                }t          |           d S ) Nr?   roler#   contentr$   msg_typefunction_call_outputr|   r%   z%Y-%m-%d %H:%M:%S)
message_iduser_messager%   assistant_response	timestampphone_numberzhttps://api.sistemaml.net/loginz*email=user_compratelia&password=1nt3l14p1$r   r_   z$5b949b74-4434-a3fb-4e91-33f22b22f02c)zcontent-typezcache-controlzpostman-tokenPOST<   )r   r    timeoutr"   z-https://api.sistemaml.net/app/whatsaap/createrl   r   r   ra   rb   rc   r   r   )reversed
isinstancedictr.   
startswithr0   astliteral_evalr/   r   nowstrftimer+   requestr-   r   r,   )
input_dataCustomerPhone	respuestalast_msg_idlast_user_messager%   r   r{   r|   	user_datar   r   r1   r2   r    r3   	json_datar"   ry   s                      r6   chat_monitorr     s   KG L $$  dD!! 	dhhv&6&6&&@&@ $ 3 3E $$  dD!! 	dhhtR&8&8&C&CF&K&K 	((4,,KE $$ 
 
dD!! 		dhhv&6&6:P&P&PXXh++F&#&&  # 0 8 8I!)T22 yI7M7M"%i	&:";";    H ''(;<<I ")'$ L ,CCG 8; G
 '7SUVVVHI ^,L	, 
9C .|--)%* G }Sl7CCCHMMOOM	-s   3AE88
FFc                 x   K   t          j        t          |            d {V }t          | ||j                   |S )N)input)r   runtriage_agentr   final_output)r   r   r   s      r6   run_triage_agentr     sI       J|:>>>>>>>>>IM)*@AAArj   )(r+   agentsr   r   r   r   r   openair   rA   dotenvr	   typingr
   r   r-   rM   PILr   rH   r   getenvr   clientmodel_settingsr0   r7   r]   ri   r}   r   r   r   r   floatr   company_agentr   r   r    rj   r6   <module>r      so    L L L L L L L L L L L L L L       				                           				 



  ")$
%
%		 	 	  :666%
c %
3 %
 %
 %
 %
P  F C    8 +3 + + + + +Z Lc LC L L L L\ N# N N N N N` ;c ;C ; ; ; ;z +
S +
# +
 +
 +
 +
\ Bc BC BS Bs B[^ Bch B B B Bl 	: N !"G!H'+  
   u	Wp _>/:Mo^r  uL  Mw\ \ \|N N Nf	 	 	 	 	rj   