Pagamentos & Checkout
DeepSeek R1
Cálculo de Parcelamento sem Juros para E-commerce Brasileiro (até 12x)
Módulo TypeScript que calcula parcelas no padrão brasileiro: mínimo por parcela, arredondamento correto na última e simulação exibível no checkout.
0cópias
0joinhas
0favoritos
O prompt
Crie um módulo TypeScript puro (sem dependências) para cálculo de parcelamento em e-commerce brasileiro.
Parâmetros:
- Moeda: BRL
- Parcelas Máximas: {{max_parcelas}} (ex.: 12)
- Valor Mínimo por Parcela: {{minimo_parcela}} centavos (ex.: 3000 = R$ 30,00)
Requisitos:
1. Função calculateInstallments(totalCents, maxN): retorna o array de opções válidas [{ n, installmentCents }] para n=1..{{max_parcelas}} onde installmentCents >= {{minimo_parcela}}; sem juros (divisão exata do total).
2. Arredondamento correto: as parcelas devem ser iguais entre si e somar exatamente o total — a diferença do piso vai para a última parcela (ex.: R$ 100,00 em 3x = 3334 + 3333 + 3333 centavos). Documente essa regra no JSDoc.
3. Função formatInstallmentOption(option): '3x de R$ 33,34 sem juros' (com a última parcela diferente quando aplicável: '3x de R$ 33,34 (última R$ 33,33)') — números em pt-BR.
4. Validação defensiva: totalCents > 0 inteiro, maxN entre 1 e {{max_parcelas}}, mínimo por parcela coerente; erros com mensagens claras (nunca NaN vazar para o front).
5. Testes unitários (vitest ou node:test) cobrindo: divisão exata, caso com resto (3x de R$ 100), total abaixo do mínimo em todas as parcelas (retorna só 1x), e formatação pt-BR.
6. Exporte também canInstall(totalCents): boolean para o checkout habilitar/desabilitar o seletor de parcelas.
Como usar
- Substitua {{max_parcelas}} (ex.: 12) e {{minimo_parcela}} em centavos (ex.: 3000).
- Cole no DeepSeek/Cursor — módulo + testes saem juntos; rode npm test para ver os casos de arredondamento passando.
- No checkout, chame calculateInstallments(totalCents) e renderize as opções com formatInstallmentOption() — o seletor só aparece quando canInstall() é true.
- Se um dia precisar de juros (parcelado com IOF), a estrutura já separa: adicione uma função calculateWithInterest() usando a mesma formatação.
Exemplo de saída
installments.ts (~120 linhas) + testes: calculateInstallments retornando opções válidas respeitando o mínimo por parcela, regra documentada de diferença no piso ir para a última parcela (3x de R$ 100 → 3334/3333/3333), formatInstallmentOption em pt-BR com menção à última diferente quando aplicável, validação defensiva sem NaN e canInstall() para habilitar o seletor no checkout.