Rechnung Import

This commit is contained in:
Moritz Utcke
2025-04-07 02:56:28 -04:00
parent e06c8273e8
commit 0f20fc1184
6 changed files with 146 additions and 1 deletions

View File

@@ -0,0 +1,2 @@
-- AlterTable
ALTER TABLE "Rechnung" ADD COLUMN "lex_office_id" TEXT;

View File

@@ -0,0 +1,2 @@
-- DropIndex
DROP INDEX "Rechnung_transaktions_referenz_key";

View File

@@ -51,8 +51,9 @@ model Rechnung {
erstellt_am DateTime @default(now()) erstellt_am DateTime @default(now())
bezahlt_am DateTime? bezahlt_am DateTime?
storniert_am DateTime? storniert_am DateTime?
transaktions_referenz String? @unique @db.VarChar transaktions_referenz String? @db.VarChar
partner_code String? partner_code String?
lex_office_id String?
benutzer_id String benutzer_id String
benutzer Benutzer @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction) benutzer Benutzer @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction)

View File

@@ -25,5 +25,6 @@ export const RechnungSchema = z.object({
storniert_am: z.date().nullish(), storniert_am: z.date().nullish(),
transaktions_referenz: z.string().nullish(), transaktions_referenz: z.string().nullish(),
partner_code: z.string().nullish(), partner_code: z.string().nullish(),
lex_office_id: z.string().nullish(),
benutzer_id: z.string(), benutzer_id: z.string(),
}) })

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,138 @@
import newRechnungenIdMap from "./new-rechnungen-id-map.json" with { type: "json" };
import newUserIdMap from "./new-user-id-map.json" with { type: "json" };
import { Enums, prisma } from "#lib/server/prisma.js";
import Papa from "papaparse"
import * as fs from "fs";
import { fileURLToPath } from "url";
import { generatePrefixedId } from "#lib/db.js";
import { VALID_UUID_PREFIXES } from "#lib/constants.js";
import moment from "moment";
const saveRechnungenMap = () => {
fs.writeFileSync(
fileURLToPath(new URL("./new-rechnungen-id-map.json", import.meta.url)),
JSON.stringify(newRechnungenIdMap)
);
};
const path = fileURLToPath(new URL("./rechnungen.csv", import.meta.url));
if (!fs.existsSync(path)) {
throw new Error(`${path} existiert nicht.`)
}
const file = fs.createReadStream(path, "utf8");
Papa.parse(file, {
header: true,
async complete(results, file) {
let i = 0;
for (const rechnung of results.data as any) {
if (rechnung.id in newRechnungenIdMap) {
continue;
}
if (!(rechnung.user_id in newUserIdMap)) {
console.log(`User ${rechnung.user_id} not found.`);
continue;
}
try {
const id = generatePrefixedId(6, VALID_UUID_PREFIXES.Rechnung)
const services: Enums.Service[] = []
if (rechnung.service_1) {
services.push(Enums.Service.Qualitaetsdruck)
}
if (rechnung.service_2) {
services.push(Enums.Service.Aushang)
}
if (rechnung.service_3) {
services.push(Enums.Service.SameDay)
}
if (rechnung.service_4) {
services.push(Enums.Service.Telefonberatung)
}
const paymentTypeMap = {
"UEBERWIESEN": Enums.Bezahlmethoden.rechnung,
"ueberweisung": Enums.Bezahlmethoden.rechnung,
"RECHNUNG": Enums.Bezahlmethoden.rechnung,
"-FAIL": Enums.Bezahlmethoden.rechnung,
"ELV-FAIL": Enums.Bezahlmethoden.sofort,
"ELV-OK": Enums.Bezahlmethoden.sofort,
"giropay": Enums.Bezahlmethoden.giropay,
"KK-FAIL": Enums.Bezahlmethoden.creditcard,
"KK-OK": Enums.Bezahlmethoden.creditcard,
"kreditkarte": Enums.Bezahlmethoden.creditcard,
"PAYP-FAIL": Enums.Bezahlmethoden.paypal,
"PAYP-OK": Enums.Bezahlmethoden.paypal,
"paypal": Enums.Bezahlmethoden.paypal,
"rechnung": Enums.Bezahlmethoden.rechnung,
"SEPA": Enums.Bezahlmethoden.rechnung,
"sepa": Enums.Bezahlmethoden.rechnung,
"sofort": Enums.Bezahlmethoden.sofort,
"SUE-FAIL": Enums.Bezahlmethoden.sofort,
"SUE-OK": Enums.Bezahlmethoden.sofort,
"": Enums.Bezahlmethoden.rechnung
}
await prisma.rechnung.create({
data: {
id,
betrag: parseFloat(rechnung.amount),
bezahlmethode: paymentTypeMap[rechnung.payment_type],
// bedarfsausweis_gewerbe,
// bedarfsausweis_wohnen,
// benutzer,
// benutzer_id,
status: rechnung.status === "storniert" ? Enums.Rechnungsstatus.canceled : rechnung.status,
bezahlt_am: moment(rechnung.date_created).toDate(),
email: rechnung.email,
empfaenger: `${rechnung.vorname} ${rechnung.name}`,
erstellt_am: moment(rechnung.date_created).toDate(),
// geg_nachweis_gewerbe,
// geg_nachweis_wohnen,
ort: rechnung.ort,
partner_code: rechnung.resellercode,
plz: rechnung.ort,
services,
strasse: rechnung.strasse,
transaktions_referenz: rechnung.transaction_id,
// verbrauchsausweis_gewerbe,
// verbrauchsausweis_wohnen,
versand_empfaenger: `${rechnung.vorname} ${rechnung.name}`,
versand_ort: rechnung.ort,
versand_plz: rechnung.plz,
versand_strasse: rechnung.strasse,
lex_office_id: rechnung.lex_office_id,
benutzer_id: newUserIdMap[rechnung.user_id]
}
});
newRechnungenIdMap[rechnung.id] = id;
} catch (e) {
saveRechnungenMap();
continue;
}
// Alle 50 werden gespeichert.
if (i % 50 == 0) {
console.log(`Saved ${i} - ${results.data.length - i} left`);
saveRechnungenMap();
}
i++;
}
}
});
process.on("SIGINT", () => {
console.log("Shutting down.");
saveRechnungenMap()
process.exit(0)
})