+
    |1i*.                     X    R t ^ RIt^ RIt^ RIt^ RIHt ^ RIHtH	t	  ! R R4      t
R tR# )u:   
Funciones auxiliares para validación de datos del Score
N)datetime)DecimalInvalidOperationc                      a  ] tR t^t o RtR.t]R 4       t]R 4       t]R 4       t	]R 4       t
]R 4       t]R 4       t]R	 4       t]RR l4       tRtV tR
# )ValidadorTiposDatosuB   
Clase para validar tipos de datos según el catálogo SQL Server
OrderNum&Linec                   V P                  4       P                  4       p RpRp\        P                  ! W 4      pV'       dF   VP	                  ^4      R\        VP	                  ^4      4      \        VP	                  ^4      4      3# \        P                  ! W4      pV'       d.   VP	                  ^4      \        VP	                  ^4      4      RR3# V RRR3# )u   
Extrae información del tipo de dato SQL Server

Args:
    tipo_sql (str): Tipo SQL como 'NVARCHAR(50)', 'DECIMAL(18,2)', 'INT'
    
Returns:
    tuple: (tipo_base, longitud, precision, escala)
z(\w+)\((\d+)\)z(\w+)\((\d+),(\d+)\)N)upperstriprematchgroupint)tipo_sqlpatron_con_longitudpatron_decimalr   s   &   gc:\Users\victor.cervantes\Desktop\Elep\src\App\SupyCtrol_Module\IngenieroControl\ValidarScoreHelpers.pyextraer_info_tipo_sql)ValidadorTiposDatos.extraer_info_tipo_sql   s     >>#))+ 00 2;;q>4U[[^)<c%++a.>QQQ ,7;;q>3u{{1~#6dBB tT))    c                    \         P                  ! V 4      '       g   V R8X  d   R#  \        \        V 4      4      pRTu;8:  d   R8:  d   M MR# RRV  23#   \        \
        3 d    RRT  23u # i ; i)u!   Valida si el valor es INT válido iFzValor fuera de rango INT: !   No es un número entero válido: TNi   pdisnar   float
ValueError	TypeErrorvalorval_ints   & r   validar_intValidadorTiposDatos.validar_int<   s     775>>Ub[	F%,'Gg33!! :5'BBBI& 	F=eWEEE	F   'A A A10A1c                    \         P                  ! V 4      '       g   V R8X  d   R#  \        \        V 4      4      pRTu;8:  d   R8:  d   M MR# RRV  23#   \        \
        3 d    RRT  23u # i ; i)u$   Valida si el valor es BIGINT válidor   l    FzValor fuera de rango BIGINT: r   r   l         r   r    s   & r   validar_bigint"ValidadorTiposDatos.validar_bigintK   s     775>>Ub[	F%,'G#wE2EE!! =eWEEEI& 	F=eWEEE	Fr%   c                &   \         P                  ! V 4      '       g   V R8X  d   R#  \        V 4      p\        V4      pVP	                  RR4      P	                  RR4      pRV9   d7   VP                  R4      p\        V^ ,          4      p\        V^,          4      pM\        V4      p^ pWqV,
          8  d   RRV  RW,
           R	23# W^d,           8  d   RR
V  RV RV R23# W8  d    R#   \         d   p	RR\        T	4       23u Rp	?	# Rp	?	ii ; i)u   
Valida si el valor cumple con DECIMAL(precision, escala)
PERMITE valores con más decimales y los trunca mentalmente

Args:
    valor: Valor a validar
    precision (int): Total de dígitos
    escala (int): Dígitos decimales
r   N-+.Fu    Parte entera excede precisión: z (max u    dígitos enteros)zDemasiados decimales: z (tiene z, se esperaban max )zError validando decimal: r   )r   r   r   strreplacesplitlen	Exception)
r!   	precisionescalavalor_float	valor_str	valor_abspartesdigitos_enterosdigitos_decimaleses
   &&&       r   validar_decimal#ValidadorTiposDatos.validar_decimalZ   s2    775>>Ub[%	?,K K(I "))#r2::3CI i"-"%fQi.$'q	N!"%i.$%! f"45 @viN^M__qrrr !SL1 6ugXFWEXXklrksstuuu !) 	?5c!fX>>>	?s*   BC+ C+ "C+ +D6DDDc           	     0   \         P                  ! V 4      '       g   V R8X  d   R
