"""Registro de todas las reglas built-in. Añadir una regla nueva: implementa la función y llama a register_rule abajo. """ from __future__ import annotations from . import dates as date_rules from . import documents as doc_rules from . import numeric as num_rules from . import special from . import text as text_rules from .registry import rebuild_cleaning_rules, register_rule register_rule( "strip_special_spaces", name="Eliminar caracteres especiales y espacios", description=( "Deja solo caracteres alfanuméricos (A-Z, a-z, 0-9). No usar antes de " "«Normalizar fecha» en columnas con fecha y hora: pega cifras y puede impedir " "interpretar el valor (aplique primero la normalización de fecha o use la regla " "que conserva separadores)." ), fn=text_rules._rule_strip_special_spaces, ) register_rule( "strip_special_keep_date_seps", name="Quitar símbolos; conserva /, -, : y espacios (fechas o texto con fechas)", description=( "Quita comas, $, comillas, etc. y deja letras, números, /, -, : (hora) y espacios. " "Adecuado p. ej. en columna 'Fecha Servicio'." ), fn=text_rules._rule_strip_special_keep_date_seps, ) register_rule( "strip_spaces", name="Eliminar únicamente espacios", description="Elimina todos los caracteres de espacio en blanco.", fn=text_rules._rule_strip_spaces, ) register_rule( "to_integer", name="Convertir a Entero", description=( "Convierte a enteros con detección de miles/decimal (`,`/`.`) y moneda; " "redondea decimales." ), fn=num_rules._rule_to_integer, ) register_rule( "date_to_ddmmyyyy", name="Normalizar fecha → DD/MM/AAAA", description=( "Normaliza fechas numéricas, con separadores, con ruido o con meses en " "texto (ej. 26-abril-2026) al formato DD/MM/AAAA." ), fn=date_rules._rule_date_to_ddmmyyyy, ) register_rule( "date_numeric_to_ddmmyyyy", name="Conversión de formato numérico (Fechas) → DD/MM/AAAA", description=( "Detecta el formato numérico predominante (YYYYMMDD, DDMMYYYY, etc.) " "y normaliza a DD/MM/AAAA." ), fn=date_rules._rule_date_numeric_to_ddmmyyyy, ) register_rule( "date_alpha_to_ddmmyyyy", name="Conversión de formato alfanumérico (Fechas) → DD/MM/AAAA", description=( "Detecta el formato con separadores predominante " "(DD/MM/YYYY, MM/DD/YYYY, YYYY/MM/DD, etc.) y normaliza a DD/MM/AAAA." ), fn=date_rules._rule_date_alpha_to_ddmmyyyy, ) register_rule( "date_messy_text_to_ddmmyyyy", name="Texto a fecha (ruido en fechas) → DD/MM/AAAA", description=( "Quita ruido entre cifras (*, +, _, /, etc.), detecta el orden en la " "columna (DDMMYYYY, YYYYMMDD, DDMMYY) y unifica a DD/MM/AAAA." ), fn=date_rules._rule_date_messy_text_to_ddmmyyyy, ) register_rule( "round_decimals_custom", name="Aproximación Decimales (>0,5 sube, ≤0,5 baja)", description=( "Usa el mismo análisis de miles, decimales y moneda que «Entero». Tras leer " "el número, si la parte fraccionaria de |valor| es mayor a 0,5 se aproxima al " "entero hacia lejos de cero; en caso contrario, hacia cero. El 0,5 exacto se baja." ), fn=num_rules._rule_round_decimals_custom, ) register_rule( "doc_id_split_tipo_numero", name="Dividir tipo y número (documento)", description=( "Añade dos columnas (nombres únicos p. ej. TipoID_doc_tipo, TipoID_doc_numeros): " "prefijo con letras (NIT, CC, CE, …) y cifras sin separadores. No modifica la " "columna de origen." ), fn=special._rule_passthrough_series, ) register_rule( "doc_type_homologate", name="Homologar tipo de documento", description=( "Convierte tipos de documento escritos como nombre largo, sigla o texto con " "símbolos a su abreviatura estándar (CC, TI, CE, RC, etc.)." ), fn=doc_rules._rule_doc_type_homologate, ) register_rule( "cop_mod_split", name="Separa COP/MOD (copago / moderadora)", description=( "Según el año en la columna Fecha Servicio que elija en la tarjeta, clasifica " "el importe en cuota moderadora (valores por año en Configuración) o copago. " "Se ejecuta al final del proceso de limpieza para usar fechas ya normalizadas." ), fn=special._rule_passthrough_series, ) register_rule( "cop_mod_bruto_neto", name="COP/MOD (bruto − neto)", description=( "Calcula la columna «cop/mod» como Valor bruto − Valor neto. " "Elija ambas columnas en la tarjeta (se detectan automáticamente si existen)." ), fn=special._rule_passthrough_series, ) register_rule( "nota_paciente_autorizacion", name="Extraer datos de notas (documento y autorización)", description=( "Desde texto tipo nota hospitalaria, extrae el número tras «Paciente:» (antes del " "guión del nombre) y, si existe, el de «Autorización No.». Añade dos columnas; " "no modifica el texto original." ), fn=special._rule_passthrough_series, ) register_rule( "drop_column", name="Eliminar columna", description=( "Quita por completo esta columna del resultado limpio. " "Útil para campos que no se necesitan en el export o en pasos posteriores." ), fn=special._rule_passthrough_series, ) rebuild_cleaning_rules()