205 lines
6.3 KiB
TypeScript
205 lines
6.3 KiB
TypeScript
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();
|
|
});
|