#  \        V 4      P                  4       p\	        V4      V8:  d   R
# RRV RVR,           R\	        V4       R23#   \
         d   pRR	\        T4       23u Rp?# Rp?ii ; i)z0Valida si el valor cumple con NVARCHAR(longitud)r   NFu   Excede longitud máxima de z: ':N2   Nz...' (longitud: r-   zError validando NVARCHAR: r   )r   r   r.   r
   r1   r2   )r!   longitudr6   r;   s   &&  r   validar_nvarchar$ValidadorTiposDatos.validar_nvarchar   s     775>>Ub[	@E
((*I9~)!! ;H:SSVHXXhilmviwhxxyzzz 	@6s1vh???	@s#   *A0 A0 0B;B
BBc                   \         P                  ! V 4      '       g   V R8X  d   R# . ROp\        V 4      P                  4       pW!9   d   R# VP	                  R4      '       g/   VP	                  R4      '       g   VP	                  R4      '       d   R#  \         P
                  ! V RR7      pVP                  R8  d   RR	V  23# R#    RR
T  23u # ; i)uN   Valida si el valor es DATETIME válido o un valor especial que representa NULLr   z00/z00:z00-raise)errorsil  Fz#Fecha muy antigua (antes de 1900): u   No es una fecha válida: r   )z
00/01/1900z
00-01-1900z
1900-01-00z00:00:00z
0000-00-00z
00/00/0000z
01/01/1900)r   r   r.   r
   
startswithto_datetimeyear)r!   valores_null_fechar6   fecha_parseadas   &   r   validar_datetime$ValidadorTiposDatos.validar_datetime   s     775>>Ub[
 J$$&	 * &&)*>*>u*E*EI]I]^cIdId
	>^^E'BN ""T) CE7KKK	>5eW===s   /C C 	Cc                l    \         P                  ! V 4      '       g   V R8X  d   R# V R9   d   R# RRV  23# )u5   Valida si el valor es BIT válido (0, 1, True, False)r   Fu   No es un valor BIT válido: r   )
       01TFTrueFalsetruefalse)r   r   )r!   s   &r   validar_bitValidadorTiposDatos.validar_bit   s?     775>>Ub[SS8@@@r   Nc                `   \         P                  ! V4      ;'       g9    VR8H  ;'       g,    \        V\        4      ;'       d    VP	                  4       R8H  pV'       d!   V'       d   W0P
                  9   d	   RRV R23# V'       d   R# V P                  V4      w  rVrxVR8X  d   V P                  V4      # VR8X  d   V P                  V4      # VR	9   d   V P                  WV4      # VR
9   d   V P                  W4      # VR9   d   V P                  V4      # VR8X  d   V P                  V4      # R# )uY  
Valida un valor según su tipo SQL Server
INCLUYE VALIDACIÓN DE COLUMNAS OBLIGATORIAS (NOT NULL)

Args:
    valor: Valor a validar
    tipo_sql (str): Tipo SQL como 'INT', 'NVARCHAR(50)', etc.
    nombre_columna (str): Nombre de la columna (para validar si es obligatoria)
    
Returns:
    tuple: (es_valido: bool, mensaje_error: str o None)
r   Fu"   ⚠️ Campo obligatorio vacío: 'u   ' no puede estar vacíoINTBIGINTBITr   )DECIMALNUMERIC)NVARCHARVARCHARCHARNCHAR)DATETIME	DATETIME2DATESMALLDATETIME)r   r   
isinstancer.   r
   COLUMNAS_OBLIGATORIASr   r#   r'   r<   rA   rK   rV   )	clsr!   r   nombre_columna
esta_vacio	tipo_baser@   r3   r4   s	   &&&&     r   validar_por_tipo_sql(ValidadorTiposDatos.validar_por_tipo_sql   s.    WWU^ffu{ffz%7M7e7eRWR]R]R_ceRe
.^?X?X-X>~>NNefff  251J1J81T.	Y ??5))("%%e,,00&&u@@BB''88LL''..%??5)) r    N)__name__
__module____qualname____firstlineno____doc__rg   staticmethodr   r#   r'   r<   rA   rK   rV   classmethodrl   __static_attributes____classdictcell__)__classdict__s   @r   r   r      s      	 * *: F F F F 2? 2?h @ @ %> %>N A A / /r   r   c                   . pV P                    F6  pW,          P                  R8X  g   K  W,          P                  R 4      W&   K8  	  V P                    F6  pW,          P                  R9   g   K  W,          P                  R 4      W&   K8  	  RpW0P                   9   d   \        V 4      pW,          P	                  4       W,          R8H  ,          pW,          P
                  P                  4       pV F)  pVP                  RV^,           RVRR	R
RRRV R2/4       K+  	  W( ,          p \        V 4      pWH,
          p	\        RV RV	 24       W3# )u   
Limpia y prepara el DataFrame según las especificaciones

Args:
    df (pd.DataFrame): DataFrame a limpiar
    
Returns:
    tuple: (pd.DataFrame limpio, list de filas eliminadas con detalle)
objectc                 R    \        V \        4      '       d   V P                  4       # T # ro   )rf   r.   r
   xs   &r   <lambda>#limpiar_dataframe.<locals>.<lambda>  s    :a;M;Maggi.TST.Tr   c                 V    \         P                  ! V 4      '       d   \        V ^4      # T # )   )r   notnaroundr}   s   &r   r   r     s    bhhqkkeArl.Pq.Pr   r   r   filacolumnar!   u   [VACÍO]tipo_esperadozNOT NULLerroru    ⚠️ Eliminar Fila completa: 'u"   ' está vacío (campo obligatorio)zFilas eliminadas por u    nulo/vacío: )float64int64)	columnsdtypeapplyr1   r   indextolistappendprint)
dffilas_eliminadas_detallecolcolumna_obligatoriafilas_antesmask_vaciasindices_vaciasidxfilas_despuesfilas_eliminadass
   &         r   limpiar_dataframer     sJ     " zz7==H$gmm$TUBG 
 zz7==00gmm$PQBG 
 *jj("g -2248OSU8UV..557 "C$++a.;<O;PPrs-  " B&6%&9%:.IYHZ[\''r   )rt   pandasr   numpynpr   r   decimalr   r   r   r   rn   r   r   <module>r      s-      	  -q qh1(r   