Sistemato magazzino

This commit is contained in:
Lorenzo Sanesi
2026-08-01 03:12:23 +02:00
parent de921abcd6
commit 0fdf395733
128 changed files with 9307 additions and 3076 deletions
+204
View File
@@ -0,0 +1,204 @@
import { PrismaClient, StatoMateriale } from "@prisma/client";
const prisma = new PrismaClient();
// Placeholder di orgId per il materiale di catalogo seedato manualmente (non riconducibile
// a nessuna organizzazione reale), analogo a UTENTE_MODIFICA="MANUALE" nel seed di attivita-be.
const ORG_SISTEMA = "SISTEMA";
async function main() {
const materiali = [
{ id: "materiale-corda", nome: "Corda", categoria: "Attrezzatura", unitaMisura: "pz" },
{ id: "materiale-torcia", nome: "Torcia", categoria: "Attrezzatura", unitaMisura: "pz" },
{
id: "materiale-kit-primo-soccorso",
nome: "Kit primo soccorso",
categoria: "Sicurezza",
unitaMisura: "kit",
},
{ id: "materiale-tenda", nome: "Tenda", categoria: "Campeggio", unitaMisura: "pz" },
{
id: "materiale-fornello-campo",
nome: "Fornello da campo",
categoria: "Campeggio",
unitaMisura: "pz",
},
{
id: "materiale-zaino",
nome: "Zaino",
categoria: "Equipaggiamento personale",
unitaMisura: "pz",
},
{
id: "materiale-sacco-a-pelo",
nome: "Sacco a pelo",
categoria: "Equipaggiamento personale",
unitaMisura: "pz",
},
{
id: "materiale-borraccia",
nome: "Borraccia",
categoria: "Equipaggiamento personale",
unitaMisura: "pz",
},
{ id: "materiale-garze", nome: "Garze", categoria: "Sicurezza", unitaMisura: "pz" },
{ id: "materiale-cerotti", nome: "Cerotti", categoria: "Sicurezza", unitaMisura: "pz" },
{
id: "materiale-disinfettante",
nome: "Disinfettante",
categoria: "Sicurezza",
unitaMisura: "flacone",
},
];
await Promise.all(
materiali.map((materiale) =>
prisma.materiale.upsert({
where: { id: materiale.id },
update: {
...materiale,
stato: StatoMateriale.approvato,
propostoDaOrgId: ORG_SISTEMA,
},
create: {
...materiale,
stato: StatoMateriale.approvato,
propostoDaOrgId: ORG_SISTEMA,
},
})
)
);
const tipiEvento = [
{ id: "tipo-evento-uscita-giorno", nome: "Uscita di un giorno" },
{ id: "tipo-evento-campo-estivo", nome: "Campo estivo" },
{ id: "tipo-evento-riunione-settimanale", nome: "Riunione settimanale" },
];
await Promise.all(
tipiEvento.map((tipoEvento) =>
prisma.tipoEvento.upsert({
where: { id: tipoEvento.id },
update: { nome: tipoEvento.nome },
create: tipoEvento,
})
)
);
// Le ex "liste modello" sono ora liste unificate: pubbliche, già approvate dalla
// moderazione, senza autore/org (scritte direttamente dal seed, come farebbe un
// moderatore in bypass della coda di proposte).
const listeModello = [
{
id: "lista-modello-uscita-giorno",
nome: "Materiale base uscita giornaliera",
tipoEventoId: "tipo-evento-uscita-giorno",
},
{
id: "lista-modello-campo-estivo",
nome: "Materiale base campo estivo",
tipoEventoId: "tipo-evento-campo-estivo",
},
// Sotto-lista "foglia" (nessuna sotto-lista propria): allegata come sotto-lista sia a
// "uscita di un giorno" sia a "campo estivo", al posto del vecchio materiale generico
// "materiale-kit-primo-soccorso", per verificare il nesting a un livello.
{
id: "lista-modello-kit-primo-soccorso",
nome: "Kit di pronto soccorso",
tipoEventoId: "tipo-evento-uscita-giorno",
},
];
for (const listaModello of listeModello) {
await prisma.lista.upsert({
where: { id: listaModello.id },
update: { ...listaModello, stato: "pubblico", statoModerazione: "approvato" },
create: {
...listaModello,
orgId: null,
creataDaUserId: null,
stato: "pubblico",
statoModerazione: "approvato",
},
});
}
const listeModelloVoci = [
{ listaId: "lista-modello-uscita-giorno", materialeId: "materiale-zaino", quantita: 1 },
{
listaId: "lista-modello-uscita-giorno",
materialeId: "materiale-borraccia",
quantita: 1,
},
{ listaId: "lista-modello-uscita-giorno", materialeId: "materiale-torcia", quantita: 1 },
{ listaId: "lista-modello-campo-estivo", materialeId: "materiale-tenda", quantita: 1 },
{
listaId: "lista-modello-campo-estivo",
materialeId: "materiale-sacco-a-pelo",
quantita: 1,
},
{
listaId: "lista-modello-campo-estivo",
materialeId: "materiale-fornello-campo",
quantita: 1,
},
{ listaId: "lista-modello-campo-estivo", materialeId: "materiale-corda", quantita: 2 },
// Voci della sotto-lista "Kit di pronto soccorso" (foglia, allegata sotto a due liste diverse).
{ listaId: "lista-modello-kit-primo-soccorso", materialeId: "materiale-garze", quantita: 3 },
{
listaId: "lista-modello-kit-primo-soccorso",
materialeId: "materiale-cerotti",
quantita: 10,
},
{
listaId: "lista-modello-kit-primo-soccorso",
materialeId: "materiale-disinfettante",
quantita: 1,
},
];
// Rimuove il vecchio materiale generico "kit primo soccorso" piazzato direttamente nelle due
// liste padre: da questo seed in poi il kit è la sotto-lista dedicata, non più una singola voce.
await prisma.listaVoce.deleteMany({
where: {
materialeId: "materiale-kit-primo-soccorso",
listaId: { in: ["lista-modello-uscita-giorno", "lista-modello-campo-estivo"] },
},
});
for (const voce of listeModelloVoci) {
await prisma.listaVoce.upsert({
where: {
listaId_materialeId: {
listaId: voce.listaId,
materialeId: voce.materialeId,
},
},
update: { quantita: voce.quantita },
create: voce,
});
}
const sottoListe = [
{ listaId: "lista-modello-uscita-giorno", sottoListaId: "lista-modello-kit-primo-soccorso" },
{ listaId: "lista-modello-campo-estivo", sottoListaId: "lista-modello-kit-primo-soccorso" },
];
for (const sottoLista of sottoListe) {
await prisma.listaSottoLista.upsert({
where: {
listaId_sottoListaId: {
listaId: sottoLista.listaId,
sottoListaId: sottoLista.sottoListaId,
},
},
update: {},
create: sottoLista,
});
}
}
main()
.catch((error) => {
console.error(error);
process.exitCode = 1;
})
.finally(async () => {
await prisma.$disconnect();
});