@@ -14,30 +14,29 @@ export const createCaller = createCallerFactory({
|
||||
"admin/stornieren": await import("../src/pages/api/admin/stornieren.ts"),
|
||||
"aufnahme": await import("../src/pages/api/aufnahme/index.ts"),
|
||||
"ausweise": await import("../src/pages/api/ausweise/index.ts"),
|
||||
"auth/access-token": await import("../src/pages/api/auth/access-token.ts"),
|
||||
"auth/passwort-vergessen": await import("../src/pages/api/auth/passwort-vergessen.ts"),
|
||||
"auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"),
|
||||
"bedarfsausweis-gewerbe/[id]": await import("../src/pages/api/bedarfsausweis-gewerbe/[id].ts"),
|
||||
"bedarfsausweis-gewerbe": await import("../src/pages/api/bedarfsausweis-gewerbe/index.ts"),
|
||||
"bedarfsausweis-wohnen/[id]": await import("../src/pages/api/bedarfsausweis-wohnen/[id].ts"),
|
||||
"bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"),
|
||||
"bilder/[id]": await import("../src/pages/api/bilder/[id].ts"),
|
||||
"geg-nachweis-gewerbe/[id]": await import("../src/pages/api/geg-nachweis-gewerbe/[id].ts"),
|
||||
"geg-nachweis-gewerbe": await import("../src/pages/api/geg-nachweis-gewerbe/index.ts"),
|
||||
"geg-nachweis-wohnen/[id]": await import("../src/pages/api/geg-nachweis-wohnen/[id].ts"),
|
||||
"geg-nachweis-wohnen": await import("../src/pages/api/geg-nachweis-wohnen/index.ts"),
|
||||
"geg-nachweis-gewerbe/[id]": await import("../src/pages/api/geg-nachweis-gewerbe/[id].ts"),
|
||||
"geg-nachweis-gewerbe": await import("../src/pages/api/geg-nachweis-gewerbe/index.ts"),
|
||||
"objekt": await import("../src/pages/api/objekt/index.ts"),
|
||||
"rechnung/[id]": await import("../src/pages/api/rechnung/[id].ts"),
|
||||
"rechnung/anfordern": await import("../src/pages/api/rechnung/anfordern.ts"),
|
||||
"rechnung": await import("../src/pages/api/rechnung/index.ts"),
|
||||
"ticket": await import("../src/pages/api/ticket/index.ts"),
|
||||
"user": await import("../src/pages/api/user/index.ts"),
|
||||
"user/self": await import("../src/pages/api/user/self.ts"),
|
||||
"verbrauchsausweis-gewerbe/[id]": await import("../src/pages/api/verbrauchsausweis-gewerbe/[id].ts"),
|
||||
"verbrauchsausweis-gewerbe": await import("../src/pages/api/verbrauchsausweis-gewerbe/index.ts"),
|
||||
"verbrauchsausweis-wohnen/[id]": await import("../src/pages/api/verbrauchsausweis-wohnen/[id].ts"),
|
||||
"verbrauchsausweis-wohnen": await import("../src/pages/api/verbrauchsausweis-wohnen/index.ts"),
|
||||
"auth/access-token": await import("../src/pages/api/auth/access-token.ts"),
|
||||
"auth/passwort-vergessen": await import("../src/pages/api/auth/passwort-vergessen.ts"),
|
||||
"auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"),
|
||||
"webhooks/mollie": await import("../src/pages/api/webhooks/mollie.ts"),
|
||||
"verbrauchsausweis-gewerbe/[id]": await import("../src/pages/api/verbrauchsausweis-gewerbe/[id].ts"),
|
||||
"verbrauchsausweis-gewerbe": await import("../src/pages/api/verbrauchsausweis-gewerbe/index.ts"),
|
||||
"aufnahme/[id]/bilder": await import("../src/pages/api/aufnahme/[id]/bilder.ts"),
|
||||
"aufnahme/[id]": await import("../src/pages/api/aufnahme/[id]/index.ts"),
|
||||
"aufnahme/[id]/unterlagen": await import("../src/pages/api/aufnahme/[id]/unterlagen.ts"),
|
||||
|
||||
@@ -259,7 +259,7 @@
|
||||
let bedarfsausweisAdditionalInput: HTMLInputElement;
|
||||
</script>
|
||||
|
||||
<div class="relative bg-base-200 border border-base-300 rounded-lg p-4 m-2">
|
||||
<div class="relative bg-base-200 border border-base-300 rounded-lg p-4 mx-2">
|
||||
{#if ausweis.storniert}
|
||||
<div
|
||||
class="absolute top-0 left-0 w-full h-full bg-[rgba(0,0,0,0.7)] z-[5] rounded-lg select-none"
|
||||
@@ -390,6 +390,7 @@
|
||||
{/if}
|
||||
|
||||
<div class="flex flex-row justify-start items-center mb-4">
|
||||
|
||||
<a
|
||||
class="p-1 rounded-lg hover:bg-gray-200 mr-2 border-2 border-gray-300"
|
||||
title="PDF Herunterladen"
|
||||
@@ -414,8 +415,53 @@
|
||||
<img src="../../images/dashboard/DatenblattKreuz.svg" width="65" alt="Energieausweis">
|
||||
{/if}
|
||||
</a>
|
||||
|
||||
<div class="flex flex-col gap-2 justify-end items-center ml-4">
|
||||
<div class="w-1/2 ml-4 text-sm">
|
||||
{#if ausweis.bestellt}
|
||||
{#if ausweis.ausweistyp === Enums.AusweisTyp.Beratung || ausweis.ausweistyp === Enums.AusweisTyp.BeratungXL}
|
||||
Sie haben Hilfe zu diesem Ausweis angefordert. Sie werden <span class="font-bold">innerhalb der nächsten 48 Stunden</span> über die hinterlegte Telefonnummer vom IB Cornelsen kontaktiert.
|
||||
{:else if ausweis.ausweistyp === Enums.AusweisTyp.Offline || ausweis.ausweistyp === Enums.AusweisTyp.OfflineXL}
|
||||
Sie haben die offline Variant zu diesem Ausweis angefordert. Bitte <span class="font-bold">übermitteln Sie uns die letzten drei Jahre der Energieabrechnungen</span> Ihres Energieversorgers.
|
||||
{:else if !ausweis.ausgestellt}
|
||||
Der Ausweis wurde von Ihnen freigegeben und befindet sich <span class="font-bold">in Prüfung durch IB Cornelsen</span>
|
||||
{/if}
|
||||
{:else}
|
||||
Der Ausweis wurde von Ihnen gespeichert <span class="font-bold">und muss noch bestellt werden.</span>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
<div class="text-sm mb-2">
|
||||
<span class="font-bold">Rechnungsadresse</span><br>
|
||||
{#if ausweisart == Enums.Ausweisart.GEGNachweisWohnen || ausweisart == Enums.Ausweisart.GEGNachweisGewerbe || ausweisart == Enums.Ausweisart.BedarfsausweisGewerbe}
|
||||
{einpreisung?.empfaenger},
|
||||
{#if einpreisung?.zusatzzeile !== null}
|
||||
{einpreisung?.zusatzzeile},
|
||||
{/if}
|
||||
{einpreisung?.strasse}, {einpreisung?.plz} {einpreisung?.ort}
|
||||
{:else}
|
||||
{rechnung?.empfaenger},
|
||||
{#if rechnung?.zusatzzeile !== null}
|
||||
{rechnung?.zusatzzeile},
|
||||
{/if}
|
||||
{rechnung?.strasse}, {rechnung?.plz} {rechnung?.ort}
|
||||
{/if}
|
||||
</div>
|
||||
<div class="text-sm mb-2">
|
||||
<span class="font-bold">Versandadresse</span><br>
|
||||
{#if ausweisart == Enums.Ausweisart.GEGNachweisWohnen || ausweisart == Enums.Ausweisart.GEGNachweisGewerbe || ausweisart == Enums.Ausweisart.BedarfsausweisGewerbe}
|
||||
{einpreisung?.versand_empfaenger},
|
||||
{#if einpreisung?.versand_zusatzzeile !== null}
|
||||
{einpreisung?.versand_zusatzzeile},
|
||||
{/if}
|
||||
{einpreisung?.versand_strasse}, {einpreisung?.versand_plz} {einpreisung?.versand_ort}
|
||||
{:else}
|
||||
{rechnung?.versand_empfaenger},
|
||||
{#if rechnung?.versand_zusatzzeile !== null}
|
||||
{rechnung?.versand_zusatzzeile},
|
||||
{/if}
|
||||
{rechnung?.versand_strasse}, {rechnung?.versand_plz} {rechnung?.versand_ort}
|
||||
{/if}
|
||||
</div>
|
||||
<div class="flex flex-row gap-2 justify-end items-center mt-4">
|
||||
{#if !ausweis.storniert && !ausweis.ausgestellt}
|
||||
<!--
|
||||
<a
|
||||
@@ -491,20 +537,7 @@
|
||||
<button class="button text-sm" title="Registriernummer anfordern" on:click={registriernummer}>R</button>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-8">
|
||||
{#if ausweis.bestellt}
|
||||
{#if ausweis.ausweistyp === Enums.AusweisTyp.Beratung || ausweis.ausweistyp === Enums.AusweisTyp.BeratungXL}
|
||||
<p class="text-sm">Sie haben Hilfe zu diesem Ausweis angefordert. Sie werden <span class="font-bold">innerhalb der nächsten 48 Stunden</span> über die hinterlegte Telefonnummer vom IB Cornelsen kontaktiert.</p>
|
||||
{:else if ausweis.ausweistyp === Enums.AusweisTyp.Offline || ausweis.ausweistyp === Enums.AusweisTyp.OfflineXL}
|
||||
<p class="text-sm">Sie haben die offline Variant zu diesem Ausweis angefordert. Bitte <span class="font-bold">übermitteln Sie uns die letzten drei Jahre der Energieabrechnungen</span> Ihres Energieversorgers.</p>
|
||||
{:else if !ausweis.ausgestellt}
|
||||
<p class="text-sm">Der Ausweis wurde von Ihnen freigegeben und befindet sich <span class="font-bold">in Prüfung durch IB Cornelsen</span></p>
|
||||
{/if}
|
||||
{:else}
|
||||
<p class="text-sm">Der Ausweis wurde von Ihnen gespeichert <span class="font-bold">und muss noch bestellt werden.</span></p>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -680,39 +713,15 @@
|
||||
|
||||
<div class="relative bg-base-200 border border-base-300 rounded-lg p-4 mx-2">
|
||||
<div class="card-body">
|
||||
<div class="flex flex-row flex-wrap items-center gap-2">
|
||||
<div class="text-sm">
|
||||
<span class="font-bold">Rechnungsadresse</span><br>
|
||||
{#if ausweisart == Enums.Ausweisart.GEGNachweisWohnen || ausweisart == Enums.Ausweisart.GEGNachweisGewerbe || ausweisart == Enums.Ausweisart.BedarfsausweisGewerbe}
|
||||
{einpreisung?.empfaenger},
|
||||
{#if einpreisung?.zusatzzeile !== null}
|
||||
{einpreisung?.zusatzzeile},
|
||||
{/if}
|
||||
{einpreisung?.strasse}, {einpreisung?.plz} {einpreisung?.ort}
|
||||
{:else}
|
||||
{rechnung?.empfaenger},
|
||||
{#if rechnung?.zusatzzeile !== null}
|
||||
{rechnung?.zusatzzeile},
|
||||
{/if}
|
||||
{rechnung?.strasse}, {rechnung?.plz} {rechnung?.ort}
|
||||
{/if}
|
||||
</div>
|
||||
<div class="text-sm mb-2">
|
||||
<span class="font-bold">Versandadresse</span><br>
|
||||
{#if ausweisart == Enums.Ausweisart.GEGNachweisWohnen || ausweisart == Enums.Ausweisart.GEGNachweisGewerbe || ausweisart == Enums.Ausweisart.BedarfsausweisGewerbe}
|
||||
{einpreisung?.versand_empfaenger},
|
||||
{#if einpreisung?.versand_zusatzzeile !== null}
|
||||
{einpreisung?.versand_zusatzzeile},
|
||||
{/if}
|
||||
{einpreisung?.versand_strasse}, {einpreisung?.versand_plz} {einpreisung?.versand_ort}
|
||||
{:else}
|
||||
{rechnung?.versand_empfaenger},
|
||||
{#if rechnung?.versand_zusatzzeile !== null}
|
||||
{rechnung?.versand_zusatzzeile},
|
||||
{/if}
|
||||
{rechnung?.versand_strasse}, {rechnung?.versand_plz} {rechnung?.versand_ort}
|
||||
{/if}
|
||||
<div class="flex flex-col flex-wrap items-left gap-2">
|
||||
|
||||
<h3 class="font-semibold text-lg">Bilder</h3>
|
||||
<div class="grid grid-cols-[1fr] md:grid-cols-[1fr,1fr,1fr] lg:grid-cols-[1fr,1fr,1fr] justify-start items-center gap-2">
|
||||
{#each aufnahme.bilder as bild, i (i)}
|
||||
<img src="/bilder/{bild.id}.jpg" alt={bild.kategorie} loading="lazy" class="max-h-[10vh] h-full w-full object-contain">
|
||||
{/each}
|
||||
</div>
|
||||
|
||||
<h3 class="font-semibold text-lg">Unterlagen</h3>
|
||||
<div class="text-sm">
|
||||
{#if aufnahme.unterlagen.length > 0}
|
||||
|
||||
@@ -38,19 +38,19 @@ export const BedarfsausweisWohnenSchema = z.object({
|
||||
volumen: z.number().nullish(),
|
||||
dicht: z.boolean().nullish(),
|
||||
fenster_flaeche_1: z.number().nullish(),
|
||||
fenster_art_1: z.number().nullish(),
|
||||
fenster_art_1: z.string().nullish(),
|
||||
fenster_flaeche_2: z.number().nullish(),
|
||||
fenster_art_2: z.number().nullish(),
|
||||
fenster_art_2: z.string().nullish(),
|
||||
dachfenster_flaeche: z.number().nullish(),
|
||||
dachfenster_art: z.number().nullish(),
|
||||
dachfenster_art: z.string().nullish(),
|
||||
haustuer_flaeche: z.number().nullish(),
|
||||
haustuer_art: z.number().nullish(),
|
||||
haustuer_art: z.string().nullish(),
|
||||
dach_bauart: z.string().nullish(),
|
||||
decke_bauart: z.string().nullish(),
|
||||
dach_daemmung: z.number().nullish(),
|
||||
decke_daemmung: z.number().nullish(),
|
||||
aussenwand_daemmung: z.number().nullish(),
|
||||
boden_daemmung: z.number().nullish(),
|
||||
dach_daemmung: z.string().nullish(),
|
||||
decke_daemmung: z.string().nullish(),
|
||||
aussenwand_daemmung: z.string().nullish(),
|
||||
boden_daemmung: z.string().nullish(),
|
||||
aussenwand_bauart: z.string().nullish(),
|
||||
boden_bauart: z.string().nullish(),
|
||||
warmwasser_verteilung: z.string().nullish(),
|
||||
|
||||
@@ -52,18 +52,6 @@
|
||||
|
||||
<div class="grid grid-cols-1 md:grid-cols-1 lg:grid-cols-1 gap-2">
|
||||
|
||||
<div class="relative bg-gray-100 rounded-md flex justify-center items-center">
|
||||
{#if ausweis.aufnahme.bilder.length > 0}
|
||||
<Carousel perPage={1}>
|
||||
{#each ausweis.aufnahme.bilder as bild, i (i)}
|
||||
<img src="/bilder/{bild.id}.jpg" alt={bild.kategorie} loading="lazy" class="max-h-[15vh] h-full w-full object-contain">
|
||||
{/each}
|
||||
<span slot="left-control" class="p-2.5 bg-opacity-50 bg-white block rounded-full"><ChevronLeft size={24}></ChevronLeft></span>
|
||||
<span slot="right-control" class="p-2.5 bg-opacity-50 bg-white block rounded-full"><ChevronRight size={24}></ChevronRight></span>
|
||||
</Carousel>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<div class="flex items-center justify-between mx-80">
|
||||
{#if page > 1}
|
||||
<a class="p-2 rounded-lg hover:bg-gray-200 cursor-pointer" href="/dashboard/objekte?p={page - 1}">
|
||||
|
||||
@@ -31,6 +31,14 @@ import isBase64 from "is-base64";
|
||||
import Mail from "nodemailer/lib/mailer/index.js";
|
||||
import mime from "mime"
|
||||
|
||||
const streamToBuffer = async (stream) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
const chunks = [];
|
||||
stream.on("data", (chunk) => chunks.push(chunk));
|
||||
stream.on("error", reject);
|
||||
stream.on("end", () => resolve(Buffer.concat(chunks)));
|
||||
});
|
||||
};
|
||||
|
||||
export const POST = defineApiRoute({
|
||||
input: z.object({
|
||||
@@ -131,12 +139,33 @@ export const POST = defineApiRoute({
|
||||
}
|
||||
|
||||
// Hier müssen wir warten, damit wir sichergehen können, dass die Rechnung bei LexOffice existiert.
|
||||
const [pdfRechnung, pdfRechnungError] = await tryCatch(getLexOfficeRechnung(rechnung));
|
||||
let pdfRechnung, pdfRechnungError;
|
||||
|
||||
try {
|
||||
const rechnungsCheckCommand = new GetObjectCommand({
|
||||
Bucket: "ibc-pdfs",
|
||||
Key: `ID_${ausweis.id}_Rechnung.pdf`,
|
||||
});
|
||||
|
||||
const s3Response = await s3Client.send(rechnungsCheckCommand);
|
||||
pdfRechnung = await streamToBuffer(s3Response.Body);
|
||||
|
||||
} catch (error) {
|
||||
pdfRechnungError = error;
|
||||
}
|
||||
|
||||
if (pdfRechnung && !pdfRechnungError) {
|
||||
console.log('PDF from S3');
|
||||
} else {
|
||||
[pdfRechnung, pdfRechnungError] = await tryCatch(getLexOfficeRechnung(rechnung));
|
||||
console.log('PDF from LexOffice');
|
||||
}
|
||||
|
||||
if (pdfRechnungError) {
|
||||
// console.error(pdfRechnungError);
|
||||
throw new APIError({
|
||||
code: "INTERNAL_SERVER_ERROR",
|
||||
message: "Rechnungs PDF konnte nicht generiert werden.",
|
||||
message: "Rechnungs PDF konnte nicht generiert werden."+pdfRechnungError,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -152,10 +181,8 @@ export const POST = defineApiRoute({
|
||||
});
|
||||
}
|
||||
|
||||
const dataWithoutPrefix = data.replace(
|
||||
/^data:image\/\w+;base64,/,
|
||||
""
|
||||
);
|
||||
const dataWithoutPrefix = data.replace(/^data:.*;base64,/, "");
|
||||
|
||||
const buffer = Buffer.from(dataWithoutPrefix, "base64");
|
||||
const mimeType = mime.getType(name.split(".").pop() as string)
|
||||
|
||||
@@ -192,14 +219,26 @@ export const POST = defineApiRoute({
|
||||
await s3Client.send(command);
|
||||
}
|
||||
|
||||
const rechnungsCommand = new PutObjectCommand({
|
||||
Bucket: "ibc-pdfs",
|
||||
Key: `ID_${ausweis.id}_Rechnung.pdf`,
|
||||
Body: Buffer.from(pdfRechnung),
|
||||
ACL: "private",
|
||||
});
|
||||
|
||||
await s3Client.send(rechnungsCommand);
|
||||
if (pdfRechnung) {
|
||||
processedFiles.push({
|
||||
filename: `ID_${ausweis.id}_Rechnung.pdf`,
|
||||
encoding: "binary",
|
||||
content: Buffer.from(pdfRechnung),
|
||||
contentType: "application/pdf",
|
||||
});
|
||||
}
|
||||
|
||||
if (!rechnungsCheckCommand && pdfRechnung != null ){
|
||||
const rechnungsCommand = new PutObjectCommand({
|
||||
Bucket: "ibc-pdfs",
|
||||
Key: `ID_${ausweis.id}_Rechnung.pdf`,
|
||||
Body: Buffer.from(pdfRechnung),
|
||||
ACL: "private",
|
||||
});
|
||||
|
||||
await s3Client.send(rechnungsCommand);
|
||||
}
|
||||
|
||||
|
||||
// Falls Postversand angefragt wurde müssen wir die Dateien auf den Postserver hochladen
|
||||
if (post) {
|
||||
|
||||
Reference in New Issue
Block a user