Placa do veículoCar license platePlaca del vehículo
A transação de escrita que informa ao backend a placa do veículo usado pelo representante de vendas na jornada do dia. É disparada junto do registro do odômetro no início da jornada, quando o mercado exige a placa. O payload é enxuto — apenas cinco campos — e todo o formato wire vive no builder. The write transaction that reports the sales rep's vehicle license plate for the day's journey to the backend. It's fired alongside the odometer reading at the start of the journey, when the market requires the plate. The payload is lean — just five fields — and all wire shaping lives in the builder. La transacción de escritura que informa al backend la placa del vehículo usado por el representante de ventas en la jornada del día. Se dispara junto con el registro del odómetro al inicio de la jornada, cuando el mercado exige la placa. El payload es escueto — solo cinco campos — y todo el formato wire vive en el builder.
O que é e quando aconteceWhat it is and when it happensQué es y cuándo ocurre
No início do dia, o representante de vendas abre a jornada registrando o odômetro do veículo. Em mercados que pedem, ele também informa a placa do veículo. Ao confirmar, o app envia a placa ao backend por esta transação, para que o sistema saiba qual veículo está sendo usado naquela jornada. At the start of the day, the sales rep opens the journey by recording the vehicle's odometer. In markets that ask for it, they also enter the vehicle's plate. On confirmation, the app sends the plate to the backend through this transaction, so the system knows which vehicle is being used for that journey. Al inicio del día, el representante de ventas abre la jornada registrando el odómetro del vehículo. En los mercados que lo piden, también informa la placa del vehículo. Al confirmar, la app envía la placa al backend por esta transacción, para que el sistema sepa qué vehículo se usa en esa jornada.
Depende do mercadoMarket-dependentDepende del mercado O campo de placa só aparece na jornada quando a configuração do mercado o habilita. Se o mercado não pede placa, a jornada é aberta só com o odômetro e esta transação não é disparada. The plate field only shows in the journey when the market's configuration enables it. If the market doesn't ask for a plate, the journey opens with the odometer alone and this transaction is not fired. El campo de placa solo aparece en la jornada cuando la configuración del mercado lo habilita. Si el mercado no pide placa, la jornada se abre solo con el odómetro y esta transacción no se dispara.
Placa válidaValid platePlaca válida Quando o mercado exige validação, o app só envia se a placa estiver num formato brasileiro válido — o padrão antigo (três letras + quatro números) ou o padrão Mercosul (três letras, um número, uma letra, dois números). When the market requires validation, the app only sends if the plate is in a valid Brazilian format — the legacy pattern (three letters + four digits) or the Mercosul pattern (three letters, one digit, one letter, two digits). Cuando el mercado exige validación, la app solo envía si la placa tiene un formato brasileño válido — el patrón antiguo (tres letras + cuatro números) o el patrón Mercosur (tres letras, un número, una letra, dos números).
Fluxo de telas que disparaScreen flow that fires itFlujo de pantallas que lo dispara
A transação é o passo de envio da placa dentro da abertura de jornada. As telas pertencem à feature de Jornada; aqui só situamos onde o envio acontece:The transaction is the plate-send step inside opening a journey. The screens belong to the Journey feature; here we only place where the send happens:La transacción es el paso de envío de la placa dentro de la apertura de jornada. Las pantallas pertenecen a la feature de Jornada; aquí solo situamos dónde ocurre el envío:
- Abrir a jornadaOpen the journeyAbrir la jornadaO rep inicia o dia e a tela de jornada pede o odômetro do veículo.The rep starts the day and the journey screen asks for the vehicle odometer.El rep inicia el día y la pantalla de jornada pide el odómetro del vehículo.
- Informar a placaEnter the plateInformar la placaQuando o mercado pede, aparece também o campo de placa do veículo.When the market asks for it, the vehicle plate field also appears.Cuando el mercado lo pide, aparece también el campo de placa del vehículo.
- Confirmar → esta transaçãoConfirm → this transactionConfirmar → esta transacciónAo confirmar a abertura, o app grava o odômetro e, em seguida, dispara o envio da placa. É este passo que aciona a transação.On confirming the opening, the app records the odometer and then fires the plate send. This step is what triggers the transaction.Al confirmar la apertura, la app graba el odómetro y luego dispara el envío de la placa. Este paso es lo que activa la transacción.
Odômetro é outra transaçãoOdometer is another transactionEl odómetro es otra transacción O registro do odômetro em si é enviado por uma transação irmã — 29 · Odômetro da jornada. A placa e o odômetro viajam em envios separados, disparados na mesma tela. The odometer reading itself is sent by a sister transaction — 29 · Odometer (journey). Plate and odometer travel in separate sends, fired on the same screen. El registro del odómetro se envía por una transacción hermana — 29 · Odómetro de la jornada. La placa y el odómetro viajan en envíos separados, disparados en la misma pantalla.
Depois do envioAfter sendingDespués del envío
- Confirmação ao repConfirmation to the repConfirmación al rep
- Quando o backend aceita a placa, a jornada segue e a placa fica guardada também no dispositivo, para reaproveitamento nos próximos dias. Se o envio falha, o app avisa e a abertura não conclui a etapa da placa.When the backend accepts the plate, the journey proceeds and the plate is also stored on the device for reuse on following days. If the send fails, the app warns and the opening doesn't complete the plate step.Cuando el backend acepta la placa, la jornada continúa y la placa queda guardada también en el dispositivo, para reutilizarla los próximos días. Si el envío falla, la app avisa y la apertura no completa el paso de la placa.
- Sem internetOfflineSin internet
- O envio pode entrar em fila e ser reenviado quando a conexão volta. Um reenvío pode, em tese, repetir o registro da placa; o sistema usa um identificador de transação para mitigar isso.The send may be queued and retried when the connection returns. A retry could, in theory, repeat the plate record; the system uses a transaction id to mitigate that.El envío puede quedar en cola y reintentarse cuando vuelve la conexión. Un reenvío podría, en teoría, repetir el registro de la placa; el sistema usa un identificador de transacción para mitigarlo.
- 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
Placa do veículo é uma transação de saída leve que envia a placa informada na abertura de jornada. É disparada pelo JourneyNotifier.startJourney logo após o registro do odômetro, e só quando o campo de placa está visível para o tipo de representante no mercado ativo.
Car license plate is a lightweight outbound transaction that sends the plate entered when opening a journey. It's fired by JourneyNotifier.startJourney right after the odometer record, and only when the plate field is visible for the rep type in the active market.
Placa del vehículo es una transacción de salida ligera que envía la placa informada al abrir la jornada. La dispara JourneyNotifier.startJourney justo después del registro del odómetro, y solo cuando el campo de placa está visible para el tipo de representante en el mercado activo.
Payload de 5 campos5-field payloadPayload de 5 campos
O contrato wire tem apenas cinco chaves planas: placa, sfid e login do rep, carimbo de data e flag de placa comercial. Sem sub-objetos nem arrays.The wire contract has just five flat keys: plate, rep sfid and login, timestamp and trade-plate flag. No sub-objects or arrays.El contrato wire tiene solo cinco claves planas: placa, sfid y login del rep, marca de fecha y flag de placa comercial. Sin sub-objetos ni arrays.
Placa normalizadaNormalized platePlaca normalizada
A placa vai em maiúsculas e sem separadores — VehiclePlateUtils.normalize remove tudo que não é letra ou número antes de enviar.The plate is sent upper-cased and without separators — VehiclePlateUtils.normalize strips anything that isn't a letter or a digit before sending.La placa va en mayúsculas y sin separadores — VehiclePlateUtils.normalize elimina todo lo que no sea letra o número antes de enviar.
RPC genéricoGeneric RPCRPC genérico
Não há RPC próprio: tudo passa pelo mesmo sendTransaction, com o JSON serializado no campo message e serviceName = CarLicensePlate como discriminador.There's no dedicated RPC: everything goes through the same sendTransaction, with the JSON serialized into message and serviceName = CarLicensePlate as the discriminator.No hay RPC propio: todo pasa por el mismo sendTransaction, con el JSON serializado en message y serviceName = CarLicensePlate como discriminador.
FontesSourcesFuentes
BuildCarLicensePlateDispatcherPayloadUseCase + CarLicensePlateDispatcherPayloadInput + DispatcherType.odometerCarPlate + DispatcherConectaRep.proto. O input carrega entities cruas de domínio (CLAUDE.md §36); o build() constrói todo o wire.
BuildCarLicensePlateDispatcherPayloadUseCase + CarLicensePlateDispatcherPayloadInput + DispatcherType.odometerCarPlate + DispatcherConectaRep.proto. The input carries raw domain entities (CLAUDE.md §36); build() constructs the entire wire.
BuildCarLicensePlateDispatcherPayloadUseCase + CarLicensePlateDispatcherPayloadInput + DispatcherType.odometerCarPlate + 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, aqui CarLicensePlate) 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, here CarLicensePlate) 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, aquí CarLicensePlate) 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 —CarLicensePlate(sem prefixoPromo_:hasPromotion = false)discriminator —CarLicensePlate(noPromo_prefix:hasPromotion = false)discriminador —CarLicensePlate(sin prefijoPromo_:hasPromotion = false)dateReferencestring· #3 ·AAAA-MM-DDdo envio (submittedAt, formatoisoDate)YYYY-MM-DDof the submission (submittedAt,isoDateformat)AAAA-MM-DDdel envío (submittedAt, formatoisoDate)transactionReferencestring· #4 · osfiddo representante (correlação)the repsfid(correlation)elsfiddel representante (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, 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 é batchApi (sfbatchapi).
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 destination is batchApi (sfbatchapi).
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 es batchApi (sfbatchapi).
Para esta transação, resendMayDuplicate == true: um reenvío (ex.: recuperação de fila offline) pode duplicar o registro da placa no backend; a idempotência via tid é o que mitiga isso.For this transaction, resendMayDuplicate == true: a resend (e.g. offline-queue recovery) may duplicate the plate record on the backend; idempotency via tid is what mitigates it.Para esta transacción, resendMayDuplicate == true: un reenvío (p. ej. recuperación de cola offline) puede duplicar el registro de la placa 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 fluxo de jornada (remote-first, §36). O notifier apenas reúne entities cruas e o relógio; o builder é o dono único de toda normalização, formatação de data e derivação wire. A cascata:The transaction is orchestrated by the journey flow (remote-first, §36). The notifier only gathers raw entities and the clock; the builder is the sole owner of all normalization, date formatting and wire derivation. The cascade:La transacción se orquesta desde el flujo de jornada (remote-first, §36). El notifier solo reúne entities crudas y el reloj; el builder es el dueño único de toda normalización, formateo de fecha y derivación wire. La cascada:
- JourneyNotifierstartJourney
- reúne entities cruas + relógiogathers raw entities + clockreúne entities crudas + relojCarLicensePlateDispatcherPayloadInput
- build()BuildCarLicensePlateDispatcherPayloadUseCasemonta o wireassembles the wirearma el wire
- devolvereturnsdevuelveDispatcherEnvelope
- SubmitCarLicensePlateUseCaseDispatcherOrchestrator
- serializa + authserialize + authserializa + authDispatcherGateway
- sendTransactionBackendgRPC
- serializa + authserialize + authserializa + authDispatcherGateway
- SubmitCarLicensePlateUseCaseDispatcherOrchestrator
- devolvereturnsdevuelveDispatcherEnvelope
- build()BuildCarLicensePlateDispatcherPayloadUseCasemonta o wireassembles the wirearma el wire
- reúne entities cruas + relógiogathers raw entities + clockreúne entities crudas + relojCarLicensePlateDispatcherPayloadInput
O input (entities cruas)The input (raw entities)El input (entities crudas)
CarLicensePlateDispatcherPayloadInput (Freezed). Carrega o dado como existe no domínio; nada de formato wire. O relógio chega como submittedAt (via DateTimeUtils.now()).CarLicensePlateDispatcherPayloadInput (Freezed). Carries data as it exists in the domain; no wire shaping. The clock arrives as submittedAt (via DateTimeUtils.now()).CarLicensePlateDispatcherPayloadInput (Freezed). Lleva el dato como existe en el dominio; nada de formato wire. El reloj llega como submittedAt (vía DateTimeUtils.now()).
| CampoFieldCampo | TipoTypeTipo | PapelRoleRol |
|---|---|---|
carLicensePlate | String | placa como digitada pelo rep (crua — o builder normaliza)plate as typed by the rep (raw — the builder normalizes it)placa como la digitó el rep (cruda — el builder la normaliza) |
resource | ResourceEntity | representante de vendas (cru — o builder lê sfid e username)sales rep (raw — the builder reads sfid and username)representante de ventas (crudo — el builder lee sfid y username) |
submittedAt | DateTime | relógio do envio (DateTimeUtils.now()); vira date e dateReferencesubmission clock (DateTimeUtils.now()); becomes date and dateReferencereloj del envío (DateTimeUtils.now()); se vuelve date y dateReference |
isTradePlate | bool · false | flag de placa comercial/de teste → isTradePlate; o notifier nunca a define hoje (ver Pendências)trade/test-plate flag → isTradePlate; the notifier never sets it today (see Pending)flag de placa comercial/de prueba → isTradePlate; el notifier nunca la define hoy (ver Pendientes) |
Payload (message)
O JSON serializado no campo message do request. A tabela abaixo tem 4 colunas — Campo JSON · Tipo · Origem do Dado · Regra — e lista todas as 5 chaves que o build() emite (1:1 com o código). Campo, Tipo e Origem são código cru; só a Regra é prosa. Um exemplo completo (BR) está em transaction_example.json, ao lado deste doc.The JSON serialized into the request's message field. The table below has 4 columns — JSON field · Type · Data source · Rule — and lists all 5 keys that build() emits (1:1 with the code). Field, Type and Source are raw code; only Rule is prose. A full example (BR) sits in transaction_example.json, next to this doc.El JSON serializado en el campo message del request. La tabla abajo tiene 4 columnas — Campo JSON · Tipo · Origen del Dato · Regla — y lista las 5 claves que build() emite (1:1 con el código). Campo, Tipo y Origen son código crudo; solo la Regla es prosa. Un ejemplo completo (BR) está en transaction_example.json, junto a este doc.
| Campo JSON | TipoTypeTipo | Origem do DadoData sourceOrigen del Dato | RegraRuleRegla |
|---|---|---|---|
CarLicensePlate | string | VehiclePlateUtils.normalize(input.carLicensePlate) | placa em maiúsculas, só A-Z/0-9 (remove espaços, hífens e demais separadores). Formatos válidos: legado AAA0000 ou Mercosul AAA0A00, no máx. 7 caracteres.plate upper-cased, only A-Z/0-9 (strips spaces, hyphens and other separators). Valid formats: legacy AAA0000 or Mercosul AAA0A00, max 7 characters.placa en mayúsculas, solo A-Z/0-9 (elimina espacios, guiones y otros separadores). Formatos válidos: legado AAA0000 o Mercosur AAA0A00, máx. 7 caracteres. |
resourceSfid | string | input.resource.sfid | SFID do representante de vendas da sessãosession sales rep's SFIDSFID del representante de ventas de la sesión |
username | string | input.resource.username | login do representante de vendassales rep's loginlogin del representante de ventas |
date | string | DateTimeUtils.formatDate(input.submittedAt, isoDateTime) | carimbo AAAA-MM-DD HH:mm:ss do momento do envioYYYY-MM-DD HH:mm:ss timestamp of the send momentmarca AAAA-MM-DD HH:mm:ss del momento del envío |
isTradePlate | bool | input.isTradePlate | indica placa comercial/de teste. Default false; o notifier nunca a define hoje → sempre false (ver Pendências).marks a trade/test plate. Defaults to false; the notifier never sets it today → always false (see Pending).indica placa comercial/de prueba. Default false; el notifier nunca la define hoy → siempre false (ver Pendientes). |
Regras de negócioBusiness rulesReglas de negocio
Quando o envio aconteceWhen the send happensCuándo ocurre el envío plateVisible · showField
- O envio da placa só ocorre quando
JourneyState.showField(JourneyFieldType.carLicensePlate)étrue— a visibilidade vem da config do mercado cruzada com o tipo de representante (journeyConfig.visibleFieldsFor). Se o campo não está visível,startJourneyretornasuccesssem disparar a transação.The plate send only happens whenJourneyState.showField(JourneyFieldType.carLicensePlate)istrue— visibility comes from the market config crossed with the rep type (journeyConfig.visibleFieldsFor). If the field isn't visible,startJourneyreturnssuccesswithout firing the transaction.El envío de la placa solo ocurre cuandoJourneyState.showField(JourneyFieldType.carLicensePlate)estrue— la visibilidad viene de la config del mercado cruzada con el tipo de representante (journeyConfig.visibleFieldsFor). Si el campo no está visible,startJourneyretornasuccesssin disparar la transacción. - O envio da placa é o segundo passo de
startJourney: primeiro grava-se o odômetro (transação 29), depois a placa. Um dispara independentemente do outro.The plate send is the second step ofstartJourney: the odometer is recorded first (transaction 29), then the plate. Each fires independently of the other.El envío de la placa es el segundo paso destartJourney: primero se graba el odómetro (transacción 29), luego la placa. Cada uno se dispara independientemente del otro.
Validação da placaPlate validationValidación de la placa isValidBrazilianPlate · fieldRequiresValidation
- Quando
fieldRequiresValidation(carLicensePlate)étrue, a placa é validada porVehiclePlateUtils.isValidBrazilianPlateantes do envio; se inválida,startJourneyretornainvalidPlatee nada é enviado.WhenfieldRequiresValidation(carLicensePlate)istrue, the plate is validated byVehiclePlateUtils.isValidBrazilianPlatebefore sending; if invalid,startJourneyreturnsinvalidPlateand nothing is sent.CuandofieldRequiresValidation(carLicensePlate)estrue, la placa se valida conVehiclePlateUtils.isValidBrazilianPlateantes del envío; si es inválida,startJourneyretornainvalidPlatey no se envía nada. - A validação aceita dois padrões sobre a placa normalizada: legado
^[A-Z]{3}[0-9]{4}$ou Mercosul^[A-Z]{3}[0-9][A-Z][0-9]{2}$.Validation accepts two patterns over the normalized plate: legacy^[A-Z]{3}[0-9]{4}$or Mercosul^[A-Z]{3}[0-9][A-Z][0-9]{2}$.La validación acepta dos patrones sobre la placa normalizada: legado^[A-Z]{3}[0-9]{4}$o Mercosur^[A-Z]{3}[0-9][A-Z][0-9]{2}$.
Persistência local pós-sucessoLocal persistence on successPersistencia local tras éxito remote-first · saveCarLicensePlateLocally
- Remote-first (§36): só após o ack de sucesso do backend a placa normalizada é gravada no dispositivo, via
SaveVehicleInfoUseCase— reaproveitada como valor padrão nos próximos dias. Se o envio falha,startJourneyretornaplateSubmissionFailede nada é gravado.Remote-first (§36): only after the backend's success ack is the normalized plate saved on the device, viaSaveVehicleInfoUseCase— reused as the default value on following days. If the send fails,startJourneyreturnsplateSubmissionFailedand nothing is saved.Remote-first (§36): solo tras el ack de éxito del backend la placa normalizada se graba en el dispositivo, víaSaveVehicleInfoUseCase— reutilizada como valor por defecto los próximos días. Si el envío falla,startJourneyretornaplateSubmissionFailedy no se graba nada.
Pendências / roadmapPending / roadmapPendientes / roadmap
O que o builder ainda não alimenta ou envia inerte, documentado fiel ao estado atual do código (nunca descrito como se já existisse):What the builder does not yet feed, or ships inert, documented faithfully to the current code state (never described as already existing):Lo que el builder aún no alimenta, o envía inerte, documentado fiel al estado actual del código (nunca descrito como si ya existiera):
Não portado / pendenteNot ported / pendingNo portado / pendiente
isTradePlate: o campo existe no input (defaultfalse) e é emitido no payload, mas oJourneyNotifiernunca o define — hoje o valor é semprefalse. Não há UI para marcar placa comercial.isTradePlate: the field exists on the input (defaults tofalse) and is emitted in the payload, butJourneyNotifiernever sets it — today the value is alwaysfalse. There's no UI to flag a trade plate.isTradePlate: el campo existe en el input (defaultfalse) y se emite en el payload, peroJourneyNotifiernunca lo define — hoy el valor es siemprefalse. No hay UI para marcar placa comercial.- Validação de placa cobre apenas os formatos brasileiros (legado + Mercosul). Como a transação só é habilitada no Brasil, não há padrão de outro mercado a considerar hoje.Plate validation covers only Brazilian formats (legacy + Mercosul). Since the transaction is enabled only in Brazil, there's no other-market pattern to consider today.La validación de placa cubre solo los formatos brasileños (legado + Mercosur). Como la transacción solo está habilitada en Brasil, no hay patrón de otro mercado a considerar hoy.
- Transporte:
deviceUuidvai como literal provisório no gateway (pendência conhecida do Dispatcher, compartilhada por todas as transações).Transport:deviceUuidships as a provisional literal in the gateway (known Dispatcher pending item, shared by all transactions).Transporte:deviceUuidva como literal provisional en el gateway (pendiente conocido del Dispatcher, compartido por todas las transacciones).
Transação irmãSister transactionTransacción hermana
Disparada na mesma tela, mas por um serviceName próprio (OdometerAPI): o registro do odômetro — documentado em 29 · Odômetro da jornada (doc separado).
Fired on the same screen but by its own serviceName (OdometerAPI): the odometer record — documented in 29 · Odometer (journey) (separate doc).
Disparada en la misma pantalla pero por un serviceName propio (OdometerAPI): el registro del odómetro — documentado en 29 · Odómetro de la jornada (doc separado).
MercadosMarketsMercados
A disponibilidade da transação vem do DispatcherType.odometerCarPlate.enabledMarkets — só Brasil. A transação irmã do odômetro (odometerJourney) vale em BR/CL/ZA, mas o envio da placa é exclusivo do Brasil.Transaction availability comes from DispatcherType.odometerCarPlate.enabledMarkets — Brazil only. The sister odometer transaction (odometerJourney) applies in BR/CL/ZA, but the plate send is Brazil-exclusive.La disponibilidad de la transacción viene de DispatcherType.odometerCarPlate.enabledMarkets — solo Brasil. La transacción hermana del odómetro (odometerJourney) aplica en BR/CL/ZA, pero el envío de la placa es exclusivo de Brasil.
Só no BrasilBrazil onlySolo Brasil O envio da placa e sua validação (formatos legado e Mercosul) são específicos do Brasil. A visibilidade final do campo ainda depende da config de jornada do mercado cruzada com o tipo de representante. The plate send and its validation (legacy and Mercosul formats) are Brazil-specific. The field's final visibility still depends on the market's journey config crossed with the rep type. El envío de la placa y su validación (formatos legado y Mercosur) son específicos de Brasil. La visibilidad final del campo aún depende de la config de jornada del mercado cruzada con el tipo de representante.
Odômetro sem placaOdometer without plateOdómetro sin placa
Chile e África do Sul têm a jornada com odômetro (transação 29), mas não disparam o envio da placa — odometerCarPlate não os lista em enabledMarkets.
Chile and South Africa have the odometer journey (transaction 29), but do not fire the plate send — odometerCarPlate doesn't list them in enabledMarkets.
Chile y Sudáfrica tienen la jornada con odómetro (transacción 29), pero no disparan el envío de la placa — odometerCarPlate no los lista en enabledMarkets.
AR · PY · PE
Existem como mercados do app (config PANGEA mínima), mas não têm esta transação — odometerCarPlate não os lista em enabledMarkets. O envio da placa não é disparado nesses mercados.
They exist as app markets (minimal PANGEA config), but don't have this transaction — odometerCarPlate doesn't list them in enabledMarkets. The plate send is not fired in these markets.
Existen como mercados de la app (config PANGEA mínima), pero no tienen esta transacción — odometerCarPlate no los lista en enabledMarkets. El envío de la placa no se dispara en estos mercados.