DocumentaçãoDocumentationDocumentaciónOne Conecta
ÍndiceIndexÍndice
Baixar .mdDownload .mdBajar .md
Você está vendo esta documentação online. No topo você também pode baixar o PDF (mesmo conteúdo desta página, no idioma e modo atuais) e o Markdown (Funcional ou Técnica).You are viewing this documentation online. At the top you can also download the PDF (same content as this page, in the current language and mode) and the Markdown (Functional or Technical).Está viendo esta documentación en línea. Arriba también puede bajar el PDF (mismo contenido de esta página, en el idioma y modo actuales) y el Markdown (Funcional o Técnica).
Transação gRPC · DispatchergRPC transaction · DispatcherTransacción gRPC · Dispatcher

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.

PúblicoAudiencePúblico
QA · Suporte · Produto · DevQA · Support · Product · DevQA · Soporte · Producto · Dev
CamadaLayerCapa
Escrita · DispatcherWrite · DispatcherEscritura · Dispatcher
RelacionadoRelatedRelacionado
AtualizadoUpdatedActualizado
17/08/20262026-08-17
Disponível emAvailable inDisponible en BR CL ZA
01

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.

02

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:

  1. 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.
  2. 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í.
  3. 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).
  4. 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.
  5. 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.

03

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.
04

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.

05

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.

sendTransactionunary
MétodoMethodMétodo

rpc sendTransaction(InboxTransactionRequest) returns (InboxTransactionReply)

path /mn.bat.conectarep.dispatcher.DispatcherConectaRepService/sendTransaction

Request · InboxTransactionRequest
endpoint
string · #1 · endpoint alvo (config de ambiente)target endpoint (environment config)endpoint destino (config de ambiente)
serviceName
string · #2 · discriminadorMobileorderAPI / IndirectOrderAPI / OrderApprovalUploadAPI (prefixo Promo_ quando há promoção)discriminatorMobileorderAPI / IndirectOrderAPI / OrderApprovalUploadAPI (Promo_ prefix when a promotion is present)discriminadorMobileorderAPI / IndirectOrderAPI / OrderApprovalUploadAPI (prefijo Promo_ cuando hay promoción)
dateReference
string · #3 · AAAA-MM-DD do envio (context.now)YYYY-MM-DD of the submission (context.now)AAAA-MM-DD del envío (context.now)
transactionReference
string · #4 · o po do pedido (correlação)the order po (correlation)el po del pedido (correlación)
username
string · #5
message
string · #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)
manufacturer
string · #7 · dado do dispositivodevice datadato del dispositivo
model
string · #8 · dado do dispositivodevice datadato del dispositivo
deviceUuid
string · #9 · literal provisório hoje (ver Pendências)provisional literal today (see Pending)literal provisional hoy (ver Pendientes)
deviceVersion
string · #10
tid
int64 · #11 · id de transação para idempotência/replaytransaction id for idempotency/replayid de transacción para idempotencia/replay
Reply · InboxTransactionReply
status
int32 · #1 · status do ack (0 = sucesso)ack status (0 = success)status del ack (0 = éxito)
message
string · #2 · mensagem do backendbackend messagemensaje del backend
transactionId
int32 · #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.

06

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.isIndirectOrderorderIndirect; senão, se sendToPendingApprovalorderApproval; 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.isIndirectOrderorderIndirect; else if sendToPendingApprovalorderApproval; 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.isIndirectOrderorderIndirect; si no, si sendToPendingApprovalorderApproval; 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
orderMobileorderAPIBR · CL · ZAPedido 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).
orderIndirectIndirectOrderAPIZAPedido 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).
orderApprovalOrderApprovalUploadAPIBR · CL · ZAPedido 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 serviceNamePromo_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).

07

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

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.

