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).
Feature · Gestão financeiraFeature · Financial managementFeature · Gestión financiera

Gestão financeiraFinancial managementGestión financiera

As contas a receber de um varejo: limite de crédito, títulos em aberto (DPI), notas de crédito disponíveis e o caminho até o pagamento. São quatro telas num só fluxo — o hub por varejo e três detalhes (título, nota fiscal, nota de crédito). Toda a leitura sai do cache gravado por uma única chamada gRPC; a única escrita que nasce aqui é o envio do comprovante de pagamento. A retail's accounts receivable: credit limit, open debit items (DPI), available credit notes and the path to the payment. It is four screens in one flow — the per-retail hub plus three details (debit item, invoice, credit note). Every read comes from the cache written by a single gRPC call; the only write born here is the proof-of-payment upload. Las cuentas por cobrar de un punto de venta: límite de crédito, documentos abiertos (DPI), notas de crédito disponibles y el camino hasta el pago. Son cuatro pantallas en un solo flujo — el hub por punto de venta y tres detalles (documento, factura, nota de crédito). Toda la lectura sale del caché grabado por una única llamada gRPC; la única escritura que nace aquí es el envío del comprobante de pago.

PúblicoAudiencePúblico
Representante · QA · Suporte · DevRep · QA · Support · DevRepresentante · QA · Soporte · Dev
Onde ficaWhereDónde
Detalhe da visita → Gestão financeiraVisit detail → Financial managementDetalle de la visita → Gestión financiera
AtualizadoUpdatedActualizado
29/07/20262026-07-29
Disponível emAvailable inDisponible en BR CL ZA
01

O que é e para que serveWhat it is and what it's forQué es y para qué sirve

Um título em aberto (DPI — debit open item) é uma dívida do varejo com a companhia: normalmente uma nota fiscal faturada e ainda não paga. A Gestão financeira reúne, para um varejo por vez, o perfil de crédito dele, a lista desses títulos e — nos mercados que têm — as notas de crédito que ele pode usar para abater dívida. O representante de vendas usa a tela para responder três perguntas na frente do cliente: quanto ele deve, o que está vencido e o que dá para receber agora. An open debit item (DPI) is the retail's debt with the company: usually an invoiced, still unpaid invoice. Financial management gathers, for one retail at a time, its credit profile, the list of those debit items and — in the markets that have them — the credit notes it can use to write debt down. The sales rep uses the screen to answer three questions in front of the customer: how much they owe, what is overdue and what can be collected right now. Un documento abierto (DPI — debit open item) es una deuda del punto de venta con la compañía: normalmente una factura emitida y aún no pagada. La Gestión financiera reúne, para un punto de venta a la vez, su perfil de crédito, la lista de esos documentos y — en los mercados que las tienen — las notas de crédito que puede usar para descontar deuda. El representante de ventas usa la pantalla para responder tres preguntas frente al cliente: cuánto debe, qué está vencido y qué se puede cobrar ahora.

