Skip to content

feat(balcao): customers so telefone, cnpj alfanumerico, estorno de resgate e correcao do cartao (tasks 49, 57, 44, 43) - #35

Merged
andynnnfw merged 19 commits into
feat/seguranca-loginfrom
feat/balcao-cadastro
Oct 9, 2026
Merged

andynnnfw merged 19 commits into
feat/seguranca-loginfrom
feat/balcao-cadastro

Conversation

@sousa7tz

@sousa7tz sousa7tz commented Oct 7, 2026

Copy link
Copy Markdown
Collaborator

PR empilhado 2 de 6. Base: #34. Faça o merge na ordem; ao mergear o anterior, o GitHub muda a base deste para a main.

Tasks

  • 49: a migration 007_customers_so_telefone remove cpf, email, birth_date e gender de customers. O cliente passa a ser só o telefone.
  • 57: CNPJ alfanumérico. O dígito verificador segue a regra nova da Receita (ASCII menos 48); o exemplo oficial 12.ABC.345/01DE-35 confere. Também: máscara com letras, format_document e ADR 001 atualizados. Sem migration.
  • 44: estorno de resgate, feito pelo extrato (24 h, uma vez):
    • os pontos voltam ao saldo e o total acumulado não muda;
    • os relatórios deixam de contar o resgate desfeito.
  • 43: na tela do cliente, corrigir o nome e trocar o telefone (rename / changePhone):
    • só muda o cartão desta loja;
    • telefone que já tem cartão nesta loja é recusado;
    • o número antigo some quando não sobra cartão dele.

Pontos de atenção

  • Migration 007 tem DROP COLUMN. Rode php bin/migrate.php no banco local.
  • 43: telefone novo que já é de cliente de outra loja reaproveita o registro de customers sem revelar nada (LGPD, ADR 002).
  • 43: trocar telefone não pede checkbox de confirmação, porque já é preciso digitar o número novo.
  • 44: estorno de resgate só pelo extrato (sem Desfazer na tela do cliente) e sem checagem de saldo.

Como testar

  • composer test -- --filter "CustomerModelTest|DocumentValidator|HelpersTest|Reversal|CardCorrection" e node tests/js/masks.test.js
  • No navegador:
    • cadastro com 12.abc.345/01de-35
    • estornar um resgate em ?url=merchant/statement
    • "Corrigir nome ou trocar telefone" na tela do cliente

🤖 Generated with Claude Code

sousa7tz and others added 15 commits October 6, 2026 16:28
Migration 007 remove cpf, email, birth_date e gender (e os indices):
o cliente e so o telefone.

Task 49.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Digito verificador pela regra nova da Receita (codigo ascii - 48), cnpj
numerico continua valendo, mascara com letras, perfil formatado e ADR 001.

Task 57.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Os pontos voltam ao saldo com um reversal no points_log, o total acumulado
nao muda e os relatorios deixam de contar o resgate desfeito.

Task 44.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
So o cartao desta loja muda (saldo, historico e consentimento vao junto);
telefone que ja tem cartao nesta loja e recusado.

Task 43.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… erro marcado

- style="" das views vira classe (a barra de progresso usa passos de 5%)
- src/ts/forms.ts: botao mostra carregando e o formulario nao e enviado
  duas vezes; o campo apontado pelo erro fica marcado, com aria-invalid e foco
- foco do teclado sempre visivel

Task 18.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- scripts inline viram src/ts/nav.ts e src/ts/customer.ts (compilados em public/js)
- onsubmit/onclick viram data-confirm (forms.js) e data-print (nav.js)
- RequestGuard manda CSP com default-src 'self' e, em https, Strict-Transport-Security

Task 48.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- indicadores e historico por periodo (hoje, 7 dias, mes, intervalo); o saldo
  em circulacao continua o atual
- merchant/export baixa o historico do periodo ou a lista de clientes em csv
  (; + BOM, protegido contra injecao de formula), so desta loja

Task 59.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
?url=health responde ok/erro em json antes do session_start. O healthcheck
do Docker e o monitor externo ficam para a parte de infraestrutura.

Task 56 (parte de codigo).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A baseline guarda so os "might not be defined" das views (variaveis do
extract). CI, composer audit no workflow e Dependabot ficam pendentes.

Task 51 (parte de codigo).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…padrao

MAIL_DRIVER vazio nao manda nada e avisa no log (sem o conteudo); "log"
grava o e-mail em MAIL_LOG_FILE para dev e testes. Provedor, SPF e DKIM
ficam para a escolha do time.

Task 55 (parte de codigo).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Token aleatorio de uso unico, valido por 1 hora e guardado so como hash
(migration 008). O pedido responde igual exista o e-mail ou nao e tem
limite por ip e por e-mail; trocar a senha derruba as sessoes abertas.

Task 21.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Cadastro manda um link (24 h, uso unico, so o hash no banco); enquanto nao
confirma, o lojista entra mas so ve a tela de confirmar, com reenvio.
Contas existentes contam como confirmadas (migration 009). Os links por
e-mail passam a herdar de MerchantTokenModel.

Task 50.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
handleForgot/handleReset tinham retorno never e o render ainda fazia
return depois: codigo novo nao entra na baseline.

Task 21.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Tabela admins (migration 010), conta criada por bin/create-admin.php,
sessao separada da do lojista. O admin ve as lojas (sem dados dos
clientes) e ativa ou desativa um lojista, que perde o acesso na hora.

Task 30.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ADR 003 em status "proposta": tabela users com papel dono/atendente,
permissoes por rota, autor de cada movimentacao no points_log e
perguntas em aberto para o time. Sem codigo.

Task 58.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
feat(admin): painel administrativo e adr de atendentes (tasks 30, 58)
feat(conta): e-mail transacional, esqueci a senha e confirmacao do e-mail (tasks 55, 21, 50)
chore(qualidade): rota de saude e phpstan nivel 5 (tasks 56, 51)
feat(seguranca): acessibilidade, csp completa e relatorios por periodo com csv (tasks 18, 48, 59)

@andynnnfw andynnnfw left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@andynnnfw
andynnnfw merged commit 00206ce into feat/seguranca-login Oct 9, 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