+
    :maiYR                     B    R t ^ RIHtHt ^ RIt^ RIHt  ! R R4      tR# )u	  
Módulo de consultas SQL para Solicitudes de Vuelo.

Este módulo maneja todas las consultas relacionadas con:
- Consulta de catálogos (centros de costos)
- Validación de centros de costos
- Validación de proyectos en Epicor ERP
- Inserción de solicitudes de vuelo
- Inserción de pasajeros
- Inserción de opciones de vuelo

ESTRUCTURA DE TABLAS (ACTUALIZADA):
====================================

FR_FlightRequest:
- FlightRequestID (int, PK, IDENTITY)
- CentroCostos (nvarchar, NOT NULL)
- Proyecto (nvarchar, NULL)
- VigenciaProyecto (date, NULL)
- DescripcionMotivo (nvarchar, NOT NULL)
- Destino (nvarchar, NOT NULL)
- KilometrajeViaje (numeric, NULL)
- FechaSalida (date, NOT NULL)
- FechaRegreso (date, NULL)
- HoraAproxSalida (time, NOT NULL)
- HoraAproxRegreso (time, NULL)
- Estatus (nvarchar, NOT NULL, DEFAULT 'En Aprobacion')
  * Valores: 'En Aprobacion', 'En Atencion', 'Atendida'
- Resolucion (nvarchar, NULL)
  * Valores: NULL, 'Aprobada', 'Rechazada'
- ComentariosResolucion (nvarchar, NULL)
- CreatedAt (datetime, NOT NULL, DEFAULT GETDATE())
- UpdatedAt (datetime, NULL)
- Active (bit, NOT NULL, DEFAULT 1)

FR_FlightPassenger:
- FlightPassengerID (int, PK, IDENTITY)
- FlightRequestID (int, FK, NOT NULL)
- NombrePasajero (nvarchar, NOT NULL)
- NumeroEmpleado (nvarchar, NULL)
- Empresa (nvarchar, NOT NULL)
- FechaNacimiento (date, NOT NULL)
- TipoIdentificacion (nvarchar, NOT NULL)
- Nacionalidad (nvarchar, NOT NULL)
- CorreoElectronico (nvarchar, NOT NULL)
- Telefono (nvarchar, NOT NULL)
- NumeroPasaporte (nvarchar, NULL)
- VigenciaPasaporte (date, NULL)
- TieneVisaVigente (bit, NOT NULL, DEFAULT 0)
- TipoVisa (nvarchar, NULL)
- VigenciaVisa (date, NULL)
- PaisVisa (nvarchar, NULL)
- OrdenPasajero (int, NOT NULL)
- CreatedAt (datetime, NOT NULL, DEFAULT GETDATE())
- UpdatedAt (datetime, NULL)
- Active (bit, NOT NULL, DEFAULT 1)

FR_Flight:
- FlightID (int, PK, IDENTITY)
- FlightRequestID (int, FK, NOT NULL)
- Aerolinea (nvarchar, NOT NULL)
- NumeroVuelo (nvarchar, NULL)
- FechaVuelo (date, NOT NULL)
- CostoTotal (numeric, NOT NULL)
- RutaCarpetaVuelo (nvarchar, NULL)
- NombreArchivo (nvarchar, NULL)
- OrdenPreferencia (int, NULL)
- EsOpcionSugerida (bit, NOT NULL, DEFAULT 1)
- EsVueloComprado (bit, NOT NULL, DEFAULT 0)
- Estado (nvarchar, NULL)
- CodigoReservacion (nvarchar, NULL)
- FechaCompra (date, NULL)
- ObservacionesCompra (nvarchar, NULL)
- ComentariosVuelo (nvarchar, NULL)
- CreatedAt (datetime, NOT NULL, DEFAULT GETDATE())
- UpdatedAt (datetime, NULL)
- Active (bit, NOT NULL, DEFAULT 1)
)get_connectionget_connectionERPN)datetimec                      a  ] tR t^Zt o Rt]R 4       t]R 4       t]R 4       t]R 4       t	]R 4       t
]R 4       tRtV tR	# )
SolicitudVueloSQLu   
Clase que contiene todas las consultas SQL para el módulo de Solicitud de Vuelos.
Todos los métodos son estáticos para facilitar su uso sin necesidad de instanciar la clase.
c            
         \        4       p V P                  4       pRpVP                  V4       VP                  4       pVP	                  4        V P	                  4        . pV F&  pVP                  RV^ ,          RV^,          /4       K(  	  RRRVRR/#   \        P                   d   pRR	R. RR
\        T4       2/u Rp?# Rp?i\         d   pRR	R. RR\        T4       2/u Rp?# Rp?ii ; i)z
Obtiene todos los centros de costos activos de la base de datos.

Returns:
    dict: {
        'success': bool,
        'centros': list de diccionarios con ceco y nombre,
        'error': str con mensaje de error (si falla)
    }
z
                SELECT 
                    CeCo,
                    NombreCeCo
                FROM Cost_Centers
                WHERE Active = 1
                ORDER BY CeCo ASC
            ceconombresuccessTcentroserrorNFz$Error al obtener centros de costos: Error inesperado: )
