Sistema de gestão para locadoras que alugam veículos diretamente a motoristas (modelo semelhante a aplicativos de transporte). Construído do zero, pensando em evoluir para um SaaS multi-empresa.
Substituir o controle manual (planilhas) da locação de veículos, motoristas, contratos, financeiro e manutenção por um sistema centralizado, acessível via web e celular, com automações que reduzem trabalho manual (ex: pagamento de parcela gera lançamento financeiro automaticamente; criar um contrato já vincula veículo e motorista).
- Node.js + Express — servidor HTTP e rotas da API
- TypeScript — tipagem estática em todo o projeto
- Drizzle ORM — acesso ao banco de dados e migrations
- PostgreSQL 16 — banco de dados relacional, rodando via Docker
- JWT (jsonwebtoken) — autenticação por token
- bcryptjs — hash de senhas
- Multer — upload de arquivos (fotos de vistoria)
- React + Vite + TypeScript
- React Router — navegação entre páginas
- Axios — chamadas à API
- Tailwind CSS — estilização
- Recharts — gráficos do Dashboard
- lucide-react — ícones
- React Native + Expo (SDK 54, testado via Expo Go)
- Expo Router — navegação por arquivos
- AsyncStorage — persistência local do token de login
- expo-image-picker — upload de fotos em vistorias
- react-native-gifted-charts — gráficos do Dashboard mobile
- Docker Compose — container do PostgreSQL para desenvolvimento local
- Git + GitHub — versionamento
fleet-admin/ ├── src/ # Backend (API) │ ├── db/ # Schema Drizzle, client de conexão, seed │ ├── routes/ # Rotas da API (uma por recurso) │ ├── middlewares/ # Middleware de autenticação │ └── server.ts # Ponto de entrada do backend ├── web/ # Frontend web (React + Vite) │ └── src/ │ ├── pages/ # Uma página por rota │ ├── components/# Layout compartilhado │ ├── contexts/ # Contexto de autenticação │ └── api/ # Cliente Axios configurado ├── mobile/ # App mobile (Expo) │ └── app/ │ ├── (tabs)/ # Telas do app (uma aba por arquivo) │ ├── contexts/ # Contexto de autenticação │ └── api/ # Cliente Axios configurado ├── drizzle/ # Migrations geradas ├── uploads/ # Fotos de vistoria (não versionado) └── docker-compose.yml # Container do Postgres
Sistema multi-tenant: toda tabela de negócio tem companyId, isolando os dados de cada empresa cliente.
Entidades principais:
companies/users— empresa (tenant) e usuários com loginvehicles— veículos da frotadrivers— motoristas, com vínculo ao veículo que estão alugando no momentocontracts— contrato de locação (motorista + veículo), com dia de pagamento semanal e prazo previstofinancial_entries— lançamentos financeiros (entradas/saídas), com vínculo opcional a veículo/motoristavehicle_financings/vehicle_insurances— financiamento e seguro por veículo, com pagamento gerando lançamento financeiro automaticamenteinspections/inspection_photos— vistorias semanais com checklist de 22 itens e fotos
- ✅ Autenticação (login com JWT, senha com hash bcrypt)
- ✅ CRUD completo de Veículos, Motoristas, Contratos, Financeiro
- ✅ Contratos: dia de pagamento semanal, prazo previsto, vínculo automático motorista↔veículo
- ✅ Financiamentos: controle de parcelas, pagamento com valor customizável (amortização)
- ✅ Seguros: controle de mensalidade
- ✅ Vistorias: checklist de 22 itens, upload de múltiplas fotos, alerta de vistoria pendente (ciclo de 7 dias)
- ✅ Dashboard: ocupação da frota, saldo em caixa, gráfico de entradas x saídas por mês, alertas de pagamento do dia e contrato vencendo
- ✅ Isolamento entre empresas (multi-tenancy) garantido em todas as rotas
- ✅ App mobile (iOS via Expo Go) com as mesmas 7 telas do sistema web
- 🔲 Validação de dados de entrada (Zod) em todas as rotas
- 🔲 Tratamento de erros centralizado no backend
- 🔲 Proteção contra força bruta no login (rate limiting)
- 🔲 Deploy em produção (hoje roda apenas localmente)
- 🔲 Testes reais com dados da locadora
Node.js, Docker Desktop, Git.
# Na raiz do projeto
docker compose up -d # sobe o Postgres
npm install
npm run db:migrate # aplica as migrations
npm run dev # inicia o servidor em http://localhost:3333cd web
npm install
npm run dev # inicia em http://localhost:5173cd mobile
npm install
npx expo start # escaneie o QR code com o Expo GoNota: para testar o app mobile em um celular físico, o computador e o celular precisam estar na mesma rede Wi-Fi. O IP local da máquina deve ser configurado em
mobile/api/client.ts.
Crie um arquivo .env na raiz com: