Pedido e orçamento

Dúvida: como lançar pedido ou orçamento, quais campos valem, quando reserva estoque e quais IPs disparam.

Dúvida: como emitir pedido de venda ou orçamento?

Ambiente: Operações → Vendas → Pedidos (/apps/sales). Inclusão /apps/sales/add. Tabela FAC0113 / itens FAC0112. Código sequencial por filial (o front não manda code).

Pré-requisitos: cliente (ou CONSUMIDOR + apelido se a config da filial ligar customerSaleAlias); produto; condição liberada para o cliente (FCP005 — sem alocação = todas da filial); tabela de preços só se ativa e vigente na data do documento.

Caminho

  1. Novo pedido. Informe tipo PEDIDO ou ORCAMENTO, cliente, vendedor, condição, tabela (valueTable), data de entrega, observação.
  2. Itens (F3 ou código): unitário inicial = tabela vigente ou salePrice. Desconto é campo separado (discount); amount permanece bruto. total = amount × qtd − discount.
  3. Salvar. IPs BEFORE_CREATE/BEFORE_SAVE/ACTION.SAVE/SCREEN.* (wired) podem negar.
  4. Pedido revalida estoque e sincroniza reserva. Orçamento não reserva.
  5. Pedido já PARTIALLY_SERVICED / FULLY_SERVICED não edita (PATCH recusa). Ajuste via devolução ou cancelamento. Faturar saldo restante do parcial continua permitido.

Status

CREATED | IN_APPROVEMENT_FLOW | APPROVED | PARKED | FINISHED | FULLY_SERVICED | PARTIALLY_SERVICED | REFUSED

  • Orçamento (ORCAMENTO) não fatura. Converte com POST /sales-order/convert-quote/:id (data = dia da ação, America/Sao_Paulo).
  • Pedido → orçamento só se não faturado: POST /sales-order/convert-order-to-quote/:id.
  • Edição de PEDIDO revalida estoque e re-sincroniza reservas. Orçamento não reserva.
  • PARKED + groupedIntoOrderId: origem de agrupamento; não fatura. O agrupador não aparece no PDV (F3).

Preço da linha

amount = unitário bruto (não embutir desconto). discount = absoluto da linha. total = líquido (amount × qtd − discount). originalPrice = snapshot da tabela.

Agrupamento para NF-e consolidada

POST /sales-order/group junta 2+ pedidos da mesma filial só para NF-e. Não valida estoque, não baixa, não gera CR, salvo generateFinancialTitle=true (aí exige paymentConditionId e liberações do cliente).

Se os pedidos tiverem clientes diferentes ou CONSUMIDOR, a API pede fiscalCustomerId (NEED_GROUP_CUSTOMER). Preview: POST /sales-order/group/preview.

Troca de cliente

POST /sales-order/:id/assign-customer — se ainda não gerou CR próprio, troca o comercial; senão só o destinatário em FAT003 até a NF autorizar. IP BEFORE_ASSIGN_CUSTOMER não wired.

IPs wired no save / tela

BEFORE_CREATE / AFTER_CREATE / BEFORE_SAVE / AFTER_SAVE / ACTION.SAVE / SCREEN.* / TOOLBAR / lista.

Não wired: VALIDATE, BEFORE_DELETE, conversão de orçamento, itens (BEFORE_ADD, VALIDATE, PRICE_RESOLVE), TAB, aprovação, entrega futura, agrupamento, liberação de preço.

Sample oficial grava auditoria no AFTER_SAVE com ctx.ext.records — SDK sample.

Eventos

sales.order.created | updated | cancelled | approved | fulfilled | sales.quote.converted | sales.order.convertedToQuote

Aliases internos (SALES_ORDER_CREATED, …) em eventos.