# Simulador de desconto, juros e multa

> Ajuste a modalidade, valor, vencimento, desconto, juros e multa para
> visualizar — dia a dia — quanto o cliente paga ao longo do ciclo de uma
> cobrança Pix com vencimento (`OVERDUE` / COBV). Os cálculos são feitos
> **localmente no seu navegador** — nenhuma chamada à API é executada e
> nenhuma cobrança é criada.

## Modalidades de desconto

A Woovi expõe seis modalidades, alinhadas ao padrão BACEN COBV:

1. **`FIXED_VALUE_UNTIL_SPECIFIED_DATE`** — desconto em centavos válido
   até uma data específica. Aceita múltiplas faixas (ex.: R$1,00 até 5
   dias antes; R$0,50 até 10 dias antes).
2. **`PERCENTAGE_UNTIL_SPECIFIED_DATE`** — mesma ideia em percentual
   (basis points).
3. **`VALUE_PER_RUNNING_DAY_ADVANCE`** — centavos por dia corrido de
   antecedência ao vencimento.
4. **`VALUE_PER_BUSINESS_DAY_ADVANCE`** — centavos por dia útil
   (pula fins de semana e feriados bancários BR).
5. **`PERCENTAGE_PER_RUNNING_DAY_ADVANCE`** — basis points por dia
   corrido de antecedência.
6. **`PERCENTAGE_PER_BUSINESS_DAY_ADVANCE`** — basis points por dia
   útil de antecedência.

## Como funcionam os cálculos

- **Desconto** (`discountSettings`): aplicado **apenas antes do
  vencimento** (`dayIndex < daysForDueDate`). No dia do vencimento e
  depois o desconto é zero.
- **Juros** (`interests.value`): basis points por **dia corrido**,
  somente após o vencimento. Ex: `100` = 1,00% ao dia.
- **Multa** (`fines.value`): aplicada **uma única vez** após o
  vencimento. `type: 'FIXED'` em centavos; `type: 'PERCENTAGE'` em
  basis points sobre o valor principal.
- **`daysAfterDueDate`**: define a janela de simulação após o
  vencimento. Não confundir com regras de expiração — após esse limite
  a tela apenas para de gerar linhas.

## Convenção de unidades

Para evitar problemas de ponto flutuante, a Woovi (e o BACEN) usam dois
inteiros:

- **Centavos** — `R$1,00 = 100`. Vale para `chargeValue`, `value` das
  modalidades 3/4, entradas de `discountFixedDate` da modalidade 1 e
  multas com `type: 'FIXED'`.
- **Basis points** — `1,00% = 100`. Vale para `value` das modalidades
  5/6, entradas da modalidade 2, `interests.value` e multas com
  `type: 'PERCENTAGE'`.

A tela mostra um *preview* legível ao lado de cada campo (`R$X,XX` ou
`X,XX%`) para que você não precise fazer a conta na cabeça.

## Exportar para a API

- **Copiar JSON** devolve o envelope `{ modality, modalityNumber, input,
  rows }` — mesmo formato emitido pela flag `--out` do script
  `simulateChargeDiscount.ts` no monorepo Woovi.
- **Copiar como cURL** monta um `POST /api/v1/charge` pronto para
  rodar. Substitua `<APP_ID>` pelo seu AppID e `<CORRELATION_ID>` por
  um identificador único antes de executar.

## Modo `daily` × `summary`

Por padrão, a linha do tempo mostra uma linha por dia (`daily`). Ative o
toggle **Modo summary** para ver apenas marcos relevantes: dia de
criação, dias em que o desconto muda de faixa, dia do vencimento,
primeira diária pós-vencimento e o último dia simulado.

Veja também [Como criar uma cobv usando a API](./how-to-create-cobv-using-api.mdx).
