Skip to content

feat: separate credit card issuer and network branding - #9

Merged
Senavictors merged 2 commits into
mainfrom
codex/phase-34-card-issuer-network-branding
Apr 20, 2026
Merged

feat: separate credit card issuer and network branding#9
Senavictors merged 2 commits into
mainfrom
codex/phase-34-card-issuer-network-branding

Conversation

@Senavictors

Copy link
Copy Markdown
Owner

Resumo

Esta PR implementa a Phase 34, corrigindo a modelagem e a UX de cartões de crédito ao separar banco emissor e bandeira no cadastro da conta, além de aplicar identidade visual por banco nas telas de fatura.

Com isso, cenários como "Itaú Mastercard" ou "Nubank Visa" passam a ser tratados corretamente, sem conflitar emissor e bandeira no mesmo campo visual.

O que foi feito

  • Adicionada a coluna opcional network_brand_key em accounts
  • Mantido Account.icon como banco emissor para preservar compatibilidade com o código e os dados já existentes
  • Atualizados os schemas Zod e os endpoints de contas para aceitar/devolver networkBrandKey
  • Ajustado o fluxo de contas para limpar networkBrandKey automaticamente quando a conta deixa de ser CREDIT_CARD
  • Refatorado o modal de contas para separar o cadastro de cartão em:
    • Banco emissor
    • Bandeira
  • Melhorado o modal de conta com:
    • campos de emissor e bandeira empilhados verticalmente
    • scroll interno para caber corretamente mesmo com zoom 100%
  • Atualizado o card de conta para exibir emissor e bandeira quando a conta for cartão
  • Criado BrandChip para exibir identidades secundárias de forma consistente
  • Criado credit-card-theme.ts para centralizar as paletas por banco emissor
  • Aplicado tema por banco emissor em /credit-cards nos cards individuais de cartão
  • Mantidos os cards agregados do topo de /credit-cards com o tema neutro do sistema
  • Aplicado tema por banco emissor em todos os cards principais de /credit-cards/[id]:
    • Status
    • Total
    • Pago
    • Em aberto
    • Resumo da Fatura
    • Pagamento da Fatura
    • Movimentações da Fatura
  • Atualizados seed e reset-demo para gerar cartão demo com nubank + mastercard
  • Atualizada a documentação da phase em:
    • README.md
    • .docs/CONTEXT.md
    • .docs/CHANGELOG.md
    • .docs/tasks/phase-34-credit-card-issuer-network-and-brand-themed-statements.md

Arquivos principais

  • prisma/schema.prisma
  • prisma/migrations/20260420220000_add_account_network_brand_key/migration.sql
  • src/server/modules/finance/http/schemas.ts
  • src/app/api/accounts/route.ts
  • src/app/api/accounts/[id]/route.ts
  • src/app/(app)/accounts/account-form.tsx
  • src/app/(app)/accounts/account-card.tsx
  • src/app/(app)/credit-cards/page.tsx
  • src/app/(app)/credit-cards/[id]/page.tsx
  • src/lib/brands/brand-chip.tsx
  • src/lib/brands/credit-card-theme.ts

Compatibilidade / Migração

  • Account.icon continua existindo e agora representa explicitamente o banco emissor
  • networkBrandKey é opcional, então cartões antigos continuam funcionando sem backfill obrigatório
  • Esta PR inclui migration de banco:
    • 20260420220000_add_account_network_brand_key

Testes executados

  • npx prisma generate
  • npm run format
  • npm run format:check
  • npm test
  • npm run lint
  • npm run build

Observações

  • A validação visual manual em browser continua recomendada para revisar contraste fino dos cards tematizados em light e dark
  • O mapa de cores por banco ficou centralizado e pode ser expandido facilmente se novos emissores forem priorizados

@vercel

vercel Bot commented Apr 20, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
finance-controller Ready Ready Preview, Comment Apr 20, 2026 11:29pm

@Senavictors
Senavictors merged commit cd6ac1d into main Apr 20, 2026
2 of 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.

1 participant