A maioria das ferramentas trata cotação como PDF. Escreve, manda, esquece. Se o cliente topa, você redigita as partes importantes noutro sistema. Se não topa, apaga o PDF.
Essa desconexão entre a ferramenta de cotação e a de fulfillment é o handoff mais caro da distribuição. O comercial fecha num sistema, o almoxarifado separa em outro, e a lacuna entre eles é preenchida com email, mensagem de Slack e Post-it. Nada fica sincronizado porque nada foi projetado para ficar.
Estados que significam algo A Quote do Quotery tem um enum de status: rascunho → enviada → fechada → parcialmente_entregue → entregue, com cancelamento a partir de rascunho / enviada / fechada. Cada transição é um service call que força invariantes.
A máquina de estados não é cosmética. rascunho significa que nada está reservado e nada é visível para o cliente. enviada significa que o cliente tem acesso à cotação pelo portal. fechada significa que o cliente aceitou e o estoque está reservado. parcialmente_entregue significa que pelo menos uma nota de entrega foi postada contra essa cotação. entregue significa que cada linha foi completamente expedida. Cada estado controla ações específicas — você não pode entregar de rascunho, não pode cancelar de entregue, e não pode editar preços numa cotação fechada.
Fechar reserva estoque No momento em que você fecha uma cotação, o Quotery reserva o estoque de cada linha. Se não bate, a resposta mostra exatamente quais produtos faltam — a cotação fecha igual. O comercial recebe informação, não atrito.
Essa é a decisão de design deliberada que descrevemos em mais detalhes no post sobre super-reserva. A operação de fechamento nunca falha por disponibilidade. Reserva o que tem, reporta o que falta, e deixa o time comercial decidir. Alguns vão seguir mesmo assim — a carga de entrada chega terça e o cliente não precisa de entrega até sexta. Outros vão ligar para o cliente e ajustar quantidades. O trabalho da ferramenta é informar a decisão, não tomá-la.
Cancelamento é transação Cancelar uma cotação fechada escreve linhas RELEASE no ledger para desfazer a reserva. Cancelar uma parcialmente entregue é rejeitado — você posta uma nota de devolução no lugar. As regras são código, não memória.
Toda transição de estado é uma única transação de banco. A mudança de status, as escritas no ledger, e as atualizações de cache comitam todas juntas ou fazem rollback todas juntas. Não existe estado parcial. Não existe 'o status diz fechada mas o estoque não foi reservado'. Se o banco cair no meio da transação, tudo desfaz e o chamador tenta de novo. Atomicidade não é feature — é o único jeito honesto de construir uma máquina de estados que move dinheiro e produto.
