/** * ========================================================================= * PLATEFORME ECO-PANNEAU.FR - VERSION 1.0.0 * Interface Client - Onglet : Livraisons * ========================================================================= */ window.pano_ClientLivraisonsTab = ({ data, myClientData, refreshData, showToast, activeModal, targetId, openLocalModal, closeCurrentLayer }) => { const { useState, useEffect, useMemo } = React; const [isSaving, setIsSaving] = useState(false); const [rejectReason, setRejectReason] = useState(''); const { PackageIcon, MapPinIcon, CheckCircleIcon, ExternalLinkIcon, LoaderIcon, AlertTriangleIcon, EyeIcon, XIcon, PlusIcon } = window.pano_getIcons(); const Modal = window.pano_Modal || (() => null); const StatusBadge = window.pano_StatusBadge || (({status}) => {status}); const IconBadge = window.pano_IconBadge || (() => null); const Button = window.pano_Button || (() => null); const ExternalLinkIconComp = window.pano_getIcons ? window.pano_getIcons().ExternalLinkIcon : (() => null); const CardGrid = window.pano_CardGrid || (({children, className}) =>
{children}
); const DataCard = window.pano_DataCard || (({children, className, variant}) =>
{children}
); const SearchBar = window.pano_SearchBar || (() => null); const EmptySearch = window.pano_EmptySearch || (() => null); const PaginationFooter = window.pano_PaginationFooter || (() => null); const deliveryConfirmModal = activeModal === 'delivery_confirm' ? targetId : null; const rejectA1Target = activeModal === 'reject_a1' ? data.panneaux?.find(c => c.id === targetId) : null; const { visiblePanels } = window.pano_getPanelAccessRights ? window.pano_getPanelAccessRights(data.panneaux || [], myClientData.id) : { visiblePanels:[] }; const deliveries = visiblePanels.filter(c => c.physicalPanels > 0 && c.status !== 'Brouillon'); const { searchQuery, setSearchQuery, visibleCount, setVisibleCount, filteredData: filteredDeliveries } = window.pano_useSearchAndPagination(deliveries, (c, q) => { return (c.name && c.name.toLowerCase().includes(q)) || (c.shippingAddress && c.shippingAddress.toLowerCase().includes(q)) || (c.location && c.location.toLowerCase().includes(q)) || (c.tracking_number && c.tracking_number.toLowerCase().includes(q)) || (c.shipping_status && c.shipping_status.toLowerCase().includes(q)); }); const attentionDeliveries = []; const otherDeliveries = []; filteredDeliveries.forEach(c => { if (c.shipping_status === 'Expédié' || c.shipping_status === 'Attente validation client') { attentionDeliveries.push(c); } else { otherDeliveries.push(c); } }); const displayedOtherDeliveries = otherDeliveries.slice(0, visibleCount); useEffect(() => { const url = new URL(window.location); const confirmDelivery = url.searchParams.get('confirm_delivery'); if (confirmDelivery) { url.searchParams.delete('confirm_delivery'); window.history.replaceState({}, '', url); openLocalModal('delivery_confirm', confirmDelivery); } }, []); const handleConfirmDelivery = async () => { if (!deliveryConfirmModal) return; const d = await window.pano_apiFetch('panneaux/shipping', { body: { id: deliveryConfirmModal, shipping_status: 'Réception confirmée' }, setLoading: setIsSaving, successMessage: "Réception confirmée !" }); if (d) { refreshData(); closeCurrentLayer(); } }; const renderDeliveryCard = (c) => { const variant = c.shipping_status === 'Attente validation client' ? 'warning' : 'default'; return (

{c.name}

Statut

{c.shipping_status === 'Attente validation client' && (

Maquette modifiée à valider

Notre équipe a généré une nouvelle maquette pour votre projet. Veuillez la contrôler et la valider formellement pour lancer l'impression.

{c.a1PdfId && ( )}
)} {c.shipping_status === 'Expédié' && (

En acheminement

{c.tracking_number ? (

{c.tracking_number}

) : (

Votre commande est en route.

)} {c.tracking_link && (
)} {c.shipping_status === 'Expédié' && ( )}
); }; return (

Livraisons

{deliveries.length > 0 && SearchBar && (
)}
{deliveries.length === 0 ? (

Aucune livraison

) : filteredDeliveries.length === 0 ? ( EmptySearch && ) : ( <> {attentionDeliveries.length > 0 && (

Action requise

{attentionDeliveries.map(c => renderDeliveryCard(c))}
)} {otherDeliveries.length > 0 && (

Toutes les livraisons

{displayedOtherDeliveries.map(c => renderDeliveryCard(c))} {PaginationFooter && ( )}
)} )} {deliveryConfirmModal && Modal && (

Colis livré ?

)} {rejectA1Target && Modal && (
{ e.preventDefault(); const d = await window.pano_apiFetch('panneaux/client_validate_a1', { body: { id: rejectA1Target.id, action: 'reject', reason: rejectReason }, setLoading: setIsSaving, successMessage: "Refus transmis à l'équipe." }); if (d) { refreshData(); closeCurrentLayer(); } }} className="space-y-4">