Saltar al contenido
Todos los posts
28 de febrero de 2025·2 min de lectura·Diogo Hudson

Qué pasa cuando cierras una cotización

Cinco cosas, atómicamente, dentro de una transacción. Aquí está la lista completa para que sepas exactamente en qué confiar.

Qué pasa cuando cierras una cotización

Cerrar una cotización es el punto de transición de ventas a fulfillment. También es la transición más peligrosa de cualquier sistema de distribución si la haces mal.

En un sistema casero, 'cerrar' podría ser cambiar una celda de estado en una hoja de cálculo. En un ERP, podría disparar una cascada de efectos secundarios no documentados. En Quotery, son cinco pasos explícitos dentro de una sola transacción de base de datos, y cada uno deja rastro en el ledger. Aquí está la secuencia exacta.

Los cinco pasos, atómicos 1. Lock en la fila de la cotización con select_for_update(). Esto serializa los cierres concurrentes sobre la misma cotización — solo un llamador procede, el resto hace cola. 2. Para cada línea, lock en el StockItem con select_for_update() ordenado por (product_id, location_id). El orden es crítico — garantiza que dos cotizaciones concurrentes cerrando contra conjuntos solapados de productos adquieran locks en el mismo orden, previniendo deadlock. 3. Incrementa reserved en cada StockItem y graba una fila RESERVE en el ledger StockMovement para cada línea. Cada RESERVE lleva el id de la cotización, id del producto, id de la ubicación, cantidad y timestamp. 4. Construye la lista de shortages para cualquier línea que no se pudo reservar completamente. Esto es informativo — la cotización cierra igual. El llamador recibe un array shortages con ids de producto y la brecha entre lo solicitado y lo disponible. 5. Transiciona el estado de la cotización a closed y commitea la transacción.

Shortage es información, no fracaso Por diseño, close_quote no lanza 409 por inventario bajo. Recibes un array shortages con números exactos. El comercial decide qué hacer — reservar igual, ajustar, o negociar.

Esta es la inversión deliberada descrita en el post sobre la sobre-reserva. La mayoría de los sistemas trata la falta de inventario como un error bloqueante. Nosotros la tratamos como una señal. El comercial conoce su pipeline mejor que el sistema. Sabe lo que está llegando la próxima semana, qué clientes son flexibles, y qué líneas se pueden dividir en varios envíos. El trabajo de la herramienta es darle los números — no tomar la decisión por él.

Qué hace rollback Todo. La transacción es atómica. Un error de DB en el paso 3 hace rollback de los 1 y 2. Nunca terminas con media reserva.

En la práctica, el principal modo de falla es un problema de conectividad con la base de datos o un deadlock (resuelto por el orden de locks en el paso 2). El llamador reintenta y la transacción corre limpia. No existe un estado de 'cotización atascada', no existe 'el estado dice cerrada pero el inventario no se reservó', no existe un job de limpieza que arregla estado roto durante la noche. La atomicidad significa que la máquina de estados tiene exactamente dos resultados: la transacción se commiteó y todo está consistente, o no se commiteó y nada cambió.

Cómo una cotización va de borrador a entrega.

Todos los posts
Textos cortos sobre cotizar, inventario, IA y cómo los distribuidores pequeños despachan mucho volumen sin tanto rodeo.