import { prisma } from "#lib/server/prisma.js"; import moment from "moment"; import csv from "csvtojson" // Als erstes schauen wir, welches das letzte Jahr ist, für das wir einen Verbrauchsausweis haben. // Das machen wir, indem wir die Ausweise nach Jahr und Monat sortieren und dann den letzten Eintrag nehmen. const newestDate = await prisma.klimafaktoren.findFirst({ orderBy: [ { year: "desc", }, { month: "desc", } ] }) if (!newestDate) { console.error("No last year found!") process.exit(1) } // Jetzt müssen wir abfragen, welche neuen Dateien es beim Deutschen Wetterdienst gibt. // https://opendata.dwd.de/climate_environment/CDC/derived_germany/techn/monthly/climate_correction_factor/recent/ // Weil die Antwort in HTML ist und wir keinen Bock haben das alles zu parsen, versuchen wir einfach die neueste Datei abzufragen. // Das format des DWD ist wie folgt: KF_20221101_20231031.csv // Der Monat bei moment und in der Datenbank ist nullbasiert, also 0 = Januar, 11 = Dezember. const currentDate = moment().set("month", newestDate.month).set("year", newestDate.year).set("date", 1); const lastYearString = currentDate.clone().add(1, "month").startOf("month").format("YYYYMMDD"); const nextYearString = currentDate.clone().add(1, "year").endOf("month").format("YYYYMMDD"); const filename = `KF_${lastYearString}_${nextYearString}.csv` const url = "https://opendata.dwd.de/climate_environment/CDC/derived_germany/techn/monthly/climate_correction_factor/recent/" const response = await fetch(`${url}${filename}`) if (response.status !== 200) { console.error(`Could not fetch ${url}${filename}`) process.exit(1) } const parser = csv({ noheader: false, output: "json", delimiter: ";", }) const data: { DatAnf: string, DatEnd: string, PLZ: string, KF: string }[] = await parser.fromString(await response.text()) const year = currentDate.clone().add(1, "month").year(); const month = currentDate.clone().add(1, "month").month(); const result = await prisma.klimafaktoren.createMany({ data: data.map((row) => { return { year, month, klimafaktor: parseFloat(row.KF), plz: row.PLZ, } }) }) console.log(`Updated ${result.count} rows! Pulled ${filename}`)