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

Execução de recompraBuyback executionEjecución de recompra

A transação de escrita que registra o desfecho da coleta de uma recompra (devolução de produto): quando o representante de vendas aceita, rejeita ou reagenda a coleta, o app envia essa decisão ao backend via o Dispatcher. É o passo de execução que fecha o ciclo aberto pela Solicitação de recompra. As três ações compartilham o mesmo serviceName e o mesmo payload — divergem só no campo status. The write transaction that records the collection outcome of a buyback (product return): when the sales rep accepts, rejects or reschedules the uplift, the app sends that decision to the backend through the Dispatcher. It's the execution step that closes the cycle opened by the Buyback request. The three actions share the same serviceName and the same payload — diverging only in the status field. La transacción de escritura que registra el desenlace de la recolección de una recompra (devolución de producto): cuando el representante de ventas acepta, rechaza o reprograma la recolección, la app envía esa decisión al backend vía el Dispatcher. Es el paso de ejecución que cierra el ciclo abierto por la Solicitud de recompra. Las tres acciones comparten el mismo serviceName y el mismo payload — divergen solo en el campo status.

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

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

Recompra (buyback) é a devolução de produto de um varejo — por exemplo, itens vencidos ou fora de linha que precisam ser coletados de volta. A Solicitação de recompra abre o pedido de devolução; esta transação registra o que aconteceu na hora da coleta. Quando o representante de vendas dá o desfecho de uma recompra que está aguardando coleta, o app envia essa decisão ao backend, e a recompra some da lista de pendentes com o novo estado. A buyback is a product return from a retail — for example, expired or discontinued items that need to be collected back. The Buyback request opens the return; this transaction records what happened at collection time. When the sales rep gives the outcome of a buyback awaiting uplift, the app sends that decision to the backend, and the buyback leaves the pending list with its new state. Recompra (buyback) es la devolución de producto de un punto de venta — por ejemplo, ítems vencidos o descontinuados que deben ser recolectados. La Solicitud de recompra abre la devolución; esta transacción registra lo que ocurrió al momento de la recolección. Cuando el representante de ventas da el desenlace de una recompra que espera recolección, la app envía esa decisión al backend, y la recompra sale de la lista de pendientes con su nuevo estado.

três desfechos, escolhidos pelo rep na tela de coleta:There are three outcomes, chosen by the rep on the collection screen:Hay tres desenlaces, elegidos por el rep en la pantalla de recolección:

Aceitar coletaAccept upliftAceptar recolección

A coleta foi realizada: o rep confirma o recolhimento dos produtos.The uplift happened: the rep confirms the products were collected.La recolección se realizó: el rep confirma que los productos fueron recogidos.

RejeitarRejectRechazar

A coleta não se concretiza e a recompra é encerrada como rejeitada.The uplift doesn't go through and the buyback is closed as rejected.La recolección no se concreta y la recompra se cierra como rechazada.

ReagendarRescheduleReprogramar

A coleta é adiada para uma nova data escolhida pelo rep.The uplift is postponed to a new date the rep picks.La recolección se posterga a una nueva fecha elegida por el rep.

Um gesto, um desfechoOne gesture, one outcomeUn gesto, un desenlace Cada ação disponível depende do estado da recompra — aceitar, rejeitar e reagendar só aparecem quando a recompra permite. O reagendar exige que o rep escolha a nova data antes de enviar. Each available action depends on the buyback's state — accept, reject and reschedule only appear when the buyback allows them. Reschedule requires the rep to pick the new date before sending. Cada acción disponible depende del estado de la recompra — aceptar, rechazar y reprogramar solo aparecen cuando la recompra lo permite. Reprogramar exige que el rep elija la nueva fecha antes de enviar.

02

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

