entregas_app/docs/ARQUITETURA_COMPLETA_APLICA...

627 lines
16 KiB
Markdown

# Arquitetura Completa do Aplicativo de Entregas
## Visão Geral
O aplicativo de entregas é uma solução mobile desenvolvida em React Native com Expo, projetada para gerenciar entregas de forma eficiente com funcionalidades offline e sincronização de dados.
## Tecnologias Utilizadas
### Framework e Plataforma
- **React Native**: Framework principal para desenvolvimento mobile
- **Expo**: Plataforma de desenvolvimento e deploy
- **TypeScript**: Linguagem de programação com tipagem estática
### Bibliotecas Principais
- **React Navigation**: Navegação entre telas
- **Expo SQLite**: Banco de dados local
- **AsyncStorage**: Armazenamento local de dados
- **Expo Maps**: Integração com mapas
- **Expo Location**: Serviços de localização
- **Expo Camera**: Captura de fotos
- **Expo Notifications**: Notificações push
- **Axios**: Cliente HTTP para APIs
- **React Native Vector Icons**: Ícones
## Arquitetura do Aplicativo
### Estrutura de Pastas
```
src/
├── components/ # Componentes reutilizáveis
├── contexts/ # Contextos React (estado global)
├── hooks/ # Hooks customizados
├── navigation/ # Configuração de navegação
├── screens/ # Telas do aplicativo
│ ├── auth/ # Telas de autenticação
│ └── main/ # Telas principais
├── services/ # Serviços e APIs
├── types/ # Definições de tipos TypeScript
├── constants/ # Constantes e temas
└── config/ # Configurações
```
### Contextos de Estado Global
#### 1. AuthContext
**Arquivo**: `src/contexts/AuthContext.tsx`
**Responsabilidades**:
- Gerenciar autenticação do usuário
- Controlar login/logout
- Armazenar dados do usuário
- Verificar necessidade de roteirização
**Estados**:
- `user`: Dados do usuário logado
- `isLoading`: Estado de carregamento
- `signIn()`: Função de login
- `signOut()`: Função de logout
#### 2. DeliveriesContext
**Arquivo**: `src/contexts/DeliveriesContext.tsx`
**Responsabilidades**:
- Gerenciar lista de entregas
- Controlar carregamento e refresh
- Implementar roteirização automática com TSP
- Ordenar entregas por sequência
**Estados**:
- `deliveries`: Lista de entregas
- `loading`: Estado de carregamento
- `error`: Mensagens de erro
- `refreshDeliveries()`: Atualizar entregas
- `forceRefresh()`: Forçar atualização
#### 3. SyncContext
**Arquivo**: `src/contexts/SyncContext.tsx`
**Responsabilidades**:
- Monitorar estado da conexão
- Gerenciar sincronização de dados
- Controlar fila de sincronização
**Estados**:
- `isOnline`: Status da conexão
- `isSyncing`: Estado de sincronização
- `lastSyncTime`: Timestamp da última sincronização
- `pendingSyncCount`: Contador de itens pendentes
- `syncNow()`: Executar sincronização
#### 4. OfflineContext
**Arquivo**: `src/contexts/OfflineContext.tsx`
**Responsabilidades**:
- Gerenciar modo offline
- Controlar armazenamento offline
- Monitorar sinal de conexão
- Gerenciar fila de sincronização
**Estados**:
- `isOfflineMode`: Modo offline ativo
- `offlineStats`: Estatísticas de dados offline
- `pendingSyncCount`: Itens pendentes
- `saveOfflineData()`: Salvar dados offline
- `syncOfflineData()`: Sincronizar dados
## Sistema de Navegação
### Estrutura de Navegação
```
App
├── AuthNavigator (Stack)
│ └── LoginScreen
└── MainNavigator (Stack)
├── RoutingScreen (Modal)
└── TabNavigator
├── HomeScreen
├── RoutesScreen
├── DeliveriesStack (Stack)
│ ├── DeliveriesScreen
│ ├── DeliveryDetailScreen
│ ├── CompleteDeliveryScreen
│ ├── RescheduleDeliveryScreen
│ └── DeliverySuccessScreen
└── ProfileScreen
```
### Fluxo de Navegação
1. **Login**: Usuário faz login na `LoginScreen`
2. **Verificação de Roteirização**: Sistema verifica se entregas precisam de roteamento
3. **RoutingScreen**: Se necessário, usuário é direcionado para roteirização
4. **HomeScreen**: Tela principal com próxima entrega
5. **Detalhes**: Navegação para detalhes da entrega
6. **Finalização**: Processo de conclusão da entrega
## Telas do Aplicativo
### 1. LoginScreen
**Arquivo**: `src/screens/auth/LoginScreen.tsx`
**Funcionalidades**:
- Formulário de login (username/password)
- Validação de credenciais
- Redirecionamento baseado em necessidade de roteirização
- Indicador de carregamento
- Suporte a login social (preparado)
**Estados**:
- `username`: Nome de usuário
- `password`: Senha
- `isLoading`: Estado de carregamento
- `showPassword`: Visibilidade da senha
### 2. HomeScreen
**Arquivo**: `src/screens/main/HomeScreen.tsx`
**Funcionalidades**:
- Exibição da próxima entrega
- Estatísticas de entregas (pendentes, em rota, entregues, falhas)
- Card de sincronização pendente
- Verificação automática de roteirização
- Navegação para detalhes da entrega
**Componentes Principais**:
- Header com saudação e status de conexão
- Cards de estatísticas
- Card da próxima entrega
- Botões de ação
### 3. RoutesScreen
**Arquivo**: `src/screens/main/RoutesScreen.tsx`
**Funcionalidades**:
- Visualização de mapa com entregas
- Alternância entre visualização de mapa e lista
- Cálculo automático de rotas otimizadas
- Envio de roteirização para API
- Modo tela cheia
**Componentes**:
- DeliveryMap: Componente de mapa
- Lista de entregas
- Controles de visualização
### 4. DeliveriesScreen
**Arquivo**: `src/screens/main/DeliveriesScreen.tsx`
**Funcionalidades**:
- Lista completa de entregas
- Filtros por status
- Ordenação por diferentes critérios
- Busca de entregas
- Navegação para detalhes
**Filtros Disponíveis**:
- Status: pending, in_progress, delivered, failed
- Ordenação: deliverySeq, customerName, distance, outDate
- Ordem: ascendente/descendente
### 5. DeliveryDetailScreen
**Arquivo**: `src/screens/main/DeliveryDetailScreen.tsx`
**Funcionalidades**:
- Exibição detalhada da entrega
- Informações do cliente
- Notas fiscais
- Ações de entrega (iniciar, completar, reagendar)
- Captura de fotos e assinatura
### 6. CompleteDeliveryScreen
**Arquivo**: `src/screens/main/CompleteDeliveryScreen.tsx`
**Funcionalidades**:
- Formulário de conclusão de entrega
- Captura de fotos
- Coleta de assinatura
- Registro de observações
- Validação de dados obrigatórios
### 7. ProfileScreen
**Arquivo**: `src/screens/main/ProfileScreen.tsx`
**Funcionalidades**:
- Exibição de dados do usuário
- Estatísticas pessoais
- Configurações
- Logout
## Serviços e APIs
### 1. ApiService
**Arquivo**: `src/services/api.ts`
**Endpoints Principais**:
#### Autenticação
- `POST /auth/login` - Login do usuário
- `POST /auth/logout` - Logout do usuário
#### Entregas
- `GET /v1/driver/deliveries` - Listar entregas
- `GET /v1/driver/deliveries/{outId}` - Obter entrega específica
- `GET /v1/driver/deliveries/{outId}/customer/{customerId}` - Notas fiscais
- `POST /v1/delivery/create` - Criar/concluir entrega
- `POST /v1/driver/delivery/status` - Atualizar status
#### Roteirização
- `POST /v1/driver/routing` - Enviar ordem de roteamento
#### Geolocalização
- `GET /v1/geolocation/google` - Obter coordenadas por endereço
#### Upload
- `POST /api/v1/base/send-image` - Upload de imagens
**Funcionalidades Especiais**:
- Algoritmo TSP (Traveling Salesman Problem) para otimização de rotas
- Geolocalização automática de endereços
- Cálculo de distâncias
- Ordenação inteligente de entregas
### 2. DatabaseService
**Arquivo**: `src/services/database.ts`
**Tabelas SQLite**:
#### users
```sql
CREATE TABLE users (
id TEXT PRIMARY KEY,
name TEXT,
email TEXT,
role TEXT,
last_login INTEGER
);
```
#### deliveries
```sql
CREATE TABLE deliveries (
id TEXT PRIMARY KEY,
client TEXT,
address TEXT,
coordinates TEXT,
status TEXT,
scheduled_time TEXT,
completed_time INTEGER,
signature TEXT,
photos TEXT,
notes TEXT,
sync_status TEXT
);
```
#### deliveries_offline
```sql
CREATE TABLE deliveries_offline (
id TEXT PRIMARY KEY,
outId INTEGER,
transactionId INTEGER,
deliveryDate TEXT,
receiverDoc TEXT,
receiverName TEXT,
lat REAL,
lng REAL,
broken INTEGER,
devolution INTEGER,
reasonDevolution TEXT,
deliveryImages TEXT,
userId INTEGER,
sync_status TEXT
);
```
#### settings
```sql
CREATE TABLE settings (
id INTEGER PRIMARY KEY AUTOINCREMENT,
key TEXT UNIQUE,
value TEXT
);
```
**Funcionalidades**:
- Fallback para AsyncStorage quando SQLite não disponível
- Operações CRUD para todas as entidades
- Controle de sincronização
- Armazenamento offline
### 3. OfflineStorageService
**Arquivo**: `src/services/offlineStorage.ts`
**Funcionalidades**:
- Armazenamento de dados offline por tipo
- Fila de sincronização com retry
- Estatísticas de dados offline
- Controle de tentativas de sincronização
- Limpeza de dados sincronizados
**Tipos de Dados Offline**:
- `delivery`: Dados de entregas
- `photo`: Fotos capturadas
- `signature`: Assinaturas coletadas
- `status`: Atualizações de status
### 4. SyncService
**Arquivo**: `src/services/sync.ts`
**Funcionalidades**:
- Sincronização de entregas offline
- Upload de arquivos (fotos, assinaturas)
- Controle de estado de conexão
- Retry automático em caso de falha
## Sistema de Estilização
### Tema Principal
**Arquivo**: `src/constants/theme.ts`
**Cores**:
- Primary: `#0A1E63` (Azul escuro)
- Secondary: `#F5F5F5` (Cinza claro)
- Success: `#4CAF50` (Verde)
- Warning: `#FFC107` (Amarelo)
- Danger: `#F44336` (Vermelho)
- Info: `#2196F3` (Azul)
**Tipografia**:
- Regular: Roboto-Regular
- Medium: Roboto-Medium
- Bold: Roboto-Bold
**Sombras**:
- Small: Elevação 2
- Medium: Elevação 5
### Tailwind CSS
**Arquivo**: `tailwind.config.ts`
Configuração completa do Tailwind CSS com:
- Sistema de cores customizado
- Bordas arredondadas
- Animações de accordion
- Suporte a modo escuro
- Cores para sidebar e charts
## Componentes UI
### Componentes Principais
#### 1. Icon
**Arquivo**: `components/Icon.tsx`
- Suporte a múltiplas bibliotecas de ícones
- Material Icons, FontAwesome, Ionicons
- Props customizáveis (size, color, style)
#### 2. FloatingPanicButton
**Arquivo**: `components/FloatingPanicButton.tsx`
- Botão de pânico flutuante
- Captura de localização
- Envio de alerta de emergência
#### 3. DeliveryMap
**Arquivo**: `src/components/DeliveryMap.tsx`
- Integração com mapas
- Exibição de entregas
- Cálculo de rotas
- Marcadores customizados
#### 4. MobileSignalIndicator
**Arquivo**: `src/components/MobileSignalIndicator.tsx`
- Indicador de força do sinal
- Controle de modo offline
- Alertas de conexão
### Componentes UI (shadcn/ui)
**Pasta**: `components/ui/`
Componentes baseados no shadcn/ui:
- Accordion, Alert, Avatar, Badge
- Button, Card, Checkbox, Dialog
- Form, Input, Label, Select
- Table, Tabs, Toast, Tooltip
- E muitos outros componentes
## Hooks Customizados
### 1. useMobileSignal
**Arquivo**: `src/hooks/useMobileSignal.ts`
**Funcionalidades**:
- Monitoramento de força do sinal
- Detecção de tipo de conexão
- Controle de modo offline baseado no sinal
- Alertas de qualidade de conexão
### 2. useMapboxDirections
**Arquivo**: `src/hooks/useMapboxDirections.ts`
**Funcionalidades**:
- Integração com Mapbox Directions API
- Cálculo de rotas otimizadas
- Suporte a múltiplos waypoints
- Cache de rotas calculadas
### 3. useRouting
**Arquivo**: `src/hooks/useRouting.ts`
**Funcionalidades**:
- Lógica de roteirização
- Algoritmo TSP
- Otimização de sequência de entregas
- Integração com API de roteamento
### 4. useNetworkStatus
**Arquivo**: `hooks/useNetworkStatus.ts`
**Funcionalidades**:
- Monitoramento de status da rede
- Detecção de mudanças de conectividade
- Callbacks para eventos de rede
## Configurações e Ambiente
### Variáveis de Ambiente
**Arquivo**: `src/config/env.ts`
**Configurações**:
- Google Maps API Key
- URL base da API
- Timeout de requisições
- Chaves de autenticação
- Token do Mapbox
- Configurações de notificação
### Configuração do Expo
**Arquivo**: `app.json`
**Configurações Principais**:
- Bundle identifier
- Permissões (câmera, localização, armazenamento)
- Configuração do Google Maps
- Plugins necessários
- Configurações de notificação
## Sistema de Sincronização Offline
### Estratégia de Sincronização
1. **Detecção de Modo Offline**:
- Monitoramento de força do sinal
- Detecção de qualidade de conexão
- Ativação automática do modo offline
2. **Armazenamento Offline**:
- Dados salvos localmente no SQLite
- Fila de sincronização
- Controle de tentativas
3. **Sincronização**:
- Execução automática quando online
- Retry em caso de falha
- Limpeza de dados sincronizados
### Fluxo de Dados Offline
```
Usuário Executa Ação
Verificar Conexão
Se Offline → Salvar Localmente
Adicionar à Fila de Sync
Quando Online → Sincronizar
Remover da Fila
```
## Algoritmo de Roteirização TSP
### Implementação
**Arquivo**: `src/services/api.ts` (função `optimizeRouteWithTSP`)
### Processo:
1. **Coleta de Coordenadas**:
- Usar coordenadas existentes
- Geolocalizar endereços sem coordenadas
- Normalizar formato de coordenadas
2. **Cálculo de Matriz de Distâncias**:
- Fórmula de Haversine
- Distâncias entre todas as entregas
- Incluir centro de distribuição
3. **Algoritmo Nearest Neighbor**:
- Começar do centro de distribuição
- Selecionar próxima entrega mais próxima
- Repetir até todas as entregas visitadas
4. **Aplicação de Sequência**:
- Atribuir deliverySeq sequencial
- Enviar para API de roteamento
- Atualizar banco de dados
## Considerações para Implementação de Sincronização Offline
### 1. Carregamento Inicial de Dados
**Implementação Sugerida**:
```typescript
// Novo contexto para gerenciar sincronização inicial
interface InitialSyncContext {
isInitialSyncComplete: boolean;
syncProgress: number;
startInitialSync: () => Promise<void>;
retryInitialSync: () => Promise<void>;
}
```
**Dados Necessários para Sincronização Inicial**:
- Lista completa de entregas
- Dados de clientes
- Informações de produtos
- Configurações do sistema
- Dados de usuário
### 2. Estratégia de Sincronização Incremental
**Implementação**:
```typescript
interface SyncStrategy {
fullSync: () => Promise<void>; // Sincronização completa
incrementalSync: () => Promise<void>; // Sincronização incremental
selectiveSync: (ids: string[]) => Promise<void>; // Sincronização seletiva
}
```
### 3. Controle de Versão de Dados
**Implementação**:
```sql
-- Adicionar campos de controle de versão
ALTER TABLE deliveries ADD COLUMN version INTEGER DEFAULT 1;
ALTER TABLE deliveries ADD COLUMN last_modified INTEGER;
ALTER TABLE deliveries ADD COLUMN sync_timestamp INTEGER;
```
### 4. Resolução de Conflitos
**Estratégias**:
- Last-Write-Wins (última modificação vence)
- Server-Wins (servidor sempre vence)
- Client-Wins (cliente sempre vence)
- Merge automático quando possível
### 5. Otimização de Performance
**Implementações**:
- Compressão de dados
- Sincronização em lotes
- Cache inteligente
- Lazy loading de dados
### 6. Monitoramento e Logs
**Implementação**:
```typescript
interface SyncLogger {
logSyncStart: (type: string) => void;
logSyncProgress: (progress: number) => void;
logSyncError: (error: Error) => void;
logSyncComplete: (stats: SyncStats) => void;
}
```
## Conclusão
O aplicativo possui uma arquitetura robusta e bem estruturada, com separação clara de responsabilidades e suporte completo para funcionamento offline. A implementação de sincronização de dados pode ser realizada de forma incremental, aproveitando a infraestrutura existente e expandindo as funcionalidades de armazenamento e sincronização já implementadas.
A documentação apresentada serve como base para implementar melhorias no sistema de sincronização, garantindo que o aplicativo funcione de forma eficiente tanto online quanto offline.