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

Envio de clave (clue)Clue uploadEnvío de clave (clue)

A transação de escrita que envia uma clave (clue) ao backend, via o Dispatcher. É a transação da feature clave, exclusiva do Chile. Um único builder monta o payload JSON a partir de dois contextos de origem — clave geográfica e clave de produto falsificado — que compartilham a mesma estrutura e diferem apenas por poucos campos e pelo valor de source. Toda a construção do contrato wire vive no builder. The write transaction that sends a clue to the backend, through the Dispatcher. It's the transaction of the clave feature, exclusive to Chile. A single builder assembles the JSON payload from two origin contexts — geographic clue and counterfeit-product clue — which share the same structure and differ only by a handful of fields and the source value. All wire-contract construction lives in the builder. La transacción de escritura que envía una clave (clue) al backend, vía el Dispatcher. Es la transacción de la feature clave, exclusiva de Chile. Un único builder arma el payload JSON a partir de dos contextos de origen — clave geográfica y clave de producto falsificado — que comparten la misma estructura y difieren solo por unos pocos campos y por el valor de source. Toda la construcción del contrato wire vive en el builder.

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

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

A clave é um registro que o representante de vendas envia ao backend para sinalizar uma situação no ponto de venta — a localização de um ponto de venda ou a presença de um produto falsificado. Quando o rep conclui o formulário de clave e toca em enviar, o app dispara esta transação. É um recurso exclusivo do Chile. A clue is a record the sales rep sends to the backend to flag a situation at the point of sale — the location of a retail or the presence of a counterfeit product. When the rep completes the clue form and taps send, the app fires this transaction. It's a Chile-only capability. La clave es un registro que el representante de ventas envía al backend para señalar una situación en el punto de venta — la ubicación de un punto de venta o la presencia de un producto falsificado. Cuando el rep completa el formulario de clave y toca enviar, la app dispara esta transacción. Es una capacidad exclusiva de Chile.

Existem dois contextos, escolhidos pela porta de entrada usada:There are two contexts, chosen by the entry point used:Existen dos contextos, elegidos por la puerta de entrada usada:

Clave geográficaGeographic clueClave geográfica

Registra a localização de um ponto de venda: tipo de PDV, endereço/mapa e se o produto está visível. Aberta pela Home.Records a retail's location: PDV type, address/map and whether the product is visible. Opened from Home.Registra la ubicación de un punto de venta: tipo de PDV, dirección/mapa y si el producto está visible. Se abre desde Home.

Clave de produto falsificadoCounterfeit-product clueClave de producto falsificado

Sinaliza produto falsificado num varejo de uma visita: produto visível e produto falsificado. Aberta pelo detalhe da visita.Flags a counterfeit product at a visit's retail: product visible and counterfeit product. Opened from the visit detail.Señala producto falsificado en un punto de venta de una visita: producto visible y producto falsificado. Se abre desde el detalle de la visita.

Escolha pela entradaChosen by entryElección por la entrada O rep não escolhe o contexto: ele é definido pela tela de onde a clave foi aberta. O gesto de envio é o mesmo nos dois casos — preencher o formulário e confirmar. The rep doesn't pick the context: it's set by the screen the clue was opened from. The send gesture is the same in both cases — fill the form and confirm. El rep no elige el contexto: lo define la pantalla desde la que se abrió la clave. El gesto de envío es el mismo en ambos casos — completar el formulario y confirmar.