A transação é o último passo da jornada de coleta. As telas pertencem à feature de Recompra; aqui só situamos onde o envio acontece:The transaction is the last step of the collection journey. The screens belong to the Buyback feature; here we only place where the send happens:La transacción es el último paso del recorrido de recolección. Las pantallas pertenecen a la feature de Recompra; aquí solo situamos dónde ocurre el envío:

  1. Seguimento de devoluçãoReturn trackingSeguimiento de devoluciónO rep vê as recompras da carteira e abre a que está aguardando coleta.The rep sees the portfolio's buybacks and opens the one awaiting uplift.El rep ve las recompras de la cartera y abre la que espera recolección.
  2. Detalhe da recompraBuyback detailDetalle de la recompraConfere os itens a devolver e a data de coleta prevista.Reviews the items to return and the scheduled uplift date.Revisa los ítems a devolver y la fecha de recolección prevista.
  3. Escolher o desfechoPick the outcomeElegir el desenlaceToca em aceitar, rejeitar ou reagendar. No reagendar, escolhe a nova data em um seletor.Taps accept, reject or reschedule. On reschedule, picks the new date in a date selector.Toca aceptar, rechazar o reprogramar. En reprogramar, elige la nueva fecha en un selector.
  4. Enviar → esta transaçãoSend → this transactionEnviar → esta transacciónAo confirmar o desfecho, o app dispara a Execução de recompra. É este toque que aciona a transação.On confirming the outcome, the app fires Buyback execution. This tap is what triggers the transaction.Al confirmar el desenlace, la app dispara la Ejecución de recompra. Este toque es lo que activa la transacción.

Antes vem a solicitaçãoThe request comes firstAntes viene la solicitud Esta transação só existe para uma recompra que já foi solicitada. A abertura da devolução é a etapa anterior — 20 · Solicitação de recompra. This transaction only exists for a buyback that was already requested. Opening the return is the prior step — 20 · Buyback request. Esta transacción solo existe para una recompra que ya fue solicitada. Abrir la devolución es la etapa anterior — 20 · Solicitud de recompra.

03

Depois do envioAfter sendingDespués del envío

Confirmação ao repConfirmation to the repConfirmación al rep
Quando o backend aceita, a recompra passa ao novo estado (aceita, rejeitada ou reagendada) e as ações somem do detalhe — não é possível dar dois desfechos à mesma coleta.When the backend accepts it, the buyback moves to its new state (accepted, rejected or rescheduled) and the actions disappear from the detail — you can't give the same uplift two outcomes.Cuando el backend lo acepta, la recompra pasa al nuevo estado (aceptada, rechazada o reprogramada) y las acciones desaparecen del detalle — no se puede dar dos desenlaces a la misma recolección.
Sem internetOfflineSin internet
O envio pode entrar em fila e ser reenviado quando a conexão volta — o rep não perde o desfecho. 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 rep doesn't lose the outcome. 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 — el rep no pierde el desenlace. 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 envio.The dispatch's technical status (sent, queued, errored) can be followed in the app's data center / dispatch tracking — useful for support to investigate a send.El estado técnico del despacho (enviado, en cola, con error) puede seguirse en el centro de datos / tracking de despachos de la app — útil para que soporte investigue un envío.
04

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

Execução de recompra é a transação de saída que persiste o desfecho da coleta de uma recompra no backend. É disparada pelo BuybackCollectionNotifier quando o representante de vendas aceita, rejeita ou reagenda. A fonte é a BuybackEntity em coleta; o resultado é a recompra atualizada, refletida na feature de Recompra. Buyback execution is the outbound transaction that persists a buyback's collection outcome in the backend. It's fired by the BuybackCollectionNotifier when the sales rep accepts, rejects or reschedules. The source is the BuybackEntity being collected; the result is the updated buyback, reflected in the Buyback feature. Ejecución de recompra es la transacción de salida que persiste el desenlace de la recolección de una recompra en el backend. Se dispara desde el BuybackCollectionNotifier cuando el representante de ventas acepta, rechaza o reprograma. La fuente es la BuybackEntity en recolección; el resultado es la recompra actualizada, reflejada en la feature de Recompra.

Payload enxutoLean payloadPayload liviano

Um único cabeçalho UpliftReturnHeader com 10 campos. A grande maioria é placeholder inerte fixo do contrato — o app preenche apenas 3.A single UpliftReturnHeader with 10 fields. Most are fixed inert contract placeholders — the app fills only 3.Un único UpliftReturnHeader con 10 campos. La mayoría son placeholders inertes fijos del contrato — la app completa solo 3.

3 ações, 1 payload3 actions, 1 payload3 acciones, 1 payload

