338 lines
10 KiB
Markdown
338 lines
10 KiB
Markdown
|
|
# Correção do Erro na Finalização de Entrega
|
||
|
|
|
||
|
|
## Problema Identificado
|
||
|
|
|
||
|
|
### 🚨 **Erro Reportado**
|
||
|
|
```
|
||
|
|
Erro ao gravar situação de entrega:
|
||
|
|
Cannot read properties of null (reading 'toString')
|
||
|
|
```
|
||
|
|
|
||
|
|
### 🔍 **Análise do Problema**
|
||
|
|
O erro indica que algum valor está sendo `null` quando o código tenta chamar o método `toString()` nele. Este tipo de erro geralmente ocorre quando:
|
||
|
|
|
||
|
|
1. **Dados da entrega incompletos**: Campos obrigatórios como `outId`, `customerId`, `userId` estão `null`
|
||
|
|
2. **Conversão de coordenadas**: Valores de latitude/longitude estão `null` e são processados incorretamente
|
||
|
|
3. **Validação insuficiente**: Dados são enviados para a API sem validação adequada
|
||
|
|
4. **Processamento de dados**: Valores `null` são passados para funções que esperam valores válidos
|
||
|
|
|
||
|
|
## Soluções Implementadas
|
||
|
|
|
||
|
|
### 1. **Validação Robusta de Dados**
|
||
|
|
|
||
|
|
#### **CompleteDeliveryScreen.tsx - Validação Antes do Payload**
|
||
|
|
```typescript
|
||
|
|
// Validação robusta dos dados antes de montar o payload
|
||
|
|
console.log('=== DEBUG: VALIDANDO DADOS ANTES DE MONTAR PAYLOAD ===');
|
||
|
|
console.log('delivery.outId:', delivery.outId);
|
||
|
|
console.log('delivery.coordinates:', delivery.coordinates);
|
||
|
|
console.log('delivery.lat:', delivery.lat);
|
||
|
|
console.log('delivery.lng:', delivery.lng);
|
||
|
|
console.log('currentInvoice.transactionId:', currentInvoice.transactionId);
|
||
|
|
console.log('user?.id:', user?.id);
|
||
|
|
|
||
|
|
// Validação obrigatória dos campos críticos
|
||
|
|
if (!delivery.outId) {
|
||
|
|
Alert.alert("Erro", "ID da entrega não encontrado");
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!currentInvoice.transactionId) {
|
||
|
|
Alert.alert("Erro", "ID da transação não encontrado");
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!user?.id) {
|
||
|
|
Alert.alert("Erro", "Usuário não autenticado");
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
#### **Garantia de Valores Não-Null**
|
||
|
|
```typescript
|
||
|
|
const deliveryData = {
|
||
|
|
outId: delivery.outId,
|
||
|
|
transactionId: currentInvoice.transactionId,
|
||
|
|
deliveryDate,
|
||
|
|
receiverDoc: receiverDoc || "", // Garantir que não seja null
|
||
|
|
receiverName: receiverName || "", // Garantir que não seja null
|
||
|
|
lat: delivery.coordinates?.latitude ?? delivery.lat ?? null,
|
||
|
|
lng: delivery.coordinates?.longitude ?? delivery.lng ?? null,
|
||
|
|
broken,
|
||
|
|
devolution,
|
||
|
|
reasonDevolution: devolution ? (reasonDevolution || "") : "",
|
||
|
|
deliveryImages: [
|
||
|
|
...uploadedPhotoUrls.map((url) => ({ type: "EN", url })),
|
||
|
|
...(signatureUrl ? [{ type: "SIG", url: signatureUrl }] : []),
|
||
|
|
],
|
||
|
|
userId: user.id, // Já validado acima
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. **Validação de Status da Entrega**
|
||
|
|
|
||
|
|
#### **Validação Antes de Atualizar Status**
|
||
|
|
```typescript
|
||
|
|
// Validação dos dados antes de montar statusData
|
||
|
|
if (!delivery.outId) {
|
||
|
|
Alert.alert("Erro", "ID da entrega não encontrado para atualizar status");
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!delivery.customerId) {
|
||
|
|
Alert.alert("Erro", "ID do cliente não encontrado para atualizar status");
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
const statusData = {
|
||
|
|
outId: delivery.outId,
|
||
|
|
customerId: delivery.customerId,
|
||
|
|
status: statusApi,
|
||
|
|
lat: convertCoordinate(delivery.coordinates?.latitude ?? delivery.lat),
|
||
|
|
lng: convertCoordinate(delivery.coordinates?.longitude ?? delivery.lng),
|
||
|
|
notes: notes || undefined
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3. **Função convertCoordinate Melhorada**
|
||
|
|
|
||
|
|
#### **env.ts - Logs de Debug e Validação**
|
||
|
|
```typescript
|
||
|
|
export const convertCoordinate = (coord: any): number | null => {
|
||
|
|
// Log para debug
|
||
|
|
console.log('=== DEBUG: convertCoordinate ===');
|
||
|
|
console.log('Valor recebido:', coord);
|
||
|
|
console.log('Tipo:', typeof coord);
|
||
|
|
|
||
|
|
if (coord === null || coord === undefined) {
|
||
|
|
console.log('Valor é null/undefined, retornando null');
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Se já é número, retorna como está
|
||
|
|
if (typeof coord === 'number') {
|
||
|
|
console.log('Valor já é número:', coord);
|
||
|
|
return coord;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Se é string, converte vírgula para ponto e depois para número
|
||
|
|
if (typeof coord === 'string') {
|
||
|
|
console.log('Valor é string, convertendo:', coord);
|
||
|
|
const cleanCoord = coord.replace(',', '.');
|
||
|
|
const numCoord = parseFloat(cleanCoord);
|
||
|
|
const result = isNaN(numCoord) ? null : numCoord;
|
||
|
|
console.log('Resultado da conversão:', result);
|
||
|
|
return result;
|
||
|
|
}
|
||
|
|
|
||
|
|
console.log('Tipo não suportado, retornando null');
|
||
|
|
return null;
|
||
|
|
};
|
||
|
|
```
|
||
|
|
|
||
|
|
### 4. **Validação na API**
|
||
|
|
|
||
|
|
#### **createMultipleDeliveries - Validação de Entregas**
|
||
|
|
```typescript
|
||
|
|
// Validação dos dados antes de enviar
|
||
|
|
console.log('=== DEBUG: VALIDANDO DADOS DAS ENTREGAS ===');
|
||
|
|
deliveries.forEach((delivery, index) => {
|
||
|
|
console.log(`Entrega ${index + 1}:`, {
|
||
|
|
outId: delivery.outId,
|
||
|
|
transactionId: delivery.transactionId,
|
||
|
|
receiverDoc: delivery.receiverDoc,
|
||
|
|
receiverName: delivery.receiverName,
|
||
|
|
lat: delivery.lat,
|
||
|
|
lng: delivery.lng,
|
||
|
|
userId: delivery.userId
|
||
|
|
});
|
||
|
|
|
||
|
|
// Verificar se há valores null que podem causar problemas
|
||
|
|
if (delivery.outId === null || delivery.outId === undefined) {
|
||
|
|
throw new Error(`Entrega ${index + 1}: outId é obrigatório`);
|
||
|
|
}
|
||
|
|
if (delivery.transactionId === null || delivery.transactionId === undefined) {
|
||
|
|
throw new Error(`Entrega ${index + 1}: transactionId é obrigatório`);
|
||
|
|
}
|
||
|
|
if (delivery.userId === null || delivery.userId === undefined) {
|
||
|
|
throw new Error(`Entrega ${index + 1}: userId é obrigatório`);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
```
|
||
|
|
|
||
|
|
#### **updateDeliveryStatus - Validação de Status**
|
||
|
|
```typescript
|
||
|
|
// Validação dos dados antes de enviar
|
||
|
|
console.log('=== DEBUG: VALIDANDO DADOS DO STATUS ===');
|
||
|
|
console.log('outId:', data.outId, 'tipo:', typeof data.outId);
|
||
|
|
console.log('customerId:', data.customerId, 'tipo:', typeof data.customerId);
|
||
|
|
console.log('status:', data.status, 'tipo:', typeof data.status);
|
||
|
|
console.log('lat:', data.lat, 'tipo:', typeof data.lat);
|
||
|
|
console.log('lng:', data.lng, 'tipo:', typeof data.lng);
|
||
|
|
|
||
|
|
// Verificar se há valores null que podem causar problemas
|
||
|
|
if (data.outId === null || data.outId === undefined) {
|
||
|
|
throw new Error('outId é obrigatório para atualizar status');
|
||
|
|
}
|
||
|
|
if (data.customerId === null || data.customerId === undefined) {
|
||
|
|
throw new Error('customerId é obrigatório para atualizar status');
|
||
|
|
}
|
||
|
|
if (!data.status) {
|
||
|
|
throw new Error('status é obrigatório para atualizar status');
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Fluxo de Validação Implementado
|
||
|
|
|
||
|
|
### 📋 **Etapa 1: Validação no Frontend**
|
||
|
|
```
|
||
|
|
1. Verificar delivery.outId
|
||
|
|
2. Verificar currentInvoice.transactionId
|
||
|
|
3. Verificar user.id
|
||
|
|
4. Garantir que campos de texto não sejam null
|
||
|
|
5. Validar coordenadas antes da conversão
|
||
|
|
```
|
||
|
|
|
||
|
|
### 📋 **Etapa 2: Validação na API**
|
||
|
|
```
|
||
|
|
1. Verificar estrutura dos dados recebidos
|
||
|
|
2. Validar campos obrigatórios
|
||
|
|
3. Log detalhado para debug
|
||
|
|
4. Tratamento de erro específico
|
||
|
|
```
|
||
|
|
|
||
|
|
### 📋 **Etapa 3: Conversão Segura**
|
||
|
|
```
|
||
|
|
1. Log detalhado dos valores recebidos
|
||
|
|
2. Verificação de tipo antes da conversão
|
||
|
|
3. Tratamento de valores null/undefined
|
||
|
|
4. Retorno seguro para valores inválidos
|
||
|
|
```
|
||
|
|
|
||
|
|
## Logs de Debug Implementados
|
||
|
|
|
||
|
|
### 🔍 **CompleteDeliveryScreen**
|
||
|
|
```
|
||
|
|
=== DEBUG: VALIDANDO DADOS ANTES DE MONTAR PAYLOAD ===
|
||
|
|
delivery.outId: 2750
|
||
|
|
delivery.coordinates: { latitude: -1.393464, longitude: -48.420887 }
|
||
|
|
delivery.lat: null
|
||
|
|
delivery.lng: null
|
||
|
|
currentInvoice.transactionId: 12345
|
||
|
|
user?.id: 67890
|
||
|
|
```
|
||
|
|
|
||
|
|
### 🔍 **convertCoordinate**
|
||
|
|
```
|
||
|
|
=== DEBUG: convertCoordinate ===
|
||
|
|
Valor recebido: -1.393464
|
||
|
|
Tipo: string
|
||
|
|
Valor é string, convertendo: -1.393464
|
||
|
|
Resultado da conversão: -1.393464
|
||
|
|
```
|
||
|
|
|
||
|
|
### 🔍 **API - createMultipleDeliveries**
|
||
|
|
```
|
||
|
|
=== DEBUG: VALIDANDO DADOS DAS ENTREGAS ===
|
||
|
|
Entrega 1: {
|
||
|
|
outId: 2750,
|
||
|
|
transactionId: 12345,
|
||
|
|
receiverDoc: "70219796220",
|
||
|
|
receiverName: "Ana",
|
||
|
|
lat: -1.393464,
|
||
|
|
lng: -48.420887,
|
||
|
|
userId: 67890
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 🔍 **API - updateDeliveryStatus**
|
||
|
|
```
|
||
|
|
=== DEBUG: VALIDANDO DADOS DO STATUS ===
|
||
|
|
outId: 2750 tipo: number
|
||
|
|
customerId: 423894 tipo: number
|
||
|
|
status: delivered tipo: string
|
||
|
|
lat: -1.393464 tipo: number
|
||
|
|
lng: -48.420887 tipo: number
|
||
|
|
```
|
||
|
|
|
||
|
|
## Cenários de Teste
|
||
|
|
|
||
|
|
### 1. **Teste de Dados Completos**
|
||
|
|
```bash
|
||
|
|
# Entrega com todos os campos preenchidos
|
||
|
|
# Verificar logs de validação
|
||
|
|
# Confirmar envio para API
|
||
|
|
# Verificar resposta de sucesso
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. **Teste de Dados Incompletos**
|
||
|
|
```bash
|
||
|
|
# Entrega com campos obrigatórios faltando
|
||
|
|
# Verificar alertas de erro
|
||
|
|
# Confirmar que não envia para API
|
||
|
|
# Verificar logs de validação
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3. **Teste de Coordenadas**
|
||
|
|
```bash
|
||
|
|
# Entrega com coordenadas válidas
|
||
|
|
# Entrega com coordenadas null
|
||
|
|
# Entrega com coordenadas string
|
||
|
|
# Verificar conversão correta
|
||
|
|
```
|
||
|
|
|
||
|
|
### 4. **Teste de Usuário**
|
||
|
|
```bash
|
||
|
|
# Usuário autenticado
|
||
|
|
# Usuário não autenticado
|
||
|
|
# Verificar validação de userId
|
||
|
|
```
|
||
|
|
|
||
|
|
## Benefícios das Correções
|
||
|
|
|
||
|
|
### ✅ **Prevenção de Erros**
|
||
|
|
- **Validação antecipada**: Erros são capturados antes do envio
|
||
|
|
- **Mensagens claras**: Usuário sabe exatamente o que está faltando
|
||
|
|
- **Debug facilitado**: Logs detalhados para identificação de problemas
|
||
|
|
|
||
|
|
### ✅ **Robustez do Sistema**
|
||
|
|
- **Tratamento de null**: Valores nulos são tratados adequadamente
|
||
|
|
- **Conversão segura**: Coordenadas são convertidas sem erros
|
||
|
|
- **Validação em camadas**: Frontend e API validam dados
|
||
|
|
|
||
|
|
### ✅ **Experiência do Usuário**
|
||
|
|
- **Feedback imediato**: Erros são mostrados instantaneamente
|
||
|
|
- **Prevenção de falhas**: Sistema não trava com dados inválidos
|
||
|
|
- **Transparência**: Usuário vê exatamente o que está acontecendo
|
||
|
|
|
||
|
|
## Monitoramento e Manutenção
|
||
|
|
|
||
|
|
### 📊 **Logs a Monitorar**
|
||
|
|
- Validação de dados antes do payload
|
||
|
|
- Conversão de coordenadas
|
||
|
|
- Validação na API
|
||
|
|
- Erros de validação
|
||
|
|
|
||
|
|
### 🔧 **Manutenção Preventiva**
|
||
|
|
- Revisar logs periodicamente
|
||
|
|
- Identificar padrões de erro
|
||
|
|
- Ajustar validações conforme necessário
|
||
|
|
- Atualizar mensagens de erro
|
||
|
|
|
||
|
|
### 🚀 **Melhorias Futuras**
|
||
|
|
- Validação em tempo real
|
||
|
|
- Feedback visual mais rico
|
||
|
|
- Cache de validações
|
||
|
|
- Retry automático em caso de erro
|
||
|
|
|
||
|
|
## Conclusão
|
||
|
|
|
||
|
|
As correções implementadas resolvem o erro "Cannot read properties of null (reading 'toString')" através de:
|
||
|
|
|
||
|
|
1. **Validação robusta** de todos os campos obrigatórios
|
||
|
|
2. **Tratamento seguro** de valores null/undefined
|
||
|
|
3. **Logs detalhados** para facilitar debug
|
||
|
|
4. **Validação em camadas** (Frontend + API)
|
||
|
|
5. **Conversão segura** de coordenadas
|
||
|
|
|
||
|
|
O sistema agora é mais robusto e fornece feedback claro ao usuário sobre qualquer problema nos dados antes de tentar finalizar a entrega.
|