9.2 KiB
9.2 KiB
Atualização Automática do Status de Entrega e Próxima Entrega
🎯 Objetivo
Implementar funcionalidade para que quando uma entrega for finalizada:
- Status da entrega seja atualizado no banco de dados local (SQLite)
- Card da próxima entrega seja atualizado automaticamente na HomeScreen conforme a sequência de entrega
📋 Requisitos
- ✅ Atualizar status da entrega no SQLite após finalização
- ✅ Notificar automaticamente o DeliveriesContext sobre mudanças
- ✅ Recarregar dados locais para refletir mudanças no status
- ✅ Atualizar card da próxima entrega na HomeScreen conforme sequência
✅ Implementações
1. OfflineModeContext - Sistema de Notificação
Interface Atualizada:
interface OfflineModeContextData {
// ... outros campos
// Callback para notificar mudanças nas entregas
onDeliveryStatusChanged?: () => void;
registerDeliveryStatusCallback: (callback: () => void) => void;
}
Estado e Função de Registro:
const [onDeliveryStatusChanged, setOnDeliveryStatusChanged] = useState<(() => void) | undefined>(undefined);
const registerDeliveryStatusCallback = (callback: () => void) => {
console.log('🚨 OFFLINE CONTEXT - REGISTRANDO CALLBACK DE MUDANÇA DE STATUS');
setOnDeliveryStatusChanged(() => callback);
};
Função completeDeliveryOffline Atualizada:
const completeDeliveryOffline = async (deliveryData: {
deliveryId: string;
status: string;
photos?: string[];
signature?: string;
notes?: string;
completedBy: string;
}) => {
setIsLoading(true);
setError(null);
try {
console.log('=== COMPLETANDO ENTREGA OFFLINE ===');
await offlineSyncService.completeDeliveryOffline(deliveryData);
// Atualizar estatísticas
await refreshSyncStats();
// Notificar mudança no status da entrega
if (onDeliveryStatusChanged) {
console.log('🚨 OFFLINE CONTEXT - NOTIFICANDO MUDANÇA NO STATUS DA ENTREGA');
onDeliveryStatusChanged();
}
console.log('=== ENTREGA COMPLETADA OFFLINE ===');
} catch (error) {
console.error('Erro ao completar entrega offline:', error);
setError(error.message);
throw error;
} finally {
setIsLoading(false);
}
};
2. DeliveriesContext - Atualização Automática
Registro do Callback:
// Integração com sistema offline
const { isInitialDataLoaded, isOfflineMode, registerDeliveryStatusCallback } = useOfflineMode()
// Registrar callback para atualização automática quando status de entrega mudar
useEffect(() => {
console.log("🚨 DELIVERIES CONTEXT - REGISTRANDO CALLBACK DE MUDANÇA DE STATUS")
const handleDeliveryStatusChange = () => {
console.log("🚨 DELIVERIES CONTEXT - STATUS DE ENTREGA MUDOU - RECARREGANDO DADOS")
// Recarregar dados locais para refletir mudanças no status
loadDeliveries(false)
}
// Registrar o callback no OfflineModeContext
registerDeliveryStatusCallback(handleDeliveryStatusChange)
// Cleanup: não é necessário pois o callback será substituído quando necessário
}, [registerDeliveryStatusCallback])
3. HomeScreen - Logs de Debug Ativados
Função getNextDelivery com Logs Detalhados:
const getNextDelivery = () => {
console.log('=== 🔍 PROCURANDO PRÓXIMA ENTREGA ===');
console.log('📊 Total de entregas ordenadas:', sortedDeliveries.length);
console.log('📊 Fonte dos dados:', isOfflineMode ? 'LOCAL (SQLite)' : 'API');
if (sortedDeliveries.length === 0) {
console.log('=== ⚠️ NENHUMA ENTREGA DISPONÍVEL ===');
return null;
}
// Filtrar entregas válidas para próxima entrega
const validDeliveries = sortedDeliveries.filter((delivery) => {
const isValid = delivery.deliverySeq > 0 && delivery.status !== "delivered";
console.log(`🔍 ${delivery.customerName}: deliverySeq=${delivery.deliverySeq}, status=${delivery.status}, routing=${delivery.routing} -> ${isValid ? 'VÁLIDA' : 'INVÁLIDA'}`);
return isValid;
});
console.log('📊 Entregas válidas encontradas:', validDeliveries.length);
// A primeira entrega válida da lista ordenada é a próxima
const nextDelivery = validDeliveries[0];
if (nextDelivery) {
console.log('=== 🎯 PRÓXIMA ENTREGA SELECIONADA ===');
console.log('📦 Entrega:', {
id: nextDelivery.id,
customerName: nextDelivery.customerName,
deliverySeq: nextDelivery.deliverySeq,
routing: nextDelivery.routing,
status: nextDelivery.status,
distance: nextDelivery.distance
});
} else {
console.log('=== ⚠️ NENHUMA ENTREGA VÁLIDA ENCONTRADA ===');
// Logs detalhados para debug...
}
return nextDelivery;
}
🔄 Fluxo de Atualização
Sequência Completa:
1. Usuário finaliza entrega no CompleteDeliveryScreen
↓
2. completeDeliveryOffline() é chamada no OfflineModeContext
↓
3. offlineSyncService.completeDeliveryOffline() atualiza SQLite
↓
4. onDeliveryStatusChanged() callback é executado
↓
5. DeliveriesContext.handleDeliveryStatusChange() é chamado
↓
6. loadDeliveries(false) recarrega dados do SQLite
↓
7. HomeScreen.getNextDelivery() encontra próxima entrega
↓
8. Card da próxima entrega é atualizado automaticamente
Atualização do Status no SQLite:
UPDATE deliveries SET
status = ?,
notes = ?,
completedTime = ?,
completedBy = ?,
lastModified = ?,
syncStatus = 'pending'
WHERE id = ?
🎯 Benefícios
1. Atualização Automática:
- Sem intervenção manual - sistema atualiza automaticamente
- Dados sempre sincronizados - SQLite reflete mudanças imediatamente
- Interface responsiva - HomeScreen atualiza em tempo real
2. Sequência Correta:
- Próxima entrega correta - baseada em deliverySeq e status
- Filtros aplicados - apenas entregas não entregues são consideradas
- Ordenação respeitada - algoritmo TSP mantido
3. Debugging Facilitado:
- Logs detalhados - rastreamento completo do processo
- Visibilidade total - cada etapa é logada
- Identificação rápida - problemas facilmente localizados
📱 Comportamento Esperado
Antes da Finalização:
HomeScreen mostra:
- Próxima entrega: Cliente A (deliverySeq: 1, status: pending)
- Total de entregas: 5
- Pendentes: 3, Em rota: 1, Entregues: 1
Após Finalizar Entrega:
1. Status atualizado no SQLite: Cliente A (status: delivered)
2. DeliveriesContext recarrega dados automaticamente
3. HomeScreen atualiza automaticamente:
- Próxima entrega: Cliente B (deliverySeq: 2, status: pending)
- Total de entregas: 5
- Pendentes: 2, Em rota: 1, Entregues: 2
🔍 Logs de Debug
Durante Finalização:
=== COMPLETANDO ENTREGA OFFLINE ===
🚨 OFFLINE CONTEXT - NOTIFICANDO MUDANÇA NO STATUS DA ENTREGA
=== ENTREGA COMPLETADA OFFLINE ===
Durante Atualização:
🚨 DELIVERIES CONTEXT - STATUS DE ENTREGA MUDOU - RECARREGANDO DADOS
🚨 DELIVERIES CONTEXT - INICIANDO CARREGAMENTO
🚨 DELIVERIES CONTEXT - USANDO DADOS LOCAIS
🚨 DELIVERIES CONTEXT - Dados locais carregados: 5 entregas
Durante Seleção da Próxima Entrega:
=== 🔍 PROCURANDO PRÓXIMA ENTREGA ===
📊 Total de entregas ordenadas: 5
📊 Fonte dos dados: LOCAL (SQLite)
🔍 Cliente A: deliverySeq=1, status=delivered, routing=1 -> INVÁLIDA
🔍 Cliente B: deliverySeq=2, status=pending, routing=1 -> VÁLIDA
📊 Entregas válidas encontradas: 1
=== 🎯 PRÓXIMA ENTREGA SELECIONADA ===
📦 Entrega: Cliente B (deliverySeq: 2, status: pending)
📝 Arquivos Modificados
-
src/contexts/OfflineModeContext.tsx- Adicionada interface
onDeliveryStatusChangederegisterDeliveryStatusCallback - Implementado sistema de callback para notificar mudanças
- Atualizada função
completeDeliveryOfflinepara chamar callback
- Adicionada interface
-
src/contexts/DeliveriesContext.tsx- Adicionado registro de callback no
useEffect - Implementada função
handleDeliveryStatusChangepara recarregar dados - Integração com
registerDeliveryStatusCallbackdo OfflineModeContext
- Adicionado registro de callback no
-
src/screens/main/HomeScreen.tsx- Habilitados logs detalhados na função
getNextDelivery - Logs mostram processo de seleção da próxima entrega
- Debug completo do estado das entregas
- Habilitados logs detalhados na função
🚀 Resultado
✅ Funcionalidades Implementadas:
- Atualização automática do status no SQLite após finalização
- Notificação em tempo real para o DeliveriesContext
- Recarregamento automático dos dados locais
- Atualização do card da próxima entrega conforme sequência
- Logs detalhados para debugging e monitoramento
✅ Benefícios Alcançados:
- Sistema totalmente automático - sem intervenção manual
- Dados sempre atualizados - SQLite e interface sincronizados
- Sequência correta mantida - próxima entrega sempre correta
- Debugging facilitado - logs completos do processo
- Performance otimizada - apenas recarrega quando necessário
Data: 2024-01-16
Status: ✅ Concluído
Impacto: Sistema de atualização automática implementado com sucesso