Envio de pedidoOrder placementEnvío de pedido
A transação de escrita que envia um pedido do carrinho para o backend, via o Dispatcher. Um único builder monta o payload JSON de três variantes — pedido direto, pedido indireto e pedido para aprovação — que se distinguem apenas pelo serviceName e por poucos campos. Toda a construção do contrato wire vive no builder.
The write transaction that sends a cart's order to the backend, through the Dispatcher. A single builder assembles the JSON payload for three variants — direct order, indirect order and approval order — which differ only by serviceName and a handful of fields. All wire-contract construction lives in the builder.
La transacción de escritura que envía el pedido del carrito al backend, vía el Dispatcher. Un único builder arma el payload JSON de tres variantes — pedido directo, pedido indirecto y pedido para aprobación — que se distinguen solo por el serviceName y unos pocos campos. Toda la construcción del contrato wire vive en el builder.
O que é e quando aconteceWhat it is and when it happensQué es y cuándo ocurre
Quando o representante de vendas conclui a criação de um pedido, o app envia esse pedido ao backend por esta transação. É o momento em que o carrinho vira um pedido de verdade: sai do dispositivo e passa a existir no sistema, aparecendo depois na Lista de pedidos. A mesma transação também é usada ao editar, liberar ou cancelar um pedido. When the sales rep finishes creating an order, the app sends that order to the backend through this transaction. It's the moment the cart becomes a real order: it leaves the device and starts to exist in the system, later showing up in the Order list. The same transaction is also used to edit, release or cancel an order. Cuando el representante de ventas termina de crear un pedido, la app envía ese pedido al backend por esta transacción. Es el momento en que el carrito se convierte en un pedido real: sale del dispositivo y pasa a existir en el sistema, apareciendo luego en la Lista de pedidos. La misma transacción también se usa al editar, liberar o cancelar un pedido.
Existem três variantes, escolhidas automaticamente conforme a situação:There are three variants, chosen automatically according to the situation:Existen tres variantes, elegidas automáticamente según la situación:
Pedido diretoDirect orderPedido directo
O caso padrão: o pedido do varejo segue direto para processamento.The default case: the retail's order goes straight to processing.El caso estándar: el pedido del punto de venta va directo a procesamiento.
Pedido indiretoIndirect orderPedido indirecto
Venda atendida por um distribuidor em vez da fábrica. Só existe na África do Sul.A sale fulfilled by a distributor instead of the factory. Exists only in South Africa.Venta atendida por un distribuidor en lugar de la fábrica. Solo existe en Sudáfrica.
Pedido para aprovaçãoApproval orderPedido para aprobación
Precisa passar por uma aprovação antes de ser processado (ex.: fora do limite de crédito).Must go through an approval before being processed (e.g. beyond the credit limit).Debe pasar por una aprobación antes de ser procesado (p. ej. fuera del límite de crédito).
Escolha automáticaAutomatic choiceElección automática O rep não escolhe a variante: ela é decidida pelo app a partir do tipo de venda e das regras do mercado. Para o rep, o gesto é sempre o mesmo — concluir e enviar o pedido. The rep doesn't pick the variant: the app decides it from the sale type and the market's rules. For the rep, the gesture is always the same — finish and send the order. El rep no elige la variante: la decide la app a partir del tipo de venta y las reglas del mercado. Para el rep, el gesto es siempre el mismo — terminar y enviar el pedido.
Fluxo de telas que disparaScreen flow that fires itFlujo de pantallas que lo dispara
A transação é o último passo da jornada de criação de pedido. As telas do caminho pertencem à feature de Carrinho; aqui só situamos onde o envio acontece:The transaction is the last step of the order-creation journey. The screens along the way belong to the Cart feature; here we only place where the send happens:La transacción es el último paso del recorrido de creación de pedido. Las pantallas del camino pertenecen a la feature de Carrito; aquí solo situamos dónde ocurre el envío:
- Vitrine de produtosProduct showcaseVitrina de productosO rep escolhe os produtos e as quantidades para o varejo.The rep picks the products and quantities for the retail.El rep elige los productos y las cantidades para el punto de venta.
- Revisão do carrinhoCart reviewRevisión del carritoConfere itens, descontos e promoções; aqui também vive o botão de pedido à vista (Chile).Reviews items, discounts and promotions; the pay-at-sight button (Chile) also lives here.Revisa ítems, descuentos y promociones; el botón de pago al contado (Chile) también está aquí.
- PagamentoPaymentPagoDefine método de pagamento e condições (parcelas, dias de crédito).Sets the payment method and terms (installments, credit days).Define el método de pago y las condiciones (cuotas, días de crédito).
- ConfirmaçãoConfirmationConfirmaciónMostra o resumo final do pedido antes do envio.Shows the final order summary before sending.Muestra el resumen final del pedido antes del envío.
- Enviar pedido → esta transaçãoSend order → this transactionEnviar pedido → esta transacciónAo tocar em enviar/confirmar na confirmação, o app dispara o Envio de pedido. É este toque que aciona a transação.Tapping send/confirm on the confirmation screen fires Order placement. This tap is what triggers the transaction.Al tocar enviar/confirmar en la confirmación, la app dispara el Envío de pedido. Este toque es lo que activa la transacción.
Editar / liberar / cancelarEdit / release / cancelEditar / liberar / cancelar A partir do detalhe de um pedido, as ações de editar, liberar e cancelar disparam a mesma transação — muda só a intenção do envio. From an order's detail, the edit, release and cancel actions fire the same transaction — only the send intent changes. Desde el detalle de un pedido, las acciones de editar, liberar y cancelar disparan la misma transacción — solo cambia la intención del envío.
Depois do envioAfter sendingDespués del envío
- Confirmação ao repConfirmation to the repConfirmación al rep
- Quando o backend aceita, o pedido é confirmado e passa a constar na Lista de pedidos, com um status (ex.: em espera, pendente de aprovação, faturado).When the backend accepts it, the order is confirmed and appears in the Order list, with a status (e.g. on hold, pending approval, invoiced).Cuando el backend lo acepta, el pedido se confirma y aparece en la Lista de pedidos, con un estado (p. ej. en espera, pendiente de aprobación, facturado).
- Sem internetOfflineSin internet
- O envio pode entrar em fila e ser reenviado quando a conexão volta — o rep não perde o pedido. Um reenvio pode, em tese, duplicar; o sistema usa um identificador de transação para evitar isso.The send may be queued and retried when the connection returns — the rep doesn't lose the order. A retry could, in theory, duplicate; the system uses a transaction id to avoid that.El envío puede quedar en cola y reintentarse cuando vuelve la conexión — el rep no pierde el pedido. Un reenvío podría, en teoría, duplicar; el sistema usa un identificador de transacción para evitarlo.
- Acompanhar o envioTracking the sendSeguir el envío
- O status técnico do despacho (enviado, em fila, com erro) pode ser acompanhado na central de dados / tracking de despachos do app — útil para suporte investigar um envio.The dispatch's technical status (sent, queued, errored) can be followed in the app's data center / dispatch tracking — useful for support to investigate a send.El estado técnico del despacho (enviado, en cola, con error) puede seguirse en el centro de datos / tracking de despachos de la app — útil para que soporte investigue un envío.
Visão técnicaTechnical overviewVisión técnica
Envio de pedido é a transação de saída que persiste um pedido no backend. Ela é disparada pelo fluxo de carrinho quando o representante de vendas cria, edita, libera ou cancela um pedido. O carrinho é a fonte; o resultado é um pedido que passa a aparecer na Lista de pedidos. Order placement is the outbound transaction that persists an order in the backend. It's fired by the cart flow when the sales rep creates, edits, releases or cancels an order. The cart is the source; the result is an order that then shows up in the Order list. Envío de pedido es la transacción de salida que persiste un pedido en el backend. Se dispara desde el flujo del carrito cuando el representante de ventas crea, edita, libera o cancela un pedido. El carrito es la fuente; el resultado es un pedido que luego aparece en la Lista de pedidos.
Uma transação, 3 variantesOne transaction, 3 variantsUna transacción, 3 variantes
Um único builder cobre pedido direto, indireto e para aprovação. A variante é derivada do contexto — não há campo de tipo no input.A single builder covers direct, indirect and approval orders. The variant is derived from context — there's no type field on the input.Un único builder cubre pedido directo, indirecto y para aprobación. La variante se deriva del contexto — no hay campo de tipo en el input.
Payload JSON ricoRich JSON payloadPayload JSON rico
O contrato wire tem cabeçalho, instruções de pagamento, itens, promoções e reposição. O builder é o dono único de toda a montagem.The wire contract carries a header, payment instructions, line items, promotions and replenishment. The builder is the sole owner of the whole assembly.El contrato wire lleva encabezado, instrucciones de pago, ítems, promociones y reposición. El builder es el dueño único de todo el armado.
RPC genéricoGeneric RPCRPC genérico
Não há RPC por pedido: tudo passa pelo mesmo sendTransaction, com o JSON serializado no campo message e o serviceName como discriminador.There's no per-order RPC: everything goes through the same sendTransaction, with the JSON serialized into the message field and serviceName as the discriminator.No hay RPC por pedido: todo pasa por el mismo sendTransaction, con el JSON serializado en el campo message y el serviceName como discriminador.
FontesSourcesFuentes
BuildOrderPlacementDispatcherPayloadUseCase + OrderPlacementDispatcherPayloadInput + DispatcherType + DispatcherConectaRep.proto. O input carrega entities cruas de domínio (CLAUDE.md §36); o build() constrói todo o wire.
BuildOrderPlacementDispatcherPayloadUseCase + OrderPlacementDispatcherPayloadInput + DispatcherType + DispatcherConectaRep.proto. The input carries raw domain entities (CLAUDE.md §36); build() constructs the entire wire.
BuildOrderPlacementDispatcherPayloadUseCase + OrderPlacementDispatcherPayloadInput + DispatcherType + DispatcherConectaRep.proto. El input lleva entities crudas de dominio (CLAUDE.md §36); build() construye todo el wire.
Transporte gRPCgRPC transportTransporte gRPC
DispatcherConectaRep.proto · proto3 · package mn.bat.conectarep.dispatcher. O serviço expõe um único RPC genérico — não existe mensagem por transação. TODA transação de escrita do app (pedido, price check, survey, etc.) usa este mesmo sendTransaction; o que muda é o serviceName (discriminador) e o JSON dentro de message.The service exposes a single generic RPC — there's no per-transaction message. EVERY write transaction in the app (order, price check, survey, etc.) uses this same sendTransaction; what changes is the serviceName (discriminator) and the JSON inside message.El servicio expone un único RPC genérico — no existe mensaje por transacción. TODA transacción de escritura de la app (pedido, price check, survey, etc.) usa este mismo sendTransaction; lo que cambia es el serviceName (discriminador) y el JSON dentro de message.
sendTransactionunaryrpc sendTransaction(InboxTransactionRequest) returns (InboxTransactionReply)
path /mn.bat.conectarep.dispatcher.DispatcherConectaRepService/sendTransaction
InboxTransactionRequestendpointstring· #1 · endpoint alvo (config de ambiente)target endpoint (environment config)endpoint destino (config de ambiente)serviceNamestring· #2 · discriminador —MobileorderAPI/IndirectOrderAPI/OrderApprovalUploadAPI(prefixoPromo_quando há promoção)discriminator —MobileorderAPI/IndirectOrderAPI/OrderApprovalUploadAPI(Promo_prefix when a promotion is present)discriminador —MobileorderAPI/IndirectOrderAPI/OrderApprovalUploadAPI(prefijoPromo_cuando hay promoción)dateReferencestring· #3 ·AAAA-MM-DDdo envio (context.now)YYYY-MM-DDof the submission (context.now)AAAA-MM-DDdel envío (context.now)transactionReferencestring· #4 · opodo pedido (correlação)the orderpo(correlation)elpodel pedido (correlación)usernamestring· #5messagestring· #6 · o payload JSON serializado (a tabela da seção 05)the JSON payload serialized (the table in section 05)el payload JSON serializado (la tabla de la sección 05)manufacturerstring· #7 · dado do dispositivodevice datadato del dispositivomodelstring· #8 · dado do dispositivodevice datadato del dispositivodeviceUuidstring· #9 · literal provisório hoje (ver Pendências)provisional literal today (see Pending)literal provisional hoy (ver Pendientes)deviceVersionstring· #10tidint64· #11 · id de transação para idempotência/replaytransaction id for idempotency/replayid de transacción para idempotencia/replay
InboxTransactionReplystatusint32· #1 · status do ack (0 = sucesso)ack status (0 = success)status del ack (0 = éxito)messagestring· #2 · mensagem do backendbackend messagemensaje del backendtransactionIdint32· #3 · id atribuído pelo backend (correlação)backend-assigned id (correlation)id asignado por el backend (correlación)
Envelope → Request
O builder devolve um DispatcherEnvelope (type, serviceName, payload, account, transactionReference, dateReference). O DispatcherGateway serializa payload em JSON para message, copia serviceName/dateReference/transactionReference, preenche os campos de dispositivo e o bearer token de auth, e chama o RPC.
The builder returns a DispatcherEnvelope (type, serviceName, payload, account, transactionReference, dateReference). The DispatcherGateway serializes payload to JSON into message, copies serviceName/dateReference/transactionReference, fills in the device fields and the auth bearer token, and calls the RPC.
El builder devuelve un DispatcherEnvelope (type, serviceName, payload, account, transactionReference, dateReference). El DispatcherGateway serializa payload a JSON en message, copia serviceName/dateReference/transactionReference, completa los campos del dispositivo y el bearer token de auth, y llama al RPC.
Para pedidos, resendMayDuplicate == true: um reenvio (ex.: recuperação de fila offline) pode duplicar o pedido no backend; a idempotência via tid é o que mitiga isso.For orders, resendMayDuplicate == true: a resend (e.g. offline-queue recovery) may duplicate the order on the backend; idempotency via tid is what mitigates it.Para pedidos, resendMayDuplicate == true: un reenvío (p. ej. recuperación de cola offline) puede duplicar el pedido en el backend; la idempotencia vía tid es lo que lo mitiga.
Variantes e serviceNameVariants & serviceNameVariantes y serviceName
Um único builder cobre três DispatcherType. Não há campo de tipo no input — a variante é derivada por _resolveType(context, sendToPendingApproval): se context.isIndirectOrder → orderIndirect; senão, se sendToPendingApproval → orderApproval; senão → order. As três compartilham a mesma estrutura de payload; divergem só no serviceName, no campo SupplierId (só indireto) e no Status resultante.A single builder covers three DispatcherType values. There's no type field on the input — the variant is derived by _resolveType(context, sendToPendingApproval): if context.isIndirectOrder → orderIndirect; else if sendToPendingApproval → orderApproval; else → order. All three share the same payload structure; they diverge only in serviceName, in the SupplierId field (indirect only) and in the resulting Status.Un único builder cubre tres DispatcherType. No hay campo de tipo en el input — la variante se deriva por _resolveType(context, sendToPendingApproval): si context.isIndirectOrder → orderIndirect; si no, si sendToPendingApproval → orderApproval; si no → order. Las tres comparten la misma estructura de payload; divergen solo en serviceName, en el campo SupplierId (solo indirecto) y en el Status resultante.
| VarianteVariantVariante | serviceName |
MercadosMarketsMercados | Quando / divergênciaWhen / divergenceCuándo / divergencia |
|---|---|---|---|
order | MobileorderAPI | BR · CL · ZA | Pedido direto padrão. SupplierId = null. Status normalmente On-Hold (ou Invoiced Not Sync em prompt).Default direct order. SupplierId = null. Status usually On-Hold (or Invoiced Not Sync for prompt).Pedido directo estándar. SupplierId = null. Status normalmente On-Hold (o Invoiced Not Sync en prompt). |
orderIndirect | IndirectOrderAPI | ZA | Pedido para cliente indireto (context.isIndirectOrder). Emite SupplierId = context.supplierSfid. sendToPendingApproval é ignorado (indireto vence a checagem de tipo).Order for an indirect customer (context.isIndirectOrder). Emits SupplierId = context.supplierSfid. sendToPendingApproval is ignored (indirect wins the type check).Pedido para cliente indirecto (context.isIndirectOrder). Emite SupplierId = context.supplierSfid. sendToPendingApproval se ignora (indirecto gana el chequeo de tipo). |
orderApproval | OrderApprovalUploadAPI | BR · CL · ZA | Pedido enviado para aprovação (sendToPendingApproval e não indireto). Status = PA; TypeofApproval preenchido.Order sent for approval (sendToPendingApproval and not indirect). Status = PA; TypeofApproval filled.Pedido enviado para aprobación (sendToPendingApproval y no indirecto). Status = PA; TypeofApproval completado. |
Prefixo Promo_Promo_ prefixPrefijo Promo_
Se o carrinho tem promoção aplicada (_hasPromotion), type.resolveServiceName(hasPromotion: true) antepõe Promo_ ao serviceName da variante — Promo_MobileorderAPI, Promo_IndirectOrderAPI, Promo_OrderApprovalUploadAPI. O prefixo vale em todos os mercados (ZA incluído).
If the cart has an applied promotion (_hasPromotion), type.resolveServiceName(hasPromotion: true) prepends Promo_ to the variant's serviceName — Promo_MobileorderAPI, Promo_IndirectOrderAPI, Promo_OrderApprovalUploadAPI. The prefix applies in all markets (ZA included).
Si el carrito tiene promoción aplicada (_hasPromotion), type.resolveServiceName(hasPromotion: true) antepone Promo_ al serviceName de la variante — Promo_MobileorderAPI, Promo_IndirectOrderAPI, Promo_OrderApprovalUploadAPI. El prefijo aplica en todos los mercados (ZA incluido).
Como é disparadoHow it's firedCómo se dispara
A transação é orquestrada pelo fluxo de carrinho (remote-first, §36). O notifier apenas reúne entities cruas e valores injetados; o builder é o dono único de todo join, rename, formatação de data e derivação wire. A cascata:The transaction is orchestrated by the cart flow (remote-first, §36). The notifier only gathers raw entities and injected values; the builder is the sole owner of every join, rename, date formatting and wire derivation. The cascade:La transacción se orquesta desde el flujo del carrito (remote-first, §36). El notifier solo reúne entities crudas y valores inyectados; el builder es el dueño único de todo join, rename, formateo de fecha y derivación wire. La cascada:
- Cart flownotifier
- reúne entities cruas + injetadosgathers raw entities + injectedreúne entities crudas + inyectadosOrderPlacementDispatcherPayloadInput
- build()BuildOrderPlacementDispatcherPayloadUseCasemonta o wireassembles the wirearma el wire
- devolvereturnsdevuelveDispatcherEnvelope
- Submit…UseCaseDispatcherRepository
- serializa + authserialize + authserializa + authDispatcherGateway
- sendTransactionBackendgRPC
- serializa + authserialize + authserializa + authDispatcherGateway
- Submit…UseCaseDispatcherRepository
- devolvereturnsdevuelveDispatcherEnvelope
- build()BuildOrderPlacementDispatcherPayloadUseCasemonta o wireassembles the wirearma el wire
- reúne entities cruas + injetadosgathers raw entities + injectedreúne entities crudas + inyectadosOrderPlacementDispatcherPayloadInput
O input (entities cruas)The input (raw entities)El input (entities crudas)
OrderPlacementDispatcherPayloadInput (Freezed). Carrega o dado como existe no domínio; nada de formato wire. O relógio chega como context.now (via DateTimeUtils.now()); lat/long vêm do LocationService.OrderPlacementDispatcherPayloadInput (Freezed). Carries data as it exists in the domain; no wire shaping. The clock arrives as context.now (via DateTimeUtils.now()); lat/long come from LocationService.OrderPlacementDispatcherPayloadInput (Freezed). Lleva el dato como existe en el dominio; nada de formato wire. El reloj llega como context.now (vía DateTimeUtils.now()); lat/long vienen del LocationService.
| CampoFieldCampo | TipoTypeTipo | PapelRoleRol |
|---|---|---|
cart | CartEntity | itens, pagamento, promoções, datas, flags (prompt/edição/à vista)items, payment, promotions, dates, flags (prompt/editing/on-time)ítems, pago, promociones, fechas, flags (prompt/edición/al contado) |
totals | CartTotalsEntity | subtotais, descontos, cash fee, VAT, total + totais por itemsubtotals, discounts, cash fee, VAT, total + per-item totalssubtotales, descuentos, cash fee, VAT, total + totales por ítem |
context | CartOrchestrationContextEntity | mercado, config, relógio (now), catálogo, limites de crédito, sapCustomerId, supplierSfid, flags de contamarket, config, clock (now), catalog, credit limits, sapCustomerId, supplierSfid, account flagsmercado, config, reloj (now), catálogo, límites de crédito, sapCustomerId, supplierSfid, flags de cuenta |
resource | ResourceEntity | representante de vendas (cru — o builder deriva ResId)sales rep (raw — the builder derives ResId)representante de ventas (crudo — el builder deriva ResId) |
intent | OrderSubmitIntent | create · edit · release · cancel |
visitId | String | → VisitId |
purchaseOrderNumber | String | PO (ignorado em edição, que usa cart.orderId)PO (ignored when editing, which uses cart.orderId)PO (ignorado en edición, que usa cart.orderId) |
latitude / longitude | double | posição (LocationService; 0 quando indisponível)position (LocationService; 0 when unavailable)posición (LocationService; 0 cuando no disponible) |
creditDaysToRequest | double · 0.0 | dias de crédito solicitados (BR)requested credit days (BR)días de crédito solicitados (BR) |
sendToPendingApproval | bool · false | seleciona a variante de aprovaçãoselects the approval variantselecciona la variante de aprobación |
approvalType | CartApprovalType · none | → TypeofApproval |
originalValue | double · 0.0 | valor original (edição; entra na checagem de pré-pagamento Pix)original value (edit; feeds the Pix pre-payment check)valor original (edición; alimenta el chequeo de prepago Pix) |
Payload (message)
O JSON serializado no campo message do request. Cada tabela abaixo tem 4 colunas — Campo JSON · Tipo · Origem do Dado · Regra — e lista toda chave que o build() emite (≈179 no total). Campo, Tipo e Origem são código cru; só a Regra é prosa. Um exemplo completo (variante order/BR) está em transaction_example.json, ao lado deste doc.The JSON serialized into the request's message field. Each table below has 4 columns — JSON field · Type · Data source · Rule — and lists every key that build() emits (≈179 in total). Field, Type and Source are raw code; only Rule is prose. A full example (order/BR variant) sits in transaction_example.json, next to this doc.El JSON serializado en el campo message del request. Cada tabla abajo tiene 4 columnas — Campo JSON · Tipo · Origen del Dato · Regla — y lista toda clave que build() emite (≈179 en total). Campo, Tipo y Origen son código crudo; solo la Regla es prosa. Un ejemplo completo (variante order/BR) está en transaction_example.json, junto a este doc.
Raiz do payloadPayload rootRaíz del payload
| Campo JSON | TipoTypeTipo | Origem do DadoData sourceOrigen del Dato | RegraRuleRegla |
|---|---|---|---|
OrderHeader | array | _buildHeader | array de um único objeto (cabeçalho)single-element array (header)array de un solo objeto (encabezado) |
OrderPaymentInstruction | array | _buildPaymentInstructions | uma entrada por parcela + perna de nota de créditoone entry per parcel + credit-note leguna entrada por cuota + pierna de nota de crédito |
OrderDetail | array | _buildOrderDetails | uma entrada por linha de itemone entry per line itemuna entrada por línea de ítem |
CISReward1 | array | Fixo: [] | sempre vazio (não implementado — ver Pendências)always empty (not implemented — see Pending)siempre vacío (no implementado — ver Pendientes) |
ReplenishmentDetails | array | _buildReplenishmentDetails | só em edição/liberação; vazio na criaçãoedit/release only; empty on creationsolo en edición/liberación; vacío en la creación |
Promotions | array | _buildPromotions | promoções regulares aplicadas; vazio se canceladoapplied regular promotions; empty if cancelledpromociones regulares aplicadas; vacío si cancelado |
SpotPromotions | array | _buildSpotPromotions | promoções spot; vazio se cancelado ou desabilitado no EMCspot promotions; empty if cancelled or disabled in EMCpromociones spot; vacío si cancelado o deshabilitado en EMC |
accountCode | string | context.sapCustomerId | código SAP da contaaccount SAP codecódigo SAP de la cuenta |
OrderHeader objeto únicosingle objectobjeto único 75 camposfieldscampos
Campo JSON TipoTypeTipo Origem do DadoData sourceOrigen del Dato RegraRuleRegla OrderIDstring poNumberedição → cart.orderId; senãoinput.purchaseOrderNumberediting →cart.orderId; elseinput.purchaseOrderNumberedición →cart.orderId; si noinput.purchaseOrderNumberRetailerIDstring cart.accountSfid— OrderValuedouble totals.subtotal − (itemsDiscount + orderDiscount)arredondado 2 casasrounded 2 dpredondeado 2 dec creditNoteAmountdouble cart.payment.creditNote?.value ?? 0arredondado 2 casasrounded 2 dpredondeado 2 dec payableAmountdouble totals.totalarredondado 2 casasrounded 2 dpredondeado 2 dec LinesPerCallint Fixo: 0— OrderDatestring context.nowformato yyyy/MM/ddyyyy/MM/ddformatformatoyyyy/MM/ddDeliveryDatestring cart.deliveryDateprompt → OrderDate; senão reformatadoyyyy/MM/ddprompt →OrderDate; else reformattedyyyy/MM/ddprompt →OrderDate; si no reformateadoyyyy/MM/ddpostring poNumber— remarkstring Fixo: ""— discountdouble totals.itemsDiscountWithoutVatarredondamento half-uphalf-up roundingredondeo half-up is_processedint Fixo: 0— latitudedouble input.latitude— longitudedouble input.longitude— timestampidstring "OTS" + context.nowtimestamp compacto MMddyyyyHHmmsscompact MMddyyyyHHmmss timestamptimestamp compacto MMddyyyyHHmmss totalTaxValueint Fixo: 0contrato · inertecontract · inertcontrato · inerte totalweightint Fixo: 0contrato · inertecontract · inertcontrato · inerte isApprovalint Fixo: 0contrato · inertecontract · inertcontrato · inerte RField1int CalculadoisPixPrePayment ? 0 : baseCreditDaysisPixPrePayment ? 0 : baseCreditDaysisPixPrePayment ? 0 : baseCreditDaysRField2int Fixo: 0— ordertimestring context.nowhora HH:mm:sstimeHH:mm:sshoraHH:mm:ssBaseLimitnum context.baseCreditLimit— CreditLimitnum context.creditLimit— Statusstring status.valueresolvido (ver Regras de negócio)resolved (see Business rules)resuelto (ver Reglas de negocio) TotalVatRetentionint Fixo: 0contrato · inertecontract · inertcontrato · inerte GrossAmountdouble totals.subtotalWithoutVatarredondado 2 casasrounded 2 dpredondeado 2 dec NetAmountdouble GrossAmount − totals.itemsDiscountWithoutVatarredondado 2 casasrounded 2 dpredondeado 2 dec RMTaxint Fixo: 0contrato · inertecontract · inertcontrato · inerte LTBTaxint Fixo: 0contrato · inertecontract · inertcontrato · inerte OrigBaseCreditDaysint context.accountCreditDays— BaseCreditDaysint? Calculadoemitido só se creditDaysToRequest > baseCreditDays(arredondado); senão ausente/nullemitted only ifcreditDaysToRequest > baseCreditDays(rounded); else absent/nullemitido solo sicreditDaysToRequest > baseCreditDays(redondeado); si no ausente/nullTotalICMSTaxint Fixo: 0contrato · inertecontract · inertcontrato · inerte TotalFCPTaxint Fixo: 0contrato · inertecontract · inertcontrato · inerte TotalRetailerPriceGrossint Fixo: 0contrato · inertecontract · inertcontrato · inerte TotalICMSSTint Fixo: 0contrato · inertecontract · inertcontrato · inerte TotalFCPSTint Fixo: 0contrato · inertecontract · inertcontrato · inerte MaxThresholdint Fixo: 0contrato · inertecontract · inertcontrato · inerte CmpThresholdint Fixo: 0contrato · inertecontract · inertcontrato · inerte NoofOpenItemsint Fixo: 0contrato · inertecontract · inertcontrato · inerte MaxCreditDaysnum context.creditPeriod— TypeofApprovalstring _typeOfApproval"" fora de PA; senão rótulo por approvalType"" unless PA; else label byapprovalType"" fuera de PA; si no etiqueta porapprovalTypeApprovalAmountint Fixo: 0contrato · inertecontract · inertcontrato · inerte SapReconIdstring Fixo: ""contrato · inertecontract · inertcontrato · inerte SFLoadRefNostring Fixo: ""contrato · inertecontract · inertcontrato · inerte ExtApprovalint Fixo: 0contrato · inertecontract · inertcontrato · inerte FOCTaxint Fixo: 0contrato · inertecontract · inertcontrato · inerte FOCTotalValueint Fixo: 0contrato · inertecontract · inertcontrato · inerte FOCRMTaxint Fixo: 0contrato · inertecontract · inertcontrato · inerte FOCLTBTaxint Fixo: 0contrato · inertecontract · inertcontrato · inerte FOCNetAmountint Fixo: 0contrato · inertecontract · inertcontrato · inerte isFOCint Fixo: 0flag de nível de cabeçalho, sempre 0header-level flag, always 0flag de nivel de encabezado, siempre 0 DistFeeint Fixo: 0contrato · inertecontract · inertcontrato · inerte SupplierIdstring? context.supplierSfidsó variante indireta; senão nullindirect variant only; else nullsolo variante indirecta; si no null OrderTypestring _orderType"B2B"só em release com config; senão"slRep""B2B"only on release with config; else"slRep""B2B"solo en release con config; si no"slRep"ExciseTaxAmountint Fixo: 0contrato · inertecontract · inertcontrato · inerte PercepTaxAmountint Fixo: 0contrato · inertecontract · inertcontrato · inerte IIBBTaxAmountint Fixo: 0contrato · inertecontract · inertcontrato · inerte AdditionalTaxint Fixo: 0contrato · inertecontract · inertcontrato · inerte OrderSfIdstring cart.orderId— OrderSourcestring OrderSource.mobile.valuefixo "Mobile"fixed"Mobile"fijo"Mobile"ResIdstring resource.sfid— MobOrdNostring poNumber— VisitIdstring input.visitId— PrevOrdAmtstring Fixo: ""contrato · inertecontract · inertcontrato · inerte alteredFullbool Calculado!cart.isPromptOrder && config.sendsAlteredFullFlag!cart.isPromptOrder && config.sendsAlteredFullFlag!cart.isPromptOrder && config.sendsAlteredFullFlagB2BRulVoilationbool Fixo: falsechave com typo mantida verbatim (contrato)misspelled key kept verbatim (contract)clave con typo mantenida verbatim (contrato) locationIdstring Fixo: ""contrato · inertecontract · inertcontrato · inerte IFlagstring Calculadocart.isPromptOrder ? "1" : "0"cart.isPromptOrder ? "1" : "0"cart.isPromptOrder ? "1" : "0"invoiceRefNostring CalculadopoNumbersó em aprovação externa (config + status); senão ""poNumberonly on external approval (config + status); else ""poNumbersolo en aprobación externa (config + status); si no ""isDeliverybool Fixo: false— isPrePixPaymentbool Calculadostatus == Awaiting Pix Paymentstatus == Awaiting Pix Paymentstatus == Awaiting Pix PaymentCashFeestring? totals.cashFeeconfig on → cash: _round(cashFee), senão "0"; config off → nullconfig on → cash:_round(cashFee), else "0"; config off → nullconfig on → cash:_round(cashFee), si no "0"; config off → nulliscashpaymentstring Calculado"1"se cash + config + aplicável; senão"0""1"if cash + config + applicable; else"0""1"si cash + config + aplicable; si no"0"marketIsostring context.market.name— logAppErrorPaymentInstructionstring Fixo: ""contrato · inertecontract · inertcontrato · inerte OrderPaymentInstruction por parcelaper parcelpor cuota 12 camposfieldscampos
Uma entrada por
cart.payment.parcels. Se há nota de crédito, adiciona uma perna extraPaymentMode = Z9.One entry percart.payment.parcels. If there's a credit note, adds an extra legPaymentMode = Z9.Una entrada porcart.payment.parcels. Si hay nota de crédito, agrega una pierna extraPaymentMode = Z9.Campo JSON TipoTypeTipo Origem do DadoData sourceOrigen del Dato RegraRuleRegla OrderIDstring poNumber— PaymentModestring parcel.paymentMethodse vazio → context.defaultPaymentMethod; perna CN →Z9if empty →context.defaultPaymentMethod; CN leg →Z9si vacío →context.defaultPaymentMethod; pierna CN →Z9InstalPercnum parcel.percentageperna CN → 0CN leg → 0pierna CN → 0 CreditDaysint parcel.creditDaysisPixPrePayment→ 0; perna CN → 0isPixPrePayment→ 0; CN leg → 0isPixPrePayment→ 0; pierna CN → 0DueDatestring parcel.dueDateyyyy/MM/dd; perna CN →OrderDateyyyy/MM/dd; CN leg →OrderDateyyyy/MM/dd; pierna CN →OrderDateCreditNoteIDstring Fixo: ""perna CN → creditNote.sfid ?? ""CN leg →creditNote.sfid ?? ""pierna CN →creditNote.sfid ?? ""CreditNoteAmountnum Fixo: 0perna CN → _round(creditNoteValue)CN leg →_round(creditNoteValue)pierna CN →_round(creditNoteValue)InstalAmountdouble parcel.pricearredondado; perna CN → _round(creditNoteValue)rounded; CN leg →_round(creditNoteValue)redondeado; pierna CN →_round(creditNoteValue)RetailerIdstring cart.accountSfid— IsFromCISint Fixo: 0— PmtInsIdstring parcel.parcelSfid"" se contém "-" (id gerado no cliente); perna CN → creditNote.sfid ?? """" if it contains "-" (client-generated id); CN leg →creditNote.sfid ?? """" si contiene "-" (id generado en cliente); pierna CN →creditNote.sfid ?? ""internalPixKeystring parcel.internalPixKeychave condicional — só quando PaymentMode == "ZX"(Pix)conditional key — only whenPaymentMode == "ZX"(Pix)clave condicional — solo cuandoPaymentMode == "ZX"(Pix)OrderDetail por linha de itemper line itempor línea de ítem 48 camposfieldscampos
Uma entrada por item do carrinho (qty > 0). Itens podem explodir em linhas por lote (batch) e agregar por SKU. Preço e desconto vêm de
totals.itemTotals[key]; SKU/UoM/categoria vêm decontext.products[productSfid].One entry per cart item (qty > 0). Items may explode into per-batch lines and aggregate by SKU. Price and discount come fromtotals.itemTotals[key]; SKU/UoM/category come fromcontext.products[productSfid].Una entrada por ítem del carrito (qty > 0). Los ítems pueden explotar en líneas por lote (batch) y agregar por SKU. Precio y descuento vienen detotals.itemTotals[key]; SKU/UoM/categoría vienen decontext.products[productSfid].Campo JSON TipoTypeTipo Origem do DadoData sourceOrigen del Dato RegraRuleRegla OrderIDstring poNumber— ProductIDstring product.internalIdcomo string numérica ( _asIntString)as numeric string (_asIntString)como string numérica (_asIntString)PrevQtystring Fixo: ""— Qtynum totalQuantityInUom1recalculado na agregação por SKUrecomputed on SKU aggregationrecalculado en la agregación por SKU Ratedouble itemTotals.pricepreço unitário (não arredondado)unit price (not rounded)precio unitario (no redondeado) msqqtynum CalculadoisOuterEach ? uom1Quantity : 0isOuterEach ? uom1Quantity : 0isOuterEach ? uom1Quantity : 0uomcountnum quantitycolapsa p/ caixas na agregaçãocollapses to cases on aggregationcolapsa a cajas en la agregación dOuomQtyint Fixo: 0— outerQtynum CalculadoisOuterEach ? uom1Quantity : 0isOuterEach ? uom1Quantity : 0isOuterEach ? uom1Quantity : 0dOuomidstring CalculadoisOuterEach ? uom1Name : ""isOuterEach ? uom1Name : ""isOuterEach ? uom1Name : ""outerPricenum CalculadoisOuterEach ? itemTotals.price : 0isOuterEach ? itemTotals.price : 0isOuterEach ? itemTotals.price : 0pcsUOMIdstring Calculadouom1Name == pack ? uom1Name : ""uom1Name == pack ? uom1Name : ""uom1Name == pack ? uom1Name : ""pieceqtynum CalculadoisPiece ? uom1Quantity : 0isPiece ? uom1Quantity : 0isPiece ? uom1Quantity : 0uomidstring CalculadoisCase ? uom2Name : ""isCase ? uom2Name : ""isCase ? uom2Name : ""caseqtynum CalculadoisCase ? uom2Quantity : 0isCase ? uom2Quantity : 0isCase ? uom2Quantity : 0casePricenum CalculadoisCase ? itemTotals.price : 0isCase ? itemTotals.price : 0isCase ? itemTotals.price : 0UOM2num CalculadoisCase ? itemTotals.price : 0isCase ? itemTotals.price : 0isCase ? itemTotals.price : 0DAdouble itemTotals.discountWithoutVatarredondamento half-uphalf-up roundingredondeo half-up soPiecenum _soqFor(product, accountSfid)SOQ por conta (0 se sem match)SOQ per account (0 if no match)SOQ por cuenta (0 si sin match) soCaseint Fixo: 0SOQ por caixa nunca populado (ver Pendências)case SOQ never populated (see Pending)SOQ por caja nunca poblado (ver Pendientes) OrderTypestring _orderTypemesmo do cabeçalho ( slRep/B2B)same as header (slRep/B2B)igual al encabezado (slRep/B2B)totalamountdouble itemTotals.amount − itemTotals.discountarredondado 2 casasrounded 2 dpredondeado 2 dec batchidint manufacturing?.erpNumber ?? product.erpNumbercomo int ( _asInt)as int (_asInt)como int (_asInt)PriceOffIdint Fixo: 0— PriceOffValueint Fixo: 0— isFreeProductint Fixo: 0— weightint Fixo: 0— ReasonIdint Fixo: 0— FinalValueTwoDecdouble itemTotals.amountarredondado 2 casasrounded 2 dpredondeado 2 dec FinalValueTenDecdouble itemTotals.amountmesmo valor 2 casas (nome não reflete precisão)same 2-dp value (name doesn't reflect precision)mismo valor 2 dec (el nombre no refleja precisión) NetAmountdouble itemTotals.pricepreço unitário (não arredondado)unit price (not rounded)precio unitario (no redondeado) PrdGrpIdstring Fixo: ""— IsPrioritystring Fixo: "0"— RetailerPriceGrossdouble itemTotals.amountarredondado 2 casasrounded 2 dpredondeado 2 dec isFOCstring item.isProduct"0"produto pago,"1"brinde"0"paid product,"1"free-of-charge"0"producto pago,"1"bonificaciónRetailerFinalPricedouble itemTotals.pricepreço unitário (não arredondado)unit price (not rounded)precio unitario (no redondeado) MRPint Fixo: 0— PriceIdstring priceEntryIdde ResolveProductPricingUseCase(grupo de preço da conta)fromResolveProductPricingUseCase(account pricing group)deResolveProductPricingUseCase(grupo de precio de la cuenta)DistFeestring Fixo: ""— ComboIdstring Fixo: ""— ComboQtyint Fixo: 0— SFLineItemIdstring item.orderLineItemSfid ?? ""preenchido em ediçãofilled on editcompletado en edición manufacturingProductSfidstring manufacturing?.manufacturingSkuSfid ?? ""— CashFeestring? itemTotals.cashFeeAmountconfig on → cash: valor, senão "0"; config off → nullconfig on → cash: value, else "0"; config off → nullconfig on → cash: valor, si no "0"; config off → null marketIsostring context.market.name— invoiceUomstring product.invoiceUom— productCategorystring product.category— productTradeSkuSfidstring item.productSfid— ReplenishmentDetails edição/liberaçãoedit/releaseedición/liberación 9 camposfieldscampos
Vazio na criação (
intent.isCreation). Uma entrada porcart.replenishments(bloqueios).Empty on creation (intent.isCreation). One entry percart.replenishments(locks).Vacío en la creación (intent.isCreation). Una entrada porcart.replenishments(bloqueos).Campo JSON TipoTypeTipo Origem do DadoData sourceOrigen del Dato RegraRuleRegla order_idstring poNumber— lock_typestring lock.type.value— lock_reasonstring Fixo: ""TODO no código — pendente (ver Pendências)TODO in code — pending (see Pending)TODO en el código — pendiente (ver Pendientes) soq_valueint Fixo: 0— order_valuedouble totals.subtotalarredondado 2 casasrounded 2 dpredondeado 2 dec delivery_datestring cart.deliveryDateformato AAAA-MM-DD(ISO — difere do cabeçalho)YYYY-MM-DDformat (ISO — differs from header)formatoAAAA-MM-DD(ISO — difiere del encabezado)supplierstring cart.accountSfid— statusstring Fixo: "Closed"— Replenishment_Idstring Fixo: ""pendente (ver Pendências)pending (see Pending)pendiente (ver Pendientes) Promotions por promoção aplicadaper applied promotionpor promoción aplicada 17 camposfieldscampos
Uma entrada por
cart.appliedPromotions, cruzada comcontext.promotionspor id. Os 8 primeiros campos sempre saem; os 9 do catálogo só quando a promoção é encontrada no contexto.One entry percart.appliedPromotions, joined tocontext.promotionsby id. The first 8 fields always ship; the 9 catalog ones only when the promotion is found in context.Una entrada porcart.appliedPromotions, cruzada concontext.promotionspor id. Los primeros 8 campos siempre salen; los 9 del catálogo solo cuando la promoción se encuentra en el contexto.Campo JSON TipoTypeTipo Origem do DadoData sourceOrigen del Dato RegraRuleRegla idint applied.promotionIdsemprealwayssiempre achievedLevelint applied.achievedLevelsemprealwayssiempre isAppliedbool applied.isAppliedsemprealwayssiempre isAvailablebool applied.isAvailablesempre (flag de avaliação, gerado no app)always (evaluation flag, app-generated)siempre (flag de evaluación, generado en la app) isAchievedbool applied.isAchievedsemprealwayssiempre isTargetAchievedbool applied.isTargetAchievedsemprealwayssiempre selectedRewardIndexint? applied.selectedReward?.rewardIndexsemprealwayssiempre selectedRewardDetailIndexint? applied.selectedReward?.rewardDetailIndexsemprealwayssiempre namestring promotion.namesó se encontrada no contextoonly if found in contextsolo si se encuentra en el contexto titlestring promotion.titlesó se encontrada no contextoonly if found in contextsolo si se encuentra en el contexto cartTitlestring promotion.cartTitlesó se encontrada no contextoonly if found in contextsolo si se encuentra en el contexto typestring promotion.typesó se encontrada no contextoonly if found in contextsolo si se encuentra en el contexto statusstring promotion.statussó se encontrada no contextoonly if found in contextsolo si se encuentra en el contexto startDatestring promotion.startDatesó se encontrada no contextoonly if found in contextsolo si se encuentra en el contexto endDatestring promotion.endDatesó se encontrada no contextoonly if found in contextsolo si se encuentra en el contexto discountLimitnum promotion.discountLimitsó se encontrada no contextoonly if found in contextsolo si se encuentra en el contexto maxRewardQuantitynum promotion.maxRewardQuantitysó se encontrada no contextoonly if found in contextsolo si se encuentra en el contexto SpotPromotions por promoção spotper spot promotionpor promoción spot 10 camposfieldscampos
Uma entrada por
cart.appliedSpotPromotions, cruzada comcontext.spotPromotionspor id.ideisAppliedsempre; os demais só quando encontrada.One entry percart.appliedSpotPromotions, joined tocontext.spotPromotionsby id.idandisAppliedalways; the rest only when found.Una entrada porcart.appliedSpotPromotions, cruzada concontext.spotPromotionspor id.ideisAppliedsiempre; el resto solo cuando se encuentra.Campo JSON TipoTypeTipo Origem do DadoData sourceOrigen del Dato RegraRuleRegla idint applied.spotPromotionIdsemprealwayssiempre isAppliedbool applied.isAppliedsemprealwayssiempre promotionTypestring spot.promotionTypesó se encontradaonly if foundsolo si se encuentra promotionTitlestring spot.promotionTitlesó se encontradaonly if foundsolo si se encuentra promotionCartTitlestring spot.promotionCartTitlesó se encontradaonly if foundsolo si se encuentra promotionRepInstructionsstring spot.promotionRepInstructionssó se encontradaonly if foundsolo si se encuentra statusstring spot.statussó se encontradaonly if foundsolo si se encuentra accountSfidstring spot.accountSfidsó se encontradaonly if foundsolo si se encuentra appliedOnOrderbool spot.appliedOnOrdersó se encontradaonly if foundsolo si se encuentra productListarray spot.products[]só se encontrada; itens {productSfid, quantity}only if found; items{productSfid, quantity}solo si se encuentra; ítems{productSfid, quantity}
ExemploExampleEjemplo
Um payload completo (variante order / BR, 1 item, 1 parcela) está em docs/public/dispatcher/01_order_placement/transaction_example.json — a forma exata serializada em message (sem wrapper gRPC).
A complete payload (order / BR variant, 1 item, 1 parcel) is in docs/public/dispatcher/01_order_placement/transaction_example.json — the exact shape serialized into message (no gRPC wrapper).
Un payload completo (variante order / BR, 1 ítem, 1 cuota) está en docs/public/dispatcher/01_order_placement/transaction_example.json — la forma exacta serializada en message (sin wrapper gRPC).
Regras de negócioBusiness rulesReglas de negocio
Resolução de StatusStatus resolutionResolución de Status OrderTransactionStatus
Resolvido por ResolveOrderTransactionStatusUseCase, em ordem de prioridade:Resolved by ResolveOrderTransactionStatusUseCase, in priority order:Resuelto por ResolveOrderTransactionStatusUseCase, en orden de prioridad:
intent.isCancellation→Cancelled→Cancelled→CancelledisPixPrePayment→Awaiting Pix Payment(Pix e total > limite + valor original)→Awaiting Pix Payment(Pix and total > limit + original value)→Awaiting Pix Payment(Pix y total > límite + valor original)sendToPendingApproval && !isIndirectOrder→PA(pending approval)→PA(pending approval)→PA(pending approval)cart.isPromptOrder→Pending External Approval(se config) ouInvoiced Not Sync→Pending External Approval(if config) orInvoiced Not Sync→Pending External Approval(si config) oInvoiced Not Sync- senãootherwisesi no→
On-Hold→On-Hold→On-Hold
Dias de crédito baseBase credit daysDías de crédito base _resolveBaseCreditDays → RField1
isPixPrePayment→ 0→ 0→ 0cart.isOnTimePayment→ 0 (Pago al Contado, CL — zera prazo, ortogonal ao método)→ 0 (Pay-at-Sight, CL — zeroes term, orthogonal to method)→ 0 (Pago al Contado, CL — anula plazo, ortogonal al método)- cash +
zeroesBaseCreditDaysOnCashcash +zeroesBaseCreditDaysOnCashcash +zeroesBaseCreditDaysOnCash→ 0→ 0→ 0 creditDaysToRequest == 0 && accountCreditDays != 0→ 0→ 0→ 0- senãootherwisesi no→
accountCreditDays, limitado acreditPeriod→accountCreditDays, clamped tocreditPeriod→accountCreditDays, limitado acreditPeriod
Tipo de pedidoOrder typeTipo de pedido OrderType → slRep / B2B
_orderType: release + config.releaseUsesB2bOrderType → "B2B"; todo o resto → "slRep". Emitido no cabeçalho e em cada item._orderType: release + config.releaseUsesB2bOrderType → "B2B"; everything else → "slRep". Emitted in the header and on every item._orderType: release + config.releaseUsesB2bOrderType → "B2B"; todo lo demás → "slRep". Emitido en el encabezado y en cada ítem.
ZG / ZH / ZX
Estes códigos são métodos de pagamento (PaymentMethod: ZG=boleto, ZH=cash, ZX=Pix, ZE=EFT, Z9=nota de crédito), não valores de OrderType. O OrderType do wire só tem slRep/B2B.
These codes are payment methods (PaymentMethod: ZG=bank slip, ZH=cash, ZX=Pix, ZE=EFT, Z9=credit note), not OrderType values. The wire OrderType only has slRep/B2B.
Estos códigos son métodos de pago (PaymentMethod: ZG=boleto, ZH=cash, ZX=Pix, ZE=EFT, Z9=nota de crédito), no valores de OrderType. El OrderType del wire solo tiene slRep/B2B.
Datas de entregaDelivery datesFechas de entrega DeliveryDate vs delivery_date
- Cabeçalho
DeliveryDate: prompt →OrderDate; senãocart.deliveryDateemyyyy/MM/dd.HeaderDeliveryDate: prompt →OrderDate; elsecart.deliveryDateasyyyy/MM/dd.EncabezadoDeliveryDate: prompt →OrderDate; si nocart.deliveryDateenyyyy/MM/dd. - Replenishment
delivery_date:cart.deliveryDateemAAAA-MM-DD(ISO — formato diferente do cabeçalho).Replenishmentdelivery_date:cart.deliveryDateasYYYY-MM-DD(ISO — different format from the header).Replenishmentdelivery_date:cart.deliveryDateenAAAA-MM-DD(ISO — formato distinto del encabezado).
Cash fee & PixCash fee & PixCash fee & Pix CashFee · iscashpayment · Pix
CashFee(cabeçalho e item): só quandoconfig.orderPlacementWithCashFee; em cash → valor arredondado, senão"0"; config off →null. OcashFeePercentagedo catálogo é um fator (0.03 = 3%); o valor já vem calculado emtotals.CashFee(header and item): only whenconfig.orderPlacementWithCashFee; for cash → rounded value, else"0"; config off →null. The catalogcashFeePercentageis a factor (0.03 = 3%); the value arrives already computed intotals.CashFee(encabezado e ítem): solo cuandoconfig.orderPlacementWithCashFee; en cash → valor redondeado, si no"0"; config off →null. ElcashFeePercentagedel catálogo es un factor (0.03 = 3%); el valor ya llega calculado entotals.isPrePixPayment: true quandostatus == Awaiting Pix Payment— pedido Pix cujo total excede o limite de crédito + valor original.isPrePixPayment: true whenstatus == Awaiting Pix Payment— a Pix order whose total exceeds the credit limit + original value.isPrePixPayment: true cuandostatus == Awaiting Pix Payment— pedido Pix cuyo total excede el límite de crédito + valor original.internalPixKeyna instrução de pagamento: chave condicional, só quando o modo éZX.internalPixKeyin the payment instruction: conditional key, only when the mode isZX.internalPixKeyen la instrucción de pago: clave condicional, solo cuando el modo esZX.
ArredondamentoRoundingRedondeo _round · _roundHalfUp
_round(half-away-from-zero,CurrencyUtils.roundToTwoDecimals): valores monetários —OrderValue,creditNoteAmount(cabeçalho),payableAmount,GrossAmount,NetAmount(cabeçalho),CashFee,InstalAmount,CreditNoteAmount(perna CN),order_value,totalamount,FinalValue*,RetailerPriceGross._round(half-away-from-zero,CurrencyUtils.roundToTwoDecimals): monetary values —OrderValue,creditNoteAmount(header),payableAmount,GrossAmount,NetAmount(header),CashFee,InstalAmount,CreditNoteAmount(CN leg),order_value,totalamount,FinalValue*,RetailerPriceGross._round(half-away-from-zero,CurrencyUtils.roundToTwoDecimals): valores monetarios —OrderValue,creditNoteAmount(encabezado),payableAmount,GrossAmount,NetAmount(encabezado),CashFee,InstalAmount,CreditNoteAmount(pierna CN),order_value,totalamount,FinalValue*,RetailerPriceGross._roundHalfUp: sódiscount(cabeçalho) eDA(item)._roundHalfUp: onlydiscount(header) andDA(item)._roundHalfUp: solodiscount(encabezado) yDA(ítem).- Preços unitários (
Rate,NetAmount(item),RetailerFinalPrice,casePrice,outerPrice,UOM2) passam crus (sem arredondar). Atenção:NetAmountdo cabeçalho é arredondado; oNetAmountdo item é o preço unitário cru — mesmo nome, semânticas diferentes.Unit prices (Rate,NetAmount(item),RetailerFinalPrice,casePrice,outerPrice,UOM2) pass raw (unrounded). Note: the headerNetAmountis rounded; the itemNetAmountis the raw unit price — same name, different semantics.Precios unitarios (Rate,NetAmount(ítem),RetailerFinalPrice,casePrice,outerPrice,UOM2) pasan crudos (sin redondear). Atención: elNetAmountdel encabezado se redondea; elNetAmountdel ítem es el precio unitario crudo — mismo nombre, semánticas distintas.
Curto-circuitos e gate FOCShort-circuits & FOC gateCortocircuitos y gate FOC promotions · FOC security
Promotions: vazio sestatus == Cancelled.Promotions: empty ifstatus == Cancelled.Promotions: vacío sistatus == Cancelled.SpotPromotions: vazio seCancelledou!promotionConfig.spotPromotionsEnabled.SpotPromotions: empty ifCancelledor!promotionConfig.spotPromotionsEnabled.SpotPromotions: vacío siCancelledo!promotionConfig.spotPromotionsEnabled.- Gate FOC de segurança: se não há nenhum reward (CIS, promoções, spot todos vazios), o builder remove toda linha com
isFOC == "1"— impede brindes sem promoção que os justifique.FOC security gate: if there's no reward at all (CIS, promotions, spot all empty), the builder removes every line withisFOC == "1"— blocks free-of-charge lines without a backing promotion.Gate FOC de seguridad: si no hay ningún reward (CIS, promociones, spot todos vacíos), el builder elimina toda línea conisFOC == "1"— impide bonificaciones sin promoción que las respalde. - Itens com
qty <= 0são pulados; item cujo produto não está emcontext.productsé pulado e logado (dispatchOrderLineDropped).Items withqty <= 0are skipped; an item whose product isn't incontext.productsis skipped and logged (dispatchOrderLineDropped).Ítems conqty <= 0se omiten; ítem cuyo producto no está encontext.productsse omite y registra (dispatchOrderLineDropped).
Tipo de aprovaçãoApproval typeTipo de aprobación TypeofApproval · CartApprovalType
Fora de PA → "". Em PA, por approvalType:Outside PA → "". In PA, by approvalType:Fuera de PA → "". En PA, por approvalType:
| CartApprovalType | TypeofApproval |
|---|---|
overdueThreshold | Overdue Threshold |
promotionalCreditDays | Promoção Dias de Crédito + ID: {id} |
creditDays / none | Credit Days |
O rótulo Promoção Dias de Crédito é uma string literal do contrato wire (em português), não uma tradução; o {id} é o id da promoção que concede dias de crédito.The Promoção Dias de Crédito label is a literal wire-contract string (in Portuguese), not a translation; {id} is the id of the promotion granting credit days.La etiqueta Promoção Dias de Crédito es una string literal del contrato wire (en portugués), no una traducción; {id} es el id de la promoción que concede días de crédito.
Pendências / roadmapPending / roadmapPendientes / roadmap
O que o builder ainda não preenche ou envia inerte, documentado fiel ao estado atual do código (nunca descrito como se já existisse):What the builder does not yet fill, or ships inert, documented faithfully to the current code state (never described as already existing):Lo que el builder aún no completa, o envía inerte, documentado fiel al estado actual del código (nunca descrito como si ya existiera):
Não portado / pendenteNot ported / pendingNo portado / pendiente
CISReward1: sempre[]— rewards CIS não implementados. Também alimenta a checagem do gate FOC.CISReward1: always[]— CIS rewards not implemented. Also feeds the FOC gate check.CISReward1: siempre[]— rewards CIS no implementados. También alimenta el chequeo del gate FOC.ReplenishmentDetails.lock_reasoneReplenishment_Id:""fixos comTODOno código — dependem deOrderLockEntityganharreason/sfid.ReplenishmentDetails.lock_reasonandReplenishment_Id: fixed""with a codeTODO— pendingOrderLockEntitygainingreason/sfid.ReplenishmentDetails.lock_reasonyReplenishment_Id:""fijos conTODOen el código — dependen de queOrderLockEntitytengareason/sfid.OrderDetail.soCase: sempre 0 (SOQ por caixa nunca populado; sósoPieceé resolvido).OrderDetail.soCase: always 0 (case SOQ never populated; onlysoPieceis resolved).OrderDetail.soCase: siempre 0 (SOQ por caja nunca poblado; solosoPiecese resuelve).FinalValueTenDec: o nome sugere 10 decimais, mas emite o mesmo valor de 2 casas queFinalValueTwoDec.FinalValueTenDec: the name suggests 10 decimals, but emits the same 2-dp value asFinalValueTwoDec.FinalValueTenDec: el nombre sugiere 10 decimales, pero emite el mismo valor de 2 dec queFinalValueTwoDec.- Grande bloco de campos de imposto/threshold do cabeçalho e item (
Total*Tax,FOC*,*Threshold,ExciseTaxAmount, etc.): placeholders inertes fixos do contrato — o app não calcula nenhum.Large block of header/item tax & threshold fields (Total*Tax,FOC*,*Threshold,ExciseTaxAmount, etc.): fixed inert contract placeholders — the app computes none.Gran bloque de campos de impuesto/threshold del encabezado e ítem (Total*Tax,FOC*,*Threshold,ExciseTaxAmount, etc.): placeholders inertes fijos del contrato — la app no calcula ninguno. B2BRulVoilation: chave com typo mantida verbatim (contrato do backend), semprefalse.B2BRulVoilation: misspelled key kept verbatim (backend contract), alwaysfalse.B2BRulVoilation: clave con typo mantenida verbatim (contrato del backend), siemprefalse.- Transporte:
deviceUuidvai como literal provisório no gateway (pendência conhecida do Dispatcher).Transport:deviceUuidships as a provisional literal in the gateway (known Dispatcher pending item).Transporte:deviceUuidva como literal provisional en el gateway (pendiente conocido del Dispatcher).
Transação irmãSister transactionTransacción hermana
O serviceName MobileorderAPI é compartilhado com a atualização de status de entrega — documentada em 02 · Delivery status update (doc separado).
The MobileorderAPI serviceName is shared with delivery-status update — documented in 02 · Delivery status update (separate doc).
El serviceName MobileorderAPI es compartido con la actualización de estado de entrega — documentada en 02 · Delivery status update (doc separado).
MercadosMarketsMercados
A disponibilidade da transação vem do DispatcherType.enabledMarkets. As variantes order e orderApproval valem em BR/CL/ZA; a variante orderIndirect é só ZA. AR/PY/PE não têm dispatcher de pedido.Transaction availability comes from DispatcherType.enabledMarkets. The order and orderApproval variants apply in BR/CL/ZA; the orderIndirect variant is ZA only. AR/PY/PE have no order dispatcher.La disponibilidad de la transacción viene de DispatcherType.enabledMarkets. Las variantes order y orderApproval aplican en BR/CL/ZA; la variante orderIndirect es solo ZA. AR/PY/PE no tienen dispatcher de pedido.
Variante indiretaIndirect variantVariante indirecta
A variante orderIndirect (IndirectOrderAPI) só existe na África do Sul, para clientes indiretos. Ela emite SupplierId. ZA também usa unidade secundária (caixa) e VAT no cálculo do payload.
The orderIndirect variant (IndirectOrderAPI) exists only in South Africa, for indirect customers. It emits SupplierId. ZA also uses secondary UoM (case) and VAT in the payload calc.
La variante orderIndirect (IndirectOrderAPI) solo existe en Sudáfrica, para clientes indirectos. Emite SupplierId. ZA también usa unidad secundaria (caja) y VAT en el cálculo del payload.
Só no BrasilBrazil onlySolo Brasil
Pix (ZX, isPrePixPayment, internalPixKey) e solicitação de dias de crédito (creditDaysToRequest, BaseCreditDays) são específicos do Brasil.
Pix (ZX, isPrePixPayment, internalPixKey) and credit-days requests (creditDaysToRequest, BaseCreditDays) are Brazil-specific.
Pix (ZX, isPrePixPayment, internalPixKey) y solicitud de días de crédito (creditDaysToRequest, BaseCreditDays) son específicos de Brasil.
Só no ChileChile onlySolo Chile
Pago al Contado: cart.isOnTimePayment zera os dias de crédito base (RField1 = 0), ortogonal ao método de pagamento.
Pay-at-Sight: cart.isOnTimePayment zeroes the base credit days (RField1 = 0), orthogonal to the payment method.
Pago al Contado: cart.isOnTimePayment anula los días de crédito base (RField1 = 0), ortogonal al método de pago.
AR · PY · PE
Existem como mercados do app (config PANGEA mínima), mas não têm dispatcher de pedido — nenhuma das variantes os lista em enabledMarkets. A criação de pedido não é disparada nesses mercados.
They exist as app markets (minimal PANGEA config), but have no order dispatcher — none of the variants list them in enabledMarkets. Order creation is not fired in these markets.
Existen como mercados de la app (config PANGEA mínima), pero no tienen dispatcher de pedido — ninguna variante los lista en enabledMarkets. La creación de pedido no se dispara en estos mercados.