Bedarfsausweis Rechnung + Datenblatt

This commit is contained in:
Moritz Utcke
2023-05-09 20:30:44 +04:00
parent e2d742e069
commit 724f3ff546
25 changed files with 934 additions and 531 deletions

View File

@@ -0,0 +1,137 @@
import type { APIRoute } from "astro";
import { error, success } from "src/lib/APIResponse";
import { z } from "zod";
const AusweisUploadChecker = z.object({
typ: z.enum(["VA", "BA", "VANW"]),
objekt: z.object({
typ: z.string(),
plz: z.string().min(4).max(5),
ort: z.string(),
strasse: z.string(),
baujahr: z.number(),
saniert: z.boolean(),
gebaeudeteil: z.enum(["Gesamtgebäude", "Wohnen"]),
einheiten: z.number(),
}),
heizquellen: z
.array(
z.object({
verbrauch: z.array(z.number()).max(3).min(3),
einheit: z.string(),
brennstoff: z.string(),
anteil_warmwasser: z.number(),
})
)
.max(2)
.min(1),
energieverbrauch_zeitraum: z.date(),
wohnflaeche: z.number(),
keller_beheizt: z.boolean(),
dachgeschoss: z.number(),
zusaetzliche_heizquelle: z.boolean(),
warmwasser_enthalten: z.boolean(),
lueftungskonzept: z.enum([
"Fensterlüftung",
"Schachtlüftung",
"Lüftungsanlage ohne Wärmerückgewinnung",
"Lüftungsanlage mit Wärmerückgewinnung",
]),
wird_gekuehlt: z.boolean(),
leerstand: z.number(),
images: z.array(z.string()),
versorgungssysteme: z.number(),
fenster_dach: z.number(),
energiequelle_2_nutzung: z.number(),
daemmung: z.number(),
/**
* Bedarfsausweis spezifische Eigenschaften
*/
anzahl_vollgeschosse: z.number(),
geschosshoehe: z.number(),
anzahl_gauben: z.number(),
breite_gauben: z.number(),
masse_a: z.number(),
masse_b: z.number(),
masse_c: z.number(),
masse_d: z.number(),
masse_e: z.number(),
masse_f: z.number(),
fensterflaeche_so_sw: z.number(),
fensterflaeche_nw_no: z.number(),
aussenwandflaeche_unbeheizt: z.number(),
dachflaeche: z.number(),
dach_u_wert: z.number(),
deckenflaeche: z.number(),
decke_u_wert: z.number(),
aussenwand_flaeche: z.number(),
aussenwand_u_wert: z.number(),
fussboden_flaeche: z.number(),
fussboden_u_wert: z.number(),
volumen: z.number(),
dicht: z.boolean(),
fenster_flaeche_1: z.number(),
fenster_art_1: z.number(),
fenster_flaeche_2: z.number(),
fenster_art_2: z.number(),
dachfenster_flaeche: z.number(),
dachfenster_art: z.number(),
haustuer_flaeche: z.number(),
haustuer_art: z.number(),
dach_bauart: z.string(),
dach_daemmung: z.number(),
decke_bauart: z.string(),
decke_daemmung: z.number(),
aussenwand_bauart: z.string(),
aussenwand_daemmung: z.number(),
boden_bauart: z.string(),
boden_daemmung: z.number(),
warmwasser_verteilung: z.string(),
warmwasser_speicherung: z.string(),
warmwasser_erzeugung: z.string(),
heizung_zentral: z.boolean(),
heizung_verteilung: z.string(),
heizung_speicherung: z.string(),
waerme_erzeugung_heizung: z.string(),
anteil_zusatzheizung: z.number(),
kollektor_flaeche: z.number(),
// VANW
vanw_stromverbrauch_enthalten: z.number(),
vanw_stromverbrauch_sonstige: z.string(),
vanw_strom_1: z.number(),
vanw_strom_2: z.number(),
vanw_strom_3: z.number(),
erledigt: z.boolean(),
anrede: z.string(),
name: z.string(),
vorname: z.string(),
email: z.string(),
telefonnummer: z.string(),
});
/**
* Erstellt einen Verbrauchsausweis anhand der gegebenen Daten und trägt ihn in die Datenbank ein.
* @param param0
* @returns
*/
export const post: APIRoute = async ({ request }) => {
const body = await request.json();
const result = AusweisUploadChecker.safeParse(body);
if (!result.success) {
return error(result.error.issues);
}
return success({});
};

View File

