Skip to content

Feat/validade pontos - #42

Open
andynnnfw wants to merge 3 commits into
mainfrom
feat/validade-pontos
Open

andynnnfw wants to merge 3 commits into
mainfrom
feat/validade-pontos

Conversation

@andynnnfw

Copy link
Copy Markdown
Contributor

No description provided.

- database/migrations/011_validade_pontos.sql: coluna points_expiry_months (padrao 12 meses) e tipo expire no points_log

- database/schema.sql: mesma mudanca no estado final e registro da 011 em schema_migrations

- docs/db/schema-explanation.md: documenta o prazo, o calculo do vencimento e o tipo expire

- src/Models/MerchantModel.php: findById traz o prazo e updatePointsExpiry grava

- src/Controllers/MerchantController.php: lista de prazos aceitos e acao de salvar a validade

- views/merchant/points-rule.php: card Validade dos pontos com o select de prazo

- views/partials/flash.php: mensagens validade_invalida e validade_salva, e o campo que o erro aponta

- tests/Feature/PointsExpiryConfigTest.php: testes do padrao de 12 meses, troca, desligar, valor invalido e isolamento entre lojas
- src/Models/LoyaltyCardModel.php: metodos expire, expireIdle e countExpirable, com trava do cartao e registro expire na mesma transacao

- bin/expire-points.php: script da rotina, com --dry-run que so mostra o que venceria

- src/Support/helpers.php: tipo expire aparece como Venceu no extrato e nos relatorios

- public/css/app.css: selo badge-expire com as cores de erro da paleta

- docs/operacao.md: secao Vencimento dos pontos com o comando e como agendar

- CLAUDE.md: comando novo e a regra de validade no modelo de dados

- tests/Integration/PointsExpiryTest.php: testes da rotina (prazo por loja, renovacao, loja inativa, lotes, sem vencer em dobro)

- tests/Unit/HelpersTest.php: teste do rotulo e selo do vencimento
- src/Models/LoyaltyCardModel.php: findByMerchantAndPhone devolve expires_at (ultima movimentacao mais o prazo da loja)

- src/Support/helpers.php: funcao format_date para mostrar so o dia

- views/partials/points-expiry.php: linha com a validade do saldo, ou aviso de vencido

- views/customer/balance.php: consulta publica mostra ate quando os pontos valem

- views/merchant/customer.php: tela do cliente no painel mostra a mesma data

- public/css/components.css: classe points-expiry

- CLAUDE.md: documenta o format_date e de onde vem a data de vencimento

- tests/Feature/PointsExpiryScreenTest.php: testes das duas telas (prazo da loja, sem data, vencido, isolamento entre lojas)

- tests/Unit/HelpersTest.php: teste do format_date
@andynnnfw andynnnfw self-assigned this Oct 9, 2026
@sousa7tz

sousa7tz commented Oct 9, 2026

Copy link
Copy Markdown
Collaborator

Revisão da task 31 (validade dos pontos).

A base está boa: o expire() trava o cartão com FOR UPDATE e confere a regra de novo antes de vencer, processa um cartão por transação, tem --dry-run, e rodar de novo não vence nada em dobro. Migration, schema.sql, schema_migrations, flash, operacao.md e testes vieram juntos. Calcular o vencimento em vez de gravar em expiration_date foi uma boa escolha.

Antes do merge

  1. Saldo vencido continua valendo até o cron rodar. Depois que expires_at passa, a tela já mostra "Pontos vencidos em…", mas:

    • o resgate continua liberado;
    • um lançamento novo atualiza last_use_at e o saldo vencido volta a valer.

    Sugestão: em addPoints e redeem, vencer o saldo (mesma regra do EXPIRABLE) dentro da transação, antes de mexer no saldo. Se preferir algo mais simples, pelo menos bloquear o resgate quando a data já passou. Vale um teste de fluxo para cada caso.

  2. composer analyse falha nesta branch. São os "might not be defined" de $expiryMonths e $expiryOptions em views/merchant/points-rule.php, que chegam pelo extract(). Como o CLAUDE.md pede, basta rodar composer analyse -- --generate-baseline e commitar o phpstan-baseline.neon. O CI não roda o PHPStan, por isso passou verde.

Menores

  1. Loja inativa fica fora do vencimento, mas o prazo continua correndo. Quando o admin reativa a loja, todos os saldos antigos vencem na primeira execução. Se não for o comportamento desejado, uma opção é não contar o tempo em que a loja ficou inativa. Se for, vale registrar no operacao.md.
  2. CLAUDE.md, seção Modelo de dados: a frase "toda mudança de saldo passa por addPoints / redeem / reverse" agora precisa incluir o expire.
  3. Descrição do PR vazia e título fora do padrão. Sugestão: feat(pontos): validade dos pontos por loja, com a task 31 citada no corpo.

No Notion, a task 31 está como Em revisão com este PR, e o responsável é você.

@sousa7tz sousa7tz mentioned this pull request Oct 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants