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

145 lines
4.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""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,
)
rebuild_cleaning_rules()