r   cursorexecutefetchallcloseappendpyodbcErrorstr	Exception)connr   query
resultadosr   	resultadoes          lc:\Users\victor.cervantes\Desktop\Elep\src\Consultas_SQL\Global\AdminSolicitudes\Vuelos\SolicitudVueloSQL.pyobtener_centros_costos(SolicitudVueloSQL.obtener_centros_costosd   s   +	!#D[[]FE NN5!*JLLNJJLG'	IaLil   ( 47  || 	52?AxH 
  	52-c!fX6 	s6   BB C/*C=C/C/C/C*$C/*C/c           
         \        4       pVP                  4       pRpVP                  W034       VP                  4       pVP	                  4        VP	                  4        V'       d$   RRRRV^ ,          RV^,          RV^,          /RR	/# RR
RR	RRV  R2/#   \
        P                   d   pRR
RR	RR\        T4       2/u R	p?# R	p?i\         d   pRR
RR	RR\        T4       2/u R	p?# R	p?ii ; i)uH  
Valida que el centro de costos exista y esté activo en la base de datos.

Args:
    centro_costos (str): Código del centro de costos a validar
    
Returns:
    dict: {
        'existe': bool,
        'datos': dict con información del centro de costos (si existe),
        'error': str con mensaje de error (si falla)
    }
z
                SELECT 
                    CeCo,
                    NombreCeCo,
                    Active
                FROM Cost_Centers
                WHERE CeCo = ?
                  AND Active = 1
            existeTdatosCeCo
NombreCeCoActiver   NFzCentro de costos "z" no encontrado o inactivoz#Error al validar centro de costos: r   )	r   r   r   fetchoner   r   r   r   r   )centro_costosr   r   r   r   r   s   &     r   validar_centro_costos'SolicitudVueloSQL.validar_centro_costos   s   0	!#D[[]FE NN5"23)ILLNJJLd	!$il )A,
 T  eT1-@Z[  || 	%>s1vhG 
  	%-c!fX6 	s<   BB B C1,C?C1C1C1C,&C1,C1c                x    \        4       pVP                  4       pRpVP                  W034       VP                  4       pVP	                  4        VP	                  4        V'       df   RRRV^,          R8H  RRV^ ,          RV^,          R	V^,          R
V^,          RV^,          RV^,          RV^,          RV^,          RV^,          /	RR/# RRRRRRRRV  R2/#   \
        P                   d!   pRRRRRRRR\        T4       2/u Rp?# Rp?i\         d!   pRRRRRRRR\        T4       2/u Rp?# Rp?ii ; i)u=  
Valida que el proyecto exista en Epicor ERP y esté vigente.

Args:
    proyecto_id (str): ID del proyecto en Epicor
    
Returns:
    dict: {
        'existe': bool,
        'vigente': bool,
        'datos': dict con información del proyecto (si existe),
        'error': str con mensaje de error (si falla)
    }
a  
                SELECT 
                    Project.ProjectID,
                    Project.Description AS NombreProyecto,
                    OrderDtl.OrderNum,
                    OrderHed.CustNum,
                    OrderHed.OrderDate,
                    OrderHed.OrderAmt,
                    OrderHed.OpenOrder,
                    OrderHed.VoidOrder,
                    CASE 
                        WHEN OrderHed.OpenOrder = 1 AND OrderHed.VoidOrder = 0 
                            THEN 'VIGENTE'
                        ELSE 'NO VIGENTE'
                    END AS Estado
                FROM Erp.Project AS Project
                INNER JOIN Erp.OrderDtl AS OrderDtl
                    ON Project.Company = OrderDtl.Company
                    AND Project.ProjectID = OrderDtl.ProjectID
                INNER JOIN Erp.OrderHed AS OrderHed
                    ON OrderDtl.Company = OrderHed.Company
                    AND OrderDtl.OrderNum = OrderHed.OrderNum
                WHERE 
                    Project.Company = 'IGSA'
                    AND Project.ProjectID = ?
                    AND OrderHed.OpenOrder = 1
                    AND OrderHed.VoidOrder = 0
            r    TvigenteVIGENTEr!   	ProjectIDNombreProyectoOrderNumCustNum	OrderDateOrderAmt	OpenOrder	VoidOrderEstador   NFz
Proyecto "u,   " no encontrado o no tiene órdenes vigentesz"Error al validar proyecto en ERP: r   )	r   r   r   r%   r   r   r   r   r   )proyecto_idr   r   r   r   r   s   &     r   validar_proyecto_erp&SolicitudVueloSQL.validar_proyecto_erp   so    N	$&D[[]FE: NN5.1)ILLNJJLdy|y8#Yq\()A,"IaL!9Q<#Yq\"IaL#Yq\#Yq\ )A,
 T $ euTz+6bc	  || 	%5=c!fXF	   	%5-c!fX6	 	s<   C
C C D90DD9D9D9D4.D94D9c                   Rp \        4       pVP                  4       pRpVP                  VV P                  R4      V P                  R4      V P                  R4      V P                  R4      V P                  R4      V P                  R4      V P                  R	4      V P                  R
4      V P                  R4      V P                  R4      3
4       VP                  R4       \	        VP                  4       ^ ,          4      pRVR 2pVP                  4        VP                  4        VP                  4        RRRVRVRR/#   \        P                   d9   pT'       d   TP                  4        RRRRRRRR\        T4       2/u Rp?# Rp?i\         d9   pT'       d   TP                  4        RRRRRRRR\        T4       2/u Rp?# Rp?ii ; i)aE  
Inserta una nueva solicitud de vuelo en la tabla FR_FlightRequest.

Args:
    datos_solicitud (dict): Diccionario con los datos de la solicitud
        
Returns:
    dict: {
        'success': bool,
        'flight_request_id': int (ID generado),
        'folio': str (folio generado),
        'error': str (si falla)
    }
Nal  
                INSERT INTO FR_FlightRequest (
                    CentroCostos,
                    Proyecto,
                    VigenciaProyecto,
                    DescripcionMotivo,
                    Destino,
                    KilometrajeViaje,
                    FechaSalida,
                    FechaRegreso,
                    HoraAproxSalida,
                    HoraAproxRegreso,
                    Estatus,
                    Active
                ) VALUES (
                    ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
                    'En Aprobacion',
                    1
                )
            CentroCostosProyectoVigenciaProyectoDescripcionMotivoDestinoKilometrajeViajeFechaSalidaFechaRegresoHoraAproxSalidaHoraAproxRegresozSELECT @@IDENTITYzFLT-06dr
   Tflight_request_idfolior   FzError al insertar solicitud: r   )r   r   r   getintr%   commitr   r   r   rollbackr   r   )datos_solicitudr   r   r   rD   rE   r   s   &      r   insertar_solicitud$SolicitudVueloSQL.insertar_solicitudF  s     P	!#D[[]FE* NN5##N3##J/##$67##$78##I.##$67##M2##N3##$56##$67#  NN./ #FOO$5a$8 9 ,S12E KKMLLNJJL 4#%6	  || 	5#T8QA	   	5#T-c!fX6	 	s6   D>E G-FGGG-GGGc                8   Rp \        4       pVP                  4       pRp^ pV F  pVP                  VV VP                  R4      VP                  R4      VP                  R4      VP                  R4      VP                  R4      VP                  R4      VP                  R	4      VP                  R
4      VP                  R4      3
4       V^,          pK  	  VP	                  4        VP                  4        VP                  4        RRRVRR/#   \        P                   d7   pT'       d   TP                  4        RRR^ RR\        T4       2/u Rp?# Rp?i\         d7   pT'       d   TP                  4        RRR^ RR\        T4       2/u Rp?# Rp?ii ; i)uf  
Inserta múltiples pasajeros asociados a una solicitud de vuelo.

Args:
    flight_request_id (int): ID de la solicitud de vuelo
    lista_pasajeros (list): Lista de diccionarios con datos de pasajeros
        
Returns:
    dict: {
        'success': bool,
        'insertados': int (cantidad de pasajeros insertados),
        'error': str (si falla)
    }
Na1  
                INSERT INTO FR_FlightPassenger (
                    FlightRequestID,
                    NombrePasajero,
                    NumeroEmpleado,
                    Empresa,
                    FechaNacimiento,
                    TipoIdentificacion,
                    Nacionalidad,
                    CorreoElectronico,
                    Telefono,
                    OrdenPasajero,
                    Active
                ) VALUES (
                    ?, ?, ?, ?, ?, ?, ?, ?, ?, ? 
                    , 1
                )
            NombrePasajeroNumeroEmpleadoEmpresaFechaNacimientoTipoIdentificacionNacionalidadCorreoElectronicoTelefonoOrdenPasajeror
   T
insertadosr   FzError al insertar pasajeros: r   )r   r   r   rF   rH   r   r   r   rI   r   r   )rD   lista_pasajerosr   r   r   rW   pasajeror   s   &&      r   insertar_pasajeros$SolicitudVueloSQL.insertar_pasajeros  s     G	!#D[[]FE& J+u%LL!12LL!12LL+LL!23LL!56LL0LL!45LL,LL1'  a
 ,  KKMLLNJJL 4j  || 	5a8QA 
  	5a-c!fX6 	s6   D
D F$+EFF"F#+FFFc                    Rp \        4       pVP                  4       pRp^ pV F  pVP                  R4      pV'       g+   VP                  RV 34       VP	                  4       ^ ,          pVP                  VV VP                  R4      VP                  R4      VVP                  R4      VP                  R4      34       V^,          pK  	  VP                  4        VP                  4        VP                  4        R	R
RVRR/#   \        P                   d7   pT'       d   TP                  4        R	RR^ RR\        T4       2/u Rp?# Rp?i\         d7   pT'       d   TP                  4        R	RR^ RR\        T4       2/u Rp?# Rp?ii ; i)u\  
Inserta múltiples opciones de vuelo asociadas a una solicitud.

Args:
    flight_request_id (int): ID de la solicitud de vuelo
    lista_vuelos (list): Lista de diccionarios con datos de vuelos
        
Returns:
    dict: {
        'success': bool,
        'insertados': int (cantidad de vuelos insertados),
        'error': str (si falla)
    }
Na  
                INSERT INTO FR_Flight (
                    FlightRequestID,
                    Aerolinea,
                    NumeroVuelo,
                    FechaVuelo,
                    CostoTotal,
                    OrdenPreferencia,
                    EsOpcionSugerida,
                    EsVueloComprado,
                    Active
                ) VALUES (
                    ?, ?, ?, ?, ?, ?, 1, 0, 1
                )
            
FechaVueloz
                        SELECT FechaSalida 
                        FROM FR_FlightRequest 
                        WHERE FlightRequestID = ?
                    	AerolineaNumeroVuelo
CostoTotalOrdenPreferenciar
   TrW   r   Fz%Error al insertar opciones de vuelo: r   )r   r   rF   r   r%   rH   r   r   r   rI   r   r   )	rD   lista_vuelosr   r   r   rW   vuelofecha_vuelor   s	   &&       r   insertar_vuelos!SolicitudVueloSQL.insertar_vuelos  s     L	!#D[[]FE  J%#ii5"NN $ ,-	/
 #)//"3A"6Ku%IIk*IIm,IIl+II01'  a
) &. KKMLLNJJL 4j  || 	5a@QI 
  	5a-c!fX6 	s6   C>D F+E	F	FF+FFF N)__name__
__module____qualname____firstlineno____doc__staticmethodr   r'   r6   rK   rZ   re   __static_attributes____classdictcell__)__classdict__s   @r   r   r   Z   s      6 6x > >@ ] ]F ` `D W Wr \ \    r   )rl   Consultas_SQL.conexionr   r   r   r   r   rg   rq   r   <module>rs      s$   M^ E  F Frq   