02

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

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

  1. Abrir a claveOpen the clueAbrir la claveGeográfica: pela ação de clave na Home. Falsificado: pelos indicadores de status no detalhe da visita.Geographic: via the clue action on Home. Counterfeit: via the status indicators on the visit detail.Geográfica: por la acción de clave en Home. Falsificado: por los indicadores de estado en el detalle de la visita.
  2. Preencher o formulárioFill the formCompletar el formularioGeográfica: tipo de PDV, endereço/mapa, produto visível e informação adicional. Falsificado: produto visível, produto falsificado e informação adicional.Geographic: PDV type, address/map, product visible and additional information. Counterfeit: product visible, counterfeit product and additional information.Geográfica: tipo de PDV, dirección/mapa, producto visible e información adicional. Falsificado: producto visible, producto falsificado e información adicional.
  3. Confirmar o envioConfirm the sendConfirmar el envíoAo tocar em enviar, aparece uma confirmação (sim/não) antes do disparo.Tapping send shows a confirmation (yes/no) before firing.Al tocar enviar, aparece una confirmación (sí/no) antes del disparo.
  4. Enviar clave → esta transaçãoSend clue → this transactionEnviar clave → esta transacciónAo confirmar, o app dispara o Envio de clave. É este toque que aciona a transação.On confirming, the app fires Clue upload. This tap is what triggers the transaction.Al confirmar, la app dispara el Envío de clave. Este toque es lo que activa la transacción.

Flag de produto falsificadoCounterfeit flagFlag de producto falsificado No contexto de produto falsificado, além da clave, o app também marca o varejo com um indicador de produto ilegal — isso é uma atualização de varejo separada, disparada logo após a clave. In the counterfeit context, besides the clue, the app also flags the retail with an illegal-product indicator — that's a separate retail update, fired right after the clue. En el contexto de falsificado, además de la clave, la app también marca el punto de venta con un indicador de producto ilegal — eso es una actualización de punto de venta separada, disparada justo después de la clave.

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 mostra uma confirmação de sucesso e volta à tela anterior. Se falha, mostra uma mensagem de erro e o rep continua no formulário.When the backend accepts it, the app shows a success confirmation and returns to the previous screen. On failure, it shows an error message and the rep stays on the form.Cuando el backend lo acepta, la app muestra una confirmación de éxito y vuelve a la pantalla anterior. Si falla, muestra un mensaje de error y el rep permanece en el formulario.
Sem internetOfflineSin internet
O envio pode entrar em fila e ser reenviado quando a conexão volta — a clave não se perde. Um reenvio pode, em tese, duplicar; o sistema usa um identificador de transação para evitar isso.The send may be queued and retried when the connection returns — the clue isn't lost. A retry could, in theory, duplicate; the system uses a transaction id to avoid that.El envío puede quedar en cola y reintentarse cuando vuelve la conexión — la clave no se pierde. Un reenvío podría, en teoría, duplicar; el sistema usa un identificador de transacción para evitarlo.
Acompanhar o envioTracking the sendSeguir el envío
O status técnico do despacho (enviado, em fila, com erro) pode ser acompanhado na central de dados / tracking de despachos do app — útil para suporte investigar um envío.The dispatch's technical status (sent, queued, errored) can be followed in the app's data center / dispatch tracking — useful for support to investigate a send.El estado técnico del despacho (enviado, en cola, con error) puede seguirse en el centro de datos / tracking de despachos de la app — útil para que soporte investigue un envío.
04

Visão técnicaTechnical overviewVisión técnica

Envio de clave é a transação de saída que persiste uma clave no backend. É disparada pelo ClaveNotifier quando o representante de vendas conclui o formulário de clave. A feature clave é a fonte; ambos os contextos (geográfico e falsificado) usam o mesmo builder e o mesmo serviceName. Clue upload is the outbound transaction that persists a clue in the backend. It's fired by the ClaveNotifier when the sales rep completes the clue form. The clave feature is the source; both contexts (geographic and counterfeit) use the same builder and the same serviceName. Envío de clave es la transacción de salida que persiste una clave en el backend. La dispara el ClaveNotifier cuando el representante de ventas completa el formulario de clave. La feature clave es la fuente; ambos contextos (geográfico y falsificado) usan el mismo builder y el mismo serviceName.

Uma transação, 2 contextosOne transaction, 2 contextsUna transacción, 2 contextos

O mesmo builder cobre clave geográfica e de produto falsificado. O contexto é derivado pelo notifier — o único sinal no payload é o campo source.The same builder covers geographic and counterfeit clues. The context is derived by the notifier — the only signal in the payload is the source field.El mismo builder cubre clave geográfica y de producto falsificado. El contexto lo deriva el notifier — la única señal en el payload es el campo source.