CampoFieldCampoTipoTypeTipoPapelRoleRol
cartCartEntityitens, 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)
totalsCartTotalsEntitysubtotais, descontos, cash fee, VAT, total + totais por itemsubtotals, discounts, cash fee, VAT, total + per-item totalssubtotales, descuentos, cash fee, VAT, total + totales por ítem
contextCartOrchestrationContextEntitymercado, 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
resourceResourceEntityrepresentante de vendas (cru — o builder deriva ResId)sales rep (raw — the builder derives ResId)representante de ventas (crudo — el builder deriva ResId)
intentOrderSubmitIntentcreate · edit · release · cancel
visitIdStringVisitId
purchaseOrderNumberStringPO (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 / longitudedoubleposição (LocationService; 0 quando indisponível)position (LocationService; 0 when unavailable)posición (LocationService; 0 cuando no disponible)
creditDaysToRequestdouble · 0.0dias de crédito solicitados (BR)requested credit days (BR)días de crédito solicitados (BR)
sendToPendingApprovalbool · falseseleciona a variante de aprovaçãoselects the approval variantselecciona la variante de aprobación
approvalTypeCartApprovalType · noneTypeofApproval
originalValuedouble · 0.0valor 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)
08

Payload (message)

O JSON serializado no campo message do request. Cada tabela abaixo tem 4 colunasCampo 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 columnsJSON 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 columnasCampo 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 JSONTipoTypeTipoOrigem do DadoData sourceOrigen del DatoRegraRuleRegla
OrderHeaderarray_buildHeaderarray de um único objeto (cabeçalho)single-element array (header)array de un solo objeto (encabezado)
OrderPaymentInstructionarray_buildPaymentInstructionsuma entrada por parcela + perna de nota de créditoone entry per parcel + credit-note leguna entrada por cuota + pierna de nota de crédito
OrderDetailarray_buildOrderDetailsuma entrada por linha de itemone entry per line itemuna entrada por línea de ítem
CISReward1arrayFixo: []sempre vazio (não implementado — ver Pendências)always empty (not implemented — see Pending)siempre vacío (no implementado — ver Pendientes)
ReplenishmentDetailsarray_buildReplenishmentDetailssó 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
Promotionsarray_buildPromotionspromoções regulares aplicadas; vazio se canceladoapplied regular promotions; empty if cancelledpromociones regulares aplicadas; vacío si cancelado
SpotPromotionsarray_buildSpotPromotionspromoçõ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
accountCodestringcontext.sapCustomerIdcódigo SAP da contaaccount SAP codecódigo SAP de la cuenta
  • OrderHeader objeto únicosingle objectobjeto único 75 camposfieldscampos
    Campo JSONTipoTypeTipoOrigem do DadoData sourceOrigen del DatoRegraRuleRegla
    OrderIDstringpoNumberedição → cart.orderId; senão input.purchaseOrderNumberediting → cart.orderId; else input.purchaseOrderNumberedición → cart.orderId; si no input.purchaseOrderNumber
    RetailerIDstringcart.accountSfid
    OrderValuedoubletotals.subtotal − (itemsDiscount + orderDiscount)arredondado 2 casasrounded 2 dpredondeado 2 dec
    creditNoteAmountdoublecart.payment.creditNote?.value ?? 0arredondado 2 casasrounded 2 dpredondeado 2 dec
    payableAmountdoubletotals.totalarredondado 2 casasrounded 2 dpredondeado 2 dec
    LinesPerCallintFixo: 0
    OrderDatestringcontext.nowformato yyyy/MM/ddyyyy/MM/dd formatformato yyyy/MM/dd
    DeliveryDatestringcart.deliveryDateprompt → OrderDate; senão reformatado yyyy/MM/ddprompt → OrderDate; else reformatted yyyy/MM/ddprompt → OrderDate; si no reformateado yyyy/MM/dd
    postringpoNumber
    remarkstringFixo: ""
    discountdoubletotals.itemsDiscountWithoutVatarredondamento half-uphalf-up roundingredondeo half-up
    is_processedintFixo: 0
    latitudedoubleinput.latitude
    longitudedoubleinput.longitude
    timestampidstring"OTS" + context.nowtimestamp compacto MMddyyyyHHmmsscompact MMddyyyyHHmmss timestamptimestamp compacto MMddyyyyHHmmss
    totalTaxValueintFixo: 0contrato · inertecontract · inertcontrato · inerte
    totalweightintFixo: 0contrato · inertecontract · inertcontrato · inerte
    isApprovalintFixo: 0contrato · inertecontract · inertcontrato · inerte
    RField1intCalculadoisPixPrePayment ? 0 : baseCreditDaysisPixPrePayment ? 0 : baseCreditDaysisPixPrePayment ? 0 : baseCreditDays
    RField2intFixo: 0
    ordertimestringcontext.nowhora HH:mm:sstime HH:mm:sshora HH:mm:ss
    BaseLimitnumcontext.baseCreditLimit
    CreditLimitnumcontext.creditLimit
    Statusstringstatus.valueresolvido (ver Regras de negócio)resolved (see Business rules)resuelto (ver Reglas de negocio)
    TotalVatRetentionintFixo: 0contrato · inertecontract · inertcontrato · inerte
    GrossAmountdoubletotals.subtotalWithoutVatarredondado 2 casasrounded 2 dpredondeado 2 dec
    NetAmountdoubleGrossAmount − totals.itemsDiscountWithoutVatarredondado 2 casasrounded 2 dpredondeado 2 dec
    RMTaxintFixo: 0contrato · inertecontract · inertcontrato · inerte
    LTBTaxintFixo: 0contrato · inertecontract · inertcontrato · inerte
    OrigBaseCreditDaysintcontext.accountCreditDays
    BaseCreditDaysint?Calculadoemitido só se creditDaysToRequest > baseCreditDays (arredondado); senão ausente/nullemitted only if creditDaysToRequest > baseCreditDays (rounded); else absent/nullemitido solo si creditDaysToRequest > baseCreditDays (redondeado); si no ausente/null
    TotalICMSTaxintFixo: 0contrato · inertecontract · inertcontrato · inerte
    TotalFCPTaxintFixo: 0contrato · inertecontract · inertcontrato · inerte
    TotalRetailerPriceGrossintFixo: 0contrato · inertecontract · inertcontrato · inerte
    TotalICMSSTintFixo: 0contrato · inertecontract · inertcontrato · inerte
    TotalFCPSTintFixo: 0contrato · inertecontract · inertcontrato · inerte
    MaxThresholdintFixo: 0contrato · inertecontract · inertcontrato · inerte
    CmpThresholdintFixo: 0contrato · inertecontract · inertcontrato · inerte
    NoofOpenItemsintFixo: 0contrato · inertecontract · inertcontrato · inerte
    MaxCreditDaysnumcontext.creditPeriod
    TypeofApprovalstring_typeOfApproval"" fora de PA; senão rótulo por approvalType"" unless PA; else label by approvalType"" fuera de PA; si no etiqueta por approvalType
    ApprovalAmountintFixo: 0contrato · inertecontract · inertcontrato · inerte
    SapReconIdstringFixo: ""contrato · inertecontract · inertcontrato · inerte
    SFLoadRefNostringFixo: ""contrato · inertecontract · inertcontrato · inerte
    ExtApprovalintFixo: 0contrato · inertecontract · inertcontrato · inerte
    FOCTaxintFixo: 0contrato · inertecontract · inertcontrato · inerte
    FOCTotalValueintFixo: 0contrato · inertecontract · inertcontrato · inerte
    FOCRMTaxintFixo: 0contrato · inertecontract · inertcontrato · inerte
    FOCLTBTaxintFixo: 0contrato · inertecontract · inertcontrato · inerte
    FOCNetAmountintFixo: 0contrato · inertecontract · inertcontrato · inerte
    isFOCintFixo: 0flag de nível de cabeçalho, sempre 0header-level flag, always 0flag de nivel de encabezado, siempre 0
    DistFeeintFixo: 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"
    ExciseTaxAmountintFixo: 0contrato · inertecontract · inertcontrato · inerte
    PercepTaxAmountintFixo: 0contrato · inertecontract · inertcontrato · inerte
    IIBBTaxAmountintFixo: 0contrato · inertecontract · inertcontrato · inerte
    AdditionalTaxintFixo: 0contrato · inertecontract · inertcontrato · inerte
    OrderSfIdstringcart.orderId
    OrderSourcestringOrderSource.mobile.valuefixo "Mobile"fixed "Mobile"fijo "Mobile"
    ResIdstringresource.sfid
    MobOrdNostringpoNumber
    VisitIdstringinput.visitId
    PrevOrdAmtstringFixo: ""contrato · inertecontract · inertcontrato · inerte
    alteredFullboolCalculado!cart.isPromptOrder && config.sendsAlteredFullFlag!cart.isPromptOrder && config.sendsAlteredFullFlag!cart.isPromptOrder && config.sendsAlteredFullFlag
    B2BRulVoilationboolFixo: falsechave com typo mantida verbatim (contrato)misspelled key kept verbatim (contract)clave con typo mantenida verbatim (contrato)
    locationIdstringFixo: ""contrato · inertecontract · inertcontrato · inerte
    IFlagstringCalculadocart.isPromptOrder ? "1" : "0"cart.isPromptOrder ? "1" : "0"cart.isPromptOrder ? "1" : "0"
    invoiceRefNostringCalculadopoNumber só em aprovação externa (config + status); senão ""poNumber only on external approval (config + status); else ""poNumber solo en aprobación externa (config + status); si no ""
    isDeliveryboolFixo: false
    isPrePixPaymentboolCalculadostatus == Awaiting Pix Paymentstatus == Awaiting Pix Paymentstatus == Awaiting Pix Payment
    CashFeestring?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 → null
    iscashpaymentstringCalculado"1" se cash + config + aplicável; senão "0""1" if cash + config + applicable; else "0""1" si cash + config + aplicable; si no "0"
    marketIsostringcontext.market.name
    logAppErrorPaymentInstructionstringFixo: ""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 extra PaymentMode = Z9.One entry per cart.payment.parcels. If there's a credit note, adds an extra leg PaymentMode = Z9.Una entrada por cart.payment.parcels. Si hay nota de crédito, agrega una pierna extra PaymentMode = Z9.

      Campo JSONTipoTypeTipoOrigem do DadoData sourceOrigen del DatoRegraRuleRegla
      OrderIDstringpoNumber
      PaymentModestringparcel.paymentMethodse vazio → context.defaultPaymentMethod; perna CN → Z9if empty → context.defaultPaymentMethod; CN leg → Z9si vacío → context.defaultPaymentMethod; pierna CN → Z9
      InstalPercnumparcel.percentageperna CN → 0CN leg → 0pierna CN → 0
      CreditDaysintparcel.creditDaysisPixPrePayment → 0; perna CN → 0isPixPrePayment → 0; CN leg → 0isPixPrePayment → 0; pierna CN → 0
      DueDatestringparcel.dueDateyyyy/MM/dd; perna CN → OrderDateyyyy/MM/dd; CN leg → OrderDateyyyy/MM/dd; pierna CN → OrderDate
      CreditNoteIDstringFixo: ""perna CN → creditNote.sfid ?? ""CN leg → creditNote.sfid ?? ""pierna CN → creditNote.sfid ?? ""
      CreditNoteAmountnumFixo: 0perna CN → _round(creditNoteValue)CN leg → _round(creditNoteValue)pierna CN → _round(creditNoteValue)
      InstalAmountdoubleparcel.pricearredondado; perna CN → _round(creditNoteValue)rounded; CN leg → _round(creditNoteValue)redondeado; pierna CN → _round(creditNoteValue)
      RetailerIdstringcart.accountSfid
      IsFromCISintFixo: 0
      PmtInsIdstringparcel.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 ?? ""
      internalPixKeystringparcel.internalPixKeychave condicional — só quando PaymentMode == "ZX" (Pix)conditional key — only when PaymentMode == "ZX" (Pix)clave condicional — solo cuando PaymentMode == "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 de context.products[productSfid].One entry per cart item (qty > 0). Items may explode into per-batch lines and aggregate by SKU. Price and discount come from totals.itemTotals[key]; SKU/UoM/category come from context.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 de totals.itemTotals[key]; SKU/UoM/categoría vienen de context.products[productSfid].

      Campo JSONTipoTypeTipoOrigem do DadoData sourceOrigen del DatoRegraRuleRegla
      OrderIDstringpoNumber
      ProductIDstringproduct.internalIdcomo string numérica (_asIntString)as numeric string (_asIntString)como string numérica (_asIntString)
      PrevQtystringFixo: ""
      QtynumtotalQuantityInUom1recalculado na agregação por SKUrecomputed on SKU aggregationrecalculado en la agregación por SKU
      RatedoubleitemTotals.pricepreço unitário (não arredondado)unit price (not rounded)precio unitario (no redondeado)
      msqqtynumCalculadoisOuterEach ? uom1Quantity : 0isOuterEach ? uom1Quantity : 0isOuterEach ? uom1Quantity : 0
      uomcountnumquantitycolapsa p/ caixas na agregaçãocollapses to cases on aggregationcolapsa a cajas en la agregación
      dOuomQtyintFixo: 0
      outerQtynumCalculadoisOuterEach ? uom1Quantity : 0isOuterEach ? uom1Quantity : 0isOuterEach ? uom1Quantity : 0
      dOuomidstringCalculadoisOuterEach ? uom1Name : ""isOuterEach ? uom1Name : ""isOuterEach ? uom1Name : ""
      outerPricenumCalculadoisOuterEach ? itemTotals.price : 0isOuterEach ? itemTotals.price : 0isOuterEach ? itemTotals.price : 0
      pcsUOMIdstringCalculadouom1Name == pack ? uom1Name : ""uom1Name == pack ? uom1Name : ""uom1Name == pack ? uom1Name : ""
      pieceqtynumCalculadoisPiece ? uom1Quantity : 0isPiece ? uom1Quantity : 0isPiece ? uom1Quantity : 0
      uomidstringCalculadoisCase ? uom2Name : ""isCase ? uom2Name : ""isCase ? uom2Name : ""
      caseqtynumCalculadoisCase ? uom2Quantity : 0isCase ? uom2Quantity : 0isCase ? uom2Quantity : 0
      casePricenumCalculadoisCase ? itemTotals.price : 0isCase ? itemTotals.price : 0isCase ? itemTotals.price : 0
      UOM2numCalculadoisCase ? itemTotals.price : 0isCase ? itemTotals.price : 0isCase ? itemTotals.price : 0
      DAdoubleitemTotals.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)
      soCaseintFixo: 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)
      totalamountdoubleitemTotals.amount − itemTotals.discountarredondado 2 casasrounded 2 dpredondeado 2 dec
      batchidintmanufacturing?.erpNumber ?? product.erpNumbercomo int (_asInt)as int (_asInt)como int (_asInt)
      PriceOffIdintFixo: 0
      PriceOffValueintFixo: 0
      isFreeProductintFixo: 0
      weightintFixo: 0
      ReasonIdintFixo: 0
      FinalValueTwoDecdoubleitemTotals.amountarredondado 2 casasrounded 2 dpredondeado 2 dec
      FinalValueTenDecdoubleitemTotals.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)
      NetAmountdoubleitemTotals.pricepreço unitário (não arredondado)unit price (not rounded)precio unitario (no redondeado)
      PrdGrpIdstringFixo: ""
      IsPrioritystringFixo: "0"
      RetailerPriceGrossdoubleitemTotals.amountarredondado 2 casasrounded 2 dpredondeado 2 dec
      isFOCstringitem.isProduct"0" produto pago, "1" brinde"0" paid product, "1" free-of-charge"0" producto pago, "1" bonificación
      RetailerFinalPricedoubleitemTotals.pricepreço unitário (não arredondado)unit price (not rounded)precio unitario (no redondeado)
      MRPintFixo: 0
      PriceIdstringpriceEntryIdde ResolveProductPricingUseCase (grupo de preço da conta)from ResolveProductPricingUseCase (account pricing group)de ResolveProductPricingUseCase (grupo de precio de la cuenta)
      DistFeestringFixo: ""
      ComboIdstringFixo: ""
      ComboQtyintFixo: 0
      SFLineItemIdstringitem.orderLineItemSfid ?? ""preenchido em ediçãofilled on editcompletado en edición
      manufacturingProductSfidstringmanufacturing?.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
      marketIsostringcontext.market.name
      invoiceUomstringproduct.invoiceUom
      productCategorystringproduct.category
      productTradeSkuSfidstringitem.productSfid
    • ReplenishmentDetails edição/liberaçãoedit/releaseedición/liberación 9 camposfieldscampos

      Vazio na criação (intent.isCreation). Uma entrada por cart.replenishments (bloqueios).Empty on creation (intent.isCreation). One entry per cart.replenishments (locks).Vacío en la creación (intent.isCreation). Una entrada por cart.replenishments (bloqueos).

      Campo JSONTipoTypeTipoOrigem do DadoData sourceOrigen del DatoRegraRuleRegla
      order_idstringpoNumber
      lock_typestringlock.type.value
      lock_reasonstringFixo: ""TODO no código — pendente (ver Pendências)TODO in code — pending (see Pending)TODO en el código — pendiente (ver Pendientes)
      soq_valueintFixo: 0
      order_valuedoubletotals.subtotalarredondado 2 casasrounded 2 dpredondeado 2 dec
      delivery_datestringcart.deliveryDateformato AAAA-MM-DD (ISO — difere do cabeçalho)YYYY-MM-DD format (ISO — differs from header)formato AAAA-MM-DD (ISO — difiere del encabezado)
      supplierstringcart.accountSfid
      statusstringFixo: "Closed"
      Replenishment_IdstringFixo: ""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 com context.promotions por id. Os 8 primeiros campos sempre saem; os 9 do catálogo só quando a promoção é encontrada no contexto.One entry per cart.appliedPromotions, joined to context.promotions by id. The first 8 fields always ship; the 9 catalog ones only when the promotion is found in context.Una entrada por cart.appliedPromotions, cruzada con context.promotions por id. Los primeros 8 campos siempre salen; los 9 del catálogo solo cuando la promoción se encuentra en el contexto.

      Campo JSONTipoTypeTipoOrigem do DadoData sourceOrigen del DatoRegraRuleRegla
      idintapplied.promotionIdsemprealwayssiempre
      achievedLevelintapplied.achievedLevelsemprealwayssiempre
      isAppliedboolapplied.isAppliedsemprealwayssiempre
      isAvailableboolapplied.isAvailablesempre (flag de avaliação, gerado no app)always (evaluation flag, app-generated)siempre (flag de evaluación, generado en la app)
      isAchievedboolapplied.isAchievedsemprealwayssiempre
      isTargetAchievedboolapplied.isTargetAchievedsemprealwayssiempre
      selectedRewardIndexint?applied.selectedReward?.rewardIndexsemprealwayssiempre
      selectedRewardDetailIndexint?applied.selectedReward?.rewardDetailIndexsemprealwayssiempre
      namestringpromotion.namesó se encontrada no contextoonly if found in contextsolo si se encuentra en el contexto
      titlestringpromotion.titlesó se encontrada no contextoonly if found in contextsolo si se encuentra en el contexto
      cartTitlestringpromotion.cartTitlesó se encontrada no contextoonly if found in contextsolo si se encuentra en el contexto
      typestringpromotion.typesó se encontrada no contextoonly if found in contextsolo si se encuentra en el contexto
      statusstringpromotion.statussó se encontrada no contextoonly if found in contextsolo si se encuentra en el contexto
      startDatestringpromotion.startDatesó se encontrada no contextoonly if found in contextsolo si se encuentra en el contexto
      endDatestringpromotion.endDatesó se encontrada no contextoonly if found in contextsolo si se encuentra en el contexto
      discountLimitnumpromotion.discountLimitsó se encontrada no contextoonly if found in contextsolo si se encuentra en el contexto
      maxRewardQuantitynumpromotion.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 com context.spotPromotions por id. id e isApplied sempre; os demais só quando encontrada.One entry per cart.appliedSpotPromotions, joined to context.spotPromotions by id. id and isApplied always; the rest only when found.Una entrada por cart.appliedSpotPromotions, cruzada con context.spotPromotions por id. id e isApplied siempre; el resto solo cuando se encuentra.

      Campo JSONTipoTypeTipoOrigem do DadoData sourceOrigen del DatoRegraRuleRegla
      idintapplied.spotPromotionIdsemprealwayssiempre
      isAppliedboolapplied.isAppliedsemprealwayssiempre
      promotionTypestringspot.promotionTypesó se encontradaonly if foundsolo si se encuentra
      promotionTitlestringspot.promotionTitlesó se encontradaonly if foundsolo si se encuentra
      promotionCartTitlestringspot.promotionCartTitlesó se encontradaonly if foundsolo si se encuentra
      promotionRepInstructionsstringspot.promotionRepInstructionssó se encontradaonly if foundsolo si se encuentra
      statusstringspot.statussó se encontradaonly if foundsolo si se encuentra
      accountSfidstringspot.accountSfidsó se encontradaonly if foundsolo si se encuentra
      appliedOnOrderboolspot.appliedOnOrdersó se encontradaonly if foundsolo si se encuentra
      productListarrayspot.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).

