// Das wird ausgeführt, wenn wir `npx prisma db seed` ausführen // Hier können wir unsere Datenbank mit Beispieldaten füllen // Mehr Infos: https://www.prisma.io/docs/orm/prisma-migrate/workflows/seeding import { PrismaClient } from "@prisma/client"; import crypto from "node:crypto"; import { faker } from "@faker-js/faker"; import { Enums } from "../src/lib/client/prisma"; import moment from "moment"; function hashPassword(password: string): string { const salt = crypto.randomBytes(16).toString("hex"); const hash = hashWithGivenSalt(password, salt) + salt; return hash; } function hashWithGivenSalt(password: string, salt: string): string { const hash = crypto.scryptSync(password, salt, 32).toString("hex"); return hash; } const prisma = new PrismaClient({ log: ["warn", "error"], errorFormat: "pretty", datasources: { db: { url: process.env.POSTGRES_DATABASE_URL, }, }, }); // Wir wollen erstmal das Backup mit den Klimafaktoren und der PLZ Liste einfuegen. // Dazu muessen wir die Tabelle leeren. await prisma.klimafaktoren.deleteMany({ where: { id: { not: 0 }, }, }); await prisma.postleitzahlen.deleteMany({ where: { id: { not: 0 }, }, }); // Jetzt koennen wir die Daten aus dem Backup einlesen. const klimafaktoren = await Bun.file("./backup/klimafaktoren.json").json(); await prisma.klimafaktoren.createMany({ data: klimafaktoren.map((klimafaktor: [number, number, number, string]) => { return { plz: klimafaktor[3], month: klimafaktor[1], year: klimafaktor[0], klimafaktor: klimafaktor[2], }; }), }); const postleitzahlen = await Bun.file("./backup/postleitzahlen.json").json(); await prisma.postleitzahlen.createMany({ data: postleitzahlen.map( (postleitzahl: { plz: string; ort: string; landkreis: string; bundesland: string; lat: number; lon: number; }) => { return { plz: postleitzahl.plz, stadt: postleitzahl.ort, landkreis: postleitzahl.landkreis, bundesland: postleitzahl.bundesland, lat: postleitzahl.lat, lon: postleitzahl.lon, }; } ), }); // Admin erstellen await prisma.benutzer.create({ data: { email: "admin@ib-cornelsen.de", passwort: hashPassword("passwort"), rolle: "ADMIN", name: "Admin", vorname: "Admin", adresse: "Adminstraße 1", plz: "12345", }, }); // Test Benutzer erstellen await prisma.benutzer.create({ data: { email: "user@ib-cornelsen.de", passwort: hashPassword("passwort"), rolle: "USER", name: "User", vorname: "User", adresse: "Userstraße 1", plz: "12345", }, }); // Benutzer erstellen for (let i = 0; i < 10; i++) { let firstName = faker.person.firstName(); let lastName = faker.person.lastName(); const benutzer = await prisma.benutzer.create({ data: { email: faker.internet.email({ firstName: firstName, lastName: lastName, }), passwort: hashPassword(faker.internet.password()), name: lastName, vorname: firstName, adresse: faker.location.street(), plz: faker.location.zipCode({ format: "#####" }), ort: faker.location.city(), rolle: "USER", }, }); for (let j = 0; j < Math.round(Math.random() * 5); j++) { // Für jeden Nutzer erstellen wir auch noch bis zu 5 Ausweise. await prisma.objekt.create({ data: { adresse: faker.location.street(), latitude: faker.location.latitude(), longitude: faker.location.longitude(), ort: faker.location.city(), plz: faker.location.zipCode({ format: "#####" }), benutzer: { connect: { id: benutzer.id, }, }, aufnahmen: { create: { alternative_heizung: faker.datatype.boolean(), alternative_kuehlung: faker.datatype.boolean(), alternative_lueftung: faker.datatype.boolean(), alternative_warmwasser: faker.datatype.boolean(), aussenwand_gedaemmt: faker.datatype.boolean(), aussenwand_min_12cm_gedaemmt: faker.datatype.boolean(), baujahr_gebaeude: [faker.date.past().getFullYear()], baujahr_heizung: [faker.date.past().getFullYear()], baujahr_klima: [faker.date.past().getFullYear()], benutzer: { connect: { id: benutzer.id, }, }, verbrauchsausweise_wohnen: { create: { benutzer: { connect: { id: benutzer.id, }, }, }, }, }, }, }, }); } } export async function importVerbrauchsausweisWohnenAltesSystem( count: number = 5 ) { const response = await fetch( "https://online-energieausweis.org/user/ausweis-import.php", { method: "POST", body: JSON.stringify({ i: count, offset: 0, q: {}, }), } ); const data = await response.json(); return data; } export async function verbrauchsausweisWohnenImportTranslate( ausweis: Record ) { let firstName = faker.person.firstName(); let lastName = faker.person.lastName(); const benutzer = await prisma.benutzer.create({ data: { email: faker.internet.email({ firstName: firstName, lastName: lastName, }), passwort: hashPassword(faker.internet.password()), name: lastName, vorname: firstName, adresse: faker.location.street(), plz: faker.location.zipCode({ format: "#####" }), ort: faker.location.city(), rolle: "USER", }, }); // TODO: Bilder Importieren const gebaeudeStammdaten = await prisma.objekt.create({ data: { adresse: ausweis.objekt_strasse, plz: ausweis.objekt_plz, ort: ausweis.objekt_ort, uid: faker.string.uuid(), latitude: null, longitude: null, benutzer: { connect: { id: benutzer.id, }, }, }, }); const gebaeudeAufnahmeAllgemein = await prisma.aufnahme.create({ data: { benutzer: { connect: { id: benutzer.id, }, }, baujahr_gebaeude: [parseInt(ausweis.baujahr_gebaeude)], baujahr_heizung: ausweis.baujahr_anlage ? [parseInt(ausweis.baujahr_anlage)] : [], baujahr_klima: ausweis.baujahr_klimaanlage ? [parseInt(ausweis.baujahr_klimaanlage)] : [], nutzflaeche: parseInt(ausweis.nutzflaeche), einheiten: parseInt(ausweis.anzahl_einheiten), saniert: ausweis.objekt_saniert ? true : false, keller: ausweis.keller_beheizt == "Beheizt" ? Enums.Heizungsstatus.BEHEIZT : ausweis.keller_beheizt == "Unbeheizt" ? Enums.Heizungsstatus.UNBEHEIZT : Enums.Heizungsstatus.NICHT_VORHANDEN, dachgeschoss: ausweis.dachgeschoss == "Beheizt" ? Enums.Heizungsstatus.BEHEIZT : ausweis.dachgeschoss == "Unbeheizt" ? Enums.Heizungsstatus.UNBEHEIZT : Enums.Heizungsstatus.NICHT_VORHANDEN, flaeche: parseInt(ausweis.wohnflaeche), gebaeudetyp: ausweis.objekt_typ, gebaeudeteil: ausweis.objekt_gebaeudeteil, lueftung: ausweis.lueftungskonzept, // NOTE: Warum ist das kein Bool? kuehlung: ausweis.wird_gekuehlt ? "true" : "false", brennstoff_1: ausweis.energietraeger_1, brennstoff_2: ausweis.energietraeger_2, alternative_heizung: ausweis.alheizung ? true : false, alternative_kuehlung: ausweis.alkuehlung ? true : false, alternative_lueftung: ausweis.allueftung ? true : false, alternative_warmwasser: ausweis.alwarmwasser ? true : false, ausweisart: Enums.Ausweisart.VerbrauchsausweisWohnen, energieeffizienzklasse: "", aussenwand_gedaemmt: ausweis.aussenwand_gedaemmt ? true : false, aussenwand_min_12cm_gedaemmt: ausweis.aussenwand_min_12cm_gedaemmt ? true : false, bestellt: ausweis.bestellt ? true : false, boxpruefung: ausweis.boxpruefung ? true : false, brennwert_kessel: ausweis.brennwert_kessel ? true : false, dachgeschoss_gedaemmt: ausweis.dachgeschoss_gedaemmt ? true : false, dachgeschoss_min_12cm_gedaemmt: ausweis.dachgeschoss_min_12cm_gedaemmt ? true : false, doppel_verglasung: ausweis.doppel_verglasung ? true : false, dreifach_verglasung: ausweis.dreifach_verglasung ? true : false, durchlauf_erhitzer: ausweis.durchlauf_erhitzer ? true : false, einfach_verglasung: ausweis.einfach_verglasung ? true : false, einzelofen: ausweis.einzelofen ? true : false, erledigt: ausweis.erledigt ? true : false, fenster_dicht: ausweis.fenster_dicht ? true : false, fenster_teilweise_undicht: ausweis.fenster_teilweise_undicht ? true : false, heizungsrohre_gedaemmt: ausweis.heizungsrohre_gedaemmt ? true : false, isolier_verglasung: ausweis.isolier_verglasung ? true : false, keller_decke_gedaemmt: ausweis.keller_decke_gedaemmt ? true : false, keller_wand_gedaemmt: ausweis.keller_wand_gedaemmt ? true : false, niedertemperatur_kessel: ausweis.niedertemperatur_kessel ? true : false, oberste_geschossdecke_gedaemmt: ausweis.oberste_geschossdecke_gedaemmt ? true : false, oberste_geschossdecke_min_12cm_gedaemmt: ausweis.oberste_geschossdecke_min_12cm_gedaemmt ? true : false, raum_temperatur_regler: ausweis.raum_temperatur_regler ? true : false, rolllaeden_kaesten_gedaemmt: ausweis.rolllaeden_kaesten_gedaemmt ? true : false, solarsystem_warmwasser: ausweis.solarsystem_warmwasser ? true : false, standard_kessel: ausweis.standard_kessel ? true : false, waermepumpe: ausweis.waermepumpe ? true : false, warmwasser_rohre_gedaemmt: ausweis.warmwasser_rohre_gedaemmt ? true : false, zentralheizung: ausweis.zentralheizung ? true : false, zirkulation: ausweis.zirkulation ? true : false, photovoltaik: ausweis.photovoltaik ? true : false, leerstand: ausweis.leerstand, prueftext: ausweis["check-texts"], storniert: false, tueren_dicht: ausweis.tueren_dicht ? true : false, tueren_undicht: ausweis.tueren_undicht ? true : false, zurueckgestellt: ausweis.zurueckGestellt ? true : false, uid: faker.string.uuid(), ausstellungsdatum: moment(ausweis.bestelldatum).toDate(), erstellungsdatum: moment(ausweis.erstellungsdatum).toDate(), objekt: { connect: { id: gebaeudeStammdaten.id, }, }, }, }); let startdatum = moment( `${ausweis.energieverbrauch_zeitraum_jahr}-${ausweis.energieverbrauch_zeitraum_monat}-01` ).toDate(); if (isNaN(startdatum.getTime())) { startdatum = new Date(); } const verbrauchsausweisWohnen = await prisma.verbrauchsausweisWohnen.create( { data: { aufnahme: { connect: { id: gebaeudeAufnahmeAllgemein.id, }, }, benutzer: { connect: { id: benutzer.id, }, }, verbrauch_1: parseInt(ausweis.energieverbrauch_1_heizquelle_1), verbrauch_2: parseInt(ausweis.energieverbrauch_2_heizquelle_1), verbrauch_3: parseInt(ausweis.energieverbrauch_3_heizquelle_1), verbrauch_4: parseInt(ausweis.energieverbrauch_1_heizquelle_2), verbrauch_5: parseInt(ausweis.energieverbrauch_2_heizquelle_2), verbrauch_6: parseInt(ausweis.energieverbrauch_3_heizquelle_2), einheit_1: ausweis.energietraeger_einheit_heizquelle_1, einheit_2: ausweis.energietraeger_einheit_heizquelle_2, warmwasser_enthalten: ausweis.warmwasser_enthalten ? true : false, uid: faker.string.uuid(), alternative_heizung: ausweis.alheizung ? true : false, alternative_kuehlung: ausweis.alkuehlung ? true : false, alternative_lueftung: ausweis.allueftung ? true : false, alternative_warmwasser: ausweis.alwarmwasser ? true : false, anteil_warmwasser_1: ausweis.anteil_warmwasser_1, anteil_warmwasser_2: ausweis.anteil_warmwasser_2, ausstellgrund: ausweis.ausstellgrund, keller_beheizt: ausweis.keller_beheizt ? true : false, registriernummer: ausweis.regnummer, // Der Monat im alten System ist 1-basiert, in der neuen Datenbank 0-basiert // Also müssen wir hier 1 abziehen startdatum, warmwasser_anteil_bekannt: ausweis.warmwasser_anteil_bekannt ? true : false, zusaetzliche_heizquelle: ausweis.zusaetzliche_heizquelle ? true : false, }, } ); return verbrauchsausweisWohnen; } const ausweise = (await importVerbrauchsausweisWohnenAltesSystem(10)) as { data: any[], result_count: number }; for (const ausweis of ausweise.data) { await verbrauchsausweisWohnenImportTranslate(ausweis); }