尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Prism - Mais Vidas Verticais
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
Sistema financeiro da Brave Educação para importação de extratos OFX, classificação de lançamentos e geração de DRE por unidade/mês. Desenvolvido em Next.js 14 + Prisma + PostgreSQL (Neon), hospedado na Vercel com deploy automático via GitHub. • Next.js 14 (App Router, full-stack — páginas e APIs no mesmo projeto) • Prisma ORM + PostgreSQL (Neon free tier, sa-east-1) • Recharts para gráficos • TypeScript strict • Vercel para deploy (build: prisma generate && prisma db push && next build)查看完整 README ↗
Sistema financeiro da Brave Educação para importação de extratos OFX, classificação de lançamentos e geração de DRE por unidade/mês. Desenvolvido em Next.js 14 + Prisma + PostgreSQL (Neon), hospedado na Vercel com deploy automático via GitHub.
sa-east-1)prisma generate && prisma db push && next build)DATABASE_URL= # Neon connection pooling URL
DIRECT_URL= # Neon direct URL (para migrations)
ANTHROPIC_API_KEY= # Claude API (assistente IA na página AI)
financeiro/
├── prisma/
│ └── schema.prisma # Modelos do banco
├── src/
│ ├── app/
│ │ ├── layout.tsx # Title: "Prism DRE System", favicon losango amarelo
│ │ ├── page.tsx # Redirect para /dashboard
│ │ ├── dashboard/ # Visão geral com métricas e gráfico DRE
│ │ ├── dre/ # DRE detalhada por mês/unidade
│ │ ├── lancamentos/ # Importação OFX + classificação (página principal)
│ │ ├── plano-de-contas/ # CRUD do plano de contas
│ │ ├── saldo/ # Evolução do saldo bancário
│ │ ├── unidades/ # Cadastro de unidades e contas bancárias
│ │ └── api/
│ │ ├── accounts/ # CRUD contas do plano (GET, POST, PUT, DELETE)
│ │ ├── classify/
│ │ │ └── suggest/ # POST — sugestões do classificador inteligente
│ │ ├── dre/ # GET — cálculo DRE agregado
│ │ ├── ofx/
│ │ │ ├── route.ts # POST — salva lançamentos OFX em lote
│ │ │ └── parse/ # POST — parseia arquivo OFX (preview)
│ │ ├── saldo/ # GET — snapshots de saldo por conta bancária
│ │ ├── transactions/ # GET lista, PUT classifica, DELETE remove
│ │ └── units/ # GET unidades com bankAccounts aninhados
│ ├── components/
│ │ ├── Shell.tsx # Layout (topbar "Prism" + sidebar com nav)
│ │ ├── AccountCombobox.tsx# Combobox buscável para seleção de conta do plano
│ │ └── AIAssistant.tsx # Assistente IA (Claude API)
│ └── lib/
│ ├── prisma.ts # PrismaClient singleton + seed de unidades/bancos/conta neutra
│ ├── ofx-parser.ts # Parser OFX (transações, saldo, banco)
│ ├── dre.ts # Cálculo do DRE (calcDRE, MONTH_NAMES)
│ └── classifier.ts # tokenize() + jaccardSimilarity() para sugestões
└── src/app/icon.svg # Favicon: losango amarelo (#eaca2d)
Unit — Unidades do negócio (MATRIZ, CICERO, CIPO, NOVA SOURE, FERNANDA)
id, name (unique)bankAccounts[], transactions[]BankAccount — Contas bancárias vinculadas a uma unidade
id, name, unitId, initialBalance (Float, default 0)ofxBankId String? — identificador OFX (BANKID ou ORG do <FI>)ofxAcctId String? — número da conta OFX (ACCTID)Account — Plano de contas
id, code (unique, ex: "3.1.1"), name, type, dreGroup, activeRECEITA, DESPESA, ATIVO, PASSIVO, NEUTROdreGroup controla onde aparece no DRE9.9.01 — Transferência entre Contas (type=NEUTRO) — ao classificar, exibe seletores de unidade/conta destino e cria contrapartida automaticamente; aparece na DRE como seção informativa sem contabilizarTransaction — Lançamentos financeiros
id, date, description, amount, memo?, fitid? (unique — previne duplicatas OFX)accountId? — conta do plano (null = não classificado, não entra no DRE)unitId?, bankAccountId?transferToUnitId?, transferToBankAccountId? — preenchidos quando é saída de transferência; a contrapartida de entrada é criada automaticamente com fitid + '_entrada'month, year — índices para filtroBalanceSnapshot — Saldos capturados via OFX
id, bankAccountId, date, balance@@unique([bankAccountId, date]) — um snapshot por conta por diaisBalance do OFX + bloco <LEDGERBAL>Ao iniciar, seedUnits() cria as 5 unidades e seus bancos se não existirem. seedTransferAccount() garante a conta 9.9.01.
Unidades e bancos pré-configurados:
MATRIZ: ITAU MATRIZ, BRADESCO MATRIZ, BNB MATRIZ, BB MATRIZ
CICERO: ITAU CICERO, BRADESCO CICERO
CIPO: ITAU CIPO, BRADESCO CIPO
NOVA SOURE: ITAU NOVA SOURE, CAIXA NOVA SOURE
FERNANDA: ITAU FERNANDA, BRADESCO FERNANDA, BNB FERNANDA
/lancamentos)Fluxo:
.OFXPOST /api/ofx/parse parseia o arquivo:
fitid escopadas à mesma conta — evita falsos positivos entre bancos diferentes<FI><ORG> e <BANKACCTFROM> para identificar o banco<LEDGERBAL> (saldo final)<STMTTRN> — marca isBalance=true se TRNTYPE=BALANCE ou memo começa com "SALDO"isBalance aparecem travadas (sem combobox)POST /api/classify/suggest) e abre painel flutuante com sugestõesPOST /api/ofx salva em lote:
createMany({ skipDuplicates: true }) — uma query para todas as transaçõesisBalance como BalanceSnapshot diáriosLEDGERBAL como BalanceSnapshotofxBankId/ofxAcctId na conta bancária (primeira vez)Parser OFX (ofx-parser.ts):
<ORG> do bloco <FI> (aparece sem tag de fechamento em alguns bancos)YYYYMMDD[HHMMSS[+offset]]isBalance: TRNTYPE=BALANCE ou memo começa com /^saldo\b/i/api/classify/suggest)Algoritmo baseado em similaridade Jaccard sem dependências externas:
tokenize(memo): lowercase → remove números → remove não-letras → split → filtra tokens > 2 chars
jaccardSimilarity(A, B): |A∩B| / |A∪B|
Fluxo:
confidence (0-100%)Propagação em tempo real: quando analista classifica uma linha manualmente, aplica a mesma conta nas linhas com similaridade ≥ 0.25 ainda não classificadas.
Painel flutuante: aparece centralizado, arrastável pelo header, minimizável. Botões ✓/✕ por linha. "Aceitar todas" / "Negar todas".
AccountCombobox.tsx)Combobox buscável por nome ou código. Contas NEUTRO aparecem no topo com separador visual. Botão ✕ para limpar.
/saldo)Exibe evolução do saldo usando apenas os BalanceSnapshot registrados. Gráfico de linha com Recharts. Um ponto por importação OFX (cada linha isBalance + LEDGERBAL = pontos diários).
/dre)Cálculo em lib/dre.ts. Agrupa transações por dreGroup da conta do plano. Filtra por mês/ano/unidade. Transferências entre contas aparecem ao final numa seção informativa (tipo 'transfer') que não contabiliza nos totais financeiros.
TypeScript no Vercel: o compilador alvo não suporta for...of em Map/Set nem spread [...set]. Sempre usar Array.from():
// ❌ falha no build
for (const [k, v] of map) { ... }
const arr = [...set]
// ✅ correto
Array.from(map.entries()).forEach(([k, v]) => { ... })
const arr = Array.from(set)
Neon PostgreSQL: banco em sa-east-1 (São Paulo). Free tier: 0.5 GB storage, 5h compute/mês. Com ~530 transações/mês × 12 contas ≈ 6.360 tx/mês ≈ 12.7 MB/mês → ~3 anos de capacidade.
Performance de import: usar createMany em vez de loop await create individual — reduz 530 round-trips para 1 query SQL.
Conta neutra: 9.9.01 — Transferência entre Contas (type=NEUTRO) não entra no DRE (excluída em calcDRE + no classify/suggest). Aparece no topo do combobox destacada.
Repositório: github.com/Sav-Coelho/prism-financeiro (branch main)
Vercel auto-deploya a cada push.
Build script (package.json):
prisma generate && prisma db push && next build
prisma db push sincroniza o schema sem migrations versionadas.
--font-sub)#eaca2d (--brave-yellow)var(--brave-dark)src/app/globals.css.card, .btn, .metric-card, .form-select, .badge-neutro, etc.)src/app/icon.svg — losango amarelo simples