feat: Enhance CSV cleaning service with new endpoints for CSV analysis and preview functionality. Introduce support for job management linked to extraction batches, and update the cleaning rules structure. Add new utility functions for handling CSV data and improve documentation for clarity on usage and available endpoints.

This commit is contained in:
erik
2026-07-11 00:27:05 -05:00
parent cf0ebc72ba
commit b770761832
73 changed files with 7614 additions and 2671 deletions
@@ -0,0 +1,135 @@
"""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(
"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,
)
rebuild_cleaning_rules()