Files
IPSExtractor/services/cleaning/domain/csv_cleaning/rules/builtins.py
T

136 lines
4.5 KiB
Python

"""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()