import { useState, useEffect } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { getOrderDetails, getOrderUpgradables, createTicket, getHelpdesks } from '../../services/api'; import { Server, ArrowUpRight, ArrowDownRight, Trash2, ShieldCheck, Loader, AlertCircle } from 'lucide-react'; import NotificationModal from '../../components/ui/NotificationModal'; export default function OrderManagement() { const { orderId } = useParams(); const navigate = useNavigate(); const [order, setOrder] = useState(null); const [upgradables, setUpgradables] = useState({}); const [isLoading, setIsLoading] = useState(true); const [isProcessing, setIsProcessing] = useState(false); const [customAlert, setCustomAlert] = useState(null); useEffect(() => { const fetchOrderData = async () => { try { const orderData = await getOrderDetails(orderId); setOrder(orderData); // Si la commande est active, on cherche les upgrades possibles if (orderData.status === 'active') { const upgradeData = await getOrderUpgradables(orderId); if (upgradeData) setUpgradables(upgradeData); } } catch (err) { setCustomAlert({ type: 'error', title: 'Erreur', message: "Impossible de récupérer les données du contrat." }); } finally { setIsLoading(false); } }; fetchOrderData(); }, [orderId]); const handleUpgrade = async (targetProductId, targetProductName) => { setIsProcessing(true); try { // 1. On récupère le département de support réseau (ou le premier disponible) const hdesks = await getHelpdesks(); const targetHelpdeskId = Object.keys(hdesks)[1] || 1; // 2. On formate une requête automatique claire pour l'administrateur const subject = `[AUTO] Migration d'instance - ${order.title}`; const message = `SYSTÈME NEXUS : Demande de migration automatisée.\n\nLe client demande le passage de l'instance #${order.id} (${order.title}) vers le forfait ID : ${targetProductId} (${targetProductName}).\n\nMerci de générer la facture de prorata depuis l'interface d'administration.`; // 3. On génère le ticket silencieusement await createTicket(subject, message, targetHelpdeskId); setCustomAlert({ type: 'success', title: 'Requête Transmise', message: `La demande de migration vers ${targetProductName} a été envoyée aux ingénieurs GISE.\n\nUne facture de prorata sera générée dans votre espace d'ici quelques minutes. Vous serez notifié par e-mail.` }); setTimeout(() => navigate('/support'), 4500); } catch (err) { setCustomAlert({ type: 'error', title: 'Échec de la transmission', message: err.message }); setIsProcessing(false); } }; const handleCancel = async () => { if (!window.confirm("Alerte : Êtes-vous sûr de vouloir renoncer à cet abonnement ? Le service restera actif jusqu'à la fin de la période facturée.")) return; setIsProcessing(true); try { const hdesks = await getHelpdesks(); const targetHelpdeskId = Object.keys(hdesks)[1] || 1; const subject = `[AUTO] Demande de résiliation - ${order.title}`; const message = `SYSTÈME NEXUS : Demande de résiliation automatisée.\n\nLe client demande la non-reconduction du contrat #${order.id} (${order.title}).\n\nL'instance doit être détruite à la fin du cycle de facturation actuel.`; await createTicket(subject, message, targetHelpdeskId); setCustomAlert({ type: 'success', title: 'Résiliation Programmée', message: "L'ordre d'arrêt a été transmis. L'abonnement ne sera pas renouvelé à la fin du cycle et l'instance sera détruite." }); setTimeout(() => navigate('/support'), 4500); } catch (err) { setCustomAlert({ type: 'error', title: 'Échec', message: err.message }); setIsProcessing(false); } }; if (isLoading) { return
ANALYSE DU CONTRAT...
; } if (!order) return null; // FOSSBilling renvoie souvent les upgradables sous forme de { "id_produit": "Nom du produit" } const upgradeOptions = Object.entries(upgradables); return (

Gestion du contrat : {order.title}

Contrat réseau #{order.id} — Renouvellement : {order.period}

{/* SECTIONS DES UPGRADES / DOWNGRADES */}

Moduler l'infrastructure

{upgradeOptions.length === 0 ? (
Aucune modification de forfait n'est disponible pour cette instance actuellement.
) : (
{upgradeOptions.map(([targetId, targetName]) => (
{targetName}
))}
* Le système calculera automatiquement le prorata. Une facture de différence ou une note de crédit sera générée selon votre choix.
)} {/* ZONE DANGER : RÉSILIATION */}

Zone Critique

Renoncer à l'abonnement

L'instance restera opérationnelle jusqu'à la fin de la période facturée. Elle sera ensuite détruite et les données effacées.

setCustomAlert(null)} />
); }