Cronograma de Pagamentos (Crowdfunding)
Pré-requisitos de acesso
- Permissão (módulo):
manageCrowdfunding - Licença/Feature:
CROWDFUNDINGhabilitada na licença do tenant (Vault). - Contêiner do menu: GERAL → grupo Produtos → Crowdfunding (ação na linha da oferta)
O que é / quando usar
O Cronograma de Pagamentos permite planejar os pagamentos previstos de uma oferta de crowdfunding (juros, amortizações, dividendos) e, no momento certo, materializá-los como distribuições agendadas no FinanceManagementService (FMS). É a ponte entre o "prometido ao investidor durante a captação" e a "distribuição executada automaticamente na data".
Use quando a oferta já foi captada e tem token gerado: cada linha do cronograma vira uma distribution_request com scheduled_at, e um scheduler do FMS a executa quando a data chega — pagando quem detém o token na data (não no momento da materialização).
Pré-condições
- Permissão:
manageCrowdfunding(enum CPM + módulo dinâmico no DB). - Licença/Feature:
CROWDFUNDINGhabilitada. - Dependências: a oferta precisa ter
assetId(token/NFT já gerado) para materializar. Sem isso, é possível cadastrar linhas, mas não materializá-las.
Passo a passo
- Na listagem de Crowdfunding, clique no ícone Cronograma de pagamentos da oferta.
- Use Adicionar linha para cada pagamento previsto.
- Preencha data prevista, tipo (ABSOLUTE/PERCENTAGE), valor e, se ABSOLUTE, a moeda/token.
- Salve cada linha individualmente (Salvar linha).
- Quando quiser efetivar, use Materializar — confirme no diálogo. As linhas pendentes viram distribuições agendadas no FMS.
Campos (por linha)
| Campo | O que é | Obrigatório? | Efeito no sistema/backend |
|---|---|---|---|
Ordem (order_index) | Posição da linha na sequência | Sim (automático) | Calculado como max(order_index)+1; define a ordem de execução. |
Data prevista (expected_date) | Quando o pagamento deve ocorrer | Sim | Vira scheduled_at da distribution_request. O scheduler do FMS (*/5 * * * *) busca requests SCHEDULED com scheduled_at <= NOW() e executa. |
Tipo (type) | ABSOLUTE (valor fixo) ou PERCENTAGE (% sobre o total) | Sim | Default PERCENTAGE. Determina como o FMS calcula o total a distribuir. |
Valor (amount) | Montante (ABSOLUTE) ou percentual (PERCENTAGE) | Sim | Deve ser > 0. Para PERCENTAGE, ≤ 100. Não precisa somar 100% entre as linhas — a consistência é responsabilidade do operador. |
Moeda/token (currency) | Token a distribuir | Condicional | Obrigatório só para ABSOLUTE. Para PERCENTAGE, o token é informado na materialização. |
Descrição (description) | Texto livre | Não | Identifica o pagamento (ex.: "1ª parcela de juros"). |
Ações e modais
- Adicionar / Salvar linha: cria/atualiza a linha. Linha inválida (sem data, valor ≤ 0, percentual > 100, ABSOLUTE sem moeda) é recusada com mensagem.
- Remover linha: exclui a linha. Linhas já materializadas não podem ser removidas.
- Materializar: abre confirmação (
window.confirm). Se houver linha PERCENTAGE pendente, é obrigatório informar o token a distribuir (percentageTokenToDistribute). Ao confirmar, o CrowdfundingService chama o FMS via fin-lib, criando as distribuições agendadas. O resultado informa quantas foram materializadas e quantas ignoradas (já materializadas).
Regras de negócio / cuidados
Atenção
- PERCENTAGE calcula o total na execução:
total_to_distribute = supply × %, varrendo os holders na data. ABSOLUTE usa o valor fixo + token informado. - Holders são calculados na execução, não na materialização — quem detém o token na data do pagamento recebe. Isso preserva transferências secundárias entre a captação e o pagamento.
- Só é possível materializar se a oferta tiver
assetIde todas as linhas pendentes estiverem salvas (comid).
Irreversível
- Materializar cria distribuições agendadas no FMS. Cada linha materializada vira read-only individualmente; a tabela como um todo continua editável (pode-se adicionar novas linhas depois), mas a linha já materializada não volta atrás.
- Idempotência: a
distribution_requesté idempotente pela chave(source = 'CROWDFUNDING_SCHEDULE', source_reference_id = schedule_entry_id). Reexecuções são seguras. Ao executar a distribuição via FinLib, o errorCodeE00021"already processed" é tratado como SUCESSO, não erro. - Valores financeiros: tratados como BigNumber — sem arredondamento.
Exemplos
Cenário 1 — Três parcelas de juros em percentual
- Adicione 3 linhas PERCENTAGE: 30/06 → 2%, 30/09 → 2%, 30/12 → 2% (descrições "Juros T2/T3/T4").
- Salve cada linha.
- Clique Materializar, informe o token de pagamento (ex.: tBRL) e confirme.
- O FMS cria 3 distribuições
SCHEDULED. Na data de cada uma, o scheduler calculasupply × 2%e paga os holders vigentes.
Cenário 2 — Amortização final em valor absoluto
- Adicione 1 linha ABSOLUTE com data 31/12, valor R$ 500.000 e moeda tBRL.
- Salve e materialize.
- Na data, o FMS distribui exatamente R$ 500.000 em tBRL, rateando entre os holders.
Cenário 3 — Adicionar pagamento extra após materializar
- Uma oferta já tem linhas materializadas (read-only).
- Adicione uma nova linha (a tabela continua editável), salve e materialize de novo.
- As linhas antigas aparecem como ignoradas (idempotência); só a nova é materializada.