feat(finanzas/balanza): endpoint de balanza de comprobación desde el datalake
Lee serving_fin.balanza_comprobacion (ERP Sinube, poblada por DAG) y expone
GET /api/finanzas/balanza/detalle: un corte completo, ya cruzado al catálogo
de empresas del grupo.
Tres decisiones que conviene no re-litigar:
-
El cruce es por RFC, no por nombre. Es más fuerte que el
build_canon_index()que usan Saldos y Antigüedad: cruza 38 de 38 empresas y ningún RFC del catálogo es ambiguo. Se conserva el índice por nombre como respaldo si el ERP llegara a dar de alta una razón social sin RFC. -
Las empresas viajan normalizadas en
empresas[]y cada fila referencia suemp. No es por tamaño —GZipMiddleware deja el MB en 72 KB—: es para que el resultado del cruce exista una sola vez por empresa y dos renglones no puedan declarar portafolios distintos. - Un corte por llamada. Los dos cortes del periodo son extracciones alternativas, no meses: sumarlos duplicaría la balanza.
meta reporta lo que la vista necesita declarar en pantalla: el cuadre de sumas
iguales, cuántos renglones traen movimiento (36 de 3,833 en el periodo vigente,
y en todos los cargos igualan a los abonos) y cuántas subcuentas no traen su
renglón padre.
Se siembra la sub-área balanza —sin ella el sidebar la esconde a todo el que
no sea admin— y el umbral balanza_descuadre_tolerancia, porque el número que
separa el redondeo del ERP de un descuadre real es criterio del área, no una
constante del código.
Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com Claude-Session: https://claude.ai/code/session_01Jbr414bBvG1H44gwZrCnuZ