Bedarfsausweis Rechnung + Datenblatt
This commit is contained in:
137
src/pages/api/ausweis/bedarfsausweis.ts
Normal file
137
src/pages/api/ausweis/bedarfsausweis.ts
Normal 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({});
|
||||
};
|
||||
@@ -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
44
src/pages/api/image.ts
Normal 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
|
||||
});
|
||||
};
|
||||
Reference in New Issue
Block a user