尚未收集仓库信息。
尚未检测到更新。GitHub 发布版本后会显示在这里。
制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 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.