Skip to content

Feat/planos limites - #43

Merged
sousa7tz merged 6 commits into
mainfrom
feat/planos-limites
Oct 17, 2026
Merged

sousa7tz merged 6 commits into
mainfrom
feat/planos-limites

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
- src/Support/Plan.php: classe nova com os planos, os limites de cada um e a pergunta cabe mais um

- src/Controllers/MerchantController.php: confere o limite antes de cadastrar cliente, criar premio ou reativar um

- src/Models/MerchantModel.php: findById traz o plano da loja

- src/Models/RewardModel.php: countActiveByMerchant conta os premios ativos

- views/partials/flash.php: mensagens limite_clientes e limite_premios com os numeros vindos do Plan

- tests/Unit/PlanTest.php: testes dos limites e do plano desconhecido valendo como Free

- tests/Feature/PlanLimitsTest.php: testes de tela (100 clientes, 3 premios ativos, Pro sem limite, loja acima do limite)

- docs/db/schema-explanation.md: coluna plan passa a ter uso documentado

- CLAUDE.md: regra dos planos e onde ela mora
- src/Controllers/MerchantController.php: planUsage calcula quanto do plano a loja usou e entrega ao perfil e a tela de premios

- views/partials/plan-usage.php: cartao Plano com o uso de clientes e de premios ativos, com barra e aviso no limite

- views/merchant/profile.php: mostra o cartao Plano no topo do perfil

- views/merchant/rewards.php: avisa quantos premios ativos cabem antes do formulario de novo premio

- public/css/app.css: estilos do cartao Plano

- tests/Feature/PlanUsageScreenTest.php: testes das telas (Free, no limite, acima do limite, Pro sem limite)
- src/Models/MerchantModel.php: lista do admin traz o plano e setPlan grava (so plano que existe)

- src/Controllers/AdminController.php: acao plan na lista de lojas

- views/admin/dashboard.php: coluna Plano com o seletor Free ou Pro em cada loja

- views/partials/flash.php: mensagem plano_alterado

- public/css/app.css: estilo do seletor de plano na tabela

- tests/Feature/AdminPlanTest.php: testes da troca (efeito no limite, plano invalido, so admin troca, sem csrf)

- docs/operacao.md: explica os planos e a troca pelo admin

- CLAUDE.md: onde o lojista ve o plano e quem pode trocar
@andynnnfw andynnnfw self-assigned this Oct 9, 2026
@sousa7tz

sousa7tz commented Oct 9, 2026

Copy link
Copy Markdown
Collaborator

Revisão da task 32 (planos Free e Pro).

Atenção: este PR está empilhado sobre o #42. Ele traz os 3 commits da validade de pontos, mas a base é a main. Mergeie o #42 primeiro, ou troque a base deste PR para feat/validade-pontos. Assim o diff mostra só o que é de planos.

O código está limpo:

  • a regra fica toda no Plan, e um plano desconhecido vale como Free;
  • cliente e prêmio que já existem nunca são bloqueados;
  • desativar prêmio sempre pode, só reativar conta no limite;
  • o plano só muda pelo admin, e o lojista não consegue mandar o campo plan;
  • a contagem ignora clientes anonimizados (mesmo critério da lista do admin);
  • as mensagens de flash leem os números do Plan.

Antes do merge

  1. composer analyse falha nesta branch. São os "might not be defined" de $planUsage (em views/merchant/rewards.php e views/partials/plan-usage.php) e o ignore.count do views/admin/dashboard.php, onde agora o $paginator aparece 4 vezes contra as 3 da baseline. A correção é rodar composer analyse -- --generate-baseline e commitar a baseline. O CI não roda o PHPStan, por isso passou.
  2. Números dos limites. O "Pronto quando" da task diz que ela depende de decisão de negócio. Os valores do Free (100 clientes e 3 prêmios ativos) foram definidos neste PR: falta o time confirmar se são esses.

Menores

  1. O limite é conferido contando antes de inserir, então duas abas cadastrando ao mesmo tempo podem passar o limite em 1. O comentário no código já assume isso; só registrando.
  2. A task também cita pagamento. Como hoje o upgrade é "peça ao suporte", a 32 não fecha como Feito só com este PR: ou o pagamento vira uma task nova, ou o time ajusta o escopo.
  3. Descrição vazia e título fora do padrão. Sugestão: feat(planos): limites do plano Free e troca de plano pelo admin, com a task 32 citada no corpo.

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

@sousa7tz
sousa7tz merged commit eb98c33 into main Oct 17, 2026
3 checks passed
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