尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
Planejamento e controle financeiro do casal Rodolfo e Thainy, incluindo o perfil PJ RLiima. Substitui a planilha anual de abas mensais. A palavra-chave do produto é previsibilidade. O que rodar no dia a dia O .env.local fica fora do git. Copie o .env.example e preencha com a URL e a anon key do projeto. Nunca coloque a service_role no frontend: ela só vale em Edge Functions e scripts.檢視完整 README ↗
Planejamento e controle financeiro do casal Rodolfo e Thainy, incluindo o perfil PJ RLiima. Substitui a planilha anual de abas mensais. A palavra-chave do produto é previsibilidade.
pnpm install # primeira vez, ou depois de trocar de branch com dependência nova
pnpm dev # http://localhost:5173
pnpm validar # lint, testes e build. Rodar antes de qualquer commit importante
Outros comandos:
| Comando | O que faz |
|---|---|
pnpm test | Testes de unidade dos formatadores, máscaras, formas e erros |
pnpm test:watch | O mesmo, reagindo a cada salvamento |
pnpm lint | ESLint, sem any e exigindo import type |
pnpm build | Checagem de tipos mais o build de produção com o service worker |
pnpm preview | Serve o build pronto, com PWA ligado, em http://localhost:4173 |
pnpm icones | Regera os PNGs do app a partir da marca |
pnpm types:supabase | Regera src/types/database.ts do schema (precisa da CLI do Supabase) |
O .env.local fica fora do git. Copie o .env.example e preencha com a URL e a anon key do
projeto. Nunca coloque a service_role no frontend: ela só vale em Edge Functions e scripts.
src/
├── app/ rotas, shell, guarda de login, cliente de dados, persistência offline
├── features/ uma pasta por módulo: dashboard, lancamentos, carteira, investimentos,
│ categorias, agenda, perfil, auth, catalogo
├── hooks/ todo acesso a dados vive aqui, sempre via TanStack Query
├── ui/ componentes reutilizáveis do design system
├── lib/ formatadores, máscaras, marcas, formas de pagamento, erros, confete
├── store/ zustand: tema, filtros, toasts, sheets
├── styles/ tokens.css e prototipo.css (cópia fiel do v40), correcoes.css, login.css, pwa.css
└── types/ database.ts, gerado do schema
supabase/
├── migrations/ o schema inteiro, em ordem. Nunca alterar nada pelo painel
├── testes/ fluxos críticos e RLS, em SQL
└── seed.sql o casal e as dez categorias padrão
scripts/ gerador dos ícones do PWA
docs/ documento mestre, especificação técnica, PROGRESSO e o protótipo v40
Regra que não se quebra: nenhum componente fala com o Supabase direto. Tudo passa por um
hook em src/hooks/. Assim o cache, a invalidação e o tratamento de erro ficam num lugar só.
Detalhes em supabase/README.md. O resumo:
supabase/migrations, aplicada pelo MCP do Supabase.casal_id. A função que resolve o casal mora no schema private,
fora do alcance da API REST.Depois de cada migration, regerar os tipos e rodar pnpm build.
| Onde | O que cobre | Como rodar |
|---|---|---|
src/lib/*.test.ts | Moeda em BRL, data em DD/MM/AAAA, hora em 24h, máscaras, formas de pagamento e tradução de erro | pnpm test |
supabase/testes/fluxos_criticos.sql | Baixa com timestamp, fatura zerando e restaurando o limite, parcelas com o dia do cartão cruzando o ano, ajuste com motivo obrigatório, aporte somando e subtraindo, integridade de investimento | SQL Editor do painel, com papel de serviço |
supabase/testes/rls_e_restricoes.sql | Isolamento entre casais nos quatro verbos e as restrições de schema | SQL Editor do painel, com papel de serviço |
Os dois scripts SQL limpam tudo o que criam. Se algum passo falhar, a exceção sobe com a palavra FALHOU e nada fica gravado pela metade.
O Supabase no plano gratuito guarda backup automático diário, com retenção curta. Para o histórico financeiro de vocês isso não basta sozinho. O que fazer:
Uma vez por mês, depois de aprovar o balanço:
Exportação manual dos dados, quando quiser um CSV legível:
No SQL Editor, rode e baixe o resultado de cada um:
select * from v_lancamentos order by data_vencimento;
select l.descricao, p.data_pagamento, p.hora_pagamento, p.valor_pago
from pagamentos p join lancamentos l on l.id = p.lancamento_id
order by p.data_pagamento;
select * from carteiras order by tipo, nome;
select * from investimentos order by sub, nome;
select * from ajustes order by criado_em;
Restaurar: Database > Backups > Restore, no próprio painel. Depois de qualquer restauração, confira que os dois agendamentos do pg_cron continuam ativos:
select jobname, schedule, active from cron.job;
O que não é backup: o cache offline no aparelho. Ele existe para o app abrir sem rede, tem teto de um dia e some quando alguém sai da conta.
O deploy é na Vercel, ligado ao repositório: todo push na main publica. As três variáveis de
ambiente precisam estar cadastradas nos três ambientes (Production, Preview e Development):
VITE_SUPABASE_URL
VITE_SUPABASE_ANON_KEY
VITE_APP_NOME
O vercel.json já traz as reescritas da SPA e o cabeçalho de cache certo para o sw.js, que
não pode ser cacheado, senão a atualização do app nunca chega.
O cadastro é fechado por convite: a tabela convites guarda os e-mails liberados e um gatilho
recusa qualquer outro, mesmo por chamada direta à API. Cada convite vale uma vez.
Para liberar mais alguém depois:
insert into convites (email, casal_id, nome)
values ('[email protected]', '00000000-0000-4000-8000-000000000001', 'Nome');
type="date".numeric(12,2) no banco, jamais float.docs/ESTLIM_v40.html é a especificação visual. Divergências ficam isoladas em
src/styles/correcoes.css, cada uma com o motivo escrito.