
    Și'J                        d dl mZmZmZmZ d dlmZ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mZmZmZmZmZmZmZmZ d dlmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1  edd	      Z2e2jg                  d
      d        Z4e2jk                  ded       ee      fdedefd       Z6e2jo                  de       ee      fde8dedefd       Z9e2ju                  de	e          ee      fdefd       Z;e2jk                  de!d       ee      fde defd       Z<e2jo                  de!       ee      fde8de defd       Z=e2ju                  de	e!          ee      fdefd       Z>e2jk                  de#d       ee      fde"defd       Z?e2jo                  de#       ee      fde8de"defd       Z@e2ju                  de	e#          ee      fdefd        ZAd d!l mBZB e2ju                  d"e	e#          eBd#d$%       ee      fd&edefd'       ZCe2jk                  d(e%d       ee      fde$defd)       ZDe2jo                  d*e%       ee      fde8de$defd+       ZEe2ju                  d(e	e%          ee      fdefd,       ZFe2ju                  d-e%       ee      fd.eGdefd/       ZHe2jk                  d0ed       ee      fde&defd1       ZIe2jo                  d2e'       ee      fde8de&defd3       ZJe2jk                  d0ed       ee      fde&defd4       ZIe2ju                  d0e	e'          ee      fdefd5       ZKe2ju                  d6e	e          eBd#d7%       ee      fd8e8defd9       ZLe2jo                  d:e       ee      fd;e8defd<       ZMe2jk                  d=e)d       ee      fde(defd>       ZNe2jo                  d?e)       ee      fde8de(defd@       ZOe2ju                  d=e	e)          ee      fdefdA       ZPe2jk                  dBe+d       ee      fde*defdC       ZQe2jo                  dDe+       ee      fde8de*defdE       ZRe2ju                  dBe	e+          ee      fdefdF       ZSe2jk                  dGe-d       ee      fde,defdH       ZTe2jo                  dIe-       ee      fde8de,defdJ       ZUe2ju                  dGe	e          ee      fdefdK       ZVe2jk                  dLe/d       ee      fde.defdM       ZWe2jo                  dNe/       ee      fde8de.defdO       ZXe2ju                  dLe	e/          ee      fdefdP       ZYd dQlZm[Z[ d dRl\m]Z] e2ju                  dSe	e          eBdTdU%       ee      fdVe
e   defdW       Z^e2jk                  dXe1d       ee      fde0defdY       Z_e2jo                  dZe1       ee      fde8de0defd[       Z`e2ju                  dXe	e1          ee      fdefd\       ZayT)]    )FastAPIHTTPExceptionstatusDepends)Session
joinedload)ListOptional)datetime)get_dbDBRestaurante
DBSucursalDBMesa	DBCliente	DBReservaDBConversacionDBCategoriaDBPlatoDBMenu
DBItemMenucreate_db_tables)ItemMenuResponseMenuResponsePlatoResponseReservaResponseRestauranteCreateRestauranteReadSucursalCreateSucursalRead
MesaCreateMesaReadClienteCreateClienteReadReservaCreateReservaReadConversacionCreateConversacionReadCategoriaCreateCategoriaReadPlatoCreate	PlatoRead
MenuCreateMenuReadItemMenuCreateItemMenuReadu7   API Restaurante - Sistema de Gestión y Administraciónz/api-restaurante)title	root_pathstartupc                      t                y N)r        </opt/tws/multiagentes-mcp/api_restaurante/api_restaurante.pystartup_eventr8   !   s    r6   z/restaurantes   )response_modelstatus_codedatadbc                 T   |j                  t              j                  t        j                  | j                  k(        j	                         }|rt        dd      t        di | j                         }|j                  |       |j                          |j                  |       |S )N  z%Ya existe un restaurante con ese RUC.r;   detailr5   )
queryr   filterrucfirstr   
model_dumpaddcommitrefreshr<   r=   	existenteobjs       r7   create_restauranterM   *   s|    '..}/@/@DHH/LMSSUI4[\\

,$//+
,CFF3KIIKJJsOJr6   z/restaurantes/{id})r:   idc                 R   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                         j                         D ]  \  }}t        |||        |j                          |j                  |       |S )N  zRestaurante no encontrado.r@   )rB   r   rC   rN   rE   r   rF   itemssetattrrH   rI   rN   r<   r=   rL   kvs         r7   update_restauranterV   5   s    
((=
!
(
()9)9R)?
@
F
F
HC4PQQ!'') 1QIIKJJsOJr6   c                 H    | j                  t              j                         S r4   )rB   r   allr=   s    r7   list_restaurantesrZ   @   s    88M"&&((r6   z/sucursalesc                     t        di | j                         }|j                  |       |j                          |j	                  |       |S Nr5   )r   rF   rG   rH   rI   r<   r=   rL   s      r7   create_sucursalr^   I   :    

)t(
)CFF3KIIKJJsOJr6   z/sucursales/{id}c                 R   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                         j                         D ]  \  }}t        |||        |j                          |j                  |       |S )NrP   zSucursal no encontrada.r@   )rB   r   rC   rN   rE   r   rF   rQ   rR   rH   rI   rS   s         r7   update_sucursalra   Q   s    
((:

%
%jmmr&9
:
@
@
BC4MNN!'') 1QIIKJJsOJr6   c                 H    | j                  t              j                         S r4   )rB   r   rX   rY   s    r7   list_sucursalesrc   \       88J##%%r6   z/mesasc                     t        di | j                         }|j                  |       |j                          |j	                  |       |S r\   )r   rF   rG   rH   rI   r]   s      r7   create_mesarf   e   :    

%4??$
%CFF3KIIKJJsOJr6   z/mesas/{id}c                 R   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                         j                         D ]  \  }}t        |||        |j                          |j                  |       |S )NrP   Mesa no encontrada.r@   )rB   r   rC   rN   rE   r   rF   rQ   rR   rH   rI   rS   s         r7   update_mesarj   m   s    
((6

!
!&))r/
2
8
8
:C4IJJ!'') 1QIIKJJsOJr6   c                 H    | j                  t              j                         S r4   )rB   r   rX   rY   s    r7   
list_mesasrl   x   s    88F!!r6   )Queryz/mesas/disponibles.z$Fecha y hora deseada para la reserva)description
fecha_horac                    |j                  t        j                        j                  t        j                  dk7  t        j
                  | k(        j                         }|j                  t              j                  t        j                  dk(  t        j                  j                  |             j                         }|S )N	CANCELADAT)rB   r   id_mesarC   estadofecha_reservasubqueryr   
disponiblerN   in_rX   )ro   r=   reservas_ocupadasmesas_disponibless       r7   list_mesas_disponiblesrz   ~   s     !2!23::K':- hj  (//T!	(	)) 
ce 
 r6   z	/clientesc                 T   |j                  t              j                  t        j                  | j                  k(        j	                         }|rt        dd      t        di | j                         }|j                  |       |j                          |j                  |       |S )Nr?   z&Ya existe un cliente con ese WhatsApp.r@   r5   )
rB   r   rC   whatsapprE   r   rF   rG   rH   rI   rJ   s       r7   create_clienter}      s|    #**9+=+=+NOUUWI4\]]

(doo'
(CFF3KIIKJJsOJr6   z/clientes/{id}c                 R   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                         j                         D ]  \  }}t        |||        |j                          |j                  |       |S )NrP   zCliente no encontrado.r@   )rB   r   rC   rN   rE   r   rF   rQ   rR   rH   rI   rS   s         r7   update_clienter          
((9

$
$Y\\R%7
8
>
>
@C4LMM!'') 1QIIKJJsOJr6   c                 H    | j                  t              j                         S r4   )rB   r   rX   rY   s    r7   list_clientesr      s    88I""$$r6   z/clientes/whatsapp/{whatsapp}r|   c                     |j                  t              j                  t        j                  | k(        j	                         }|st        dd|  d      t        j                  |d      S )NrP   zCliente con WhatsApp 'z' no encontrado.r@   T)from_attributes)rB   r   rC   r|   rE   r   r#   model_validate)r|   r=   clientes      r7   get_cliente_by_whatsappr      sd    hhy!((););x)GHNNPG+H:5EF
 	
 %%gtDDr6   z	/reservasc                    |j                  t              j                  t        j                  | j                  k(        j                         }|st        dd      t        di | j                         }|j                  |       |j                          |j                  |       t        |j                  d|j                   |j                  |j                  |j                   |j"                        S NrP   ri   r@   Mesa rN   mesa	ubicacionrt   rs   fecha_registror5   rB   r   rC   rN   rr   rE   r   r   rF   rG   rH   rI   r   identificador_mesar   rt   rs   r   r<   r=   r   rL   s       r7   create_reservar           88F""699#<=CCED4IJJ 
(doo'
(CFF3KIIKJJsO 66T,,-...''zz)) r6   z/reservas/{id}c                 R   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                         j                         D ]  \  }}t        |||        |j                          |j                  |       |S )NrP   zReserva no encontrada.r@   )rB   r   rC   rN   rE   r   rF   rQ   rR   rH   rI   rS   s         r7   update_reservar      r   r6   c                    |j                  t              j                  t        j                  | j                  k(        j                         }|st        dd      t        di | j                         }|j                  |       |j                          |j                  |       t        |j                  d|j                   |j                  |j                  |j                   |j"                        S r   r   r   s       r7   r   r      r   r6   c                 H    | j                  t              j                         S )zLista todas las reservas)rB   r   rX   rY   s    r7   list_reservasr      s     88I""$$r6   z/reservas/clientezID del cliente
cliente_idc                    |j                  t              j                  t        t        j                  t        j
                  k(        j                  t        j                  | k(        j                  t        j                  dk(        j                  t        j                  t        j                        j                         }|D cg c]z  }t        |j                  j
                  d|j                   |j                  |j                  j                  |j                  j                  |j                  j                        | }}|S c c}w )u   
    Lista solo las reservas PENDIENTES de un cliente.
    Incluye el identificador y la ubicación de la mesa por separado.
    	PENDIENTEr   r   )rB   r   joinr   rr   rN   rC   
id_clienters   add_columnsr   r   rX   r   rt   r   )r   r=   reservasr	respuestas        r7   listar_reservas_clienter     s     		fi''6994	5		$$
2	3		  K/	0	V..0@0@	A	 $ 
  	{{~~--./kk++33;;%%;;55	

I 
 
s   A?E
z/reservas/cancelar/{reserva_id}
reserva_idc                    |j                  t              j                  t        j                  | k(        j	                         }|st        t        j                  d      |j                  dk(  rt        t        j                  d      d|_        |j                          |j                  |       |j                  t              j                  t        j                  |j                  k(        j	                         }t        |j                  d|j                   |j                   |j"                  |j                  |j$                        S )NzReserva no encontradar@   rq   u   La reserva ya está canceladar   r   )rB   r   rC   rN   rE   r   r   HTTP_404_NOT_FOUNDrs   HTTP_400_BAD_REQUESTrH   rI   r   rr   r   r   r   rt   r   )r   r=   reservar   s       r7   cancelar_reservar   "  s    hhy!(()CDJJLG(A(AJabb~~$(C(CLkll !GNIIKJJw 88F""699#?@FFHD ::T,,-...++~~-- r6   z/conversacionesc                 l   | j                   r\|j                  t              j                  t        j                   | j                   k(        j	                         }|rt        dd      t        di | j                         }|j                  |       |j                          |j                  |       |S )Nr?   u*   Ya existe una conversación con ese wamid.r@   r5   )
wamidrB   r   rC   rE   r   rF   rG   rH   rI   rJ   s       r7   create_conversacionr   B  s    zzHH^,33N4H4HDJJ4VW]]_	C8dee

-4??,
-CFF3KIIKJJsOJr6   z/conversaciones/{id}c                 R   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                         j                         D ]  \  }}t        |||        |j                          |j                  |       |S )NrP   u   Conversación no encontrada.r@   )rB   r   rC   rN   rE   r   rF   rQ   rR   rH   rI   rS   s         r7   update_conversacionr   N  s    
((>
"
)
).*;*;r*A
B
H
H
JC4RSS!'') 1QIIKJJsOJr6   c                 H    | j                  t              j                         S r4   )rB   r   rX   rY   s    r7   list_conversacionesr   Y  s    88N#''))r6   z/categoriasc                     t        di | j                         }|j                  |       |j                          |j	                  |       |S r\   )r   rF   rG   rH   rI   r]   s      r7   create_categoriar   b  s:    

*)
*CFF3KIIKJJsOJr6   z/categorias/{id}c                 R   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                         j                         D ]  \  }}t        |||        |j                          |j                  |       |S )NrP   u   Categoría no encontrada.r@   )rB   r   rC   rN   rE   r   rF   rQ   rR   rH   rI   rS   s         r7   update_categoriar   j  s    
((;

&
&{~~';
<
B
B
DC4OPP!'') 1QIIKJJsOJr6   c                 H    | j                  t              j                         S r4   )rB   r   rX   rY   s    r7   list_categoriasr   u  s    88K $$&&r6   z/platosc                     t        di | j                         }|j                  |       |j                          |j	                  |       |S r\   )r   rF   rG   rH   rI   r]   s      r7   create_plator   ~  s:    

&DOO%
&CFF3KIIKJJsOJr6   z/platos/{id}c                 R   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                         j                         D ]  \  }}t        |||        |j                          |j                  |       |S )NrP   zPlato no encontrado.r@   )rB   r   rC   rN   rE   r   rF   rQ   rR   rH   rI   rS   s         r7   update_plator     s    
((7

"
"7::#3
4
:
:
<C4JKK!'') 1QIIKJJsOJr6   c           	         | j                  t        j                  t        j                  t        j                  t
        j                  j                  d            j                  t
        t        j                  t
        j                  k(        j                         }|D cg c]9  }t        |j                  |j                  |j                  |j                        ; c}S c c}w )uT   
    Lista todos los platos disponibles, incluyendo el nombre de su categoría.
    	categoria)rN   nombrer   precio_base)rB   r   rN   r   r   r   labelr   id_categoriarX   r   r   )r=   platos_con_categoriaps      r7   list_platosr     s     88

  -	
 d;,,>?  &  	tt88kk		
  s   !>C"z/menusc                     t        di | j                         }|j                  |       |j                          |j	                  |       |S r\   )r   rF   rG   rH   rI   r]   s      r7   create_menur     rg   r6   z/menus/{id}c                 R   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                         j                         D ]  \  }}t        |||        |j                          |j                  |       |S )NrP   u   Menú no encontrado.r@   )rB   r   rC   rN   rE   r   rF   rQ   rR   rH   rI   rS   s         r7   update_menur     s    
((6

!
!&))r/
2
8
8
:C4JKK!'') 1QIIKJJsOJr6   c                 H    | j                  t              j                         S r4   )rB   r   rX   rY   s    r7   
list_menusr     s     88F!!r6   )JSONResponse)jsonable_encoderz/menus/fechaNu9   Fecha y hora deseada para verificar la vigencia del menútarget_datetimec           
      D   |j                  t              }| r4|j                  t        j                  | k  t        j                  | k\        }|j                  t        t        j                        j                  t        j                        j                  t        j                              j                         }g }|D ]  }g }|j                  D ]n  }|j                  }|s|j                  s|j                  t        |j                  |j                  j                  |j                   |j"                               p |j                  t%        |j&                  |j                  |j                  |j                  |              t)        |      }	t+        |	      S )u   
    Lista los menús cuya vigencia incluye una fecha y hora específicas.
    Si no se proporciona target_datetime, devuelve todos los menús.
    )nombre_plator   r   precio_especial)rN   r   iniciofinrQ   )content)rB   r   rC   r   r   optionsr   rQ   r   plator   r   rX   appendr   r   r   r   r   rN   r   r   )
r   r=   rB   menus_dbresponsemenuitems_responseitemr   	json_datas
             r7   list_menus_by_dater     sL    HHVEMM_,JJ/)

 }}6<< ++J,<,<=HHIZIZ[	ce  $&H 13JJ 	DJJE%%&6!&#oo44 % 1 1$($8$8	' 	 	ww;;;; 
 	* !*I 	**r6   z/items-menuc                     t        di | j                         }|j                  |       |j                          |j	                  |       |S r\   )r   rF   rG   rH   rI   r]   s      r7   create_item_menur     r_   r6   z/items-menu/{id}c                 R   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                         j                         D ]  \  }}t        |||        |j                          |j                  |       |S )NrP   u   Item del menú no encontrado.r@   )rB   r   rC   rN   rE   r   rF   rQ   rR   rH   rI   rS   s         r7   update_item_menur   	  s    
((:

%
%jmmr&9
:
@
@
BC4STT!'') 1QIIKJJsOJr6   c                 H    | j                  t              j                         S r4   )rB   r   rX   rY   s    r7   list_items_menur     rd   r6   )bfastapir   r   r   r   sqlalchemy.ormr   r   typingr	   r
   r   databaser   r   r   r   r   r   r   r   r   r   r   r   schemasr   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   appon_eventr8   postrM   patchintrV   getrZ   r^   ra   rc   rf   rj   rl   rm   rz   r}   r   r   strr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   fastapi.responsesr   fastapi.encodersr   r   r   r   r   r5   r6   r7   <module>r      s   ; ; . !          " 
C 
 i  //sK>Efo . G  L @GNv 3 &7 W  A o)>?$+FO )' ) @) -#F8? . g  G l;AH  > w  < tL'9:")&/ & & ;& (8=07 j g  > =29@ C z w  3 $x.1$V_ "7 " 2" 	d8n= 2XY&/ >0 +ksC6=fo  G  D K8?Fv s - W  9 T+%67 ' %g % 8% 	(E9@ 
Ec 
Ew 
E F
E  +o3G6=fo  G  H, K8?Fv s - W  9 +o3G6=fo  G  H. T+%67 ' %g % 8%
 	T/-BCC-=>&/ D> ,_M4;FO  '  N> 
,<#N@G 	0 	g 	 O	 !2BCIPQW C '9 w  D 	40@+AB&-fo *G * C* -3G:A&/ ?   H m<CJ6?  O   = tM':;")&/ ' ' <' )I3?29&/ {   @ >)4;B6? S    5 4#67%fo G  8: (8=07 j g  > =29@ C z w  3 $x.1$V_ "7 " 2" + -\(:;*/B}*~&//+h'/+/+ </+l -#F9@ > w  G l;BI&/  N   < tL'9:")&/ & & ;&r6   