145 lines
4.8 KiB
Python
145 lines
4.8 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(
|
||
"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()
|