Aceitar, rejeitar e reagendar usam o mesmo builder e o mesmo serviceName; divergem no status (F/R/RS) e nos 2 campos de reagendamento.Accept, reject and reschedule use the same builder and the same serviceName; they diverge in status (F/R/RS) and the 2 reschedule fields.Aceptar, rechazar y reprogramar usan el mismo builder y el mismo serviceName; divergen en status (F/R/RS) y los 2 campos de reprogramación.

RPC genéricoGeneric RPCRPC genérico

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

FontesSourcesFuentes BuildBuybackExecutionDispatcherPayloadUseCase + BuybackExecutionDispatcherPayloadInput + BuybackAction + DispatcherType + DispatcherConectaRep.proto. O input carrega entities cruas de domínio (CLAUDE.md §36); o build() constrói todo o wire. BuildBuybackExecutionDispatcherPayloadUseCase + BuybackExecutionDispatcherPayloadInput + BuybackAction + DispatcherType + DispatcherConectaRep.proto. The input carries raw domain entities (CLAUDE.md §36); build() constructs the entire wire. BuildBuybackExecutionDispatcherPayloadUseCase + BuybackExecutionDispatcherPayloadInput + BuybackAction + 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 · discriminadorSalesReturnUplift (fixo; sem prefixo Promo_, pois não há promoção em recompra)discriminatorSalesReturnUplift (fixed; no Promo_ prefix, as buyback has no promotion)discriminadorSalesReturnUplift (fijo; sin prefijo Promo_, ya que la recompra no tiene promoción)
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 buyback.sfid (correlação)the buyback.sfid (correlation)el buyback.sfid (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. Recompra não usa account nem visitDispatchKind no envelope. 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. Buyback uses neither account nor visitDispatchKind on the envelope. 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. La recompra no usa account ni visitDispatchKind en el envelope.

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

06

Ações e serviceNameActions & serviceNameAcciones y serviceName

Um único DispatcherType (buybackExecution) e um único serviceName (SalesReturnUplift) cobrem as três ações. A ação chega no input como BuybackAction; o builder a converte em status via action.writeStatus. Não há campo de tipo no envelope além do DispatcherType: aceitar, rejeitar e reagendar produzem o mesmo payload, divergindo apenas no status e — só no reagendamento — nos campos rescheduledTerritory e rescheduledUpliftDate.A single DispatcherType (buybackExecution) and a single serviceName (SalesReturnUplift) cover all three actions. The action arrives on the input as BuybackAction; the builder maps it to status via action.writeStatus. There's no type field on the envelope beyond the DispatcherType: accept, reject and reschedule produce the same payload, diverging only in status and — reschedule only — in the rescheduledTerritory and rescheduledUpliftDate fields.Un único DispatcherType (buybackExecution) y un único serviceName (SalesReturnUplift) cubren las tres acciones. La acción llega en el input como BuybackAction; el builder la convierte en status vía action.writeStatus. No hay campo de tipo en el envelope más allá del DispatcherType: aceptar, rechazar y reprogramar producen el mismo payload, divergiendo solo en status y — solo en reprogramación — en los campos rescheduledTerritory y rescheduledUpliftDate.

AçãoActionAcción BuybackAction status Quando / divergênciaWhen / divergenceCuándo / divergencia
AceitarAcceptAceptaracceptFColeta confirmada. Campos de reagendamento vão vazios.Uplift confirmed. Reschedule fields go empty.Recolección confirmada. Los campos de reprogramación van vacíos.
RejeitarRejectRechazarrejectRColeta rejeitada. rejectReason continua vazio hoje (ver Pendências). Campos de reagendamento vazios.Uplift rejected. rejectReason stays empty today (see Pending). Reschedule fields empty.Recolección rechazada. rejectReason sigue vacío hoy (ver Pendientes). Campos de reprogramación vacíos.
ReagendarRescheduleReprogramarrescheduleRSColeta adiada. Emite rescheduledTerritory = resource.locationHierarchyId e rescheduledUpliftDate = nova data (yyyy-MM-dd).Uplift postponed. Emits rescheduledTerritory = resource.locationHierarchyId and rescheduledUpliftDate = new date (yyyy-MM-dd).Recolección postergada. Emite rescheduledTerritory = resource.locationHierarchyId y rescheduledUpliftDate = nueva fecha (yyyy-MM-dd).

serviceName irmãoSister serviceNameserviceName hermano A abertura da devolução usa um serviceName diferenteSalesReturnSEN (buybackRequest) — e está documentada em 20 · Solicitação de recompra. As duas transações formam o ciclo de vida da recompra (solicitar → executar). Opening the return uses a different serviceNameSalesReturnSEN (buybackRequest) — documented in 20 · Buyback request. The two transactions form the buyback lifecycle (request → execute). Abrir la devolución usa un serviceName diferenteSalesReturnSEN (buybackRequest) — documentado en 20 · Solicitud de recompra. Las dos transacciones forman el ciclo de vida de la recompra (solicitar → ejecutar).

07

Como é disparadoHow it's firedCómo se dispara

A transação é orquestrada pelo BuybackCollectionNotifier (remote-first, §36). O notifier apenas reúne a entity crua e os valores injetados; o builder é o dono único da formatação de data e da derivação wire (status, território de reagendamento). Após o sucesso remoto, o notifier grava a recompra atualizada no cache local. A cascata:The transaction is orchestrated by the BuybackCollectionNotifier (remote-first, §36). The notifier only gathers the raw entity and injected values; the builder is the sole owner of date formatting and wire derivation (status, reschedule territory). After the remote success, the notifier writes the updated buyback to the local cache. The cascade:La transacción se orquesta desde el BuybackCollectionNotifier (remote-first, §36). El notifier solo reúne la entity cruda y los valores inyectados; el builder es el dueño único del formateo de fecha y la derivación wire (status, territorio de reprogramación). Tras el éxito remoto, el notifier graba la recompra actualizada en el cache local. La cascada:

  • BuybackCollectionNotifiernotifier
    • reúne entity crua + injetadosgathers raw entity + injectedreúne entity cruda + inyectadosBuybackExecutionDispatcherPayloadInput
      • build()BuildBuybackExecutionDispatcherPayloadUseCasemonta o wireassembles the wirearma el wire
        • devolvereturnsdevuelveDispatcherEnvelope
          • SubmitBuybackExecutionUseCaseDispatcherRepository
            • serializa + authserialize + authserializa + authDispatcherGateway
              • sendTransactionBackendgRPC

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

BuybackExecutionDispatcherPayloadInput (Freezed). Carrega o dado como existe no domínio; nada de formato wire. O relógio chega como submittedAt (via DateTimeUtils.now()); o resource vem do currentResourceProvider.BuybackExecutionDispatcherPayloadInput (Freezed). Carries data as it exists in the domain; no wire shaping. The clock arrives as submittedAt (via DateTimeUtils.now()); resource comes from currentResourceProvider.BuybackExecutionDispatcherPayloadInput (Freezed). Lleva el dato como existe en el dominio; nada de formato wire. El reloj llega como submittedAt (vía DateTimeUtils.now()); resource viene del currentResourceProvider.

CampoFieldCampoTipoTypeTipoPapelRoleRol
buybackBuybackEntitya recompra em coleta (cru — o builder lê só o sfid)the buyback being collected (raw — the builder reads only the sfid)la recompra en recolección (cruda — el builder lee solo el sfid)
actionBuybackActionaccept · reject · reschedulestatus
resourceResourceEntityrepresentante de vendas (cru — o builder deriva rescheduledTerritory de locationHierarchyId)sales rep (raw — the builder derives rescheduledTerritory from locationHierarchyId)representante de ventas (crudo — el builder deriva rescheduledTerritory de locationHierarchyId)
submittedAtDateTimerelógio do envio → dateReference (nunca já formatado, §36)submission clock → dateReference (never pre-formatted, §36)reloj del envío → dateReference (nunca preformateado, §36)
rescheduledUpliftDateDateTime? · nullnova data de coleta (só no reagendamento) → rescheduledUpliftDatenew uplift date (reschedule only) → rescheduledUpliftDatenueva fecha de recolección (solo reprogramación) → rescheduledUpliftDate
08

Payload (message)

O JSON serializado no campo message do request. A tabela tem 4 colunasCampo JSON · Tipo · Origem do Dado · Regra — e lista toda chave que o build() emite (11 no total: 1 wrapper + 10 campos do cabeçalho). Campo, Tipo e Origem são código cru; só a Regra é prosa. Um exemplo completo (ação reschedule/BR) está em transaction_example.json, ao lado deste doc.The JSON serialized into the request's message field. The table has 4 columnsJSON field · Type · Data source · Rule — and lists every key that build() emits (11 in total: 1 wrapper + 10 header fields). Field, Type and Source are raw code; only Rule is prose. A full example (reschedule/BR action) sits in transaction_example.json, next to this doc.El JSON serializado en el campo message del request. La tabla tiene 4 columnasCampo JSON · Tipo · Origen del Dato · Regla — y lista toda clave que build() emite (11 en total: 1 wrapper + 10 campos del encabezado). Campo, Tipo y Origen son código crudo; solo la Regla es prosa. Un ejemplo completo (acción reschedule/BR) está en transaction_example.json, junto a este doc.

UpliftReturnHeader 11 chaveskeysclaves
Campo JSONJSON fieldCampo JSON TipoTypeTipo Origem do DadoData sourceOrigen del Dato RegraRuleRegla
UpliftReturnHeaderarray<object>Fixo (wrapper)Fixed (wrapper)Fijo (wrapper)Array de um único elemento envolvendo o objeto do cabeçalho; toda transação emite exatamente 1 item.Single-element array wrapping the header object; every transaction emits exactly 1 item.Array de un único elemento que envuelve el objeto del encabezado; toda transacción emite exactamente 1 ítem.
SalesreturnIDstringinput.buyback.sfidsfid da recompra sendo executada; também viaja como transactionReference do envelope.sfid of the buyback being executed; also travels as the envelope's transactionReference.sfid de la recompra en ejecución; también viaja como transactionReference del envelope.
statusstringinput.action.writeStatusCódigo wire da ação: F (accept), R (reject), RS (reschedule). Único campo que muda entre as três ações.Wire code of the action: F (accept), R (reject), RS (reschedule). The only field that changes across the three actions.Código wire de la acción: F (accept), R (reject), RS (reschedule). El único campo que cambia entre las tres acciones.
rejectReasonstringFixo: ""Fixed: ""Fijo: ""Motivo da rejeição. Sempre vazio hoje — o app não coleta motivo, mesmo na ação de rejeitar (ver Pendências).Reject reason. Always empty today — the app collects no reason, even on the reject action (see Pending).Motivo del rechazo. Siempre vacío hoy — la app no recoge motivo, ni siquiera en la acción de rechazar (ver Pendientes).
TripIDstringFixo: ""Fixed: ""Fijo: ""Id da rota/viagem de coleta. Placeholder inerte — nunca populado pelo app.Collection trip/route id. Inert placeholder — never populated by the app.Id de la ruta/viaje de recolección. Placeholder inerte — nunca poblado por la app.
upliftDatestringFixo: ""Fixed: ""Fijo: ""Data efetiva da coleta. Sempre vazio — o app não a envia, mesmo tendo buyback.upliftDate em domínio (ver Pendências).Effective uplift date. Always empty — the app doesn't send it, despite holding buyback.upliftDate in domain (see Pending).Fecha efectiva de la recolección. Siempre vacío — la app no la envía, pese a tener buyback.upliftDate en dominio (ver Pendientes).
reasonCodestringFixo: ""Fixed: ""Fijo: ""Código de motivo do contrato. Placeholder inerte — nunca populado.Contract reason code. Inert placeholder — never populated.Código de motivo del contrato. Placeholder inerte — nunca poblado.
rescheduledTerritorystringinput.resource.locationHierarchyIdTerritório/hierarquia do reagendamento. Só no reschedule; "" em accept/reject.Reschedule territory/hierarchy. Reschedule only; "" on accept/reject.Territorio/jerarquía de la reprogramación. Solo en reschedule; "" en accept/reject.
rescheduledUpliftDatestringinput.rescheduledUpliftDateNova data de coleta, formatada yyyy-MM-dd (DateFormatType.isoDate). Só no reschedule e quando não nula; caso contrário "".New uplift date, formatted yyyy-MM-dd (DateFormatType.isoDate). Reschedule only and when non-null; otherwise "".Nueva fecha de recolección, formateada yyyy-MM-dd (DateFormatType.isoDate). Solo en reschedule y cuando no es nula; de lo contrario "".
conversionMethodstringFixo: ""Fixed: ""Fijo: ""Método de conversão da devolução. Placeholder inerte — nunca populado.Return conversion method. Inert placeholder — never populated.Método de conversión de la devolución. Placeholder inerte — nunca poblado.
returnGrantedPercentagestringFixo: ""Fixed: ""Fijo: ""Percentual concedido de devolução. Placeholder inerte — nunca populado.Granted return percentage. Inert placeholder — never populated.Porcentaje concedido de devolución. Placeholder inerte — nunca poblado.
09

Regras de negócioBusiness rulesReglas de negocio

Ação → statusAction → statusAcción → status
A ação escolhida pelo rep vira o status wire pelo mapa do enum BuybackAction: acceptF, rejectR, rescheduleRS. Este é o único campo que distingue as três ações no payload.The rep's chosen action becomes the wire status via the BuybackAction enum map: acceptF, rejectR, rescheduleRS. This is the only field distinguishing the three actions in the payload.La acción elegida por el rep se convierte en el status wire por el mapa del enum BuybackAction: acceptF, rejectR, rescheduleRS. Este es el único campo que distingue las tres acciones en el payload.
Reagendamento condicionalConditional rescheduleReprogramación condicional
isReschedule = action == BuybackAction.reschedule comanda os dois campos de reagendamento. rescheduledUpliftDate só é formatada quando isReschedule e a data de entrada não é nula; caso contrário vai "". rescheduledTerritory só recebe locationHierarchyId quando isReschedule. Nas ações accept/reject ambos são "".isReschedule = action == BuybackAction.reschedule drives both reschedule fields. rescheduledUpliftDate is formatted only when isReschedule and the input date is non-null; otherwise it's "". rescheduledTerritory gets locationHierarchyId only when isReschedule. On accept/reject both are "".isReschedule = action == BuybackAction.reschedule comanda ambos campos de reprogramación. rescheduledUpliftDate se formatea solo cuando isReschedule y la fecha de entrada no es nula; de lo contrario es "". rescheduledTerritory recibe locationHierarchyId solo cuando isReschedule. En accept/reject ambos son "".
Território derivado no builderTerritory derived in the builderTerritorio derivado en el builder
O rescheduledTerritory sai de resource.locationHierarchyId — derivado no build() a partir da entity crua, nunca pré-resolvido no notifier (CLAUDE.md §36).rescheduledTerritory comes from resource.locationHierarchyId — derived in build() from the raw entity, never pre-resolved in the notifier (CLAUDE.md §36).rescheduledTerritory sale de resource.locationHierarchyId — derivado en build() desde la entity cruda, nunca pre-resuelto en el notifier (CLAUDE.md §36).
Data via DateTimeUtilsDate via DateTimeUtilsFecha vía DateTimeUtils
Ambas as datas wire (dateReference do envelope e rescheduledUpliftDate) passam por DateTimeUtils.formatDate(format: DateFormatType.isoDate) (yyyy-MM-dd) — nunca montadas à mão (CLAUDE.md §14).Both wire dates (envelope dateReference and rescheduledUpliftDate) go through DateTimeUtils.formatDate(format: DateFormatType.isoDate) (yyyy-MM-dd) — never hand-assembled (CLAUDE.md §14).Ambas fechas wire (dateReference del envelope y rescheduledUpliftDate) pasan por DateTimeUtils.formatDate(format: DateFormatType.isoDate) (yyyy-MM-dd) — nunca montadas a mano (CLAUDE.md §14).
Remote-firstRemote-firstRemote-first
O SubmitBuybackExecutionUseCase persiste no remote primeiro; só após o sucesso o notifier atualiza o cache local (novo BuybackStatus e — no reagendamento — a nova upliftDate), e limpa as flags canAccept/canReject/canReschedule (CLAUDE.md §36).The SubmitBuybackExecutionUseCase persists remote first; only after success does the notifier update the local cache (new BuybackStatus and — on reschedule — the new upliftDate), and clear the canAccept/canReject/canReschedule flags (CLAUDE.md §36).El SubmitBuybackExecutionUseCase persiste en remote primero; solo tras el éxito el notifier actualiza el cache local (nuevo BuybackStatus y — en reprogramación — la nueva upliftDate), y limpia las flags canAccept/canReject/canReschedule (CLAUDE.md §36).
Sem promoçãoNo promotionSin promoción
Recompra nunca aplica promoção, então o serviceName nunca recebe o prefixo Promo_ — é sempre SalesReturnUplift cru.Buyback never applies a promotion, so the serviceName never takes the Promo_ prefix — it's always raw SalesReturnUplift.La recompra nunca aplica promoción, así que el serviceName nunca recibe el prefijo Promo_ — es siempre SalesReturnUplift crudo.
10

Pendências / roadmapPending / roadmapPendientes / roadmap

O que o builder ainda não preenche ou envia inerte, documentado fiel ao estado atual do código (nunca descrito como se já existisse):What the builder does not yet fill, or ships inert, documented faithfully to the current code state (never described as already existing):Lo que el builder aún no completa, 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

  • rejectReason: sempre "", inclusive na ação de rejeitar — o app não coleta um motivo de rejeição hoje.rejectReason: always "", even on the reject action — the app collects no reject reason today.rejectReason: siempre "", incluso en la acción de rechazar — la app no recoge motivo de rechazo hoy.
  • upliftDate: sempre "" no payload, embora a BuybackEntity carregue upliftDate em domínio — a data efetiva de coleta não é enviada ao backend.upliftDate: always "" in the payload, even though BuybackEntity carries upliftDate in domain — the effective uplift date isn't sent to the backend.upliftDate: siempre "" en el payload, aunque BuybackEntity lleva upliftDate en dominio — la fecha efectiva de recolección no se envía al backend.
  • TripID, reasonCode, conversionMethod, returnGrantedPercentage: placeholders inertes fixos do contrato — o app não computa nenhum.TripID, reasonCode, conversionMethod, returnGrantedPercentage: fixed inert contract placeholders — the app computes none.TripID, reasonCode, conversionMethod, returnGrantedPercentage: placeholders inertes fijos del contrato — la app no calcula ninguno.
  • Transporte: deviceUuid vai como literal provisório no gateway (pendência conhecida do Dispatcher, compartilhada por todas as transações).Transport: deviceUuid ships as a provisional literal in the gateway (known Dispatcher pending item, shared by all transactions).Transporte: deviceUuid va como literal provisional en el gateway (pendiente conocido del Dispatcher, compartido por todas las transacciones).

Ciclo de vida da recompraBuyback lifecycleCiclo de vida de la recompra O backend condensa a lógica de devolução; o app só reporta o desfecho. O ciclo completo — solicitar e executar — está em 20 · Solicitação de recompra + esta doc, e na feature de Recompra. The backend condenses the return logic; the app only reports the outcome. The full cycle — request and execute — is in 20 · Buyback request + this doc, and in the Buyback feature. El backend condensa la lógica de devolución; la app solo reporta el desenlace. El ciclo completo — solicitar y ejecutar — está en 20 · Solicitud de recompra + este doc, y en la feature de Recompra.

MercadosMarketsMercados

A disponibilidade da transação vem do DispatcherType.buybackExecution.enabledMarketsBR e CL. ZA não tem recompra; AR/PY/PE não têm dispatcher de recompra.Transaction availability comes from DispatcherType.buybackExecution.enabledMarketsBR and CL. ZA has no buyback; AR/PY/PE have no buyback dispatcher.La disponibilidad de la transacción viene de DispatcherType.buybackExecution.enabledMarketsBR y CL. ZA no tiene recompra; AR/PY/PE no tienen dispatcher de recompra.

BRx CLx ZA AR PY PE
disponívelavailabledisponible presente, desligadopresent, offpresente, apagado ausenteabsentausente
BRCL

Brasil e ChileBrazil and ChileBrasil y Chile A recompra (solicitação e execução) é um recurso unificado de BR e CL num único proto. O payload e as três ações são idênticos nos dois mercados — a transação não tem ramo por país. Buyback (request and execution) is a unified BR + CL feature in a single proto. The payload and the three actions are identical in both markets — the transaction has no per-country branch. La recompra (solicitud y ejecución) es un recurso unificado de BR y CL en un único proto. El payload y las tres acciones son idénticos en ambos mercados — la transacción no tiene rama por país.

ZA · AR · PY · PE Não listados em enabledMarkets — não têm dispatcher de recompra. A execução de recompra não é disparada nesses mercados. Not listed in enabledMarkets — they have no buyback dispatcher. Buyback execution is not fired in these markets. No listados en enabledMarkets — no tienen dispatcher de recompra. La ejecución de recompra no se dispara en estos mercados.