OpenChart
Free Desktop charting with Claude or Codex. Describe alerts, research chart moves, and choose your data providers.
Gestão financeira simples para pequenas empresas
Translation pending
FinanceGitHub @boreljoaoOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Gestão financeira simples para pequenas empresas brasileiras de comércio e serviços. Mostra ao dono, numa tela só, quanto a empresa faturou, gastou, lucrou, quanto deve e quanto deve pagar de imposto no mês.
Jeito mais fácil (sem Docker): instale o Node.js 22, crie um banco grátis em neon.tech (botão Connect → copie a connection string) e, na pasta do projeto:
npm install
npm run iniciar # pede a connection string, cria as tabelas e os dados de exemplo, e abre o site
Abra http://localhost:3000. Nas próximas vezes, npm run iniciar (ou npm run dev) já basta.
Com Docker (Postgres local):
cp .env.example .env
npm install
docker compose up -d
npm run db:reset # zera o banco local, aplica migrações e cria a empresa de exemplo
npm run dev # http://localhost:3000
Acessos de exemplo (senha urutau123):
| Papel | O que vê | |
|---|---|---|
[email protected] | Dono | Tudo; tem também uma segunda empresa (MEI) |
[email protected] | Colaborador | Lança vendas/despesas e vê só o que lançou |
[email protected] | Contador | Painel e lançamentos, somente leitura |
[email protected] e borel@ (sócios), vinicius@, wanderley@, matheus@ (equipe) | Equipe Urutau | Central Urutau (/admin): a área de cada pessoa com metas, anotações e clientes; todas as empresas |
Empresas de exemplo do dono@: Padaria e Café Urutau (Simples, Anexos I e III, com funcionários e dívidas),
Marina Doces (MEI perto do limite anual), Estúdio Urutau Design (Simples Anexo V com Fator R, que passa
para o Anexo III depois de contratar) e Urutau Manutenção Industrial (Lucro Presumido, com adicional do IRPJ e encargos) e Urutau Veículos
(revenda de carros, o primeiro cliente piloto: clientes e três vendas do WhatsApp esperando conferência).
Banco: crie um projeto em neon.tech e copie a connection string.
Site: em vercel.com, Add New → Project e importe este repositório.
Em Environment Variables, crie DATABASE_URL com a connection string do Neon
(se usar a integração Neon da Vercel, DATABASE_URL e DATABASE_URL_UNPOOLED são criadas sozinhas).
Deploy. O build (vercel-build) aplica as migrações antes de compilar.
Contas: crie a sua em /criar-conta. Para ter as empresas de exemplo no banco publicado, rode uma vez
no seu computador, com uma senha nova (as de exemplo ficariam públicas):
DATABASE_URL="<connection string do Neon>" SEED_SENHA="uma-senha-forte" npm run db:seed
npm run db:reset recusa apagar um banco que não seja local.
/criar-conta e roda DATABASE_URL="<connection string>" npm run admin -- seu@email.
As outras entram pela própria Central, em Equipe → Pôr alguém na equipe (a senha provisória aparece uma vez; a pessoa troca em
Minha conta). Quem é equipe vê a Central /admin e entra em qualquer empresa com os poderes do dono (com um aviso no topo).CRON_SECRET (valor longo e aleatório). A Vercel chama /api/cron todo dia às 6h
(horário de Brasília; vercel.json).POST /api/site/evento
({"tipo": "visita" | "contato" | "whatsapp" | "diagnostico", "pagina", "nome", "negocio", "contato", "mensagem", "dores": [], "tamanho"}).
Contato e diagnóstico viram lead no Comercial. Só as origens de SITE_ORIGENS são aceitas
(padrão: https://urutau.io,https://www.urutau.io).--full para vir latitude/longitude (mapa).No celular: abra o link e use Compartilhar → Adicionar à Tela de Início (iPhone/Safari) ou ⋮ → Instalar app (Android/Chrome). O urutau abre em tela cheia, com ícone próprio.
npm test # unitários + integração com Postgres (usa TEST_DATABASE_URL, recria o schema)
npm run lint # checagem de tipos
bigint no banco, inteiro no TS). Percentuais em pcm (1% = 1.000).
Nenhum float em cálculo; arredondamento uma única vez, no fim, com divisão inteira (src/lib/dinheiro.ts).empresa_id, e as referências usam chave composta
(empresa_id, id), então o próprio banco recusa misturar dados de empresas diferentes.
Todo acesso passa por exigirAcesso / exigirPermissao (src/lib/servidor/acesso.ts).src/lib/permissoes.ts.src/lib/calculos/, testadas sem banco.entra_no_lucro = false)
aparece só no caixa, porque o lucro desconta o imposto estimado.PE = fixas × faturamento ÷ (faturamento − variáveis − impostos).parametros_fiscais
(com início e fim de vigência). A empresa pode sobrescrever valores em empresa_parametros (ex.: RAT ajustado pelo FAP).folha_mensal (foto do custo). Meses passados ficam
congelados; o mês atual é recalculado enquanto não for pago. folha_desde evita duplicar salários já lançados à mão.
Custo = salário + FGTS + 13º (÷12) + férias com 1/3 (÷9) + FGTS das reservas + encargos (se o regime exigir) + benefícios.
No caixa entram só salário, FGTS, encargos sobre o salário e benefícios: as reservas saem quando o 13º e as férias forem pagos.valor = juros + amortização em cada parcela.src/lib/calculos/{simples,mei,presumido,impostos}.ts), sempre com o aviso "Valor estimado. Confirme com o seu contador.":
src/
app/ telas (App Router)
(publico)/ entrar, criar conta
empresas/ escolher/criar empresa
e/[empresaId]/ painel, vendas, despesas (e recorrentes), contas, funcionários, dívidas, impostos, relatórios, ajustes
components/ UI compartilhada
db/ schema Drizzle, conexão, categorias e fontes padrão
lib/
calculos/ cálculos puros: painel, folha, dívidas, parâmetros, Simples, MEI, Presumido, guias, recorrentes, 13º/férias
relatorios/ CSV e PDF
servidor/ autenticação, acesso, consultas e server actions
drizzle/ migrações SQL
scripts/ migrate, reset, seed
tests/ Vitest
simples_faixas e parametros_fiscais (migração 0004). Quando a CBS substituir PIS/Cofins,
feche a vigência de pis_cumulativo/cofins_cumulativo e cadastre a nova regra.receitas_historicas: faturamento e folha de meses anteriores ao urutau (tela "Faturamento anterior").src/lib/servidor/automaticos.ts, chamado pelas telas antes de mostrar os números; idempotente):
referencia única (recorrente:<id>:2026-10, imposto:das:2026-09): nunca duplica,
nem volta depois que o dono exclui. Guias não são geradas se o dono já lançou a guia daquele mês à mão.pagamentos_provisao) entra só no caixa./e/<id>/relatorios): PDF e CSVs (resumo, vendas, despesas, funcionários, dívidas, impostos) ou tudo num .zip.
CSV com ;, vírgula decimal e BOM UTF-8, para abrir direto no Excel; fórmulas são neutralizadas (CSV injection).empresas.tratamento_mercadorias e despesas.compra_id já existem.src/lib/perfis.ts): revenda de veículos, consultório, varejo, serviço com visita, alimentação ou só finanças.
Decide as fontes de receita iniciais, os nomes do menu e os módulos ligados. empresa_modulos guarda só o que o painel Urutau
mudou em relação ao perfil.5521999998888), o formato do WhatsApp. Um telefone por empresa
(índice único parcial, ignorando excluídos). acharOuCriarPorTelefone é a porta de entrada do atendente.vendas.conferido_em tem padrão now(); lançamento à mão já nasce conferido. Canais automáticos
(WhatsApp, agenda, site) gravam null e a venda aparece em "Para conferir" até o dono dar o check. vendas.origem diz de onde veio.usuarios.superadmin): exigirAcesso deixa entrar em qualquer empresa como dono (ctx.comoAdmin).
Ações do painel ficam em auditoria; senhas provisórias aparecem uma vez na tela e nunca são gravadas.src/lib/servidor/tarefas.ts): fila no próprio Postgres (FOR UPDATE SKIP LOCKED), chave para não duplicar,
nova tentativa com espera crescente (1, 4, 9, 16 min) e desistência após 5. Hoje roda a rotina diária de cada empresa;
é onde entram as mensagens do WhatsApp e os lembretes.db e empresaId explícitos (não a sessão), para o atendente usá-las sem usuário logado.