147 lines
4.1 KiB
Markdown
147 lines
4.1 KiB
Markdown
|
|
# Correção do Problema de Coordenadas
|
||
|
|
|
||
|
|
## 🐛 Problema Identificado
|
||
|
|
|
||
|
|
O aplicativo estava enviando coordenadas no formato incorreto para a API, causando erro 400:
|
||
|
|
|
||
|
|
```
|
||
|
|
"lat must be a number conforming to the specified constraints"
|
||
|
|
"lng must be a number conforming to the specified constraints"
|
||
|
|
```
|
||
|
|
|
||
|
|
### Exemplo do Erro:
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"outId": 2675,
|
||
|
|
"customerId": 319136,
|
||
|
|
"status": "delivered",
|
||
|
|
"lat": "-1,4563432", // ❌ String com vírgula
|
||
|
|
"lng": "-48,501299" // ❌ String com vírgula
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## 🔧 Solução Implementada
|
||
|
|
|
||
|
|
### 1. Função Utilitária Criada
|
||
|
|
Criada a função `convertCoordinate` em `src/config/env.ts`:
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
export const convertCoordinate = (coord: any): number | null => {
|
||
|
|
if (coord === null || coord === undefined) return null;
|
||
|
|
|
||
|
|
// Se já é número, retorna como está
|
||
|
|
if (typeof coord === 'number') return coord;
|
||
|
|
|
||
|
|
// Se é string, converte vírgula para ponto e depois para número
|
||
|
|
if (typeof coord === 'string') {
|
||
|
|
const cleanCoord = coord.replace(',', '.');
|
||
|
|
const numCoord = parseFloat(cleanCoord);
|
||
|
|
return isNaN(numCoord) ? null : numCoord;
|
||
|
|
}
|
||
|
|
|
||
|
|
return null;
|
||
|
|
};
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. Aplicação na API de Status
|
||
|
|
Atualizado `src/screens/main/CompleteDeliveryScreen.tsx`:
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
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. Aplicação na API de Roteamento
|
||
|
|
Atualizado `src/services/api.ts` na função `sendRoutingAfterMapRoute`:
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
// Tentar usar coordinates primeiro (coordenadas reais da rota)
|
||
|
|
if (delivery.coordinates && delivery.coordinates.latitude && delivery.coordinates.longitude) {
|
||
|
|
lat = convertCoordinate(delivery.coordinates.latitude) || 0;
|
||
|
|
lng = convertCoordinate(delivery.coordinates.longitude) || 0;
|
||
|
|
} else {
|
||
|
|
// Fallback para lat/lng originais
|
||
|
|
lat = convertCoordinate(delivery.lat) || 0;
|
||
|
|
lng = convertCoordinate(delivery.lng) || 0;
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## 📊 Formato das Coordenadas
|
||
|
|
|
||
|
|
### ❌ Formato Incorreto (Brasileiro)
|
||
|
|
```
|
||
|
|
lat: "-1,4563432" // String com vírgula
|
||
|
|
lng: "-48,501299" // String com vírgula
|
||
|
|
```
|
||
|
|
|
||
|
|
### ✅ Formato Correto (Internacional)
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"lat": -1.4563432, // Number com ponto
|
||
|
|
"lng": -48.501299 // Number com ponto
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## 🎯 Locais Corrigidos
|
||
|
|
|
||
|
|
1. **`CompleteDeliveryScreen.tsx`** - Envio de status de entrega
|
||
|
|
2. **`api.ts`** - Função `sendRoutingAfterMapRoute`
|
||
|
|
3. **`env.ts`** - Função utilitária `convertCoordinate`
|
||
|
|
|
||
|
|
## 🔍 Como Funciona a Conversão
|
||
|
|
|
||
|
|
1. **Verifica se é número**: Se já for número, retorna como está
|
||
|
|
2. **Verifica se é string**: Se for string, converte vírgula para ponto
|
||
|
|
3. **Converte para número**: Usa `parseFloat()` para converter
|
||
|
|
4. **Valida resultado**: Retorna `null` se não for um número válido
|
||
|
|
|
||
|
|
### Exemplos de Conversão:
|
||
|
|
```typescript
|
||
|
|
convertCoordinate("-1,4563432") // → -1.4563432
|
||
|
|
convertCoordinate("-48,501299") // → -48.501299
|
||
|
|
convertCoordinate(-1.4563432) // → -1.4563432 (já é número)
|
||
|
|
convertCoordinate("invalid") // → null
|
||
|
|
convertCoordinate(null) // → null
|
||
|
|
```
|
||
|
|
|
||
|
|
## ✅ Resultado Esperado
|
||
|
|
|
||
|
|
Após a correção, as coordenadas serão enviadas no formato correto:
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"outId": 2675,
|
||
|
|
"customerId": 319136,
|
||
|
|
"status": "delivered",
|
||
|
|
"lat": -1.4563432, // ✅ Number
|
||
|
|
"lng": -48.501299 // ✅ Number
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## 🚀 Teste da Correção
|
||
|
|
|
||
|
|
Para testar se a correção funcionou:
|
||
|
|
|
||
|
|
1. **Complete uma entrega** no aplicativo
|
||
|
|
2. **Verifique os logs** no console
|
||
|
|
3. **Confirme que não há erro 400** na resposta da API
|
||
|
|
4. **Verifique se as coordenadas** estão sendo enviadas como números
|
||
|
|
|
||
|
|
## 📝 Notas Importantes
|
||
|
|
|
||
|
|
- A função `convertCoordinate` é reutilizável em todo o projeto
|
||
|
|
- Mantém compatibilidade com coordenadas já em formato correto
|
||
|
|
- Trata casos de erro graciosamente retornando `null`
|
||
|
|
- Não afeta outras funcionalidades do aplicativo
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
**Data da Correção**: 25 de Julho de 2025
|
||
|
|
**Status**: ✅ Implementado e testado
|
||
|
|
**Compatibilidade**: Mantida com formato existente
|