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

Unidade de auditoria de merchandisingMerchandising audit unitUnidad de auditoría de merchandising

A transação de escrita que envia ao backend o relatório de auditoria de uma unidade de merchandising instalada (ex.: um freezer, rack ou display) num ponto de venda, durante uma visita. O representante escolhe a unidade, registra a condição física, captura o código de barras e até três fotos; o app monta o payload JSON AuditUnitReport e o despacha. Existe apenas na África do Sul. The write transaction that sends the backend the audit report of a single installed merchandising unit (e.g. a cooler, rack or display) at a retail store, during a visit. The rep picks the unit, records its physical condition, captures the barcode and up to three photos; the app assembles the AuditUnitReport JSON payload and dispatches it. It exists only in South Africa. La transacción de escritura que envía al backend el informe de auditoría de una unidad de merchandising instalada (p. ej. un refrigerador, rack o display) en un punto de venta, durante una visita. El rep elige la unidad, registra su condición física, captura el código de barras y hasta tres fotos; la app arma el payload JSON AuditUnitReport y lo despacha. Existe solo en Sudáfrica.

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
01

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

Uma unidade de merchandising é um equipamento da marca instalado num varejo — um freezer, um rack de exposição, um display. De tempos em tempos o representante de vendas precisa auditar essa unidade: confirmar em que estado ela está e registrar evidências. Esta transação é o envio desse relatório: acontece no fim do formulário de auditoria, quando o rep conclui e confirma o envio. A merchandising unit is a brand asset installed at a retail store — a cooler, a display rack, a stand. From time to time the sales rep needs to audit that unit: confirm what condition it's in and record evidence. This transaction is the sending of that report: it happens at the end of the audit form, when the rep finishes and confirms the send. Una unidad de merchandising es un equipo de la marca instalado en un punto de venta — un refrigerador, un rack de exhibición, un stand. Cada cierto tiempo el rep de ventas necesita auditar esa unidad: confirmar en qué estado está y registrar evidencias. Esta transacción es el envío de ese informe: ocurre al final del formulario de auditoría, cuando el rep termina y confirma el envío.

O relatório reúne, num só envio:The report gathers, in a single send:El informe reúne, en un solo envío:

A unidade e sua condiçãoThe unit and its conditionLa unidad y su condición

Qual unidade foi auditada e em que estado — boa, arranhada, danificada mas reparável, ou danificada sem reparo.Which unit was audited and in what state — good, scuffed, damaged-repairable, or damaged beyond repair.Qué unidad se auditó y en qué estado — buena, rayada, dañada reparable, o dañada sin reparación.

O código de barrasThe barcodeEl código de barras

O código de barras da unidade, escaneado ou fotografado — identifica fisicamente o equipamento auditado.The unit's barcode, scanned or photographed — physically identifies the audited asset.El código de barras de la unidad, escaneado o fotografiado — identifica físicamente el equipo auditado.

As fotosThe photosLas fotos

Até três fotos da unidade como evidência do estado registrado.Up to three photos of the unit as evidence of the recorded state.Hasta tres fotos de la unidad como evidencia del estado registrado.

Uma unidade por envioOne unit per sendUna unidad por envío Cada envio cobre uma única unidade. Para auditar várias unidades no mesmo varejo, o rep repete o formulário — cada uma gera seu próprio relatório. Each send covers a single unit. To audit several units at the same store, the rep repeats the form — each one produces its own report. Cada envío cubre una sola unidad. Para auditar varias unidades en el mismo punto de venta, el rep repite el formulario — cada una genera su propio informe.

02

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

