"use client"; import { useState, useEffect } from "react"; import type { ArticoloAssegnatoMacchina } from "@/src/types/artMacchineParti"; import type { Magazzino } from "@/src/types/stabilimento"; interface ArticoliMacchinaModalProps { macchinaId: number; macchinaNome: string; macchinaStabilimentoId: number | null; articoli: ArticoloAssegnatoMacchina[]; onClose: () => void; onArticoloRimosso: () => void; } interface RimuoviModalState { articolo: ArticoloAssegnatoMacchina; quantita: number; opzione: "carico" | "elimina"; idMagazzino: number | null; articoloEsiste: boolean; } export default function ArticoliMacchinaModal({ macchinaId, macchinaNome, macchinaStabilimentoId, articoli, onClose, onArticoloRimosso, }: ArticoliMacchinaModalProps) { const [rimuoviModal, setRimuoviModal] = useState(null); const [saving, setSaving] = useState(false); const [error, setError] = useState(null); const [magazzini, setMagazzini] = useState([]); useEffect(() => { async function fetchMagazzini() { if (!macchinaStabilimentoId) return; try { const res = await fetch("/api/magazzini"); if (res.ok) { const data = await res.json(); // Filtra solo i magazzini dello stabilimento della macchina const filtered = data.magazzini.filter( (m: Magazzino) => m.id_stabilimento === macchinaStabilimentoId ); setMagazzini(filtered); } } catch (err) { console.error("Errore caricamento magazzini:", err); } } fetchMagazzini(); }, [macchinaStabilimentoId]); const handleRimuoviClick = async (articolo: ArticoloAssegnatoMacchina) => { setError(null); // Verifica se l'articolo esiste ancora nel catalogo let articoloEsiste = true; try { const res = await fetch(`/api/articoli/${articolo.id_articolo}`); // Solo 404 indica che l'articolo non esiste // Altri errori (401, 500, etc.) non significano che l'articolo non esiste articoloEsiste = res.status !== 404; } catch { // In caso di errore di rete, assumiamo che l'articolo esista articoloEsiste = true; } // Ricarica i dati freschi per questo articolo dalla macchina let quantitaReale = articolo.quantita; try { const res = await fetch("/api/art-macchine-parti"); if (res.ok) { const data = await res.json(); const articoliMacchina = data.articoliPerMacchina?.[macchinaId] || []; const articoloFresco = articoliMacchina.find( (a: ArticoloAssegnatoMacchina) => a.id_articolo === articolo.id_articolo ); if (articoloFresco) { quantitaReale = articoloFresco.quantita; } else { // L'articolo non è più assegnato a questa macchina quantitaReale = 0; } } } catch { // In caso di errore, usa la quantità originale } if (quantitaReale <= 0) { setError("Questo articolo non ha più quantità disponibile su questa macchina"); return; } setRimuoviModal({ articolo: { ...articolo, quantita: quantitaReale }, quantita: 1, opzione: articoloEsiste ? "carico" : "elimina", idMagazzino: null, articoloEsiste, }); }; const handleConfermaRimozione = async () => { if (!rimuoviModal) return; if (rimuoviModal.opzione === "carico" && !rimuoviModal.idMagazzino) { setError("Seleziona un magazzino per il rientro"); return; } setSaving(true); setError(null); try { const res = await fetch( `/api/art-macchine-parti/${macchinaId}/${rimuoviModal.articolo.id_articolo}`, { method: "DELETE", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ quantita: rimuoviModal.quantita, opzione: rimuoviModal.opzione, idMagazzino: rimuoviModal.idMagazzino, }), } ); if (!res.ok) { const data = await res.json(); throw new Error(data.error || "Errore nella rimozione"); } setRimuoviModal(null); onArticoloRimosso(); } catch (err) { setError(err instanceof Error ? err.message : "Errore sconosciuto"); } finally { setSaving(false); } }; return (

Articoli Assegnati

{macchinaNome}

{articoli.length === 0 ? (
Nessun articolo assegnato
) : (
{articoli.map((art) => (

{art.descrizione}

{art.codice}

{art.quantita}
assegnati
))}
)}
Totale: {articoli.reduce((sum, a) => sum + a.quantita, 0)} pezzi in {articoli.length} articoli
{/* Modal conferma rimozione */} {rimuoviModal && (
!saving && setRimuoviModal(null)} />

Rimuovi Articolo

{rimuoviModal.articolo.descrizione}

{error && (
{error}
)}
setRimuoviModal({ ...rimuoviModal, quantita: Math.min( Math.max(1, parseInt(e.target.value) || 1), rimuoviModal.articolo.quantita ), }) } className="w-full px-3 py-2 bg-zinc-800 border border-zinc-700 rounded-lg text-white focus:outline-none focus:ring-2 focus:ring-teal-500" />
{!rimuoviModal.articoloEsiste && (
Questo articolo non esiste più nel catalogo. Verrà eliminato senza possibilità di rientro in magazzino.
)}
{rimuoviModal.articoloEsiste && ( )}
{rimuoviModal.opzione === "carico" && (

Seleziona il magazzino di destinazione

{magazzini.length === 0 ? (

Nessun magazzino disponibile per lo stabilimento di questa macchina

) : ( <>
{!rimuoviModal.idMagazzino && (

Devi selezionare un magazzino per confermare il rientro

)} )}
)}
)}
); }