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

Rastreamento de ativo de merchandisingMerchandising asset item trackingSeguimiento de activo de merchandising

A transação de escrita que registra o estado de um ativo/peça de merchandising instalado no varejo — o fluxo conhecido como Log Snag. Um único builder monta o payload JSON a partir de uma seleção de atividade / serviço / motivo e das peças afetadas, com foto, código de barras e comentário por peça. É disparada tanto pelo assistente de Log Snag quanto pela edição rápida de uma peça instalada. The write transaction that records the state of an installed merchandising asset/piece at the retail — the flow known as Log Snag. A single builder assembles the JSON payload from an activity / service / reason selection and the affected pieces, with a photo, barcode and comment per piece. It's fired both by the Log Snag wizard and by the quick edit of an installed piece. La transacción de escritura que registra el estado de un activo/pieza de merchandising instalado en el punto de venta — el flujo conocido como Log Snag. Un único builder arma el payload JSON a partir de una selección de actividad / servicio / motivo y de las piezas afectadas, con foto, código de barras y comentario por pieza. Se dispara tanto por el asistente de Log Snag como por la edición rápida de una pieza instalada.

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 ZA CL
01

O que é e quando aconteceWhat it is and when it happensQué es y cuándo ocurre

Um ativo de merchandising é um equipamento da marca instalado no ponto de venda — geladeira, expositor, prateleira, material de PDV. Esta transação registra o que o representante de vendas faz com esses ativos e suas peças durante uma visita: instalar, dar manutenção, remover, atualizar o código de barras ou anexar uma foto. Cada registro sai do dispositivo e é gravado no sistema, atualizando o estado da peça na conta do varejo. A merchandising asset is a brand-owned fixture installed at the point of sale — a cooler, a display, a shelf, POS material. This transaction records what the sales rep does with those assets and their pieces during a visit: install, service, remove, update the barcode or attach a photo. Each record leaves the device and is written to the system, updating the piece's state on the retail's account. Un activo de merchandising es un equipo de la marca instalado en el punto de venta — heladera, exhibidor, estante, material de PDV. Esta transacción registra lo que el representante de ventas hace con esos activos y sus piezas durante una visita: instalar, dar mantenimiento, remover, actualizar el código de barras o adjuntar una foto. Cada registro sale del dispositivo y se graba en el sistema, actualizando el estado de la pieza en la cuenta del punto de venta.

dois caminhos que geram este envio:There are two paths that produce this send:Hay dos caminos que generan este envío:

Assistente Log SnagLog Snag wizardAsistente Log Snag

O caminho completo: o rep escolhe a atividade, o serviço e o motivo, marca as peças afetadas e preenche foto, código de barras e comentário por peça.The full path: the rep picks the activity, service and reason, selects the affected pieces and fills in a photo, barcode and comment per piece.El camino completo: el rep elige la actividad, el servicio y el motivo, marca las piezas afectadas y completa foto, código de barras y comentario por pieza.

Edição rápida de peçaQuick piece editEdición rápida de pieza

Na lista de peças instaladas, o rep pode só atualizar o código de barras (ou apagá-lo) ou trocar a foto de uma peça — sem passar pelo assistente inteiro.In the installed-pieces list, the rep can just update the barcode (or clear it) or replace the photo of a piece — without going through the whole wizard.En la lista de piezas instaladas, el rep puede solo actualizar el código de barras (o borrarlo) o cambiar la foto de una pieza — sin pasar por el asistente completo.

Uma peça, um envioOne piece, one sendUna pieza, un envío Cada peça selecionada gera um envio próprio. Se o rep marca três peças no Log Snag, o app dispara três vezes esta transação — uma por peça. Each selected piece produces its own send. If the rep selects three pieces in Log Snag, the app fires this transaction three times — one per piece. Cada pieza seleccionada genera su propio envío. Si el rep marca tres piezas en Log Snag, la app dispara esta transacción tres veces — una por pieza.

02

Fluxo de telas que disparaScreen flow that fires itFlujo de pantallas que lo dispara