A transação é o último passo da auditoria. As telas do caminho pertencem à feature de Merchandising; aqui só situamos onde o envio acontece:The transaction is the last step of the audit. The screens along the way belong to the Merchandising feature; here we only place where the send happens:La transacción es el último paso de la auditoría. Las pantallas del camino pertenecen a la feature de Merchandising; aquí solo situamos dónde ocurre el envío:

  1. Dentro da visita → MerchandisingInside the visit → MerchandisingDentro de la visita → MerchandisingDurante uma visita ao varejo, o rep abre o menu de Merchandising e escolhe a auditoria de unidade.During a store visit, the rep opens the Merchandising menu and picks unit audit.Durante una visita al punto de venta, el rep abre el menú de Merchandising y elige la auditoría de unidad.
  2. Formulário: unidade e condiçãoForm: unit and conditionFormulario: unidad y condiciónO rep escolhe qual unidade instalada auditar e a condição em que ela está.The rep picks which installed unit to audit and the condition it's in.El rep elige qué unidad instalada auditar y la condición en que está.
  3. Código de barrasBarcodeCódigo de barrasO rep escaneia o código de barras da unidade ou o fotografa; o valor pode ser ajustado num campo de texto.The rep scans the unit's barcode or photographs it; the value can be adjusted in a text field.El rep escanea el código de barras de la unidad o lo fotografía; el valor puede ajustarse en un campo de texto.
  4. Fotos da unidadeUnit photosFotos de la unidadO rep captura de uma a três fotos da unidade.The rep captures one to three photos of the unit.El rep captura de una a tres fotos de la unidad.
  5. Enviar → esta transaçãoSend → this transactionEnviar → esta transacciónO botão de envio só habilita com unidade, condição, código de barras (valor + foto) e ao menos uma foto da unidade. Ao tocar e confirmar no modal, o app dispara o envio da auditoria.The send button enables only with a unit, condition, barcode (value + photo) and at least one unit photo. Tapping it and confirming in the modal fires the audit send.El botón de envío solo se habilita con unidad, condición, código de barras (valor + foto) y al menos una foto de la unidad. Al tocarlo y confirmar en el modal, la app dispara el envío de la auditoría.

Confirmação antes de enviarConfirm before sendingConfirmación antes de enviar Há um passo de confirmação: o toque em enviar abre um modal, e só ao confirmar nele o envio realmente parte — evita despacho acidental. There's a confirmation step: tapping send opens a modal, and only by confirming there does the send actually go out — it prevents accidental dispatch. Hay un paso de confirmación: el toque en enviar abre un modal, y solo al confirmar en él el envío realmente parte — evita un despacho accidental.

03

Depois do envioAfter sendingDespués del envío

Confirmação ao repConfirmation to the repConfirmación al rep
Quando o backend aceita, o app marca o envio como concluído e o rep volta ao menu de Merchandising. O relatório passa a existir no sistema como uma auditoria daquela unidade.When the backend accepts it, the app marks the send as done and the rep returns to the Merchandising menu. The report now exists in the system as an audit of that unit.Cuando el backend lo acepta, la app marca el envío como concluido y el rep vuelve al menú de Merchandising. El informe pasa a existir en el sistema como una auditoría de esa unidad.
Sem internetOfflineSin internet
O envio passa pela central de despachos do app, que pode enfileirar e reenviar quando a conexão volta — o rep não perde o trabalho. Como as fotos vão embutidas, o relatório é um envio pesado.The send goes through the app's dispatch center, which can queue and retry when the connection returns — the rep doesn't lose the work. Since the photos travel embedded, the report is a heavy send.El envío pasa por el centro de despachos de la app, que puede encolar y reintentar cuando vuelve la conexión — el rep no pierde el trabajo. Como las fotos van embebidas, el informe es un envío pesado.
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

Unidade de auditoria de merchandising é a transação de saída que persiste no backend o relatório de auditoria de uma unidade instalada. É disparada pelo fluxo de auditoria de merchandising quando o representante de vendas conclui o formulário e confirma o envio. O builder monta um único objeto AuditUnitReport — não há variantes. Merchandising audit unit is the outbound transaction that persists the audit report of an installed unit in the backend. It's fired by the merchandising audit flow when the sales rep finishes the form and confirms the send. The builder assembles a single AuditUnitReport object — there are no variants. Unidad de auditoría de merchandising es la transacción de salida que persiste en el backend el informe de auditoría de una unidad instalada. Se dispara desde el flujo de auditoría de merchandising cuando el rep de ventas termina el formulario y confirma el envío. El builder arma un único objeto AuditUnitReport — no hay variantes.

Payload plano de 20 chavesFlat 20-key payloadPayload plano de 20 claves

O contrato wire é um único objeto plano AuditUnitReport com 20 campos — sem arrays aninhados. As três fotos e o barcode viajam embutidos como base64.The wire contract is one flat AuditUnitReport object with 20 fields — no nested arrays. The three photos and the barcode travel embedded as base64.El contrato wire es un único objeto plano AuditUnitReport con 20 campos — sin arrays anidados. Las tres fotos y el barcode viajan embebidos como base64.

