import { getAusweisartFromId } from "#components/Ausweis/types.js"; import { adminMiddleware } from "#lib/middleware/authorization.js"; import { Aufnahme, BedarfsausweisWohnen, Benutzer, Bild, Enums, Objekt, prisma, VerbrauchsausweisGewerbe, VerbrauchsausweisWohnen, } from "#lib/server/prisma.js"; import { APIError, defineApiRoute } from "astro-typesafe-api/server"; import { z } from "astro:content"; import { transport } from "#lib/mail.js"; import { BASE_URI } from "#lib/constants.js"; import { getAnsichtsausweis, getDatenblatt } from "#lib/server/ausweis.js"; import { PutObjectCommand } from "@aws-sdk/client-s3"; import { s3Client } from "#lib/s3.js"; import { createInvoice, getLexOfficeRechnung } from "#lib/server/invoice.js"; import { tryCatch } from "#lib/tryCatch.js"; import { getBedarfsausweisWohnenKomplett, getVerbrauchsausweisGewerbeKomplett, getVerbrauchsausweisWohnenKomplett, } from "#lib/server/db.js"; export const GET = defineApiRoute({ input: z.object({ id_ausweis: z.string(), }), output: z.void(), middleware: adminMiddleware, async fetch({ id_ausweis }, context, user) { const ausweisart = getAusweisartFromId(id_ausweis); let ausweis: | (( | VerbrauchsausweisGewerbe | VerbrauchsausweisWohnen | BedarfsausweisWohnen ) & { aufnahme: Aufnahme & { bilder: Bild[]; objekt: Objekt & { benutzer: Benutzer | null; }; }; }) | null = null; if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) { ausweis = await getVerbrauchsausweisWohnenKomplett(id_ausweis); } else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) { ausweis = await getVerbrauchsausweisGewerbeKomplett(id_ausweis); } else if (ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) { ausweis = await getBedarfsausweisWohnenKomplett(id_ausweis); } if (!ausweis) { throw new APIError({ code: "BAD_REQUEST", message: "Ausweis existiert nicht.", }); } const rechnung = await prisma.rechnung.findFirst({ where: { verbrauchsausweis_wohnen: { id: id_ausweis, }, }, orderBy: { erstellt_am: "desc", }, }); if (!rechnung) { throw new APIError({ code: "BAD_REQUEST", message: "Die Rechnung wurde noch nicht erstellt, wir können nicht fortfahren.", }); } if (!rechnung.lex_office_id) { const [result, error] = await tryCatch( createInvoice(ausweis, rechnung) ); if (error) { return; } const { id, voucherNumber } = result; await prisma.rechnung.update({ where: { id: rechnung.id, }, data: { lex_office_id: id, }, }); } const pdfAusweis = await getAnsichtsausweis( ausweis, ausweis.aufnahme, ausweis.aufnahme.objekt, ausweis.aufnahme.bilder, ausweis.aufnahme.objekt.benutzer, false ); const pdfDatenblatt = await getDatenblatt( ausweis, ausweis.aufnahme, ausweis.aufnahme.objekt, ausweis.aufnahme.bilder, ausweis.aufnahme.objekt.benutzer ); const [pdfRechnung, pdfRechnungError] = await tryCatch(getLexOfficeRechnung(rechnung)); if (pdfRechnungError) { throw new APIError({ code: "INTERNAL_SERVER_ERROR", message: "Rechnungs PDF konnte nicht generiert werden." }) } if (!pdfAusweis) { throw new APIError({ code: "INTERNAL_SERVER_ERROR", message: "Ausweis PDF konnte nicht generiert werden." }) } if (!pdfDatenblatt) { throw new APIError({ code: "INTERNAL_SERVER_ERROR", message: "Datenblatt PDF konnte nicht generiert werden." }) } const ausweisCommand = new PutObjectCommand({ Bucket: "ibc-pdfs", Key: `ID_${ausweis.id}_Energieausweis.pdf`, Body: pdfAusweis, ACL: "private", }); await s3Client.send(ausweisCommand); const datenblattCommand = new PutObjectCommand({ Bucket: "ibc-pdfs", Key: `ID_${ausweis.id}_Datenblatt.pdf`, Body: pdfDatenblatt, ACL: "private", }); await s3Client.send(datenblattCommand); const rechnungsCommand = new PutObjectCommand({ Bucket: "ibc-pdfs", Key: `ID_${ausweis.id}_Rechnung.pdf`, Body: pdfDatenblatt, ACL: "private", }); await s3Client.send(rechnungsCommand); let html: string; if (rechnung.status === Enums.Rechnungsstatus.paid) { html = `

Sehr geehrte*r ${user.vorname} ${user.name},

im Anhang finden Sie Ihren geprüften Energieusweis inkl. Rechnung als PDF-Datei. Den Rechnungsbetrag haben Sie bereits bezahlt. Vielen Dank.

Mit freundlichen Grüßen,
Dipl.-Ing. Jens Cornelsen

IB Cornelsen
Katendeich 5A
21035 Hamburg
www.online-energieausweis.org

fon 040 · 209339850
fax 040 · 209339859

`; } else { html = `

Sehr geehrte*r ${user.vorname} ${user.name},

im Anhang finden Sie Ihren geprüften Energieusweis inkl. Rechnung als PDF-Datei. Nachfolgend finden Sie unsere Bankverbindung. Bitte geben Sie als Verwendungszweck die Rechnungsnummer an (siehe unten). Vielen Dank.


Kreditinstitut:\t Commerzbank AG
Empfänger:\t IB Cornelsen
IBAN:\t DE81 2004 0000 0348 6008 00
BIC:\t COBADEFFXXX
Betrag:\t ${rechnung.betrag}€
Verwendungszweck:\t ${rechnung.id}

Alternativ können Sie auch direkt online zahlen indem Sie auf den entsprechenden Link klicken:


Per Einzuglastschrift zahlen : jetzt per ELV bezahlen
Per Sofortüberweisung zahlen : jetzt per Sofortüberweisung bezahlen
Über PayPal zahlen : jetzt per Paypal bezahlen
Per Giropay zahlen : jetzt per Giropay bezahlen
Per Visa oder MasterCard zahlen : jetzt per Kreditkarte bezahlen

Mit freundlichen Grüßen,
Dipl.-Ing. Jens Cornelsen

IB Cornelsen
Katendeich 5A
21035 Hamburg
www.online-energieausweis.org

fon 040 · 209339850
fax 040 · 209339859

`; } await transport.sendMail({ from: `"IBCornelsen" `, to: user.email, bcc: "info@online-energieausweis.org", subject: `Ihr Originalausweis vom Ingenieurbüro Cornelsen (ID: ${ausweis.id})`, html, attachments: [{ filename: `ID_${ausweis.id}_Ansichtsausweis.pdf`, encoding: "binary", content: Buffer.from(pdfAusweis), contentType: "application/pdf", contentDisposition: "attachment", }, { filename: `ID_${ausweis.id}_Datenblatt.pdf`, encoding: "binary", content: Buffer.from(pdfDatenblatt), contentType: "application/pdf", contentDisposition: "attachment", }, { filename: `ID_${ausweis.id}_Rechnung.pdf`, encoding: "binary", content: Buffer.from(pdfRechnung), contentType: "application/pdf", contentDisposition: "attachment", }] }); if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) { await prisma.verbrauchsausweisWohnen.update({ where: { id: ausweis.id, }, data: { ausgestellt: true, }, }); } else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) { await prisma.verbrauchsausweisGewerbe.update({ where: { id: ausweis.id, }, data: { ausgestellt: true, }, }); } else if (ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) { await prisma.bedarfsausweisWohnen.update({ where: { id: ausweis.id, }, data: { ausgestellt: true, }, }); } }, });