Ecommerce

Todo era efectivo

La caja del ERP registraba como efectivo cada cobro con tarjeta, Yape o Mercado Pago

Nicolás Biondi

En resumen: El ERP registraba como efectivo cada cobro del mostrador de servicio, porque nunca le mandábamos el medio de pago real. Lo arreglamos con una tabla de seis filas y confirmamos la inferencia con una boleta real.

Al cerrar el mostrador de servicio técnico, la caja del ERP (el sistema donde llevamos inventario y facturación) decía que ese día cobramos todo en efectivo. Nadie nos pasó un sol en la mano: la plata entró por POS (el terminal de tarjetas), por link de pago y por Yape. El monto del día coincidía con las ventas, pero el medio de pago estaba mal en todo lo que no fue efectivo.

Quien cuadra la caja al cierre no tiene cómo adivinar eso: tiene que abrir cada boleta, acordarse del cliente y corregir a mano. Me equivoqué yo, porque di por hecho que un campo que la SUNAT (la autoridad tributaria peruana) no exige no le importaba a nadie más.

La boleta no pregunta cómo te pagaron

Para la SUNAT el comprobante distingue dos cosas: Contado y Crédito. Pagues en efectivo, con tarjeta o con un link, el XML que se declara (el archivo que viaja a la SUNAT) es el mismo documento. Esa vista legal estuvo bien desde el primer día.

El cierre de caja responde otra pregunta: por dónde entró cada sol y dónde está ahora. Contestábamos la primera y dábamos la segunda por resuelta.

El ERP llenó el campo vacío por nosotros

Nuestro registro interno de pagos sí sabe la verdad. Cada cobro queda guardado con su método: efectivo, tarjeta, Yape, Plin, Mercado Pago o transferencia. Al emitir la boleta nunca mandábamos ese campo.

El ERP no deja el campo vacío: le pone su valor por defecto, Efectivo, y su módulo de caja archiva como plata en el cajón lo que llegó por POS o por link de pago.

Analogía: un cuaderno al lado de la caja donde el vendedor anota toda venta como efectivo, hasta la que llegó por tarjeta. El total del cuaderno cuadra con las ventas del día, pero el cajón nunca cuadra con el cuaderno y la diferencia no dice de dónde salió.

Seis filas que traducen el método al ERP

El arreglo cabe en una tabla, CONDICIONPAGO_POR_METODO. Traduce cada método de nuestro registro al id de condición de pago del ERP, el código numérico con el que el ERP clasifica de dónde vino la plata. Son seis filas y una búsqueda antes de emitir, sin infraestructura nueva.

Pago en registro interno

Mapeo a condición

Id de condición

Boleta emitida

Caja del ERP

Cobrado en caja

Depositado en cuenta

Antes: sin método

Recorrido del medio de pago desde el registro interno hasta la caja del ERP; punteado, la ruta vieja sin método.

El catálogo que el API no quiso darnos

Para llenar esas seis filas necesitaba los ids del proveedor de facturación electrónica, y su API (la puerta por donde un programa le pide datos a otro) no publica la lista de condiciones de pago. Probé 26 nombres plausibles de endpoint, uno por uno, y los 26 devolvieron 404, el código que significa "acá no hay nada". El proveedor da por hecho que vas a elegir la condición a mano en su panel web.

El panel sí lo teníamos. Las condiciones aparecen ahí en una lista ordenada, así que deduje cada id contando su posición. Como el panel nunca muestra el número, cada fila quedó como una suposición.

Faltan los ids

Probar 26 endpoints

Los 26 dan 404

Inferir por posición

Emitir boleta real

Imprime POS Culqi

Transferencia sin probar

Marcado en docs

Cómo armamos el catálogo que el API no entrega, y qué fila quedó sin prueba al final.

Gastamos una boleta real en comprobarlo

Emitimos un comprobante real, de una venta real, con el método tarjeta. Salió impreso como POS Culqi (Culqi es una de las pasarelas de pago que usamos), igual que predecía la tabla. Esa boleta convirtió la fila de tarjeta en un hecho verificado; las otras cinco siguen apoyadas en la posición del panel.

Antes, los seis métodos llegaban al ERP como Efectivo, y el efectivo acertaba por casualidad. Ahora la boleta viaja con su condición de pago y la caja se parte en dos: lo cobrado en el cajón y lo depositado en cuenta. El cierre dejó de depender de que alguien recuerde cómo pagó cada cliente.

La fila que seguimos sin poder probar

Queda un hueco. El registro guarda "transferencia" sin el banco asociado, así que todas las transferencias caen en un solo banco por decisión de negocio. Para cuadrar caja importa más acertar el tipo de movimiento (plata que entró a una cuenta, no al cajón) que el nombre del banco. Esa fila está marcada como no confirmada en el código y en la documentación, y se corrige el día que el registro guarde el banco.

Lo que hacemos distinto ahora

Quedaron tres hábitos de este arreglo:

  • si nuestro registro interno conoce el medio de pago, ese dato viaja con la boleta aunque la SUNAT no lo pida
  • antes de confiar en una inferencia emitimos un documento real: la boleta de tarjeta cerró en un intento lo que 26 endpoints no dieron
  • la fila que no pudimos probar queda escrita como no confirmada, igual que en otros módulos mostramos un guion antes que un número que no podemos sostener

Más en Ecommerce

Por ahora este es el único post aquí. Mira la sección o todos los posts.