O envio é o último passo do assistente Log Snag. As telas pertencem à feature de Merchandising, aberta a partir do detalhe da visita; aqui só situamos onde o envio acontece:The send is the last step of the Log Snag wizard. The screens belong to the Merchandising feature, opened from the visit detail; here we only place where the send happens:El envío es el último paso del asistente Log Snag. Las pantallas pertenecen a la feature de Merchandising, abierta desde el detalle de la visita; aquí solo situamos dónde ocurre el envío:

  1. EspecificaçõesSpecificationsEspecificacionesO rep escolhe a atividade, o serviço e o motivo do trabalho de merchandising.The rep picks the activity, the service and the reason for the merchandising work.El rep elige la actividad, el servicio y el motivo del trabajo de merchandising.
  2. PeçasPiecesPiezasSeleciona quais ativos / peças instaladas serão afetados.Selects which installed assets / pieces will be affected.Selecciona qué activos / piezas instaladas serán afectados.
  3. ResumoSummaryResumenPara cada peça, preenche o que o serviço exige — foto, código de barras, comentário, quantidade.For each piece, fills in what the service requires — photo, barcode, comment, quantity.Para cada pieza, completa lo que el servicio exige — foto, código de barras, comentario, cantidad.
  4. Enviar → esta transaçãoSubmit → this transactionEnviar → esta transacciónAo confirmar no diálogo de envio, o app dispara o rastreamento — uma vez por peça selecionada.Confirming in the submit dialog fires the tracking — once per selected piece.Al confirmar en el diálogo de envío, la app dispara el seguimiento — una vez por pieza seleccionada.

Atalho: editar uma peçaShortcut: edit a pieceAtajo: editar una pieza Na lista de peças instaladas de um ativo, o rep pode tocar em uma peça e só atualizar o código de barras ou trocar a foto. Confirmar dispara a mesma transação, sem passar pelo assistente. In an asset's installed-pieces list, the rep can tap a piece and just update the barcode or replace the photo. Confirming fires the same transaction, without the wizard. En la lista de piezas instaladas de un activo, el rep puede tocar una pieza y solo actualizar el código de barras o cambiar la foto. Confirmar dispara la misma transacción, sin el asistente.

03

Depois do envioAfter sendingDespués del envío