Payload enxutoLean payloadPayload compacto

O contrato wire é um único objeto de 11 campos dentro do array ClueUploadDetails. O builder é o dono único de toda a montagem.The wire contract is a single 11-field object inside the ClueUploadDetails array. The builder is the sole owner of the whole assembly.El contrato wire es un único objeto de 11 campos dentro del array ClueUploadDetails. El builder es el dueño único de todo el armado.

RPC genéricoGeneric RPCRPC genérico

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

FontesSourcesFuentes BuildClueUploadDispatcherPayloadUseCase + ClueUploadDispatcherPayloadInput + DispatcherType + DispatcherConectaRep.proto. O input carrega entities cruas de domínio (CLAUDE.md §36); o build() constrói todo o wire. BuildClueUploadDispatcherPayloadUseCase + ClueUploadDispatcherPayloadInput + DispatcherType + DispatcherConectaRep.proto. The input carries raw domain entities (CLAUDE.md §36); build() constructs the entire wire. BuildClueUploadDispatcherPayloadUseCase + ClueUploadDispatcherPayloadInput + 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 · discriminadorClueUploadAPI (sem prefixo Promo_: hasPromotion: false)discriminatorClueUploadAPI (no Promo_ prefix: hasPromotion: false)discriminadorClueUploadAPI (sin prefijo Promo_: hasPromotion: 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 resourceSfid derivado (correlação)the derived resourceSfid (correlation)el resourceSfid derivado (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, transactionReference, dateReference). O DispatcherGateway serializa payload em JSON para message, copia serviceName/dateReference/transactionReference, preenche os campos de dispositivo e o bearer token de auth, e chama o RPC. O destino do DispatcherType.clue é salesforce (default). The builder returns a DispatcherEnvelope (type, serviceName, payload, transactionReference, dateReference). The DispatcherGateway serializes payload to JSON into message, copies serviceName/dateReference/transactionReference, fills in the device fields and the auth bearer token, and calls the RPC. The DispatcherType.clue destination is salesforce (default). El builder devuelve un DispatcherEnvelope (type, serviceName, payload, transactionReference, dateReference). El DispatcherGateway serializa payload a JSON en message, copia serviceName/dateReference/transactionReference, completa los campos del dispositivo y el bearer token de auth, y llama al RPC. El destino del DispatcherType.clue es salesforce (default).

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

06

Contextos e serviceNameContexts & serviceNameContextos y serviceName

Diferente do envio de pedido, a clave tem um único DispatcherType (clueClueUploadAPI) e sem variantes de serviceName. O que muda são os dois contextos de origem, decididos no ClaveNotifier por ClaveEntry. Ambos compartilham a mesma estrutura de payload; divergem só em source, em quais campos são preenchidos e no que dispara depois.Unlike order placement, the clue has a single DispatcherType (clueClueUploadAPI) and no serviceName variants. What changes are the two origin contexts, decided in ClaveNotifier by ClaveEntry. Both share the same payload structure; they diverge only in source, in which fields are filled and in what fires afterwards.A diferencia del envío de pedido, la clave tiene un único DispatcherType (clueClueUploadAPI) y sin variantes de serviceName. Lo que cambia son los dos contextos de origen, decididos en ClaveNotifier por ClaveEntry. Ambos comparten la misma estructura de payload; divergen solo en source, en qué campos se completan y en lo que dispara después.

ContextoContextContexto source EntradaEntryEntrada DivergênciaDivergenceDivergencia
ClaveEntry.geographicPOS OUT BATHome → ação de claveHome → clue actionHome → acción de clavetypePdv = nome do tipo de PDV selecionado. Preenche address/latitude/longitude. productF não é enviado (null). Sem contexto de visita.typePdv = selected PDV type name. Fills address/latitude/longitude. productF not sent (null). No visit context.typePdv = nombre del tipo de PDV seleccionado. Completa address/latitude/longitude. productF no se envía (null). Sin contexto de visita.
ClaveEntry.counterfeitPOS BATDetalhe da visita → indicadores de statusVisit detail → status indicatorsDetalle de la visita → indicadores de estadotypePdv = account.customerCode. Preenche productF. address/latitude/longitude ficam nos defaults (""/0.0). Dispara também a flag de varejo (ver Pendências).typePdv = account.customerCode. Fills productF. address/latitude/longitude stay at defaults (""/0.0). Also fires the retail flag (see Pending).typePdv = account.customerCode. Completa productF. address/latitude/longitude quedan en los defaults (""/0.0). Dispara también la flag de punto de venta (ver Pendientes).

Sem prefixo Promo_No Promo_ prefixSin prefijo Promo_ O builder chama type.resolveServiceName(hasPromotion: false) fixo — a clave nunca leva o prefixo Promo_. O serviceName é sempre ClueUploadAPI. The builder calls type.resolveServiceName(hasPromotion: false) fixed — the clue never carries the Promo_ prefix. The serviceName is always ClueUploadAPI. El builder llama type.resolveServiceName(hasPromotion: false) fijo — la clave nunca lleva el prefijo Promo_. El serviceName es siempre ClueUploadAPI.

07

Como é disparadoHow it's firedCómo se dispara

A transação é orquestrada pelo ClaveNotifier (remote-first, §36). O notifier apenas reúne entities cruas e valores injetados; o builder é o dono único da derivação de resourceSfid e da formatação de data. A cascata:The transaction is orchestrated by the ClaveNotifier (remote-first, §36). The notifier only gathers raw entities and injected values; the builder is the sole owner of the resourceSfid derivation and date formatting. The cascade:La transacción se orquesta desde el ClaveNotifier (remote-first, §36). El notifier solo reúne entities crudas y valores inyectados; el builder es el dueño único de la derivación de resourceSfid y del formateo de fecha. La cascada:

  • ClaveNotifiersubmit()
    • reúne entities cruas + injetadosgathers raw entities + injectedreúne entities crudas + inyectadosClueUploadDispatcherPayloadInput
      • build()BuildClueUploadDispatcherPayloadUseCasemonta o wireassembles the wirearma el wire
        • devolvereturnsdevuelveDispatcherEnvelope
          • SubmitClueUploadUseCaseDispatcherRepository
            • serializa + authserialize + authserializa + authDispatcherGateway
              • sendTransactionBackendgRPC

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

ClueUploadDispatcherPayloadInput (Freezed). Carrega o dado como existe no domínio; nada de formato wire. O relógio chega como submittedAt (via DateTimeUtils.now()); a ResourceEntity chega crua e o builder deriva o resourceSfid.ClueUploadDispatcherPayloadInput (Freezed). Carries data as it exists in the domain; no wire shaping. The clock arrives as submittedAt (via DateTimeUtils.now()); the ResourceEntity arrives raw and the builder derives the resourceSfid.ClueUploadDispatcherPayloadInput (Freezed). Lleva el dato como existe en el dominio; nada de formato wire. El reloj llega como submittedAt (vía DateTimeUtils.now()); la ResourceEntity llega cruda y el builder deriva el resourceSfid.

CampoFieldCampoTipoTypeTipoPapelRoleRol
sourceClueSourceposBat (falsificado) / posOutBat (geográfica) → sourceposBat (counterfeit) / posOutBat (geographic) → sourceposBat (falsificado) / posOutBat (geográfica) → source
typePdvStringnome do tipo de PDV (geográfica) ou customerCode da conta (falsificado)PDV type name (geographic) or account customerCode (counterfeit)nombre del tipo de PDV (geográfica) o customerCode de la cuenta (falsificado)
resourceResourceEntityrepresentante de vendas (cru — o builder deriva resourceSfid)sales rep (raw — the builder derives resourceSfid)representante de ventas (crudo — el builder deriva resourceSfid)
submittedAtDateTimerelógio do envio (DateTimeUtils.now()) → submissionDate + dateReferencesubmission clock (DateTimeUtils.now()) → submissionDate + dateReferencereloj del envío (DateTimeUtils.now()) → submissionDate + dateReference
visibleProductbool?produto visível (dropdown sim/não) → visibleProductproduct visible (yes/no dropdown) → visibleProductproducto visible (dropdown sí/no) → visibleProduct
productFbool?produto falsificado → productF (só falsificado; null na geográfica)counterfeit product → productF (counterfeit only; null in geographic)producto falsificado → productF (solo falsificado; null en geográfica)
additionalInformationString · ""texto livre → additionalInformationfree text → additionalInformationtexto libre → additionalInformation
addressString · ""endereço do mapa (geográfica) → addressmap address (geographic) → addressdirección del mapa (geográfica) → address
latitude / longitudedouble · 0.0posição do mapa (geográfica) → latitude/longitudemap position (geographic) → latitude/longitudeposición del mapa (geográfica) → latitude/longitude
hasDnpRespondebool · falsehasDnpResponde (notifier injeta true nos dois fluxos)hasDnpResponde (notifier injects true in both flows)hasDnpResponde (el notifier inyecta true en ambos flujos)
08

Payload (message)

O JSON serializado no campo message do request. As tabelas abaixo têm 4 colunasCampo JSON · Tipo · Origem do Dado · Regra — e listam toda chave que o build() emite (12 no total: 1 raiz + 11 no objeto). Campo, Tipo e Origem são código cru; só a Regra é prosa. Um exemplo completo (contexto geográfico/CL) está em transaction_example.json, ao lado deste doc.The JSON serialized into the request's message field. The tables below have 4 columnsJSON field · Type · Data source · Rule — and list every key that build() emits (12 total: 1 root + 11 in the object). Field, Type and Source are raw code; only Rule is prose. A full example (geographic/CL context) sits in transaction_example.json, next to this doc.El JSON serializado en el campo message del request. Las tablas abajo tienen 4 columnasCampo JSON · Tipo · Origen del Dato · Regla — y listan toda clave que build() emite (12 en total: 1 raíz + 11 en el objeto). Campo, Tipo y Origen son código crudo; solo la Regla es prosa. Un ejemplo completo (contexto geográfico/CL) está en transaction_example.json, junto a este doc.

Raiz do payloadPayload rootRaíz del payload

Campo JSONTipoTypeTipoOrigem do DadoData sourceOrigen del DatoRegraRuleRegla
ClueUploadDetailsarray[clue]array de um único objeto (a clave)single-element array (the clue)array de un solo objeto (la clave)
  • ClueUploadDetails[] objeto únicosingle objectobjeto único 11 camposfieldscampos
    Campo JSONTipoTypeTipoOrigem do DadoData sourceOrigen del DatoRegraRuleRegla
    typePdvstringinput.typePdvgeográfica → nome do tipo de PDV; falsificado → account.customerCodegeographic → PDV type name; counterfeit → account.customerCodegeográfica → nombre del tipo de PDV; falsificado → account.customerCode
    visibleProductbool?input.visibleProductproduto visível; null se não respondido (sem coerção)product visible; null if unanswered (no coercion)producto visible; null si no respondido (sin coerción)
    productFbool?input.productFproduto falsificado; só no contexto falsificado, senão nullcounterfeit product; counterfeit context only, else nullproducto falsificado; solo en el contexto falsificado, si no null
    additionalInformationstringinput.additionalInformationtexto livre; default ""free text; defaults to ""texto libre; default ""
    addressstringinput.addressgeográfica → endereço do mapa; falsificado → ""geographic → map address; counterfeit → ""geográfica → dirección del mapa; falsificado → ""
    latitudedoubleinput.latitudegeográfica → lat do mapa; falsificado → 0.0geographic → map lat; counterfeit → 0.0geográfica → lat del mapa; falsificado → 0.0
    longitudedoubleinput.longitudegeográfica → long do mapa; falsificado → 0.0geographic → map long; counterfeit → 0.0geográfica → long del mapa; falsificado → 0.0
    resourceSfidstringDerivadoresource.isPrimaryResource ? primaryResourceSfid : secondaryResourceSfidresource.isPrimaryResource ? primaryResourceSfid : secondaryResourceSfidresource.isPrimaryResource ? primaryResourceSfid : secondaryResourceSfid
    submissionDatestringinput.submittedAtformato yyyy-MM-dd HH:mm:ss (isoDateTime)yyyy-MM-dd HH:mm:ss format (isoDateTime)formato yyyy-MM-dd HH:mm:ss (isoDateTime)
    sourcestringinput.source.valuePOS BAT (falsificado) / POS OUT BAT (geográfica)POS BAT (counterfeit) / POS OUT BAT (geographic)POS BAT (falsificado) / POS OUT BAT (geográfica)
    hasDnpRespondeboolinput.hasDnpRespondeo notifier injeta true nos dois fluxos (default da entity é false). Chave com typo mantida verbatim (ver Pendências)the notifier injects true in both flows (entity default is false). Misspelled key kept verbatim (see Pending)el notifier inyecta true en ambos flujos (el default de la entity es false). Clave con typo mantenida verbatim (ver Pendientes)
09

Regras de negócioBusiness rulesReglas de negocio

  • Derivação de resourceSfidresourceSfid derivationDerivación de resourceSfid resourceSfid · transactionReference
    • O resourceSfid é derivado no builder: isPrimaryResource escolhe entre primaryResourceSfid e secondaryResourceSfid. O mesmo valor vira também o transactionReference do envelope (correlação).The resourceSfid is derived in the builder: isPrimaryResource picks between primaryResourceSfid and secondaryResourceSfid. The same value also becomes the envelope's transactionReference (correlation).El resourceSfid se deriva en el builder: isPrimaryResource elige entre primaryResourceSfid y secondaryResourceSfid. El mismo valor también se convierte en el transactionReference del envelope (correlación).
  • DatasDatesFechas submissionDate · dateReference
    • Ambas derivam do mesmo submittedAt: submissionDate no payload usa yyyy-MM-dd HH:mm:ss (isoDateTime); o dateReference do envelope usa yyyy-MM-dd (isoDate, o default de formatDate).Both derive from the same submittedAt: submissionDate in the payload uses yyyy-MM-dd HH:mm:ss (isoDateTime); the envelope's dateReference uses yyyy-MM-dd (isoDate, the formatDate default).Ambas derivan del mismo submittedAt: submissionDate en el payload usa yyyy-MM-dd HH:mm:ss (isoDateTime); el dateReference del envelope usa yyyy-MM-dd (isoDate, el default de formatDate).
  • Sobrecarga de typePdvtypePdv overloadSobrecarga de typePdv typePdv · source
    • O mesmo campo typePdv carrega semânticas diferentes por contexto: na clave geográfica é o nome do tipo de PDV selecionado; na de produto falsificado é o customerCode da conta da visita. O source é o único sinal explícito de qual contexto gerou a clave.The same typePdv field carries different semantics per context: in the geographic clue it's the selected PDV type name; in the counterfeit one it's the visit account's customerCode. The source is the only explicit signal of which context produced the clue.El mismo campo typePdv lleva semánticas distintas por contexto: en la clave geográfica es el nombre del tipo de PDV seleccionado; en la de producto falsificado es el customerCode de la cuenta de la visita. El source es la única señal explícita de qué contexto generó la clave.
  • Remote-first + guard de sessãoRemote-first + session guardRemote-first + guard de sesión submit() · canSave
    • O submit() exige state.canSave e um ResourceEntity resolvido de currentResourceProvider antes de montar o input; sem sessão, retorna falha e não dispara. O SubmitClueUploadUseCase persiste remote-first (§36).submit() requires state.canSave and a ResourceEntity resolved from currentResourceProvider before building the input; with no session it returns a failure and doesn't fire. SubmitClueUploadUseCase persists remote-first (§36).submit() exige state.canSave y un ResourceEntity resuelto de currentResourceProvider antes de armar el input; sin sesión, retorna falla y no dispara. SubmitClueUploadUseCase persiste remote-first (§36).
10

Pendências / roadmapPending / roadmapPendientes / roadmap

Observações fiéis ao estado atual do código (nunca descritas como se já estivessem resolvidas):Notes faithful to the current code state (never described as already resolved):Observaciones fieles al estado actual del código (nunca descritas como ya resueltas):

Pendente / atençãoPending / cautionPendiente / atención

  • hasDnpResponde: chave com typo aparente (contrato do backend, mantida verbatim). O notifier injeta true nos dois fluxos, embora o default da entity seja false — não há caminho hoje que envie false.hasDnpResponde: apparent-typo key (backend contract, kept verbatim). The notifier injects true in both flows, though the entity default is false — no path today sends false.hasDnpResponde: clave con typo aparente (contrato del backend, mantenida verbatim). El notifier inyecta true en ambos flujos, aunque el default de la entity sea false — ningún camino hoy envía false.
  • visibleProduct / productF: nulláveis — vão ao wire como null se não respondidos (o builder não força um default booleano).visibleProduct / productF: nullable — go to the wire as null if unanswered (the builder doesn't force a boolean default).visibleProduct / productF: nullables — van al wire como null si no se responden (el builder no fuerza un default booleano).
  • Contexto falsificado: além desta clave, o ClaveNotifier dispara uma segunda transaçãoRetailerUpload (isEmLovResponse: true) marcando account.hasIllegalProducts = true. É um envio separado, fora deste payload; se a clave falha, a flag não é enviada.Counterfeit context: besides this clue, the ClaveNotifier fires a second transactionRetailerUpload (isEmLovResponse: true) flagging account.hasIllegalProducts = true. It's a separate send, outside this payload; if the clue fails, the flag isn't sent.Contexto falsificado: además de esta clave, el ClaveNotifier dispara una segunda transacciónRetailerUpload (isEmLovResponse: true) marcando account.hasIllegalProducts = true. Es un envío separado, fuera de este payload; si la clave falla, la flag no se envía.
  • Transporte: deviceUuid vai como literal provisório no gateway (pendência conhecida do Dispatcher, comum a todas as transações).Transport: deviceUuid ships as a provisional literal in the gateway (known Dispatcher pending item, common to all transactions).Transporte: deviceUuid va como literal provisional en el gateway (pendiente conocido del Dispatcher, común a todas las transacciones).

MercadosMarketsMercados

A disponibilidade da transação vem do DispatcherType.clue.enabledMarkets, que lista apenas o Chile. Nenhum outro mercado dispara o Envio de clave.Transaction availability comes from DispatcherType.clue.enabledMarkets, which lists only Chile. No other market fires Clue upload.La disponibilidad de la transacción viene de DispatcherType.clue.enabledMarkets, que lista solo Chile. Ningún otro mercado dispara el Envío de clave.

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

Só no ChileChile onlySolo Chile A feature de clave e esta transação existem apenas no Chile. Os dois contextos (geográfico e produto falsificado) valem só para CL; o source (POS OUT BAT / POS BAT) diferencia a origem dentro do mercado. The clave feature and this transaction exist only in Chile. Both contexts (geographic and counterfeit) apply to CL only; the source (POS OUT BAT / POS BAT) distinguishes the origin within the market. La feature de clave y esta transacción existen solo en Chile. Los dos contextos (geográfico y producto falsificado) aplican solo a CL; el source (POS OUT BAT / POS BAT) diferencia el origen dentro del mercado.

BR · ZA · AR · PY · PE Nenhum outro mercado lista clue em enabledMarkets — a transação não é disparada fora do Chile. No other market lists clue in enabledMarkets — the transaction is not fired outside Chile. Ningún otro mercado lista clue en enabledMarkets — la transacción no se dispara fuera de Chile.