Los dos dashboards (Trade Food y TF Carnes) leen en vivo el mismo tipo de Google Sheet y aplican casi la misma lógica de cálculo — cambian el Sheet, las listas de clientes propias de cada empresa, y desde hace poco también cómo se calcula el "Total a cobrar" (sección 5). Esta página explica, paso a paso, cómo se llega desde una fila del Excel hasta cada número que ves en pantalla.
Ningún dato se sube a mano en esta página — todo se lee en vivo.
Cada dashboard apunta a un Google Sheet propio, publicado como "Cualquiera con el
vínculo puede ver". Al cargar la página (o tocar ↺ Actualizar), el navegador le
pide directamente a Google, vía su API pública gviz/tq, el contenido de dos
pestañas del Sheet: Archivo A y Archivo B. Cada fila de esas pestañas es un
comprobante: quién debe (Razón social), cuánto (Importe) y cuándo
vence (Fecha Vencimiento).
Un Importe positivo es una factura (deuda pendiente); uno negativo es una
nota de crédito ("a aplicar" contra esa deuda).
No todo lo que aparece en el Sheet es un cliente real.
Antes de calcular nada, se descartan por completo las cuentas de una lista fija (proveedores, seguros, empleados, fletes, cuentas intercompany, etc.) — no son clientes que le deban dinero a la empresa, son ruido contable que quedó mezclado en el mismo archivo. Estas cuentas no aparecen en ningún lado: ni en el total, ni en los buckets, ni en la tabla, ni en ninguna tarjeta.
Un cliente puede tener deuda en A, en B, o en los dos.
Antes de armar cada proyección, se recorren ambos archivos juntos y se suma,
por cliente, cuánto debe en cada uno (debeA, debeB) y cuánto
tiene de notas de crédito en cada uno (aplicarA, aplicarB).
Un cliente es "elegible" — entra a la proyección — si su deuda combinada
(debeA + debeB) es mayor a cero. Esto evita un caso raro pero real: que una
nota de crédito de un cliente que no tiene ninguna deuda pendiente en ningún archivo le
reste plata al total de otro cliente, o que quede flotando sin sentido.
Clientes reales, pero que no se cuentan en el total "de todos los días".
Dentro de los clientes elegibles, hay una segunda lista de clientes que sí son clientes reales pero que por algún motivo de gestión (juicio, cobro dudoso, en seguimiento especial) no deben inflar el número principal de "Total a cobrar". Se excluyen de ese total y de los 4 buckets de días, y se muestran en su propia tarjeta ("Difícil cobro" en Trade Food, "A resolver" en TF Carnes).
TF Carnes resta las notas de crédito; Trade Food no resta nada. En las dos empresas, el Total termina coincidiendo con la suma de los 4 buckets (sección 6) — cada una llega ahí por un camino distinto.
Vencido, Próx. 7 días, De 7 a 15 días, Más de 15 días.
Cada factura de un cliente elegible y no-excluido cae en uno solo de estos 4 buckets, según cuántos días faltan hasta su vencimiento — son mutuamente excluyentes, nunca se pisan entre sí:
Antes esto solo pasaba en Trade Food. Ahora pasa en las dos, por motivos distintos.
Agrupa por fecha de vencimiento, con el detalle de quién compone cada monto.
Cada factura (y, en TF Carnes, cada nota de crédito — sección 6) de un cliente elegible y no-excluido se acumula en su fecha de vencimiento. El resultado es una fila por fecha, con:
Cliente A ($123.456), Cliente B ($54.321)).La suma de todas las filas de la tabla es exactamente igual a la suma de los 4 buckets (sección 7) — la tabla la desglosa día por día y cliente por cliente, con el mismo criterio de notas de crédito que su empresa use en los buckets.
Tocando cualquier fila se abre el mismo modal de detalle que usan las tarjetas de KPI, con el desglose cliente por cliente de esa fecha (cuánto debe cada uno, cuántas filas del Sheet aporta, y el vencimiento). La fila agrupada "Vencido hace más de 30 días" también abre su propio detalle — antes no tenía desglose por cliente, ahora muestra a cada cliente con su rango de vencimiento más viejo y más nuevo dentro del grupo.
El botón "📅 Por fecha / 🏢 Por empresa" arriba a la derecha de la tabla cambia el criterio de agrupación: en vez de una fila por fecha (con el detalle de qué cliente aporta cuánto), arma una fila por cliente (con el detalle de en qué fechas vence cada monto), sin importar el vencimiento. Son los mismos datos reagrupados — la suma total y la de cada cliente coinciden exactas entre las dos vistas, solo cambia qué va en las filas y qué va en el detalle de cada una.
Mismo mecanismo, distinto Sheet y distintas listas de clientes.
| Trade Food | TF Carnes | |
|---|---|---|
| Pestañas del Sheet | A / B | Archivo A / Archivo B |
| Cuentas excluidas | CLIENTES_EXCLUIDOS | EXCLUDED (incluye matches parciales por apellido) |
| Tarjeta "aparte" | Difícil cobro (excluido)CLIENTES_DIFICIL_COBRO | A resolver (excluido)RESOLVER_CLIENTES |
| "Total a cobrar" | Bruto — no resta notas de crédito (sección 5) | Neto — resta notas de crédito (sección 5) |
| Buckets de días | Brutos — no restan notas de crédito (sección 6) | Netos — cada nota de crédito resta del bucket de su propia fecha (sección 6) |
| Colores | Bordo Trade Food | Verde TF Carnes |
| Archivos | index.html / css/style.css / js/app.js | tfcarnes.html / css/tfcarnes.css / js/tfcarnes.js |
Todo lo demás — la tabla, el orden, el zoom — es exactamente el mismo cálculo en ambos dashboards; las diferencias reales de fórmula son el Total a cobrar y los buckets de días (secciones 5 y 6), que en las dos empresas terminan coincidiendo entre sí (sección 7) aunque cada una llegue ahí de forma distinta. Son dos apps completamente independientes (no comparten datos ni estado), pero corren casi el mismo código con distintos parámetros.