Confirmação ao repConfirmation to the repConfirmación al rep
No assistente Log Snag, um diálogo de conclusão mostra sucesso ou erro e, ao fechar, leva o rep de volta ao menu de merchandising. Na edição rápida, aparece um aviso de sucesso ou erro e a peça já reflete a mudança na lista.In the Log Snag wizard, a completion dialog shows success or error and, on close, takes the rep back to the merchandising menu. In the quick edit, a success or error notice appears and the piece already reflects the change in the list.En el asistente Log Snag, un diálogo de conclusión muestra éxito o error y, al cerrar, lleva al rep de vuelta al menú de merchandising. En la edición rápida, aparece un aviso de éxito o error y la pieza ya refleja el cambio en la lista.
Sem internetOfflineSin internet
Este envio vai direto ao backend — não entra na fila offline. Sem conexão, ele falha e o rep vê o erro; precisa reenviar quando a conexão voltar. (Só o envio de visita tem fila offline.)This send goes straight to the backend — it doesn't enter the offline queue. With no connection it fails and the rep sees the error; they must resend when the connection returns. (Only the visit upload has an offline queue.)Este envío va directo al backend — no entra en la cola offline. Sin conexión falla y el rep ve el error; debe reenviar cuando vuelva la conexión. (Solo el envío de visita tiene cola offline.)
Acompanhar o envioTracking the sendSeguir el envío
O status técnico do despacho (enviado, 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, 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, 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

Merchandising asset item tracking é a transação de saída que registra o estado de uma peça de ativo de merchandising instalada. O DispatcherType.merchandisingAssetItemTracking resolve para o serviceName AssetItemTrackingUploadAPI (destino salesforce), habilitado em ZA e CL. Um único builder cobre os dois contextos de disparo — o assistente Log Snag e a edição rápida de peça — porque ambos preenchem o mesmo input Freezed. Merchandising asset item tracking is the outbound transaction that records the state of an installed merchandising asset piece. DispatcherType.merchandisingAssetItemTracking resolves to the serviceName AssetItemTrackingUploadAPI (salesforce destination), enabled in ZA and CL. A single builder covers both firing contexts — the Log Snag wizard and the quick piece edit — because both fill the same Freezed input. Merchandising asset item tracking es la transacción de salida que registra el estado de una pieza de activo de merchandising instalada. DispatcherType.merchandisingAssetItemTracking resuelve al serviceName AssetItemTrackingUploadAPI (destino salesforce), habilitado en ZA y CL. Un único builder cubre los dos contextos de disparo — el asistente Log Snag y la edición rápida de pieza — porque ambos completan el mismo input Freezed.

Payload enxutoLean payloadPayload conciso

Duas raízes: assetItemTracking (um objeto por peça) e base64Image (uma entrada por foto). Nenhum cálculo monetário, imposto ou promoção.Two roots: assetItemTracking (one object per piece) and base64Image (one entry per photo). No monetary, tax or promotion computation.Dos raíces: assetItemTracking (un objeto por pieza) y base64Image (una entrada por foto). Ningún cálculo monetario, de impuesto o de promoción.

Dois contextos, um builderTwo contexts, one builderDos contextos, un builder

O Log Snag preenche atividade/serviço/motivo/status; a edição rápida deixa esses campos vazios e usa só código de barras + foto. O serviceName é o mesmo.Log Snag fills activity/service/reason/status; the quick edit leaves those empty and uses only barcode + photo. The serviceName is the same.Log Snag completa actividad/servicio/motivo/status; la edición rápida deja esos vacíos y usa solo código de barras + foto. El serviceName es el mismo.

RPC genéricoGeneric RPCRPC genérico

Sem RPC por transação: tudo passa pelo mesmo sendTransaction, com o JSON no campo message e o serviceName como discriminador.No per-transaction RPC: everything goes through the same sendTransaction, with the JSON in the message field and serviceName as discriminator.Sin RPC por transacción: todo pasa por el mismo sendTransaction, con el JSON en el campo message y el serviceName como discriminador.

FontesSourcesFuentes BuildMerchandisingAssetItemTrackingDispatcherPayloadUseCase + MerchandisingAssetItemTrackingDispatcherPayloadInput + DispatcherType + DispatcherConectaRep.proto. O input carrega entities cruas de domínio (CLAUDE.md §36); o build() constrói todo o wire. BuildMerchandisingAssetItemTrackingDispatcherPayloadUseCase + MerchandisingAssetItemTrackingDispatcherPayloadInput + DispatcherType + DispatcherConectaRep.proto. The input carries raw domain entities (CLAUDE.md §36); build() constructs the entire wire. BuildMerchandisingAssetItemTrackingDispatcherPayloadUseCase + MerchandisingAssetItemTrackingDispatcherPayloadInput + 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 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 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 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 · discriminadorAssetItemTrackingUploadAPI (sem prefixo Promo_: hasPromotion é sempre false)discriminatorAssetItemTrackingUploadAPI (no Promo_ prefix: hasPromotion is always false)discriminadorAssetItemTrackingUploadAPI (sin prefijo Promo_: hasPromotion es siempre false)
dateReference
string · #3 · AAAA-MM-DD do envio (submittedAt)YYYY-MM-DD of the submission (submittedAt)AAAA-MM-DD del envío (submittedAt)
transactionReference
string · #4 · o item.sfid da peça (correlação)the piece item.sfid (correlation)el item.sfid de la pieza (correlación)
username
string · #5
message
string · #6 · o payload JSON serializado (a tabela da seção 08)the JSON payload serialized (the table in section 08)el payload JSON serializado (la tabla de la sección 08)
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 = item.sfid, 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 = item.sfid, 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 = item.sfid, 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 esta transação, resendMayDuplicate == true (não está na lista de tipos leves): um reenvío pode duplicar o registro no backend; a idempotência via tid é o que mitiga isso. O DispatcherOrchestrator despacha direto (sem fila offline — só DispatcherType.visit enfileira).For this transaction, resendMayDuplicate == true (it's not in the lightweight set): a resend may duplicate the record on the backend; idempotency via tid is what mitigates it. The DispatcherOrchestrator dispatches it directly (no offline queue — only DispatcherType.visit queues).Para esta transacción, resendMayDuplicate == true (no está en el conjunto liviano): un reenvío puede duplicar el registro en el backend; la idempotencia vía tid es lo que lo mitiga. El DispatcherOrchestrator lo despacha directo (sin cola offline — solo DispatcherType.visit encola).

06

Contextos de disparoFiring contextsContextos de disparo

Um único DispatcherType e um único serviceName. Não há variantes de tipo — o que muda é o contexto de disparo (qual notifier monta o input) e, com ele, quais campos do input chegam preenchidos.A single DispatcherType and a single serviceName. There are no type variants — what changes is the firing context (which notifier assembles the input) and, with it, which input fields arrive populated.Un único DispatcherType y un único serviceName. No hay variantes de tipo — lo que cambia es el contexto de disparo (qué notifier arma el input) y, con él, qué campos del input llegan completados.

ContextoContextContexto Notifier Campos preenchidosPopulated fieldsCampos completados QuandoWhenCuándo
Assistente Log SnagLog Snag wizardAsistente Log SnagMerchandisingServiceOrderNotifiertodos: activityLabel, serviceLabel, reasonLabel, assetItemStatus, serviceTarget, comment, barcode, imagesBase64all: activityLabel, serviceLabel, reasonLabel, assetItemStatus, serviceTarget, comment, barcode, imagesBase64todos: activityLabel, serviceLabel, reasonLabel, assetItemStatus, serviceTarget, comment, barcode, imagesBase64submitServiceOrder() quando !usesWorkflowOutsideCrm (mercado usa peças instaladas). Um input por peça selecionada.submitServiceOrder() when !usesWorkflowOutsideCrm (market uses installed items). One input per selected piece.submitServiceOrder() cuando !usesWorkflowOutsideCrm (el mercado usa piezas instaladas). Un input por pieza seleccionada.
Edição rápida de peçaQuick piece editEdición rápida de piezaMerchandisingAssetItemNotifierbarcode/removesBarcode ou imagesBase64; labels/status/target vazios, serviceTarget = nullonly barcode/removesBarcode or imagesBase64; labels/status/target empty, serviceTarget = nullsolo barcode/removesBarcode o imagesBase64; labels/status/target vacíos, serviceTarget = nullsubmitBarcode() (edita/apaga código) ou confirmPendingPhoto() (troca foto), na lista de peças instaladas.submitBarcode() (edit/clear barcode) or confirmPendingPhoto() (replace photo), in the installed-pieces list.submitBarcode() (edita/borra código) o confirmPendingPhoto() (cambia foto), en la lista de piezas instaladas.

Bifurcação por configConfig forkBifurcación por config No Log Snag, submitServiceOrder() decide por usesWorkflowOutsideCrm (= !merchandisingConfig.usesInstalledAssetItems): quando o mercado usa peças instaladas, dispara esta transação (_submitAssetItemTracking); senão dispara a transação irmã merchandisingServiceOrder (BPOneServiceOrderUpsert, doc separado) via _submitServiceOrder. In Log Snag, submitServiceOrder() decides by usesWorkflowOutsideCrm (= !merchandisingConfig.usesInstalledAssetItems): when the market uses installed items, it fires this transaction (_submitAssetItemTracking); otherwise it fires the sister transaction merchandisingServiceOrder (BPOneServiceOrderUpsert, separate doc) via _submitServiceOrder. En Log Snag, submitServiceOrder() decide por usesWorkflowOutsideCrm (= !merchandisingConfig.usesInstalledAssetItems): cuando el mercado usa piezas instaladas, dispara esta transacción (_submitAssetItemTracking); si no dispara la transacción hermana merchandisingServiceOrder (BPOneServiceOrderUpsert, doc separado) vía _submitServiceOrder.

07

Como é disparadoHow it's firedCómo se dispara

A transação é orquestrada pelo fluxo de merchandising (remote-first, §36). O notifier apenas reúne entities cruas e labels selecionados; o builder é o dono único de toda derivação wire (rename, formatação de data, trim(), composição de motivo, token de remoção de código). A cascata:The transaction is orchestrated by the merchandising flow (remote-first, §36). The notifier only gathers raw entities and selected labels; the builder is the sole owner of every wire derivation (rename, date formatting, trim(), reason composition, barcode-removal token). The cascade:La transacción se orquesta desde el flujo de merchandising (remote-first, §36). El notifier solo reúne entities crudas y labels seleccionados; el builder es el dueño único de toda derivación wire (rename, formateo de fecha, trim(), composición de motivo, token de remoción de código). La cascada:

  • Merchandising flownotifier
    • reúne entities cruas + labelsgathers raw entities + labelsreúne entities crudas + labelsMerchandisingAssetItemTrackingDispatcherPayloadInput
      • build()BuildMerchandisingAssetItemTrackingDispatcherPayloadUseCasemonta o wireassembles the wirearma el wire
        • devolvereturnsdevuelveDispatcherEnvelope
          • SubmitMerchandisingAssetItemTrackingUseCaseDispatcherOrchestrator
            • serializa + authserialize + authserializa + authDispatcherGateway
              • sendTransactionBackendgRPC

O input (entities cruas)The input (raw entities)El input (entities crudas)

MerchandisingAssetItemTrackingDispatcherPayloadInput (Freezed). Carrega o dado como existe no domínio; nada de formato wire. O relógio chega como submittedAt: DateTime (via DateTimeUtils.now()). No Log Snag os labels vêm das seleções (atividade → serviço → motivo); na edição rápida chegam vazios.MerchandisingAssetItemTrackingDispatcherPayloadInput (Freezed). Carries data as it exists in the domain; no wire shaping. The clock arrives as submittedAt: DateTime (via DateTimeUtils.now()). In Log Snag the labels come from the selections (activity → service → reason); in the quick edit they arrive empty.MerchandisingAssetItemTrackingDispatcherPayloadInput (Freezed). Lleva el dato como existe en el dominio; nada de formato wire. El reloj llega como submittedAt: DateTime (vía DateTimeUtils.now()). En Log Snag los labels vienen de las selecciones (actividad → servicio → motivo); en la edición rápida llegan vacíos.

CampoFieldCampoTipoTypeTipoPapelRoleRol
visitSfidStringVisitID
accountSfidStringassetItemInstalledAt + envelope accountassetItemInstalledAt + envelope accountassetItemInstalledAt + envelope account
assetMerchandisingAssetEntityativo cru — o builder usa asset.sfidassetIDraw asset — the builder uses asset.sfidassetIDactivo crudo — el builder usa asset.sfidassetID
itemMerchandisingAssetItemEntitypeça crua — item.sfidassetItemID, transactionReference e nome do arquivoraw piece — item.sfidassetItemID, transactionReference and filenamepieza cruda — item.sfidassetItemID, transactionReference y nombre del archivo
assetItemStatusStringassetItemStatus (do selectedService.assetItemStatus; ver enum na seção 09)assetItemStatus (from selectedService.assetItemStatus; see enum in section 09)assetItemStatus (de selectedService.assetItemStatus; ver enum en la sección 09)
serviceTargetMerchandisingServiceTarget?assets/items/both/null — controla assetItemIDassets/items/both/null — controls assetItemIDassets/items/both/null — controla assetItemID
activityLabelStringrótulo da atividade — fallback do reasonactivity label — reason fallbackrótulo de la actividad — fallback del reason
serviceLabelStringreasonType + parte de reasonpart of reasonparte de reason
reasonLabelStringparte de reason quando não vaziopart of reason when non-emptyparte de reason cuando no vacío
commentStringcomments (trim())
submittedAtDateTimerelógio → assetItemInstalledDate + dateReferenceclock → assetItemInstalledDate + dateReferencereloj → assetItemInstalledDate + dateReference
barcodeString · ""barcode (quando não remove)(when not removing)(cuando no remueve)
removesBarcodebool · falsetrue → barcode = "Delete"true → barcode = "Delete"true → barcode = "Delete"
imagesBase64List<String> · []fotos já lidas em base64 → base64Imagephotos already read as base64 → base64Imagefotos ya leídas en base64 → base64Image
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 (22 no total: 2 raízes + 16 na peça + 4 por imagem). Campo, Tipo e Origem são código cru; só a Regra é prosa. Um exemplo completo 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 (22 in total: 2 roots + 16 in the piece + 4 per image). Field, Type and Source are raw code; only Rule is prose. A full example 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 (22 en total: 2 raíces + 16 en la pieza + 4 por imagen). Campo, Tipo y Origen son código crudo; solo la Regla es prosa. Un ejemplo completo está en transaction_example.json, junto a este doc.

Raiz do payloadPayload rootRaíz del payload

Campo JSONTipoTypeTipoOrigem do DadoData sourceOrigen del DatoRegraRuleRegla
assetItemTrackingarray[tracking]array de um único objeto (a peça deste envio)single-element array (this send's piece)array de un solo objeto (la pieza de este envío)
base64Imagearrayinput.imagesBase64[]uma entrada por foto; vazio se não houver fotoone entry per photo; empty if no photouna entrada por foto; vacío si no hay foto
  • assetItemTracking objeto únicosingle objectobjeto único 16 camposfieldscampos
    Campo JSONTipoTypeTipoOrigem do DadoData sourceOrigen del DatoRegraRuleRegla
    reasonTypestringinput.serviceLabelrótulo do serviço; "" na edição rápidaservice label; "" in the quick editrótulo del servicio; "" en la edición rápida
    reasonstring_composeReason(input)reasonLabel não vazio → "{serviceLabel} - {reasonLabel}"; senão activityLabelreasonLabel non-empty → "{serviceLabel} - {reasonLabel}"; else activityLabelreasonLabel no vacío → "{serviceLabel} - {reasonLabel}"; si no activityLabel
    assetItemIDstringCalculadoserviceTarget == assets ? "" : item.sfidserviceTarget == assets ? "" : item.sfidserviceTarget == assets ? "" : item.sfid
    assetIDstringinput.asset.sfid
    commentsstringinput.commenttrim()
    VisitIDstringinput.visitSfid
    TargetQuantitystringFixo: ""contrato · inertecontract · inertcontrato · inerte
    ActualQuantitystringFixo: ""contrato · inertecontract · inertcontrato · inerte
    ProductIDstringFixo: ""contrato · inertecontract · inertcontrato · inerte
    ProductHierarchyIDstringFixo: ""contrato · inertecontract · inertcontrato · inerte
    URLstringFixo: ""contrato · inertecontract · inertcontrato · inerte
    assetItemStatusstringinput.assetItemStatus"" na edição rápida"" in the quick edit"" en la edición rápida
    assetItemInstalledAtstringinput.accountSfidnome do campo é "installed at", mas o valor é o sfid da contafield name is "installed at", but the value is the account sfidel nombre del campo es "installed at", pero el valor es el sfid de la cuenta
    assetItemInstalledDatestringinput.submittedAtformato yyyy-MM-dd (DateFormatType.isoDate)yyyy-MM-dd format (DateFormatType.isoDate)formato yyyy-MM-dd (DateFormatType.isoDate)
    QtystringFixo: "1"
    barcodestringCalculadoremovesBarcode ? "Delete" : input.barcoderemovesBarcode ? "Delete" : input.barcoderemovesBarcode ? "Delete" : input.barcode
    • base64Image por fotoper photopor foto 4 camposfieldscampos

      Uma entrada por índice de input.imagesBase64. Se não há foto, o array fica vazio.One entry per index of input.imagesBase64. If there's no photo, the array is empty.Una entrada por índice de input.imagesBase64. Si no hay foto, el array queda vacío.

      Campo JSONTipoTypeTipoOrigem do DadoData sourceOrigen del DatoRegraRuleRegla
      assetIdstringinput.asset.sfid
      filenamestringCalculado"{item.sfid}_{index}.jpg""{item.sfid}_{index}.jpg""{item.sfid}_{index}.jpg"
      assetItemIDstringCalculadomesmo valor de assetItemID da peça (vazio se target = assets)same value as the piece's assetItemID (empty if target = assets)mismo valor que el assetItemID de la pieza (vacío si target = assets)
      image1stringinput.imagesBase64[index]conteúdo base64 da fotophoto base64 contentcontenido base64 de la foto

ExemploExampleEjemplo Um payload completo (contexto Log Snag / ZA, 1 peça, 1 foto) está em docs/public/dispatcher/16_merchandising_asset_item_tracking/transaction_example.json — a forma exata serializada em message (sem wrapper gRPC). A complete payload (Log Snag / ZA context, 1 piece, 1 photo) is in docs/public/dispatcher/16_merchandising_asset_item_tracking/transaction_example.json — the exact shape serialized into message (no gRPC wrapper). Un payload completo (contexto Log Snag / ZA, 1 pieza, 1 foto) está en docs/public/dispatcher/16_merchandising_asset_item_tracking/transaction_example.json — la forma exacta serializada en message (sin wrapper gRPC).

09

Regras de negócioBusiness rulesReglas de negocio

Composição do motivoReason compositionComposición del motivo _composeReason → reason
  1. reasonLabel.isNotEmpty"{serviceLabel} - {reasonLabel}""{serviceLabel} - {reasonLabel}""{serviceLabel} - {reasonLabel}"
  2. senãootherwisesi noactivityLabel (vazio na edição rápida, quando todos os labels são "")activityLabel (empty in the quick edit, when all labels are "")activityLabel (vacío en la edición rápida, cuando todos los labels son "")

reasonType recebe sempre serviceLabel cru (mesmo quando reason cai no fallback).reasonType always gets the raw serviceLabel (even when reason falls back).reasonType siempre recibe el serviceLabel crudo (incluso cuando reason cae en el fallback).

Alvo do serviçoService targetObjetivo del servicio MerchandisingServiceTarget → assetItemID

O serviceTarget do serviço decide se o registro é do ativo inteiro ou da peça. assetItemID = serviceTarget == assets ? "" : item.sfid — quando o alvo é o ativo, o id da peça é apagado (o registro é a nível de ativo).The service's serviceTarget decides whether the record is for the whole asset or the piece. assetItemID = serviceTarget == assets ? "" : item.sfid — when the target is the asset, the piece id is blanked (the record is asset-level).El serviceTarget del servicio decide si el registro es del activo entero o de la pieza. assetItemID = serviceTarget == assets ? "" : item.sfid — cuando el objetivo es el activo, el id de la pieza se borra (el registro es a nivel de activo).

MerchandisingServiceTargetvalueassetItemID
assets"assets"""
items"items"item.sfid
both"both"item.sfid
nullitem.sfid
Status da peçaPiece statusStatus de la pieza MerchandisingAssetItemStatus

O assetItemStatus vem do selectedService.assetItemStatus (metadado da opção de serviço, não digitado). Valores canônicos do enum MerchandisingAssetItemStatus:assetItemStatus comes from selectedService.assetItemStatus (service-option metadata, not typed). Canonical values of the MerchandisingAssetItemStatus enum:assetItemStatus viene de selectedService.assetItemStatus (metadato de la opción de servicio, no digitado). Valores canónicos del enum MerchandisingAssetItemStatus:

casevalue
installationRequestedinstallation_requested
installedinstalled
removalRequestedremoval_requested
underRepairunder_repair
uninstalleduninstalled
unknown""
Código de barras e remoçãoBarcode & removalCódigo de barras y remoción removesBarcode → "Delete"
  • barcode do payload = removesBarcode ? "Delete" : input.barcode. O token literal "Delete" sinaliza ao backend que a peça deve perder o código.barcode in the payload = removesBarcode ? "Delete" : input.barcode. The literal "Delete" token signals the backend to clear the piece's barcode.barcode del payload = removesBarcode ? "Delete" : input.barcode. El token literal "Delete" le indica al backend que la pieza debe perder el código.
  • removesBarcode só é true na edição rápida, quando o rep limpa o campo (barcode aparado fica vazio). No Log Snag é sempre false.removesBarcode is only true in the quick edit, when the rep clears the field (trimmed barcode is empty). In Log Snag it's always false.removesBarcode solo es true en la edición rápida, cuando el rep limpia el campo (barcode recortado queda vacío). En Log Snag es siempre false.
  • Nome de arquivo da imagem: "{item.sfid}_{index}.jpg" — extensão fixa .jpg.Image filename: "{item.sfid}_{index}.jpg" — fixed .jpg extension.Nombre de archivo de la imagen: "{item.sfid}_{index}.jpg" — extensión fija .jpg.
Envio e resultadoSubmit & outcomeEnvío y resultado submit(envelopes:) · remote-first
  • SubmitMerchandisingAssetItemTrackingUseCase.submit(envelopes:) despacha os envelopes em paralelo (Future.wait de DispatcherOrchestrator.dispatch) e devolve List<Result<DispatcherAck, Failure>>.SubmitMerchandisingAssetItemTrackingUseCase.submit(envelopes:) dispatches the envelopes in parallel (Future.wait of DispatcherOrchestrator.dispatch) and returns List<Result<DispatcherAck, Failure>>.SubmitMerchandisingAssetItemTrackingUseCase.submit(envelopes:) despacha los envelopes en paralelo (Future.wait de DispatcherOrchestrator.dispatch) y devuelve List<Result<DispatcherAck, Failure>>.
  • Log Snag: qualquer Error loga merchandisingPieceSubmitFailed e marca submissionStatus = failure; o modal de conclusão dá o feedback e fecha para AppRouter.backToMerchandising. Sem ConectaNotice no notifier.Log Snag: any Error logs merchandisingPieceSubmitFailed and sets submissionStatus = failure; the completion modal gives feedback and closes to AppRouter.backToMerchandising. No ConectaNotice in the notifier.Log Snag: cualquier Error loguea merchandisingPieceSubmitFailed y marca submissionStatus = failure; el modal de conclusión da el feedback y cierra hacia AppRouter.backToMerchandising. Sin ConectaNotice en el notifier.
  • Edição rápida: remote-first → em sucesso, atualiza o cache local da peça (saveMerchandisingAssetItemUseCase) e a lista; a page dispara ConectaNotice.success/error.Quick edit: remote-first → on success, updates the piece's local cache (saveMerchandisingAssetItemUseCase) and the list; the page fires ConectaNotice.success/error.Edición rápida: remote-first → en éxito, actualiza el cache local de la pieza (saveMerchandisingAssetItemUseCase) y la lista; la page dispara ConectaNotice.success/error.
10

Pendências / roadmapPending / roadmapPendientes / roadmap

O que o builder envia inerte ou ainda não preenche, documentado fiel ao estado atual do código (nunca descrito como se já existisse):What the builder ships inert, or does not yet fill, documented faithfully to the current code state (never described as already existing):Lo que el builder envía inerte, o aún no completa, documentado fiel al estado actual del código (nunca descrito como si ya existiera):

Não portado / pendenteNot ported / pendingNo portado / pendiente

  • TargetQuantity, ActualQuantity, ProductID, ProductHierarchyID, URL: sempre "" — placeholders inertes do contrato; o app não os calcula.TargetQuantity, ActualQuantity, ProductID, ProductHierarchyID, URL: always "" — inert contract placeholders; the app computes none.TargetQuantity, ActualQuantity, ProductID, ProductHierarchyID, URL: siempre "" — placeholders inertes del contrato; la app no los calcula.
  • Qty: fixo "1" — a quantidade coletada na tela de resumo não é enviada nesta transação.Qty: fixed "1" — the quantity collected on the summary screen isn't sent in this transaction.Qty: fijo "1" — la cantidad recogida en la pantalla de resumen no se envía en esta transacción.
  • assetItemInstalledAt: o nome sugere data/lugar de instalação, mas o valor emitido é o accountSfid (contrato do backend, mantido verbatim).assetItemInstalledAt: the name suggests an install date/place, but the emitted value is the accountSfid (backend contract, kept verbatim).assetItemInstalledAt: el nombre sugiere fecha/lugar de instalación, pero el valor emitido es el accountSfid (contrato del backend, mantenido verbatim).
  • 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ções irmãsSister transactionsTransacciones hermanas A família merchandising tem outras transações no DispatcherType, ainda com docs separados pendentes: merchandisingServiceOrder (BPOneServiceOrderUpsert) — a alternativa ao Log Snag quando o mercado não usa peças instaladas; merchandisingCreation (CreateMerchan), merchandisingAnnotation (CreateMerchanAnnotation), imageRecognitionAudit (ServiceMerchanAudit), merchandisingImageAudit (ImageAudit) e merchandisingAuditUnit (AuditUnitReport). Todas partem da feature de Merchandising. The merchandising family has other DispatcherType transactions, still with separate docs pending: merchandisingServiceOrder (BPOneServiceOrderUpsert) — the Log Snag alternative when the market does not use installed items; merchandisingCreation (CreateMerchan), merchandisingAnnotation (CreateMerchanAnnotation), imageRecognitionAudit (ServiceMerchanAudit), merchandisingImageAudit (ImageAudit) and merchandisingAuditUnit (AuditUnitReport). All stem from the Merchandising feature. La familia merchandising tiene otras transacciones en DispatcherType, aún con docs separados pendientes: merchandisingServiceOrder (BPOneServiceOrderUpsert) — la alternativa al Log Snag cuando el mercado no usa piezas instaladas; merchandisingCreation (CreateMerchan), merchandisingAnnotation (CreateMerchanAnnotation), imageRecognitionAudit (ServiceMerchanAudit), merchandisingImageAudit (ImageAudit) y merchandisingAuditUnit (AuditUnitReport). Todas parten de la feature de Merchandising.

MercadosMarketsMercados

A disponibilidade da transação vem do DispatcherType.merchandisingAssetItemTracking.enabledMarkets = ZA e CL. BR não usa esta transação (o merchandising do Brasil passa por outras transações da família); AR/PY/PE não têm dispatcher de merchandising.Transaction availability comes from DispatcherType.merchandisingAssetItemTracking.enabledMarkets = ZA and CL. BR does not use this transaction (Brazil's merchandising goes through other family transactions); AR/PY/PE have no merchandising dispatcher.La disponibilidad de la transacción viene de DispatcherType.merchandisingAssetItemTracking.enabledMarkets = ZA y CL. BR no usa esta transacción (el merchandising de Brasil pasa por otras transacciones de la familia); AR/PY/PE no tienen dispatcher de merchandising.

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

Mercado principalPrimary marketMercado principal A África do Sul é o mercado principal do Log Snag e do fluxo de peças instaladas (usesInstalledAssetItems), onde esta transação é a rota de envio padrão. South Africa is the primary market for Log Snag and the installed-items flow (usesInstalledAssetItems), where this transaction is the default send route. Sudáfrica es el mercado principal del Log Snag y del flujo de piezas instaladas (usesInstalledAssetItems), donde esta transacción es la ruta de envío por defecto.

CL

Também no ChileChile tooTambién en Chile O Chile também habilita a transação. O contrato e o payload são idênticos aos da ZA — a disponibilidade é por mercado, não por variante. Chile also enables the transaction. The contract and payload are identical to ZA's — availability is per market, not per variant. Chile también habilita la transacción. El contrato y el payload son idénticos a los de ZA — la disponibilidad es por mercado, no por variante.

BR · AR · PY · PE BR existe como mercado do app mas não lista esta transação em enabledMarkets — o merchandising do Brasil usa outras transações da família (ex.: merchandisingServiceOrder, merchandisingCreation, imageRecognitionAudit). AR/PY/PE (config PANGEA mínima) não têm dispatcher de merchandising. BR exists as an app market but does not list this transaction in enabledMarkets — Brazil's merchandising uses other family transactions (e.g. merchandisingServiceOrder, merchandisingCreation, imageRecognitionAudit). AR/PY/PE (minimal PANGEA config) have no merchandising dispatcher. BR existe como mercado de la app pero no lista esta transacción en enabledMarkets — el merchandising de Brasil usa otras transacciones de la familia (p. ej. merchandisingServiceOrder, merchandisingCreation, imageRecognitionAudit). AR/PY/PE (config PANGEA mínima) no tienen dispatcher de merchandising.