Conferma eliminazione
Sei sicuro di voler eliminare {deleteConfirm.nome}?
Verranno eliminati anche tutti i sotto-elementi.
+
+ {deleteConfirm.hasArticoli && (
+
+
+ Questa macchina contiene articoli assegnati. Seleziona il magazzino dove far rientrare gli articoli:
+
+ {deleteMagazzini.length === 0 ? (
+
+ Nessun magazzino disponibile per questo stabilimento. Gli articoli andranno persi.
+
+ ) : (
+
+ )}
+ {deleteMagazzini.length > 0 && !deleteConfirm.idMagazzinoRientro && (
+
+ Devi selezionare un magazzino per procedere
+
+ )}
+
+ )}
+
diff --git a/src/lib/macchine/index.ts b/src/lib/macchine/index.ts
index f7fa565..3ccfa0a 100644
--- a/src/lib/macchine/index.ts
+++ b/src/lib/macchine/index.ts
@@ -162,7 +162,82 @@ export async function updateMacchina(
return getMacchinaById(id);
}
-export async function deleteMacchina(id: number): Promise {
+export async function deleteMacchina(
+ id: number,
+ idMagazzinoRientro?: number,
+ user: string = "system"
+): Promise {
+ // Recupera gli articoli assegnati a questa macchina
+ const [articoliRows] = await db.execute<(RowDataPacket & {
+ idart: number;
+ qtain: number;
+ qtaout: number;
+ descrizione: string;
+ codice: string;
+ })[]>(
+ `SELECT idart, qtain, qtaout, descrizione, codice
+ FROM art_macchine_parti
+ WHERE idmacchina = :id AND (qtain - qtaout) > 0`,
+ { id }
+ );
+
+ // Se c'è un magazzino di rientro, fai il carico degli articoli
+ if (idMagazzinoRientro && articoliRows.length > 0) {
+ for (const art of articoliRows) {
+ const quantita = art.qtain - art.qtaout;
+ if (quantita <= 0) continue;
+
+ // Verifica se l'articolo esiste ancora nel catalogo
+ const [existsRows] = await db.execute<(RowDataPacket & { id: number })[]>(
+ "SELECT id FROM articoli WHERE id = :idart LIMIT 1",
+ { idart: art.idart }
+ );
+
+ if (existsRows.length > 0) {
+ // L'articolo esiste, registra il movimento di carico
+ await db.execute(
+ `INSERT INTO movimenti (id_articolo, articolo_codice, articolo_descrizione, quantita, tipo_movimento, causale, utente, id_magazzino_destinazione)
+ VALUES (:id_articolo, :articolo_codice, :articolo_descrizione, :quantita, 1, :causale, :utente, :id_magazzino_destinazione)`,
+ {
+ id_articolo: art.idart,
+ articolo_codice: art.codice,
+ articolo_descrizione: art.descrizione,
+ quantita,
+ causale: "Rientro da eliminazione macchina",
+ utente: user,
+ id_magazzino_destinazione: idMagazzinoRientro,
+ }
+ );
+
+ // Aggiorna la giacenza
+ const [existingGiacenza] = await db.execute<(RowDataPacket & { id: number })[]>(
+ "SELECT id FROM giacenze WHERE articolo_id = :articoloId AND id_magazzino = :magazzinoId",
+ { articoloId: art.idart, magazzinoId: idMagazzinoRientro }
+ );
+
+ if (existingGiacenza.length > 0) {
+ await db.execute(
+ "UPDATE giacenze SET quantita = quantita + :quantita WHERE articolo_id = :articoloId AND id_magazzino = :magazzinoId",
+ { quantita, articoloId: art.idart, magazzinoId: idMagazzinoRientro }
+ );
+ } else {
+ await db.execute(
+ "INSERT INTO giacenze (articolo_id, id_magazzino, quantita) VALUES (:articoloId, :magazzinoId, :quantita)",
+ { articoloId: art.idart, magazzinoId: idMagazzinoRientro, quantita }
+ );
+ }
+ }
+ // Se l'articolo non esiste più, non facciamo nulla (gli articoli vengono persi)
+ }
+ }
+
+ // Elimina gli articoli assegnati a questa macchina
+ await db.execute(
+ "DELETE FROM art_macchine_parti WHERE idmacchina = :id",
+ { id }
+ );
+
+ // Elimina ricorsivamente i figli
const [childRows] = await db.execute(
"SELECT id FROM macchine_parti WHERE id_padre = :id",
{ id }
@@ -170,7 +245,7 @@ export async function deleteMacchina(id: number): Promise {
if (childRows.length > 0) {
for (const child of childRows) {
- await deleteMacchina(child.id);
+ await deleteMacchina(child.id, idMagazzinoRientro, user);
}
}