feat: Introduce bot-digitador service for automated data entry in Integración Total. Add CLI and GUI interfaces for CSV processing, implement auto-start functionality on Windows, and enhance README with setup instructions and usage details. Include necessary configurations in docker-compose for service integration.

This commit is contained in:
erik
2026-08-09 21:26:56 -05:00
parent a3b4c7fc47
commit e9b766281a
74 changed files with 11177 additions and 115 deletions
@@ -3,6 +3,7 @@ from domain.verificador_st.pipeline import (
consolidado_to_records,
export_no_aptos_csv,
export_paso_bot_csv,
export_todos_csv,
process_cleaning_sources,
)
@@ -10,5 +11,6 @@ __all__ = [
"consolidado_to_records",
"export_no_aptos_csv",
"export_paso_bot_csv",
"export_todos_csv",
"process_cleaning_sources",
]
@@ -51,6 +51,8 @@ TABLA_MODERADORA = {
2025: {4700, 19200, 50300},
2026: {5000, 20100, 52800},
}
# Todos los montos de la tabla; la clasificación no filtra por año.
VALORES_MODERADORA = {v for vals in TABLA_MODERADORA.values() for v in vals}
# Longitudes según tabla entregada por el usuario.
# Los tipos marcados como alfanuméricos permiten letras y números.
@@ -554,14 +556,15 @@ def normalizar_autorizacion(valor):
def separar_copago_moderadora(valor, anio):
"""
Si el valor coincide con tabla moderadora del año => cuota_moderadora.
Si no coincide => copago.
Si el valor coincide con cualquier cuota de la tabla (sin importar el año)
=> cuota_moderadora. Si no coincide => copago.
El parámetro anio se conserva por compatibilidad de firma.
"""
monto = to_int(valor, default=0)
if monto == 0:
return 0, 0
if anio in TABLA_MODERADORA and monto in TABLA_MODERADORA[anio]:
if monto in VALORES_MODERADORA:
return 0, monto
return monto, 0
@@ -223,3 +223,21 @@ def export_no_aptos_csv(rows: list[dict[str, Any]]) -> str:
df = df.rename(columns=CSV_FINAL_IT_RENAME)
df = df.reindex(columns=headers)
return df.to_csv(sep="|", index=False, encoding="utf-8-sig")
def export_todos_csv(rows: list[dict[str, Any]]) -> str:
"""CSV pipe-separated con todas las filas (aptos y no aptos) e OBSERVACION."""
headers = [*CSV_FINAL_IT_HEADERS, "OBSERVACION"]
if not rows:
df = pd.DataFrame(columns=headers)
else:
df = pd.DataFrame(rows)
for c in COLUMNAS_FINAL_IT:
if c not in df.columns:
df[c] = ""
if "OBSERVACION" not in df.columns:
df["OBSERVACION"] = ""
df = df.reindex(columns=[*COLUMNAS_FINAL_IT, "OBSERVACION"]).fillna("")
df = df.rename(columns=CSV_FINAL_IT_RENAME)
df = df.reindex(columns=headers)
return df.to_csv(sep="|", index=False, encoding="utf-8-sig")