A faturação é um extrato mensal por sensor (medidor). Compras e vendas de energia são registadas off-chain e on-chain sem transferência de EUR no momento do trade (modelo book-only). O extrato pode ser emitido como PDF de fatura: dados do sensor, empresa titular, usina, resumo financeiro, histórico mês a mês, QR de validação pública, prova on-chain e QR MB WAY apenas para demonstração.

Modelo de produto

Utilizador (GESTOR / sensor_admin)

  • Menu Faturação (GET /billing via Gateway)
  • Vê apenas medidores atribuídos
  • Um bloco por sensor: linhas de compra/venda, totais do mês, estado OPEN ou CLOSED
  • Botão para descarregar o PDF da fatura do período

Administrador (ADMIN)

  • Auditoria de faturação (GET /admin/billing/statements)
  • Download do PDF de qualquer sensor
  • Exportação CSV do período

PDF da fatura

O Market gera o PDF a partir do SensorStatement. Statements CLOSED produzem um PDF estável (mesmos totais do snapshot). Statements OPEN avisam que os valores ainda podem alterar. Conteúdo mínimo:
O QR MB WAY é só demonstração. Não existe integração com PSP nem liquidação bancária real.

Validação pública

Qualquer pessoa com o QR (ou o link) pode abrir a página pública sem autenticação:
  • Integridade do documento (hash SHA-256)
  • Estado da fatura e totais
  • Prova on-chain (tx_hash + explorer) quando o registo já ocorreu
  • Preview / download do PDF
Rotas:

Fecho mensal e registo on-chain

No 1.º dia de cada mês (00:05 UTC), o Market fecha o extrato do mês anterior:
  1. Estado passa a CLOSED (snapshot imutável em MongoDB)
  2. Calcula o hash estável do documento
  3. Dispara o registo no contrato InvoiceRegistry via Transactions Service
O contrato associa sensorId (slug / device_id) + ano/mês ao hash, ao invoice_id e à carteira já registada no SensorRegistry. O sensor tem de existir e estar activo on-chain. Contrato na Besu develop: 0xA316dFc175C9B5f2A964671f5F503BeF9EFb3189
Explorer: InvoiceRegistry

APIs envolvidas

On-chain (book-only + fatura)

  • EnergySettlement.settle() — registo auditável sem movimento EUR
  • EnergyMarket.bookPurchase() — marca oferta como vendida sem transferFrom
  • InvoiceRegistry.registerInvoice() — prova pública do hash da fatura
  • Ver Contratos book-only

Issues de referência

  • Market #75 — épico PDF + hash + orquestração no fecho
  • Meters #62 — Company / Plant e vínculo ao sensor
  • Gateway #100 — proxy PDF e validação pública
  • Contracts #10 — InvoiceRegistry
  • Transactions #55 — submissão da tx
  • Frontend #65 — download e página /v/{token}
  • Docs #16 — esta página