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.
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.
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:
- 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.
- 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á.
- 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.
- 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.
- 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.
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.
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.
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.
sendTransactionunaryrpc sendTransaction(InboxTransactionRequest) returns (InboxTransactionReply)
path /mn.bat.conectarep.dispatcher.DispatcherConectaRepService/sendTransaction
InboxTransactionRequestendpointstring· #1 · endpoint alvo (config de ambiente)target endpoint (environment config)endpoint destino (config de ambiente)serviceNamestring· #2 · discriminador —AuditUnitReport(sem prefixoPromo_: esta transação não tem promoção)discriminator —AuditUnitReport(noPromo_prefix: this transaction has no promotion)discriminador —AuditUnitReport(sin prefijoPromo_: esta transacción no tiene promoción)dateReferencestring· #3 ·AAAA-MM-DDdo envio (formatDate(submittedAt))YYYY-MM-DDof the submission (formatDate(submittedAt))AAAA-MM-DDdel envío (formatDate(submittedAt))transactionReferencestring· #4 · osfidda conta/loja (correlação)the account/storesfid(correlation)elsfidde la cuenta/tienda (correlación)usernamestring· #5messagestring· #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)manufacturerstring· #7 · dado do dispositivodevice datadato del dispositivomodelstring· #8 · dado do dispositivodevice datadato del dispositivodeviceUuidstring· #9 · literal provisório hoje (ver Pendências)provisional literal today (see Pending)literal provisional hoy (ver Pendientes)deviceVersionstring· #10tidint64· #11 · id de transação para idempotência/replaytransaction id for idempotency/replayid de transacción para idempotencia/replay
InboxTransactionReplystatusint32· #1 · status do ack (0 = sucesso)ack status (0 = success)status del ack (0 = éxito)messagestring· #2 · mensagem do backendbackend messagemensaje del backendtransactionIdint32· #3 · id atribuído pelo backend (correlação)backend-assigned id (correlation)id asignado por el backend (correlación)
Envelope → Request
O builder devolve um DispatcherEnvelope (type, serviceName, payload, account, transactionReference, dateReference). O 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.
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
- serializa + authserialize + authserializa + authDispatcherGateway
- SubmitMerchandisingAuditUnitUseCaseDispatcherOrchestratordispatch()
- devolvereturnsdevuelveDispatcherEnvelope
- build()BuildMerchandisingAuditUnitDispatcherPayloadUseCasemonta o wireassembles the wirearma el wire
- reúne entities cruas + fotos base64gathers raw entities + base64 photosreúne entities crudas + fotos base64MerchandisingAuditUnitDispatcherPayloadInput
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.
| CampoFieldCampo | TipoTypeTipo | PapelRoleRol |
|---|---|---|
visit | VisitEntity | conta/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) |
resource | ResourceEntity | representante (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) |
asset | MerchandisingAssetEntity | unidade auditada: sfid → unitId, familyName → unitTypeName, items → data de instalaçãoaudited unit: sfid → unitId, familyName → unitTypeName, items → installation dateunidad auditada: sfid → unitId, familyName → unitTypeName, items → fecha de instalación |
conditions | List<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) |
selectedCondition | MerchandisingAuditCondition | → unitCondition (wireLabel) + unitConditionId |
barcodeValue | String | → numerBarcode |
barcodeImageBase64 | String | → imageBarcode |
unitImagesBase64 | List<String> | → unitImag1 / unitImag2 / unitImag3 |
submittedAt | DateTime | → auditDate + dateReference do envelope |
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 colunas — Campo 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 columns — JSON 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 columnas — Campo 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 JSON | TipoTypeTipo | Origem do DadoData sourceOrigen del Dato | RegraRuleRegla |
|---|---|---|---|
AuditUnitReport | object | data | objeto ú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 JSON TipoTypeTipo Origem do DadoData sourceOrigen del Dato RegraRuleRegla unitaryAuditTrackingIdstring Fixo: "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 unitIdstring input.asset.sfidsfid da unidade/asset auditadosfid of the audited unit/assetsfid de la unidad/asset auditado storeIdstring visit.accountData.sfid— storeCustomerCodestring account.customerCodecódigo de cliente/SAP da lojastore customer/SAP codecódigo de cliente/SAP de la tienda lenint Calculadoaccount.customerCode.length— comprimento do código de clienteaccount.customerCode.length— length of the customer codeaccount.customerCode.length— longitud del código de clientestoreCustomerNamestring account.name— storeRegionstring account.address?.fullAddress?? ""quando a conta não tem endereço?? ""when the account has no address?? ""cuando la cuenta no tiene direcciónunitTypeNamestring input.asset.familyNamefamília/tipo da unidadeunit family/typefamilia/tipo de la unidad auditDatestring formatTimestamp(submittedAt)timestamp cru DateTime.toString()(yyyy-MM-dd HH:mm:ss.mmmuuu) — ver PendênciasrawDateTime.toString()timestamp (yyyy-MM-dd HH:mm:ss.mmmuuu) — see Pendingtimestamp crudoDateTime.toString()(yyyy-MM-dd HH:mm:ss.mmmuuu) — ver PendientesinstallationDatestring CalculadoinstalledDatedo item instalado desta conta, formatadoyyyy-MM-dd;""se não há item/datainstalledDateof this account's installed item, formattedyyyy-MM-dd;""if no item/dateinstalledDatedel ítem instalado de esta cuenta, formateadoyyyy-MM-dd;""si no hay ítem/fechaunitConditionIdstring Calculadoconditions.indexOf(selectedCondition).toString()— índice na lista disponívelconditions.indexOf(selectedCondition).toString()— index in the available listconditions.indexOf(selectedCondition).toString()— índice en la lista disponibleunitConditionstring selectedCondition.wireLabelGood/Scuffed/Damaged-Repairable/Damaged-Beyond RepairGood/Scuffed/Damaged-Repairable/Damaged-Beyond RepairGood/Scuffed/Damaged-Repairable/Damaged-Beyond RepairnumerBarcodestring input.barcodeValuechave com typo ( numer) mantida verbatim (contrato)misspelled key (numer) kept verbatim (contract)clave con typo (numer) mantenida verbatim (contrato)imageBarcodestring input.barcodeImageBase64foto do código de barras em base64barcode photo in base64foto del código de barras en base64 auditedUserIdstring visit.visitResourceid do recurso da visita — não resource.sfidvisit resource id — notresource.sfidid del recurso de la visita — noresource.sfidauditedUserNamestring Calculadoprimeiro token de resource.name(capitalized);""se vaziofirst token ofresource.name(capitalized);""if emptyprimer token deresource.name(capitalized);""si vacíoauditedUserSurnamestring Calculadoúltimo token de resource.name(capitalized);""se o nome tem só um tokenlast token ofresource.name(capitalized);""if the name has a single tokenúltimo token deresource.name(capitalized);""si el nombre tiene un solo tokenunitImag1string _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) verbatimunitImag2string _imageAt(unitImagesBase64, 1)2ª foto base64; ""se ausente2nd base64 photo;""if absent2ª foto base64;""si ausenteunitImag3string _imageAt(unitImagesBase64, 2)3ª foto base64; ""se ausente3rd base64 photo;""if absent3ª foto base64;""si ausente
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:
| MerchandisingAuditCondition | code | wireLabel (unitCondition) |
|---|---|---|
good | good | Good |
scuffed | scuffed | Scuffed |
damagedRepairable | damaged_repairable | Damaged-Repairable |
damagedBeyondRepair | damaged_beyond_repair | Damaged-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.nameis 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.namese 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"".auditedUserIdvem devisit.visitResource(id do recurso da visita), não deresource.sfid. Ou seja: o id do auditor e o nome do auditor vêm de fontes diferentes.auditedUserIdcomes fromvisit.visitResource(the visit resource id), not fromresource.sfid. That is: the auditor's id and the auditor's name come from different sources.auditedUserIdviene devisit.visitResource(id del recurso de la visita), no deresource.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)devolveimages[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)returnsimages[index]or""if the index doesn't exist. The three slots (unitImag1..3) are always emitted: the missing ones ship as""._imageAt(images, index)devuelveimages[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 viaDateTimeUtils.formatTimestamp(submittedAt), que éDateTime.toString()cru — inclui frações de segundo (eZse UTC). Não é o formato ISO estrito das outras datas.auditDate: the send instant viaDateTimeUtils.formatTimestamp(submittedAt), which is rawDateTime.toString()— includes fractional seconds (andZif UTC). It's not the strict ISO format of the other dates.auditDate: el instante del envío víaDateTimeUtils.formatTimestamp(submittedAt), que esDateTime.toString()crudo — incluye fracciones de segundo (yZsi UTC). No es el formato ISO estricto de las otras fechas.installationDate:installedDatedo primeiroasset.itemscujoaccountSfidbate com a conta da visita, formatadoyyyy-MM-dd(DateFormatType.isoDate). Sem item correspondente ou sem data →"".installationDate: theinstalledDateof the firstasset.itemswhoseaccountSfidmatches the visit's account, formattedyyyy-MM-dd(DateFormatType.isoDate). No matching item or no date →"".installationDate: elinstalledDatedel primerasset.itemscuyoaccountSfidcoincide con la cuenta de la visita, formateadoyyyy-MM-dd(DateFormatType.isoDate). Sin ítem correspondiente o sin fecha →"".dateReference(no envelope, não no payload):formatDate(submittedAt)emyyyy-MM-dd.dateReference(on the envelope, not the payload):formatDate(submittedAt)inyyyy-MM-dd.dateReference(en el envelope, no en el payload):formatDate(submittedAt)enyyyy-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 oaccountdo envelope (DispatchAccountEntity) e otransactionReference(=sfid).The account comes fromvisit.accountData:storeId=sfid,storeCustomerCode=customerCode,storeCustomerName=name. The same account also feeds the envelopeaccount(DispatchAccountEntity) and thetransactionReference(=sfid).La cuenta viene devisit.accountData:storeId=sfid,storeCustomerCode=customerCode,storeCustomerName=name. La misma cuenta también alimenta elaccountdel envelope (DispatchAccountEntity) y eltransactionReference(=sfid). lené o comprimento decustomerCode— um campo de verificação que o contrato pede junto do código.lenis the length ofcustomerCode— a check field the contract asks for alongside the code.lenes la longitud decustomerCode— un campo de verificación que el contrato pide junto al código.storeRegionreutiliza ofullAddresscru da conta (não uma região dedicada);""quando não há endereço.storeRegionreuses the account's rawfullAddress(not a dedicated region);""when there's no address.storeRegionreutiliza elfullAddresscrudo de la cuenta (no una región dedicada);""cuando no hay dirección.
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 comoDateTime.toString()cru (com frações de segundo e possívelZ), não num formato ISO estrito — divergência de formato conhecida em relação às demais datas do payload.auditDate: emitted as rawDateTime.toString()(with fractional seconds and a possibleZ), not a strict ISO format — a known format divergence from the other payload dates.auditDate: emitido comoDateTime.toString()crudo (con fracciones de segundo y un posibleZ), 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(pornumber) eunitImag1/2/3(porimage).Misspelled keys kept verbatim by backend contract:numerBarcode(fornumber) andunitImag1/2/3(forimage).Claves con typo mantenidas verbatim por contrato del backend:numerBarcode(pornumber) yunitImag1/2/3(porimage). storeRegion: reaproveita ofullAddressda conta — não existe um campo de região dedicado; pode vir"".storeRegion: reuses the account'sfullAddress— there's no dedicated region field; may come as"".storeRegion: reaprovecha elfullAddressde la cuenta — no existe un campo de región dedicado; puede venir"".- Transporte:
deviceUuidvai como literal provisório no gateway (pendência conhecida do Dispatcher).Transport:deviceUuidships as a provisional literal in the gateway (known Dispatcher pending item).Transporte:deviceUuidva como literal provisional en el gateway (pendiente conocido del Dispatcher).
Transaçõ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.
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.