Accueil Rechercher Deals
if (!response) { alert('❌ RĂ©ponse non trouvĂ©e dans les donnĂ©es disponibles'); return; } const rentalDays = deal.rental_days || (deal.start_date && deal.end_date ? Math.ceil((new Date(deal.end_date) - new Date(deal.start_date)) / (1000 * 60 * 60 * 24)) : 1); const vehicles = response.vehicles || []; const totalPrice = response.proposed_total_price || (response.proposed_price_per_vehicle * response.vehicles_offered * rentalDays); // CrĂ©er le modal const modal = document.createElement('div'); modal.className = 'modal'; modal.id = 'agency-response-details-modal'; modal.style.display = 'flex'; modal.innerHTML = ` `; document.body.appendChild(modal); } catch (error) { console.error('Error loading response details:', error); alert('❌ Erreur: ' + (error.message || 'Impossible de charger les dĂ©tails')); } } async function acceptAgencyResponse(dealId, responseId) { if (!confirm('Êtes-vous sĂ»r de vouloir accepter cette offre ? Vous ne pourrez plus accepter d\'autres offres pour ce deal.')) { return; } try { const token = localStorage.getItem('indrive_token'); if (!token) { alert('Veuillez vous connecter'); return; } const response = await fetch(`${API_URL}/multi-vehicle-deals/${dealId}/responses/${responseId}/accept`, { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' } }); const data = await response.json(); if (response.ok && data.success) { alert('✅ Offre acceptĂ©e avec succĂšs! Les autres agences ont Ă©tĂ© notifiĂ©es.'); loadDeals(); } else { alert('❌ Erreur: ' + (data.error || 'Échec de l\'acceptation')); } } catch (error) { console.error('Error accepting response:', error); alert('❌ Erreur: ' + (error.message || 'Erreur de connexion')); } } async function rejectAgencyResponse(dealId, responseId) { if (!confirm('Êtes-vous sĂ»r de vouloir refuser cette offre ?')) { return; } try { const token = localStorage.getItem('indrive_token'); if (!token) { alert('Veuillez vous connecter'); return; } const response = await fetch(`${API_URL}/multi-vehicle-deals/${dealId}/responses/${responseId}/reject`, { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' } }); const data = await response.json(); if (response.ok && data.success) { alert('✅ Offre refusĂ©e'); loadDeals(); } else { alert('❌ Erreur: ' + (data.error || 'Échec du refus')); } } catch (error) { console.error('Error rejecting response:', error); alert('❌ Erreur: ' + (error.message || 'Erreur de connexion')); } } async function counterAgencyResponse(dealId, responseId) { const counterPrice = prompt('Entrez votre contre-proposition (prix total en DH):'); if (!counterPrice || isNaN(counterPrice) || parseFloat(counterPrice) <= 0) { return; } try { const token = localStorage.getItem('indrive_token'); if (!token) { alert('Veuillez vous connecter'); return; } const response = await fetch(`${API_URL}/multi-vehicle-deals/${dealId}/responses/${responseId}/counter`, { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ counter_price: parseFloat(counterPrice) }) }); const data = await response.json(); if (response.ok && data.success) { alert('✅ Contre-proposition envoyĂ©e! Vous ne pourrez plus faire de contre-proposition Ă  cette agence jusqu\'Ă  sa rĂ©ponse.'); loadDeals(); } else { alert('❌ Erreur: ' + (data.error || 'Échec de l\'envoi')); } } catch (error) { console.error('Error countering response:', error); alert('❌ Erreur: ' + (error.message || 'Erreur de connexion')); } } async function viewDealDetails(dealId) { try { const token = localStorage.getItem('indrive_token'); if (!token) { alert('Veuillez vous connecter pour voir les dĂ©tails'); return; } const response = await fetch(`${API_URL}/multi-vehicle-deals/${dealId}`, { headers: { 'Authorization': `Bearer ${token}` } }); if (response.ok) { const data = await response.json(); const deal = data.deal; let details = `DĂ©tails du deal #${deal.deal_number || dealId}\n\n`; details += `Titre: ${deal.title || 'N/A'}\n`; details += `Description: ${deal.description || 'N/A'}\n`; details += `Statut: ${deal.status}\n`; details += `VĂ©hicules demandĂ©s: ${deal.total_vehicles_needed || 0}\n`; details += `PĂ©riode: ${deal.start_date ? new Date(deal.start_date).toLocaleDateString('fr-FR') : 'N/A'} → ${deal.end_date ? new Date(deal.end_date).toLocaleDateString('fr-FR') : 'N/A'}\n`; details += `Lieu: ${deal.pickup_city || 'N/A'}\n`; if (deal.responses && deal.responses.length > 0) { details += `\nRĂ©ponses: ${deal.responses.length}\n`; deal.responses.forEach((r, i) => { details += `${i + 1}. ${r.company_name || 'Agence'} - ${r.status} - ${r.proposed_total_price || r.proposed_price_per_vehicle || 'N/A'} DH\n`; }); } alert(details); } else { const data = await response.json(); alert('❌ Erreur: ' + (data.error || 'Impossible de charger les dĂ©tails')); } } catch (error) { console.error('Error loading deal details:', error); alert('❌ Erreur: ' + (error.message || 'Erreur de connexion')); } } // Fonction pour annuler un deal async function cancelDeal(dealId) { try { const token = localStorage.getItem('indrive_token'); if (!token) { alert('Veuillez vous connecter pour annuler un deal'); window.location.href = 'index.html'; return; } // Demander la raison de l'annulation const cancelReason = prompt('Veuillez indiquer la raison de l\'annulation (optionnel):'); if (cancelReason === null) { return; // L'utilisateur a annulĂ© } // Confirmer l'annulation const confirmCancel = confirm( 'Êtes-vous sĂ»r de vouloir annuler ce deal ?\n\n' + 'Cette action est irrĂ©versible et toutes les agences qui ont rĂ©pondu seront notifiĂ©es.' ); if (!confirmCancel) { return; } // Utiliser l'endpoint multi-vehicle-deals (utilisĂ© par deals.html) const response = await fetch(`${API_URL}/multi-vehicle-deals/${dealId}/cancel`, { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ cancel_reason: cancelReason || 'AnnulĂ© par l\'utilisateur' }) }); if (response.status === 401 || response.status === 403) { localStorage.removeItem('indrive_token'); localStorage.removeItem('indrive_user'); alert('❌ Votre session a expirĂ©. Veuillez vous reconnecter.'); window.location.href = 'index.html'; return; } const data = await response.json(); if (response.ok && data.success) { alert('✅ Deal annulĂ© avec succĂšs'); loadDeals(); // Recharger la liste des deals } else { alert('❌ Erreur: ' + (data.error || 'Échec de l\'annulation')); } } catch (error) { console.error('Error canceling deal:', error); alert('❌ Erreur: ' + (error.message || 'Erreur de connexion')); } } if (!response) { alert('❌ RĂ©ponse non trouvĂ©e dans les donnĂ©es disponibles'); return; } const rentalDays = deal.rental_days || (deal.start_date && deal.end_date ? Math.ceil((new Date(deal.end_date) - new Date(deal.start_date)) / (1000 * 60 * 60 * 24)) : 1); const vehicles = response.vehicles || []; const totalPrice = response.proposed_total_price || (response.proposed_price_per_vehicle * response.vehicles_offered * rentalDays); // CrĂ©er le modal const modal = document.createElement('div'); modal.className = 'modal'; modal.id = 'agency-response-details-modal'; modal.style.display = 'flex'; modal.innerHTML = ` `; document.body.appendChild(modal); } catch (error) { console.error('Error loading response details:', error); alert('❌ Erreur: ' + (error.message || 'Impossible de charger les dĂ©tails')); } } async function acceptAgencyResponse(dealId, responseId) { if (!confirm('Êtes-vous sĂ»r de vouloir accepter cette offre ? Vous ne pourrez plus accepter d\'autres offres pour ce deal.')) { return; } try { const token = localStorage.getItem('indrive_token'); if (!token) { alert('Veuillez vous connecter'); return; } const response = await fetch(`${API_URL}/multi-vehicle-deals/${dealId}/responses/${responseId}/accept`, { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' } }); const data = await response.json(); if (response.ok && data.success) { alert('✅ Offre acceptĂ©e avec succĂšs! Les autres agences ont Ă©tĂ© notifiĂ©es.'); loadDeals(); } else { alert('❌ Erreur: ' + (data.error || 'Échec de l\'acceptation')); } } catch (error) { console.error('Error accepting response:', error); alert('❌ Erreur: ' + (error.message || 'Erreur de connexion')); } } async function rejectAgencyResponse(dealId, responseId) { if (!confirm('Êtes-vous sĂ»r de vouloir refuser cette offre ?')) { return; } try { const token = localStorage.getItem('indrive_token'); if (!token) { alert('Veuillez vous connecter'); return; } const response = await fetch(`${API_URL}/multi-vehicle-deals/${dealId}/responses/${responseId}/reject`, { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' } }); const data = await response.json(); if (response.ok && data.success) { alert('✅ Offre refusĂ©e'); loadDeals(); } else { alert('❌ Erreur: ' + (data.error || 'Échec du refus')); } } catch (error) { console.error('Error rejecting response:', error); alert('❌ Erreur: ' + (error.message || 'Erreur de connexion')); } } async function counterAgencyResponse(dealId, responseId) { const counterPrice = prompt('Entrez votre contre-proposition (prix total en DH):'); if (!counterPrice || isNaN(counterPrice) || parseFloat(counterPrice) <= 0) { return; } try { const token = localStorage.getItem('indrive_token'); if (!token) { alert('Veuillez vous connecter'); return; } const response = await fetch(`${API_URL}/multi-vehicle-deals/${dealId}/responses/${responseId}/counter`, { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ counter_price: parseFloat(counterPrice) }) }); const data = await response.json(); if (response.ok && data.success) { alert('✅ Contre-proposition envoyĂ©e! Vous ne pourrez plus faire de contre-proposition Ă  cette agence jusqu\'Ă  sa rĂ©ponse.'); loadDeals(); } else { alert('❌ Erreur: ' + (data.error || 'Échec de l\'envoi')); } } catch (error) { console.error('Error countering response:', error); alert('❌ Erreur: ' + (error.message || 'Erreur de connexion')); } } async function viewDealDetails(dealId) { try { const token = localStorage.getItem('indrive_token'); if (!token) { alert('Veuillez vous connecter pour voir les dĂ©tails'); return; } const response = await fetch(`${API_URL}/multi-vehicle-deals/${dealId}`, { headers: { 'Authorization': `Bearer ${token}` } }); if (response.ok) { const data = await response.json(); const deal = data.deal; let details = `DĂ©tails du deal #${deal.deal_number || dealId}\n\n`; details += `Titre: ${deal.title || 'N/A'}\n`; details += `Description: ${deal.description || 'N/A'}\n`; details += `Statut: ${deal.status}\n`; details += `VĂ©hicules demandĂ©s: ${deal.total_vehicles_needed || 0}\n`; details += `PĂ©riode: ${deal.start_date ? new Date(deal.start_date).toLocaleDateString('fr-FR') : 'N/A'} → ${deal.end_date ? new Date(deal.end_date).toLocaleDateString('fr-FR') : 'N/A'}\n`; details += `Lieu: ${deal.pickup_city || 'N/A'}\n`; if (deal.responses && deal.responses.length > 0) { details += `\nRĂ©ponses: ${deal.responses.length}\n`; deal.responses.forEach((r, i) => { details += `${i + 1}. ${r.company_name || 'Agence'} - ${r.status} - ${r.proposed_total_price || r.proposed_price_per_vehicle || 'N/A'} DH\n`; }); } alert(details); } else { const data = await response.json(); alert('❌ Erreur: ' + (data.error || 'Impossible de charger les dĂ©tails')); } } catch (error) { console.error('Error loading deal details:', error); alert('❌ Erreur: ' + (error.message || 'Erreur de connexion')); } } // Fonction pour annuler un deal async function cancelDeal(dealId) { try { const token = localStorage.getItem('indrive_token'); if (!token) { alert('Veuillez vous connecter pour annuler un deal'); window.location.href = 'index.html'; return; } // Demander la raison de l'annulation const cancelReason = prompt('Veuillez indiquer la raison de l\'annulation (optionnel):'); if (cancelReason === null) { return; // L'utilisateur a annulĂ© } // Confirmer l'annulation const confirmCancel = confirm( 'Êtes-vous sĂ»r de vouloir annuler ce deal ?\n\n' + 'Cette action est irrĂ©versible et toutes les agences qui ont rĂ©pondu seront notifiĂ©es.' ); if (!confirmCancel) { return; } // Utiliser l'endpoint multi-vehicle-deals (utilisĂ© par deals.html) const response = await fetch(`${API_URL}/multi-vehicle-deals/${dealId}/cancel`, { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ cancel_reason: cancelReason || 'AnnulĂ© par l\'utilisateur' }) }); if (response.status === 401 || response.status === 403) { localStorage.removeItem('indrive_token'); localStorage.removeItem('indrive_user'); alert('❌ Votre session a expirĂ©. Veuillez vous reconnecter.'); window.location.href = 'index.html'; return; } const data = await response.json(); if (response.ok && data.success) { alert('✅ Deal annulĂ© avec succĂšs'); loadDeals(); // Recharger la liste des deals } else { alert('❌ Erreur: ' + (data.error || 'Échec de l\'annulation')); } } catch (error) { console.error('Error canceling deal:', error); alert('❌ Erreur: ' + (error.message || 'Erreur de connexion')); } }