09

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:

  1. intent.isCancellationCancelledCancelledCancelled
  2. isPixPrePaymentAwaiting 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)
  3. sendToPendingApproval && !isIndirectOrderPA (pending approval)PA (pending approval)PA (pending approval)
  4. cart.isPromptOrderPending External Approval (se config) ou Invoiced Not SyncPending External Approval (if config) or Invoiced Not SyncPending External Approval (si config) o Invoiced Not Sync
  5. senãootherwisesi noOn-HoldOn-HoldOn-Hold
Dias de crédito baseBase credit daysDías de crédito base _resolveBaseCreditDays → RField1
  1. isPixPrePayment→ 0→ 0→ 0
  2. cart.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)
  3. cash + zeroesBaseCreditDaysOnCashcash + zeroesBaseCreditDaysOnCashcash + zeroesBaseCreditDaysOnCash→ 0→ 0→ 0
  4. creditDaysToRequest == 0 && accountCreditDays != 0→ 0→ 0→ 0
  5. senãootherwisesi noaccountCreditDays, limitado a creditPeriodaccountCreditDays, clamped to creditPeriodaccountCreditDays, limitado a creditPeriod
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ão cart.deliveryDate em yyyy/MM/dd.Header DeliveryDate: prompt → OrderDate; else cart.deliveryDate as yyyy/MM/dd.Encabezado DeliveryDate: prompt → OrderDate; si no cart.deliveryDate en yyyy/MM/dd.
  • Replenishment delivery_date: cart.deliveryDate em AAAA-MM-DD (ISO — formato diferente do cabeçalho).Replenishment delivery_date: cart.deliveryDate as YYYY-MM-DD (ISO — different format from the header).Replenishment delivery_date: cart.deliveryDate en AAAA-MM-DD (ISO — formato distinto del encabezado).