@@ -1,16 +1,122 @@
import type { APIRoute } from "astro";
import { success } from "src/lib/APIResponse";
import { ActionFailedError, error, success } from "src/lib/APIResponse";
import { db } from "src/lib/shared";
import { z } from "zod";
const AusweisUploadChecker = z.object({
ausweisart: z.enum(["VA", "BA", "VANW"]),
objekt_typ: z.string(),
objekt_plz: z.string(),
objekt_ort: z.string(),
objekt_strasse: z.string(),
objekt_gebaeudeteil: z.string(),
objekt_saniert: z.boolean() ,
baujahr_gebaeude: z.number(),
baujahr_anlage: z.number(),
anzahl_einheiten: z.number(),
ausstellgrund: z.enum(["Vermietung"
,"Neubau"
, "Verkauf"
, "Modernisierung"
, "Sonstiges"]),
energieverbrauch_zeitraum: z.string(),
energieverbrauch_1_heizquelle_1: z.number(),
energieverbrauch_2_heizquelle_1: z.number(),
energieverbrauch_3_heizquelle_1: z.number(),
energieverbrauch_1_heizquelle_2: z.number(),
energieverbrauch_2_heizquelle_2: z.number(),
energieverbrauch_3_heizquelle_2: z.number(),
energietraeger_einheit_heizquelle_1: z.string(),
energietraeger_einheit_heizquelle_2: z.string(),
energietraeger_1: z.string(),
energietraeger_2: z.string(),
anteil_warmwasser_1: z.number(),
anteil_warmwasser_2: z.number(),
wohnflaeche: z.number(),
keller_beheizt: z.boolean(),
dachgeschoss: z.number(),
zusaetzliche_heizquelle: z.boolean(),
warmwasser_enthalten: z.boolean(),
lueftungskonzept: z.enum([
"Fensterlüftung",
"Schachtlüftung",
"Lüftungsanlage ohne Wärmerückgewinnung",
"Lüftungsanlage mit Wärmerückgewinnung",
]),
wird_gekuehlt: z.boolean(),
leerstand: z.number(),
images: z.array(z.string()),
versorgungssysteme: z.number(),
fenster_dach: z.number(),
energiequelle_2_nutzung: z.number(),
daemmung: z.number(),
anrede: z.string().optional(),
name: z.string().optional(),
vorname: z.string().optional(),
email: z.string().optional(),
telefonnummer: z.string().optional(),
});
/**
* Erstellt einen Verbrauchsausweis anhand der gegebenen Daten und trägt ihn in die Datenbank ein.
* @param param0
* @returns
* @param param0
* @returns
*/
export const post: APIRoute = async ({ request }) => {
const body = await request.json();
const validation = AusweisUploadChecker.safeParse(body);
if (!validation.success) {
return error(validation.error.issues);
}
return success({});
}
const result = await db("ausweise").insert(body).returning(["uid", "id"]);
if (!result) {
return ActionFailedError();
}
const { uid, id } = result[0];
if (!uid || !id) {
return ActionFailedError();
}
return success({
uid, id
});
};
export const put: APIRoute = async ({ request }) => {
const body = await request.json();
const validation = AusweisUploadChecker.safeParse(body);
if (!validation.success) {
return error(validation.error.issues);
}
const result = await db("ausweise").insert(body).returning(["uid", "id"]);
if (!result) {
return ActionFailedError();
}
const { uid, id } = result[0];
if (!uid || !id) {
return ActionFailedError();
}
return success({
uid, id
});
};

44
src/pages/api/image.ts Normal file
View File

@@ -0,0 +1,44 @@
import type { APIRoute } from "astro";
import { ActionFailedError, error, success } from "src/lib/APIResponse";
import * as jimp from "jimp";
import { v4 as uuid } from "uuid";
import { z } from "zod";
import * as path from "path";
const ImageUploadChecker = z.object({
data: z.string(),
name: z.string()
});
/**
* Speichert ein Bild auf unserem Server ab und gibt die UID des Bildes zurück
* @param param0
* @returns
*/
export const put: APIRoute = async ({ request }) => {
const body = await request.json();
const result = ImageUploadChecker.safeParse(body);
if (!result.success) {
return error(result.error.issues);
}
const image = Buffer.from(body.data, "base64url");
let jimpResult;
try {
jimpResult = await jimp.read(image);
} catch(e) {
return ActionFailedError();
}
const uid = uuid();
const location = path.join(uid);
jimpResult.quality(0.75).write(location);
return success({
uid
});
};