Conecta Você
O fluxo de aprovações do programa Conecta Você: o representante de vendas revisa os cadastros pendentes de atendentes e gerentes dos varejos sob a sua hierarquia e aprova ou rejeita cada um. É uma feature de escrita — cada decisão dispara duas transações pelo Dispatcher. Exclusiva do Brasil. The Conecta Você program approval flow: the sales rep reviews the pending clerk and manager registrations from the retails under their hierarchy and approves or rejects each one. It's a write feature — every decision fires two transactions through the Dispatcher. Brazil-only. El flujo de aprobaciones del programa Conecta Você: el representante de ventas revisa los registros pendientes de atendentes y gerentes de los puntos de venta bajo su jerarquía y aprueba o rechaza cada uno. Es una feature de escritura — cada decisión dispara dos transacciones por el Dispatcher. Exclusiva de Brasil.
O que é e para que serveWhat it is and what it's forQué es y para qué sirve
Conecta Você é um programa de fidelidade da rede de varejos. Quando um varejo cadastra ou edita um atendente ou gerente no programa, essa mudança fica pendente de aprovação do representante de vendas responsável. Esta feature é onde o representante vê essas pendências, confere os dados da pessoa e decide: aprova ou rejeita (com motivo). Conecta Você is a retail-network loyalty program. When a retail registers or edits a clerk or manager in the program, that change stays pending approval from the responsible sales rep. This feature is where the rep sees those pending items, checks the person's data and decides: approve or reject (with a reason). Conecta Você es un programa de fidelidad de la red de puntos de venta. Cuando un punto de venta registra o edita un atendente o gerente en el programa, ese cambio queda pendiente de aprobación del representante de ventas responsable. Esta feature es donde el representante ve esos pendientes, revisa los datos de la persona y decide: aprueba o rechaza (con motivo).
Quem está pendente?Who is pending?¿Quién está pendiente?
Um card por varejo, com o total de aprovações pendentes daquele ponto.One card per retail, with the count of pending approvals for that store.Una tarjeta por punto de venta, con el total de aprobaciones pendientes.
Quais são os dados?What are the details?¿Cuáles son los datos?
Nome, cargo, telefone, e-mail, CPF e nascimento de cada pessoa a aprovar.Name, role, phone, e-mail, tax ID and birthdate of each person to approve.Nombre, cargo, teléfono, correo, CPF y nacimiento de cada persona.
O que decidir?What to decide?¿Qué decidir?
Aprovar libera o cadastro; rejeitar exige escolher um motivo da lista.Approve releases the registration; reject requires picking a reason from the list.Aprobar libera el registro; rechazar exige elegir un motivo de la lista.
Só BrasilBrazil onlySolo Brasil O Conecta Você existe apenas no Brasil. Nos outros mercados o atalho nem aparece na Home. Quem cria esses cadastros é a feature Gerenciar equipe — esta feature só aprova o que já foi submetido. Conecta Você exists in Brazil only. In the other markets the shortcut doesn't even show on Home. The one that creates these registrations is the Manage staff feature — this feature only approves what was already submitted. Conecta Você existe solo en Brasil. En los otros mercados el atajo ni aparece en el Home. Quien crea esos registros es la feature Gestionar equipo — esta feature solo aprueba lo ya enviado.
Como acessarHow to openCómo acceder
- Pela HomeFrom HomeDesde el HomeNo módulo de Ações da Home, toque no atalho Conecta Você (só aparece no Brasil).In the Home Actions module, tap the Conecta Você shortcut (shows in Brazil only).En el módulo de Acciones del Home, toque el atajo Conecta Você (solo aparece en Brasil).
- Abre o hubThe hub opensAbre el hubUma tela de boas-vindas com até dois atalhos: Aprovações e Desempenho do território (quando configurado).A welcome screen with up to two shortcuts: Approvals and Territory performance (when configured).Una pantalla de bienvenida con hasta dos atajos: Aprobaciones y Desempeño del territorio (cuando está configurado).
- Toque em AprovaçõesTap ApprovalsToque AprobacionesAbre a lista de varejos com pendências. Puxe para baixo para atualizar.Opens the list of retails with pending items. Pull down to refresh.Abre la lista de puntos de venta con pendientes. Deslice hacia abajo para actualizar.
Estrutura das telasScreen structureEstructura de las pantallas
São quatro telas em sequência: hub → lista de aprovações → detalhe do varejo → detalhe do cadastro.There are four screens in sequence: hub → approvals list → retail detail → request detail.Son cuatro pantallas en secuencia: hub → lista de aprobaciones → detalle del punto de venta → detalle del registro.
- 1 · Hub1 · Hub1 · Hub
- Data da última sincronização, título "Conecta Você", uma mensagem de boas-vindas e a grade de atalhos (Aprovações + Desempenho do território quando há URL).Last-sync date, "Conecta Você" title, a welcome message and the shortcut grid (Approvals + Territory performance when a URL exists).Fecha de última sincronización, título "Conecta Você", un mensaje de bienvenida y la grilla de atajos (Aprobaciones + Desempeño del territorio cuando hay URL).
- 2 · Lista de aprovações2 · Approvals list2 · Lista de aprobaciones
- Um card por varejo: nome, código SAP, endereço e o total de aprovações pendentes (destacado). Estado vazio quando não há pendências. Tocar num card abre o detalhe.One card per retail: name, SAP code, address and the count of pending approvals (highlighted). Empty state when there's nothing pending. Tapping a card opens the detail.Una tarjeta por punto de venta: nombre, código SAP, dirección y el total de aprobaciones pendientes (destacado). Estado vacío cuando no hay pendientes. Tocar una tarjeta abre el detalle.
- 3 · Detalhe do varejo3 · Retail detail3 · Detalle del punto de venta
- O card do varejo (sem toque) e as pendências em dois grupos: Inclusão (novos cadastros) e Edição (alterações). Cada linha tem um rádio: selecione uma e a barra inferior Rejeitar / Aprovar habilita. Tocar na linha (não no rádio) abre o detalhe do cadastro.The retail card (non-tappable) and the pending items in two groups: Inclusion (new registrations) and Edition (changes). Each row has a radio: select one and the bottom Reject / Approve bar enables. Tapping the row (not the radio) opens the request detail.La tarjeta del punto de venta (sin toque) y los pendientes en dos grupos: Inclusión (nuevos registros) y Edición (cambios). Cada fila tiene un radio: seleccione una y la barra inferior Rechazar / Aprobar se habilita. Tocar la fila (no el radio) abre el detalle del registro.
- 4 · Detalhe do cadastro4 · Request detail4 · Detalle del registro
- Os campos da pessoa em somente leitura: nome, cargo, telefone, e-mail, CPF e nascimento (formatados por mercado). No fim, a mesma barra Rejeitar / Aprovar (sempre habilitada).The person's fields in read-only: name, role, phone, e-mail, tax ID and birthdate (market-formatted). At the end, the same Reject / Approve bar (always enabled).Los campos de la persona en solo lectura: nombre, cargo, teléfono, correo, CPF y nacimiento (formateados por mercado). Al final, la misma barra Rechazar / Aprobar (siempre habilitada).
Tipos e estadosTypes & statesTipos y estados
Cada pendência tem um tipo (o que a origina) e um cargo (a posição da pessoa no programa):Each pending item has a type (what triggered it) and a role (the person's position in the program):Cada pendiente tiene un tipo (lo que la origina) y un cargo (la posición de la persona en el programa):
- InclusãoInclusionInclusión
- Um cadastro novo (tipo
creation) — vai para o grupo "Inclusão".A new registration (typecreation) — goes to the "Inclusion" group.Un registro nuevo (tipocreation) — va al grupo "Inclusión". - EdiçãoEditionEdición
- Uma alteração de cadastro existente (tipo
editing) — vai para o grupo "Edição".A change to an existing registration (typeediting) — goes to the "Edition" group.Un cambio de registro existente (tipoediting) — va al grupo "Edición". - CargoRoleCargo
- Atendente ou Gerente — a posição da pessoa no programa Conecta Você.Attendant or Manager — the person's position in the Conecta Você program.Atendente o Gerente — la posición de la persona en el programa Conecta Você.
Depois da decisão, a pendência some da lista: aprovar/rejeitar remove aquela linha do cache local na hora, e o varejo desaparece quando fica sem nenhuma pendência.After the decision, the item leaves the list: approving/rejecting removes that row from the local cache immediately, and the retail disappears once it has no pending items left.Tras la decisión, el pendiente sale de la lista: aprobar/rechazar quita esa fila del caché local al instante, y el punto de venta desaparece cuando se queda sin pendientes.
Ações: aprovar, rejeitarActions: approve, rejectAcciones: aprobar, rechazar
As duas ações estão na barra inferior, tanto no detalhe do varejo (com uma linha selecionada) quanto no detalhe do cadastro. Cada uma pede uma confirmação antes de enviar.Both actions live in the bottom bar, both in the retail detail (with a row selected) and in the request detail. Each asks for a confirmation before submitting.Ambas acciones están en la barra inferior, tanto en el detalle del punto de venta (con una fila seleccionada) como en el detalle del registro. Cada una pide una confirmación antes de enviar.
- AprovarApproveAprobar
- Abre um modal de confirmação simples. Confirmando, o cadastro é liberado no programa.Opens a simple confirmation modal. On confirm, the registration is released into the program.Abre un modal de confirmación simple. Al confirmar, el registro se libera en el programa.
- RejeitarRejectRechazar
- Abre um modal que exige escolher um motivo numa lista (os motivos vêm do backend). Sem motivo, o botão de confirmar fica desabilitado.Opens a modal that requires picking a reason from a list (reasons come from the backend). Without a reason, the confirm button stays disabled.Abre un modal que exige elegir un motivo de una lista (los motivos vienen del backend). Sin motivo, el botón de confirmar queda deshabilitado.
- Toque na açãoTap the actionToque la acciónAbre o modal de confirmação (aprovar) ou de motivo (rejeitar).Opens the confirmation modal (approve) or the reason modal (reject).Abre el modal de confirmación (aprobar) o de motivo (rechazar).
- ConfirmeConfirmConfirmeO envio dispara e a tela mostra um retorno: sucesso (verde) ou erro (vermelho, com opção de tentar de novo).The submit fires and the screen shows feedback: success (green) or error (red, with retry).El envío dispara y la pantalla muestra un retorno: éxito (verde) o error (rojo, con reintento).
- A lista atualizaThe list updatesLa lista se actualizaA pendência resolvida some; se o varejo ficou sem pendências, a tela volta para a lista.The resolved item disappears; if the retail has no more pending items, the screen goes back to the list.El pendiente resuelto desaparece; si el punto de venta se quedó sin pendientes, la pantalla vuelve a la lista.
Arquitetura e fluxo de dadosArchitecture & data flowArquitectura y flujo de datos
Clean Architecture + Riverpod + Freezed + gRPC + ObjectBox. Há dois fluxos distintos: a leitura das aprovações (um RPC, com cache write-through) e a escrita das decisões (aprovar/rejeitar via Dispatcher, duas transações por decisão).Clean Architecture + Riverpod + Freezed + gRPC + ObjectBox. There are two distinct flows: the read of the approvals (one RPC, cache write-through) and the write of the decisions (approve/reject via the Dispatcher, two transactions per decision).Clean Architecture + Riverpod + Freezed + gRPC + ObjectBox. Hay dos flujos distintos: la lectura de las aprobaciones (un RPC, con cache write-through) y la escritura de las decisiones (aprobar/rechazar vía Dispatcher, dos transacciones por decisión).
Leitura · cache + remotoRead · cache + remoteLectura · caché + remoto
Um único RPC (getConectaVoce) traz os varejos com pendências e os motivos de rejeição. O dado atravessa quatro representações ligadas por mappers, e todo fetch grava no ObjectBox. O detalhe (por varejo) lê só do cache:A single RPC (getConectaVoce) brings the retails with pending items and the reject reasons. Data crosses four representations linked by mappers, and every fetch writes to ObjectBox. The detail (per retail) reads cache-only:Un único RPC (getConectaVoce) trae los puntos de venta con pendientes y los motivos de rechazo. El dato atraviesa cuatro representaciones unidas por mappers, y todo fetch graba en ObjectBox. El detalle (por punto de venta) lee solo del caché:
- ConectaVoceReplygRPC proto
- toConectaVoceApprovalsDTOConectaVoceApprovalsDTODTO · Freezed
- toDomainConectaVoceApprovalsEntitydomain
- toModelConectaVoceApprovalsModelObjectBox
- toDomainConectaVoceApprovalsEntitydomain · cache
- watchConectaVoceApprovalsNotifier + State
- → UIConectaVoceApprovalsPage
- getCachedAccountByCodeConectaVoceApprovalDetailNotifier→ Detail / Request pages
- → UIConectaVoceApprovalsPage
- watchConectaVoceApprovalsNotifier + State
- toDomainConectaVoceApprovalsEntitydomain · cache
- toModelConectaVoceApprovalsModelObjectBox
- toDomainConectaVoceApprovalsEntitydomain
- toConectaVoceApprovalsDTOConectaVoceApprovalsDTODTO · Freezed
Escrita · decisão via DispatcherWrite · decision via DispatcherEscritura · decisión vía Dispatcher
Aprovar/rejeitar dispara pelo Dispatcher (gRPC dedicado) duas transações em sequência: primeiro a ação (CVRequestAction), depois o relatório (CVRequestActionReport). Se a primeira falha, a segunda não sai. Ao final, a pendência é removida do cache:Approve/reject fires through the Dispatcher (dedicated gRPC) two transactions in sequence: first the action (CVRequestAction), then the report (CVRequestActionReport). If the first fails, the second doesn't go out. At the end, the pending item is removed from cache:Aprobar/rechazar dispara por el Dispatcher (gRPC dedicado) dos transacciones en secuencia: primero la acción (CVRequestAction), luego el reporte (CVRequestActionReport). Si la primera falla, la segunda no sale. Al final, el pendiente se quita del caché:
- ConectaVoceActionButtonBarWidgetUI
- confirmAndSubmit…ConectaVoceApprovalDetailNotifierapprove / reject
- executeSubmitConectaVoceRequestActionUseCase
- build(input)Build…RequestAction + …Report PayloadUseCase→ 2× DispatcherEnvelope
- dispatch ×2DispatcherOrchestratorgRPC dispatcher
- on successremovePendingActionFromCache→ reload state
- dispatch ×2DispatcherOrchestratorgRPC dispatcher
- build(input)Build…RequestAction + …Report PayloadUseCase→ 2× DispatcherEnvelope
- executeSubmitConectaVoceRequestActionUseCase
- confirmAndSubmit…ConectaVoceApprovalDetailNotifierapprove / reject
Modelo de dadosData modelModelo de datos
O dado existe em quatro representações quase idênticas ao longo das camadas — Proto (wire gRPC) → DTO (Freezed) → Model (ObjectBox) → Entity (domínio) — e cada fronteira é atravessada por um mapper. Os nomes se mantêm; muda muito pouco (enums tipados só na Entity, data como DateTime no Model, relações ToMany no Model). O fetch é write-through: todo retorno é gravado no ObjectBox e a UI lê do cache.The data exists in four near-identical representations across the layers — Proto (gRPC wire) → DTO (Freezed) → Model (ObjectBox) → Entity (domain) — and each boundary is crossed by a mapper. Names stay the same; very little changes (enums typed only in the Entity, date typed as DateTime in the Model, ToMany relations in the Model). Fetch is write-through: every response is written to ObjectBox and the UI reads from cache.El dato existe en cuatro representaciones casi idénticas a lo largo de las capas — Proto (wire gRPC) → DTO (Freezed) → Model (ObjectBox) → Entity (dominio) — y cada frontera se cruza con un mapper. Los nombres se mantienen; cambia muy poco (enums tipados solo en la Entity, fecha como DateTime en el Model, relaciones ToMany en el Model). El fetch es write-through: toda respuesta se graba en ObjectBox y la UI lee del caché.
A lista chega num container ConectaVoceApprovals (lastSyncAt gerado no mapper + accounts[] + rejectReasons[]); cada item é um ConectaVoceAccount (o varejo) com uma lista de ConectaVocePendingAction (cada cadastro a aprovar). Os enums só existem tipados na Entity; em Proto/DTO/Model trafegam como String. A seguir, na ordem: o proto, as estruturas de dados campo-a-campo por camada, e os mappers.The list arrives in a ConectaVoceApprovals container (lastSyncAt generated in the mapper + accounts[] + rejectReasons[]); each item is a ConectaVoceAccount (the retail) with a list of ConectaVocePendingAction (each registration to approve). Enums are only typed in the Entity; in Proto/DTO/Model they travel as String. Next, in order: the proto, the field-by-field data structures per layer, and the mappers.La lista llega en un container ConectaVoceApprovals (lastSyncAt generado en el mapper + accounts[] + rejectReasons[]); cada ítem es un ConectaVoceAccount (el punto de venta) con una lista de ConectaVocePendingAction (cada registro a aprobar). Los enums solo están tipados en la Entity; en Proto/DTO/Model viajan como String. A continuación, en orden: el proto, las estructuras de datos campo a campo por capa, y los mappers.
Proto
ConectaVoceConectaRep.proto · proto3 · package mn.bat.conectarep.streambridge. Um serviço (ConectaVoceConectaRepService), um método unário de leitura. A escrita (aprovar/rejeitar) não usa este proto — sai pelo Dispatcher (ver UseCases).One service (ConectaVoceConectaRepService), a single unary read method. Writes (approve/reject) don't use this proto — they go through the Dispatcher (see UseCases).Un servicio (ConectaVoceConectaRepService), un método unario de lectura. La escritura (aprobar/rechazar) no usa este proto — sale por el Dispatcher (ver UseCases).
getConectaVoceunaryrpc getConectaVoce(ConectaVoceRequest) returns (ConectaVoceReply)
path /mn.bat.conectarep.streambridge.ConectaVoceConectaRepService/getConectaVoce
ConectaVoceRequestlocationHierarchySfidstring· #1 · hierarquia do representante de vendas (resolvida no repository)sales rep hierarchy (resolved in the repository)jerarquía del representante de ventas (resuelta en el repository)dateReferencestring· #2 · optionallastModifiedDatestring· #3 · optional (não usado hoje)optional (not used today)optional (no usado hoy)
ConectaVoceReplyrepeated ConectaVoceAccount accounts (#1) · repeated string rejectReasons (#2) — os varejos com pendências e os motivos de rejeição disponíveis. Os campos estão detalhados nas Estruturas de dados abaixo.the retails with pending items and the available reject reasons. Fields are detailed in Data structures below.los puntos de venta con pendientes y los motivos de rechazo disponibles. Los campos están detallados en Estructuras de datos abajo.
Estruturas de dadosData structuresEstructuras de datos
Um dropdown por estrutura, aninhados pela hierarquia (as linhas ligam pai e filhos). Cada tabela tem uma coluna por camada — Proto · DTO · Model · Entity; as células com borda marcam onde o tipo primeiro muda (relação ToMany no Model, enum na Entity, data como DateTime no Model, rename no Model). O container não tem proto próprio — vem de ConectaVoceReply + lastSyncAt gerado no mapper.One dropdown per structure, nested by hierarchy (lines link parent and children). Each table has one column per layer — Proto · DTO · Model · Entity; bordered cells mark where the type first changes (ToMany relation in the Model, enum in the Entity, date typed as DateTime in the Model, rename in the Model). The container has no proto of its own — it comes from ConectaVoceReply + lastSyncAt generated in the mapper.Un dropdown por estructura, anidados por jerarquía (las líneas unen padre e hijos). Cada tabla tiene una columna por capa — Proto · DTO · Model · Entity; las celdas con borde marcan dónde primero cambia el tipo (relación ToMany en el Model, enum en la Entity, fecha como DateTime en el Model, rename en el Model). El container no tiene proto propio — viene de ConectaVoceReply + lastSyncAt generado en el mapper.
ConectaVoceApprovals raiz · container 3 campos3 fields3 campos
Campo Proto DTO Model Entity lastSyncAt— DateTimeDateTime DateTime accountsrepeated ConectaVoceAccount List<…DTO> ToMany<…Model>List<…Entity> rejectReasonsrepeated string List<String> List<String> List<String> ConectaVoceAccount ConectaVoceApprovals.accounts[] 5 campos5 fields5 campos
Campo Proto DTO Model Entity accountCodestring String String String accountNamestring String String String accountAddressstring String String String totalOfPendingActionsint32 int int int pendingActionsrepeated ConectaVocePendingAction List<…DTO> ToMany<…Model>List<…Entity> ConectaVocePendingAction ConectaVoceAccount.pendingActions[] 8 campos8 fields8 campos
Campo Proto DTO Model Entity idstring String actionIdString actionstring String String ConectaVocePendingActionTypenamestring String String String rolestring String String ClerkProgramLayerphonestring String String String emailstring String String String taxIdstring String String String birthdatestring String? DateTime?DateTime?
Mappers
As conversões entre as camadas, todas como extension (5 direções por tipo):The conversions between layers, all as extensions (5 directions per type):Las conversiones entre capas, todas como extension (5 direcciones por tipo):
| DireçãoDirectionDirección | MétodoMethodMétodo |
|---|---|
| JSON → DTO | static fromMap(Map) (mock)(mock)(mock) |
| Proto → DTO | toConectaVoceApprovalsDTO() / toDTO() |
| DTO → Entity | toDomain() (resolve enums: fromWire/fromProgramLayerCode; parseia birthdate)(resolves enums: fromWire/fromProgramLayerCode; parses birthdate)(resuelve enums: fromWire/fromProgramLayerCode; parsea birthdate) |
| Entity → Model | toModel() (enums → .wireValue/.programLayerCode; popula ToMany)(enums → .wireValue/.programLayerCode; fills ToMany)(enums → .wireValue/.programLayerCode; llena ToMany) |
| Model → Entity | toDomain() |
Os únicos deltasThe only deltasLos únicos deltas
- enums tipados só na Entity:
action→ConectaVocePendingActionType,role→ClerkProgramLayer(Stringnas outras)enums typed only in the Entity:action→ConectaVocePendingActionType,role→ClerkProgramLayer(Stringelsewhere)enums tipados solo en la Entity:action→ConectaVocePendingActionType,role→ClerkProgramLayer(Stringen las demás) birthdateString→DateTime?(parse no mapper DTO→EntitytoDomain, viaDateTimeUtils.tryParse; o Model só persiste oDateTime?; proto vazio viranull)(parsed in the DTO→Entity mappertoDomain, viaDateTimeUtils.tryParse; the Model only persists theDateTime?; empty proto becomesnull)(parseo en el mapper DTO→EntitytoDomain, víaDateTimeUtils.tryParse; el Model solo persiste elDateTime?; proto vacío pasa anull)- renamerenamerename
id→actionIdno Model (oidint é reservado pelo ObjectBox); volta aidna Entityin the Model (intidis reserved by ObjectBox); back toidin the Entityen el Model (elidint es reservado por ObjectBox); vuelve aiden la Entity - relações viram
ToManyno Modelrelations becomeToManyin the Modelrelaciones pasan aToManyen el Model lastSyncAtgerado no mapper comDateTimeUtils.now()(não existe no proto)generated in the mapper withDateTimeUtils.now()(not in the proto)generado en el mapper conDateTimeUtils.now()(no existe en el proto)
Repository
ConectaVoceApprovalsRepositoryImpl implementaimplementsimplementa ConectaVoceApprovalsRepositoryInterface e injeta os 3 datasources (mock/local/remote) + ConnectivityService + a flag useMockData + Ref. Além da leitura, é o dono da mutação de cache pós-decisão. Método a método:and injects the 3 datasources (mock/local/remote) + ConnectivityService + the useMockData flag + Ref. Beyond the read, it owns the post-decision cache mutation. Method by method:e inyecta los 3 datasources (mock/local/remote) + ConnectivityService + la flag useMockData + Ref. Además de la lectura, es dueño de la mutación de caché post-decisión. Método a método:
getConectaVoceApprovals({source, dateReference?}) mock / local / remote
RetornaReturnsDevuelve Result<ConectaVoceApprovalsEntity?, Failure>
Ponto de entrada da leitura: decide a fonte pela source + flags, mapeia e grava no cache (write-through). Chamado pelo ConectaVoceApprovalsNotifier.Read entry point: picks the source from source + flags, maps and writes to cache (write-through). Called by ConectaVoceApprovalsNotifier.Punto de entrada de la lectura: elige la fuente por source + flags, mapea y graba en caché (write-through). Llamado por ConectaVoceApprovalsNotifier.
Árvore de decisão de fonteSource decision treeÁrbol de decisión de fuente
useMockData== true ouorosource == mock→_fetchFromMock(): lê o JSON, mapeia, grava no cache.→_fetchFromMock(): reads the JSON, maps, writes to cache.→_fetchFromMock(): lee el JSON, mapea, graba en caché.source == localou offlineor offlineu offline→getCachedConectaVoceApprovals()(sem rede).→getCachedConectaVoceApprovals()(no network).→getCachedConectaVoceApprovals()(sin red).- senão (remoto + conectado)otherwise (remote + connected)si no (remoto + conectado)→
_fetchFromRemoteWithFallback(): lêcurrentResourceProvider; senullcai pro cache; senão chama o remoto comlocationHierarchyId, mapeia, grava no cache; em erro, fallback pro cache.→_fetchFromRemoteWithFallback(): readscurrentResourceProvider; ifnullfalls back to cache; else calls remote withlocationHierarchyId, maps, writes to cache; on error, falls back to cache.→_fetchFromRemoteWithFallback(): leecurrentResourceProvider; sinullcae al caché; si no llama al remoto conlocationHierarchyId, mapea, graba en caché; en error, fallback al caché.
getCachedConectaVoceApprovals() local
RetornaReturnsDevuelve Result<ConectaVoceApprovalsEntity?, Failure>
Só cache. null vira Success(null), não erro.Cache only. null becomes Success(null), not an error.Solo caché. null es Success(null), no error.
getCachedConectaVoceApprovalsLastSyncAt() local
RetornaReturnsDevuelve DateTime? (sem Result)(no Result)(sin Result)
Timestamp da última sincronização do container, para o DataLoadInfo. Alimenta também o hub.The container's last-sync timestamp, for DataLoadInfo. Also feeds the hub.Timestamp de última sincronización del container, para DataLoadInfo. Alimenta también el hub.
getCachedAccountByCode({accountCode}) local
RetornaReturnsDevuelve Result<ConectaVoceAccountEntity?, Failure>
Lê o container do cache e filtra um varejo pelo accountCode (firstWhereOrNull). Nunca dispara remoto — alimenta o detalhe e o detalhe do cadastro.Reads the container from cache and filters one retail by accountCode (firstWhereOrNull). Never triggers remote — feeds the detail and request-detail.Lee el container del caché y filtra un punto de venta por accountCode (firstWhereOrNull). Nunca dispara remoto — alimenta el detalle y el detalle del registro.
getCachedRejectReasons() local
RetornaReturnsDevuelve Result<List<String>, Failure>
Os motivos de rejeição do container cacheado (lista vazia se ausente). Alimentam o dropdown do modal de rejeição.The cached container's reject reasons (empty list if absent). Feed the reject modal dropdown.Los motivos de rechazo del container cacheado (lista vacía si ausente). Alimentan el dropdown del modal de rechazo.
removePendingActionFromCache({accountCode, actionId}) local · mutaçãomutationmutación
RetornaReturnsDevuelve Result<void, Failure>
Chamado após uma decisão bem-sucedida: remove a pendência do varejo no cache. Se o varejo ficar sem pendências, o próprio varejo é removido; senão, atualiza a lista e o totalOfPendingActions. Regrava o container via saveConectaVoceApprovals.Called after a successful decision: removes the pending item from the retail in cache. If the retail is left with none, the retail itself is dropped; otherwise the list and totalOfPendingActions are updated. Rewrites the container via saveConectaVoceApprovals.Llamado tras una decisión exitosa: quita el pendiente del punto de venta en caché. Si el punto de venta se queda sin pendientes, se quita el propio punto de venta; si no, se actualizan la lista y el totalOfPendingActions. Regraba el container vía saveConectaVoceApprovals.
Datasources
Um card por datasource (dropdown). No corpo: método, envio, retorno, fluxo de uso e tratamento de erro.One card per datasource (dropdown). In the body: method, what it sends, return, usage flow and error handling.Un card por datasource (dropdown). En el cuerpo: método, envío, retorno, flujo de uso y manejo de errores.
Remote ConectaVoceApprovalsRemoteDataSource gRPC
getConectaVoceApprovals({locationHierarchySfid, dateReference?, lastModifiedDate?})
- EnvioSendsEnvío
- monta
ConectaVoceRequeste chama_client.getConectaVoce(request)no clientConectaVoceConectaRepServiceClient(viaconectaVoceServiceClientProvider).buildsConectaVoceRequestand calls_client.getConectaVoce(request)onConectaVoceConectaRepServiceClient(viaconectaVoceServiceClientProvider).armaConectaVoceRequesty llama_client.getConectaVoce(request)enConectaVoceConectaRepServiceClient(víaconectaVoceServiceClientProvider). - RetornoReturnRetorno
ConectaVoceApprovalsDTO(viaresponse.toConectaVoceApprovalsDTO())(viaresponse.toConectaVoceApprovalsDTO())(víaresponse.toConectaVoceApprovalsDTO())- Fluxo de usoUsage flowFlujo de uso
- chamado pelo caminho remoto do repository (
_fetchFromRemoteWithFallback), quando online e sem mock; o resultado é gravado no cache.called by the repository's remote path (_fetchFromRemoteWithFallback), when online and not mocking; the result is written to cache.llamado por el camino remoto del repository (_fetchFromRemoteWithFallback), online y sin mock; el resultado se graba en caché. - Tratamento de erroError handlingManejo de errores
GrpcError→GrpcExceptionHandler; outros →ServerException. Em erro, o repository faz fallback pro cache.GrpcError→GrpcExceptionHandler; others →ServerException. On error, the repository falls back to cache.GrpcError→GrpcExceptionHandler; otros →ServerException. En error, el repository hace fallback al caché.
Local ConectaVoceApprovalsLocalDataSource ObjectBox
Envio / fluxo: persistência local via ObjectBox (ObjectBoxDatabase), box ConectaVoceApprovalsModel + boxes filhas (ConectaVoceAccountModel, ConectaVocePendingActionModel) — sem rede. Alimenta os caminhos cache do repository. Erro: falhas de persistência propagam como CacheException (não engolidas).Sends / flow: local persistence via ObjectBox (ObjectBoxDatabase), ConectaVoceApprovalsModel box + child boxes (ConectaVoceAccountModel, ConectaVocePendingActionModel) — no network. Feeds the repository's cache paths. Error: persistence failures propagate as CacheException (not swallowed).Envío / flujo: persistencia local vía ObjectBox (ObjectBoxDatabase), box ConectaVoceApprovalsModel + boxes hijas (ConectaVoceAccountModel, ConectaVocePendingActionModel) — sin red. Alimenta los caminos caché del repository. Error: fallos de persistencia propagan como CacheException (no tragados).
getConectaVoceApprovals()
- RetornoReturnRetorno
ConectaVoceApprovalsEntity?- ComportamentoBehaviorComportamiento
models.first.toDomain()— o agregado único, ounullse o cache está vazio.models.first.toDomain()— the single aggregate, ornullif the cache is empty.models.first.toDomain()— el agregado único, onullsi el caché está vacío.
getConectaVoceApprovalsLastSyncAt()
- RetornoReturnRetorno
DateTime?- ComportamentoBehaviorComportamiento
models.first.lastSyncAt— timestamp da última sync do container.— the container's last-sync timestamp.— timestamp de última sincronización del container.
saveConectaVoceApprovals({entity})
- RetornoReturnRetorno
void- ComportamentoBehaviorComportamiento
- destrutivo:
clearConectaVoceApprovals()+_box.put(entity.toModel())(grava boxes filhas em cascata). Cache-writer após cada fetch e após cada decisão.destructive:clearConectaVoceApprovals()+_box.put(entity.toModel())(writes child boxes in cascade). Cache-writer after each fetch and after each decision.destructivo:clearConectaVoceApprovals()+_box.put(entity.toModel())(graba boxes hijas en cascada). Cache-writer tras cada fetch y tras cada decisión.
clearConectaVoceApprovals()
- RetornoReturnRetorno
void- ComportamentoBehaviorComportamiento
- limpa as boxes na ordem filhas→raiz (
PendingAction→Account→Approvals).clears boxes children→root (PendingAction→Account→Approvals).limpia las boxes hijas→raíz (PendingAction→Account→Approvals).
Mock ConectaVoceApprovalsMockDataSource JSON
getConectaVoceApprovals()
- EnvioSendsEnvío
- carrega o asset JSON
pending_actions_conecta_voce(por mercado, real vs sintético viauseRealMockData) — sem rede.loads the JSON assetpending_actions_conecta_voce(per market, real vs synthetic viauseRealMockData) — no network.carga el asset JSONpending_actions_conecta_voce(por mercado, real vs sintético víauseRealMockData) — sin red. - RetornoReturnRetorno
ConectaVoceApprovalsDTO(viaConectaVoceApprovalsDTOJsonMapper.fromMap)(viaConectaVoceApprovalsDTOJsonMapper.fromMap)(víaConectaVoceApprovalsDTOJsonMapper.fromMap)- Fluxo de usoUsage flowFlujo de uso
- usado quando
useMockDataestá ligado ousource == mock; grava no cache como um fetch normal.used whenuseMockDatais on orsource == mock; writes to cache like a normal fetch.usado cuandouseMockDataestá activo osource == mock; graba en caché como un fetch normal. - Tratamento de erroError handlingManejo de errores
- asset ausente ou JSON inválido propaga como
CacheException(sem rede envolvida).missing asset or invalid JSON propagates asCacheException(no network involved).asset ausente o JSON inválido propaga comoCacheException(sin red involucrada).
Enums e labelsEnums & labelsEnums y labels
Os enums só existem tipados na camada Entity; em DTO/Model/Proto trafegam como String. Lista completa de valores:Enums are only typed in the Entity layer; in DTO/Model/Proto they travel as String. Full value list:Los enums solo están tipados en la Entity; en DTO/Model/Proto viajan como String. Lista completa de valores:
ConectaVocePendingActionType 3 · wireValue
| case | wireValue | grupo na UIUI groupgrupo en la UI |
|---|---|---|
creation | "creation" | InclusãoInclusionInclusión |
edition | "editing" | EdiçãoEditionEdición |
unknown | "" | Edição (fallback)Edition (fallback)Edición (fallback) |
Resolvido por fromWire(value:) (normaliza para minúsculo; vazio/desconhecido → unknown). Na UI, só creation vai para "Inclusão"; todo o resto vai para "Edição".Resolved by fromWire(value:) (lowercases; empty/unknown → unknown). In the UI, only creation goes to "Inclusion"; everything else goes to "Edition".Resuelto por fromWire(value:) (normaliza a minúscula; vacío/desconocido → unknown). En la UI, solo creation va a "Inclusión"; todo lo demás va a "Edición".
ClerkProgramLayer 3 · programLayerCode + wireRole
| case | programLayerCode | wireRole | i18n |
|---|---|---|---|
attendant | "BATCONVOCE23ATEND" | "Conecta Voce - Atendente" | contactRoleAttendant |
manager | "BATCONVOCE23GER" | "Conecta Voce - Gerente" | contactRoleManager |
unknown | "" | "" | "-" |
O role do wire é o programLayerCode — resolvido por fromProgramLayerCode(code:). O label exibido vem de localizedLabel (traduzido). Enum compartilhado com Gerenciar equipe.The wire role is the programLayerCode — resolved by fromProgramLayerCode(code:). The displayed label comes from localizedLabel (translated). Enum shared with Manage staff.El role del wire es el programLayerCode — resuelto por fromProgramLayerCode(code:). El label mostrado viene de localizedLabel (traducido). Enum compartido con Gestionar equipo.
ConectaVoceRequestStatus 2 · wireValue · payloadpayloadpayload
| case | wireValue |
|---|---|
approved | "approved" |
rejected | "rejected" |
Não vem no proto de leitura — é o setStatusTo montado no payload da transação CVRequestAction (aprovar → approved, rejeitar → rejected).Doesn't come from the read proto — it's the setStatusTo built into the CVRequestAction transaction payload (approve → approved, reject → rejected).No viene del proto de lectura — es el setStatusTo armado en el payload de la transacción CVRequestAction (aprobar → approved, rechazar → rejected).
UseCases
Um dropdown por UseCase. O de leitura delega ao repository; os de escrita montam e despacham as transações (padrão DispatcherPayloadBuilder, §36). Todos os providers são keepAlive.One dropdown per UseCase. The read one delegates to the repository; the write ones build and dispatch the transactions (DispatcherPayloadBuilder pattern, §36). All providers are keepAlive.Un dropdown por UseCase. El de lectura delega al repository; los de escritura arman y despachan las transacciones (patrón DispatcherPayloadBuilder, §36). Todos los providers son keepAlive.
GetConectaVoceApprovalsUseCase 5 · leitura + mutação de cacheread + cache mutationlectura + mutación de caché
| MétodoMethodMétodo | RetornaReturnsDevuelve | UsoUseUso |
|---|---|---|
execute({source, dateReference}) | Result<ConectaVoceApprovalsEntity?, Failure> | Ponto de entrada da lista → repository.getConectaVoceApprovals. Chamado pelo ConectaVoceApprovalsNotifier.List entry point → repository.getConectaVoceApprovals. Called by ConectaVoceApprovalsNotifier.Punto de entrada de la lista → repository.getConectaVoceApprovals. Llamado por ConectaVoceApprovalsNotifier. |
getCachedLastSyncAt() | DateTime? | Timestamp da última sincronização (sem Result). Alimenta o hub e o DataLoadInfo.Last-sync timestamp (no Result). Feeds the hub and DataLoadInfo.Timestamp de última sincronización (sin Result). Alimenta el hub y DataLoadInfo. |
getCachedAccountByCode({accountCode}) | Result<ConectaVoceAccountEntity?, Failure> | 1 varejo do cache (§28 cat. A). Alimenta o detalhe e o detalhe do cadastro.1 retail from cache (§28 cat. A). Feeds the detail and request-detail.1 punto de venta del caché (§28 cat. A). Alimenta el detalle y el detalle del registro. |
getCachedRejectReasons() | Result<List<String>, Failure> | Motivos de rejeição para o dropdown do modal.Reject reasons for the modal dropdown.Motivos de rechazo para el dropdown del modal. |
removePendingActionFromCache({accountCode, actionId}) | Result<void, Failure> | Remove a pendência do cache após a decisão. Chamado pelo Detail Notifier no sucesso.Removes the pending item from cache after the decision. Called by the Detail Notifier on success.Quita el pendiente del caché tras la decisión. Llamado por el Detail Notifier en éxito. |
SubmitConectaVoceRequestActionUseCase escrita · 2 transaçõeswrite · 2 transactionsescritura · 2 transacciones
| MétodoMethodMétodo | RetornaReturnsDevuelve | UsoUseUso |
|---|---|---|
execute({pendingAction, accountCode, username, isApproving, rejectReason?, submittedAt}) | Result<void, Failure> | Monta e despacha em sequência: (1) CVRequestAction via _buildActionPayload; se Success, (2) CVRequestActionReport via _buildReportPayload. Cada despacho vai pelo DispatcherOrchestrator. Falha na 1ª interrompe.Builds and dispatches in sequence: (1) CVRequestAction via _buildActionPayload; if Success, (2) CVRequestActionReport via _buildReportPayload. Each dispatch goes through DispatcherOrchestrator. Failure on the 1st stops it.Arma y despacha en secuencia: (1) CVRequestAction vía _buildActionPayload; si Success, (2) CVRequestActionReport vía _buildReportPayload. Cada despacho va por el DispatcherOrchestrator. Fallo en la 1ª interrumpe. |
BuildConectaVoceRequestActionDispatcherPayloadUseCase → CVRequestAction
Builder puro (DispatcherPayloadBuilder<…Input>). Monta o envelope da transação CVRequestAction: data.id (parse do pendingAction.id para int), setStatusTo (approved/rejected), reason (só se rejeitando), requestedBy fixo "CONECTA_REP". DispatcherType.cvRequestAction · serviceName CVRequestAction.Pure builder (DispatcherPayloadBuilder<…Input>). Builds the CVRequestAction transaction envelope: data.id (parse of pendingAction.id to int), setStatusTo (approved/rejected), reason (only when rejecting), fixed requestedBy "CONECTA_REP". DispatcherType.cvRequestAction · serviceName CVRequestAction.Builder puro (DispatcherPayloadBuilder<…Input>). Arma el envelope de la transacción CVRequestAction: data.id (parse de pendingAction.id a int), setStatusTo (approved/rejected), reason (solo al rechazar), requestedBy fijo "CONECTA_REP". DispatcherType.cvRequestAction · serviceName CVRequestAction.
BuildConectaVoceRequestActionReportDispatcherPayloadUseCase → CVRequestActionReport
Builder puro. Monta o envelope da transação CVRequestActionReport — o relatório da decisão: id, username, action (wireValue do tipo), isApproved, reason, sap (accountCode), taxId, email, name, role (programLayerCode), birthday (ISO), dateTime (timestamp de envio). Carrega o DispatchAccountEntity(sapCode). DispatcherType.cvRequestActionReport · serviceName CVRequestActionReport.Pure builder. Builds the CVRequestActionReport transaction envelope — the decision report: id, username, action (type wireValue), isApproved, reason, sap (accountCode), taxId, email, name, role (programLayerCode), birthday (ISO), dateTime (submit timestamp). Carries DispatchAccountEntity(sapCode). DispatcherType.cvRequestActionReport · serviceName CVRequestActionReport.Builder puro. Arma el envelope de la transacción CVRequestActionReport — el reporte de la decisión: id, username, action (wireValue del tipo), isApproved, reason, sap (accountCode), taxId, email, name, role (programLayerCode), birthday (ISO), dateTime (timestamp de envío). Lleva DispatchAccountEntity(sapCode). DispatcherType.cvRequestActionReport · serviceName CVRequestActionReport.
Notifiers & State
São três Notifiers, um por área. Cada State (Freezed) é a fonte única de verdade da sua page — agrupamento e seleção são getters do State, não lógica na page.There are three Notifiers, one per area. Each State (Freezed) is its page's single source of truth — grouping and selection are State getters, not page logic.Son tres Notifiers, uno por área. Cada State (Freezed) es la fuente única de verdad de su page — agrupamiento y selección son getters del State, no lógica en la page.
MétodosMethodsMétodos
ConectaVoceHubNotifier hub
build() → _load(): resolve a URL de desempenho do território (ConectaVoceLauncherService.resolveUrl) e o lastSyncAt cacheado.build() → _load(): resolves the territory-performance URL (ConectaVoceLauncherService.resolveUrl) and the cached lastSyncAt.build() → _load(): resuelve la URL de desempeño del territorio (ConectaVoceLauncherService.resolveUrl) y el lastSyncAt cacheado.
launchTerritoryPerformance()Future<Result<void, Failure>>· abre a URL externa (web) peloUrlLauncherService.opens the external (web) URL viaUrlLauncherService.abre la URL externa (web) víaUrlLauncherService.
ConectaVoceApprovalsNotifier AsyncGuard · list
_load({source = local})- private · monta o State com
accounts,lastSyncAt,rejectReasonsdo container (getOrThrow).private · assembles the State withaccounts,lastSyncAt,rejectReasonsfrom the container (getOrThrow).private · arma el State conaccounts,lastSyncAt,rejectReasonsdel container (getOrThrow). refresh()- pull-to-refresh ·
runGuarded(() => _load(source: remote)). Não setaloading(indicador próprio).pull-to-refresh ·runGuarded(() => _load(source: remote)). Doesn't setloading(own indicator).pull-to-refresh ·runGuarded(() => _load(source: remote)). No setealoading(indicador propio).
ConectaVoceApprovalDetailNotifier family · accountCode · detail + request
family por accountCode. build({accountCode}) → _load(): busca o varejo (getCachedAccountByCode, cache-only) e os motivos de rejeição. Compartilhado pelo detalhe do varejo e pelo detalhe do cadastro.family by accountCode. build({accountCode}) → _load(): fetches the retail (getCachedAccountByCode, cache-only) and the reject reasons. Shared by the retail detail and the request detail.family por accountCode. build({accountCode}) → _load(): busca el punto de venta (getCachedAccountByCode, cache-only) y los motivos de rechazo. Compartido por el detalle del punto de venta y el detalle del registro.
select({actionId})- marca a pendência selecionada (rádio) no State.sets the selected pending item (radio) in the State.marca el pendiente seleccionado (radio) en el State.
approve({actionId})Future<Failure?>· →_submit(isApproving: true).→_submit(isApproving: true).→_submit(isApproving: true).reject({actionId, reason})Future<Failure?>· →_submit(isApproving: false, rejectReason: reason).→_submit(isApproving: false, rejectReason: reason).→_submit(isApproving: false, rejectReason: reason)._submit(...)- private · seta
isSubmitting, resolveusernamedocurrentResourceProvideresubmittedAt = DateTimeUtils.now(), chama oSubmit…UseCase. No sucesso:removePendingActionFromCache+ recarrega o State; no erro: retorna aFailure.private · setsisSubmitting, resolvesusernamefromcurrentResourceProviderandsubmittedAt = DateTimeUtils.now(), calls theSubmit…UseCase. On success:removePendingActionFromCache+ reloads the State; on error: returns theFailure.private · seteaisSubmitting, resuelveusernamedelcurrentResourceProviderysubmittedAt = DateTimeUtils.now(), llama alSubmit…UseCase. En éxito:removePendingActionFromCache+ recarga el State; en error: devuelve laFailure.
State disponível para as PagesState available to the PagesState disponible para las Pages
ConectaVoceHubState
| campo | tipo | default |
|---|---|---|
territoryPerformanceUrl | String | "" |
lastSyncAt | DateTime? | null |
Getter: showTerritoryPerformance (URL não vazia)(URL not empty)(URL no vacía).
ConectaVoceApprovalsState
| campo | tipo | default |
|---|---|---|
accounts | List<ConectaVoceAccountEntity> | [] |
lastSyncAt | DateTime? | null |
rejectReasons | List<String> | [] |
Getter: hasAccounts.
ConectaVoceApprovalDetailState
| campo | tipo | default |
|---|---|---|
account | ConectaVoceAccountEntity? | null |
rejectReasons | List<String> | [] |
selectedActionId | String? | null |
isSubmitting | bool | false |
Getters: inclusionItems (tipotypetipo creation), editionItems (o restothe restel resto), hasItems, hasSelection, selectedAction.
Pages e widgetsPages & widgetsPages y widgets
Quatro pages (ConsumerWidget), cada uma com AppPageShell (displayBackButton, sem drawer) e loading/erro globais via .when. Árvore de composição:Four pages (ConsumerWidget), each with AppPageShell (displayBackButton, no drawer) and global loading/error via .when. Composition tree:Cuatro pages (ConsumerWidget), cada una con AppPageShell (displayBackButton, sin drawer) y loading/error globales vía .when. Árbol de composición:
- ConectaVoceHubPage watch conectaVoceHubProvider
- AppPageShell
- ConectaVoceHubHeaderWidget DataLoadInfo + título
- ConectaVoceHubWelcomeWidget headline + prompt
- ConectaVoceHubActionsWidget MenuActionGrid
- Aprovações → goToConectaVoceApprovals
- Desempenho do território if showTerritoryPerformance → launchTerritoryPerformance (URL externa)
- AppPageShell
- ConectaVoceApprovalsPage watch conectaVoceApprovalsProvider
- AppPageShell → CustomPullToRefresh → refresh()
- DataLoadInfo
- ConectaVoceApprovalsTitleRow
- _ConectaVoceApprovalsListSection
- CustomEmptyState !hasAccounts
- ConectaVoceAccountCardWidget por varejo → goToConectaVoceApprovalDetail
- AppPageShell → CustomPullToRefresh → refresh()
- ConectaVoceApprovalDetailPage watch conectaVoceApprovalDetailProvider(accountCode)
- AppPageShell → Column
- Expanded → SingleChildScrollView
- ConectaVoceApprovalsTitleRow
- ConectaVoceAccountCardWidget onTap null
- _InclusionSection / _EditionSection early-return se vazio
- ConectaVocePendingActionRowWidget CustomRadio → select · linha → goToConectaVoceApprovalRequestDetail
- ConectaVoceApprovalActionBarWidget enabled = hasSelection
- ConectaVoceActionButtonBarWidget Rejeitar (outlined) · Aprovar (filled)
- confirmAndSubmitConectaVoceApproval → ConectaVoceConfirmActionModalContent (aprovar: confirmar · rejeitar: dropdown de motivo) → approve/reject; volta se sem itens
- ConectaVoceActionButtonBarWidget Rejeitar (outlined) · Aprovar (filled)
- Expanded → SingleChildScrollView
- AppPageShell → Column
- ConectaVoceApprovalRequestDetailPage reusa o detail provider(accountCode)
- AppPageShell → SingleChildScrollView
- ConectaVoceApprovalsTitleRow
- ConectaVoceReadOnlyFieldWidget ×6 nome · cargo · telefone · e-mail · CPF · nascimento (formatados)
- ConectaVoceRequestDetailActionBarWidget enabled = true
- ConectaVoceActionButtonBarWidget → confirmAndSubmit… → volta após decidir
- AppPageShell → SingleChildScrollView
A entrada é a Home: o módulo de Ações mapeia ModuleDetailType.homeModuleConectaVoce → AppRouter.goToConectaVoceHub (EMC-driven, ver Mercados).The entry is Home: the Actions module maps ModuleDetailType.homeModuleConectaVoce → AppRouter.goToConectaVoceHub (EMC-driven, see Markets).La entrada es el Home: el módulo de Acciones mapea ModuleDetailType.homeModuleConectaVoce → AppRouter.goToConectaVoceHub (EMC-driven, ver Mercados).
Notas por mercadoMarket notesNotas por mercado
Conecta Você é exclusivo do Brasil. Isso é coerente em toda a stack: o atalho da Home é dirigido por End Market Configuration (módulo de Ações), o DataSyncType.conectaVoce só sincroniza no BR, e as duas transações de escrita têm enabledMarkets = [BR].Conecta Você is Brazil-only. This is consistent across the stack: the Home shortcut is driven by End Market Configuration (Actions module), DataSyncType.conectaVoce only syncs in BR, and both write transactions have enabledMarkets = [BR].Conecta Você es exclusivo de Brasil. Es coherente en toda la stack: el atajo del Home es dirigido por End Market Configuration (módulo de Acciones), el DataSyncType.conectaVoce solo sincroniza en BR, y las dos transacciones de escritura tienen enabledMarkets = [BR].
BrasilBrazilBrasil
Único mercado com o programa. O Desempenho do território é opcional: só aparece se o EMC (conectaVoceConfig.territoryPerformanceUrl) traz uma URL — a tela abre a URL + o nome da hierarquia do representante num navegador externo. CPF/telefone são formatados por mercado (DocumentUtils/PhoneUtils).
Only market with the program. Territory performance is optional: it shows only if the EMC (conectaVoceConfig.territoryPerformanceUrl) provides a URL — the screen opens the URL + the rep's hierarchy name in an external browser. Tax ID/phone are market-formatted (DocumentUtils/PhoneUtils).
Único mercado con el programa. El Desempeño del territorio es opcional: solo aparece si el EMC (conectaVoceConfig.territoryPerformanceUrl) trae una URL — la pantalla abre la URL + el nombre de la jerarquía del representante en un navegador externo. CPF/teléfono se formatean por mercado (DocumentUtils/PhoneUtils).
AusenteAbsentAusente Não têm o programa Conecta Você: o atalho não aparece na Home, não há sincronização e as transações não são despachadas. Don't have the Conecta Você program: the shortcut doesn't show on Home, there's no sync and the transactions aren't dispatched. No tienen el programa Conecta Você: el atajo no aparece en el Home, no hay sincronización y las transacciones no se despachan.
Escopo & transações relacionadasScope & related transactionsAlcance & transacciones relacionadas
Esta feature aprova cadastros e dispara duas transações: CVRequestAction e CVRequestActionReport. A criação/edição dos cadastros (transações ContactConectaVoce e ContactUpdateStatus) vive na feature Gerenciar equipe — não é despachada aqui.
This feature approves registrations and fires two transactions: CVRequestAction and CVRequestActionReport. The creation/edition of the registrations (ContactConectaVoce and ContactUpdateStatus transactions) lives in the Manage staff feature — not dispatched here.
Esta feature aprueba registros y dispara dos transacciones: CVRequestAction y CVRequestActionReport. La creación/edición de los registros (transacciones ContactConectaVoce y ContactUpdateStatus) vive en la feature Gestionar equipo — no se despacha aquí.