Contas a receber (Vendas)

Objetivo

Lista todos os pagamentos/parcelas vinculados a vendas criadas dentro de um período, com detalhes de vencimento, liquidação, situação, modalidade/bandeira de pagamento, plano de contas e composição de valores (juros, taxas e descontos). É um relatório analítico, uma linha por parcela, ordenado pela data da venda e vencimento.

Diferente do relatório de liquidação, aqui o período filtra pela data da venda (criação da comanda), não pela data de liquidação — e o pagamento aparece independentemente de estar liquidado ou não.

Tabelas envolvidas

Todas no schema do datalake (ex.: frq8798):

TabelaPapel
paymentsBase do relatório. Cada linha é um pagamento/parcela. Já traz desnormalizados: situação, modalidade, bandeira, plano de contas e cliente.
ordersVenda vinculada ao pagamento. Fonte da data e valor da venda e do vendedor (seller_id / seller_name).
customersFonte do celular do cliente (cellphone), via customer_id. O nome já está desnormalizado.

Junções:

from payments p
join orders o
  on o.order_id = p.order_id
 and o."schema" = p."schema"
left join customers c
  on c.customer_id = o.customer_id
 and c."schema" = o."schema"

⚠️ Todo join deve incluir a coluna "schema" além do id, para não cruzar dados entre franquias.

Escopo multi-franquia

O datalake enxerga todas as franquias. Não há filtro obrigatório; para restringir a uma franquia, usar "schema" (ou franchisor_id para agrupamentos por franqueador).

Filtros (regras de negócio)

Filtros fixos (sempre aplicados)

RegraImplementação no Redshift
Período da vendao.created_at between :startDate and :endDate (obrigatório)
Somente pagamentos vinculados a vendap.order_id is not null (na prática, garantido pelo inner join com orders)

Registros deletados não existem no datalake (o ETL não mantém soft deletes), então não há filtro de exclusão a aplicar.

Filtros parametrizáveis (opcionais)

Padrão "se o parâmetro for nulo, não filtra":

ParâmetroCondição
Vendedor(a)o.seller_id = :seller
Modalidade de pagamentop.payment_type_id = :paymentTypeId
Bandeira/tipo de pagamentop.payment_brand_id = :paymentBrand
Situação do pagamento (multi-seleção)p.payment_status_id in (:status)

Os ids de situação, modalidade e bandeira no datalake são os mesmos do catálogo de origem.

Regras de cálculo

MétricaFórmula
Valor originalcoalesce(p.value, 0)
Valor finalcoalesce(p.value, 0) + coalesce(p.interest_value, 0) - coalesce(p.fee_value, 0) - coalesce(p.discount_value, 0)

Ou seja: valor final = valor da parcela + juros − taxas − descontos.

Não há agregação — listagem simples, uma linha por parcela.

Colunas do relatório → Datalake

Coluna do relatórioOrigem no RedshiftObservação
Data vendao.created_at
Vendao.order_idId da venda no sistema de origem
Valor da vendao.total_priceRepete para cada parcela da mesma venda — não somar diretamente
Clientep.customer_nameJá desnormalizado no pagamento
Celularc.cellphoneVia join com customers
Vendedor(a)o.seller_nameVendedor da venda, não o employee_id do pagamento
Tipo de pagamentop.payment_brand_nameO relatório exibe a bandeira nessa coluna (pode ser nulo)
Plano de contasp.chart_account_nameSomente o nome (o código não é necessário)
Valorp.value
Parcelap.installment
Vencimentop.due_date
Liquidaçãop.liquidation_dateNulo se ainda não liquidado
Situaçãop.payment_status_name
Taxascoalesce(p.fee_value, 0)
Juroscoalesce(p.interest_value, 0)
Descontocoalesce(p.discount_value, 0)
Valor originalcoalesce(p.value, 0)
Valor finalVer regras de cálculo

Ordenação padrão: o.created_at, p.due_date.

Totalizadores (rodapé do relatório)

TotalizadorCálculo
Totalsum(p.value)