entregas_app/docs/CORRECAO_ERRO_FINALIZACAO_E...

338 lines
10 KiB
Markdown
Raw Normal View History

# 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.