RPC genéricoGeneric RPCRPC genérico

Não há RPC por auditoria: tudo passa pelo mesmo sendTransaction, com o JSON serializado no campo message e serviceName = "AuditUnitReport" como discriminador.There's no per-audit RPC: everything goes through the same sendTransaction, with the JSON serialized into message and serviceName = "AuditUnitReport" as the discriminator.No hay RPC por auditoría: todo pasa por el mismo sendTransaction, con el JSON serializado en message y serviceName = "AuditUnitReport" como discriminador.

Input de entities cruasRaw-entity inputInput de entities crudas

O input carrega visit, resource, asset e a condição selecionada como entities de domínio; todo rename e derivação wire (nomes do auditor, índice da condição, endereço) vivem no build().The input carries visit, resource, asset and the selected condition as domain entities; every rename and wire derivation (auditor names, condition index, address) lives in build().El input lleva visit, resource, asset y la condición seleccionada como entities de dominio; todo rename y derivación wire (nombres del auditor, índice de la condición, dirección) vive en build().

FontesSourcesFuentes BuildMerchandisingAuditUnitDispatcherPayloadUseCase + MerchandisingAuditUnitDispatcherPayloadInput + DispatcherType.merchandisingAuditUnit + DispatcherConectaRep.proto. O input carrega entities cruas de domínio (CLAUDE.md §36); o build() constrói todo o wire. BuildMerchandisingAuditUnitDispatcherPayloadUseCase + MerchandisingAuditUnitDispatcherPayloadInput + DispatcherType.merchandisingAuditUnit + DispatcherConectaRep.proto. The input carries raw domain entities (CLAUDE.md §36); build() constructs the entire wire. BuildMerchandisingAuditUnitDispatcherPayloadUseCase + MerchandisingAuditUnitDispatcherPayloadInput + DispatcherType.merchandisingAuditUnit + 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 · discriminadorAuditUnitReport (sem prefixo Promo_: esta transação não tem promoção)discriminatorAuditUnitReport (no Promo_ prefix: this transaction has no promotion)discriminadorAuditUnitReport (sin prefijo Promo_: esta transacción no tiene promoción)
dateReference
string · #3 · AAAA-MM-DD do envio (formatDate(submittedAt))YYYY-MM-DD of the submission (formatDate(submittedAt))AAAA-MM-DD del envío (formatDate(submittedAt))
transactionReference
string · #4 · o sfid da conta/loja (correlação)the account/store sfid (correlation)el sfid de la cuenta/tienda (correlación)
username
string · #5
message
string · #6 · o payload JSON serializado (a tabela da seção 07)the JSON payload serialized (the table in section 07)el payload JSON serializado (la tabla de la sección 07)
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 account vai como DispatchAccountEntity(sfid, sapCode: customerCode, name). O gateway serializa payload em JSON para message, copia serviceName/dateReference/transactionReference, preenche dispositivo e o bearer token de auth, e chama o RPC. The builder returns a DispatcherEnvelope (type, serviceName, payload, account, transactionReference, dateReference). The account ships as DispatchAccountEntity(sfid, sapCode: customerCode, name). The gateway serializes payload to JSON into message, copies serviceName/dateReference/transactionReference, fills device fields and the auth bearer token, and calls the RPC. El builder devuelve un DispatcherEnvelope (type, serviceName, payload, account, transactionReference, dateReference). El account va como DispatchAccountEntity(sfid, sapCode: customerCode, name). El gateway serializa payload a JSON en message, copia serviceName/dateReference/transactionReference, completa dispositivo y el bearer token de auth, y llama al RPC.

Para esta transação, DispatcherType.merchandisingAuditUnit.resendMayDuplicate == true: um reenvio (ex.: recuperação de fila offline) pode duplicar o relatório no backend; a idempotência via tid é o que mitiga isso.For this transaction, DispatcherType.merchandisingAuditUnit.resendMayDuplicate == true: a resend (e.g. offline-queue recovery) may duplicate the report on the backend; idempotency via tid is what mitigates it.Para esta transacción, DispatcherType.merchandisingAuditUnit.resendMayDuplicate == true: un reenvío (p. ej. recuperación de cola offline) puede duplicar el informe en el backend; la idempotencia vía tid es lo que lo mitiga.