Cash fee & PixCash fee & PixCash fee & Pix CashFee · iscashpayment · Pix
  • CashFee (cabeçalho e item): só quando config.orderPlacementWithCashFee; em cash → valor arredondado, senão "0"; config off → null. O cashFeePercentage do catálogo é um fator (0.03 = 3%); o valor já vem calculado em totals.CashFee (header and item): only when config.orderPlacementWithCashFee; for cash → rounded value, else "0"; config off → null. The catalog cashFeePercentage is a factor (0.03 = 3%); the value arrives already computed in totals.CashFee (encabezado e ítem): solo cuando config.orderPlacementWithCashFee; en cash → valor redondeado, si no "0"; config off → null. El cashFeePercentage del catálogo es un factor (0.03 = 3%); el valor ya llega calculado en totals.
  • isPrePixPayment: true quando status == Awaiting Pix Payment — pedido Pix cujo total excede o limite de crédito + valor original.isPrePixPayment: true when status == Awaiting Pix Payment — a Pix order whose total exceeds the credit limit + original value.isPrePixPayment: true cuando status == Awaiting Pix Payment — pedido Pix cuyo total excede el límite de crédito + valor original.
  • internalPixKey na instrução de pagamento: chave condicional, só quando o modo é ZX.internalPixKey in the payment instruction: conditional key, only when the mode is ZX.internalPixKey en la instrucción de pago: clave condicional, solo cuando el modo es ZX.
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) e DA (item)._roundHalfUp: only discount (header) and DA (item)._roundHalfUp: solo discount (encabezado) y DA (ítem).
  • Preços unitários (Rate, NetAmount (item), RetailerFinalPrice, casePrice, outerPrice, UOM2) passam crus (sem arredondar). Atenção: NetAmount do cabeçalho é arredondado; o NetAmount do 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 header NetAmount is rounded; the item NetAmount is the raw unit price — same name, different semantics.Precios unitarios (Rate, NetAmount (ítem), RetailerFinalPrice, casePrice, outerPrice, UOM2) pasan crudos (sin redondear). Atención: el NetAmount del encabezado se redondea; el NetAmount del í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 se status == Cancelled.Promotions: empty if status == Cancelled.Promotions: vacío si status == Cancelled.
  • SpotPromotions: vazio se Cancelled ou !promotionConfig.spotPromotionsEnabled.SpotPromotions: empty if Cancelled or !promotionConfig.spotPromotionsEnabled.SpotPromotions: vacío si Cancelled o !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 with isFOC == "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 con isFOC == "1" — impide bonificaciones sin promoción que las respalde.
  • Itens com qty <= 0 são pulados; item cujo produto não está em context.products é pulado e logado (dispatchOrderLineDropped).Items with qty <= 0 are skipped; an item whose product isn't in context.products is skipped and logged (dispatchOrderLineDropped).Ítems con qty <= 0 se omiten; ítem cuyo producto no está en context.products se 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:

