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
- Novo pedido. Informe tipo
PEDIDOouORCAMENTO, cliente, vendedor, condição, tabela (valueTable), data de entrega, observação. - Itens (F3 ou código): unitário inicial = tabela vigente ou
salePrice. Desconto é campo separado (discount);amountpermanece bruto.total=amount × qtd − discount. - Salvar. IPs
BEFORE_CREATE/BEFORE_SAVE/ACTION.SAVE/SCREEN.*(wired) podem negar. - Pedido revalida estoque e sincroniza reserva. Orçamento não reserva.
- Pedido já
PARTIALLY_SERVICED/FULLY_SERVICEDnão edita (PATCHrecusa). 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 comPOST /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
PEDIDOrevalida 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.