A feature é um hub com três drill-downs, cada um numa tela própria: o detalhe do título (dados do documento, pagamentos já registrados e envio de comprovante), o detalhe da nota fiscal (itens, bonificação e totais do documento faturado) e o detalhe da nota de crédito (origem do crédito e onde ele já foi aplicado). Fora deste documento ficam duas vizinhas: a criação de pagamentos, para onde o botão de pagar navega, e o detalhe do pedido, dono do pedido que originou a nota fiscal. The feature is one hub with three drill-downs, each on its own screen: the debit item detail (document data, already-registered payments and the proof upload), the invoice detail (items, free-of-charge goods and the invoiced document's totals) and the credit note detail (where the credit came from and where it has been applied). Two neighbours stay outside this document: payment creation, where the pay button navigates to, and the order detail, owner of the order that produced the invoice. La feature es un hub con tres drill-downs, cada uno en su propia pantalla: el detalle del documento (datos del documento, pagos ya registrados y envío del comprobante), el detalle de la factura (ítems, bonificación y totales del documento facturado) y el detalle de la nota de crédito (origen del crédito y dónde ya fue aplicado). Dos vecinas quedan fuera de este documento: la creación de pagos, hacia donde navega el botón de pagar, y el detalle del pedido, dueño del pedido que originó la factura.

Um varejo por vezOne retail at a timeUn punto de venta a la vez

A tela recebe só o accountSfid e recorta o agregado financeiro do mercado inteiro para aquele varejo.The screen receives only the accountSfid and slices the whole market's financial aggregate down to that retail.La pantalla recibe solo el accountSfid y recorta el agregado financiero de todo el mercado para ese punto de venta.

Três drill-downsThree drill-downsTres drill-downs

Título → nota fiscal, nota de crédito → nota fiscal. A nota fiscal é a folha do fluxo: dela não se navega para mais nada.Debit item → invoice, credit note → invoice. The invoice is the leaf of the flow: nothing is reachable from it.Documento → factura, nota de crédito → factura. La factura es la hoja del flujo: de ella no se navega a nada más.

Leitura do cacheRead from cacheLectura del caché

As quatro telas leem o cache local. A rede só é acionada no arrastar-para-atualizar do hub e na varredura de dados vencidos.All four screens read the local cache. The network is only hit by the hub's pull-to-refresh and by the stale-data sweep.Las cuatro pantallas leen el caché local. La red solo se usa en el deslizar-para-actualizar del hub y en el barrido de datos vencidos.

Dois perfis de featureTwo feature profilesDos perfiles de feature A mesma feature aparece em dois tamanhos, definidos por configuração de mercado. BR e ZA têm o perfil reduzido: crédito, filtros, lista de títulos e comprovante de pagamento. CL tem o perfil completo: acrescenta abas, notas de crédito (lista e detalhe), criação de pagamento e link de pagamento — e desliga o comprovante no detalhe do título. Matriz chave por chave em Mercados. The same feature shows up in two sizes, set by market configuration. BR and ZA get the reduced profile: credit, filters, debit item list and proof of payment. CL gets the full profile: it adds tabs, credit notes (list and detail), payment creation and the payment link — and turns the proof off inside the debit item detail. Key-by-key matrix in Markets. La misma feature aparece en dos tamaños, definidos por configuración de mercado. BR y ZA tienen el perfil reducido: crédito, filtros, lista de documentos y comprobante de pago. CL tiene el perfil completo: agrega pestañas, notas de crédito (lista y detalle), creación de pago y link de pago — y apaga el comprobante en el detalle del documento. Matriz clave por clave en Mercados.

02

Como acessarHow to openCómo acceder

Duas entradas levam ao hub, e de lá o fluxo se abre em três detalhes. A entrada muda uma coisa relevante: a origem (origin), que decide se o pagamento exige visita iniciada e qual forma de pagamento já vem pré-selecionada na tela seguinte.Two entry points lead to the hub, and from there the flow opens into three details. The entry point changes one relevant thing: the origin (origin), which decides whether the payment requires a started visit and which payment method comes pre-selected on the next screen.Dos entradas llevan al hub, y desde ahí el flujo se abre en tres detalles. La entrada cambia una cosa relevante: el origen (origin), que decide si el pago exige visita iniciada y qué método de pago viene preseleccionado en la pantalla siguiente.

EntradaEntry pointEntrada CaminhoPathCamino OrigemOriginOrigen MercadosMarketsMercados
Detalhe da visitaVisit detailDetalle de la visita Visitas → abrir a visita → grade de ferramentas → Gestão financeiraVisits → open the visit → tools grid → Financial managementVisitas → abrir la visita → grilla de herramientas → Gestión financiera financialManagementpagar exige visita iniciadapaying requires a started visitpagar exige visita iniciada BR CL ZA
Gestão de cobrançasCollections managementGestión de cobranzas Home → ações do representante → Gestão de cobranças → escolher o varejoHome → rep actions → Collections management → pick the retailHome → acciones del representante → Gestión de cobranzas → elegir el punto de venta collectionsnão exige visita; usa a forma preferida do varejono visit required; uses the retail's preferred methodno exige visita; usa el método preferido del punto de venta CL

A partir do hub, os caminhos internos:From the hub, the internal paths:Desde el hub, los caminos internos:

  1. Detalhe do títuloDebit item detailDetalle del documentoToque em qualquer card da lista de títulos em aberto. Ao voltar, o hub recarrega os títulos e mantém a seleção que ainda for pagável.Tap any card in the open debit item list. On the way back, the hub reloads the debit items and keeps whatever selection is still payable.Toque cualquier card de la lista de documentos abiertos. Al volver, el hub recarga los documentos y mantiene la selección que siga siendo pagable.
  2. Detalhe da nota fiscalInvoice detailDetalle de la facturaNo detalhe do título, o campo Número vira link sublinhado quando o pedido da nota fiscal está no cache. Sem o pedido em cache, o campo fica texto simples.In the debit item detail, the Number field becomes an underlined link when the invoice's order is in cache. With no cached order, the field stays plain text.En el detalle del documento, el campo Número se vuelve un link subrayado cuando el pedido de la factura está en el caché. Sin el pedido en caché, el campo queda como texto simple.
  3. Detalhe da nota de créditoCredit note detailDetalle de la nota de créditoAba Notas de crédito → toque na linha. O toque só existe onde o detalhe da nota de crédito está habilitado (hoje, apenas no Chile).The Credit notes tab → tap the row. The tap only exists where the credit note detail is enabled (today, Chile only).Pestaña Notas de crédito → toque la fila. El toque solo existe donde el detalle de la nota de crédito está habilitado (hoy, solo Chile).
  4. Da nota de crédito para a nota fiscalFrom the credit note to the invoiceDe la nota de crédito a la facturaBotão Ver detalhes nos cards de origem e de faturas aplicadas — também só quando o pedido está no cache; senão o card mostra um aviso de indisponível.The View details button on the origin and applied-invoice cards — again only when the order is cached; otherwise the card shows an unavailable notice.Botón Ver detalles en los cards de origen y de facturas aplicadas — también solo cuando el pedido está en caché; si no, el card muestra un aviso de no disponible.
  5. Para o pagamentoTo the paymentAl pagoBarra fixa Pagar selecionados (hub) ou botão Pagar (detalhe do título) → criação de pagamentos. Volta trazendo se o pagamento foi feito, e o hub recarrega.The pinned Pay selected bar (hub) or the Pay button (debit item detail) → payment creation. It returns whether the payment went through, and the hub reloads.Barra fija Pagar seleccionados (hub) o botón Pagar (detalle del documento) → creación de pagos. Vuelve informando si el pago se realizó, y el hub recarga.

Visita iniciadaStarted visitVisita iniciada Quando a tela foi aberta pelo detalhe da visita e existe visita para aquele varejo, tanto Pagar selecionados quanto Pagar passam por uma verificação: se a visita não estiver iniciada, o app abre um modal oferecendo iniciá-la antes de seguir. Vindo da gestão de cobranças essa exigência não existe. When the screen was opened from the visit detail and a visit exists for that retail, both Pay selected and Pay go through a check: if the visit isn't started, the app opens a modal offering to start it before moving on. Coming from collections management that requirement doesn't apply. Cuando la pantalla se abrió desde el detalle de la visita y existe visita para ese punto de venta, tanto Pagar seleccionados como Pagar pasan por una verificación: si la visita no está iniciada, la app abre un modal ofreciendo iniciarla antes de seguir. Viniendo de gestión de cobranzas esa exigencia no aplica.

03

Estrutura das telasScreen structureEstructura de las pantallas

As quatro telas abrem com seta de voltar, sem título de barra superior, e começam pelo mesmo par: a faixa Dados carregados em… e o cartão do varejo (código SAP, nome em maiúsculas e, quando é o caso, o selo de inadimplência).All four screens open with a back arrow, no top-bar title, and start with the same pair: the Data loaded at… strip and the retail card (SAP code, name in caps and, where applicable, the overdue badge).Las cuatro pantallas abren con flecha de volver, sin título de barra superior, y empiezan por el mismo par: la franja Datos cargados en… y la tarjeta del punto de venta (código SAP, nombre en mayúsculas y, cuando corresponde, el sello de mora).

Hub — Gestão financeiraHub — Financial managementHub — Gestión financiera

CréditoCreditCrédito
Card de três colunas separadas por linha fina: Limite de crédito, Disponível (em vermelho) e Dias de crédito. Cada valor ausente aparece como travessão.A card with three columns split by hairlines: Credit limit, Available (in red) and Credit days. Any missing value shows as a dash.Card de tres columnas separadas por línea fina: Límite de crédito, Disponible (en rojo) y Días de crédito. Cada valor ausente aparece como guion.
AbasTabsPestañas
Débitos e Notas de crédito. A barra de abas só aparece quando as duas estão habilitadas no mercado; com uma só, a tela mostra a seção direto, sem abas.Debits and Credit notes. The tab bar only shows when both are enabled in the market; with a single one, the screen shows the section straight away, no tabs.Débitos y Notas de crédito. La barra de pestañas solo aparece cuando ambas están habilitadas en el mercado; con una sola, la pantalla muestra la sección directamente, sin pestañas.
Cabeçalho da abaTab headerEncabezado de la pestaña
Contagem e soma: em Débitos, N em aberto + total em aberto; em Notas de crédito, N disponíveis + soma do saldo disponível. Ao lado, o botão Filtrar, que fica destacado quando há filtro ativo.Count and sum: in Debits, N open + open total; in Credit notes, N available + sum of the available balance. Beside it, the Filter button, highlighted whenever a filter is active.Conteo y suma: en Débitos, N abiertos + total abierto; en Notas de crédito, N disponibles + suma del saldo disponible. A su lado, el botón Filtrar, destacado cuando hay filtro activo.
Card do títuloDebit item cardCard del documento
Avatar com a letra do tipo de representante (colorido pelo status), pílula de status, pílula extra de link de pagamento quando existe, nome do documento, Fatura: N quando há número, o valor, a data de vencimento e o status de entrega. Onde há criação de pagamento, um checkbox aparece nos títulos ainda pagáveis.An avatar with the rep type's letter (coloured by status), the status pill, an extra payment-link pill when there is one, the document name, Invoice: N when a number exists, the amount, the due date and the delivery status. Where payment creation exists, a checkbox shows on the still-payable debit items.Avatar con la letra del tipo de representante (coloreado por estado), pastilla de estado, pastilla extra de link de pago cuando existe, nombre del documento, Factura: N cuando hay número, el monto, la fecha de vencimiento y el estado de entrega. Donde hay creación de pago, aparece un checkbox en los documentos aún pagables.
Linha da nota de créditoCredit note rowFila de la nota de crédito
Pílula Disponível ou Utilizada, número de referência (folio), valor e data.An Available or Used pill, reference number (folio), amount and date.Pastilla Disponible o Utilizada, número de referencia (folio), monto y fecha.
Barra fixa de pagamentoPinned payment barBarra fija de pago
Só aparece onde a criação de pagamento existe e há pelo menos um título marcado. Mostra Documentos (quantos) e Total a pagar, com o botão Pagar selecionados. Arrastando para cima, lista os documentos escolhidos.Only shows where payment creation exists and at least one debit item is ticked. It displays Documents (how many) and Total to pay, with the Pay selected button. Dragging it up lists the chosen documents.Solo aparece donde existe la creación de pago y hay al menos un documento marcado. Muestra Documentos (cuántos) y Total a pagar, con el botón Pagar seleccionados. Arrastrando hacia arriba, lista los documentos elegidos.

Detalhe do título em abertoOpen debit item detailDetalle del documento abierto

Card do títuloDebit item cardCard del documento
Repete o card da lista (nome, avatar, status, valor, vencimento, entrega) e acrescenta uma grade de cinco informações: Número (link para a nota fiscal), Nº fatura, Dias em aberto, Status da nota fiscal e Em disputa (sim/não).It repeats the list card (name, avatar, status, amount, due date, delivery) and adds a five-field grid: Number (link to the invoice), Invoice no., Open days, invoice Status and In dispute (yes/no).Repite el card de la lista (nombre, avatar, estado, monto, vencimiento, entrega) y agrega una grilla de cinco datos: Número (link a la factura), Nº factura, Días abiertos, Estado de la factura y En disputa (sí/no).
Botão PagarPay buttonBotón Pagar
Só existe se a criação de pagamento está habilitada, o título está em aberto e não há link de pagamento já bem-sucedido.Only exists if payment creation is enabled, the debit item is open and there is no already-successful payment link.Solo existe si la creación de pago está habilitada, el documento está abierto y no hay un link de pago ya exitoso.
PagamentosPaymentsPagos
Lista os pagamentos daquele título de duas fontes: os criados no aparelho (com status de sincronização) e os que o backend devolveu. Cada card diz se veio por Link de pagamento ou Manual, e detalha forma, valor, datas, nº de transação, banco, agência e status. Sem nenhum, mostra um estado vazio.It lists that debit item's payments from two sources: the ones created on the device (with their sync status) and the ones the backend returned. Each card says whether it came from a Payment link or was Manual, and details method, amount, dates, transaction no., bank, branch and status. With none, it shows an empty state.Lista los pagos de ese documento desde dos fuentes: los creados en el dispositivo (con estado de sincronización) y los que devolvió el backend. Cada card indica si vino por Link de pago o fue Manual, y detalla método, monto, fechas, nº de transacción, banco, sucursal y estado. Sin ninguno, muestra un estado vacío.
Comprovante de pagamentoProof of paymentComprobante de pago
Dois botões — Tirar foto (só câmera) e Anexar (imagem, PDF ou documento) — miniaturas removíveis do que foi capturado, e o botão Enviar comprovante. É a única escrita que nasce nesta feature.Two buttons — Take photo (camera only) and Attach (image, PDF or document) — removable thumbnails of what was captured, and the Send proof button. This is the only write born in this feature.Dos botones — Tomar foto (solo cámara) y Adjuntar (imagen, PDF o documento) — miniaturas removibles de lo capturado, y el botón Enviar comprobante. Es la única escritura que nace en esta feature.

Detalhe da nota fiscalInvoice detailDetalle de la factura

Número legalLegal numberNúmero legal
Pílula cinza de largura cheia com o número legal do documento; sem ele, cai para o número da nota fiscal e, na falta dos dois, mostra travessão.A full-width grey pill with the document's legal number; without it, it falls back to the invoice number and, lacking both, shows a dash.Pastilla gris de ancho completo con el número legal del documento; sin él, cae al número de la factura y, faltando ambos, muestra un guion.
Grade de informaçõesInfo gridGrilla de datos
Seis campos em três linhas: Nº PO, PO do varejo, Origem, Recurso, Forma de pagamento e Nº fatura.Six fields in three rows: PO no., Retail PO, Source, Resource, Payment method and Invoice no.Seis campos en tres filas: Nº PO, PO del punto de venta, Origen, Recurso, Método de pago y Nº factura.
PagamentoPaymentPago
Tabela Itens · Valor · Vencimento com as parcelas do pedido. Sem parcelas, uma linha substituta mostra o total da nota fiscal e a data de entrega do pedido.An Items · Value · Due date table with the order's instalments. With no instalments, a substitute row shows the invoice total and the order's delivery date.Tabla Ítems · Monto · Vencimiento con las cuotas del pedido. Sin cuotas, una fila sustituta muestra el total de la factura y la fecha de entrega del pedido.
Itens e bonificaçãoItems and free of chargeÍtems y bonificación
Duas seções separadas: os itens pagos, agrupados por categoria (SKU · valor · quantidade), e os itens de bonificação (SKU · quantidade, sem valor). Cada seção desaparece quando não tem conteúdo.Two separate sections: the paid items, grouped by category (SKU · value · quantity), and the free-of-charge items (SKU · quantity, no value). Each section disappears when it has no content.Dos secciones separadas: los ítems pagados, agrupados por categoría (SKU · monto · cantidad), y los ítems de bonificación (SKU · cantidad, sin monto). Cada sección desaparece cuando no tiene contenido.
TotaisTotalsTotales
Subtotal, desconto, taxa, imposto e total. Subtotal, desconto e total vêm da nota fiscal; taxa e imposto vêm do pedido, que é quem os tem.Subtotal, discount, fee, tax and total. Subtotal, discount and total come from the invoice; fee and tax come from the order, which is what carries them.Subtotal, descuento, tasa, impuesto y total. Subtotal, descuento y total vienen de la factura; tasa e impuesto vienen del pedido, que es quien los tiene.

Detalhe da nota de créditoCredit note detailDetalle de la nota de crédito

Card da notaNote cardCard de la nota
Pílula Disponível/Utilizada, Folio e Data, Valor e Saldo disponível, e o Tipo (excedente de pagamento ou devolução de venda).An Available/Used pill, Folio and Date, Amount and Available balance, and the Type (payment overpayment or sales return).Pastilla Disponible/Utilizada, Folio y Fecha, Monto y Saldo disponible, y el Tipo (excedente de pago o devolución de venta).
OrigemOriginOrigen
O título da seção muda com o tipo: Pagamento de origem para excedente, Fatura de origem para devolução. No excedente, o card traz DPI, nº fatura, total devido, total pago, diferença e forma de pagamento. Sem origem, um estado vazio explica que não há informação.The section title changes with the type: Payment of origin for an overpayment, Invoice of origin for a return. For an overpayment the card carries DPI, invoice no., total due, total paid, difference and payment method. With no origin, an empty state explains there is no information.El título de la sección cambia con el tipo: Pago de origen para excedente, Factura de origen para devolución. En el excedente, el card trae DPI, nº factura, total debido, total pagado, diferencia y método de pago. Sin origen, un estado vacío explica que no hay información.
Faturas aplicadasApplied invoicesFacturas aplicadas
Um card por fatura em que o crédito foi usado, com nº fatura, nº PO, PO do varejo, origem, recurso e forma de pagamento. A seção some quando a nota nunca foi usada e não tem faturas aplicadas.One card per invoice where the credit was used, with invoice no., PO no., retail PO, source, resource and payment method. The section disappears when the note was never used and has no applied invoices.Un card por factura donde se usó el crédito, con nº factura, nº PO, PO del punto de venta, origen, recurso y método de pago. La sección desaparece cuando la nota nunca se usó y no tiene facturas aplicadas.
04

Status e estadosStatuses & statesEstados y estatus

Status do título em abertoOpen debit item statusEstado del documento abierto

Em abertoOpenAbierta RecebidoCollectedCobrada FechadoClosedCerrada

O status colore o avatar e a pílula do card. Um título só é pagável quando está em aberto e não tem link de pagamento bem-sucedido — é essa combinação que faz o checkbox e o botão Pagar aparecerem, e é ela que alimenta a contagem de N em aberto no cabeçalho. Quando o pagamento é registrado e cobre o saldo inteiro, o app zera o valor do título, muda o status para recebido e limpa a marca de vencido. Valor desconhecido cai em um status neutro que mostra travessão.The status colours the card's avatar and pill. A debit item is only payable when it is open and has no successful payment link — that combination is what makes the checkbox and the Pay button appear, and it feeds the N open count in the header. When a payment is registered and covers the whole balance, the app zeroes the debit item's amount, flips the status to collected and clears the overdue mark. An unknown value falls into a neutral status that renders a dash.El estado colorea el avatar y la pastilla del card. Un documento solo es pagable cuando está abierto y no tiene link de pago exitoso — esa combinación es la que hace aparecer el checkbox y el botón Pagar, y la que alimenta el conteo de N abiertos en el encabezado. Cuando el pago se registra y cubre el saldo completo, la app pone en cero el monto del documento, cambia el estado a cobrada y limpia la marca de vencido. Un valor desconocido cae en un estado neutro que muestra un guion.

Link de pagamentoPayment linkLink de pago

Link de pagamento criadoPayment link createdLink de pago creado Pagamento em validaçãoPayment under validationPago en validación

Uma pílula extra aparece no card do título quando um link de pagamento foi gerado para ele. Sem link, nada é exibido. Com o link já bem-sucedido, o título deixa de ser pagável — o dinheiro está em validação e um segundo pagamento seria duplicidade.An extra pill shows on the debit item card when a payment link has been generated for it. With no link, nothing is displayed. Once the link is successful the debit item stops being payable — the money is under validation and a second payment would be a duplicate.Una pastilla extra aparece en el card del documento cuando se generó un link de pago para él. Sin link, no se muestra nada. Con el link ya exitoso, el documento deja de ser pagable — el dinero está en validación y un segundo pago sería duplicidad.

Entrega, nota de crédito e pagamentoDelivery, credit note and paymentEntrega, nota de crédito y pago

EntregaDeliveryEntrega
O rodapé do card colapsa os cinco status de entrega do backend em dois: Entregue e Não entregue (que cobre pendente, não entregue, reagendado e rejeitado). Status desconhecido mostra travessão.The card footer collapses the backend's five delivery statuses into two: Delivered and Not delivered (covering pending, not delivered, rescheduled and rejected). An unknown status renders a dash.El pie del card colapsa los cinco estados de entrega del backend en dos: Entregado y No entregado (que cubre pendiente, no entregado, reagendado y rechazado). Un estado desconocido muestra un guion.
Nota de créditoCredit noteNota de crédito
Só dois estados: Disponível e Utilizada. O saldo disponível é o valor informado pelo backend; quando ele vem zerado, o app usa o valor cheio da nota se ela ainda não foi usada, e zero se já foi. Um pagamento com nota de crédito marca as notas usadas e zera o valor delas.Only two states: Available and Used. The available balance is the amount the backend reports; when it comes as zero, the app uses the note's full amount if it hasn't been used yet, and zero if it has. A payment with credit notes marks the used ones and zeroes their amount.Solo dos estados: Disponible y Utilizada. El saldo disponible es el monto informado por el backend; cuando llega en cero, la app usa el monto completo de la nota si aún no fue usada, y cero si ya lo fue. Un pago con notas de crédito marca las notas usadas y pone su monto en cero.
PagamentoPaymentPago
Os pagamentos listados no detalhe do título usam os mesmos quatro estados da criação de pagamentos: aguardando aprovação do pedido, aguardando débito do pedido, pronto para sincronizar e sincronizado. Pagamentos vindos do backend caem sempre no último.The payments listed in the debit item detail use the same four states as payment creation: awaiting order approval, awaiting order debit, ready to sync and synced. Payments coming from the backend always land on the last one.Los pagos listados en el detalle del documento usan los mismos cuatro estados de la creación de pagos: esperando aprobación del pedido, esperando el débito del pedido, listo para sincronizar y sincronizado. Los pagos que vienen del backend caen siempre en el último.

Estados de telaScreen statesEstados de pantalla

CarregandoLoadingCargando
As quatro telas mostram o indicador de carregamento com o logo, centralizado, cobrindo a tela inteira.All four screens show the logo loading indicator, centred, covering the whole screen.Las cuatro pantallas muestran el indicador de carga con el logo, centrado, cubriendo toda la pantalla.
ErroErrorError
Tela de falha com botão de tentar de novo. No hub, no detalhe do título e na nota fiscal o retry recria a tela; no detalhe da nota de crédito ele apenas recarrega os dados.A failure screen with a retry button. On the hub, the debit item detail and the invoice, retry rebuilds the screen; on the credit note detail it simply reloads the data.Pantalla de falla con botón de reintentar. En el hub, el detalle del documento y la factura, el reintento reconstruye la pantalla; en el detalle de la nota de crédito solo recarga los datos.
Nota fiscal não encontradaInvoice not foundFactura no encontrada
Caso próprio da nota fiscal: se o pedido não está no cache, ou está sem nota fiscal, a tela mostra um card de não encontrada em vez da tela de falha genérica.A case of its own on the invoice: if the order isn't cached, or has no invoice, the screen shows a not found card instead of the generic failure screen.Caso propio de la factura: si el pedido no está en caché, o está sin factura, la pantalla muestra un card de no encontrada en lugar de la pantalla de falla genérica.
Listas vaziasEmpty listsListas vacías
Cada lista tem seu card de vazio. A de títulos distingue sem títulos de nenhum resultado para o filtro, com textos diferentes. Notas de crédito, pagamentos, origem e faturas aplicadas têm cada um o seu.Each list has its own empty card. The debit item one distinguishes no debit items from no result for the filter, with different copy. Credit notes, payments, origin and applied invoices each have their own.Cada lista tiene su card de vacío. La de documentos distingue sin documentos de ningún resultado para el filtro, con textos distintos. Notas de crédito, pagos, origen y facturas aplicadas tienen cada uno el suyo.
05

AçõesActionsAcciones

Filtrar títulosFilter debit itemsFiltrar documentos
Dois critérios, ambos habilitados por mercado: status (seleção múltipla de pílulas) e período (data inicial e final por calendário). Datas invertidas são trocadas automaticamente. O botão Limpar filtros só aparece quando há filtro no rascunho. O filtro vale só para a aba de débitos — notas de crédito não são filtradas.Two criteria, both enabled per market: status (multi-select pills) and period (start and end date via calendar). Inverted dates are swapped automatically. The Clear filters button only shows when the draft has a filter. The filter applies to the debits tab only — credit notes are not filtered.Dos criterios, ambos habilitados por mercado: estado (selección múltiple de pastillas) y período (fecha inicial y final por calendario). Las fechas invertidas se intercambian automáticamente. El botón Limpiar filtros solo aparece cuando hay filtro en el borrador. El filtro vale solo para la pestaña de débitos — las notas de crédito no se filtran.
Selecionar títulos para pagarSelect debit items to paySeleccionar documentos para pagar
O checkbox só existe nos títulos pagáveis. A barra fixa acompanha a seleção em tempo real (quantidade e total). Quando o filtro muda ou os dados recarregam, a seleção é depurada: sobra apenas o que continua pagável.The checkbox only exists on payable debit items. The pinned bar tracks the selection live (count and total). When the filter changes or data reloads, the selection is pruned: only what is still payable survives.El checkbox solo existe en los documentos pagables. La barra fija sigue la selección en tiempo real (cantidad y total). Cuando el filtro cambia o los datos recargan, la selección se depura: queda solo lo que sigue siendo pagable.
PagarPayPagar
Dois caminhos com o mesmo destino: Pagar selecionados (vários títulos, do hub) e Pagar (um título, do detalhe). Ambos semeiam o rascunho de pagamento com os documentos escolhidos e navegam para a criação de pagamentos. Na volta, o rascunho é limpo e, se houve pagamento, os dados recarregam.Two paths, one destination: Pay selected (several debit items, from the hub) and Pay (one debit item, from the detail). Both seed the payment draft with the chosen documents and navigate to payment creation. On the way back the draft is cleared and, if a payment happened, the data reloads.Dos caminos con el mismo destino: Pagar seleccionados (varios documentos, desde el hub) y Pagar (un documento, desde el detalle). Ambos siembran el borrador de pago con los documentos elegidos y navegan a la creación de pagos. Al volver, el borrador se limpia y, si hubo pago, los datos recargan.
Enviar comprovante de pagamentoSend proof of paymentEnviar comprobante de pago
Uma foto e/ou um anexo por título, capturados numa sessão própria que é limpa ao sair da tela. Enviar dispara a transação comprovante de pagamento e mostra um aviso verde no sucesso ou vermelho na falha. No sucesso, as miniaturas somem e os arquivos temporários são apagados. Nada é guardado localmente — falhou, é preciso capturar de novo.One photo and/or one attachment per debit item, captured in a session of its own that is cleaned when the screen closes. Sending fires the proof of payment transaction and shows a green notice on success or a red one on failure. On success the thumbnails disappear and the temporary files are deleted. Nothing is stored locally — if it failed, it has to be captured again.Una foto y/o un adjunto por documento, capturados en una sesión propia que se limpia al salir de la pantalla. Enviar dispara la transacción comprobante de pago y muestra un aviso verde en el éxito o rojo en la falla. En el éxito las miniaturas desaparecen y los archivos temporales se borran. Nada se guarda localmente — si falló, hay que capturar de nuevo.
Abrir a nota fiscalOpen the invoiceAbrir la factura
Dois pontos de entrada: o campo Número no detalhe do título e o botão Ver detalhes nos cards da nota de crédito. Os dois só ficam ativos com o pedido no cache — é essa checagem que evita cair na tela de não encontrada.Two entry points: the Number field in the debit item detail and the View details button on the credit note cards. Both are only active with the order in cache — that check is what avoids landing on the not found screen.Dos puntos de entrada: el campo Número en el detalle del documento y el botón Ver detalles en los cards de la nota de crédito. Ambos solo están activos con el pedido en caché — esa verificación es la que evita caer en la pantalla de no encontrada.
AtualizarRefreshActualizar
Arrastar para baixo existe no hub e no detalhe da nota de crédito. No hub, ele busca do servidor visitas, varejos e o agregado financeiro antes de remontar a tela, preservando filtro, aba e seleção. No detalhe da nota de crédito, só relê o cache. Detalhe do título e nota fiscal não têm arrastar para atualizar.Pull-to-refresh exists on the hub and on the credit note detail. On the hub it fetches visits, retails and the financial aggregate from the server before rebuilding the screen, preserving filter, tab and selection. On the credit note detail it only re-reads the cache. Debit item detail and invoice have no pull-to-refresh.Deslizar para actualizar existe en el hub y en el detalle de la nota de crédito. En el hub busca del servidor visitas, puntos de venta y el agregado financiero antes de rearmar la pantalla, preservando filtro, pestaña y selección. En el detalle de la nota de crédito solo relee el caché. El detalle del documento y la factura no tienen deslizar para actualizar.

Não existe busca nem ordenaçãoNo search, no sortingNo hay búsqueda ni orden Ao contrário da lista de pedidos, esta feature não tem campo de busca nem botão de ordenar. A ordem dos títulos e das notas de crédito é a que vem do backend, e o único recorte é o filtro de status e período. Unlike the order list, this feature has no search field and no sort button. The order of debit items and credit notes is whatever the backend sends, and the only slice is the status and period filter. A diferencia de la lista de pedidos, esta feature no tiene campo de búsqueda ni botón de ordenar. El orden de los documentos y de las notas de crédito es el que llega del backend, y el único recorte es el filtro de estado y período.

06

Arquitetura e fluxo de dadosArchitecture & data flowArquitectura y flujo de datos

Clean Architecture + Riverpod + Freezed + ObjectBox. São dois fluxos distintos: a leitura, que enche um agregado único no cache e serve as quatro telas a partir dele, e a escrita do comprovante de pagamento, que sai direto pelo Dispatcher sem gravar nada local.Clean Architecture + Riverpod + Freezed + ObjectBox. There are two distinct flows: the read, which fills a single aggregate in cache and serves all four screens from it, and the write of the proof of payment, which goes straight out through the Dispatcher without persisting anything locally.Clean Architecture + Riverpod + Freezed + ObjectBox. Hay dos flujos distintos: la lectura, que llena un agregado único en el caché y sirve las cuatro pantallas desde ahí, y la escritura del comprobante de pago, que sale directo por el Dispatcher sin grabar nada local.

Leitura · um agregado, quatro telasRead · one aggregate, four screensLectura · un agregado, cuatro pantallas

Um único RPC traz todos os títulos, bancos, pagamentos e notas de crédito do mercado — não há request por varejo. O retorno é gravado em FinancialManagementModel (linha única, write-through) e daí em diante cada tela recorta o que precisa em memória: por accountSfid no hub, por sfid nos detalhes. O locationHierarchySfid é resolvido dentro do repository a partir do currentResourceProvider.A single RPC brings every debit item, bank, payment and credit note in the market — there is no per-retail request. The response is written into FinancialManagementModel (single row, write-through) and from then on each screen slices what it needs in memory: by accountSfid on the hub, by sfid on the details. The locationHierarchySfid is resolved inside the repository from currentResourceProvider.Un único RPC trae todos los documentos, bancos, pagos y notas de crédito del mercado — no hay request por punto de venta. La respuesta se graba en FinancialManagementModel (fila única, write-through) y de ahí en adelante cada pantalla recorta lo que necesita en memoria: por accountSfid en el hub, por sfid en los detalles. El locationHierarchySfid se resuelve dentro del repository a partir de currentResourceProvider.

  • FinancialManagementConectaRepServicegetFinancialManagement · gRPC
    • toDTOFinancialManagementRemoteDataSource
      • toDomain + saveFinancialManagementFinancialManagementRepositoryImplwrite-through · fallback pro cache
        • put (linha única)FinancialManagementModelObjectBox · 8 boxes
          • getCached*GetFinancialManagementUseCase+ GetDebitOpenItemsForAccount · GetCreditNotesForAccount
            • recorte por accountFinancialManagementNotifier
              • → UIFinancialManagementPage
            • getCachedDebitOpenItemBySfidDebitOpenItemDetailNotifier+ Order · Visit · PaymentRegisters
              • → UIDebitOpenItemDetailPage
            • getCachedCreditNoteBySfidCreditNoteDetailNotifier+ Retail · Orders (gate de link)
              • → UICreditNoteDetailPage

A nota fiscal fica fora dessa cadeia: ela não existe no proto de gestão financeira. O InvoiceDetailNotifier lê o cache de pedidos (GetOrdersUseCase.getCachedBySfid) e trabalha sobre order.invoice — por isso o link para a nota fiscal só existe quando o pedido está no cache local.The invoice sits outside that chain: it doesn't exist in the financial management proto. InvoiceDetailNotifier reads the orders cache (GetOrdersUseCase.getCachedBySfid) and works over order.invoice — which is why the invoice link only exists when the order is in the local cache.La factura queda fuera de esa cadena: no existe en el proto de gestión financiera. El InvoiceDetailNotifier lee el caché de pedidos (GetOrdersUseCase.getCachedBySfid) y trabaja sobre order.invoice — por eso el link a la factura solo existe cuando el pedido está en el caché local.

  • OrdersModelObjectBox · cache de pedidos
    • getCachedBySfid + getCachedGetOrdersUseCase
      • order.invoice (BusinessFailure se ausente)InvoiceDetailNotifier
        • → UIInvoiceDetailPage

Escrita · comprovante de pagamentoWrite · proof of paymentEscritura · comprobante de pago

A única escrita da feature. O widget só aciona o método do Notifier; o Notifier reúne as entities cruas (título, pedido, visita, representante), resolve os base64 dos arquivos e o relógio (submittedAt), e o builder faz toda a construção wire. Não há registro local: o envelope vai ao Dispatcher e a falha volta como Failure para o widget mostrar o aviso.The feature's only write. The widget merely calls the Notifier's method; the Notifier gathers the raw entities (debit item, order, visit, rep), resolves the files' base64 and the clock (submittedAt), and the builder does all the wire construction. There is no local register: the envelope goes to the Dispatcher and a failure comes back as a Failure for the widget to show the notice.La única escritura de la feature. El widget solo llama al método del Notifier; el Notifier reúne las entities crudas (documento, pedido, visita, representante), resuelve los base64 de los archivos y el reloj (submittedAt), y el builder hace toda la construcción wire. No hay registro local: el envelope va al Dispatcher y la falla vuelve como Failure para que el widget muestre el aviso.

  • DebitOpenItemDetailProofOfPaymentWidgetUI · Enviar comprovante
    • submitProofOfPayment()DebitOpenItemDetailNotifiercurrentResourceProvider · readAsBase64 · DateTimeUtils.now()
      • build(input)BuildFinancialProofPaymentDispatcherPayloadUseCaseFinancialProofPaymentDispatcherPayloadInput
        • submit(envelope)SubmitFinancialProofPaymentUseCase
          • dispatchFinancialProofPaymentAPIDispatcherOrchestrator · batchApi
            • Success → limpa arquivos · Error → ConectaNoticeDebitOpenItemDetailStatesem persistência local

Duas escritas locais que vêm de foraTwo local writes that come from outsideDos escrituras locales que vienen de afuera O repository desta feature expõe dois mutadores locais que nenhuma das quatro telas chama: applyPaymentAllocations (abate o valor pago do saldo do título) e markCreditNotesUsed (marca as notas consumidas). Quem os chama é o orquestrador de submissão da criação de pagamentos, depois de o pagamento ter sucesso no backend (§36 remote-first). É por isso que voltar do pagamento e recarregar o hub já mostra o saldo abatido. Um terceiro, markDebitOpenItemsPaymentLinkPending, é chamado pelo fluxo de link de pagamento. This feature's repository exposes two local mutators that none of the four screens calls: applyPaymentAllocations (writes the paid amount down the debit item balance) and markCreditNotesUsed (marks the consumed notes). Their caller is the submission orchestrator in payment creation, after the payment succeeds on the backend (§36 remote-first). That is why coming back from the payment and reloading the hub already shows the reduced balance. A third one, markDebitOpenItemsPaymentLinkPending, is called by the payment link flow. El repository de esta feature expone dos mutadores locales que ninguna de las cuatro pantallas llama: applyPaymentAllocations (descuenta el monto pagado del saldo del documento) y markCreditNotesUsed (marca las notas consumidas). Quien los llama es el orquestador de envío de la creación de pagos, después de que el pago tiene éxito en el backend (§36 remote-first). Por eso volver del pago y recargar el hub ya muestra el saldo descontado. Un tercero, markDebitOpenItemsPaymentLinkPending, lo llama el flujo de link de pago.

07

Modelo de dadosData modelModelo de datos

O mesmo dado financeiro 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 dos campos se mantêm em todas as camadas; muda pouco (enums tipados, datas parseadas, relações, campos vazios virando nulos). O fetch é write-through: todo retorno é gravado no ObjectBox e as quatro telas passam a ler do cache.The same financial 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. Field names stay the same across layers; little changes (typed enums, parsed dates, relations, empty fields becoming null). Fetch is write-through: every response is written to ObjectBox and the four screens then read from cache.El mismo dato financiero 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 de los campos se mantienen en todas las capas; cambia poco (enums tipados, fechas parseadas, relaciones, campos vacíos que se vuelven nulos). El fetch es write-through: toda respuesta se graba en ObjectBox y las cuatro pantallas leen del caché.

Tudo chega num agregado único, FinancialManagementEntity: lastSyncAt (gerado no mapper de fronteira, o backend não envia), a flag isProofOfPaymentMandatory e quatro listas irmãs — títulos em aberto (18 campos cada), bancos (com agências), pagamentos e notas de crédito (com origem e pedidos aplicados). No ObjectBox ele vira uma linha única com quatro ToMany, e gravar significa limpar as oito boxes e regravar tudo. Os enums só existem tipados na Entity; em Proto/DTO/Model trafegam como String. A seguir, na ordem: o proto que transporta tudo, as estruturas de dados campo-a-campo por camada, os mappers que ligam as camadas e o resumo dos deltas.Everything arrives in a single aggregate, FinancialManagementEntity: lastSyncAt (generated in the boundary mapper — the backend doesn't send it), the isProofOfPaymentMandatory flag and four sibling lists — open debit items (18 fields each), banks (with branches), payments and credit notes (with origin and applied orders). In ObjectBox it becomes a single row with four ToMany, and saving means clearing the eight boxes and rewriting everything. Enums are only typed in the Entity; in Proto/DTO/Model they travel as String. Next, in order: the proto that carries it all, the field-by-field data structures per layer, the mappers that link the layers and the delta summary.Todo llega en un agregado único, FinancialManagementEntity: lastSyncAt (generado en el mapper de frontera, el backend no lo envía), la flag isProofOfPaymentMandatory y cuatro listas hermanas — documentos abiertos (18 campos cada uno), bancos (con sucursales), pagos y notas de crédito (con origen y pedidos aplicados). En ObjectBox se vuelve una fila única con cuatro ToMany, y grabar significa limpiar las ocho boxes y regrabar todo. Los enums solo están tipados en la Entity; en Proto/DTO/Model viajan como String. A continuación, en orden: el proto que transporta todo, las estructuras de datos campo a campo por capa, los mappers que unen las capas y el resumen de los deltas.

Proto

FinancialManagementConectaRep.proto · proto3 · package mn.bat.conectarep.streambridge. Um serviço (FinancialManagementConectaRepService) com três métodos unários — um de leitura do agregado e dois do link de pagamento:One service (FinancialManagementConectaRepService) with three unary methods — one reading the aggregate and two for the payment link:Un servicio (FinancialManagementConectaRepService) con tres métodos unarios — uno de lectura del agregado y dos del link de pago:

getFinancialManagementunary
MétodoMethodMétodo

rpc getFinancialManagement(FinancialManagementRequest) returns (FinancialManagementReply)

path /mn.bat.conectarep.streambridge.FinancialManagementConectaRepService/getFinancialManagement

Request · FinancialManagementRequest
locationHierarchySfid
string · #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)
lastModifiedDate
string · #2 · optional — nenhum caller passa hoje (ver Pendências)optional — no caller passes it today (see Pending items)optional — ningún caller lo pasa hoy (ver Pendientes)
Reply · FinancialManagementReply

repeated DebitOpenItem debitOpenItems · repeated Bank banks · repeated Payment payments · repeated CreditNote creditNotes · bool isProofOfPaymentMandatoryo agregado inteiro do mercado. Os campos de cada mensagem estão detalhados nas Estruturas de dados abaixo.the market's whole aggregate. Each message's fields are detailed in Data structures below.el agregado completo del mercado. Los campos de cada mensaje están detallados en Estructuras de datos abajo.

getBankListunary
MétodoMethodMétodo

rpc getBankList(PaymentLinkBankListRequest) returns (PaymentLinkBankListReply)

Bancos que aceitam link de pagamento. Sem cache: cada chamada vai à rede (ou ao mock).Banks that accept the payment link. No cache: every call hits the network (or the mock).Bancos que aceptan link de pago. Sin caché: cada llamada va a la red (o al mock).

Request · PaymentLinkBankListRequest
resourceSfid
string · #1 · representante de vendas da sessãothe session's sales reprepresentante de ventas de la sesión
Reply · PaymentLinkBankListReply

repeated PaymentLinkBank banks

createPaymentLinkunary
MétodoMethodMétodo

rpc createPaymentLink(CreatePaymentLinkRequest) returns (CreatePaymentLinkReply)

Cria o link de pagamento de um ou mais títulos. É a única escrita por RPC próprio desta camada — não passa pelo Dispatcher. O fluxo de tela vive na criação de pagamentos.Creates the payment link for one or more debit items. It is this layer's only write through its own RPC — it doesn't go through the Dispatcher. The screen flow lives in payment creation.Crea el link de pago de uno o más documentos. Es la única escritura por RPC propio de esta capa — no pasa por el Dispatcher. El flujo de pantalla vive en la creación de pagos.

Request · CreatePaymentLinkRequest
accountSfid
string · #1
resourceSfid
string · #2
bankName
string · #3 · banco escolhido na listabank picked from the listbanco elegido en la lista
customerTaxId
string · #4
totalAmount
double · #5
payment
repeated PaymentLinkItem · #6 · um item por títuloone item per debit itemun ítem por documento
accountCode
string · #7
Reply · CreatePaymentLinkReply

string url · string bankOrderId · string bankName · string htmlResponsehtmlResponse é recebido e descartado (ver Pendências).htmlResponse is received and dropped (see Pending items).htmlResponse se recibe y se descarta (ver Pendientes).

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; o texto em destaque marca onde o tipo primeiro muda (vazio→nulo no DTO, relação ToMany/ToOne e data parseada no Model, enum tipado na Entity). ¹ = optional no proto.One dropdown per structure, nested by hierarchy (lines link parent and children). Each table has one column per layer — Proto · DTO · Model · Entity; the highlighted text marks where the type first changes (empty→null in the DTO, ToMany/ToOne relation and parsed date in the Model, typed enum in the Entity). ¹ = optional in the proto.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; el texto destacado marca dónde primero cambia el tipo (vacío→nulo en el DTO, relación ToMany/ToOne y fecha parseada en el Model, enum tipado en la Entity). ¹ = optional en el proto.

  • FinancialManagement raiz · linha única no ObjectBoxsingle ObjectBox rowfila única en ObjectBox 6 camposfieldscampos
    CampoProtoDTOModelEntity
    lastSyncAtDateTimeDateTimeDateTime
    debitOpenItemsrepeated DebitOpenItemList<…DTO>ToMany<…Model>List<…Entity>
    banksrepeated BankList<…DTO>ToMany<…Model>List<…Entity>
    paymentsrepeated PaymentList<…DTO>ToMany<…Model>List<…Entity>
    creditNotesrepeated CreditNoteList<…DTO>ToMany<…Model>List<…Entity>
    isProofOfPaymentMandatoryboolboolboolbool
    • DebitOpenItem debitOpenItems[] 18 camposfieldscampos
      CampoProtoDTOModelEntity
      debitOpenItemSfidstringStringStringString
      accountSfidstringStringStringString
      namestringStringStringString
      pricedoubledoubledoubledouble
      statusstringStringStringDebitOpenItemStatus
      typestringStringStringString
      overdueboolboolboolbool
      datestringStringDateTime?DateTime
      invoiceSfidstringString?String?String?
      openDaysint32intintint
      inDisputeboolboolboolbool
      creditPeriod¹doubledouble?double?double?
      orderSfidstringStringStringString
      resourceTypestringStringStringResourceType
      invoiceNumberstringString?String?String?
      invoiceNamestringString?String?String?
      paymentLinkStatusstringStringStringPaymentLinkStatus
      deliveryStatusstringStringStringDeliveryStatus
    • Bank banks[] 3 camposfieldscampos
      CampoProtoDTOModelEntity
      sfidstringStringStringString
      namestringStringStringString
      branchesrepeated BankBranchList<…DTO>ToMany<…Model>List<…Entity>
      • BankBranch bank.branches[] 2 camposfieldscampos
        CampoProtoDTOModelEntity
        sfidstringStringStringString
        namestringStringStringString
    • Payment payments[] · espelho do backend, só leiturabackend mirror, read onlyespejo del backend, solo lectura 10 camposfieldscampos
      CampoProtoDTOModelEntity
      sfidstringStringStringString
      debitOpenItemSfidstringStringStringString
      accountSfidstringStringStringString
      invoiceSfidstringStringStringString
      paymentMethodstringStringStringString
      collectionReferencestringStringStringString
      payedAmountdoubledoubledoubledouble
      paymentDatestringStringDateTime?DateTime
      statusstringStringStringString
      paymentSourcestringStringStringPaymentSource
    • CreditNote creditNotes[] 10 camposfieldscampos
      CampoProtoDTOModelEntity
      sfidstringStringStringString
      retailerIdstringStringStringString
      referenceNumberstringStringStringString
      amountdoubledoubledoubledouble
      datestringStringDateTime?DateTime
      isUsedboolboolboolbool
      availableAmountdoubledoubledoubledouble
      creditNoteTypestringStringStringCreditNoteType
      origin¹CreditNoteOrigin…DTO?2 × ToOne…Entity?
      appliedOrdersrepeated CreditNoteOrderReferenceList<…DTO>ToMany<…Model>List<…Entity>
      • CreditNoteOrigin creditNote.origin · achatado no Modelflattened in the Modelachatado en el Model 2 camposfieldscampos
        CampoProtoDTOModelEntity
        cnap¹CreditNoteCnapOrigin…DTO?ToOne cnapOrigin…Entity?
        salesReturn¹CreditNoteOrderReference…DTO?ToOne salesReturnOrigin…Entity?
        • CreditNoteCnapOrigin origin.cnap · excedente de pagamentopayment overpaymentexcedente de pago 7 camposfieldscampos
          CampoProtoDTOModelEntity
          dpiNamestringStringStringString
          totalDuedoubledoubledoubledouble
          totalPaiddoubledoubledoubledouble
          differencedoubledoubledoubledouble
          paymentMethodstringStringStringString
          orderSfidstringStringStringString
          invoiceNamestringStringStringString
        • CreditNoteOrderReference origin.salesReturn eandy appliedOrders[] 7 camposfieldscampos
          CampoProtoDTOModelEntity
          orderSfidstringStringStringString
          invoiceNamestringStringStringString
          poNumberstringStringStringString
          retailerPoNumberstringStringStringString
          sourcestringStringStringString
          resourcestringStringStringString
          paymentMethodstringStringStringString

          Toda navegação de referência de pedido — tanto em origin.salesReturn quanto em cada item de appliedOrders — é feita por orderSfid, nunca por um sfid de nota fiscal. O invoiceName serve apenas de rótulo do card.All order-reference navigation — both in origin.salesReturn and in each appliedOrders item — is done by orderSfid, never by an invoice sfid. invoiceName is only the card's label.Toda navegación de referencia de pedido — tanto en origin.salesReturn como en cada ítem de appliedOrders — se hace por orderSfid, nunca por un sfid de factura. El invoiceName sirve solo de etiqueta del card.

A mesma classe de Model (CreditNoteOrderReferenceModel) serve os dois papéis — o ToOne da origem por devolução e o ToMany dos pedidos aplicados. E não existe CreditNoteOriginModel: o wrapper é reconstruído no caminho de volta apenas quando um dos dois lados tem alvo.The same Model class (CreditNoteOrderReferenceModel) serves both roles — the sales-return origin's ToOne and the applied orders' ToMany. And there is no CreditNoteOriginModel: the wrapper is rebuilt on the way back only when one of the two sides has a target.La misma clase de Model (CreditNoteOrderReferenceModel) sirve a los dos papeles — el ToOne del origen por devolución y el ToMany de los pedidos aplicados. Y no existe CreditNoteOriginModel: el wrapper se reconstruye en el camino de vuelta solo cuando uno de los dos lados tiene destino.

Estruturas do link de pagamento (transientes)Payment link structures (transient)Estructuras del link de pago (transitorias)

As três estruturas dos RPCs de link de pagamento não são persistidas — não existe Model para nenhuma delas, e o único efeito no cache é a marcação de pendente nos títulos envolvidos.The three structures of the payment link RPCs are not persisted — no Model exists for any of them, and the only cache effect is marking the involved debit items as pending.Las tres estructuras de los RPC de link de pago no se persisten — no existe Model para ninguna, y el único efecto en el caché es marcar los documentos involucrados como pendiente.

  • PaymentLinkBank getBankList 4 camposfieldscampos
    CampoProtoDTOModelEntity
    bankNamestringStringString
    bankIconBase64stringStringString
    isCompanyboolboolbool
    transactionLimitdoubledoubledouble
  • PaymentLinkItem createPaymentLink · request 4 camposfieldscampos
    CampoProtoDTOModelEntity
    debitOpenItemSfidstringString
    paymentAmountdoubledouble
    invoiceLegalNumberstringString
    orderSfidstringString
  • PaymentLink createPaymentLink · reply 4 camposfieldscampos
    CampoProtoDTOModelEntity
    urlstringStringString
    bankOrderIdstringStringString
    bankNamestringStringString
    htmlResponsestring

PaymentLinkItemEntity é uma entity de request: não tem DTO nem Model, e é mapeada direto para o proto por toProto() — o único mapper Entity→Proto desta camada.PaymentLinkItemEntity is a request entity: it has no DTO and no Model, and is mapped straight to the proto by toProto() — this layer's only Entity→Proto mapper.PaymentLinkItemEntity es una entity de request: no tiene DTO ni Model, y se mapea directo al proto por toProto() — el único mapper Entity→Proto de esta capa.

Mappers

Nove arquivos em data/mappers/financial_management/. As cinco direções canônicas existem para todas as estruturas persistidas; o link de pagamento tem só as direções que usa.Nine files in data/mappers/financial_management/. The five canonical directions exist for every persisted structure; the payment link only has the directions it uses.Nueve archivos en data/mappers/financial_management/. Las cinco direcciones canónicas existen para todas las estructuras persistidas; el link de pago solo tiene las direcciones que usa.

DireçãoDirectionDirecciónMétodoMethodMétodoO que fazWhat it doesQué hace
JSON → DTOfromMapcaminho do mock; coage null para ""/0 e estampa o lastSyncAtthe mock path; coerces null into ""/0 and stamps lastSyncAtcamino del mock; coacciona null a ""/0 y estampa el lastSyncAt
Proto → DTOtoDTOcaminho remoto; converte campo vazio em nulo, lê a presença de optional e estampa o lastSyncAtthe remote path; turns empty fields into null, reads optional presence and stamps lastSyncAtcamino remoto; convierte campo vacío en nulo, lee la presencia de optional y estampa el lastSyncAt
DTO → EntitytoDomaintipa os 6 enums e parseia as 3 datas (via parseFinancialManagementIsoDateOrFallback)types the 6 enums and parses the 3 dates (via parseFinancialManagementIsoDateOrFallback)tipa los 6 enums y parsea las 3 fechas (vía parseFinancialManagementIsoDateOrFallback)
Entity → ModeltoModelvolta os enums para String, popula os ToMany/ToOne e achata o wrapper de origem em dois ToOneturns the enums back into String, fills the ToMany/ToOne and flattens the origin wrapper into two ToOnedevuelve los enums a String, puebla los ToMany/ToOne y achata el wrapper de origen en dos ToOne
Model → EntitytoDomainreparseia os enums, reconstrói o wrapper de origem e substitui data nula por DateTimeUtils.now()re-parses the enums, rebuilds the origin wrapper and replaces a null date with DateTimeUtils.now()reparsea los enums, reconstruye el wrapper de origen y reemplaza una fecha nula por DateTimeUtils.now()
Entity → PrototoProtoexceção: só PaymentLinkItemEntity, para montar o request de createPaymentLinkexception: only PaymentLinkItemEntity, to build the createPaymentLink requestexcepción: solo PaymentLinkItemEntity, para armar el request de createPaymentLink

Os únicos deltasThe only deltasLos únicos deltas

  • 6 enums tipados na Entitystatus, resourceType, paymentLinkStatus, deliveryStatus (no título), paymentSource (no pagamento) e creditNoteType (na nota de crédito). Nas outras três camadas são String.6 enums typed in the Entitystatus, resourceType, paymentLinkStatus, deliveryStatus (on the debit item), paymentSource (on the payment) and creditNoteType (on the credit note). In the other three layers they are String.6 enums tipados en la Entitystatus, resourceType, paymentLinkStatus, deliveryStatus (en el documento), paymentSource (en el pago) y creditNoteType (en la nota de crédito). En las otras tres capas son String.
  • 3 datas parseadasDebitOpenItem.date, Payment.paymentDate e CreditNote.date viajam como String ISO até o DTO, viram DateTime não-nulo na Entity e ficam DateTime? no Model.3 parsed datesDebitOpenItem.date, Payment.paymentDate and CreditNote.date travel as ISO String up to the DTO, become non-null DateTime in the Entity and stay DateTime? in the Model.3 fechas parseadasDebitOpenItem.date, Payment.paymentDate y CreditNote.date viajan como String ISO hasta el DTO, se vuelven DateTime no-nulo en la Entity y quedan DateTime? en el Model.
  • 4 campos vazio→nulo no DTOinvoiceSfid, invoiceNumber e invoiceName (string vazia vira null) e creditPeriod (presença do optional do proto). orderSfid, ao contrário, permanece String não-nulo em todas as camadas, com null do JSON coagido para "".4 empty→null fields in the DTOinvoiceSfid, invoiceNumber and invoiceName (an empty string becomes null) and creditPeriod (the proto's optional presence). orderSfid, by contrast, stays a non-null String in every layer, with a JSON null coerced into "".4 campos vacío→nulo en el DTOinvoiceSfid, invoiceNumber e invoiceName (string vacía se vuelve null) y creditPeriod (presencia del optional del proto). orderSfid, en cambio, permanece String no-nulo en todas las capas, con el null del JSON coaccionado a "".
  • 6 relações no Model — as 4 listas do agregado, as agências do banco e os pedidos aplicados da nota de crédito viram ToMany.6 relations in the Model — the aggregate's 4 lists, the bank's branches and the credit note's applied orders become ToMany.6 relaciones en el Model — las 4 listas del agregado, las sucursales del banco y los pedidos aplicados de la nota de crédito se vuelven ToMany.
  • 1 mudança de forma — o wrapper CreditNoteOrigin é achatado em dois ToOne irmãos (cnapOrigin e salesReturnOrigin); não existe Model para o wrapper.1 shape change — the CreditNoteOrigin wrapper is flattened into two sibling ToOne (cnapOrigin and salesReturnOrigin); no Model exists for the wrapper.1 cambio de forma — el wrapper CreditNoteOrigin se achata en dos ToOne hermanos (cnapOrigin y salesReturnOrigin); no existe Model para el wrapper.
  • 1 campo criado no applastSyncAt não existe no proto; é estampado nos dois mappers de fronteira (JSON→DTO e Proto→DTO) e só flui daí para frente.1 app-created fieldlastSyncAt doesn't exist in the proto; it is stamped in both boundary mappers (JSON→DTO and Proto→DTO) and only flows onwards from there.1 campo creado en la applastSyncAt no existe en el proto; se estampa en los dos mappers de frontera (JSON→DTO y Proto→DTO) y solo fluye de ahí en adelante.
  • 3 estruturas sem ModelPaymentLinkBank, PaymentLinkItem e PaymentLink nunca são persistidas; PaymentLinkItem não tem nem DTO (é entity de request).3 structures with no ModelPaymentLinkBank, PaymentLinkItem and PaymentLink are never persisted; PaymentLinkItem has no DTO either (it is a request entity).3 estructuras sin ModelPaymentLinkBank, PaymentLinkItem y PaymentLink nunca se persisten; PaymentLinkItem tampoco tiene DTO (es entity de request).
  • 2 campos crus por decisãoPayment.status e DebitOpenItem.type permanecem String em todas as camadas: são labels de wire exibidos como vêm do backend, não candidatos a enum.2 fields raw by decisionPayment.status and DebitOpenItem.type stay a String in every layer: they are wire labels displayed as the backend sends them, not enum candidates.2 campos crudos por decisiónPayment.status y DebitOpenItem.type permanecen String en todas las capas: son labels de wire mostrados como vienen del backend, no candidatos a enum.
08

Repository

FinancialManagementRepositoryImpl implementaimplementsimplementa FinancialManagementRepositoryInterface e injeta os 3 datasources (mock/local/remote) + ConnectivityService + a flag useMockData + Ref. São 11 métodos em quatro grupos: fetch do agregado, leitura de cache, mutação local e link de pagamento. Método a método:and injects the 3 datasources (mock/local/remote) + ConnectivityService + the useMockData flag + Ref. There are 11 methods in four groups: aggregate fetch, cache read, local mutation and payment link. Method by method:e inyecta los 3 datasources (mock/local/remote) + ConnectivityService + la flag useMockData + Ref. Son 11 métodos en cuatro grupos: fetch del agregado, lectura de caché, mutación local y link de pago. Método a método:

Um dropdown por método — assinatura, retorno e comportamento. O getFinancialManagement() traz a árvore de decisão de fonte dentro do próprio detalhe.One dropdown per method — signature, return and behavior. getFinancialManagement() carries the source decision tree inside its own detail.Un dropdown por método — firma, retorno y comportamiento. getFinancialManagement() trae el árbol de decisión de fuente dentro de su propio detalle.

getFinancialManagement({source = local}) mock / local / remote

RetornaReturnsDevuelve Result<FinancialManagementEntity, Failure>

Ponto de entrada do agregado. Atenção ao default: source vale local, então chamar sem argumento é cache-only — só source: remote vai à rede. Quem passa remote hoje: o refresh() do hub e a varredura de dados vencidos.The aggregate's entry point. Mind the default: source is local, so calling it with no argument is cache-only — only source: remote hits the network. Who passes remote today: the hub's refresh() and the stale-data sweep.Punto de entrada del agregado. Atención al default: source vale local, así que llamarlo sin argumento es cache-only — solo source: remote va a la red. Quién pasa remote hoy: el refresh() del hub y el barrido de datos vencidos.

Árvore de decisão de fonteSource decision treeÁrbol de decisión de fuente

  1. useMockData == true ouoro source == mock→ lê o mock do mercado, mapeia e grava no cache. A flag global tem precedência máxima.→ reads the market's mock, maps and writes to cache. The global flag has top precedence.→ lee el mock del mercado, mapea y graba en caché. La flag global tiene máxima precedencia.
  2. source == local ou offlineor offlineu offline→ lê o cache; se o cache estiver vazio, devolve Error(NetworkFailure) (aqui o vazio é erro, ao contrário de getCachedFinancialManagement).→ reads the cache; if the cache is empty it returns Error(NetworkFailure) (here empty is an error, unlike getCachedFinancialManagement).→ lee el caché; si el caché está vacío devuelve Error(NetworkFailure) (aquí el vacío es error, a diferencia de getCachedFinancialManagement).
  3. senão (remoto + conectado)otherwise (remote + connected)si no (remoto + conectado)→ lê o currentResourceProvider; se vier null, cai pro cache; senão chama o remoto com resource.locationHierarchyId, mapeia, grava no cache; em erro, fallback pro cache e só devolve Error se o cache também estiver vazio.→ reads currentResourceProvider; if it comes back null it falls to the cache; else it calls remote with resource.locationHierarchyId, maps, writes to cache; on error, falls back to cache and only returns Error if the cache is empty too.→ lee el currentResourceProvider; si viene null, cae al caché; si no llama al remoto con resource.locationHierarchyId, mapea, graba en caché; en error, fallback al caché y solo devuelve Error si el caché también está vacío.
getCachedFinancialManagement() local

RetornaReturnsDevuelve Result<FinancialManagementEntity?, Failure>

Só cache. null vira Success(null), não erro — quem chama trata "sem dados" sem falha. É a base de todos os outros métodos de cache.Cache only. null becomes Success(null), not an error — callers handle "no data" without a failure. It is the base of every other cache method.Solo caché. null es Success(null), no error — quien llama trata "sin datos" sin fallo. Es la base de todos los otros métodos de caché.

getCachedFinancialManagementLastSyncAt() local

RetornaReturnsDevuelve DateTime? (sem Result)(no Result)(sin Result)

Timestamp da última sincronização do agregado, para o DataLoadInfo e para a varredura de dados vencidos. Falha é logada e devolve null — por desenho, não vale interromper a tela por causa de um timestamp.The aggregate's last-sync timestamp, for DataLoadInfo and for the stale-data sweep. A failure is logged and returns null — by design, a timestamp isn't worth breaking the screen for.Timestamp de última sincronización del agregado, para el DataLoadInfo y para el barrido de datos vencidos. Una falla se loguea y devuelve null — por diseño, no vale interrumpir la pantalla por un timestamp.

getCachedDebitOpenItemBySfid({debitOpenItemSfid}) local · §28 A

RetornaReturnsDevuelve Result<DebitOpenItemEntity?, Failure>

Cache-only, sem exceção. Chama getCachedFinancialManagement() — nunca o getFinancialManagement() com fallback remoto — e filtra a lista debitOpenItems em memória pelo sfid. sfid vazio ou só espaços curto-circuita em Success(null); item ausente também é Success(null), não erro.Cache-only, no exception. It calls getCachedFinancialManagement() — never the getFinancialManagement() with remote fallback — and filters the debitOpenItems list in memory by sfid. An empty or whitespace sfid short-circuits to Success(null); a missing item is also Success(null), not an error.Cache-only, sin excepción. Llama a getCachedFinancialManagement() — nunca al getFinancialManagement() con fallback remoto — y filtra la lista debitOpenItems en memoria por el sfid. Un sfid vacío o con solo espacios corta en Success(null); un ítem ausente también es Success(null), no error.

Por que cache-only: este é o exemplo canônico da Categoria A do §28 citado no CLAUDE.md. A lista já populou o cache antes da navegação; disparar outro fetch no drill-down só custaria latência, piscada de tela e carga inútil no backend. Se algum fluxo futuro precisar de frescor garantido num lookup single-item, o caminho é adicionar um método explícito (getFresh…BySfid), nunca mudar o comportamento deste.Why cache-only: this is the canonical §28 Category A example cited in CLAUDE.md. The list already populated the cache before the navigation; firing another fetch on the drill-down would only cost latency, a visual flicker and useless backend load. If a future flow needs guaranteed freshness on a single-item lookup, the path is to add an explicit method (getFresh…BySfid), never to change this one's behavior.Por qué cache-only: este es el ejemplo canónico de la Categoría A del §28 citado en el CLAUDE.md. La lista ya pobló el caché antes de la navegación; disparar otro fetch en el drill-down solo costaría latencia, parpadeo de pantalla y carga inútil en el backend. Si algún flujo futuro necesita frescura garantizada en un lookup single-item, el camino es agregar un método explícito (getFresh…BySfid), nunca cambiar el comportamiento de este.

getCachedCreditNoteBySfid({creditNoteSfid}) local · §28 A

RetornaReturnsDevuelve Result<CreditNoteEntity?, Failure>

Estruturalmente idêntico ao anterior, sobre a lista creditNotes: cache-only, curto-circuito em sfid vazio, ausência devolvida como Success(null). Alimenta o detalhe da nota de crédito.Structurally identical to the previous one, over the creditNotes list: cache-only, short-circuit on an empty sfid, absence returned as Success(null). Feeds the credit note detail.Estructuralmente idéntico al anterior, sobre la lista creditNotes: cache-only, cortocircuito con sfid vacío, ausencia devuelta como Success(null). Alimenta el detalle de la nota de crédito.

saveFinancialManagement({entity}) local

RetornaReturnsDevuelve Result<void, Failure>

Destrutivo: limpa as oito boxes do agregado e regrava tudo. É o cache-writer chamado após cada fetch bem-sucedido e após cada mutação local. Encaminha o entity.lastSyncAt — nunca chama o relógio (§21).Destructive: it clears the aggregate's eight boxes and rewrites everything. It is the cache-writer called after each successful fetch and after each local mutation. It forwards entity.lastSyncAt — it never calls the clock (§21).Destructivo: limpia las ocho boxes del agregado y regraba todo. Es el cache-writer llamado tras cada fetch exitoso y tras cada mutación local. Reenvía el entity.lastSyncAt — nunca llama al reloj (§21).

applyPaymentAllocations({allocations}) local · chamado pelo pagamentocalled by the paymentllamado por el pago

RetornaReturnsDevuelve Result<void, Failure>

Projeta o pagamento no cache. Soma os valores alocados por debitOpenItemSfid e, para cada título atingido, calcula o saldo restante com CurrencyUtils.roundToTwoDecimals. Saldo maior que zero → só o valor cai; saldo esgotado → valor zerado, status vira recebido e a marca de vencido é limpa. Depois regrava o agregado.Projects the payment onto the cache. It sums the allocated amounts per debitOpenItemSfid and, for each affected debit item, computes the remaining balance with CurrencyUtils.roundToTwoDecimals. Balance above zero → only the amount drops; balance exhausted → amount zeroed, status flips to collected and the overdue mark is cleared. Then it rewrites the aggregate.Proyecta el pago en el caché. Suma los montos asignados por debitOpenItemSfid y, para cada documento alcanzado, calcula el saldo restante con CurrencyUtils.roundToTwoDecimals. Saldo mayor que cero → solo baja el monto; saldo agotado → monto en cero, el estado pasa a cobrada y la marca de vencido se limpia. Después regraba el agregado.

markCreditNotesUsed({creditNoteSfids}) local · chamado pelo pagamentocalled by the paymentllamado por el pago

RetornaReturnsDevuelve Result<void, Failure>

Marca as notas de crédito consumidas por um pagamento: isUsed passa a verdadeiro e o valor é zerado, para que o saldo disponível calculado pela lista deixe de contá-las. Depois regrava o agregado.Marks the credit notes consumed by a payment: isUsed becomes true and the amount is zeroed, so the available balance computed by the list stops counting them. Then it rewrites the aggregate.Marca las notas de crédito consumidas por un pago: isUsed pasa a verdadero y el monto se pone en cero, para que el saldo disponible calculado por la lista deje de contarlas. Después regraba el agregado.

markDebitOpenItemsPaymentLinkPending({debitOpenItemSfids}) local

RetornaReturnsDevuelve Result<void, Failure>

Marca os títulos com link de pagamento gerado como pendentes — é o que faz a pílula aparecer no card. Títulos que já estão com link bem-sucedido são pulados, para não regredir um pagamento em validação.Marks the debit items with a generated payment link as pending — that's what makes the pill show on the card. Debit items already in the successful link state are skipped, so as not to regress a payment under validation.Marca los documentos con link de pago generado como pendientes — es lo que hace aparecer la pastilla en el card. Los documentos que ya están con link exitoso se saltan, para no retroceder un pago en validación.

getPaymentLinkBanks({resourceSfid}) mock / remote · sem cacheno cachesin caché

RetornaReturnsDevuelve Result<List<PaymentLinkBankEntity>, Failure>

Roteia por useMockData entre mock e remoto e mapeia DTO→Entity. Não tem caminho de cache: cada chamada vai à fonte. Consumido pela criação de pagamentos.Routes by useMockData between mock and remote and maps DTO→Entity. It has no cache path: every call goes to the source. Consumed by payment creation.Rutea por useMockData entre mock y remoto y mapea DTO→Entity. No tiene camino de caché: cada llamada va a la fuente. Consumido por la creación de pagos.

createPaymentLink({accountSfid, resourceSfid, bankName, customerTaxId, accountCode, totalAmount, items}) mock / remote

RetornaReturnsDevuelve Result<PaymentLinkEntity, Failure>

Única escrita por RPC próprio da camada. No mock, sintetiza uma URL com uma referência derivada do código da conta e do relógio. No remoto, monta o request com os sete campos e a lista de itens. Não persiste o link.The layer's only write through its own RPC. On the mock, it synthesizes a URL with a reference derived from the account code and the clock. On remote, it builds the request with the seven fields and the item list. It doesn't persist the link.Única escritura por RPC propio de la capa. En el mock, sintetiza una URL con una referencia derivada del código de la cuenta y del reloj. En el remoto, arma el request con los siete campos y la lista de ítems. No persiste el link.

09

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 FinancialManagementRemoteDataSource gRPC · 3
getFinancialManagement({locationHierarchySfid, lastModifiedDate?})
EnvioSendsEnvío
monta FinancialManagementRequest com o locationHierarchySfid e só preenche lastModifiedDate quando ele vem não-nulo e não-vazio; chama _client.getFinancialManagement(request) no FinancialManagementConectaRepServiceClient.builds FinancialManagementRequest with the locationHierarchySfid and only fills lastModifiedDate when it arrives non-null and non-empty; calls _client.getFinancialManagement(request) on FinancialManagementConectaRepServiceClient.arma FinancialManagementRequest con el locationHierarchySfid y solo llena lastModifiedDate cuando llega no-nulo y no-vacío; llama _client.getFinancialManagement(request) en FinancialManagementConectaRepServiceClient.
RetornoReturnRetorno
FinancialManagementDTO (via response.toDTO())(via response.toDTO())(vía response.toDTO())
Fluxo de usoUsage flowFlujo de uso
chamado pelo caminho remoto do repository, quando online, sem mock e com source: remote; o resultado é gravado no cache. Nenhum caller passa lastModifiedDate hoje.called by the repository's remote path, when online, not mocking and with source: remote; the result is written to cache. No caller passes lastModifiedDate today.llamado por el camino remoto del repository, online, sin mock y con source: remote; el resultado se graba en caché. Ningún caller pasa lastModifiedDate hoy.
Tratamento de erroError handlingManejo de errores
GrpcErrorGrpcExceptionHandler; outros → ServerException. Em erro, o repository faz fallback pro cache.GrpcErrorGrpcExceptionHandler; others → ServerException. On error, the repository falls back to cache.GrpcErrorGrpcExceptionHandler; otros → ServerException. En error, el repository hace fallback al caché.
getPaymentLinkBanks({resourceSfid})
EnvioSendsEnvío
PaymentLinkBankListRequest com o resourceSfid_client.getBankList(request).PaymentLinkBankListRequest with the resourceSfid_client.getBankList(request).PaymentLinkBankListRequest con el resourceSfid_client.getBankList(request).
RetornoReturnRetorno
List<PaymentLinkBankDTO>
Fluxo de usoUsage flowFlujo de uso
chamado ao abrir a seleção de banco do link de pagamento. Sem gravação em cache.called when opening the payment link's bank selection. No cache write.llamado al abrir la selección de banco del link de pago. Sin grabado en caché.
Tratamento de erroError handlingManejo de errores
qualquer exceção → ServerException; o repository a converte em Failure.any exception → ServerException; the repository converts it into a Failure.cualquier excepción → ServerException; el repository la convierte en Failure.
createPaymentLink({accountSfid, resourceSfid, bankName, customerTaxId, accountCode, totalAmount, items})
EnvioSendsEnvío
preenche os sete campos escalares do CreatePaymentLinkRequest e adiciona a lista payment convertendo cada PaymentLinkItemEntity por toProto()_client.createPaymentLink(request).fills the seven scalar fields of CreatePaymentLinkRequest and adds the payment list converting each PaymentLinkItemEntity via toProto()_client.createPaymentLink(request).llena los siete campos escalares de CreatePaymentLinkRequest y agrega la lista payment convirtiendo cada PaymentLinkItemEntity por toProto()_client.createPaymentLink(request).
RetornoReturnRetorno
PaymentLinkDTO (o htmlResponse do reply é descartado)(the reply's htmlResponse is dropped)(el htmlResponse del reply se descarta)
Fluxo de usoUsage flowFlujo de uso
chamado ao confirmar o banco; no sucesso, o UseCase marca os títulos como pendentes no cache.called when the bank is confirmed; on success the UseCase marks the debit items as pending in the cache.llamado al confirmar el banco; en el éxito, el UseCase marca los documentos como pendientes en el caché.
Tratamento de erroError handlingManejo de errores
qualquer exceção → ServerException. Não há retentativa nem fila local.any exception → ServerException. There is no retry and no local queue.cualquier excepción → ServerException. No hay reintento ni cola local.
Local FinancialManagementLocalDataSource ObjectBox · 5

Envio / fluxo: persistência local via ObjectBox, box de FinancialManagementModel de linha única mais sete boxes filhas — sem rede. Alimenta todos os caminhos de cache do repository. Erro: toda falha de leitura ou escrita vira CacheException com mensagem própria por operação (não engolida).Sends / flow: local persistence via ObjectBox, a single-row FinancialManagementModel box plus seven child boxes — no network. It feeds all of the repository's cache paths. Error: every read or write failure becomes a CacheException with its own per-operation message (not swallowed).Envío / flujo: persistencia local vía ObjectBox, box de FinancialManagementModel de fila única más siete boxes hijas — sin red. Alimenta todos los caminos de caché del repository. Error: toda falla de lectura o escritura se vuelve CacheException con mensaje propio por operación (no tragada).

getFinancialManagement()
RetornoReturnRetorno
FinancialManagementEntity?
ComportamentoBehaviorComportamiento
primeira linha da box mapeada por toDomain(), ou null se o cache está vazio.the box's first row mapped by toDomain(), or null if the cache is empty.primera fila de la box mapeada por toDomain(), o null si el caché está vacío.
getFinancialManagementLastSyncAt()
RetornoReturnRetorno
DateTime?
ComportamentoBehaviorComportamiento
lê só o lastSyncAt da linha única, sem mapear o agregado inteiro.reads only the single row's lastSyncAt, without mapping the whole aggregate.lee solo el lastSyncAt de la fila única, sin mapear el agregado completo.
saveFinancialManagement({entity})
RetornoReturnRetorno
void
ComportamentoBehaviorComportamiento
clearFinancialManagement() e depois put do toModel(). Substituição total, não merge.clearFinancialManagement() and then a put of toModel(). Full replacement, not a merge.clearFinancialManagement() y luego put del toModel(). Sustitución total, no merge.
mergeAdhocFinancialManagement({debitOpenItems, banks, payments, creditNotes, accountSfid})
RetornoReturnRetorno
void
ComportamentoBehaviorComportamiento
merge aditivo por conta usado pela visita ad hoc: mantém as linhas de outros varejos, substitui as do varejo que chegou, dedupa bancos por sfid e preserva o lastSyncAt atual (um merge ad hoc não conta como sincronização cheia).an additive per-account merge used by the ad hoc visit: it keeps other retails' rows, replaces the incoming retail's, dedupes banks by sfid and preserves the current lastSyncAt (an ad hoc merge doesn't count as a full sync).merge aditivo por cuenta usado por la visita ad hoc: mantiene las filas de otros puntos de venta, sustituye las del punto de venta que llegó, deduplica bancos por sfid y preserva el lastSyncAt actual (un merge ad hoc no cuenta como sincronización completa).
clearFinancialManagement()
RetornoReturnRetorno
void
ComportamentoBehaviorComportamiento
remove explicitamente as oito boxes — agência, banco, título, pagamento, nota de crédito, origem excedente, referência de fatura e o agregado. ObjectBox não tem cascata, por isso cada uma é limpa à mão.explicitly removes the eight boxes — branch, bank, debit item, payment, credit note, overpayment origin, invoice reference and the aggregate. ObjectBox has no cascade, hence each one is cleared by hand.elimina explícitamente las ocho boxes — sucursal, banco, documento, pago, nota de crédito, origen excedente, referencia de factura y el agregado. ObjectBox no tiene cascada, por eso cada una se limpia a mano.
Mock FinancialManagementMockDataSource assets · 3

Envio / fluxo: lê JSON dos assets, escolhido pelo mercado ativo (currentMarketProvider) e pela flag de dados reais (useRealMockDataProvider). Existem mocks sintéticos nos seis mercados e mocks de dados reais em BR/CL/ZA; AR/PY/PE são stubs vazios. Alimenta o caminho de mock do repository.Sends / flow: reads JSON from the assets, picked by the active market (currentMarketProvider) and by the real-data flag (useRealMockDataProvider). Synthetic mocks exist for all six markets and real-data mocks for BR/CL/ZA; AR/PY/PE are empty stubs. It feeds the repository's mock path.Envío / flujo: lee JSON de los assets, elegido por el mercado activo (currentMarketProvider) y por la flag de datos reales (useRealMockDataProvider). Existen mocks sintéticos en los seis mercados y mocks de datos reales en BR/CL/ZA; AR/PY/PE son stubs vacíos. Alimenta el camino de mock del repository.

getFinancialManagement()
RetornoReturnRetorno
FinancialManagementDTO
ComportamentoBehaviorComportamiento
carrega {market}[_real]_financial_management.json (pasta financial_management), decodifica e mapeia por fromMap. As chaves do arquivo são isProofOfPaymentMandatory, debitOpenItems, banks, payments e creditNotes.loads {market}[_real]_financial_management.json (folder financial_management), decodes it and maps it via fromMap. The file's keys are isProofOfPaymentMandatory, debitOpenItems, banks, payments and creditNotes.carga {market}[_real]_financial_management.json (carpeta financial_management), lo decodifica y lo mapea por fromMap. Las claves del archivo son isProofOfPaymentMandatory, debitOpenItems, banks, payments y creditNotes.
Tratamento de erroError handlingManejo de errores
qualquer erro → CacheException nomeando o mercado. No modo de dados reais, asset ausente devolve JSON vazio em vez de lançar.any error → CacheException naming the market. In real-data mode a missing asset returns empty JSON instead of throwing.cualquier error → CacheException nombrando el mercado. En modo de datos reales, un asset ausente devuelve JSON vacío en lugar de lanzar.
getPaymentLinkBanks()
RetornoReturnRetorno
List<PaymentLinkBankDTO>
ComportamentoBehaviorComportamiento
lê a chave banks de {market}[_real]_payment_link.json (pasta payment_link) e, quando o arquivo de dados reais devolve lista vazia, tenta de novo no sintético.reads the banks key from {market}[_real]_payment_link.json (folder payment_link) and, when the real-data file returns an empty list, retries on the synthetic one.lee la clave banks de {market}[_real]_payment_link.json (carpeta payment_link) y, cuando el archivo de datos reales devuelve lista vacía, reintenta en el sintético.
Tratamento de erroError handlingManejo de errores
não lança: loga e devolve lista vazia. Só existe mock de payment_link para CL, então os outros mercados recebem zero bancos em silêncio (ver Pendências).doesn't throw: it logs and returns an empty list. A payment_link mock only exists for CL, so the other markets silently get zero banks (see Pending items).no lanza: loguea y devuelve lista vacía. Solo existe mock de payment_link para CL, así que los otros mercados reciben cero bancos en silencio (ver Pendientes).
createPaymentLink({bankName, accountCode})
RetornoReturnRetorno
PaymentLinkDTO
ComportamentoBehaviorComportamiento
sintetiza uma referência com o código da conta (ou a sigla do mercado) + o relógio em milissegundos, e devolve uma URL local de mock com o banco escolhido. Recebe dois dos sete parâmetros do remoto.synthesizes a reference from the account code (or the market code) + the clock in milliseconds, and returns a local mock URL with the chosen bank. It receives two of the remote's seven parameters.sintetiza una referencia con el código de la cuenta (o la sigla del mercado) + el reloj en milisegundos, y devuelve una URL local de mock con el banco elegido. Recibe dos de los siete parámetros del remoto.
10

Enums e labelsEnums & labelsEnums y labels

Os enums só existem tipados na camada Entity; em DTO/Model/Proto trafegam como String. Cada um vive em core/enums/ e leva os labels numa extension …Ux, nunca espalhados em widgets. Lista completa de valores:Enums are only typed in the Entity layer; in DTO/Model/Proto they travel as String. Each lives under core/enums/ and carries its labels in a …Ux extension, never scattered across widgets. Full value list:Los enums solo están tipados en la capa Entity; en DTO/Model/Proto viajan como String. Cada uno vive en core/enums/ y lleva los labels en una extension …Ux, nunca dispersos en widgets. Lista completa de valores:

DebitOpenItemStatus 4 valoresvaluesvalores
casevaluelabel (PT · EN · ES)label (PT · EN · ES)label (PT · EN · ES)corcolorcolor
open"open"EM ABERTO · OPEN · ABIERTAtagNegative
collected"collected"RECEBIDO · COLLECTED · COBRADAtagPositive
closed"closed"FECHADO · CLOSED · CERRADAtagNeutral
unknown"unknown"onSurfaceTertiary

fromString é case-insensitive e cai em unknown. O getter estático selectable devolve os três valores reais (sem unknown) e é o que alimenta as pílulas do modal de filtro.fromString is case-insensitive and falls back to unknown. The static selectable getter returns the three real values (no unknown) and is what feeds the filter modal's pills.fromString es case-insensitive y cae en unknown. El getter estático selectable devuelve los tres valores reales (sin unknown) y es lo que alimenta las pastillas del modal de filtro.

PaymentLinkStatus 4 valoresvaluesvalores
casevaluepílula no cardcard pillpastilla en el card
notApplied"not_applied"nenhuma — é também o fallback de fromStringnone — it is also fromString's fallbackninguna — es también el fallback de fromString
pending"pending"Link de pagamento criado · Payment link created · Link de pago creado (info)
success"success"Pagamento em validação · Payment under validation · Pago en validación (tagPositive)
unknown"unknown"nenhuma — só é produzido quando o backend envia literalmente "unknown"; qualquer outro valor desconhecido cai em notApplied (ver Pendências)none — only produced when the backend literally sends "unknown"; any other unrecognised value falls back to notApplied (see Pending items)ninguna — solo se produce cuando el backend envía literalmente "unknown"; cualquier otro valor desconocido cae en notApplied (ver Pendientes)
DeliveryStatus 6 valoresvaluesvalores
casevaluelabel financeiro (PT · EN · ES)financial label (PT · EN · ES)label financiero (PT · EN · ES)
pending"pending"Não Entregue · Not Delivered · No Entregado
notDelivered"not delivered"Não Entregue · Not Delivered · No Entregado
delivered"delivered"Entregue · Delivered · Entregado
rescheduled"rescheduled"Não Entregue · Not Delivered · No Entregado
rejected"rejected"Não Entregue · Not Delivered · No Entregado
unknown""

Enum compartilhado com a área de entregas. A gestão financeira usa uma extension própria (financialLabel) que colapsa os cinco status em dois: só entregue é positivo, todo o resto é não entregue. fromWire normaliza para minúsculas.An enum shared with the deliveries area. Financial management uses its own extension (financialLabel) that collapses the five statuses into two: only delivered is positive, everything else is not delivered. fromWire lowercases the input.Enum compartido con el área de entregas. La gestión financiera usa una extension propia (financialLabel) que colapsa los cinco estados en dos: solo entregado es positivo, todo el resto es no entregado. fromWire normaliza a minúsculas.

CreditNoteType 3 valoresvaluesvalores
casewireValuealiases aceitosaccepted aliasesaliases aceptadoslabel (PT · EN · ES)label (PT · EN · ES)label (PT · EN · ES)título da seção de origemorigin section titletítulo de la sección de origen
cnap"CNAP"EXCEDENTEExcedente · Overpayment · ExcedentePagamento de origem · Payment of origin · Pago de origen
salesReturn"SALES RETURN"DEVOLUCION · DEVOLUCIÓNDevolução · Sales return · DevoluciónFatura de origem · Invoice of origin · Factura de origen
unknown"unknown"Desconhecido · Unknown · DesconocidoFatura de origem · Invoice of origin · Factura de origen

fromString normaliza caixa e separadores (espaço, _, -) antes de comparar, e por isso aceita os aliases em espanhol. Valor não mapeado é logado. É o único enum da feature cujo campo se chama wireValue em vez de value.fromString normalizes case and separators (space, _, -) before comparing, which is why it accepts the Spanish aliases. An unmapped value is logged. It is the feature's only enum whose field is called wireValue instead of value.fromString normaliza caja y separadores (espacio, _, -) antes de comparar, y por eso acepta los aliases en español. Un valor no mapeado se loguea. Es el único enum de la feature cuyo campo se llama wireValue en lugar de value.

PaymentSource 3 valoresvaluesvalores
casevalueusouseuso
manual"manual"pílula Manual no card de pagamento; fallback de string vaziaManual pill on the payment card; fallback for an empty stringpastilla Manual en el card de pago; fallback de string vacía
paymentLink"payment_link"pílula Link de pagamento; a normalização troca espaço e - por _Payment link pill; normalization swaps space and - for _pastilla Link de pago; la normalización cambia espacio y - por _
unknown"unknown"fallback com log de valor não mapeadofallback with an unmapped-value logfallback con log de valor no mapeado
FinancialManagementTab 2 valoresvaluesvalores
caselabel (PT · EN · ES)label (PT · EN · ES)label (PT · EN · ES)módulo que a habilitamodule that enables itmódulo que la habilita
debitsDébitos · Debits · Débitosfinancial_management_debit_open_item_list
creditNotesNotas de Crédito · Credit Notes · Notas de Créditofinancial_management_credit_note_list

Sem string de wire — é estado de cliente puro. A ordem das abas visíveis é a ordem dos valores do enum.No wire string — it is pure client state. The visible tabs' order is the enum's value order.Sin string de wire — es estado de cliente puro. El orden de las pestañas visibles es el orden de los valores del enum.

PaymentCreationOrigin 5 valoresvaluesvalores · origin
casevaluechega ao detalhe do título?reaches the debit item detail?¿llega al detalle del documento?o que decidewhat it decidesqué decide
financialManagement"financial_management"sim — é o defaultyes — it is the defaultsí — es el defaultexige visita iniciada; envia ao confirmar; permite redirecionar excedente; valor editávelrequires a started visit; sends on confirm; allows excess redirect; editable amountexige visita iniciada; envía al confirmar; permite redirigir excedente; monto editable
collections"collections"simyesnão exige visita; usa a forma preferida do varejo; envia ao confirmar; permite redirecionar excedenteno visit required; uses the retail's preferred method; sends on confirm; allows excess redirectno exige visita; usa el método preferido del punto de venta; envía al confirmar; permite redirigir excedente
promptOrder"prompt_order"não — vai direto ao pagamentono — goes straight to the paymentno — va directo al pagovalor fixo; não exige título existente; guarda e envia depois; reporta pagamento em dinheirofixed amount; no existing debit item required; holds and sends later; reports cash paymentmonto fijo; no exige documento existente; guarda y envía después; reporta pago en efectivo
delivery"delivery"não — vai direto ao pagamentono — goes straight to the paymentno — va directo al pagoexige cobrir o total; reporta pagamento em dinheiromust cover the full total; reports cash paymentexige cubrir el total; reporta pago en efectivo
unknown"unknown"nãononofallback de fromString, com log de valor não mapeadofromString's fallback, with an unmapped-value logfallback de fromString, con log de valor no mapeado

É o origin que atravessa esta feature. Não é um enum de "de onde eu vim" genérico: é uma política de pagamento, com oito getters de comportamento (requiresStartedVisit, usesPreferredPaymentMethodAsDefault, sendsOnConfirm, allowsExcessRedirect, hasEditableAmount, requiresDebitOpenItem, requiresFullAmountCoverage, reportsCashPayment). Ele é chave de provider tanto no hub quanto no detalhe do título — origens diferentes produzem instâncias diferentes — e é repassado adiante na navegação. Também define a chave do rascunho de pagamento (collections:<sfid> ou financial_management:<sfid>).This is the origin that runs through this feature. It is not a generic "where I came from" enum: it is a payment policy, with eight behavior getters (requiresStartedVisit, usesPreferredPaymentMethodAsDefault, sendsOnConfirm, allowsExcessRedirect, hasEditableAmount, requiresDebitOpenItem, requiresFullAmountCoverage, reportsCashPayment). It is a provider key on both the hub and the debit item detail — different origins produce different instances — and it is forwarded on navigation. It also defines the payment draft's key (collections:<sfid> or financial_management:<sfid>).Es el origin que atraviesa esta feature. No es un enum de "de dónde vine" genérico: es una política de pago, con ocho getters de comportamiento (requiresStartedVisit, usesPreferredPaymentMethodAsDefault, sendsOnConfirm, allowsExcessRedirect, hasEditableAmount, requiresDebitOpenItem, requiresFullAmountCoverage, reportsCashPayment). Es clave de provider tanto en el hub como en el detalle del documento — orígenes distintos producen instancias distintas — y se reenvía en la navegación. También define la clave del borrador de pago (collections:<sfid> o financial_management:<sfid>).

ResourceType 4 valoresvaluesvalores
casevalueitemsavatarLetter
physical"physical"Pre-sales Rep · Prompt-sales Rep · Universal Rep · Delivery RepF
digital"digital"Web Agent - DirectD
telesales"telesales"Telesales AnalystTS
unknown"unknown"?

Enum compartilhado. Nesta feature só a letra do avatar é usada, no card do título e no card do detalhe; a cor do avatar vem do status, não do tipo. fromString normaliza e casa também contra os items, que são os rótulos de wire vindos do backend.A shared enum. In this feature only the avatar letter is used, on the debit item card and the detail card; the avatar's color comes from the status, not the type. fromString normalizes and also matches against the items, which are the wire labels coming from the backend.Enum compartido. En esta feature solo se usa la letra del avatar, en el card del documento y en el card del detalle; el color del avatar viene del estado, no del tipo. fromString normaliza y casa también contra los items, que son los rótulos de wire que vienen del backend.

PaymentMethod 15 valoresvaluesvalores
casecodeapiNamelabel (PT · EN · ES)label (PT · EN · ES)label (PT · EN · ES)
bankSlipZGBank SlipBoleto · Bank Slip · Boleto
electronicFundsTransferZEElectronic Funds TransferTransferência · Electronic Funds Transfer · Transferencia
bankDepositZBBank DepositDepósito · Bank Deposit · Depósito
paymentButtonPBBotão de pagamento · Payment Button · Botón de pago
cashZHCashEfetivo · Cash · Efectivo
chequeZCChequeCheque · Check · Cheque
promissoryNoteZIPromissory NoteCheque a fecha · Promissory note · Cheque a fecha
creditNoteZ9Credit NoteNota de crédito · Credit note · Nota de crédito
pixZXPixPIX · PIX · PIX
creditCardZ1Credit CardCartão de crédito · Credit Card · Tarjeta de crédito
debitCardZ2Debit CardCartão de débito · Debit Card · Tarjeta de débito
paymentOrderZPPayment OrderOrdem de pagamento · Money Order · Orden de pago
directDebitZJDirect DebitDébito automático · Direct Debit · Débito automático
mobilePaymentZMMobile PaymentPagamento móvel · Mobile Money · Pago móvil
unknown

Nesta feature o enum entra por duas portas: no card de pagamento do detalhe do título, o paymentMethod cru do backend é convertido por fromCode para render o label; e paymentButton é o marcador que faz o card virar um card de link de pagamento. As regras de campo por forma (referência, banco, janela de data) pertencem à criação de pagamentos.In this feature the enum comes in through two doors: on the debit item detail's payment card, the backend's raw paymentMethod is converted by fromCode to render the label; and paymentButton is the marker that turns the card into a payment link card. The per-method field rules (reference, bank, date window) belong to payment creation.En esta feature el enum entra por dos puertas: en el card de pago del detalle del documento, el paymentMethod crudo del backend se convierte por fromCode para renderizar el label; y paymentButton es el marcador que convierte el card en un card de link de pago. Las reglas de campo por método (referencia, banco, ventana de fecha) pertenecen a la creación de pagos.

PaymentRegisterStatus 5 valoresvaluesvalores
casevaluelabel (PT · EN · ES)label (PT · EN · ES)label (PT · EN · ES)
awaitingOrderApproval"ORDER_PA"Aguardando aprovação do pedido · Awaiting order approval · Esperando aprobación del pedido
awaitingDebitOpenItem"CREATED"Aguardando débito do pedido · Awaiting order debit · Esperando el débito del pedido
readyToSync"READY"Pronto para sincronizar · Ready to sync · Listo para sincronizar
sent"SENT"Sincronizado · Synced · Sincronizado
unknown"unknown"cai no label de sincronizadofalls into the synced labelcae en el label de sincronizado

Enum da criação de pagamentos, reusado aqui na lista de pagamentos do detalhe do título — o mesmo mapa de labels é aplicado também aos pagamentos vindos do backend.A payment creation enum, reused here in the debit item detail's payment list — the same label map is applied also to the payments coming from the backend.Enum de la creación de pagos, reusado aquí en la lista de pagos del detalle del documento — el mismo mapa de labels se aplica también a los pagos que vienen del backend.

ModuleType EMC 9 valores da featurefeature valuesvalores de la feature
casemoduleNameo que ligawhat it turns onqué enciende
financialManagementRetailCreditDetails"financial_management_retail_credit_details"o card de crédito (limite, disponível, dias)the credit card (limit, available, days)el card de crédito (límite, disponible, días)
financialManagementFilters"financial_management_filters"o botão e o modal de filtrothe filter button and modalel botón y el modal de filtro
financialManagementDebitOpenItemList"financial_management_debit_open_item_list"a lista de títulos e a aba Débitosthe debit item list and the Debits tabla lista de documentos y la pestaña Débitos
financialManagementTabBar"financial_management_tab_bar"a barra de abas (aparece com 2+ abas visíveis)the tab bar (shows with 2+ visible tabs)la barra de pestañas (aparece con 2+ pestañas visibles)
financialManagementCreditNoteList"financial_management_credit_note_list"a aba Notas de créditothe Credit notes tabla pestaña Notas de crédito
financialManagementCreditNoteDetail"financial_management_credit_note_detail"o toque na linha da nota de crédito (a tela de detalhe)the tap on the credit note row (the detail screen)el toque en la fila de la nota de crédito (la pantalla de detalle)
financialManagementPaymentLink"financial_management_payment_link"a entrada de link de pagamentothe payment link entryla entrada de link de pago
financialManagementPaymentCreation"financial_management_payment_creation"checkbox, barra fixa, botão Pagar e a seção de pagamentoscheckbox, pinned bar, Pay button and the payments sectioncheckbox, barra fija, botón Pagar y la sección de pagos
financialManagementDebitDetailProofOfPayment"financial_management_debit_detail_proof_of_payment"a seção de comprovante no detalhe do títulothe proof section in the debit item detailla sección de comprobante en el detalle del documento

O Notifier filtra os módulos por isVisible antes de montar o State, e todos os getters testam apenas presença. Logo, na prática, isVisible: false é operacionalmente idêntico a chave ausente.The Notifier filters modules by isVisible before building the State, and every getter only tests presence. So in practice isVisible: false is operationally identical to a missing key.El Notifier filtra los módulos por isVisible antes de armar el State, y todos los getters solo prueban presencia. Así que en la práctica isVisible: false es operacionalmente idéntico a una clave ausente.

ModuleDetailType EMC 3 valores relevantesrelevant valuesvalores relevantes
casemoduleDetailNameo que ligawhat it turns onqué enciende
visitDetailToolFinancialManagement"financial_management"o atalho na grade de ferramentas da visita — é o gate de entrada da featurethe shortcut in the visit's tools grid — it is the feature's entry gateel atajo en la grilla de herramientas de la visita — es el gate de entrada de la feature
financialManagementFilterStatus"financial_management_filter_status"a seção de status dentro do modal de filtrothe status section inside the filter modalla sección de estado dentro del modal de filtro
financialManagementFilterDateRange"financial_management_filter_date_range"a seção de período dentro do modal de filtrothe period section inside the filter modalla sección de período dentro del modal de filtro

Quatro campos crus, sem enumFour raw fields, no enumCuatro campos crudos, sin enum Quatro valores exibidos nestas telas não têm enum nem tradução, e isso é decisão de produto, não omissão: o status da nota fiscal (mostrado no detalhe do título), o status do pagamento do backend, o type do título e a category do item da nota fiscal (usada para agrupar). São labels de wire renderizados exatamente como o backend envia. Four values shown on these screens have no enum and no translation, and that is a product decision, not an omission: the invoice status (shown in the debit item detail), the backend payment's status, the debit item's type and the invoice line item's category (used for grouping). They are wire labels rendered exactly as the backend sends them. Cuatro valores mostrados en estas pantallas no tienen enum ni traducción, y eso es decisión de producto, no omisión: el status de la factura (mostrado en el detalle del documento), el status del pago del backend, el type del documento y la category del ítem de la factura (usada para agrupar). Son labels de wire renderizados exactamente como el backend los envía.

11

UseCases

Um dropdown por UseCase; dentro, cada método com assinatura, o que retorna e uso. Todos os providers são keepAlive. Os de leitura delegam ao repository sem lógica extra, exceto os dois que filtram por relação; o par do dispatcher é a única escrita.One dropdown per UseCase; inside, each method with its signature, what it returns and use. Every provider is keepAlive. The read ones delegate to the repository with no extra logic, except the two that filter by relation; the dispatcher pair is the only write.Un dropdown por UseCase; dentro, cada método con su firma, qué devuelve y uso. Todos los providers son keepAlive. Los de lectura delegan al repository sin lógica extra, excepto los dos que filtran por relación; el par del dispatcher es la única escritura.

GetFinancialManagementUseCase 5 · o agregadothe aggregateel agregado
MétodoMethodMétodoRetornaReturnsDevuelveUsoUseUso
execute({source = local})Result<FinancialManagementEntity, Failure>Ponto de entrada do agregado → repository.getFinancialManagement. Chamado com remote pelo refresh() do hub e pela varredura de dados vencidos.The aggregate's entry point → repository.getFinancialManagement. Called with remote by the hub's refresh() and by the stale-data sweep.Punto de entrada del agregado → repository.getFinancialManagement. Llamado con remote por el refresh() del hub y por el barrido de datos vencidos.
getCached()Result<FinancialManagementEntity?, Failure>Só cache; null vira Success(null). Usado pelo detalhe do título (bancos e pagamentos) e pela gestão de cobranças.Cache only; null becomes Success(null). Used by the debit item detail (banks and payments) and by collections management.Solo caché; null es Success(null). Usado por el detalle del documento (bancos y pagos) y por la gestión de cobranzas.
getCachedLastSyncAt()DateTime?Timestamp da última sincronização (sem Result). Alimenta o DataLoadInfo de três das quatro telas e a checagem de TTL.Last-sync timestamp (no Result). Feeds the DataLoadInfo on three of the four screens and the TTL check.Timestamp de última sincronización (sin Result). Alimenta el DataLoadInfo de tres de las cuatro pantallas y la verificación de TTL.
getCachedDebitOpenItemBySfid({debitOpenItemSfid})Result<DebitOpenItemEntity?, Failure>1 título do cache (ausente → Success(null)). Alimenta o detalhe do título (§28 cat. A) — nunca dispara remoto.1 debit item from cache (missing → Success(null)). Feeds the debit item detail (§28 cat. A) — never triggers remote.1 documento del caché (ausente → Success(null)). Alimenta el detalle del documento (§28 cat. A) — nunca dispara remoto.
getCachedCreditNoteBySfid({creditNoteSfid})Result<CreditNoteEntity?, Failure>1 nota de crédito do cache. Alimenta o detalhe da nota de crédito (§28 cat. A).1 credit note from cache. Feeds the credit note detail (§28 cat. A).1 nota de crédito del caché. Alimenta el detalle de la nota de crédito (§28 cat. A).

Os dois getCached…BySfid são métodos no UseCase pai do agregado, não classes separadas — é a forma prescrita pelo §28 para lookup single-item. O nome carrega o tipo do filho (DebitOpenItem, CreditNote) porque o tipo retornado não é o agregado.Both getCached…BySfid are methods on the aggregate's parent UseCase, not separate classes — that is the shape §28 prescribes for a single-item lookup. The name carries the child's type (DebitOpenItem, CreditNote) because the returned type is not the aggregate.Los dos getCached…BySfid son métodos en el UseCase padre del agregado, no clases separadas — es la forma prescrita por el §28 para un lookup single-item. El nombre lleva el tipo del hijo (DebitOpenItem, CreditNote) porque el tipo devuelto no es el agregado.

GetDebitOpenItemsForAccountUseCase 1 · por varejoper retailpor punto de venta
MétodoMethodMétodoRetornaReturnsDevuelveUsoUseUso
execute({accountSfid})Result<List<DebitOpenItemEntity>, Failure>getCachedFinancialManagement() e filtra debitOpenItems pelo accountSfid. É a lista que o hub mostra. Cache-only — apesar do formato de coleção por relação, não faz fallback remoto (ver Pendências).Reads getCachedFinancialManagement() and filters debitOpenItems by accountSfid. It is the list the hub shows. Cache-only — despite the by-relation collection shape, it does no remote fallback (see Pending items).Lee getCachedFinancialManagement() y filtra debitOpenItems por el accountSfid. Es la lista que muestra el hub. Cache-only — a pesar del formato de colección por relación, no hace fallback remoto (ver Pendientes).
GetCreditNotesForAccountUseCase 1 · por varejoper retailpor punto de venta
MétodoMethodMétodoRetornaReturnsDevuelveUsoUseUso
execute({accountSfid})Result<List<CreditNoteEntity>, Failure>Idem, sobre creditNotes, filtrando pelo retailerId — que é o campo do varejo na nota de crédito. Alimenta a aba de notas de crédito. Também cache-only.Same, over creditNotes, filtering by retailerId — the credit note's retail field. Feeds the credit notes tab. Also cache-only.Ídem, sobre creditNotes, filtrando por el retailerId — que es el campo del punto de venta en la nota de crédito. Alimenta la pestaña de notas de crédito. También cache-only.
CreatePaymentLinkUseCase 2 · link de pagamentopayment linklink de pago
MétodoMethodMétodoRetornaReturnsDevuelveUsoUseUso
getBanks({resourceSfid})Result<List<PaymentLinkBankEntity>, Failure>Bancos disponíveis para link de pagamento. Delegação pura ao repository.Banks available for the payment link. Pure delegation to the repository.Bancos disponibles para link de pago. Delegación pura al repository.
execute({accountSfid, resourceSfid, bankName, customerTaxId, accountCode, totalAmount, items})Result<PaymentLinkEntity, Failure>Cria o link e, no sucesso, encadeia a marcação dos títulos como pendentes no cache. Falha na marcação é ignorada de propósito: o link já existe no banco, e derrubar o retorno por causa do cache seria pior.Creates the link and, on success, chains the marking of the debit items as pending in the cache. A marking failure is deliberately ignored: the link already exists at the bank, and failing the return because of the cache would be worse.Crea el link y, en el éxito, encadena la marcación de los documentos como pendientes en el caché. Una falla en la marcación se ignora a propósito: el link ya existe en el banco, y tumbar el retorno por el caché sería peor.
BuildFinancialProofPaymentDispatcherPayloadUseCase 1 · escritawriteescritura
MétodoMethodMétodoRetornaReturnsDevuelveUsoUseUso
build({input})DispatcherEnvelopeMonta o envelope de FinancialProofPaymentAPI a partir do FinancialProofPaymentDispatcherPayloadInput (título, pedido, visita, representante, os dois base64, o nome do arquivo e o submittedAt). Toda a construção wire mora aqui: derivação do sfid primário/secundário do representante, NO_INVOICE quando não há nota fiscal, o tipo de evidência entre Both/Photo/Attachment/None, a extensão do arquivo e a formatação das datas. Payload = um array proofOfPayment com um único objeto de 18 campos.Builds the FinancialProofPaymentAPI envelope from the FinancialProofPaymentDispatcherPayloadInput (debit item, order, visit, rep, both base64 blobs, the file name and submittedAt). All the wire construction lives here: deriving the rep's primary/secondary sfid, NO_INVOICE when there is no invoice, the evidence type among Both/Photo/Attachment/None, the file extension and the date formatting. Payload = a proofOfPayment array with a single 18-field object.Arma el envelope de FinancialProofPaymentAPI a partir del FinancialProofPaymentDispatcherPayloadInput (documento, pedido, visita, representante, los dos base64, el nombre del archivo y el submittedAt). Toda la construcción wire vive aquí: derivación del sfid primario/secundario del representante, NO_INVOICE cuando no hay factura, el tipo de evidencia entre Both/Photo/Attachment/None, la extensión del archivo y el formateo de las fechas. Payload = un array proofOfPayment con un único objeto de 18 campos.

O input carrega entities cruas e o relógio como DateTime submittedAt, nunca uma data já formatada (§36). Detalhe campo-a-campo do payload em 16 · FinancialProofPaymentAPI.The input carries raw entities and the clock as a DateTime submittedAt, never an already-formatted date (§36). Field-by-field payload detail in 16 · FinancialProofPaymentAPI.El input carga entities crudas y el reloj como DateTime submittedAt, nunca una fecha ya formateada (§36). Detalle campo a campo del payload en 16 · FinancialProofPaymentAPI.

SubmitFinancialProofPaymentUseCase 1 · escritawriteescritura
MétodoMethodMétodoRetornaReturnsDevuelveUsoUseUso
submit({envelope})Result<DispatcherAck, Failure>Entrega o envelope ao DispatcherOrchestrator. Nada mais — sem persistência, sem retentativa própria, sem efeito local.Hands the envelope to the DispatcherOrchestrator. Nothing else — no persistence, no retry of its own, no local effect.Entrega el envelope al DispatcherOrchestrator. Nada más — sin persistencia, sin reintento propio, sin efecto local.

UseCases emprestados de outras features, que as quatro telas consomem sem serem donas: GetOrdersUseCase (o pedido ligado ao título e a nota fiscal inteira), GetVisitsUseCase (a visita do varejo, de onde saem nome, código SAP e perfil de crédito), GetRetailsUseCase (o mesmo, quando não há visita), GetPaymentRegistersUseCase (pagamentos criados no aparelho) e GetEndMarketConfigurationUseCase (os módulos habilitados no mercado).UseCases borrowed from other features, which the four screens consume without owning: GetOrdersUseCase (the debit item's linked order and the whole invoice), GetVisitsUseCase (the retail's visit, source of name, SAP code and credit profile), GetRetailsUseCase (the same, when there is no visit), GetPaymentRegistersUseCase (payments created on the device) and GetEndMarketConfigurationUseCase (the market's enabled modules).UseCases prestados de otras features, que las cuatro pantallas consumen sin ser dueñas: GetOrdersUseCase (el pedido ligado al documento y la factura completa), GetVisitsUseCase (la visita del punto de venta, de donde salen nombre, código SAP y perfil de crédito), GetRetailsUseCase (lo mismo, cuando no hay visita), GetPaymentRegistersUseCase (pagos creados en el dispositivo) y GetEndMarketConfigurationUseCase (los módulos habilitados en el mercado).

12

Notifier & State

São quatro Notifiers, um por tela, todos @riverpod em família e todos recebendo apenas identificadores — nunca uma entity pela rota (§17). Cada State Freezed é a fonte única de verdade da sua Page: guarda o dado do domínio e todo o estado de cliente, e expõe em getters tudo o que a UI precisa decidir. Nenhum widget calcula nada.There are four Notifiers, one per screen, all @riverpod families and all receiving identifiers only — never an entity through the route (§17). Each Freezed State is its Page's single source of truth: it holds the domain data and all the client state, and exposes in getters everything the UI needs to decide. No widget computes anything.Son cuatro Notifiers, uno por pantalla, todos @riverpod en familia y todos recibiendo solo identificadores — nunca una entity por la ruta (§17). Cada State Freezed es la fuente única de verdad de su Page: guarda el dato del dominio y todo el estado de cliente, y expone en getters todo lo que la UI necesita decidir. Ningún widget calcula nada.

NotifierChave da famíliaFamily keyClave de la familiaAsyncGuardrefresh()
FinancialManagementNotifieraccountSfid + originsimyessim (+ reloadAfterPayment)yes (+ reloadAfterPayment)sí (+ reloadAfterPayment)
DebitOpenItemDetailNotifierdebitOpenItemSfid + originnãonononão — reloadPaymentsno — reloadPaymentsno — reloadPayments
InvoiceDetailNotifierorderSfidnãonononão — só build()no — build() onlyno — solo build()
CreditNoteDetailNotifiercreditNoteSfidsimyessimyes

Métodos · FinancialManagementNotifierMethods · FinancialManagementNotifierMétodos · FinancialManagementNotifier

build({accountSfid, origin}) magrothindelgado

RetornoReturnRetorno FutureOr<FinancialManagementState>

Observa os cinco UseCases (financeiro, títulos por conta, notas por conta, visitas, varejos) e o de configuração de mercado — este último só para reagir à invalidação, o valor é descartado — e devolve _load() dentro do guardedBuild, que converte qualquer exceção em Failure. Nenhuma montagem de state inline (§37).It watches the five UseCases (financial, debit items per account, notes per account, visits, retails) plus the market configuration one — the latter only to react to invalidation, the value is discarded — and returns _load() inside guardedBuild, which converts any exception into a Failure. No inline state assembly (§37).Observa los cinco UseCases (financiero, documentos por cuenta, notas por cuenta, visitas, puntos de venta) y el de configuración de mercado — este último solo para reaccionar a la invalidación, el valor se descarta — y devuelve _load() dentro del guardedBuild, que convierte cualquier excepción en Failure. Ninguna construcción de state inline (§37).

_load({accountSfid, origin}) private

RetornoReturnRetorno Future<FinancialManagementState>

Dono único da montagem do State. Dispara sete futuros em paralelo (visita do varejo, container de visitas, varejos, configuração de mercado, timestamp financeiro, títulos da conta e notas da conta) e só depois aguarda. Filtra os módulos por isVisible, resolve o perfil do varejo e combina o lastSyncAt. Títulos e notas usam getOrThrow — falha ali derruba a tela; visita e varejo são contexto opcional.Sole owner of building the State. It fires seven futures in parallel (the retail's visit, the visits container, retails, market configuration, the financial timestamp, the account's debit items and the account's notes) and only then awaits. It filters modules by isVisible, resolves the retail profile and combines the lastSyncAt. Debit items and notes use getOrThrow — a failure there brings the screen down; visit and retail are optional context.Dueño único del armado del State. Dispara siete futuros en paralelo (visita del punto de venta, container de visitas, puntos de venta, configuración de mercado, timestamp financiero, documentos de la cuenta y notas de la cuenta) y solo después espera. Filtra los módulos por isVisible, resuelve el perfil del punto de venta y combina el lastSyncAt. Documentos y notas usan getOrThrow — una falla ahí tumba la pantalla; visita y punto de venta son contexto opcional.

Perfil do varejo — dois caminhosRetail profile — two pathsPerfil del punto de venta — dos caminos

Com visita no cache, nome, código SAP, inadimplência e os três números de crédito vêm todos de visit.accountData. Sem visita (caso da gestão de cobranças), vêm do retail, e a inadimplência passa a ser calculada: verdadeira se algum título da conta estiver vencido. Não é fallback campo-a-campo — é uma escolha de fonte, feita uma vez, para o bloco inteiro. Note o cruzamento deliberado de nomes: o creditLimit exibido é o baseCreditLimit da fonte, e o disponível é o creditLimit dela.With a visit in cache, name, SAP code, overdue flag and the three credit numbers all come from visit.accountData. With no visit (the collections management case) they come from the retail, and the overdue flag becomes computed: true if any of the account's debit items is overdue. It is not a field-by-field fallback — it is a source choice, made once, for the whole block. Note the deliberate name crossing: the displayed creditLimit is the source's baseCreditLimit, and available is its creditLimit.Con visita en el caché, nombre, código SAP, mora y los tres números de crédito vienen todos de visit.accountData. Sin visita (caso de la gestión de cobranzas) vienen del retail, y la mora pasa a ser calculada: verdadera si algún documento de la cuenta está vencido. No es un fallback campo por campo — es una elección de fuente, hecha una vez, para el bloque entero. Note el cruce deliberado de nombres: el creditLimit exhibido es el baseCreditLimit de la fuente, y el disponible es su creditLimit.

_pickLastSyncAt({containerLastSyncAt, financialLastSyncAt}) private · §23

RetornoReturnRetorno DateTime?

Máximo tolerante a nulo entre dois timestamps: se um é nulo devolve o outro; havendo os dois, devolve o mais recente (empate resolve para o financeiro, porque a comparação é isAfter). Este é o exemplo canônico de combinação do §23: containerLastSyncAt vem do container de visitas (VisitsEntity.lastSyncAt) e financialLastSyncAt vem do agregado financeiro. Faz sentido combinar porque a tela mistura os dois dados: o perfil de crédito vem da visita, os títulos vêm do financeiro — o usuário precisa saber o mais velho dos dois.A null-tolerant maximum between two timestamps: if one is null it returns the other; with both, it returns the newer (a tie resolves to the financial one, because the comparison is isAfter). This is §23's canonical combination example: containerLastSyncAt comes from the visits container (VisitsEntity.lastSyncAt) and financialLastSyncAt comes from the financial aggregate. Combining makes sense because the screen mixes both data sets: the credit profile comes from the visit, the debit items come from the financial side — the user needs to know the older of the two.Un máximo tolerante a nulo entre dos timestamps: si uno es nulo devuelve el otro; con ambos, devuelve el más reciente (un empate resuelve al financiero, porque la comparación es isAfter). Este es el ejemplo canónico de combinación del §23: containerLastSyncAt viene del container de visitas (VisitsEntity.lastSyncAt) y financialLastSyncAt viene del agregado financiero. Combinar tiene sentido porque la pantalla mezcla los dos datos: el perfil de crédito viene de la visita, los documentos vienen del financiero — el usuario necesita saber el más viejo de los dos.

O que ele nunca lê: o lastSyncAt do Resource. Não há leitura de currentResourceProvider neste Notifier, nem fallback para o relógio — se os dois vierem nulos, o State fica com null e o DataLoadInfo mostra travessão.What it never reads: the Resource's lastSyncAt. There is no currentResourceProvider read in this Notifier and no clock fallback — if both come back null the State keeps null and DataLoadInfo shows a dash.Lo que nunca lee: el lastSyncAt del Resource. No hay lectura de currentResourceProvider en este Notifier, ni fallback al reloj — si los dos vienen nulos, el State queda con null y el DataLoadInfo muestra un guion.

refresh() pull-to-refresh

RetornoReturnRetorno Future<void>

Guarda contra state nulo e Notifier desmontado. Faz três buscas remotas sequenciais antes de remontar — visitas, varejos e o agregado financeiro, todas com source: remote — porque a tela depende dos três. Depois chama _load() dentro do guard e reinjeta o estado de cliente: status selecionados, datas, aba e a seleção depurada. Não seta AsyncValue.loading (o arrastar-para-atualizar tem indicador próprio) e nunca invalida a si mesmo.It guards against a null state and an unmounted Notifier. It does three sequential remote fetches before rebuilding — visits, retails and the financial aggregate, all with source: remote — because the screen depends on all three. Then it calls _load() inside the guard and re-injects the client state: selected statuses, dates, tab and the pruned selection. It doesn't set AsyncValue.loading (pull-to-refresh has its own indicator) and never invalidates itself.Protege contra state nulo y Notifier desmontado. Hace tres búsquedas remotas secuenciales antes de rearmar — visitas, puntos de venta y el agregado financiero, todas con source: remote — porque la pantalla depende de las tres. Después llama _load() dentro del guard y reinyecta el estado de cliente: estados seleccionados, fechas, pestaña y la selección depurada. No setea AsyncValue.loading (el deslizar para actualizar tiene indicador propio) y nunca se invalida a sí mismo.

reloadAfterPayment({keepSelection = false}) volta do pagamentoback from the paymentvuelta del pago

RetornoReturnRetorno Future<void>

Mesma forma do refresh(), sem as buscas remotas: o caminho de escrita do pagamento já atualizou o cache, então relê dali. Preserva filtro e aba; a seleção é zerada por padrão e só é mantida (depurada) quando keepSelection é verdadeiro — o hub usa true ao voltar do detalhe do título e false ao voltar de um pagamento concluído.Same shape as refresh(), without the remote fetches: the payment's write path already updated the cache, so it re-reads from there. It preserves filter and tab; the selection is cleared by default and only kept (pruned) when keepSelection is true — the hub uses true when returning from the debit item detail and false when returning from a completed payment.Misma forma que el refresh(), sin las búsquedas remotas: el camino de escritura del pago ya actualizó el caché, así que relee de ahí. Preserva filtro y pestaña; la selección se limpia por default y solo se mantiene (depurada) cuando keepSelection es verdadero — el hub usa true al volver del detalle del documento y false al volver de un pago concluido.

_stillPayableSelection({refreshed, selectedDebitSfids}) private

RetornoReturnRetorno Set<String>

Depura a seleção após um recarregamento: mantém só os sfid que continuam na lista e continuam mostrando checkbox. Sem isso, um título já recebido continuaria contando no total da barra fixa.Prunes the selection after a reload: it keeps only the sfid still in the list and still showing a checkbox. Without it, an already-collected debit item would keep counting in the pinned bar's total.Depura la selección tras una recarga: mantiene solo los sfid que siguen en la lista y siguen mostrando checkbox. Sin eso, un documento ya cobrado seguiría contando en el total de la barra fija.

selectTab({tab}) · applyFilters({selectedStatuses, initialDate, finalDate}) · clearFilters() · toggleDebitSelection({debitOpenItemSfid}) estado de clienteclient stateestado de cliente

RetornoReturnRetorno void (os quatro)(all four)(los cuatro)

Mutações sincronas puras de estado de cliente, todas com guarda de state nulo e todas por copyWith. Nenhuma toca o repository: a filtragem e as contagens são getters do State. toggleDebitSelection copia o conjunto antes de alterar, para não mutar o state em vigor.Pure synchronous client-state mutations, all with a null-state guard and all through copyWith. None touches the repository: filtering and counts are State getters. toggleDebitSelection copies the set before changing it, so as not to mutate the live state.Mutaciones sincrónicas puras de estado de cliente, todas con guarda de state nulo y todas por copyWith. Ninguna toca el repository: el filtrado y los conteos son getters del State. toggleDebitSelection copia el conjunto antes de alterarlo, para no mutar el state vigente.

Métodos · DebitOpenItemDetailNotifierMethods · DebitOpenItemDetailNotifierMétodos · DebitOpenItemDetailNotifier

build({debitOpenItemSfid, origin})

RetornoReturnRetorno FutureOr<DebitOpenItemDetailState>

Este Notifier não tem _load() separado: a montagem inteira mora no build(), e o retry da Page é a recriação do provider. Primeiro abre uma sessão de captura de arquivos e registra a limpeza dela no descarte. Depois busca o título por sfid no cache — ausência aqui é fatal (CacheFailure), porque sem o título não há tela. Em paralelo resolve o pedido ligado (só se o orderSfid não for vazio), a visita do varejo, o agregado (para bancos e pagamentos), os pagamentos locais daquele título e a configuração de mercado. Os dois módulos que interessam — criação de pagamento e comprovante — são resolvidos aqui e viram dois booleanos no State.This Notifier has no separate _load(): the whole assembly lives in build(), and the Page's retry is recreating the provider. It first opens a file capture session and registers its cleanup on dispose. Then it fetches the debit item by sfid from cache — absence here is fatal (CacheFailure), because with no debit item there is no screen. In parallel it resolves the linked order (only if the orderSfid isn't empty), the retail's visit, the aggregate (for banks and payments), that debit item's local payments and the market configuration. The two modules that matter — payment creation and proof — are resolved here and become two booleans on the State.Este Notifier no tiene _load() separado: el armado completo vive en el build(), y el reintento de la Page es la recreación del provider. Primero abre una sesión de captura de archivos y registra su limpieza en el descarte. Después busca el documento por sfid en el caché — la ausencia aquí es fatal (CacheFailure), porque sin el documento no hay pantalla. En paralelo resuelve el pedido ligado (solo si el orderSfid no está vacío), la visita del punto de venta, el agregado (para bancos y pagos), los pagos locales de ese documento y la configuración de mercado. Los dos módulos que importan — creación de pago y comprobante — se resuelven aquí y se vuelven dos booleanos en el State.

reloadPayments() volta do pagamentoback from the paymentvuelta del pago

RetornoReturnRetorno Future<void>

Relê três coisas do cache — pagamentos locais do título, o próprio título (para pegar o saldo abatido) e o agregado (para os pagamentos do backend) — e aplica por copyWith. Rechecar ref.mounted e reler state.value antes de escrever evita sobrescrever um state mais novo. Nunca seta loading nem erro: é uma atualização silenciosa.It re-reads three things from cache — the debit item's local payments, the debit item itself (to pick up the reduced balance) and the aggregate (for the backend payments) — and applies them via copyWith. Re-checking ref.mounted and re-reading state.value before writing avoids overwriting a newer state. It never sets loading or error: it is a silent update.Relee tres cosas del caché — pagos locales del documento, el propio documento (para tomar el saldo descontado) y el agregado (para los pagos del backend) — y los aplica por copyWith. Reverificar ref.mounted y releer state.value antes de escribir evita sobrescribir un state más nuevo. Nunca setea loading ni error: es una actualización silenciosa.

captureProofOfPaymentImage({source}) · pickProofOfPaymentDocument() capturacapturecaptura

RetornoReturnRetorno Future<void> (os dois)(both)(los dos)

Simétricos. Cada um sai imediatamente se a seção estiver ocupada ou se já houver arquivo daquele tipo; liga a sua flag de ocupado, chama o serviço de captura na sessão do Notifier e guarda o arquivo. Cancelamento do usuário só desliga a flag. Qualquer exceção é logada e a flag desligada — nada é engolido em silêncio. O anexo aceita imagem, PDF e documento; a foto aceita só câmera.Symmetric. Each returns immediately if the section is busy or a file of that kind already exists; it turns its busy flag on, calls the capture service on the Notifier's session and stores the file. A user cancel just turns the flag off. Any exception is logged and the flag turned off — nothing is silently swallowed. The attachment accepts image, PDF and document; the photo accepts camera only.Simétricos. Cada uno sale inmediatamente si la sección está ocupada o si ya hay archivo de ese tipo; enciende su flag de ocupado, llama al servicio de captura en la sesión del Notifier y guarda el archivo. La cancelación del usuario solo apaga la flag. Cualquier excepción se loguea y la flag se apaga — nada se traga en silencio. El adjunto acepta imagen, PDF y documento; la foto acepta solo cámara.

removeProofOfPaymentPhoto() · removeProofOfPaymentAttachment() remoçãoremovalremoción

RetornoReturnRetorno Future<void> (os dois)(both)(los dos)

Tiram o arquivo do State antes de apagá-lo do disco, para a miniatura desaparecer na hora. Sem arquivo, não fazem nada.They take the file off the State before deleting it from disk, so the thumbnail disappears right away. With no file, they do nothing.Quitan el archivo del State antes de borrarlo del disco, para que la miniatura desaparezca al instante. Sin archivo, no hacen nada.

submitProofOfPayment() escrita · dispatcherwrite · dispatcherescritura · dispatcher

RetornoReturnRetorno Future<Failure?>null significa sucessonull means successnull significa éxito

O único método de escrita das quatro telas. Recusa se não houver evidência ou se a seção estiver ocupada. Liga a flag de envio, resolve o representante da sessão (sem ele, falha), relê a visita do varejo, converte os arquivos em base64 e monta o input com as entities cruas mais o submittedAt. Chama o builder, despacha, e no sucesso limpa as duas evidências do State e apaga os arquivos temporários. Em falha, desliga a flag e devolve o Failure — é o widget que decide mostrar o aviso, conforme §39.The four screens' only write method. It refuses if there is no evidence or the section is busy. It turns the submitting flag on, resolves the session's rep (without it, it fails), re-reads the retail's visit, converts the files into base64 and builds the input with the raw entities plus submittedAt. It calls the builder, dispatches, and on success clears both pieces of evidence from the State and deletes the temporary files. On failure it turns the flag off and returns the Failure — the widget is what decides to show the notice, per §39.El único método de escritura de las cuatro pantallas. Rechaza si no hay evidencia o si la sección está ocupada. Enciende la flag de envío, resuelve el representante de la sesión (sin él, falla), relee la visita del punto de venta, convierte los archivos en base64 y arma el input con las entities crudas más el submittedAt. Llama al builder, despacha, y en el éxito limpia las dos evidencias del State y borra los archivos temporales. En falla apaga la flag y devuelve el Failure — el widget es quien decide mostrar el aviso, conforme §39.

Métodos · InvoiceDetailNotifier e CreditNoteDetailNotifierMethods · InvoiceDetailNotifier and CreditNoteDetailNotifierMétodos · InvoiceDetailNotifier y CreditNoteDetailNotifier

InvoiceDetailNotifier.build({orderSfid}) único métodoonly methodúnico método

RetornoReturnRetorno FutureOr<InvoiceDetailState>

O Notifier mais enxuto dos quatro: só o build(), sem refresh e sem nenhum método público. Busca o pedido por sfid e o container de pedidos em paralelo, os dois cache-only. Cache vazio, sfid vazio ou pedido sem nota fiscal lançam a mesma BusinessFailure — é ela que a Page traduz na tela de não encontrada, em vez da tela de falha genérica. O lastSyncAt vem do container de pedidos, não do financeiro.The leanest of the four: build() only, no refresh and no public method at all. It fetches the order by sfid and the orders container in parallel, both cache-only. An empty cache, an empty sfid or an order with no invoice all throw the same BusinessFailure — the one the Page turns into the not found screen instead of the generic failure screen. The lastSyncAt comes from the orders container, not the financial one.El Notifier más delgado de los cuatro: solo el build(), sin refresh y sin ningún método público. Busca el pedido por sfid y el container de pedidos en paralelo, ambos cache-only. Un caché vacío, un sfid vacío o un pedido sin factura lanzan la misma BusinessFailure — la que la Page traduce en la pantalla de no encontrada, en lugar de la pantalla de falla genérica. El lastSyncAt viene del container de pedidos, no del financiero.

CreditNoteDetailNotifier.build({creditNoteSfid}) · _load() · refresh()

RetornoReturnRetorno FutureOr<CreditNoteDetailState> · Future<CreditNoteDetailState> · Future<void>

O build() é canônico: uma linha devolvendo _load() dentro do guard. O _load() não recebe parâmetros — lê o creditNoteSfid da própria família. Busca a nota no cache (ausente → BusinessFailure) e, em seguida, resolve nome e código SAP do varejo pelo retailerId e o conjunto de pedidos em cache entre os referenciados pela nota. O refresh() guarda contra state nulo e refaz o _load()sem busca remota, só releitura de cache, e sem estado de cliente a preservar.The build() is canonical: one line returning _load() inside the guard. _load() takes no parameters — it reads creditNoteSfid from its own family. It fetches the note from cache (missing → BusinessFailure) and then resolves the retail's name and SAP code by retailerId plus the set of cached orders among those the note references. refresh() guards against a null state and redoes _load()no remote fetch, only a cache re-read, and no client state to preserve.El build() es canónico: una línea devolviendo _load() dentro del guard. El _load() no recibe parámetros — lee el creditNoteSfid de la propia familia. Busca la nota en el caché (ausente → BusinessFailure) y luego resuelve nombre y código SAP del punto de venta por el retailerId y el conjunto de pedidos en caché entre los referenciados por la nota. El refresh() protege contra state nulo y rehace el _load()sin búsqueda remota, solo relectura de caché, y sin estado de cliente a preservar.

O _resolveCachedOrderSfids merece nota: junta os orderSfid não vazios da origem (excedente e devolução) e de todos os pedidos aplicados, e cruza com os pedidos do cache. O resultado é o gate do botão Ver detalhes — sem esse cruzamento, o botão levaria à tela de nota fiscal não encontrada._resolveCachedOrderSfids deserves a note: it collects the non-empty orderSfid from the origin (overpayment and return) and from every applied order, and intersects them with the cached orders. The result is the View details button's gate — without that intersection the button would lead to the invoice not found screen._resolveCachedOrderSfids merece nota: junta los orderSfid no vacíos del origen (excedente y devolución) y de todos los pedidos aplicados, y los cruza con los pedidos del caché. El resultado es el gate del botón Ver detalles — sin ese cruce, el botón llevaría a la pantalla de factura no encontrada.

States disponíveis para as PagesStates available to the PagesStates disponibles para las Pages

FinancialManagementState 18 campos · 23 gettersfields · 23 getterscampos · 23 getters
IdentidadeIdentityIdentidad
accountSfid (String) · origin (PaymentCreationOrigin) · visitSfid (String?)
Perfil do varejoRetail profilePerfil del punto de venta
accountName · customerCode (String?) · isOverdue (bool) · creditLimit · availableCredit (double?) · creditDays (int?)
DadosDataDatos
accountDebitOpenItems (List<DebitOpenItemEntity>) · accountCreditNotes (List<CreditNoteEntity>) · visibleModules (List<ModuleConfig>) · lastSyncAt (DateTime?)
Estado de clienteClient stateEstado de cliente
selectedStatuses (Set<DebitOpenItemStatus>) · selectedDebitSfids (Set<String>) · selectedTab (FinancialManagementTab) · initialDate · finalDate (DateTime?)
ConfiguraçãoConfigurationConfiguración
getModule · hasFilterDetail · paymentSelectionEnabled · paymentLinkEnabled · showTabBar · showDebitsTab · showCreditNotesTab · visibleTabs · hasVisibleTabBar
RecorteSliceRecorte
filteredDebitOpenItems (memoizado — o resultado é cacheado por instância de State, então rebuilds não refazem o filtro)(memoized — the result is cached per State instance, so rebuilds don't redo the filter)(memoizado — el resultado se cachea por instancia de State, así que los rebuilds no rehacen el filtro) · hasActiveFilters
Seleção e totaisSelection and totalsSelección y totales
isDebitSelected · debitShowsCheckbox · selectedDebits · selectedDebitsCount · selectedDebitsTotal · selectedPaymentDebits (converte a seleção nos itens do rascunho de pagamento)(turns the selection into the payment draft's items)(convierte la selección en los ítems del borrador de pago)
ContagensCountsConteos
debitsCount · debitsOpenCount · debitsOpenTotal · creditNotesCount · creditNotesAvailableCount · creditNotesAvailableTotal
DebitOpenItemDetailState 18 campos · 14 gettersfields · 14 getterscampos · 14 getters
DadosDataDatos
debit (DebitOpenItemEntity, obrigatóriorequiredobligatorio) · order (OrderEntity?) · visitSfid (String?) · banks (List<BankEntity>) · payments (List<PaymentEntity>) · paymentRegisters (List<PaymentRegisterEntity>) · lastSyncAt (DateTime?)
ContextoContextContexto
origin (PaymentCreationOrigin) · accountName · accountSapId (String?) · accountIsOverdue (bool) · isPaymentCreationEnabled · isProofOfPaymentEnabled (bool)
ComprovanteProofComprobante
proofOfPaymentPhoto · proofOfPaymentAttachment (CapturedFileEntity?) · isCapturingProofOfPaymentImage · isPickingProofOfPaymentDocument · isSubmittingProofOfPayment (bool)
ExibiçãoDisplayExhibición
displayAccountName · displayAccountSapId · displayInvoiceDocumentNumber · displayInvoiceLegalNumber · displayInvoiceStatus (os três últimos leem order.invoice; travessão quando não há)(the last three read order.invoice; a dash when absent)(los tres últimos leen order.invoice; guion cuando no hay)
DecisõesDecisionsDecisiones
invoiceDetailOrder (gate do link para a nota fiscal)(the invoice link's gate)(gate del link a la factura) · canCreatePayment · requiresStartedVisitToPay · hasPayments · isProofOfPaymentBusy · hasProofOfPaymentEvidence · canSubmitProofOfPayment
LookupLookupLookup
bankNameBySfid · bankBranchNameBySfid — traduzem os sfid gravados no pagamento local em nomes legíveis, usando a lista de bancos do agregado— they turn the sfid stored on the local payment into readable names, using the aggregate's bank list— traducen los sfid grabados en el pago local a nombres legibles, usando la lista de bancos del agregado
InvoiceDetailState 2 campos · 12 gettersfields · 12 getterscampos · 12 getters
CamposFieldsCampos
order (OrderEntity, obrigatóriorequiredobligatorio) · lastSyncAt (DateTime?). A nota fiscal não é campo: é alcançada por order.invoice.The invoice is not a field: it is reached through order.invoice.La factura no es campo: se alcanza por order.invoice.
ItensItemsÍtems
paidLineItems · freeOfChargeLineItems · paidLineItemsByCategory · nonEmptyPaidCategories — a separação entre pago e bonificado e o agrupamento por categoria vivem aqui, não no widget— the split between paid and free-of-charge and the grouping by category live here, not in the widget— la separación entre pagado y bonificado y el agrupamiento por categoría viven aquí, no en el widget
Da nota fiscalFrom the invoiceDe la factura
displayInvoiceLegalNumber · displayInvoiceNumber · displaySubtotal · displayDiscount · displayTotal
Do pedidoFrom the orderDel pedido
displayPoRetail · displayCashFee · displayVat — só o que a nota fiscal genuinamente não tem— only what the invoice genuinely doesn't have— solo lo que la factura genuinamente no tiene
CreditNoteDetailState 5 campos · 5 gettersfields · 5 getterscampos · 5 getters
CamposFieldsCampos
creditNote (CreditNoteEntity, obrigatóriorequiredobligatorio) · accountName · accountCustomerCode (String, vazio por defaultempty by defaultvacío por default) · cachedOrderSfids (Set<String>) · lastSyncAt (DateTime?)
GettersGettersGetters
cnapOrigin · salesReturnOrigin · hasOrigin · hasAppliedOrders · canOpenOrder — o último exige orderSfid não vazio e presente em cachedOrderSfids— the last one requires a non-empty orderSfid and its presence in cachedOrderSfids— el último exige orderSfid no vacío y presente en cachedOrderSfids

Nota fiscal e pedido — sourcing campo-a-campoInvoice and order — field-by-field sourcingFactura y pedido — sourcing campo por campo A tela de nota fiscal compõe dados de duas entities: a nota fiscal (primária, dentro do pedido) e o pedido (agregado pai). Cada campo tem uma fonte só. Da nota fiscal vêm número legal, número, subtotal, desconto, total e os itens; do pedido vêm nome e código do varejo, nº PO, PO do varejo, origem, recurso, forma de pagamento, as parcelas de pagamento, taxa e imposto — exatamente os campos que a nota fiscal não possui. Não há fallback cego em nenhum ponto: o pedido também carrega subtotal, discount e total, e ainda assim os três valores exibidos vêm da nota fiscal, sem ?? order.total em lugar nenhum (§35). The invoice screen composes data from two entities: the invoice (primary, inside the order) and the order (parent aggregate). Each field has a single source. From the invoice come the legal number, number, subtotal, discount, total and the items; from the order come the retail's name and code, PO no., retail PO, source, resource, payment method, the payment instalments, fee and tax — exactly the fields the invoice doesn't have. There is no blind fallback anywhere: the order also carries subtotal, discount and total, and still the three displayed figures come only from the invoice, with no ?? order.total anywhere (§35). La pantalla de factura compone datos de dos entities: la factura (primaria, dentro del pedido) y el pedido (agregado padre). Cada campo tiene una sola fuente. De la factura vienen número legal, número, subtotal, descuento, total y los ítems; del pedido vienen nombre y código del punto de venta, nº PO, PO del punto de venta, origen, recurso, método de pago, las cuotas de pago, tasa e impuesto — exactamente los campos que la factura no posee. No hay fallback ciego en ningún punto: el pedido también carga subtotal, discount y total, y aun así los tres valores exhibidos vienen solo de la factura, sin ?? order.total en ninguna parte (§35).

13

Pages e widgetsPages & widgetsPages y widgets

Quatro ConsumerWidget, cada um observando o seu provider e montando os filhos. Loading e erro são globais em todas (asyncState.when); o conteúdo existe só no ramo data. A visibilidade de cada bloco vive dentro do widget filho, com SizedBox.shrink() no início — as Pages não decidem (§27). Árvores de composição, com os modais aninhados sob quem os abre:Four ConsumerWidget, each watching its provider and composing the children. Loading and error are global on all of them (asyncState.when); content exists only in the data branch. Each block's visibility lives inside the child widget, with an early SizedBox.shrink() — the Pages don't decide (§27). Composition trees, with the modals nested under whoever opens them:Cuatro ConsumerWidget, cada uno observando su provider y armando los hijos. Loading y error son globales en todas (asyncState.when); el contenido existe solo en la rama data. La visibilidad de cada bloque vive dentro del widget hijo, con SizedBox.shrink() al inicio — las Pages no deciden (§27). Árboles de composición, con los modales anidados bajo quien los abre:

Hub — FinancialManagementPageHub — FinancialManagementPageHub — FinancialManagementPage

  • FinancialManagementPage accountSfid + origin
    • AppPageShell displayBackButton · background
      • CustomLoadingIndicator loading
      • FailureStateView error → invalidate
      • Stack data
        • CustomPullToRefresh → refresh() · padding reserva o rodapé fixo
          • DataLoadInfo state.lastSyncAt (visita + financeiro)
          • AccountHeaderCard nome · código SAP · selo de inadimplência
          • FinancialManagementCreditSectionWidget shrink se módulo retail_credit_details ausente
            • FinancialManagementCreditInfoCard 3 colunas: limite · disponível · dias
          • FinancialManagementTabBarWidget shrink se !showTabBar ou < 2 abas → selectTab
          • FinancialManagementDebitsTabContent aba Débitos
            • FinancialManagementTabContentHeader totais + ConectaFilterButton (isActive: hasActiveFilters)
              • FinancialManagementTotalsBarWidget N em aberto + CustomText.currency(debitsOpenTotal)
              • FinancialManagementFiltersModalContent modal · ConectaModalScaffold (rodapé fixo)
                • _StatusFilterSection shrink se detail filter_status ausente · pílulas de DebitOpenItemStatus.selectable
                • _DateRangeFilterSection shrink se detail filter_date_range ausente · 2 campos de data
                • _DatePickerModalContent modal aninhado · CustomCalendar → backWithResult<DateTime> (clampado)
                • _FooterButtons Limpar (outlined, só com filtro) + Aplicar (filled) → applyFilters / clearFilters
            • FinancialManagementDebitOpenItemsList
              • FinancialManagementDebitOpenItemsEmpty CustomEmptyState · texto muda com hasActiveFilters
              • FinancialManagementDebitOpenItemCard → goToDebitOpenItemDetail(origin) · volta → reloadAfterPayment(keepSelection: true)
                • FinancialManagementStatusPill status + pílula de link de pagamento
                • CustomCheckbox só se debitShowsCheckbox → toggleDebitSelection
                • CustomText.currency item.price
          • FinancialManagementCreditNotesTabContent aba Notas de crédito · CustomEmptyState se vazia
            • FinancialManagementTabContentHeader N disponíveis + creditNotesAvailableTotal (sem filtro)
            • FinancialManagementCreditNoteRow folio · valor · data → goToCreditNoteDetail (só se módulo credit_note_detail visível)
          • FinancialManagementDebitOpenItemsSectionWidget ramo SEM tab bar · shrink se módulo debit_open_item_list ausente
            • FinancialManagementDebitOpenItemsHeader título + ConectaFilterButton → mesmo modal de filtros
            • FinancialManagementDebitOpenItemsList a mesma lista de cima
        • FinancialManagementStickyFooterWidget CustomSummaryBar · visible: paymentSelectionEnabled && selectedDebitsCount > 0
          • CustomSummaryDebitsList expandido: selectedPaymentDebits
          • VisitNotStartedModalContent modal do VisitStartGuard, quando origin.requiresStartedVisit
          • → goToPaymentCreation semeia paymentDraftProvider · volta paid? → reloadAfterPayment()

Dois cabeçalhos coexistem por desenho: o …TabContentHeader (com abas) e o …DebitOpenItemsHeader (sem abas) têm layouts diferentes, mas abrem o mesmo modal de filtros. O modal não devolve valor: escreve direto no Notifier e fecha.Two headers coexist by design: …TabContentHeader (with tabs) and …DebitOpenItemsHeader (without tabs) have different layouts but open the same filters modal. The modal returns no value: it writes straight into the Notifier and closes.Dos encabezados coexisten por diseño: el …TabContentHeader (con pestañas) y el …DebitOpenItemsHeader (sin pestañas) tienen layouts distintos, pero abren el mismo modal de filtros. El modal no devuelve valor: escribe directo en el Notifier y cierra.

Detalhe do título — DebitOpenItemDetailPageDebit item detail — DebitOpenItemDetailPageDetalle del documento — DebitOpenItemDetailPage

  • DebitOpenItemDetailPage debitOpenItemSfid + origin
    • AppPageShell displayBackButton · background
      • CustomLoadingIndicator loading
      • FailureStateView error → invalidate
      • SingleChildScrollView data · sem pull-to-refresh
        • DataLoadInfo state.lastSyncAt (agregado financeiro)
        • AccountHeaderCard displayAccountName · displayAccountSapId · accountIsOverdue
        • DebitOpenItemDetailInvoiceCardWidget sempre visível
          • FinancialManagementStatusPill status do título
          • CustomText.currency debit.price
          • _buildInfoGrid Número (link) · Nº fatura · Dias em aberto · Status · Em disputa
          • → goToInvoiceDetail só se invoiceDetailOrder != null · texto simples caso contrário
        • DebitOpenItemDetailPayButtonWidget shrink se !canCreatePayment
          • VisitNotStartedModalContent modal do VisitStartGuard, quando requiresStartedVisitToPay
          • → goToPaymentCreation semeia 1 PaymentDebitEntity · volta paid? → reloadPayments()
        • DebitOpenItemDetailPaymentsWidget shrink se !isPaymentCreationEnabled
          • CustomEmptyState se !hasPayments
          • _PaymentCard registros locais: método · valor · datas · nº transação · banco · agência · status
          • _PaymentCard pagamentos do backend: método · valor · data · nº transação · status
          • _OriginPill Link de pagamento vs Manual
        • DebitOpenItemDetailProofOfPaymentWidget shrink se !isProofOfPaymentEnabled
          • _ProofPaymentButton Tirar foto → captureProofOfPaymentImage(camera)
          • _ProofPaymentButton Anexar → pickProofOfPaymentDocument()
          • CustomFileThumbnail onRemove → remove…Photo / remove…Attachment
          • CustomButton Enviar comprovante → submitProofOfPayment() → ConectaNotice

Detalhe da nota fiscal — InvoiceDetailPageInvoice detail — InvoiceDetailPageDetalle de la factura — InvoiceDetailPage

  • InvoiceDetailPage orderSfid
    • AppPageShell displayBackButton
      • CustomLoadingIndicator loading
      • InvoiceDetailNotFoundWidget error is BusinessFailure → CustomErrorState
      • FailureStateView qualquer outro erro → invalidate
      • SingleChildScrollView data · tela folha, sem navegação de saída
        • DataLoadInfo state.lastSyncAt (container de pedidos)
        • InvoiceDetailTitleWidget ícone + Fatura
        • AccountHeaderCard order.accountName · order.accountSapId
        • InvoiceDetailNumberPillWidget displayInvoiceLegalNumber
        • InvoiceDetailInfoGridWidget 6 InvoiceDetailLabelValueWidget
        • InvoiceDetailPaymentSectionWidget sempre visível
          • _buildPaymentRow order.payments: forma · CustomText.currency · vencimento
          • _buildPlaceholderRow sem parcelas: displayTotal + order.deliveryDate
        • InvoiceDetailItemsSectionWidget shrink se nonEmptyPaidCategories vazio · agrupado por categoria
        • InvoiceDetailFreeOfChargeSectionWidget shrink se freeOfChargeLineItems vazio · SKU + qtd
        • InvoiceDetailTotalSectionWidget subtotal · desconto · taxa · imposto · total (CurrencyUtils.format)

Detalhe da nota de crédito — CreditNoteDetailPageCredit note detail — CreditNoteDetailPageDetalle de la nota de crédito — CreditNoteDetailPage

  • CreditNoteDetailPage creditNoteSfid
    • AppPageShell displayBackButton · background
      • CustomLoadingIndicator loading
      • FailureStateView error → refresh() (não invalidate)
      • CustomPullToRefresh data → refresh()
        • DataLoadInfo state.lastSyncAt (agregado financeiro)
        • AccountHeaderCard accountName em maiúsculas · accountCustomerCode
        • CreditNoteDetailHeaderCardWidget
          • FinancialManagementStatusPill Disponível / Utilizada (widget importado do hub)
          • CustomText.currency amount e effectiveAvailableAmount
          • _buildField Folio · Data · Tipo (creditNoteType.labelKey)
        • _buildOriginSection título por tipo (originSectionLabelKey)
          • CustomEmptyState se !hasOrigin
          • CreditNoteDetailSummaryCardWidget CNAP: DPI · nº fatura · total devido · total pago · diferença · forma
            • CreditNoteDetailFieldRowWidget label / valor · travessão se vazio
            • CustomButton Ver detalhes → goToInvoiceDetail (só se canOpenOrder)
            • unavailableMessage texto cinza quando o pedido não está em cache
          • CreditNoteDetailSummaryCardWidget devolução: nº fatura · nº PO · PO do varejo · origem · recurso · forma
        • _buildAppliedSection shrink se !hasAppliedOrders && !isUsed
          • CustomEmptyState usada mas sem faturas aplicadas
          • CreditNoteDetailSummaryCardWidget um card por fatura aplicada → goToInvoiceDetail

Nenhuma das quatro telas usa Navigator direto — toda navegação passa pelo AppRouter (§16). Todo valor monetário sai de CustomText.currency (renderização) ou CurrencyUtils.format (quando o destino é uma String), com o mercado vindo do currentMarketProvider; não há formatação manual em lugar nenhum (§15). A única formatação numérica feita em widget é a contagem de dias de crédito, que não é dinheiro.None of the four screens uses Navigator directly — all navigation goes through AppRouter (§16). Every monetary value comes from CustomText.currency (rendering) or CurrencyUtils.format (when the destination is a String), with the market read from currentMarketProvider; there is no manual formatting anywhere (§15). The only numeric formatting done in a widget is the credit days count, which is not money.Ninguna de las cuatro pantallas usa Navigator directo — toda navegación pasa por el AppRouter (§16). Todo valor monetario sale de CustomText.currency (renderización) o CurrencyUtils.format (cuando el destino es un String), con el mercado viniendo del currentMarketProvider; no hay formateo manual en ninguna parte (§15). El único formateo numérico hecho en widget es el conteo de días de crédito, que no es dinero.

Notas por mercadoMarket notesNotas por mercado

A Gestão financeira é dirigida por configuração de mercado (End Market Configuration), não por código fixo — não há um único if por mercado nas quatro telas. Está habilitada em três mercados:Financial management is driven by market configuration (End Market Configuration), not hardcoded — there isn't a single per-market if across the four screens. It's enabled in three markets:La Gestión financiera se rige por configuración de mercado (End Market Configuration), no por código fijo — no hay un solo if por mercado en las cuatro pantallas. Está habilitada en tres mercados:

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

Módulos de financialManagementConfigfinancialManagementConfig modulesMódulos de financialManagementConfig

Uma linha por chave, sem truncar. As duas linhas indentadas são details do módulo de filtros. Em AR/PY/PE o bloco financialManagementConfig inteiro não existe — por isso todas as chaves aparecem como ausentes.One row per key, nothing truncated. The two indented rows are details of the filters module. In AR/PY/PE the whole financialManagementConfig block doesn't exist — hence every key shows as absent.Una fila por clave, sin truncar. Las dos filas indentadas son details del módulo de filtros. En AR/PY/PE el bloque financialManagementConfig completo no existe — por eso todas las claves aparecen como ausentes.

moduleNameBRCLZAARPYPE
financial_management_retail_credit_detailsxxx
financial_management_filtersxxx
financial_management_filter_statusxxx
financial_management_filter_date_rangexxx
financial_management_debit_open_item_listxxx
financial_management_tab_barx
financial_management_credit_note_listx
financial_management_credit_note_detailx
financial_management_payment_linkx
financial_management_payment_creationx
financial_management_debit_detail_proof_of_paymentxfalsex

Escalares de financialManagementConfigfinancialManagementConfig scalarsEscalares de financialManagementConfig

Quatro chaves de valor, não de visibilidade. Todas governam a criação de pagamentos, mas moram no bloco desta feature.Four value keys, not visibility keys. They all govern payment creation, but they live in this feature's block.Cuatro claves de valor, no de visibilidad. Todas gobiernan la creación de pagos, pero viven en el bloque de esta feature.

ChaveKeyClaveBRCLZAARPYPE
allowMultiplePaymentMethodsPerDpifalsetruefalse
maxPaymentMethodsPerPayment131
allowPaymentExcessRedirectfalsetruefalse
fullPaymentRequiredResourceTypes[]["Pre-sales Rep"][]

Chaves de outros blocos que afetam a featureKeys in other blocks that affect the featureClaves de otros bloques que afectan la feature

ChaveKeyClaveBRCLZAARPYPE
visitDetailConfigvisit_detail_tools_gridfinancial_managementxxx
homeConfigrep_actionscollections_managementx
dataFreshnessConfig.ttlSecondsByType.financialManagement900900900

O detalhe da nota fiscal não tem módulo próprio no EMC: ele herda o gate de quem o abre (o detalhe do título em BR/CL/ZA, e o detalhe da nota de crédito em CL) e é gated em tempo de execução pela presença do pedido no cache. Além do EMC, há um gate por código no eixo de sincronização: o tipo de sincronização financialManagement declara enabledMarkets como BR/CL/ZA, o que confirma AR/PY/PE fora também da varredura de dados vencidos.The invoice detail has no EMC module of its own: it inherits the gate from whoever opens it (the debit item detail in BR/CL/ZA, and the credit note detail in CL) and is gated at runtime by the order's presence in cache. Beyond the EMC there is a code-level gate on the sync axis: the financialManagement sync type declares enabledMarkets as BR/CL/ZA, which confirms AR/PY/PE are out of the stale-data sweep too.El detalle de la factura no tiene módulo propio en el EMC: hereda el gate de quien lo abre (el detalle del documento en BR/CL/ZA, y el detalle de la nota de crédito en CL) y está gated en tiempo de ejecución por la presencia del pedido en el caché. Además del EMC, hay un gate por código en el eje de sincronización: el tipo de sincronización financialManagement declara enabledMarkets como BR/CL/ZA, lo que confirma que AR/PY/PE también están fuera del barrido de datos vencidos.

BR

BrasilBrazilBrasil Perfil reduzido: crédito, filtros (status e período), lista de títulos e comprovante de pagamento no detalhe. Sem abas, notas de crédito, criação de pagamento e link de pagamento — logo, sem checkbox, sem barra fixa, sem botão Pagar e sem seção de pagamentos. O comprovante é a única ação de escrita disponível aqui. Reduced profile: credit, filters (status and period), the debit item list and proof of payment in the detail. No tabs, credit notes, payment creation or payment link — hence no checkbox, no pinned bar, no Pay button and no payments section. The proof is the only write action available here. Perfil reducido: crédito, filtros (estado y período), lista de documentos y comprobante de pago en el detalle. Sin pestañas, notas de crédito, creación de pago ni link de pago — por lo tanto, sin checkbox, sin barra fija, sin botón Pagar y sin sección de pagos. El comprobante es la única acción de escritura disponible aquí.

CL

ChileChileChile Perfil completo e único mercado com o fluxo de cobrança inteiro: abas, notas de crédito (lista e detalhe), criação de pagamento com até três formas, redirecionamento de excedente, obrigação de pagamento integral para Pre-sales Rep e link de pagamento. É também o único com a segunda entrada pela gestão de cobranças da Home, que dispensa visita iniciada. Em contrapartida, o comprovante no detalhe do título está presente e desligado (isVisible: false) — aqui o comprovante é anexado dentro do fluxo de pagamento, não no detalhe. Full profile and the only market with the whole collections flow: tabs, credit notes (list and detail), payment creation with up to three methods, excess redirect, full-payment obligation for Pre-sales Rep and the payment link. It is also the only one with the second entry point through Home's collections management, which waives the started visit. In exchange, the proof in the debit item detail is present and off (isVisible: false) — here the proof is attached inside the payment flow, not in the detail. Perfil completo y único mercado con el flujo de cobranza completo: pestañas, notas de crédito (lista y detalle), creación de pago con hasta tres métodos, redirección de excedente, obligación de pago íntegro para Pre-sales Rep y link de pago. Es también el único con la segunda entrada por la gestión de cobranzas de la Home, que no exige visita iniciada. En cambio, el comprobante en el detalle del documento está presente y apagado (isVisible: false) — aquí el comprobante se adjunta dentro del flujo de pago, no en el detalle.

ZA

África do SulSouth AfricaSudáfrica Configuração idêntica ao Brasil — os mesmos quatro módulos e os mesmos quatro escalares. A diferença visível é só de formatação: moeda estilo 1,234.56 e o formato de data do mercado. Configuration identical to Brazil — the same four modules and the same four scalars. The visible difference is formatting only: 1,234.56-style currency and the market's date format. Configuración idéntica a Brasil — los mismos cuatro módulos y los mismos cuatro escalares. La diferencia visible es solo de formateo: moneda estilo 1,234.56 y el formato de fecha del mercado.

ARPYPE

AR · PY · PE — sem a featureAR · PY · PE — feature absentAR · PY · PE — sin la feature Existem como mercados do app, mas com configuração mínima: o EMC deles tem apenas quatro blocos de topo, e nem financialManagementConfig nem visitDetailConfig estão entre eles. Sem o bloco de configuração não há tela, e sem a grade de ferramentas da visita não há nem atalho para chegar nela. O mock financeiro desses mercados é um arquivo vazio, e o tipo de sincronização não os inclui. They exist as app markets, but with minimal configuration: their EMC has only four top-level blocks, and neither financialManagementConfig nor visitDetailConfig is among them. With no configuration block there is no screen, and with no visit tools grid there isn't even a shortcut to reach it. Those markets' financial mock is an empty file, and the sync type doesn't include them. Existen como mercados de la app, pero con configuración mínima: su EMC tiene apenas cuatro bloques de tope, y ni financialManagementConfig ni visitDetailConfig están entre ellos. Sin el bloque de configuración no hay pantalla, y sin la grilla de herramientas de la visita no hay ni atajo para llegar a ella. El mock financiero de esos mercados es un archivo vacío, y el tipo de sincronización no los incluye.

Pendências / roadmapPending items / roadmapPendientes / roadmap

  • Sincronização incremental não implementada. O campo lastModifiedDate existe no request do proto e no parâmetro do datasource, mas nenhum caller o passa — todo fetch remoto traz o agregado inteiro do mercado. O gancho de delta-sync está no contrato e inerte no app.Incremental sync not implemented. The lastModifiedDate field exists on the proto request and on the datasource parameter, but no caller passes it — every remote fetch brings the market's whole aggregate. The delta-sync hook is in the contract and inert in the app.Sincronización incremental no implementada. El campo lastModifiedDate existe en el request del proto y en el parámetro del datasource, pero ningún caller lo pasa — todo fetch remoto trae el agregado completo del mercado. El gancho de delta-sync está en el contrato e inerte en la app.
  • htmlResponse recebido e descartado. O reply de createPaymentLink traz um quarto campo com HTML que não tem correspondente no DTO nem na Entity — hoje o app usa só a URL. Se o mercado passar a exigir renderizar o retorno do banco, o campo precisa ser modelado.htmlResponse received and dropped. The createPaymentLink reply carries a fourth field with HTML that has no counterpart in the DTO or the Entity — today the app uses only the URL. If the market starts requiring the bank's response to be rendered, the field has to be modelled.htmlResponse recibido y descartado. El reply de createPaymentLink trae un cuarto campo con HTML que no tiene correspondiente en el DTO ni en la Entity — hoy la app usa solo la URL. Si el mercado pasa a exigir renderizar el retorno del banco, el campo debe modelarse.
  • Comprovante obrigatório se perde no merge ad hoc. A flag isProofOfPaymentMandatory existe no proto de gestão financeira mas não no de visita ad hoc; o merge aditivo, portanto, não a recebe, e ela volta ao default false até a próxima sincronização cheia. Numa visita ad hoc, um representante para quem o comprovante é obrigatório pode ficar temporariamente sem essa exigência.Mandatory-proof flag lost in the ad hoc merge. The isProofOfPaymentMandatory flag exists in the financial management proto but not in the ad hoc visit one; the additive merge therefore doesn't receive it, and it reverts to the false default until the next full sync. On an ad hoc visit, a rep for whom the proof is mandatory may temporarily lose that requirement.Comprobante obligatorio se pierde en el merge ad hoc. La flag isProofOfPaymentMandatory existe en el proto de gestión financiera pero no en el de visita ad hoc; el merge aditivo, por lo tanto, no la recibe, y vuelve al default false hasta la próxima sincronización completa. En una visita ad hoc, un representante para quien el comprobante es obligatorio puede quedar temporalmente sin esa exigencia.
  • Data nula no cache volta como "agora". As três datas do agregado são DateTime? no Model e não-nulas na Entity, e o caminho de volta substitui nulo por DateTimeUtils.now(). Uma data faltante no cache aparece como a data de hoje em vez de sinalizar a lacuna — vale trocar por um marcador explícito quando o contrato do backend estabilizar.A null date in the cache comes back as "now". The aggregate's three dates are DateTime? in the Model and non-null in the Entity, and the way back replaces null with DateTimeUtils.now(). A missing cached date shows up as today's date instead of signalling the gap — worth swapping for an explicit marker once the backend contract settles.Una fecha nula en el caché vuelve como "ahora". Las tres fechas del agregado son DateTime? en el Model y no-nulas en la Entity, y el camino de vuelta sustituye nulo por DateTimeUtils.now(). Una fecha faltante en el caché aparece como la fecha de hoy en lugar de señalar la laguna — vale cambiarla por un marcador explícito cuando el contrato del backend se estabilice.
  • Mock de link de pagamento só existe no Chile. Não há arquivo de bancos para os outros mercados, e o carregador devolve lista vazia em silêncio em vez de falhar. Em modo mock, fora do Chile a seleção de banco aparece sem opções e sem explicação.The payment link mock only exists for Chile. There is no bank file for the other markets, and the loader returns an empty list silently instead of failing. In mock mode, outside Chile the bank selection shows no options and no explanation.El mock de link de pago solo existe en Chile. No hay archivo de bancos para los otros mercados, y el cargador devuelve lista vacía en silencio en lugar de fallar. En modo mock, fuera de Chile la selección de banco aparece sin opciones y sin explicación.
  • As duas coleções por varejo são cache-only. GetDebitOpenItemsForAccountUseCase e GetCreditNotesForAccountUseCase têm o formato de coleção por relação da Categoria B do §28 — classe própria, execute({accountSfid}) — mas leem só o cache, sem o fallback remoto que essa categoria permite. Com o cache vazio, o hub mostra estado vazio em vez de tentar buscar.Both per-retail collections are cache-only. GetDebitOpenItemsForAccountUseCase and GetCreditNotesForAccountUseCase have §28 Category B's by-relation collection shape — own class, execute({accountSfid}) — but they read the cache only, without the remote fallback that category allows. With an empty cache the hub shows an empty state instead of trying to fetch.Las dos colecciones por punto de venta son cache-only. GetDebitOpenItemsForAccountUseCase y GetCreditNotesForAccountUseCase tienen el formato de colección por relación de la Categoría B del §28 — clase propia, execute({accountSfid}) — pero leen solo el caché, sin el fallback remoto que esa categoría permite. Con el caché vacío, el hub muestra estado vacío en lugar de intentar buscar.
  • Fallback de parse divergente dos enums irmãos. PaymentLinkStatus.fromString é o único destes enums que não cai em unknown: valor vazio ou desconhecido volta como notApplied — ou seja, um status de link que o app não reconhece é tratado como "sem link" em vez de sinalizar a lacuna. DebitOpenItemStatus, DeliveryStatus, CreditNoteType e PaymentSource todos caem em unknown. O caso unknown do link só é produzido quando o backend envia literalmente a string "unknown".Parse fallback diverges from the sibling enums. PaymentLinkStatus.fromString is the only one of these enums that does not fall back to unknown: an empty or unrecognised value comes back as notApplied — so a link status the app doesn't recognise is treated as "no link" instead of signalling the gap. DebitOpenItemStatus, DeliveryStatus, CreditNoteType and PaymentSource all fall back to unknown. The link's unknown case is only produced when the backend literally sends the string "unknown".Fallback de parseo divergente de los enums hermanos. PaymentLinkStatus.fromString es el único de estos enums que no cae en unknown: un valor vacío o desconocido vuelve como notApplied — es decir, un estado de link que la app no reconoce se trata como "sin link" en lugar de señalar la laguna. DebitOpenItemStatus, DeliveryStatus, CreditNoteType y PaymentSource todos caen en unknown. El caso unknown del link solo se produce cuando el backend envía literalmente la string "unknown".

Onde continuar lendoWhere to read nextDónde seguir leyendo O fluxo de pagamento em si vive em Criação de pagamentos; a transação do comprovante, em 16 · FinancialProofPaymentAPI. O pedido que origina a nota fiscal está em Detalhe do pedido (e a lista, em Lista de pedidos). A cobrança feita no momento da entrega está em Entregas do dia, que reusa o mesmo módulo de criação de pagamento. E o atalho que abre esta tela vive em Detalhe da visita. The payment flow itself lives in Payment creation; the proof transaction, in 16 · FinancialProofPaymentAPI. The order behind the invoice is in Order detail (and the list, in Order list). Collection at delivery time is in Deliveries of the day, which reuses the same payment creation module. And the shortcut that opens this screen lives in Visit detail. El flujo de pago en sí vive en Creación de pagos; la transacción del comprobante, en 16 · FinancialProofPaymentAPI. El pedido que origina la factura está en Detalle del pedido (y la lista, en Lista de pedidos). La cobranza hecha en el momento de la entrega está en Entregas del día, que reutiliza el mismo módulo de creación de pago. Y el atajo que abre esta pantalla vive en Detalle de la visita.