CartApprovalTypeTypeofApproval
overdueThresholdOverdue Threshold
promotionalCreditDaysPromoção Dias de Crédito + ID: {id}
creditDays / noneCredit 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.

10

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_reason e Replenishment_Id: "" fixos com TODO no código — dependem de OrderLockEntity ganhar reason/sfid.ReplenishmentDetails.lock_reason and Replenishment_Id: fixed "" with a code TODO — pending OrderLockEntity gaining reason/sfid.ReplenishmentDetails.lock_reason y Replenishment_Id: "" fijos con TODO en el código — dependen de que OrderLockEntity tenga reason/sfid.
  • OrderDetail.soCase: sempre 0 (SOQ por caixa nunca populado; só soPiece é resolvido).OrderDetail.soCase: always 0 (case SOQ never populated; only soPiece is resolved).OrderDetail.soCase: siempre 0 (SOQ por caja nunca poblado; solo soPiece se resuelve).
  • FinalValueTenDec: o nome sugere 10 decimais, mas emite o mesmo valor de 2 casas que FinalValueTwoDec.FinalValueTenDec: the name suggests 10 decimals, but emits the same 2-dp value as FinalValueTwoDec.FinalValueTenDec: el nombre sugiere 10 decimales, pero emite el mismo valor de 2 dec que FinalValueTwoDec.
  • 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), sempre false.B2BRulVoilation: misspelled key kept verbatim (backend contract), always false.B2BRulVoilation: clave con typo mantenida verbatim (contrato del backend), siempre false.
  • Transporte: deviceUuid vai como literal provisório no gateway (pendência conhecida do Dispatcher).Transport: deviceUuid ships as a provisional literal in the gateway (known Dispatcher pending item).Transporte: deviceUuid va 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.

BRx CLx ZAx AR PY PE
disponívelavailabledisponible presente, desligadopresent, offpresente, apagado ausenteabsentausente
ZA

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.

BR

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.

CL

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.