Cuentas a Cobrar · Documentación

De dónde sale cada número

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.

Contenido
  1. 1De dónde vienen los datos
  2. 2Cuentas excluidas
  3. 3Combinar Archivo A y B por cliente
  4. 4Clientes que se muestran aparte
  5. 5El "Total a cobrar" (neto en TF Carnes, bruto en Trade Food)
  6. 6Los 4 buckets de días
  7. 7Por qué el Total = suma de los buckets (en las dos empresas)
  8. 8La tabla: Fecha · Días · Empresas
  9. 9Ordenar, zoom y actualizar
  10. 10Trade Food vs. TF Carnes

1De dónde vienen los datos

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).

flowchart LR A[("Google Sheet
Archivo A")] --> C["Cada fila = un comprobante
cliente · importe · vencimiento"] B[("Google Sheet
Archivo B")] --> C C --> D["processSheet()
descarta filas sin cliente o sin fecha"]

2Cuentas excluidas

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.

Importante: esta lista es distinta para cada empresa (ver sección 10) y se mantiene a mano en el código — si aparece un cliente nuevo que en realidad es una cuenta no-real, hay que agregarlo ahí.

3Combinar Archivo A y B por cliente

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.

elegible(cliente) = (debeA + debeB) > 0

4Clientes que se muestran aparte

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).

flowchart TD A[Fila del Excel] --> B{"¿Cuenta excluida?"} B -- Sí --> X["Se descarta
(no aparece en ningún lado)"] B -- No --> C{"¿Elegible?
debeA+debeB > 0"} C -- No --> Y["No entra a la proyección
(sin deuda pendiente)"] C -- Sí --> D{"¿Difícil Cobro /
A Resolver?"} D -- Sí --> F["Tarjeta aparte
fuera del Total y los buckets"] D -- No --> G["Entra al Total, a los buckets
y a la tabla"]

5El "Total a cobrar": distinto mecanismo, mismo resultado final

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.

TF Carnes — el Total a cobrar es neto: para cada archivo (A o B), es la suma, sobre todos los clientes elegibles y no-excluidos, de su deuda en ese archivo menos su nota de crédito en ese mismo archivo.
Total a cobrar (TF Carnes) = Σ (debearchivo − aplicararchivo)
Ejemplo: un cliente debe $100.000 en Archivo A y tiene una nota de crédito de $30.000 también en Archivo A → aporta $70.000 al Total de A.
Trade Food — el Total a cobrar es bruto: es la suma de la deuda de cada cliente elegible y no-excluido, sin restar ninguna nota de crédito. Las notas de crédito siguen existiendo en el Sheet y siguen determinando qué clientes son "elegibles" (sección 3), pero ya no achican el número de la tarjeta.
Total a cobrar (Trade Food) = Σ debearchivo
Mismo ejemplo: ese cliente aporta los $100.000 completos al Total de A — la nota de crédito de $30.000 no se resta (podés verla igual, marcada como informativa, en el detalle de la tarjeta).

6Los 4 buckets de días

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í:

Vencido → días ≤ 0 (incluye lo que vence hoy) Próx. 7 días → 1 a 7 días De 7 a 15 días → 8 a 15 días Más de 15 días → 16+ días
TF Carnes: cada nota de crédito (importe negativo) también cae en uno de estos 4 buckets, según su propia fecha de vencimiento, y resta de ese bucket — no solo del Total. Si una factura vence dentro de 10 días y su nota de crédito vence dentro de 3 días, la factura suma a "De 7 a 15 días" y la nota de crédito resta de "Próx. 7 días" (buckets distintos, cada una en el suyo).
Trade Food: estos 4 números siguen siendo brutos — suman directamente el importe de cada factura, sin restar ninguna nota de crédito acá tampoco (coherente con que el Total de Trade Food tampoco las resta).

7Por qué el Total = suma de los 4 buckets (en las dos empresas)

Antes esto solo pasaba en Trade Food. Ahora pasa en las dos, por motivos distintos.

TF Carnes: el Total resta las notas de crédito por cliente, y los buckets ahora TAMBIÉN restan cada nota de crédito (en el bucket que le toca por su propia fecha). Como es la misma plata restada, solo que repartida en distintos buckets en vez de en un solo lugar, el total de los 4 buckets termina dando exactamente igual al Total a cobrar (neto).
Trade Food: ni el Total ni los buckets restan ninguna nota de crédito — los dos son brutos, así que coinciden por la razón opuesta: no hay nada que reconciliar, es la misma suma sin tocar en los dos lados.
flowchart LR V["Vencido"] --- P7["Próx. 7d"] --- P15["De 7 a 15d"] --- M15["Más de 15d"] M15 --> N["Total a cobrar
(misma plata, mismo criterio
de notas de crédito en los dos lados)"]
Total a cobrar = Vencido + Próx.7 + De7a15 + Más15 (en las dos empresas)

8La tabla: Fecha · Días · Empresas

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:

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.

9Ordenar, zoom y actualizar

10Trade Food vs. TF Carnes

Mismo mecanismo, distinto Sheet y distintas listas de clientes.

 Trade FoodTF Carnes
Pestañas del SheetA / BArchivo A / Archivo B
Cuentas excluidasCLIENTES_EXCLUIDOSEXCLUDED (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íasBrutos — 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)
ColoresBordo Trade FoodVerde TF Carnes
Archivosindex.html / css/style.css / js/app.jstfcarnes.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.


Cuentas a Cobrar Proyectadas — Trade Food / TF Carnes