Skip to content

dmanske/almoxarifado-postgres-test

Repository files navigation

🏭 Almoxarifado Manske — Sistema de Gestão

Sistema completo de controle de almoxarifado, ferramentas, EPIs, veículos e obras para a empresa Manske.

Frontend React + Backend Node.js + PostgreSQL


📋 Status do Projeto

  • ✅ Frontend completo (React + TypeScript + Tailwind)
  • ✅ Backend API REST (Express + Prisma)
  • ✅ Banco de dados PostgreSQL (schema completo com 15 tabelas)
  • ✅ Autenticação JWT (login, registro, sessão persistente)
  • ✅ Validação de dados (Zod em todas as rotas)
  • ✅ Tratamento de erros centralizado
  • ✅ API Client no frontend com React Query
  • ✅ Seed com dados de exemplo

🚀 Como Rodar (Desenvolvimento Local)

Pré-requisitos

  • Node.js 18+
  • PostgreSQL 14+ instalado e rodando
  • npm (vem com Node.js)

1. Instalar dependências

npm install

2. Configurar o banco de dados

Crie o banco no PostgreSQL:

CREATE DATABASE gestao_obras;

3. Configurar variáveis de ambiente

Copie o exemplo e ajuste a senha:

cp .env.example .env

Edite o .env:

DATABASE_URL="postgresql://postgres:SUA_SENHA@localhost:5432/gestao_obras?schema=public"
PORT=3001
JWT_SECRET="gere_uma_chave_secreta_forte_aqui"

4. Criar as tabelas no banco

npm run db:push

5. Popular com dados de exemplo

npm run db:seed

6. Iniciar o backend (terminal 1)

npm run server

O servidor roda em http://localhost:3001

7. Iniciar o frontend (terminal 2)

npm run dev

O app abre em http://localhost:5173

8. Fazer login

  • Email: admin@manske.com.br
  • Senha: admin123

📁 Estrutura do Projeto

├── src/                          # Frontend React
│   ├── components/               # Componentes reutilizáveis
│   │   ├── ui/                   # Shadcn/UI (botões, inputs, etc.)
│   │   ├── AppLayout.tsx         # Layout principal com sidebar
│   │   ├── AppSidebar.tsx        # Menu lateral
│   │   └── ...
│   ├── contexts/
│   │   └── AuthContext.tsx       # Autenticação (JWT + localStorage)
│   ├── hooks/
│   │   ├── useApi.ts             # React Query hooks (CRUD)
│   │   └── use-toast.ts         # Notificações
│   ├── lib/
│   │   ├── api.ts                # API Client (fetch + token)
│   │   ├── formatters.ts         # Formatação BRL, datas
│   │   └── utils.ts             # Utilitários
│   ├── pages/                    # Páginas da aplicação
│   │   ├── Dashboard.tsx         # KPIs, gráficos, alertas
│   │   ├── Insumos.tsx           # Materiais de consumo
│   │   ├── Ferramentas.tsx       # Patrimônio de ferramentas
│   │   ├── Obras.tsx             # Obras ativas/concluídas
│   │   ├── Funcionarios.tsx      # Cadastro de funcionários
│   │   ├── Fornecedores.tsx      # Fornecedores com avaliação
│   │   ├── EPIs.tsx              # Equipamentos de proteção
│   │   ├── Veiculos.tsx          # Frota de veículos
│   │   ├── QRCodes.tsx           # Geração de QR codes
│   │   └── Login.tsx             # Tela de login
│   └── types/
│       └── index.ts              # Tipos TypeScript compartilhados
│
├── server/                       # Backend Node.js
│   ├── index.ts                  # Express app (entry point)
│   ├── lib/
│   │   └── prisma.ts             # Singleton do PrismaClient
│   ├── middleware/
│   │   ├── auth.ts               # JWT middleware
│   │   ├── asyncHandler.ts       # Wrapper para erros async
│   │   └── errorHandler.ts       # Error handler centralizado
│   ├── routes/
│   │   ├── auth.ts               # Login, registro, /me
│   │   ├── items.ts              # Insumos + Ferramentas
│   │   ├── employees.ts          # Funcionários
│   │   ├── constructionSites.ts  # Obras
│   │   ├── suppliers.ts          # Fornecedores
│   │   ├── vehicles.ts           # Veículos
│   │   ├── ppes.ts               # EPIs + Entregas
│   │   └── movements.ts          # Movimentações de estoque
│   ├── validators/               # Schemas Zod (validação)
│   │   ├── auth.schema.ts
│   │   ├── items.schema.ts
│   │   ├── employees.schema.ts
│   │   ├── constructionSites.schema.ts
│   │   ├── suppliers.schema.ts
│   │   ├── vehicles.schema.ts
│   │   ├── ppes.schema.ts
│   │   └── movements.schema.ts
│   ├── types/
│   │   └── express.d.ts          # Type augmentation
│   ├── seed.ts                   # Dados iniciais
│   └── README.md                 # Guia do backend + migração
│
├── prisma/
│   └── schema.prisma             # Schema do banco (15 tabelas)
├── .env.example                  # Template de variáveis
└── package.json                  # Scripts e dependências

🗄️ Banco de Dados (PostgreSQL)

Tabelas

Tabela Descrição
Company Empresas cadastradas
User Usuários do sistema (login)
Item Insumos e ferramentas
Movement Entradas/saídas de estoque
ConstructionSite Obras
Employee Funcionários
Supplier Fornecedores
PriceQuote Cotações de preço
PPE EPIs cadastrados
PPEDelivery Entregas de EPI
ToolCheckout Retiradas de ferramentas
MaintenanceRecord Manutenção de ferramentas
Vehicle Veículos da frota
VehicleMaintenance Manutenções de veículos
VehicleUsage Uso de veículos
DriverLog Diário de bordo

Comandos úteis

npm run db:push      # Sincroniza schema → banco
npm run db:migrate   # Cria migration formal (versionada)
npm run db:seed      # Popula com dados de exemplo
npm run db:studio    # Interface visual (abre no browser)

🔐 Autenticação

  • Método: JWT (JSON Web Token)
  • Expiração: 7 dias
  • Hash de senha: bcrypt (10 rounds)
  • Persistência: localStorage no frontend
  • Restauração: ao recarregar, verifica token via /api/auth/me

Endpoints de Auth

Método Rota Descrição
POST /api/auth/login Login (retorna token + user)
POST /api/auth/register Criar usuário
GET /api/auth/me Dados do usuário logado (protegido)

📡 API REST

Base URL: http://localhost:3001/api

Endpoints principais

Recurso GET (listar) GET (detalhe) POST PUT DELETE
Items /items /items/:id /items /items/:id /items/:id
Employees /employees /employees/:id /employees /employees/:id /employees/:id
Sites /construction-sites .../:id ... .../:id .../:id
Suppliers /suppliers .../:id ... .../:id .../:id
Vehicles /vehicles .../:id ... .../:id .../:id
PPEs /ppes .../:id ... .../:id .../:id
Movements /movements /movements .../:id

Filtros (query params)

  • GET /items?type=insumo — filtrar por tipo
  • GET /items?companyId=manske — filtrar por empresa
  • GET /construction-sites?status=ativa — filtrar por status
  • GET /movements?itemId=xxx&type=entrada — filtrar movimentações

🖥️ Módulos do Frontend

Módulo Funcionalidades
Dashboard KPIs, gráficos (Recharts), alertas de vencimento, estoque baixo
Insumos CRUD, estoque mínimo, movimentações entrada/saída
Ferramentas Patrimônio, status, retirada/devolução, manutenção
Obras Cadastro com endereço, status ativa/concluída
Funcionários Cadastro, CNH (categoria + vencimento), alertas
Fornecedores CNPJ, categorias, avaliação 1-5 estrelas, cotações
EPIs CA, validade, estoque, entregas com assinatura digital
Veículos Placa, km, documentos, seguro, manutenção, diário
QR Codes Geração para identificação de ferramentas

🛠️ Stack Técnica

Frontend

Tecnologia Uso
Vite Build tool
React 18 UI framework
TypeScript Tipagem estática
Tailwind CSS Estilização
Shadcn/UI Componentes acessíveis
React Query Cache e sync de dados
React Router Navegação SPA
Recharts Gráficos
Zod Validação de formulários
date-fns Manipulação de datas

Backend

Tecnologia Uso
Express HTTP server
Prisma ORM + migrations
PostgreSQL Banco relacional
Zod Validação de input
bcryptjs Hash de senhas
jsonwebtoken Autenticação JWT
tsx Runtime TypeScript

🚀 Deploy para Produção (Windows Server)

Consulte o guia completo em server/README.md.

Resumo rápido:

  1. Instale PostgreSQL no servidor Windows
  2. Crie o banco gestao_obras
  3. Exporte o banco local: pg_dump -U postgres -d gestao_obras -f backup.sql
  4. Importe no servidor: psql -U postgres -d gestao_obras -f backup.sql
  5. Configure o .env com a senha do servidor
  6. Rode npm run server (ou use PM2 para manter rodando)
  7. Faça npm run build e sirva o dist/ com Nginx ou IIS

Backup automático

Arquivo backup.bat agendado no Task Scheduler (detalhes em server/README.md).


📝 Scripts Disponíveis

# Frontend
npm run dev          # Servidor de desenvolvimento (Vite)
npm run build        # Build de produção
npm run preview      # Preview do build
npm run lint         # ESLint

# Backend
npm run server       # Inicia o Express com tsx

# Banco de dados
npm run db:push      # Sincroniza schema com banco
npm run db:migrate   # Cria migration versionada
npm run db:seed      # Popula dados de exemplo
npm run db:studio    # Interface visual do Prisma

# Testes
npm run test         # Roda testes (vitest)

📌 Decisões Técnicas

Decisão Motivo
PostgreSQL (não MySQL) Já familiar via Supabase, sem limites, melhor para JSON/arrays
Prisma (não Drizzle) Migrations automáticas, studio visual, tipagem excelente
Express (não Fastify) Ecossistema maduro, mais tutoriais, middleware abundante
JWT (não sessions) Stateless, funciona com mobile futuro, fácil de escalar
Zod (não Joi) Já usado no frontend, inferência de tipos TypeScript
React Query (não Redux) Server state ≠ client state, cache automático, menos boilerplate

About

Projeto teste - Almoxarifado Manske com PostgreSQL

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages