First commit - backup RDOC
This commit is contained in:
352
.trae/documents/Analise_Otimizacao_RDO.md
Normal file
352
.trae/documents/Analise_Otimizacao_RDO.md
Normal file
@@ -0,0 +1,352 @@
|
||||
# Análise Completa e Plano de Otimização - Aplicativo RDO
|
||||
|
||||
## 1. Resumo Executivo
|
||||
|
||||
Este documento apresenta uma análise detalhada da estrutura atual do aplicativo RDO (Relatório Diário de Obra) e propõe um plano abrangente de otimização, refatoração e modernização do código. O objetivo é melhorar a performance, legibilidade, manutenibilidade e seguir as melhores práticas atuais de desenvolvimento.
|
||||
|
||||
## 2. Análise da Arquitetura Atual
|
||||
|
||||
### 2.1 Pontos Fortes Identificados
|
||||
- ✅ Uso de TypeScript para tipagem estática
|
||||
- ✅ Arquitetura baseada em React 18 com hooks modernos
|
||||
- ✅ Integração com Supabase para backend-as-a-service
|
||||
- ✅ Implementação de React Query para gerenciamento de estado servidor
|
||||
- ✅ Uso de Zustand para estado global
|
||||
- ✅ Configuração de PWA com Capacitor
|
||||
- ✅ Implementação de modo offline com Dexie
|
||||
- ✅ Estrutura de pastas organizada
|
||||
|
||||
### 2.2 Problemas Críticos Identificados
|
||||
|
||||
#### 2.2.1 Duplicação de Lógica de Estado
|
||||
- ❌ **Problema**: Existem dois sistemas paralelos para gerenciamento de obras:
|
||||
- `src/hooks/useObras.ts` (useState + useEffect)
|
||||
- `src/hooks/queries/useObras.ts` (React Query)
|
||||
- `src/stores/useObraStore.ts` (Zustand)
|
||||
- ❌ **Impacto**: Inconsistência de dados, complexidade desnecessária, bugs potenciais
|
||||
|
||||
#### 2.2.2 Configuração TypeScript Permissiva
|
||||
- ❌ **Problema**: `tsconfig.json` com `strict: false` e outras verificações desabilitadas
|
||||
- ❌ **Impacto**: Perda de benefícios da tipagem estática, bugs em runtime
|
||||
|
||||
#### 2.2.3 Estrutura de Rotas Repetitiva
|
||||
- ❌ **Problema**: Código repetitivo no `App.tsx` com múltiplas rotas similares
|
||||
- ❌ **Impacto**: Dificulta manutenção e adiciona verbosidade
|
||||
|
||||
#### 2.2.4 Falta de Padronização de Componentes
|
||||
- ❌ **Problema**: Componentes sem padrão consistente de props e estrutura
|
||||
- ❌ **Impacto**: Dificuldade de manutenção e reutilização
|
||||
|
||||
## 3. Plano de Otimização Detalhado
|
||||
|
||||
### 3.1 Fase 1: Consolidação da Arquitetura de Estado (Prioridade Alta)
|
||||
|
||||
#### 3.1.1 Migração para Arquitetura Unificada
|
||||
**Objetivo**: Eliminar duplicações e criar uma única fonte de verdade
|
||||
|
||||
**Ações**:
|
||||
1. **Manter apenas React Query + Zustand**:
|
||||
- Remover hooks baseados em useState (`useObras.ts`, `useRdos.ts`, etc.)
|
||||
- Usar React Query para estado servidor (dados do Supabase)
|
||||
- Usar Zustand apenas para estado cliente (UI, configurações)
|
||||
|
||||
2. **Reestruturar hooks de queries**:
|
||||
```typescript
|
||||
// Estrutura otimizada
|
||||
src/hooks/
|
||||
├── queries/
|
||||
│ ├── useObrasQuery.ts // React Query apenas
|
||||
│ ├── useRdosQuery.ts // React Query apenas
|
||||
│ └── useUsersQuery.ts // React Query apenas
|
||||
├── stores/
|
||||
│ ├── useUIStore.ts // Estado da UI
|
||||
│ ├── useConfigStore.ts // Configurações
|
||||
│ └── useOfflineStore.ts // Estado offline
|
||||
└── index.ts
|
||||
```
|
||||
|
||||
3. **Implementar padrão de custom hooks compostos**:
|
||||
```typescript
|
||||
// Exemplo: useObra.ts
|
||||
export const useObra = (id: string) => {
|
||||
const query = useObraQuery(id);
|
||||
const mutation = useUpdateObraMutation();
|
||||
const uiState = useUIStore();
|
||||
|
||||
return {
|
||||
...query,
|
||||
update: mutation.mutate,
|
||||
isUpdating: mutation.isPending,
|
||||
// Lógica composta
|
||||
};
|
||||
};
|
||||
```
|
||||
|
||||
#### 3.1.2 Otimização do React Query
|
||||
**Configurações aprimoradas**:
|
||||
```typescript
|
||||
// queryClient.ts otimizado
|
||||
export const queryClient = new QueryClient({
|
||||
defaultOptions: {
|
||||
queries: {
|
||||
staleTime: 5 * 60 * 1000, // 5 minutos
|
||||
gcTime: 10 * 60 * 1000, // 10 minutos
|
||||
retry: (failureCount, error) => {
|
||||
if (error?.status === 401) return false;
|
||||
return failureCount < 3;
|
||||
},
|
||||
refetchOnWindowFocus: false, // Otimização mobile
|
||||
},
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
### 3.2 Fase 2: Modernização do TypeScript (Prioridade Alta)
|
||||
|
||||
#### 3.2.1 Configuração Strict
|
||||
```json
|
||||
// tsconfig.json otimizado
|
||||
{
|
||||
"compilerOptions": {
|
||||
"strict": true,
|
||||
"noUnusedLocals": true,
|
||||
"noUnusedParameters": true,
|
||||
"noFallthroughCasesInSwitch": true,
|
||||
"exactOptionalPropertyTypes": true,
|
||||
"noUncheckedIndexedAccess": true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 3.2.2 Melhoria dos Tipos
|
||||
1. **Criar tipos específicos do domínio**:
|
||||
```typescript
|
||||
// types/domain.ts
|
||||
export type ObraStatus = 'ativa' | 'pausada' | 'concluida' | 'cancelada';
|
||||
export type UserRole = 'admin' | 'engenheiro' | 'mestre_obra' | 'usuario';
|
||||
|
||||
export interface ObraWithRelations extends Obra {
|
||||
responsavel?: Usuario;
|
||||
rdos?: RDO[];
|
||||
}
|
||||
```
|
||||
|
||||
2. **Implementar branded types para IDs**:
|
||||
```typescript
|
||||
export type ObraId = string & { readonly brand: unique symbol };
|
||||
export type UserId = string & { readonly brand: unique symbol };
|
||||
```
|
||||
|
||||
### 3.3 Fase 3: Refatoração de Componentes (Prioridade Média)
|
||||
|
||||
#### 3.3.1 Sistema de Design Consistente
|
||||
1. **Criar componentes base reutilizáveis**:
|
||||
```typescript
|
||||
// components/ui/
|
||||
├── Button/
|
||||
│ ├── Button.tsx
|
||||
│ ├── Button.types.ts
|
||||
│ └── Button.stories.tsx
|
||||
├── Input/
|
||||
├── Modal/
|
||||
└── Card/
|
||||
```
|
||||
|
||||
2. **Implementar compound components**:
|
||||
```typescript
|
||||
// Exemplo: Modal compound component
|
||||
export const Modal = {
|
||||
Root: ModalRoot,
|
||||
Header: ModalHeader,
|
||||
Body: ModalBody,
|
||||
Footer: ModalFooter,
|
||||
};
|
||||
```
|
||||
|
||||
#### 3.3.2 Otimização de Performance
|
||||
1. **Implementar React.memo estratégico**:
|
||||
```typescript
|
||||
export const ObraCard = React.memo(({ obra }: { obra: Obra }) => {
|
||||
// Componente otimizado
|
||||
});
|
||||
```
|
||||
|
||||
2. **Usar React.lazy para code splitting**:
|
||||
```typescript
|
||||
const ObraDetails = React.lazy(() => import('./pages/ObraDetails'));
|
||||
```
|
||||
|
||||
3. **Implementar virtualization para listas grandes**:
|
||||
```typescript
|
||||
import { FixedSizeList as List } from 'react-window';
|
||||
```
|
||||
|
||||
### 3.4 Fase 4: Otimização de Rotas (Prioridade Média)
|
||||
|
||||
#### 3.4.1 Configuração Declarativa de Rotas
|
||||
```typescript
|
||||
// routes/config.ts
|
||||
export const routes = [
|
||||
{
|
||||
path: '/',
|
||||
element: Dashboard,
|
||||
protected: true,
|
||||
layout: MainLayout,
|
||||
},
|
||||
{
|
||||
path: '/obra/:id',
|
||||
element: ObraDetails,
|
||||
protected: true,
|
||||
layout: null, // Tela cheia
|
||||
},
|
||||
] as const;
|
||||
|
||||
// App.tsx simplificado
|
||||
export default function App() {
|
||||
return (
|
||||
<Router>
|
||||
<QueryProvider>
|
||||
<AuthProvider>
|
||||
<RouteRenderer routes={routes} />
|
||||
</AuthProvider>
|
||||
</QueryProvider>
|
||||
</Router>
|
||||
);
|
||||
}
|
||||
```
|
||||
|
||||
### 3.5 Fase 5: Otimizações de Performance (Prioridade Média)
|
||||
|
||||
#### 3.5.1 Bundle Optimization
|
||||
1. **Configurar Vite para otimização**:
|
||||
```typescript
|
||||
// vite.config.ts
|
||||
export default defineConfig({
|
||||
build: {
|
||||
rollupOptions: {
|
||||
output: {
|
||||
manualChunks: {
|
||||
vendor: ['react', 'react-dom'],
|
||||
supabase: ['@supabase/supabase-js'],
|
||||
ui: ['@radix-ui/react-dialog', '@radix-ui/react-select'],
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
2. **Implementar preloading estratégico**:
|
||||
```typescript
|
||||
// Preload de rotas críticas
|
||||
const prefetchObraDetails = (obraId: string) => {
|
||||
queryClient.prefetchQuery({
|
||||
queryKey: ['obra', obraId],
|
||||
queryFn: () => getObra(obraId),
|
||||
});
|
||||
};
|
||||
```
|
||||
|
||||
#### 3.5.2 Otimização de Imagens e Assets
|
||||
1. **Implementar lazy loading de imagens**
|
||||
2. **Usar WebP com fallback**
|
||||
3. **Configurar service worker para cache de assets**
|
||||
|
||||
### 3.6 Fase 6: Melhorias de DX (Developer Experience)
|
||||
|
||||
#### 3.6.1 Ferramentas de Desenvolvimento
|
||||
1. **Configurar ESLint mais rigoroso**:
|
||||
```javascript
|
||||
// eslint.config.js
|
||||
export default [
|
||||
...tseslint.configs.strictTypeChecked,
|
||||
{
|
||||
rules: {
|
||||
'@typescript-eslint/no-unused-vars': 'error',
|
||||
'@typescript-eslint/prefer-nullish-coalescing': 'error',
|
||||
'react-hooks/exhaustive-deps': 'error',
|
||||
},
|
||||
},
|
||||
];
|
||||
```
|
||||
|
||||
2. **Implementar Prettier com configuração consistente**
|
||||
3. **Configurar Husky para pre-commit hooks**
|
||||
|
||||
#### 3.6.2 Testing Strategy
|
||||
1. **Implementar testes unitários com Vitest**
|
||||
2. **Testes de integração com Testing Library**
|
||||
3. **E2E tests com Playwright**
|
||||
|
||||
## 4. Cronograma de Implementação
|
||||
|
||||
### Sprint 1 (2 semanas) - Fundação
|
||||
- [ ] Configurar TypeScript strict mode
|
||||
- [ ] Consolidar arquitetura de estado (Fase 1)
|
||||
- [ ] Remover hooks duplicados
|
||||
- [ ] Configurar ferramentas de desenvolvimento
|
||||
|
||||
### Sprint 2 (2 semanas) - Componentes
|
||||
- [ ] Criar sistema de design base
|
||||
- [ ] Refatorar componentes principais
|
||||
- [ ] Implementar compound components
|
||||
- [ ] Otimizar performance com React.memo
|
||||
|
||||
### Sprint 3 (1 semana) - Rotas e Performance
|
||||
- [ ] Refatorar sistema de rotas
|
||||
- [ ] Implementar code splitting
|
||||
- [ ] Otimizar bundle com Vite
|
||||
- [ ] Configurar preloading
|
||||
|
||||
### Sprint 4 (1 semana) - Finalização
|
||||
- [ ] Testes e validação
|
||||
- [ ] Documentação
|
||||
- [ ] Deploy e monitoramento
|
||||
|
||||
## 5. Métricas de Sucesso
|
||||
|
||||
### 5.1 Performance
|
||||
- **Bundle size**: Redução de 30%
|
||||
- **First Contentful Paint**: < 1.5s
|
||||
- **Largest Contentful Paint**: < 2.5s
|
||||
- **Time to Interactive**: < 3s
|
||||
|
||||
### 5.2 Qualidade de Código
|
||||
- **TypeScript coverage**: 100%
|
||||
- **ESLint errors**: 0
|
||||
- **Test coverage**: > 80%
|
||||
- **Duplicação de código**: < 5%
|
||||
|
||||
### 5.3 Developer Experience
|
||||
- **Build time**: Redução de 40%
|
||||
- **Hot reload**: < 200ms
|
||||
- **Type checking**: < 5s
|
||||
|
||||
## 6. Riscos e Mitigações
|
||||
|
||||
### 6.1 Riscos Identificados
|
||||
1. **Breaking changes durante refatoração**
|
||||
- *Mitigação*: Implementar testes abrangentes antes das mudanças
|
||||
|
||||
2. **Regressões de funcionalidade**
|
||||
- *Mitigação*: Refatoração incremental com validação contínua
|
||||
|
||||
3. **Resistência da equipe às mudanças**
|
||||
- *Mitigação*: Documentação clara e treinamento
|
||||
|
||||
### 6.2 Plano de Rollback
|
||||
- Manter branches de feature para cada fase
|
||||
- Implementar feature flags para mudanças críticas
|
||||
- Monitoramento contínuo em produção
|
||||
|
||||
## 7. Conclusão
|
||||
|
||||
Este plano de otimização transformará o aplicativo RDO em uma aplicação moderna, performática e maintível. A implementação incremental garante baixo risco enquanto maximiza os benefícios de cada melhoria.
|
||||
|
||||
A consolidação da arquitetura de estado e a modernização do TypeScript são as prioridades mais altas, pois impactam diretamente na estabilidade e manutenibilidade do código.
|
||||
|
||||
Com a implementação completa deste plano, esperamos:
|
||||
- **50% de redução** no tempo de desenvolvimento de novas features
|
||||
- **30% de melhoria** na performance da aplicação
|
||||
- **90% de redução** em bugs relacionados a tipos
|
||||
- **Experiência de desenvolvimento** significativamente melhorada
|
||||
1106
.trae/documents/Arquitetura_BD_RDO_Completa.md
Normal file
1106
.trae/documents/Arquitetura_BD_RDO_Completa.md
Normal file
File diff suppressed because it is too large
Load Diff
815
.trae/documents/Arquitetura_Tecnica_RDO.md
Normal file
815
.trae/documents/Arquitetura_Tecnica_RDO.md
Normal file
@@ -0,0 +1,815 @@
|
||||
# Documento de Arquitetura Técnica - RDO Mobile App
|
||||
|
||||
## 1. Design da Arquitetura
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A[Usuário Mobile] --> B[React Native/PWA Frontend]
|
||||
B --> C[Supabase SDK]
|
||||
C --> D[Supabase Backend]
|
||||
|
||||
subgraph "Frontend Layer"
|
||||
B
|
||||
E[Zustand State Management]
|
||||
F[React Hook Form]
|
||||
G[Framer Motion]
|
||||
H[Tailwind CSS]
|
||||
end
|
||||
|
||||
subgraph "Backend as a Service (Supabase)"
|
||||
D
|
||||
I[PostgreSQL Database]
|
||||
J[Authentication]
|
||||
K[Storage (Fotos/Docs)]
|
||||
L[Real-time Subscriptions]
|
||||
end
|
||||
|
||||
subgraph "Funcionalidades Offline"
|
||||
M[IndexedDB Cache]
|
||||
N[Service Worker]
|
||||
O[Background Sync]
|
||||
end
|
||||
|
||||
B --> M
|
||||
N --> B
|
||||
O --> C
|
||||
```
|
||||
|
||||
## 2. Descrição das Tecnologias
|
||||
|
||||
* **Frontend**: React\@18 + TypeScript + Vite + Tailwind CSS
|
||||
|
||||
* **Mobile**: PWA (Progressive Web App) com Capacitor para recursos nativos
|
||||
|
||||
* **Estado**: Zustand para gerenciamento de estado global
|
||||
|
||||
* **Formulários**: React Hook Form + Zod para validação
|
||||
|
||||
* **Animações**: Framer Motion para microinterações
|
||||
|
||||
* **UI Components**: Headless UI + Radix UI primitives
|
||||
|
||||
* **Ícones**: Phosphor Icons
|
||||
|
||||
* **Backend**: Supabase (PostgreSQL + Auth + Storage + Real-time)
|
||||
|
||||
* **Cache**: TanStack Query para cache de dados
|
||||
|
||||
* **Offline**: Workbox para service workers
|
||||
|
||||
## 3. Definições de Rotas
|
||||
|
||||
| Rota | Propósito |
|
||||
| ----------------------- | --------------------------------------------- |
|
||||
| / | Dashboard principal com visão geral das obras |
|
||||
| /obra/:id | Detalhes específicos de uma obra |
|
||||
| /obra/:id/rdo/novo | Formulário para criar novo RDO |
|
||||
| /obra/:id/rdo/:rdoId | Visualizar/editar RDO específico |
|
||||
| /obra/:id/tarefas | Lista de tarefas da obra |
|
||||
| /cadastros | Menu principal de cadastros |
|
||||
| /cadastros/obras | Formulário de cadastro de obras |
|
||||
| /cadastros/usuarios | Gerenciamento de usuários |
|
||||
| /cadastros/equipamentos | Cadastro de equipamentos |
|
||||
| <br /> | <br /> |
|
||||
| /cadastros/atividades | Tipos de atividades padrão |
|
||||
| /relatorios | Dashboard de relatórios e exportações |
|
||||
| /perfil | Configurações do usuário |
|
||||
| /configuracoes | Configurações do aplicativo |
|
||||
|
||||
## 4. Definições de API
|
||||
|
||||
### 4.1 APIs Principais
|
||||
|
||||
**Autenticação de Usuário**
|
||||
|
||||
```
|
||||
POST /auth/v1/token
|
||||
```
|
||||
|
||||
Request:
|
||||
|
||||
| Nome do Parâmetro | Tipo | Obrigatório | Descrição |
|
||||
| ----------------- | ------ | ----------- | ---------------- |
|
||||
| email | string | true | Email do usuário |
|
||||
| password | string | true | Senha do usuário |
|
||||
|
||||
Response:
|
||||
|
||||
| Nome do Parâmetro | Tipo | Descrição |
|
||||
| ----------------- | ------ | ---------------------------- |
|
||||
| access\_token | string | Token JWT para autenticação |
|
||||
| user | object | Dados do usuário autenticado |
|
||||
|
||||
**Criar RDO**
|
||||
|
||||
```
|
||||
POST /rest/v1/rdos
|
||||
```
|
||||
|
||||
Request:
|
||||
|
||||
| Nome do Parâmetro | Tipo | Obrigatório | Descrição |
|
||||
| --------------------- | ------ | ----------- | ------------------------------ |
|
||||
| obra\_id | uuid | true | ID da obra |
|
||||
| data\_relatorio | date | true | Data do relatório |
|
||||
| condicoes\_climaticas | string | true | Condições do tempo |
|
||||
| atividades | array | true | Lista de atividades executadas |
|
||||
| mao\_de\_obra | array | false | Funcionários presentes |
|
||||
| equipamentos | array | false | Equipamentos utilizados |
|
||||
| ocorrencias | array | false | Ocorrências registradas |
|
||||
|
||||
Response:
|
||||
|
||||
| Nome do Parâmetro | Tipo | Descrição |
|
||||
| ----------------- | --------- | ------------------- |
|
||||
| id | uuid | ID do RDO criado |
|
||||
| status | string | Status do relatório |
|
||||
| created\_at | timestamp | Data de criação |
|
||||
|
||||
Exemplo:
|
||||
|
||||
```json
|
||||
{
|
||||
"obra_id": "123e4567-e89b-12d3-a456-426614174000",
|
||||
"data_relatorio": "2024-01-15",
|
||||
"condicoes_climaticas": "Ensolarado",
|
||||
"atividades": [
|
||||
{
|
||||
"tipo": "Concretagem",
|
||||
"descricao": "Concretagem da laje do 2º pavimento",
|
||||
"percentual_concluido": 75
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
**Listar Obras**
|
||||
|
||||
```
|
||||
GET /rest/v1/obras
|
||||
```
|
||||
|
||||
Response:
|
||||
|
||||
| Nome do Parâmetro | Tipo | Descrição |
|
||||
| ----------------- | ------ | ---------------------------------------- |
|
||||
| id | uuid | ID da obra |
|
||||
| nome | string | Nome da obra |
|
||||
| endereco | string | Endereço da obra |
|
||||
| status | string | Status atual (ativa, pausada, concluída) |
|
||||
| progresso | number | Percentual de conclusão |
|
||||
|
||||
## 5. Arquitetura do Servidor
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A[Cliente Mobile] --> B[Supabase Edge Functions]
|
||||
B --> C[Supabase Auth]
|
||||
B --> D[PostgreSQL Database]
|
||||
B --> E[Supabase Storage]
|
||||
|
||||
subgraph "Supabase Backend"
|
||||
C
|
||||
D
|
||||
E
|
||||
F[Real-time Engine]
|
||||
G[Row Level Security]
|
||||
end
|
||||
|
||||
subgraph "Edge Functions"
|
||||
H[Geração de Relatórios PDF]
|
||||
I[Processamento de Imagens]
|
||||
J[Notificações Push]
|
||||
end
|
||||
|
||||
B --> H
|
||||
B --> I
|
||||
B --> J
|
||||
```
|
||||
|
||||
## 6. Modelo de Dados
|
||||
|
||||
### 6.1 Definição do Modelo de Dados
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
USUARIOS ||--o{ OBRAS : gerencia
|
||||
USUARIOS ||--o{ RDOS : cria
|
||||
OBRAS ||--o{ RDOS : possui
|
||||
OBRAS ||--o{ TAREFAS : contem
|
||||
RDOS ||--o{ RDO_ATIVIDADES : possui
|
||||
RDOS ||--o{ RDO_MAO_OBRA : registra
|
||||
RDOS ||--o{ RDO_EQUIPAMENTOS : utiliza
|
||||
RDOS ||--o{ RDO_OCORRENCIAS : reporta
|
||||
RDOS ||--o{ RDO_ANEXOS : contem
|
||||
RDOS ||--o{ RDO_INSPECOES_SOLDA : possui
|
||||
RDOS ||--o{ RDO_VERIFICACOES_TORQUE : possui
|
||||
TAREFAS ||--o{ TASK_LOGS : possui
|
||||
USUARIOS ||--o{ TASK_LOGS : executa
|
||||
|
||||
USUARIOS {
|
||||
uuid id PK
|
||||
string email UK
|
||||
string nome
|
||||
string telefone
|
||||
string cargo
|
||||
string role
|
||||
boolean ativo
|
||||
timestamp created_at
|
||||
timestamp updated_at
|
||||
}
|
||||
|
||||
OBRAS {
|
||||
uuid id PK
|
||||
string nome
|
||||
string descricao
|
||||
string endereco
|
||||
string cep
|
||||
string cidade
|
||||
string estado
|
||||
uuid responsavel_id FK
|
||||
date data_inicio
|
||||
date data_prevista_fim
|
||||
decimal progresso_geral
|
||||
string status
|
||||
jsonb configuracoes
|
||||
timestamp created_at
|
||||
timestamp updated_at
|
||||
}
|
||||
|
||||
RDOS {
|
||||
uuid id PK
|
||||
uuid obra_id FK
|
||||
uuid criado_por FK
|
||||
date data_relatorio
|
||||
string condicoes_climaticas
|
||||
text observacoes_gerais
|
||||
string status
|
||||
uuid aprovado_por FK
|
||||
timestamp aprovado_em
|
||||
timestamp created_at
|
||||
timestamp updated_at
|
||||
}
|
||||
|
||||
RDO_ATIVIDADES {
|
||||
uuid id PK
|
||||
uuid rdo_id FK
|
||||
string tipo_atividade
|
||||
text descricao
|
||||
string localizacao
|
||||
decimal percentual_concluido
|
||||
integer ordem
|
||||
timestamp created_at
|
||||
}
|
||||
|
||||
RDO_MAO_OBRA {
|
||||
uuid id PK
|
||||
uuid rdo_id FK
|
||||
string funcao
|
||||
integer quantidade
|
||||
decimal horas_trabalhadas
|
||||
text observacoes
|
||||
timestamp created_at
|
||||
}
|
||||
|
||||
RDO_EQUIPAMENTOS {
|
||||
uuid id PK
|
||||
uuid rdo_id FK
|
||||
string nome_equipamento
|
||||
string tipo
|
||||
decimal horas_utilizadas
|
||||
decimal combustivel_gasto
|
||||
text observacoes
|
||||
timestamp created_at
|
||||
}
|
||||
|
||||
RDO_OCORRENCIAS {
|
||||
uuid id PK
|
||||
uuid rdo_id FK
|
||||
string tipo_ocorrencia
|
||||
text descricao
|
||||
string gravidade
|
||||
text acao_tomada
|
||||
timestamp created_at
|
||||
}
|
||||
|
||||
RDO_ANEXOS {
|
||||
uuid id PK
|
||||
uuid rdo_id FK
|
||||
string nome_arquivo
|
||||
string tipo_arquivo
|
||||
string url_storage
|
||||
integer tamanho_bytes
|
||||
text descricao
|
||||
timestamp created_at
|
||||
}
|
||||
|
||||
RDO_INSPECOES_SOLDA {
|
||||
uuid id PK
|
||||
uuid rdo_id FK
|
||||
string identificacao_junta
|
||||
string status_inspecao
|
||||
string metodo_inspecao
|
||||
text observacoes
|
||||
uuid inspecionado_por FK
|
||||
timestamp created_at
|
||||
}
|
||||
|
||||
RDO_VERIFICACOES_TORQUE {
|
||||
uuid id PK
|
||||
uuid rdo_id FK
|
||||
string identificacao_parafuso
|
||||
decimal torque_especificado
|
||||
decimal torque_aplicado
|
||||
string status_verificacao
|
||||
text observacoes
|
||||
uuid verificado_por FK
|
||||
timestamp created_at
|
||||
}
|
||||
|
||||
TAREFAS {
|
||||
uuid id PK
|
||||
uuid obra_id FK
|
||||
string titulo
|
||||
text descricao
|
||||
string status
|
||||
string prioridade
|
||||
uuid responsavel_id FK
|
||||
date data_inicio
|
||||
date data_fim
|
||||
decimal progresso
|
||||
jsonb metadados
|
||||
timestamp created_at
|
||||
timestamp updated_at
|
||||
}
|
||||
|
||||
TASK_LOGS {
|
||||
uuid id PK
|
||||
uuid task_id FK
|
||||
uuid usuario_id FK
|
||||
string tipo_evento
|
||||
text descricao
|
||||
jsonb detalhes
|
||||
timestamp created_at
|
||||
}
|
||||
RDOS ||--o{ OCORRENCIAS : possui
|
||||
RDOS ||--o{ ANEXOS : contem
|
||||
OBRAS ||--o{ TAREFAS : possui
|
||||
EQUIPAMENTOS ||--o{ EQUIPAMENTOS_UTILIZADOS : referencia
|
||||
|
||||
USUARIOS {
|
||||
uuid id PK
|
||||
string email
|
||||
string nome
|
||||
string funcao
|
||||
string telefone
|
||||
timestamp created_at
|
||||
timestamp updated_at
|
||||
}
|
||||
|
||||
OBRAS {
|
||||
uuid id PK
|
||||
string nome
|
||||
string endereco
|
||||
string descricao
|
||||
date data_inicio
|
||||
date data_prevista_fim
|
||||
string status
|
||||
decimal progresso_percentual
|
||||
uuid responsavel_id FK
|
||||
timestamp created_at
|
||||
}
|
||||
|
||||
RDOS {
|
||||
uuid id PK
|
||||
uuid obra_id FK
|
||||
uuid criado_por FK
|
||||
date data_relatorio
|
||||
string condicoes_climaticas
|
||||
text observacoes_gerais
|
||||
string status
|
||||
timestamp created_at
|
||||
}
|
||||
|
||||
ATIVIDADES {
|
||||
uuid id PK
|
||||
uuid rdo_id FK
|
||||
string tipo_atividade
|
||||
text descricao
|
||||
string localizacao
|
||||
decimal percentual_concluido
|
||||
time hora_inicio
|
||||
time hora_fim
|
||||
}
|
||||
|
||||
MAO_DE_OBRA {
|
||||
uuid id PK
|
||||
uuid rdo_id FK
|
||||
string nome_funcionario
|
||||
string funcao
|
||||
decimal horas_trabalhadas
|
||||
boolean presente
|
||||
}
|
||||
|
||||
EQUIPAMENTOS {
|
||||
uuid id PK
|
||||
string nome
|
||||
string tipo
|
||||
string modelo
|
||||
string status
|
||||
text observacoes
|
||||
}
|
||||
|
||||
EQUIPAMENTOS_UTILIZADOS {
|
||||
uuid id PK
|
||||
uuid rdo_id FK
|
||||
uuid equipamento_id FK
|
||||
decimal horas_operacao
|
||||
decimal combustivel_consumido
|
||||
text observacoes
|
||||
}
|
||||
|
||||
OCORRENCIAS {
|
||||
uuid id PK
|
||||
uuid rdo_id FK
|
||||
string tipo
|
||||
text descricao
|
||||
string gravidade
|
||||
boolean resolvida
|
||||
}
|
||||
|
||||
ANEXOS {
|
||||
uuid id PK
|
||||
uuid rdo_id FK
|
||||
string tipo
|
||||
string url_arquivo
|
||||
string nome_arquivo
|
||||
text descricao
|
||||
}
|
||||
|
||||
TAREFAS {
|
||||
uuid id PK
|
||||
uuid obra_id FK
|
||||
string titulo
|
||||
text descricao
|
||||
date data_prevista
|
||||
string status
|
||||
string prioridade
|
||||
uuid responsavel_id FK
|
||||
}
|
||||
```
|
||||
|
||||
### 6.2 Linguagem de Definição de Dados (DDL)
|
||||
|
||||
**Tabela de Usuários (usuarios)**
|
||||
```sql
|
||||
-- Criar tabela
|
||||
CREATE TABLE usuarios (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
email VARCHAR(255) UNIQUE NOT NULL,
|
||||
nome VARCHAR(100) NOT NULL,
|
||||
telefone VARCHAR(20),
|
||||
cargo VARCHAR(100),
|
||||
role VARCHAR(20) DEFAULT 'user' CHECK (role IN ('admin', 'supervisor', 'user')),
|
||||
ativo BOOLEAN DEFAULT true,
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Criar índices
|
||||
CREATE INDEX idx_usuarios_email ON usuarios(email);
|
||||
CREATE INDEX idx_usuarios_role ON usuarios(role);
|
||||
CREATE INDEX idx_usuarios_ativo ON usuarios(ativo);
|
||||
|
||||
-- Dados iniciais
|
||||
INSERT INTO usuarios (email, nome, cargo, role) VALUES
|
||||
('admin@rdo.com', 'Administrador', 'Gerente de Projeto', 'admin'),
|
||||
('supervisor@rdo.com', 'Supervisor', 'Supervisor de Obra', 'supervisor'),
|
||||
('user@rdo.com', 'Usuário Padrão', 'Técnico', 'user');
|
||||
```
|
||||
|
||||
**Tabela de Obras (obras)**
|
||||
```sql
|
||||
CREATE TABLE obras (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
nome VARCHAR(255) NOT NULL,
|
||||
descricao TEXT,
|
||||
endereco TEXT,
|
||||
cep VARCHAR(10),
|
||||
cidade VARCHAR(100),
|
||||
estado VARCHAR(2),
|
||||
responsavel_id UUID REFERENCES usuarios(id),
|
||||
data_inicio DATE,
|
||||
data_prevista_fim DATE,
|
||||
progresso_geral DECIMAL(5,2) DEFAULT 0.00,
|
||||
status VARCHAR(20) DEFAULT 'planejamento' CHECK (status IN ('planejamento', 'em_andamento', 'pausada', 'concluida', 'cancelada')),
|
||||
configuracoes JSONB DEFAULT '{}',
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE INDEX idx_obras_responsavel ON obras(responsavel_id);
|
||||
CREATE INDEX idx_obras_status ON obras(status);
|
||||
CREATE INDEX idx_obras_data_inicio ON obras(data_inicio);
|
||||
```
|
||||
|
||||
**Tabela de RDOs (rdos)**
|
||||
```sql
|
||||
CREATE TABLE rdos (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
obra_id UUID NOT NULL REFERENCES obras(id),
|
||||
criado_por UUID NOT NULL REFERENCES usuarios(id),
|
||||
data_relatorio DATE NOT NULL,
|
||||
condicoes_climaticas VARCHAR(100),
|
||||
observacoes_gerais TEXT,
|
||||
status VARCHAR(20) DEFAULT 'rascunho' CHECK (status IN ('rascunho', 'enviado', 'aprovado', 'rejeitado')),
|
||||
aprovado_por UUID REFERENCES usuarios(id),
|
||||
aprovado_em TIMESTAMP WITH TIME ZONE,
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE INDEX idx_rdos_obra ON rdos(obra_id);
|
||||
CREATE INDEX idx_rdos_criado_por ON rdos(criado_por);
|
||||
CREATE INDEX idx_rdos_data_relatorio ON rdos(data_relatorio);
|
||||
CREATE INDEX idx_rdos_status ON rdos(status);
|
||||
```
|
||||
|
||||
**Tabela de Atividades do RDO (rdo_atividades)**
|
||||
```sql
|
||||
CREATE TABLE rdo_atividades (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
rdo_id UUID NOT NULL REFERENCES rdos(id) ON DELETE CASCADE,
|
||||
tipo_atividade VARCHAR(100) NOT NULL,
|
||||
descricao TEXT,
|
||||
localizacao VARCHAR(255),
|
||||
percentual_concluido DECIMAL(5,2) DEFAULT 0.00,
|
||||
ordem INTEGER DEFAULT 0,
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE INDEX idx_rdo_atividades_rdo ON rdo_atividades(rdo_id);
|
||||
CREATE INDEX idx_rdo_atividades_tipo ON rdo_atividades(tipo_atividade);
|
||||
```
|
||||
|
||||
**Tabela de Mão de Obra (rdo_mao_obra)**
|
||||
```sql
|
||||
CREATE TABLE rdo_mao_obra (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
rdo_id UUID NOT NULL REFERENCES rdos(id) ON DELETE CASCADE,
|
||||
funcao VARCHAR(100) NOT NULL,
|
||||
quantidade INTEGER NOT NULL DEFAULT 1,
|
||||
horas_trabalhadas DECIMAL(5,2) NOT NULL DEFAULT 0.00,
|
||||
observacoes TEXT,
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE INDEX idx_rdo_mao_obra_rdo ON rdo_mao_obra(rdo_id);
|
||||
CREATE INDEX idx_rdo_mao_obra_funcao ON rdo_mao_obra(funcao);
|
||||
```
|
||||
|
||||
**Tabela de Equipamentos (rdo_equipamentos)**
|
||||
```sql
|
||||
CREATE TABLE rdo_equipamentos (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
rdo_id UUID NOT NULL REFERENCES rdos(id) ON DELETE CASCADE,
|
||||
nome_equipamento VARCHAR(255) NOT NULL,
|
||||
tipo VARCHAR(100),
|
||||
horas_utilizadas DECIMAL(5,2) DEFAULT 0.00,
|
||||
combustivel_gasto DECIMAL(8,2) DEFAULT 0.00,
|
||||
observacoes TEXT,
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE INDEX idx_rdo_equipamentos_rdo ON rdo_equipamentos(rdo_id);
|
||||
CREATE INDEX idx_rdo_equipamentos_tipo ON rdo_equipamentos(tipo);
|
||||
```
|
||||
|
||||
**Tabela de Ocorrências (rdo_ocorrencias)**
|
||||
```sql
|
||||
CREATE TABLE rdo_ocorrencias (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
rdo_id UUID NOT NULL REFERENCES rdos(id) ON DELETE CASCADE,
|
||||
tipo_ocorrencia VARCHAR(100) NOT NULL,
|
||||
descricao TEXT NOT NULL,
|
||||
gravidade VARCHAR(20) DEFAULT 'baixa' CHECK (gravidade IN ('baixa', 'media', 'alta', 'critica')),
|
||||
acao_tomada TEXT,
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE INDEX idx_rdo_ocorrencias_rdo ON rdo_ocorrencias(rdo_id);
|
||||
CREATE INDEX idx_rdo_ocorrencias_tipo ON rdo_ocorrencias(tipo_ocorrencia);
|
||||
CREATE INDEX idx_rdo_ocorrencias_gravidade ON rdo_ocorrencias(gravidade);
|
||||
```
|
||||
|
||||
**Tabela de Anexos (rdo_anexos)**
|
||||
```sql
|
||||
CREATE TABLE rdo_anexos (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
rdo_id UUID NOT NULL REFERENCES rdos(id) ON DELETE CASCADE,
|
||||
nome_arquivo VARCHAR(255) NOT NULL,
|
||||
tipo_arquivo VARCHAR(50),
|
||||
url_storage TEXT NOT NULL,
|
||||
tamanho_bytes INTEGER,
|
||||
descricao TEXT,
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE INDEX idx_rdo_anexos_rdo ON rdo_anexos(rdo_id);
|
||||
CREATE INDEX idx_rdo_anexos_tipo ON rdo_anexos(tipo_arquivo);
|
||||
```
|
||||
|
||||
**Tabela de Inspeções de Solda (rdo_inspecoes_solda)**
|
||||
```sql
|
||||
CREATE TABLE rdo_inspecoes_solda (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
rdo_id UUID NOT NULL REFERENCES rdos(id) ON DELETE CASCADE,
|
||||
identificacao_junta VARCHAR(100) NOT NULL,
|
||||
status_inspecao VARCHAR(20) DEFAULT 'pendente' CHECK (status_inspecao IN ('pendente', 'aprovada', 'rejeitada', 'retrabalho')),
|
||||
metodo_inspecao VARCHAR(100),
|
||||
observacoes TEXT,
|
||||
inspecionado_por UUID REFERENCES usuarios(id),
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE INDEX idx_rdo_inspecoes_solda_rdo ON rdo_inspecoes_solda(rdo_id);
|
||||
CREATE INDEX idx_rdo_inspecoes_solda_status ON rdo_inspecoes_solda(status_inspecao);
|
||||
```
|
||||
|
||||
**Tabela de Verificações de Torque (rdo_verificacoes_torque)**
|
||||
```sql
|
||||
CREATE TABLE rdo_verificacoes_torque (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
rdo_id UUID NOT NULL REFERENCES rdos(id) ON DELETE CASCADE,
|
||||
identificacao_parafuso VARCHAR(100) NOT NULL,
|
||||
torque_especificado DECIMAL(8,2) NOT NULL,
|
||||
torque_aplicado DECIMAL(8,2) NOT NULL,
|
||||
status_verificacao VARCHAR(20) DEFAULT 'conforme' CHECK (status_verificacao IN ('conforme', 'nao_conforme', 'retrabalho')),
|
||||
observacoes TEXT,
|
||||
verificado_por UUID REFERENCES usuarios(id),
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE INDEX idx_rdo_verificacoes_torque_rdo ON rdo_verificacoes_torque(rdo_id);
|
||||
CREATE INDEX idx_rdo_verificacoes_torque_status ON rdo_verificacoes_torque(status_verificacao);
|
||||
```
|
||||
|
||||
**Tabela de Tarefas (tarefas)**
|
||||
```sql
|
||||
CREATE TABLE tarefas (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
obra_id UUID NOT NULL REFERENCES obras(id),
|
||||
titulo VARCHAR(255) NOT NULL,
|
||||
descricao TEXT,
|
||||
status VARCHAR(20) DEFAULT 'pendente' CHECK (status IN ('pendente', 'em_andamento', 'concluida', 'cancelada')),
|
||||
prioridade VARCHAR(20) DEFAULT 'media' CHECK (prioridade IN ('baixa', 'media', 'alta', 'urgente')),
|
||||
responsavel_id UUID REFERENCES usuarios(id),
|
||||
data_inicio DATE,
|
||||
data_fim DATE,
|
||||
progresso DECIMAL(5,2) DEFAULT 0.00,
|
||||
metadados JSONB DEFAULT '{}',
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE INDEX idx_tarefas_obra ON tarefas(obra_id);
|
||||
CREATE INDEX idx_tarefas_responsavel ON tarefas(responsavel_id);
|
||||
CREATE INDEX idx_tarefas_status ON tarefas(status);
|
||||
CREATE INDEX idx_tarefas_prioridade ON tarefas(prioridade);
|
||||
```
|
||||
|
||||
**Tabela de Logs de Tarefas (task_logs)**
|
||||
```sql
|
||||
CREATE TABLE task_logs (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
task_id UUID NOT NULL REFERENCES tarefas(id) ON DELETE CASCADE,
|
||||
usuario_id UUID NOT NULL REFERENCES usuarios(id),
|
||||
tipo_evento VARCHAR(50) NOT NULL,
|
||||
descricao TEXT,
|
||||
detalhes JSONB DEFAULT '{}',
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE INDEX idx_task_logs_task ON task_logs(task_id);
|
||||
CREATE INDEX idx_task_logs_usuario ON task_logs(usuario_id);
|
||||
CREATE INDEX idx_task_logs_tipo ON task_logs(tipo_evento);
|
||||
CREATE INDEX idx_task_logs_created_at ON task_logs(created_at DESC);
|
||||
```
|
||||
|
||||
**Tabela de Obras**
|
||||
|
||||
```sql
|
||||
-- Criar tabela de obras
|
||||
CREATE TABLE obras (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
nome VARCHAR(200) NOT NULL,
|
||||
endereco TEXT NOT NULL,
|
||||
descricao TEXT,
|
||||
data_inicio DATE NOT NULL,
|
||||
data_prevista_fim DATE,
|
||||
status VARCHAR(20) DEFAULT 'ativa' CHECK (status IN ('ativa', 'pausada', 'concluida')),
|
||||
progresso_percentual DECIMAL(5,2) DEFAULT 0.00,
|
||||
responsavel_id UUID REFERENCES usuarios(id),
|
||||
orcamento_total DECIMAL(15,2),
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Criar índices
|
||||
CREATE INDEX idx_obras_status ON obras(status);
|
||||
CREATE INDEX idx_obras_responsavel ON obras(responsavel_id);
|
||||
CREATE INDEX idx_obras_data_inicio ON obras(data_inicio DESC);
|
||||
|
||||
-- Políticas RLS
|
||||
ALTER TABLE obras ENABLE ROW LEVEL SECURITY;
|
||||
|
||||
CREATE POLICY "Usuários podem ver obras que participam" ON obras
|
||||
FOR SELECT USING (
|
||||
responsavel_id = auth.uid() OR
|
||||
EXISTS (
|
||||
SELECT 1 FROM usuarios
|
||||
WHERE id = auth.uid() AND funcao IN ('Gestor', 'Engenheiro')
|
||||
)
|
||||
);
|
||||
|
||||
-- Permissões
|
||||
GRANT SELECT ON obras TO anon;
|
||||
GRANT ALL PRIVILEGES ON obras TO authenticated;
|
||||
```
|
||||
|
||||
**Tabela de RDOs**
|
||||
|
||||
```sql
|
||||
-- Criar tabela de RDOs
|
||||
CREATE TABLE rdos (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
obra_id UUID NOT NULL REFERENCES obras(id) ON DELETE CASCADE,
|
||||
criado_por UUID NOT NULL REFERENCES usuarios(id),
|
||||
data_relatorio DATE NOT NULL,
|
||||
condicoes_climaticas VARCHAR(50) NOT NULL,
|
||||
temperatura_min DECIMAL(4,1),
|
||||
temperatura_max DECIMAL(4,1),
|
||||
observacoes_gerais TEXT,
|
||||
status VARCHAR(20) DEFAULT 'rascunho' CHECK (status IN ('rascunho', 'enviado', 'aprovado')),
|
||||
aprovado_por UUID REFERENCES usuarios(id),
|
||||
aprovado_em TIMESTAMP WITH TIME ZONE,
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Criar índices
|
||||
CREATE INDEX idx_rdos_obra_id ON rdos(obra_id);
|
||||
CREATE INDEX idx_rdos_data_relatorio ON rdos(data_relatorio DESC);
|
||||
CREATE INDEX idx_rdos_status ON rdos(status);
|
||||
CREATE INDEX idx_rdos_criado_por ON rdos(criado_por);
|
||||
|
||||
-- Constraint única para evitar múltiplos RDOs na mesma data/obra
|
||||
CREATE UNIQUE INDEX idx_rdos_obra_data_unique ON rdos(obra_id, data_relatorio);
|
||||
|
||||
-- Políticas RLS
|
||||
ALTER TABLE rdos ENABLE ROW LEVEL SECURITY;
|
||||
|
||||
CREATE POLICY "Usuários podem ver RDOs das suas obras" ON rdos
|
||||
FOR SELECT USING (
|
||||
EXISTS (
|
||||
SELECT 1 FROM obras
|
||||
WHERE id = obra_id AND (
|
||||
responsavel_id = auth.uid() OR
|
||||
EXISTS (
|
||||
SELECT 1 FROM usuarios
|
||||
WHERE usuarios.id = auth.uid() AND funcao IN ('Gestor', 'Engenheiro')
|
||||
)
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
-- Permissões
|
||||
GRANT SELECT ON rdos TO anon;
|
||||
GRANT ALL PRIVILEGES ON rdos TO authenticated;
|
||||
```
|
||||
|
||||
**Dados Iniciais**
|
||||
|
||||
```sql
|
||||
-- Inserir tipos de atividades padrão
|
||||
INSERT INTO tipos_atividades (nome, categoria) VALUES
|
||||
('Escavação', 'Terraplanagem'),
|
||||
('Fundação', 'Estrutura'),
|
||||
('Concretagem', 'Estrutura'),
|
||||
('Alvenaria', 'Vedação'),
|
||||
('Instalação Elétrica', 'Instalações'),
|
||||
('Instalação Hidráulica', 'Instalações'),
|
||||
('Revestimento', 'Acabamento'),
|
||||
('Pintura', 'Acabamento');
|
||||
|
||||
-- Inserir condições climáticas padrão
|
||||
INSERT INTO condicoes_climaticas (descricao) VALUES
|
||||
('Ensolarado'),
|
||||
('Parcialmente Nublado'),
|
||||
('Nublado'),
|
||||
('Chuvisco'),
|
||||
('Chuva Leve'),
|
||||
('Chuva Forte'),
|
||||
('Tempestade');
|
||||
```
|
||||
|
||||
129
.trae/documents/PRD_RDO_Mobile_App.md
Normal file
129
.trae/documents/PRD_RDO_Mobile_App.md
Normal file
@@ -0,0 +1,129 @@
|
||||
# Documento de Requisitos do Produto - App RDO Mobile
|
||||
|
||||
## 1. Visão Geral do Produto
|
||||
|
||||
O **RDO Mobile** é um aplicativo mobile-first para registro e acompanhamento diário de atividades em obras de construção civil. O app facilita o processo de criação de Relatórios Diários de Obra (RDO), permitindo que engenheiros, mestres de obra e gestores registrem atividades, mão de obra, equipamentos, condições climáticas e ocorrências de forma prática e organizada.
|
||||
|
||||
O produto visa substituir os relatórios em papel ou Excel por uma solução digital moderna, melhorando a comunicação entre canteiro de obra, escritório e clientes, proporcionando acompanhamento em tempo real do progresso das obras.
|
||||
|
||||
## 2. Funcionalidades Principais
|
||||
|
||||
### 2.1 Papéis de Usuário
|
||||
|
||||
| Papel | Método de Registro | Permissões Principais |
|
||||
|-------|-------------------|----------------------|
|
||||
| Mestre de Obra | Cadastro por convite | Criar e editar RDOs, registrar atividades, gerenciar mão de obra |
|
||||
| Engenheiro | Cadastro por convite | Todas as permissões + aprovar RDOs, gerar relatórios |
|
||||
| Gestor | Cadastro administrativo | Visualizar todas as obras, relatórios consolidados, gerenciar usuários |
|
||||
| Cliente | Acesso por convite | Visualizar progresso da obra, relatórios aprovados |
|
||||
|
||||
### 2.2 Módulos Funcionais
|
||||
|
||||
Nosso aplicativo RDO Mobile consiste nas seguintes páginas principais:
|
||||
|
||||
1. **Dashboard Principal**: visão geral das obras, indicadores de progresso, últimas atividades
|
||||
2. **Detalhes da Obra**: informações específicas da obra, histórico de RDOs, galeria de fotos
|
||||
3. **Criar RDO**: formulário completo para registro diário de atividades
|
||||
4. **Lista de Tarefas**: gerenciamento de atividades planejadas e executadas
|
||||
5. **Cadastros**: formulários para obras, usuários, equipamentos e tipos de atividades
|
||||
6. **Relatórios**: visualização e exportação de relatórios consolidados
|
||||
|
||||
### 2.3 Detalhes das Páginas
|
||||
|
||||
| Nome da Página | Nome do Módulo | Descrição da Funcionalidade |
|
||||
|----------------|----------------|-----------------------------|
|
||||
| Dashboard Principal | Visão Geral | Exibir cards das obras ativas, indicadores de progresso, últimos RDOs criados, notificações importantes |
|
||||
| Dashboard Principal | Navegação Rápida | Acesso rápido para criar novo RDO, visualizar obras, acessar cadastros |
|
||||
| Detalhes da Obra | Informações da Obra | Mostrar dados da obra, cronograma, responsáveis, localização |
|
||||
| Detalhes da Obra | Histórico RDO | Listar RDOs anteriores com filtros por data, status, responsável |
|
||||
| Detalhes da Obra | Galeria de Fotos | Visualizar fotos organizadas por data, com zoom e compartilhamento |
|
||||
| Criar RDO | Informações Básicas | Campos para data, obra, responsável, condições climáticas |
|
||||
| Criar RDO | Atividades Executadas | Adicionar atividades com descrição, localização, percentual concluído |
|
||||
| Criar RDO | Mão de Obra | Registrar funcionários presentes, horas trabalhadas, função |
|
||||
| Criar RDO | Equipamentos | Listar equipamentos utilizados, horas de operação, combustível |
|
||||
| Criar RDO | Ocorrências | Registrar problemas, acidentes, atrasos com descrição detalhada |
|
||||
| Criar RDO | Anexos | Adicionar fotos, documentos, assinaturas digitais |
|
||||
| Lista de Tarefas | Tarefas Planejadas | Visualizar atividades programadas para o dia/semana |
|
||||
| Lista de Tarefas | Controle de Execução | Marcar tarefas como iniciadas, em andamento, concluídas |
|
||||
| Lista de Tarefas | Progresso Visual | Mostrar percentual de conclusão com barras de progresso |
|
||||
| Cadastros | Cadastro de Obras | Formulário com dados da obra, endereço, responsáveis, cronograma |
|
||||
| Cadastros | Cadastro de Usuários | Registrar funcionários com foto, função, permissões |
|
||||
| Cadastros | Cadastro de Equipamentos | Listar equipamentos com especificações, manutenção, disponibilidade |
|
||||
| Cadastros | Tipos de Atividades | Definir categorias de atividades padrão para seleção rápida |
|
||||
| Relatórios | Relatórios Consolidados | Gerar relatórios por período, obra, tipo de atividade |
|
||||
| Relatórios | Exportação | Exportar relatórios em PDF, Excel, compartilhar por email/WhatsApp |
|
||||
|
||||
## 3. Fluxo Principal
|
||||
|
||||
**Fluxo do Mestre de Obra:**
|
||||
1. Acessa o dashboard e visualiza as obras sob sua responsabilidade
|
||||
2. Seleciona uma obra específica para trabalhar
|
||||
3. Cria um novo RDO diário preenchendo todas as seções obrigatórias
|
||||
4. Adiciona fotos e registra ocorrências se necessário
|
||||
5. Submete o RDO para aprovação do engenheiro
|
||||
6. Acompanha o status das tarefas planejadas
|
||||
|
||||
**Fluxo do Engenheiro:**
|
||||
1. Revisa RDOs pendentes de aprovação
|
||||
2. Analisa o progresso geral das obras no dashboard
|
||||
3. Gera relatórios consolidados para apresentação
|
||||
4. Gerencia cadastros de equipamentos e atividades
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A[Dashboard Principal] --> B[Selecionar Obra]
|
||||
B --> C[Detalhes da Obra]
|
||||
C --> D[Criar Novo RDO]
|
||||
C --> E[Lista de Tarefas]
|
||||
C --> F[Histórico RDOs]
|
||||
D --> G[Preencher Atividades]
|
||||
G --> H[Registrar Mão de Obra]
|
||||
H --> I[Adicionar Equipamentos]
|
||||
I --> J[Registrar Ocorrências]
|
||||
J --> K[Anexar Fotos]
|
||||
K --> L[Submeter RDO]
|
||||
A --> M[Cadastros]
|
||||
M --> N[Obras]
|
||||
M --> O[Usuários]
|
||||
M --> P[Equipamentos]
|
||||
A --> Q[Relatórios]
|
||||
```
|
||||
|
||||
## 4. Design da Interface do Usuário
|
||||
|
||||
### 4.1 Estilo de Design
|
||||
|
||||
- **Cores Primárias**: Azul #2563EB (confiança, profissionalismo), Laranja #F97316 (energia, ação)
|
||||
- **Cores Secundárias**: Cinza #64748B (neutro), Verde #10B981 (sucesso), Vermelho #EF4444 (alertas)
|
||||
- **Estilo dos Botões**: Neumorphism com bordas arredondadas (12px), sombras sutis, efeitos de pressão
|
||||
- **Tipografia**: Inter (títulos 18-24px), Open Sans (corpo 14-16px), peso regular e semi-bold
|
||||
- **Layout**: Cards com Glassmorphism, navegação bottom tab, espaçamentos de 16px/24px
|
||||
- **Ícones**: Phosphor Icons com estilo outline, tamanho 24px para ações principais
|
||||
|
||||
### 4.2 Visão Geral do Design das Páginas
|
||||
|
||||
| Nome da Página | Nome do Módulo | Elementos da UI |
|
||||
|----------------|----------------|----------------|
|
||||
| Dashboard Principal | Cards de Obras | Cards com glassmorphism, gradiente sutil azul-roxo, sombra 0 4px 20px rgba(0,0,0,0.1), bordas arredondadas 16px |
|
||||
| Dashboard Principal | Indicadores | Gráficos circulares com animação, cores verde/amarelo/vermelho para status, fonte Inter 14px |
|
||||
| Dashboard Principal | Navegação | Bottom navigation com 5 tabs, ícones Phosphor, background blur, altura 80px |
|
||||
| Criar RDO | Formulário | Floating labels com animação, campos com border-radius 12px, validação em tempo real com cores |
|
||||
| Criar RDO | Seções Expansíveis | Accordion com ícones de seta, transição suave 300ms, background rgba(255,255,255,0.1) |
|
||||
| Lista de Tarefas | Cards de Tarefa | Swipe actions (verde para concluir, vermelho para excluir), checkbox animado, progress bar |
|
||||
| Lista de Tarefas | Filtros | Chips com seleção múltipla, cores Material Design 3, espaçamento 8px |
|
||||
| Cadastros | Formulários | Stepper horizontal, campos agrupados em cards, botões flutuantes para ações |
|
||||
| Relatórios | Gráficos | Charts.js com tema dark/light, cores consistentes, animações de entrada |
|
||||
|
||||
### 4.3 Responsividade
|
||||
|
||||
**Mobile-first** com adaptação para tablets. Layouts flexíveis usando CSS Grid e Flexbox, tamanhos em rem (base 16px), espaçamentos escaláveis (16px/24px/32px). Safe areas para dispositivos com notch/dynamic island. Suporte a orientação portrait e landscape para tablets.
|
||||
|
||||
**Gestos de Navegação:**
|
||||
- Swipe para direita: voltar à tela anterior
|
||||
- Swipe para baixo: pull-to-refresh nas listas
|
||||
- Swipe horizontal em cards: ações rápidas (editar/excluir)
|
||||
- Long press: menu contextual
|
||||
- Pinch to zoom: galeria de fotos
|
||||
|
||||
**Dark Mode Automático:**
|
||||
Detecção da preferência do sistema com toggle manual. Paleta adaptada: backgrounds #1F2937, cards #374151, textos #F9FAFB, acentos mantidos com ajuste de saturação.
|
||||
Reference in New Issue
Block a user