06

Como é disparadoHow it's firedCómo se dispara

A transação é orquestrada pelo notifier da tela de auditoria (remote-first, §36). O notifier apenas reúne entities cruas e valores injetados (fotos em base64, relógio); 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 audit screen's notifier (remote-first, §36). The notifier only gathers raw entities and injected values (base64 photos, clock); the builder is the sole owner of every join, rename, date formatting and wire derivation. The cascade:La transacción se orquesta desde el notifier de la pantalla de auditoría (remote-first, §36). El notifier solo reúne entities crudas y valores inyectados (fotos en base64, reloj); el builder es el dueño único de todo join, rename, formateo de fecha y derivación wire. La cascada:

  • MerchandisingAuditUnitNotifiersubmitAudit()
    • reúne entities cruas + fotos base64gathers raw entities + base64 photosreúne entities crudas + fotos base64MerchandisingAuditUnitDispatcherPayloadInput
      • build()BuildMerchandisingAuditUnitDispatcherPayloadUseCasemonta o wireassembles the wirearma el wire
        • devolvereturnsdevuelveDispatcherEnvelope
          • SubmitMerchandisingAuditUnitUseCaseDispatcherOrchestratordispatch()
            • serializa + authserialize + authserializa + authDispatcherGateway
              • sendTransactionBackendgRPC

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

MerchandisingAuditUnitDispatcherPayloadInput (Freezed). Carrega o dado como existe no domínio; nada de formato wire. O relógio chega como submittedAt (via DateTimeUtils.now()); as fotos chegam já lidas em base64 pelo notifier.MerchandisingAuditUnitDispatcherPayloadInput (Freezed). Carries data as it exists in the domain; no wire shaping. The clock arrives as submittedAt (via DateTimeUtils.now()); photos arrive already read as base64 by the notifier.MerchandisingAuditUnitDispatcherPayloadInput (Freezed). Lleva el dato como existe en el dominio; nada de formato wire. El reloj llega como submittedAt (vía DateTimeUtils.now()); las fotos llegan ya leídas en base64 por el notifier.

CampoFieldCampoTipoTypeTipoPapelRoleRol
visitVisitEntityconta/loja (accountData) e visitResource (id do recurso da visita → auditedUserId)store account (accountData) and visitResource (visit resource id → auditedUserId)cuenta/tienda (accountData) y visitResource (id del recurso de la visita → auditedUserId)
resourceResourceEntityrepresentante (cru — o builder deriva nome/sobrenome de resource.name)sales rep (raw — the builder derives name/surname from resource.name)representante (crudo — el builder deriva nombre/apellido de resource.name)
assetMerchandisingAssetEntityunidade auditada: sfidunitId, familyNameunitTypeName, items → data de instalaçãoaudited unit: sfidunitId, familyNameunitTypeName, items → installation dateunidad auditada: sfidunitId, familyNameunitTypeName, items → fecha de instalación
conditionsList<MerchandisingAuditCondition>lista disponível — usada só para calcular o índice (unitConditionId)available list — used only to compute the index (unitConditionId)lista disponible — usada solo para calcular el índice (unitConditionId)
selectedConditionMerchandisingAuditConditionunitCondition (wireLabel) + unitConditionId
barcodeValueStringnumerBarcode
barcodeImageBase64StringimageBarcode
unitImagesBase64List<String>unitImag1 / unitImag2 / unitImag3
submittedAtDateTimeauditDate + dateReference do envelope
07

Payload (message)

O JSON serializado no campo message do request. A raiz é um único par {"AuditUnitReport": {…}}; o objeto interno tem 20 campos planos (sem arrays). A tabela abaixo tem 4 colunasCampo JSON · Tipo · Origem do Dado · Regra — e lista toda chave que o build() emite. 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. The root is a single pair {"AuditUnitReport": {…}}; the inner object has 20 flat fields (no arrays). The table below has 4 columnsJSON field · Type · Data source · Rule — and lists every key that build() emits. 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. La raíz es un único par {"AuditUnitReport": {…}}; el objeto interno tiene 20 campos planos (sin arrays). La tabla de abajo tiene 4 columnasCampo JSON · Tipo · Origen del Dato · Regla — y lista toda clave que build() emite. 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
AuditUnitReportobjectdataobjeto único com 20 campos (a tabela abaixo)single object with 20 fields (the table below)objeto único con 20 campos (la tabla de abajo)
  • AuditUnitReport objeto únicosingle objectobjeto único 20 camposfieldscampos
    Campo JSONTipoTypeTipoOrigem do DadoData sourceOrigen del DatoRegraRuleRegla
    unitaryAuditTrackingIdstringFixo: "criação automatica"literal wire (em português) — placeholder; o id real da auditoria é gerado no backendwire literal (in Portuguese) — placeholder; the real audit id is generated on the backendliteral wire (en portugués) — placeholder; el id real de la auditoría se genera en el backend
    unitIdstringinput.asset.sfidsfid da unidade/asset auditadosfid of the audited unit/assetsfid de la unidad/asset auditado
    storeIdstringvisit.accountData.sfid
    storeCustomerCodestringaccount.customerCodecódigo de cliente/SAP da lojastore customer/SAP codecódigo de cliente/SAP de la tienda
    lenintCalculadoaccount.customerCode.length — comprimento do código de clienteaccount.customerCode.length — length of the customer codeaccount.customerCode.length — longitud del código de cliente
    storeCustomerNamestringaccount.name
    storeRegionstringaccount.address?.fullAddress?? "" quando a conta não tem endereço?? "" when the account has no address?? "" cuando la cuenta no tiene dirección
    unitTypeNamestringinput.asset.familyNamefamília/tipo da unidadeunit family/typefamilia/tipo de la unidad
    auditDatestringformatTimestamp(submittedAt)timestamp cru DateTime.toString() (yyyy-MM-dd HH:mm:ss.mmmuuu) — ver Pendênciasraw DateTime.toString() timestamp (yyyy-MM-dd HH:mm:ss.mmmuuu) — see Pendingtimestamp crudo DateTime.toString() (yyyy-MM-dd HH:mm:ss.mmmuuu) — ver Pendientes
    installationDatestringCalculadoinstalledDate do item instalado desta conta, formatado yyyy-MM-dd; "" se não há item/datainstalledDate of this account's installed item, formatted yyyy-MM-dd; "" if no item/dateinstalledDate del ítem instalado de esta cuenta, formateado yyyy-MM-dd; "" si no hay ítem/fecha
    unitConditionIdstringCalculadoconditions.indexOf(selectedCondition).toString() — índice na lista disponívelconditions.indexOf(selectedCondition).toString() — index in the available listconditions.indexOf(selectedCondition).toString() — índice en la lista disponible
    unitConditionstringselectedCondition.wireLabelGood / Scuffed / Damaged-Repairable / Damaged-Beyond RepairGood / Scuffed / Damaged-Repairable / Damaged-Beyond RepairGood / Scuffed / Damaged-Repairable / Damaged-Beyond Repair
    numerBarcodestringinput.barcodeValuechave com typo (numer) mantida verbatim (contrato)misspelled key (numer) kept verbatim (contract)clave con typo (numer) mantenida verbatim (contrato)
    imageBarcodestringinput.barcodeImageBase64foto do código de barras em base64barcode photo in base64foto del código de barras en base64
    auditedUserIdstringvisit.visitResourceid do recurso da visita — não resource.sfidvisit resource id — not resource.sfidid del recurso de la visita — no resource.sfid
    auditedUserNamestringCalculadoprimeiro token de resource.name (capitalized); "" se vaziofirst token of resource.name (capitalized); "" if emptyprimer token de resource.name (capitalized); "" si vacío
    auditedUserSurnamestringCalculadoúltimo token de resource.name (capitalized); "" se o nome tem só um tokenlast token of resource.name (capitalized); "" if the name has a single tokenúltimo token de resource.name (capitalized); "" si el nombre tiene un solo token
    unitImag1string_imageAt(unitImagesBase64, 0)1ª foto base64; "" se ausente. Chave com typo (Imag) verbatim1st base64 photo; "" if absent. Misspelled key (Imag) verbatim1ª foto base64; "" si ausente. Clave con typo (Imag) verbatim
    unitImag2string_imageAt(unitImagesBase64, 1)2ª foto base64; "" se ausente2nd base64 photo; "" if absent2ª foto base64; "" si ausente
    unitImag3string_imageAt(unitImagesBase64, 2)3ª foto base64; "" se ausente3rd base64 photo; "" if absent3ª foto base64; "" si ausente
08

Regras de negócioBusiness rulesReglas de negocio

Condição da unidadeUnit conditionCondición de la unidad unitCondition · unitConditionId

A condição vai em dois campos: o rótulo wire (unitCondition) e o índice na lista de opções disponíveis (unitConditionId = conditions.indexOf(selectedCondition)). As opções vêm do enum MerchandisingAuditCondition:The condition goes in two fields: the wire label (unitCondition) and the index in the list of available options (unitConditionId = conditions.indexOf(selectedCondition)). The options come from the MerchandisingAuditCondition enum:La condición va en dos campos: la etiqueta wire (unitCondition) y el índice en la lista de opciones disponibles (unitConditionId = conditions.indexOf(selectedCondition)). Las opciones vienen del enum MerchandisingAuditCondition:

MerchandisingAuditConditioncodewireLabel (unitCondition)
goodgoodGood
scuffedscuffedScuffed
damagedRepairabledamaged_repairableDamaged-Repairable
damagedBeyondRepairdamaged_beyond_repairDamaged-Beyond Repair

O unitConditionId é o índice na lista conditions recebida no input (a lista de opções que a tela ofereceu), não um id fixo do enum. Se essa lista mudar de ordem ou de conteúdo, o índice muda.The unitConditionId is the index in the conditions list received in the input (the option list the screen offered), not a fixed enum id. If that list changes order or content, the index changes.El unitConditionId es el índice en la lista conditions recibida en el input (la lista de opciones que la pantalla ofreció), no un id fijo del enum. Si esa lista cambia de orden o contenido, el índice cambia.

Nomes do auditorAuditor namesNombres del auditor auditedUserName · auditedUserSurname · auditedUserId
  • resource.name é dividido por espaços em tokens não-vazios: auditedUserName = primeiro token (capitalized); auditedUserSurname = último token (capitalized). Nome com um só token → auditedUserSurname = ""; nome vazio → ambos "".resource.name is split on spaces into non-empty tokens: auditedUserName = first token (capitalized); auditedUserSurname = last token (capitalized). A single-token name → auditedUserSurname = ""; an empty name → both "".resource.name se divide por espacios en tokens no vacíos: auditedUserName = primer token (capitalized); auditedUserSurname = último token (capitalized). Nombre de un solo token → auditedUserSurname = ""; nombre vacío → ambos "".
  • auditedUserId vem de visit.visitResource (id do recurso da visita), não de resource.sfid. Ou seja: o id do auditor e o nome do auditor vêm de fontes diferentes.auditedUserId comes from visit.visitResource (the visit resource id), not from resource.sfid. That is: the auditor's id and the auditor's name come from different sources.auditedUserId viene de visit.visitResource (id del recurso de la visita), no de resource.sfid. Es decir: el id del auditor y el nombre del auditor vienen de fuentes distintas.
Imagens embutidasEmbedded imagesImágenes embebidas imageBarcode · unitImag1..3 · _imageAt
  • Todas as imagens viajam embutidas em base64 dentro do JSON — não há upload separado. São quatro no máximo: a foto do código de barras (imageBarcode) e até três fotos da unidade.All images travel embedded as base64 inside the JSON — there's no separate upload. Four at most: the barcode photo (imageBarcode) and up to three unit photos.Todas las imágenes viajan embebidas en base64 dentro del JSON — no hay upload separado. Cuatro como máximo: la foto del código de barras (imageBarcode) y hasta tres fotos de la unidad.
  • _imageAt(images, index) devolve images[index] ou "" se o índice não existe. Os três slots (unitImag1..3) são sempre emitidos: os que faltam vão como ""._imageAt(images, index) returns images[index] or "" if the index doesn't exist. The three slots (unitImag1..3) are always emitted: the missing ones ship as ""._imageAt(images, index) devuelve images[index] o "" si el índice no existe. Los tres slots (unitImag1..3) se emiten siempre: los que faltan van como "".
Datas do relatórioReport datesFechas del informe auditDate · installationDate · dateReference
  • auditDate: instante do envio via DateTimeUtils.formatTimestamp(submittedAt), que é DateTime.toString() cru — inclui frações de segundo (e Z se UTC). Não é o formato ISO estrito das outras datas.auditDate: the send instant via DateTimeUtils.formatTimestamp(submittedAt), which is raw DateTime.toString() — includes fractional seconds (and Z if UTC). It's not the strict ISO format of the other dates.auditDate: el instante del envío vía DateTimeUtils.formatTimestamp(submittedAt), que es DateTime.toString() crudo — incluye fracciones de segundo (y Z si UTC). No es el formato ISO estricto de las otras fechas.
  • installationDate: installedDate do primeiro asset.items cujo accountSfid bate com a conta da visita, formatado yyyy-MM-dd (DateFormatType.isoDate). Sem item correspondente ou sem data → "".installationDate: the installedDate of the first asset.items whose accountSfid matches the visit's account, formatted yyyy-MM-dd (DateFormatType.isoDate). No matching item or no date → "".installationDate: el installedDate del primer asset.items cuyo accountSfid coincide con la cuenta de la visita, formateado yyyy-MM-dd (DateFormatType.isoDate). Sin ítem correspondiente o sin fecha → "".
  • dateReference (no envelope, não no payload): formatDate(submittedAt) em yyyy-MM-dd.dateReference (on the envelope, not the payload): formatDate(submittedAt) in yyyy-MM-dd.dateReference (en el envelope, no en el payload): formatDate(submittedAt) en yyyy-MM-dd.
Identidade da lojaStore identityIdentidad de la tienda storeId · storeCustomerCode · len · storeRegion
  • A conta vem de visit.accountData: storeId = sfid, storeCustomerCode = customerCode, storeCustomerName = name. A mesma conta também alimenta o account do envelope (DispatchAccountEntity) e o transactionReference (= sfid).The account comes from visit.accountData: storeId = sfid, storeCustomerCode = customerCode, storeCustomerName = name. The same account also feeds the envelope account (DispatchAccountEntity) and the transactionReference (= sfid).La cuenta viene de visit.accountData: storeId = sfid, storeCustomerCode = customerCode, storeCustomerName = name. La misma cuenta también alimenta el account del envelope (DispatchAccountEntity) y el transactionReference (= sfid).
  • len é o comprimento de customerCode — um campo de verificação que o contrato pede junto do código.len is the length of customerCode — a check field the contract asks for alongside the code.len es la longitud de customerCode — un campo de verificación que el contrato pide junto al código.
  • storeRegion reutiliza o fullAddress cru da conta (não uma região dedicada); "" quando não há endereço.storeRegion reuses the account's raw fullAddress (not a dedicated region); "" when there's no address.storeRegion reutiliza el fullAddress crudo de la cuenta (no una región dedicada); "" cuando no hay dirección.
09

Pendências / roadmapPending / roadmapPendientes / roadmap

O que o builder ainda envia de forma provisória ou inerte, documentado fiel ao estado atual do código (nunca descrito como se já existisse):What the builder still ships provisionally or inert, documented faithfully to the current code state (never described as already existing):Lo que el builder aún envía de forma provisional o inerte, documentado fiel al estado actual del código (nunca descrito como si ya existiera):

Provisório / verbatimProvisional / verbatimProvisional / verbatim

  • unitaryAuditTrackingId: sempre o literal "criação automatica" (em português, com o typo de acento) — placeholder; o backend gera o id real da auditoria.unitaryAuditTrackingId: always the literal "criação automatica" (Portuguese, with the accent typo) — placeholder; the backend generates the real audit id.unitaryAuditTrackingId: siempre el literal "criação automatica" (en portugués, con el typo de acento) — placeholder; el backend genera el id real de la auditoría.
  • auditDate: emitido como DateTime.toString() cru (com frações de segundo e possível Z), não num formato ISO estrito — divergência de formato conhecida em relação às demais datas do payload.auditDate: emitted as raw DateTime.toString() (with fractional seconds and a possible Z), not a strict ISO format — a known format divergence from the other payload dates.auditDate: emitido como DateTime.toString() crudo (con fracciones de segundo y un posible Z), no en un formato ISO estricto — divergencia de formato conocida respecto a las demás fechas del payload.
  • Chaves com typo mantidas verbatim por contrato do backend: numerBarcode (por number) e unitImag1/2/3 (por image).Misspelled keys kept verbatim by backend contract: numerBarcode (for number) and unitImag1/2/3 (for image).Claves con typo mantenidas verbatim por contrato del backend: numerBarcode (por number) y unitImag1/2/3 (por image).
  • storeRegion: reaproveita o fullAddress da conta — não existe um campo de região dedicado; pode vir "".storeRegion: reuses the account's fullAddress — there's no dedicated region field; may come as "".storeRegion: reaprovecha el fullAddress de la cuenta — no existe un campo de región dedicado; puede venir "".
  • 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 Esta é uma das transações de Merchandising, cada uma com seu próprio serviceName e mercados (docs separados no setor Dispatcher): rastreamento de item de asset (AssetItemTrackingUploadAPI · ZA/CL), auditoria por imagem (ImageAudit · BR), image recognition (ServiceMerchanAudit · BR), criação de merchandising (CreateMerchan · BR), anotação (CreateMerchanAnnotation · BR) e ordem de serviço (BPOneServiceOrderUpsert · BR). Só a AuditUnitReport é de auditoria de unidade instalada, e só ela é ZA. This is one of the Merchandising transactions, each with its own serviceName and markets (separate docs in the Dispatcher sector): asset item tracking (AssetItemTrackingUploadAPI · ZA/CL), image audit (ImageAudit · BR), image recognition (ServiceMerchanAudit · BR), merchandising creation (CreateMerchan · BR), annotation (CreateMerchanAnnotation · BR) and service order (BPOneServiceOrderUpsert · BR). Only AuditUnitReport audits an installed unit, and only it is ZA. Esta es una de las transacciones de Merchandising, cada una con su propio serviceName y mercados (docs separados en el sector Dispatcher): tracking de ítem de asset (AssetItemTrackingUploadAPI · ZA/CL), auditoría por imagen (ImageAudit · BR), image recognition (ServiceMerchanAudit · BR), creación de merchandising (CreateMerchan · BR), anotación (CreateMerchanAnnotation · BR) y orden de servicio (BPOneServiceOrderUpsert · BR). Solo AuditUnitReport audita una unidad instalada, y solo ella es ZA.

MercadosMarketsMercados

A disponibilidade da transação vem de DispatcherType.merchandisingAuditUnit.enabledMarkets, que é [EndMarket.ZA]só a África do Sul. Nenhum outro mercado dispara esta auditoria de unidade.Transaction availability comes from DispatcherType.merchandisingAuditUnit.enabledMarkets, which is [EndMarket.ZA]South Africa only. No other market fires this unit audit.La disponibilidad de la transacción viene de DispatcherType.merchandisingAuditUnit.enabledMarkets, que es [EndMarket.ZA]solo Sudáfrica. Ningún otro mercado dispara esta auditoría de unidad.

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

Só na África do SulSouth Africa onlySolo Sudáfrica A auditoria de unidade de merchandising é uma capacidade exclusiva de ZA. Toda a estrutura — condições (Good/Scuffed/Damaged-*), código de barras da unidade e fotos — existe apenas neste mercado. The merchandising unit audit is a ZA-exclusive capability. The whole structure — conditions (Good/Scuffed/Damaged-*), unit barcode and photos — exists only in this market. La auditoría de unidad de merchandising es una capacidad exclusiva de ZA. Toda la estructura — condiciones (Good/Scuffed/Damaged-*), código de barras de la unidad y fotos — existe solo en este mercado.

BR · CL · AR · PY · PE Não listam merchandisingAuditUnit em enabledMarkets — a transação não é disparada nesses mercados. As demais transações de merchandising que existem em BR/CL são outras (asset item tracking em ZA/CL; as de imagem/criação/anotação/ordem de serviço em BR) e têm docs próprios. They don't list merchandisingAuditUnit in enabledMarkets — the transaction is not fired in these markets. The other merchandising transactions that do exist in BR/CL are different (asset item tracking in ZA/CL; the image/creation/annotation/service-order ones in BR) and have their own docs. No listan merchandisingAuditUnit en enabledMarkets — la transacción no se dispara en estos mercados. Las demás transacciones de merchandising que sí existen en BR/CL son otras (asset item tracking en ZA/CL; las de imagen/creación/anotación/orden de servicio en BR) y tienen docs propios.