Merge pull request #491 from IBCornelsen/main

get main
This commit is contained in:
Jens Cornelsen
2025-04-06 18:31:20 +02:00
committed by GitHub
27 changed files with 1589 additions and 1159 deletions

View File

@@ -1,221 +1,516 @@
import { api } from "astro-typesafe-api/client"
import { api } from "astro-typesafe-api/client";
import { exclude } from "#lib/exclude.js";
import Cookies from "js-cookie";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
import { AufnahmeClient, BedarfsausweisWohnenClient, BildClient, ObjektClient, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient, } from "#components/Ausweis/types.js";
import { Enums } from "#lib/client/prisma.js";
import {
AufnahmeClient,
BedarfsausweisWohnenClient,
BildClient,
ObjektClient,
VerbrauchsausweisGewerbeClient,
VerbrauchsausweisWohnenClient,
} from "#components/Ausweis/types.js";
import {
BedarfsausweisWohnen,
Enums,
VerbrauchsausweisGewerbe,
VerbrauchsausweisWohnen,
} from "#lib/client/prisma.js";
import { tryCatch } from "#lib/tryCatch.js";
import { addNotification } from "@ibcornelsen/ui";
import { objektSpeichern, aufnahmeSpeichern } from "./speichern.js";
export async function verbrauchsausweisWohnenSpeichern(
ausweis: VerbrauchsausweisWohnen,
aufnahme_id: string
): Promise<string> {
if (ausweis.id) {
await api["verbrauchsausweis-wohnen"]._id.PATCH.fetch(
{
ausweistyp: ausweis.ausweistyp,
startdatum: ausweis.startdatum,
alternative_heizung: ausweis.alternative_heizung,
alternative_kuehlung: ausweis.alternative_kuehlung,
alternative_lueftung: ausweis.alternative_lueftung,
alternative_warmwasser: ausweis.alternative_warmwasser,
anteil_warmwasser_1: ausweis.anteil_warmwasser_1,
anteil_warmwasser_2: ausweis.anteil_warmwasser_2,
ausgestellt: ausweis.ausgestellt,
ausstellgrund: ausweis.ausstellgrund,
ausstellungsdatum: ausweis.ausstellungsdatum,
beschreibung: ausweis.beschreibung,
bestellt: ausweis.bestellt,
boxpruefung: ausweis.boxpruefung,
brennstoff_1: ausweis.brennstoff_1,
brennstoff_2: ausweis.brennstoff_2,
einheit_1: ausweis.einheit_1,
einheit_2: ausweis.einheit_2,
energieeffizienzklasse: ausweis.energieeffizienzklasse,
faktorKeller: ausweis.faktorKeller,
kontrolldatei_angefragt: ausweis.kontrolldatei_angefragt,
prueftext: ausweis.prueftext,
registriernummer: ausweis.registriernummer,
storniert: ausweis.storniert,
verbrauch_1: ausweis.verbrauch_1,
verbrauch_2: ausweis.verbrauch_2,
verbrauch_3: ausweis.verbrauch_3,
verbrauch_4: ausweis.verbrauch_4,
verbrauch_5: ausweis.verbrauch_5,
verbrauch_6: ausweis.verbrauch_6,
warmwasser_anteil_bekannt: ausweis.warmwasser_anteil_bekannt,
warmwasser_enthalten: ausweis.warmwasser_enthalten,
zurueckgestellt: ausweis.zurueckgestellt,
zusaetzliche_heizquelle: ausweis.zusaetzliche_heizquelle,
},
{
params: {
id: ausweis.id,
},
headers: {
Authorization: `Bearer ${Cookies.get(
API_ACCESS_TOKEN_COOKIE_NAME
)}`,
},
}
);
return ausweis.id;
} else {
const { id } = await api["verbrauchsausweis-wohnen"].PUT.fetch(
{
ausweis: {
ausweistyp: ausweis.ausweistyp,
startdatum: ausweis.startdatum,
alternative_heizung: ausweis.alternative_heizung,
alternative_kuehlung: ausweis.alternative_kuehlung,
alternative_lueftung: ausweis.alternative_lueftung,
alternative_warmwasser: ausweis.alternative_warmwasser,
anteil_warmwasser_1: ausweis.anteil_warmwasser_1,
anteil_warmwasser_2: ausweis.anteil_warmwasser_2,
ausgestellt: ausweis.ausgestellt,
ausstellgrund: ausweis.ausstellgrund,
ausstellungsdatum: ausweis.ausstellungsdatum,
beschreibung: ausweis.beschreibung,
bestellt: ausweis.bestellt,
boxpruefung: ausweis.boxpruefung,
brennstoff_1: ausweis.brennstoff_1,
brennstoff_2: ausweis.brennstoff_2,
einheit_1: ausweis.einheit_1,
einheit_2: ausweis.einheit_2,
energieeffizienzklasse: ausweis.energieeffizienzklasse,
faktorKeller: ausweis.faktorKeller,
kontrolldatei_angefragt: ausweis.kontrolldatei_angefragt,
prueftext: ausweis.prueftext,
registriernummer: ausweis.registriernummer,
storniert: ausweis.storniert,
verbrauch_1: ausweis.verbrauch_1,
verbrauch_2: ausweis.verbrauch_2,
verbrauch_3: ausweis.verbrauch_3,
verbrauch_4: ausweis.verbrauch_4,
verbrauch_5: ausweis.verbrauch_5,
verbrauch_6: ausweis.verbrauch_6,
warmwasser_anteil_bekannt:
ausweis.warmwasser_anteil_bekannt,
warmwasser_enthalten: ausweis.warmwasser_enthalten,
zurueckgestellt: ausweis.zurueckgestellt,
zusaetzliche_heizquelle: ausweis.zusaetzliche_heizquelle,
},
aufnahme_id,
},
{
headers: {
Authorization: `Bearer ${Cookies.get(
API_ACCESS_TOKEN_COOKIE_NAME
)}`,
},
}
);
return id;
}
}
export async function verbrauchsausweisGewerbeSpeichern(
ausweis: VerbrauchsausweisGewerbe,
aufnahme_id: string
): Promise<string> {
if (ausweis.id) {
await api["verbrauchsausweis-gewerbe"]._id.PATCH.fetch(
{
ausweistyp: ausweis.ausweistyp,
startdatum: ausweis.startdatum,
alternative_heizung: ausweis.alternative_heizung,
alternative_kuehlung: ausweis.alternative_kuehlung,
alternative_lueftung: ausweis.alternative_lueftung,
alternative_warmwasser: ausweis.alternative_warmwasser,
anteil_warmwasser_1: ausweis.anteil_warmwasser_1,
anteil_warmwasser_2: ausweis.anteil_warmwasser_2,
ausgestellt: ausweis.ausgestellt,
ausstellgrund: ausweis.ausstellgrund,
ausstellungsdatum: ausweis.ausstellungsdatum,
beschreibung: ausweis.beschreibung,
bestellt: ausweis.bestellt,
boxpruefung: ausweis.boxpruefung,
brennstoff_1: ausweis.brennstoff_1,
brennstoff_2: ausweis.brennstoff_2,
einheit_1: ausweis.einheit_1,
einheit_2: ausweis.einheit_2,
energieeffizienzklasse: ausweis.energieeffizienzklasse,
kontrolldatei_angefragt: ausweis.kontrolldatei_angefragt,
prueftext: ausweis.prueftext,
registriernummer: ausweis.registriernummer,
storniert: ausweis.storniert,
verbrauch_1: ausweis.verbrauch_1,
verbrauch_2: ausweis.verbrauch_2,
verbrauch_3: ausweis.verbrauch_3,
verbrauch_4: ausweis.verbrauch_4,
verbrauch_5: ausweis.verbrauch_5,
verbrauch_6: ausweis.verbrauch_6,
warmwasser_anteil_bekannt: ausweis.warmwasser_anteil_bekannt,
warmwasser_enthalten: ausweis.warmwasser_enthalten,
zurueckgestellt: ausweis.zurueckgestellt,
zusaetzliche_heizquelle: ausweis.zusaetzliche_heizquelle,
anteil_kuehlung_1: ausweis.anteil_kuehlung_1,
anteil_kuehlung_2: ausweis.anteil_kuehlung_2,
keller_beheizt: ausweis.keller_beheizt,
kuehlung_enthalten: ausweis.kuehlung_enthalten,
rechnung_id: ausweis.rechnung_id,
strom_1: ausweis.strom_1,
strom_2: ausweis.strom_2,
strom_3: ausweis.strom_3,
stromverbrauch_enthaelt_beleuchtung:
ausweis.stromverbrauch_enthaelt_beleuchtung,
stromverbrauch_enthaelt_heizung:
ausweis.stromverbrauch_enthaelt_heizung,
stromverbrauch_enthaelt_kuehlung:
ausweis.stromverbrauch_enthaelt_kuehlung,
stromverbrauch_enthaelt_lueftung:
ausweis.stromverbrauch_enthaelt_lueftung,
stromverbrauch_enthaelt_sonstige:
ausweis.stromverbrauch_enthaelt_sonstige,
stromverbrauch_enthaelt_warmwasser:
ausweis.stromverbrauch_enthaelt_warmwasser,
},
{
params: {
id: ausweis.id,
},
headers: {
Authorization: `Bearer ${Cookies.get(
API_ACCESS_TOKEN_COOKIE_NAME
)}`,
},
}
);
return ausweis.id;
} else {
const { id } = await api["verbrauchsausweis-gewerbe"].PUT.fetch(
{
ausweis: {
ausweistyp: ausweis.ausweistyp,
startdatum: ausweis.startdatum,
alternative_heizung: ausweis.alternative_heizung,
alternative_kuehlung: ausweis.alternative_kuehlung,
alternative_lueftung: ausweis.alternative_lueftung,
alternative_warmwasser: ausweis.alternative_warmwasser,
anteil_warmwasser_1: ausweis.anteil_warmwasser_1,
anteil_warmwasser_2: ausweis.anteil_warmwasser_2,
ausgestellt: ausweis.ausgestellt,
ausstellgrund: ausweis.ausstellgrund,
ausstellungsdatum: ausweis.ausstellungsdatum,
beschreibung: ausweis.beschreibung,
bestellt: ausweis.bestellt,
boxpruefung: ausweis.boxpruefung,
brennstoff_1: ausweis.brennstoff_1,
brennstoff_2: ausweis.brennstoff_2,
einheit_1: ausweis.einheit_1,
einheit_2: ausweis.einheit_2,
energieeffizienzklasse: ausweis.energieeffizienzklasse,
kontrolldatei_angefragt: ausweis.kontrolldatei_angefragt,
prueftext: ausweis.prueftext,
registriernummer: ausweis.registriernummer,
storniert: ausweis.storniert,
verbrauch_1: ausweis.verbrauch_1,
verbrauch_2: ausweis.verbrauch_2,
verbrauch_3: ausweis.verbrauch_3,
verbrauch_4: ausweis.verbrauch_4,
verbrauch_5: ausweis.verbrauch_5,
verbrauch_6: ausweis.verbrauch_6,
warmwasser_anteil_bekannt:
ausweis.warmwasser_anteil_bekannt,
warmwasser_enthalten: ausweis.warmwasser_enthalten,
zurueckgestellt: ausweis.zurueckgestellt,
zusaetzliche_heizquelle: ausweis.zusaetzliche_heizquelle,
anteil_kuehlung_1: ausweis.anteil_kuehlung_1,
anteil_kuehlung_2: ausweis.anteil_kuehlung_2,
keller_beheizt: ausweis.keller_beheizt,
kuehlung_enthalten: ausweis.kuehlung_enthalten,
rechnung_id: ausweis.rechnung_id,
strom_1: ausweis.strom_1,
strom_2: ausweis.strom_2,
strom_3: ausweis.strom_3,
stromverbrauch_enthaelt_beleuchtung:
ausweis.stromverbrauch_enthaelt_beleuchtung,
stromverbrauch_enthaelt_heizung:
ausweis.stromverbrauch_enthaelt_heizung,
stromverbrauch_enthaelt_kuehlung:
ausweis.stromverbrauch_enthaelt_kuehlung,
stromverbrauch_enthaelt_lueftung:
ausweis.stromverbrauch_enthaelt_lueftung,
stromverbrauch_enthaelt_sonstige:
ausweis.stromverbrauch_enthaelt_sonstige,
stromverbrauch_enthaelt_warmwasser:
ausweis.stromverbrauch_enthaelt_warmwasser,
},
aufnahme_id,
},
{
headers: {
Authorization: `Bearer ${Cookies.get(
API_ACCESS_TOKEN_COOKIE_NAME
)}`,
},
}
);
return id;
}
}
export async function bedarfsausweisWohnenSpeichern(
ausweis: BedarfsausweisWohnen,
aufnahme_id: string
): Promise<string> {
if (ausweis.id) {
await api["bedarfsausweis-wohnen"]._id.PATCH.fetch(
{
ausweistyp: ausweis.ausweistyp,
alternative_heizung: ausweis.alternative_heizung,
alternative_kuehlung: ausweis.alternative_kuehlung,
alternative_lueftung: ausweis.alternative_lueftung,
alternative_warmwasser: ausweis.alternative_warmwasser,
ausstellgrund: ausweis.ausstellgrund,
ausstellungsdatum: ausweis.ausstellungsdatum,
beschreibung: ausweis.beschreibung,
boxpruefung: ausweis.boxpruefung,
energieeffizienzklasse: ausweis.energieeffizienzklasse,
kontrolldatei_angefragt: ausweis.kontrolldatei_angefragt,
prueftext: ausweis.prueftext,
registriernummer: ausweis.registriernummer,
anteil_zusatzheizung: ausweis.anteil_zusatzheizung,
anzahl_gauben: ausweis.anzahl_gauben,
anzahl_vollgeschosse: ausweis.anzahl_vollgeschosse,
aussenwand_bauart: ausweis.aussenwand_bauart,
aussenwand_daemmung: ausweis.aussenwand_daemmung,
aussenwand_flaeche: ausweis.aussenwand_flaeche,
aussenwand_u_wert: ausweis.aussenwand_u_wert,
aussenwandflaeche_unbeheizt:
ausweis.aussenwandflaeche_unbeheizt,
boden_bauart: ausweis.boden_bauart,
boden_daemmung: ausweis.boden_daemmung,
breite_gauben: ausweis.breite_gauben,
dach_bauart: ausweis.dach_bauart,
dach_daemmung: ausweis.dach_daemmung,
dach_u_wert: ausweis.dach_u_wert,
dachfenster_art: ausweis.dachfenster_art,
dachfenster_flaeche: ausweis.dachfenster_flaeche,
dachflaeche: ausweis.dachflaeche,
decke_bauart: ausweis.decke_bauart,
decke_daemmung: ausweis.decke_daemmung,
decke_u_wert: ausweis.decke_u_wert,
deckenflaeche: ausweis.deckenflaeche,
dicht: ausweis.dicht,
fenster_art_1: ausweis.fenster_art_1,
fenster_art_2: ausweis.fenster_art_2,
fenster_flaeche_1: ausweis.fenster_flaeche_1,
fenster_flaeche_2: ausweis.fenster_flaeche_2,
fensterflaeche_nw_no: ausweis.fensterflaeche_nw_no,
fensterflaeche_so_sw: ausweis.fensterflaeche_so_sw,
fussboden_flaeche: ausweis.fussboden_flaeche,
fussboden_u_wert: ausweis.fussboden_u_wert,
geschosshoehe: ausweis.geschosshoehe,
haustuer_art: ausweis.haustuer_art,
haustuer_flaeche: ausweis.haustuer_flaeche,
heizung_speicherung: ausweis.heizung_speicherung,
heizung_verteilung: ausweis.heizung_verteilung,
heizung_zentral: ausweis.heizung_zentral,
kollektor_flaeche: ausweis.kollektor_flaeche,
masse_a: ausweis.masse_a,
masse_b: ausweis.masse_b,
masse_c: ausweis.masse_c,
masse_d: ausweis.masse_d,
masse_e: ausweis.masse_e,
masse_f: ausweis.masse_f,
volumen: ausweis.volumen,
waerme_erzeugung_heizung: ausweis.waerme_erzeugung_heizung,
warmwasser_erzeugung: ausweis.warmwasser_erzeugung,
warmwasser_speicherung: ausweis.warmwasser_speicherung,
warmwasser_verteilung: ausweis.warmwasser_verteilung,
},
{
params: {
id: ausweis.id,
},
headers: {
Authorization: `Bearer ${Cookies.get(
API_ACCESS_TOKEN_COOKIE_NAME
)}`,
},
}
);
return ausweis.id;
} else {
const id = await api["bedarfsausweis-wohnen"].PUT.fetch(
{
ausweis: {
ausweistyp: ausweis.ausweistyp,
alternative_heizung: ausweis.alternative_heizung,
alternative_kuehlung: ausweis.alternative_kuehlung,
alternative_lueftung: ausweis.alternative_lueftung,
alternative_warmwasser: ausweis.alternative_warmwasser,
ausstellgrund: ausweis.ausstellgrund,
ausstellungsdatum: ausweis.ausstellungsdatum,
beschreibung: ausweis.beschreibung,
boxpruefung: ausweis.boxpruefung,
energieeffizienzklasse: ausweis.energieeffizienzklasse,
kontrolldatei_angefragt: ausweis.kontrolldatei_angefragt,
prueftext: ausweis.prueftext,
registriernummer: ausweis.registriernummer,
anteil_zusatzheizung: ausweis.anteil_zusatzheizung,
anzahl_gauben: ausweis.anzahl_gauben,
anzahl_vollgeschosse: ausweis.anzahl_vollgeschosse,
aussenwand_bauart: ausweis.aussenwand_bauart,
aussenwand_daemmung: ausweis.aussenwand_daemmung,
aussenwand_flaeche: ausweis.aussenwand_flaeche,
aussenwand_u_wert: ausweis.aussenwand_u_wert,
aussenwandflaeche_unbeheizt:
ausweis.aussenwandflaeche_unbeheizt,
boden_bauart: ausweis.boden_bauart,
boden_daemmung: ausweis.boden_daemmung,
breite_gauben: ausweis.breite_gauben,
dach_bauart: ausweis.dach_bauart,
dach_daemmung: ausweis.dach_daemmung,
dach_u_wert: ausweis.dach_u_wert,
dachfenster_art: ausweis.dachfenster_art,
dachfenster_flaeche: ausweis.dachfenster_flaeche,
dachflaeche: ausweis.dachflaeche,
decke_bauart: ausweis.decke_bauart,
decke_daemmung: ausweis.decke_daemmung,
decke_u_wert: ausweis.decke_u_wert,
deckenflaeche: ausweis.deckenflaeche,
dicht: ausweis.dicht,
fenster_art_1: ausweis.fenster_art_1,
fenster_art_2: ausweis.fenster_art_2,
fenster_flaeche_1: ausweis.fenster_flaeche_1,
fenster_flaeche_2: ausweis.fenster_flaeche_2,
fensterflaeche_nw_no: ausweis.fensterflaeche_nw_no,
fensterflaeche_so_sw: ausweis.fensterflaeche_so_sw,
fussboden_flaeche: ausweis.fussboden_flaeche,
fussboden_u_wert: ausweis.fussboden_u_wert,
geschosshoehe: ausweis.geschosshoehe,
haustuer_art: ausweis.haustuer_art,
haustuer_flaeche: ausweis.haustuer_flaeche,
heizung_speicherung: ausweis.heizung_speicherung,
heizung_verteilung: ausweis.heizung_verteilung,
heizung_zentral: ausweis.heizung_zentral,
kollektor_flaeche: ausweis.kollektor_flaeche,
masse_a: ausweis.masse_a,
masse_b: ausweis.masse_b,
masse_c: ausweis.masse_c,
masse_d: ausweis.masse_d,
masse_e: ausweis.masse_e,
masse_f: ausweis.masse_f,
volumen: ausweis.volumen,
waerme_erzeugung_heizung: ausweis.waerme_erzeugung_heizung,
warmwasser_erzeugung: ausweis.warmwasser_erzeugung,
warmwasser_speicherung: ausweis.warmwasser_speicherung,
warmwasser_verteilung: ausweis.warmwasser_verteilung,
},
aufnahme_id,
},
{
headers: {
Authorization: `Bearer ${Cookies.get(
API_ACCESS_TOKEN_COOKIE_NAME
)}`,
},
}
);
return id;
}
}
export async function ausweisSpeichern(
ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient,
ausweis:
| VerbrauchsausweisWohnenClient
| VerbrauchsausweisGewerbeClient
| BedarfsausweisWohnenClient,
objekt: ObjektClient,
aufnahme: AufnahmeClient,
bilder: BildClient[],
ausweisart: Enums.Ausweisart
) {
if (objekt.id) {
await api.objekt._id.PATCH.fetch({
adresse: objekt.adresse,
latitude: 0,
longitude: 0,
ort: objekt.ort,
plz: objekt.plz
}, {
params: {
id: objekt.id
},
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
} else {
const { id } = await api.objekt.PUT.fetch({
adresse: objekt.adresse,
latitude: 0,
longitude: 0,
ort: objekt.ort,
plz: objekt.plz
}, {
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
const [objekt_id, objekt_error] = await tryCatch(objektSpeichern(objekt));
objekt.id = id;
if (objekt_error) {
addNotification({
message: "Das hat nicht geklappt.",
subtext:
"Beim Speichern des Objektes ist ein Fehler aufgetreten, bitte versuchen sie es erneut.",
});
return;
}
objekt.id = objekt_id;
let [aufnahme_id, aufnahme_error] = await tryCatch(
aufnahmeSpeichern(aufnahme, objekt_id)
);
if (aufnahme.id) {
await api.aufnahme._id.PATCH.fetch({
baujahr_gebaeude: aufnahme.baujahr_gebaeude,
baujahr_heizung: aufnahme.baujahr_heizung,
baujahr_klima: aufnahme.baujahr_klima || [],
alternative_heizung: aufnahme.alternative_heizung,
alternative_kuehlung: aufnahme.alternative_kuehlung,
alternative_lueftung: aufnahme.alternative_lueftung,
alternative_warmwasser: aufnahme.alternative_warmwasser,
aussenwand_gedaemmt: aufnahme.aussenwand_gedaemmt,
aussenwand_min_12cm_gedaemmt: aufnahme.aussenwand_min_12cm_gedaemmt,
brennwert_kessel: aufnahme.brennwert_kessel,
dachgeschoss: aufnahme.dachgeschoss,
dachgeschoss_gedaemmt: aufnahme.dachgeschoss_gedaemmt,
dachgeschoss_min_12cm_gedaemmt: aufnahme.dachgeschoss_min_12cm_gedaemmt,
doppel_verglasung: aufnahme.doppel_verglasung,
dreifach_verglasung: aufnahme.dreifach_verglasung,
durchlauf_erhitzer: aufnahme.durchlauf_erhitzer,
einfach_verglasung: aufnahme.einfach_verglasung,
einheiten: aufnahme.einheiten,
einzelofen: aufnahme.einzelofen,
fenster_dicht: aufnahme.fenster_dicht,
fenster_teilweise_undicht: aufnahme.fenster_teilweise_undicht,
flaeche: aufnahme.flaeche,
gebaeudeteil: aufnahme.gebaeudeteil,
gebaeudetyp: aufnahme.gebaeudetyp,
heizungsrohre_gedaemmt: aufnahme.heizungsrohre_gedaemmt,
isolier_verglasung: aufnahme.isolier_verglasung,
keller: aufnahme.keller,
keller_decke_gedaemmt: aufnahme.keller_decke_gedaemmt,
keller_wand_gedaemmt: aufnahme.keller_wand_gedaemmt,
kuehlung: aufnahme.kuehlung,
leerstand: aufnahme.leerstand,
lueftung: aufnahme.lueftung,
niedertemperatur_kessel: aufnahme.niedertemperatur_kessel,
nutzflaeche: aufnahme.nutzflaeche,
oberste_geschossdecke_gedaemmt: aufnahme.oberste_geschossdecke_gedaemmt,
oberste_geschossdecke_min_12cm_gedaemmt: aufnahme.oberste_geschossdecke_min_12cm_gedaemmt,
photovoltaik: aufnahme.photovoltaik,
raum_temperatur_regler: aufnahme.raum_temperatur_regler,
rolllaeden_kaesten_gedaemmt: aufnahme.rolllaeden_kaesten_gedaemmt,
saniert: aufnahme.saniert,
solarsystem_warmwasser: aufnahme.solarsystem_warmwasser,
standard_kessel: aufnahme.standard_kessel,
tueren_dicht: aufnahme.tueren_dicht,
tueren_undicht: aufnahme.tueren_undicht,
waermepumpe: aufnahme.waermepumpe,
warmwasser_rohre_gedaemmt: aufnahme.warmwasser_rohre_gedaemmt,
zentralheizung: aufnahme.zentralheizung,
zirkulation: aufnahme.zirkulation
}, {
params: {
id: aufnahme.id
},
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
} else {
const { id } = await api.aufnahme.PUT.fetch({
aufnahme: {
baujahr_gebaeude: aufnahme.baujahr_gebaeude,
baujahr_heizung: aufnahme.baujahr_heizung,
alternative_heizung: aufnahme.alternative_heizung,
alternative_kuehlung: aufnahme.alternative_kuehlung,
alternative_lueftung: aufnahme.alternative_lueftung,
alternative_warmwasser: aufnahme.alternative_warmwasser,
aussenwand_gedaemmt: aufnahme.aussenwand_gedaemmt,
aussenwand_min_12cm_gedaemmt: aufnahme.aussenwand_min_12cm_gedaemmt,
baujahr_klima: aufnahme.baujahr_klima,
brennwert_kessel: aufnahme.brennwert_kessel,
dachgeschoss: aufnahme.dachgeschoss,
dachgeschoss_gedaemmt: aufnahme.dachgeschoss_gedaemmt,
dachgeschoss_min_12cm_gedaemmt: aufnahme.dachgeschoss_min_12cm_gedaemmt,
doppel_verglasung: aufnahme.doppel_verglasung,
dreifach_verglasung: aufnahme.dreifach_verglasung,
durchlauf_erhitzer: aufnahme.durchlauf_erhitzer,
einfach_verglasung: aufnahme.einfach_verglasung,
einheiten: aufnahme.einheiten,
einzelofen: aufnahme.einzelofen,
erstellungsdatum: aufnahme.erstellungsdatum,
fenster_dicht: aufnahme.fenster_dicht,
fenster_teilweise_undicht: aufnahme.fenster_teilweise_undicht,
flaeche: aufnahme.flaeche,
gebaeudeteil: aufnahme.gebaeudeteil,
gebaeudetyp: aufnahme.gebaeudetyp,
heizungsrohre_gedaemmt: aufnahme.heizungsrohre_gedaemmt,
isolier_verglasung: aufnahme.isolier_verglasung,
keller: aufnahme.keller,
keller_decke_gedaemmt: aufnahme.keller_decke_gedaemmt,
keller_wand_gedaemmt: aufnahme.keller_wand_gedaemmt,
kuehlung: aufnahme.kuehlung,
leerstand: aufnahme.leerstand,
lueftung: aufnahme.lueftung,
niedertemperatur_kessel: aufnahme.niedertemperatur_kessel,
nutzflaeche: aufnahme.nutzflaeche,
oberste_geschossdecke_gedaemmt: aufnahme.oberste_geschossdecke_gedaemmt,
oberste_geschossdecke_min_12cm_gedaemmt: aufnahme.oberste_geschossdecke_min_12cm_gedaemmt,
photovoltaik: aufnahme.photovoltaik,
raum_temperatur_regler: aufnahme.raum_temperatur_regler,
rolllaeden_kaesten_gedaemmt: aufnahme.rolllaeden_kaesten_gedaemmt,
saniert: aufnahme.saniert,
solarsystem_warmwasser: aufnahme.solarsystem_warmwasser,
standard_kessel: aufnahme.standard_kessel,
tueren_dicht: aufnahme.tueren_dicht,
tueren_undicht: aufnahme.tueren_undicht,
waermepumpe: aufnahme.waermepumpe,
warmwasser_rohre_gedaemmt: aufnahme.warmwasser_rohre_gedaemmt,
zentralheizung: aufnahme.zentralheizung,
zirkulation: aufnahme.zirkulation
},
objekt_id: objekt.id
}, {
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
if (aufnahme_error) {
addNotification({
message: "Das hat nicht geklappt.",
subtext:
"Beim Speichern der Objektaufnahme ist ein Fehler aufgetreten, bitte versuchen sie es erneut.",
});
aufnahme.id = id
return;
}
let patchRoute: any;
let putRoute: any;
aufnahme.id = aufnahme_id;
if (ausweisart == Enums.Ausweisart.VerbrauchsausweisWohnen) {
patchRoute = api["verbrauchsausweis-wohnen"]._id.PATCH
putRoute = api["verbrauchsausweis-wohnen"].PUT
const id = await verbrauchsausweisWohnenSpeichern(ausweis as VerbrauchsausweisWohnen, aufnahme_id)
ausweis.id = id;
} else if (ausweisart == Enums.Ausweisart.VerbrauchsausweisGewerbe) {
patchRoute = api["verbrauchsausweis-gewerbe"]._id.PATCH
putRoute = api["verbrauchsausweis-gewerbe"].PUT
const id = await verbrauchsausweisGewerbeSpeichern(ausweis as VerbrauchsausweisGewerbe, aufnahme_id)
ausweis.id = id;
} else if (ausweisart == Enums.Ausweisart.BedarfsausweisWohnen) {
patchRoute = api["bedarfsausweis-wohnen"]._id.PATCH
putRoute = api["bedarfsausweis-wohnen"].PUT
}
if (ausweis.id) {
await patchRoute.fetch({
...exclude(ausweis, ["id"])
}, {
params: {
id: ausweis.id
},
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
} else {
const { id } = await putRoute.fetch({
ausweis,
aufnahme_id: aufnahme.id
}, {
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
const id = await bedarfsausweisWohnenSpeichern(ausweis as BedarfsausweisWohnen, aufnahme_id)
ausweis.id = id;
}
await api.aufnahme._id.bilder.PUT.fetch(bilder.map(bild => bild.id), {
params: {
id: aufnahme.id
},
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
await api.aufnahme._id.bilder.PUT.fetch(
bilder.map((bild) => bild.id),
{
params: {
id: aufnahme.id,
},
headers: {
Authorization: `Bearer ${Cookies.get(
API_ACCESS_TOKEN_COOKIE_NAME
)}`,
},
}
})
);
return {
ausweis_id: ausweis.id,
aufnahme_id: aufnahme.id,
objekt_id: objekt.id
}
objekt_id: objekt.id,
};
}

View File

@@ -1,10 +1,143 @@
import { api } from "astro-typesafe-api/client"
import { exclude } from "#lib/exclude.js";
import Cookies from "js-cookie";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
import { AufnahmeClient, BildClient, ObjektClient, } from "#components/Ausweis/types.js";
import { BedarfsausweisGewerbe, Enums, GEGNachweisGewerbe, GEGNachweisWohnen, Unterlage } from "#lib/client/prisma.js";
import { tryCatch } from "#lib/tryCatch.js";
import { addNotification } from "#components/Notifications/shared.js";
import { aufnahmeSpeichern, objektSpeichern } from "./speichern.js";
export async function gegNachweisWohnenSpeichern(nachweis: GEGNachweisWohnen, aufnahme_id: string): Promise<string> {
if (nachweis.id) {
await api["geg-nachweis-wohnen"]._id.PATCH.fetch({
nachweistyp: nachweis.nachweistyp,
ausstellgrund: nachweis.ausstellgrund,
beschreibung: nachweis.beschreibung,
keller_beheizt: nachweis.keller_beheizt,
}, {
params: {
id: nachweis.id
},
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
return nachweis.id
} else {
const { id } = await api["geg-nachweis-wohnen"].PUT.fetch({
nachweis: {
nachweistyp: nachweis.nachweistyp,
ausstellgrund: nachweis.ausstellgrund,
beschreibung: nachweis.beschreibung,
keller_beheizt: nachweis.keller_beheizt,
},
aufnahme_id
}, {
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
return id
}
}
export async function gegNachweisGewerbeSpeichern(nachweis: GEGNachweisGewerbe, aufnahme_id: string): Promise<string> {
if (nachweis.id) {
await api["geg-nachweis-gewerbe"]._id.PATCH.fetch({
nachweistyp: nachweis.nachweistyp,
ausstellgrund: nachweis.ausstellgrund,
beschreibung: nachweis.beschreibung,
keller_beheizt: nachweis.keller_beheizt,
}, {
params: {
id: nachweis.id
},
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
return nachweis.id
} else {
const { id } = await api["geg-nachweis-gewerbe"].PUT.fetch({
nachweis: {
nachweistyp: nachweis.nachweistyp,
ausstellgrund: nachweis.ausstellgrund,
beschreibung: nachweis.beschreibung,
keller_beheizt: nachweis.keller_beheizt,
},
aufnahme_id
}, {
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
return id
}
}
export async function bedarfsausweisGewerbeSpeichern(nachweis: BedarfsausweisGewerbe, aufnahme_id: string): Promise<string> {
if (nachweis.id) {
await api["bedarfsausweis-gewerbe"]._id.PATCH.fetch({
nachweistyp: nachweis.nachweistyp,
ausstellgrund: nachweis.ausstellgrund,
abluftanlage: nachweis.abluftanlage,
bauteilaktivierung: nachweis.bauteilaktivierung,
direktheizung: nachweis.direktheizung,
dunkelstrahler: nachweis.dunkelstrahler,
fussbodenheizung: nachweis.fussbodenheizung,
hallenheizung: nachweis.hallenheizung,
infrarotstrahler: nachweis.infrarotstrahler,
keller_beheizt: nachweis.keller_beheizt,
klimatisierung: nachweis.klimatisierung,
konditionierung_der_zuluft: nachweis.konditionierung_der_zuluft,
luftheizung: nachweis.luftheizung,
zu_abluftanlage: nachweis.zu_abluftanlage
}, {
params: {
id: nachweis.id
},
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
return nachweis.id
} else {
const id = await api["bedarfsausweis-gewerbe"].PUT.fetch({
nachweis: {
nachweistyp: nachweis.nachweistyp,
ausstellgrund: nachweis.ausstellgrund,
abluftanlage: nachweis.abluftanlage,
bauteilaktivierung: nachweis.bauteilaktivierung,
direktheizung: nachweis.direktheizung,
dunkelstrahler: nachweis.dunkelstrahler,
fussbodenheizung: nachweis.fussbodenheizung,
hallenheizung: nachweis.hallenheizung,
infrarotstrahler: nachweis.infrarotstrahler,
keller_beheizt: nachweis.keller_beheizt,
klimatisierung: nachweis.klimatisierung,
konditionierung_der_zuluft: nachweis.konditionierung_der_zuluft,
luftheizung: nachweis.luftheizung,
zu_abluftanlage: nachweis.zu_abluftanlage
},
aufnahme_id
}, {
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
return id
}
}
export async function nachweisSpeichern(
nachweis: BedarfsausweisGewerbe | GEGNachweisWohnen | GEGNachweisGewerbe,
@@ -14,195 +147,38 @@ export async function nachweisSpeichern(
unterlagen: Unterlage[],
ausweisart: Enums.Ausweisart
) {
if (objekt.id) {
await api.objekt._id.PATCH.fetch({
adresse: objekt.adresse,
latitude: 0,
longitude: 0,
ort: objekt.ort,
plz: objekt.plz
}, {
params: {
id: objekt.id
},
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
} else {
const { id } = await api.objekt.PUT.fetch({
adresse: objekt.adresse,
latitude: 0,
longitude: 0,
ort: objekt.ort,
plz: objekt.plz
}, {
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
const [objekt_id, objekt_error] = await tryCatch(objektSpeichern(objekt))
if (objekt_error) {
addNotification({
message: "Das hat nicht geklappt.",
subtext: "Beim Speichern des Objektes ist ein Fehler aufgetreten, bitte versuchen sie es erneut."
})
objekt.id = id;
return;
}
objekt.id = objekt_id
let [aufnahme_id, aufnahme_error] = await tryCatch(aufnahmeSpeichern(aufnahme, objekt_id))
if (aufnahme.id) {
await api.aufnahme._id.PATCH.fetch({
baujahr_gebaeude: aufnahme.baujahr_gebaeude || [],
baujahr_heizung: aufnahme.baujahr_heizung || [],
baujahr_klima: aufnahme.baujahr_klima || [],
alternative_heizung: aufnahme.alternative_heizung,
alternative_kuehlung: aufnahme.alternative_kuehlung,
alternative_lueftung: aufnahme.alternative_lueftung,
alternative_warmwasser: aufnahme.alternative_warmwasser,
aussenwand_gedaemmt: aufnahme.aussenwand_gedaemmt,
aussenwand_min_12cm_gedaemmt: aufnahme.aussenwand_min_12cm_gedaemmt,
brennwert_kessel: aufnahme.brennwert_kessel,
dachgeschoss: aufnahme.dachgeschoss,
dachgeschoss_gedaemmt: aufnahme.dachgeschoss_gedaemmt,
dachgeschoss_min_12cm_gedaemmt: aufnahme.dachgeschoss_min_12cm_gedaemmt,
doppel_verglasung: aufnahme.doppel_verglasung,
dreifach_verglasung: aufnahme.dreifach_verglasung,
durchlauf_erhitzer: aufnahme.durchlauf_erhitzer,
einfach_verglasung: aufnahme.einfach_verglasung,
einheiten: aufnahme.einheiten,
einzelofen: aufnahme.einzelofen,
fenster_dicht: aufnahme.fenster_dicht,
fenster_teilweise_undicht: aufnahme.fenster_teilweise_undicht,
flaeche: aufnahme.flaeche,
gebaeudeteil: aufnahme.gebaeudeteil,
gebaeudetyp: aufnahme.gebaeudetyp,
heizungsrohre_gedaemmt: aufnahme.heizungsrohre_gedaemmt,
isolier_verglasung: aufnahme.isolier_verglasung,
keller: aufnahme.keller,
keller_decke_gedaemmt: aufnahme.keller_decke_gedaemmt,
keller_wand_gedaemmt: aufnahme.keller_wand_gedaemmt,
kuehlung: aufnahme.kuehlung,
leerstand: aufnahme.leerstand,
lueftung: aufnahme.lueftung,
niedertemperatur_kessel: aufnahme.niedertemperatur_kessel,
nutzflaeche: aufnahme.nutzflaeche,
oberste_geschossdecke_gedaemmt: aufnahme.oberste_geschossdecke_gedaemmt,
oberste_geschossdecke_min_12cm_gedaemmt: aufnahme.oberste_geschossdecke_min_12cm_gedaemmt,
photovoltaik: aufnahme.photovoltaik,
raum_temperatur_regler: aufnahme.raum_temperatur_regler,
rolllaeden_kaesten_gedaemmt: aufnahme.rolllaeden_kaesten_gedaemmt,
saniert: aufnahme.saniert,
solarsystem_warmwasser: aufnahme.solarsystem_warmwasser,
standard_kessel: aufnahme.standard_kessel,
tueren_dicht: aufnahme.tueren_dicht,
tueren_undicht: aufnahme.tueren_undicht,
waermepumpe: aufnahme.waermepumpe,
warmwasser_rohre_gedaemmt: aufnahme.warmwasser_rohre_gedaemmt,
zentralheizung: aufnahme.zentralheizung,
zirkulation: aufnahme.zirkulation
}, {
params: {
id: aufnahme.id
},
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
} else {
const { id } = await api.aufnahme.PUT.fetch({
aufnahme: {
baujahr_gebaeude: aufnahme.baujahr_gebaeude,
baujahr_heizung: aufnahme.baujahr_heizung,
alternative_heizung: aufnahme.alternative_heizung,
alternative_kuehlung: aufnahme.alternative_kuehlung,
alternative_lueftung: aufnahme.alternative_lueftung,
alternative_warmwasser: aufnahme.alternative_warmwasser,
aussenwand_gedaemmt: aufnahme.aussenwand_gedaemmt,
aussenwand_min_12cm_gedaemmt: aufnahme.aussenwand_min_12cm_gedaemmt,
baujahr_klima: aufnahme.baujahr_klima,
brennwert_kessel: aufnahme.brennwert_kessel,
dachgeschoss: aufnahme.dachgeschoss,
dachgeschoss_gedaemmt: aufnahme.dachgeschoss_gedaemmt,
dachgeschoss_min_12cm_gedaemmt: aufnahme.dachgeschoss_min_12cm_gedaemmt,
doppel_verglasung: aufnahme.doppel_verglasung,
dreifach_verglasung: aufnahme.dreifach_verglasung,
durchlauf_erhitzer: aufnahme.durchlauf_erhitzer,
einfach_verglasung: aufnahme.einfach_verglasung,
einheiten: aufnahme.einheiten,
einzelofen: aufnahme.einzelofen,
erstellungsdatum: aufnahme.erstellungsdatum,
fenster_dicht: aufnahme.fenster_dicht,
fenster_teilweise_undicht: aufnahme.fenster_teilweise_undicht,
flaeche: aufnahme.flaeche,
gebaeudeteil: aufnahme.gebaeudeteil,
gebaeudetyp: aufnahme.gebaeudetyp,
heizungsrohre_gedaemmt: aufnahme.heizungsrohre_gedaemmt,
isolier_verglasung: aufnahme.isolier_verglasung,
keller: aufnahme.keller,
keller_decke_gedaemmt: aufnahme.keller_decke_gedaemmt,
keller_wand_gedaemmt: aufnahme.keller_wand_gedaemmt,
kuehlung: aufnahme.kuehlung,
leerstand: aufnahme.leerstand,
lueftung: aufnahme.lueftung,
niedertemperatur_kessel: aufnahme.niedertemperatur_kessel,
nutzflaeche: aufnahme.nutzflaeche,
oberste_geschossdecke_gedaemmt: aufnahme.oberste_geschossdecke_gedaemmt,
oberste_geschossdecke_min_12cm_gedaemmt: aufnahme.oberste_geschossdecke_min_12cm_gedaemmt,
photovoltaik: aufnahme.photovoltaik,
raum_temperatur_regler: aufnahme.raum_temperatur_regler,
rolllaeden_kaesten_gedaemmt: aufnahme.rolllaeden_kaesten_gedaemmt,
saniert: aufnahme.saniert,
solarsystem_warmwasser: aufnahme.solarsystem_warmwasser,
standard_kessel: aufnahme.standard_kessel,
tueren_dicht: aufnahme.tueren_dicht,
tueren_undicht: aufnahme.tueren_undicht,
waermepumpe: aufnahme.waermepumpe,
warmwasser_rohre_gedaemmt: aufnahme.warmwasser_rohre_gedaemmt,
zentralheizung: aufnahme.zentralheizung,
zirkulation: aufnahme.zirkulation
},
objekt_id: objekt.id
}, {
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
if (aufnahme_error) {
addNotification({
message: "Das hat nicht geklappt.",
subtext: "Beim Speichern der Objektaufnahme ist ein Fehler aufgetreten, bitte versuchen sie es erneut."
})
aufnahme.id = id
return;
}
let patchRoute: any;
let putRoute: any;
aufnahme.id = aufnahme_id
if (ausweisart == Enums.Ausweisart.GEGNachweisWohnen) {
patchRoute = api["geg-nachweis-wohnen"]._id.PATCH
putRoute = api["geg-nachweis-wohnen"].PUT
gegNachweisWohnenSpeichern(nachweis as GEGNachweisWohnen, aufnahme_id)
} else if (ausweisart === Enums.Ausweisart.GEGNachweisGewerbe) {
patchRoute = api["geg-nachweis-gewerbe"]._id.PATCH
putRoute = api["geg-nachweis-gewerbe"].PUT
gegNachweisGewerbeSpeichern(nachweis as GEGNachweisGewerbe, aufnahme_id)
} else if (ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe) {
patchRoute = api["bedarfsausweis-gewerbe"]._id.PATCH
putRoute = api["bedarfsausweis-gewerbe"].PUT
}
if (nachweis.id) {
await patchRoute.fetch({
...exclude(nachweis, ["id"])
}, {
params: {
id: nachweis.id
},
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
} else {
const { id } = await putRoute.fetch({
nachweis,
aufnahme_id: aufnahme.id
}, {
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
nachweis.id = id;
bedarfsausweisGewerbeSpeichern(nachweis as BedarfsausweisGewerbe, aufnahme_id)
}
await api.aufnahme._id.bilder.PUT.fetch(bilder.map(bild => bild.id), {
@@ -213,8 +189,6 @@ export async function nachweisSpeichern(
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
console.log(unterlagen);
await api.aufnahme._id.unterlagen.PUT.fetch(unterlagen.map(unterlage => unterlage.id), {
params: {

164
src/client/lib/speichern.ts Normal file
View File

@@ -0,0 +1,164 @@
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
import { Aufnahme, Objekt } from "#lib/server/prisma.js";
import { api } from "astro-typesafe-api/client";
import Cookies from "js-cookie";
export async function aufnahmeSpeichern(aufnahme: Aufnahme, objekt_id: string): Promise<string> {
if (aufnahme.id) {
await api.aufnahme._id.PATCH.fetch({
baujahr_gebaeude: aufnahme.baujahr_gebaeude || [],
baujahr_heizung: aufnahme.baujahr_heizung || [],
baujahr_klima: aufnahme.baujahr_klima || [],
alternative_heizung: aufnahme.alternative_heizung,
alternative_kuehlung: aufnahme.alternative_kuehlung,
alternative_lueftung: aufnahme.alternative_lueftung,
alternative_warmwasser: aufnahme.alternative_warmwasser,
aussenwand_gedaemmt: aufnahme.aussenwand_gedaemmt,
aussenwand_min_12cm_gedaemmt: aufnahme.aussenwand_min_12cm_gedaemmt,
brennwert_kessel: aufnahme.brennwert_kessel,
dachgeschoss: aufnahme.dachgeschoss,
dachgeschoss_gedaemmt: aufnahme.dachgeschoss_gedaemmt,
dachgeschoss_min_12cm_gedaemmt: aufnahme.dachgeschoss_min_12cm_gedaemmt,
doppel_verglasung: aufnahme.doppel_verglasung,
dreifach_verglasung: aufnahme.dreifach_verglasung,
durchlauf_erhitzer: aufnahme.durchlauf_erhitzer,
einfach_verglasung: aufnahme.einfach_verglasung,
einheiten: aufnahme.einheiten,
einzelofen: aufnahme.einzelofen,
fenster_dicht: aufnahme.fenster_dicht,
fenster_teilweise_undicht: aufnahme.fenster_teilweise_undicht,
flaeche: aufnahme.flaeche,
gebaeudeteil: aufnahme.gebaeudeteil,
gebaeudetyp: aufnahme.gebaeudetyp,
heizungsrohre_gedaemmt: aufnahme.heizungsrohre_gedaemmt,
isolier_verglasung: aufnahme.isolier_verglasung,
keller: aufnahme.keller,
keller_decke_gedaemmt: aufnahme.keller_decke_gedaemmt,
keller_wand_gedaemmt: aufnahme.keller_wand_gedaemmt,
kuehlung: aufnahme.kuehlung,
leerstand: aufnahme.leerstand,
lueftung: aufnahme.lueftung,
niedertemperatur_kessel: aufnahme.niedertemperatur_kessel,
nutzflaeche: aufnahme.nutzflaeche,
oberste_geschossdecke_gedaemmt: aufnahme.oberste_geschossdecke_gedaemmt,
oberste_geschossdecke_min_12cm_gedaemmt: aufnahme.oberste_geschossdecke_min_12cm_gedaemmt,
photovoltaik: aufnahme.photovoltaik,
raum_temperatur_regler: aufnahme.raum_temperatur_regler,
rolllaeden_kaesten_gedaemmt: aufnahme.rolllaeden_kaesten_gedaemmt,
saniert: aufnahme.saniert,
solarsystem_warmwasser: aufnahme.solarsystem_warmwasser,
standard_kessel: aufnahme.standard_kessel,
tueren_dicht: aufnahme.tueren_dicht,
tueren_undicht: aufnahme.tueren_undicht,
waermepumpe: aufnahme.waermepumpe,
warmwasser_rohre_gedaemmt: aufnahme.warmwasser_rohre_gedaemmt,
zentralheizung: aufnahme.zentralheizung,
zirkulation: aufnahme.zirkulation
}, {
params: {
id: aufnahme.id
},
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
return aufnahme.id
} else {
const { id } = await api.aufnahme.PUT.fetch({
aufnahme: {
baujahr_gebaeude: aufnahme.baujahr_gebaeude,
baujahr_heizung: aufnahme.baujahr_heizung,
alternative_heizung: aufnahme.alternative_heizung,
alternative_kuehlung: aufnahme.alternative_kuehlung,
alternative_lueftung: aufnahme.alternative_lueftung,
alternative_warmwasser: aufnahme.alternative_warmwasser,
aussenwand_gedaemmt: aufnahme.aussenwand_gedaemmt,
aussenwand_min_12cm_gedaemmt: aufnahme.aussenwand_min_12cm_gedaemmt,
baujahr_klima: aufnahme.baujahr_klima,
brennwert_kessel: aufnahme.brennwert_kessel,
dachgeschoss: aufnahme.dachgeschoss,
dachgeschoss_gedaemmt: aufnahme.dachgeschoss_gedaemmt,
dachgeschoss_min_12cm_gedaemmt: aufnahme.dachgeschoss_min_12cm_gedaemmt,
doppel_verglasung: aufnahme.doppel_verglasung,
dreifach_verglasung: aufnahme.dreifach_verglasung,
durchlauf_erhitzer: aufnahme.durchlauf_erhitzer,
einfach_verglasung: aufnahme.einfach_verglasung,
einheiten: aufnahme.einheiten,
einzelofen: aufnahme.einzelofen,
erstellungsdatum: aufnahme.erstellungsdatum,
fenster_dicht: aufnahme.fenster_dicht,
fenster_teilweise_undicht: aufnahme.fenster_teilweise_undicht,
flaeche: aufnahme.flaeche,
gebaeudeteil: aufnahme.gebaeudeteil,
gebaeudetyp: aufnahme.gebaeudetyp,
heizungsrohre_gedaemmt: aufnahme.heizungsrohre_gedaemmt,
isolier_verglasung: aufnahme.isolier_verglasung,
keller: aufnahme.keller,
keller_decke_gedaemmt: aufnahme.keller_decke_gedaemmt,
keller_wand_gedaemmt: aufnahme.keller_wand_gedaemmt,
kuehlung: aufnahme.kuehlung,
leerstand: aufnahme.leerstand,
lueftung: aufnahme.lueftung,
niedertemperatur_kessel: aufnahme.niedertemperatur_kessel,
nutzflaeche: aufnahme.nutzflaeche,
oberste_geschossdecke_gedaemmt: aufnahme.oberste_geschossdecke_gedaemmt,
oberste_geschossdecke_min_12cm_gedaemmt: aufnahme.oberste_geschossdecke_min_12cm_gedaemmt,
photovoltaik: aufnahme.photovoltaik,
raum_temperatur_regler: aufnahme.raum_temperatur_regler,
rolllaeden_kaesten_gedaemmt: aufnahme.rolllaeden_kaesten_gedaemmt,
saniert: aufnahme.saniert,
solarsystem_warmwasser: aufnahme.solarsystem_warmwasser,
standard_kessel: aufnahme.standard_kessel,
tueren_dicht: aufnahme.tueren_dicht,
tueren_undicht: aufnahme.tueren_undicht,
waermepumpe: aufnahme.waermepumpe,
warmwasser_rohre_gedaemmt: aufnahme.warmwasser_rohre_gedaemmt,
zentralheizung: aufnahme.zentralheizung,
zirkulation: aufnahme.zirkulation
},
objekt_id
}, {
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
return id;
}
}
export async function objektSpeichern(objekt: Objekt & { id?: string }): Promise<string> {
if (objekt.id) {
await api.objekt._id.PATCH.fetch({
adresse: objekt.adresse,
latitude: 0,
longitude: 0,
ort: objekt.ort,
plz: objekt.plz
}, {
params: {
id: objekt.id
},
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
return objekt.id;
} else {
const { id } = await api.objekt.PUT.fetch({
adresse: objekt.adresse,
latitude: 0,
longitude: 0,
ort: objekt.ort,
plz: objekt.plz
}, {
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
return id;
}
}

View File

@@ -1,6 +1,6 @@
import { OmitKeys, TicketClient } from "#components/Ausweis/types.js";
import { api } from "astro-typesafe-api/client";
export async function createTicket(info: OmitKeys<TicketClient, "created_at" | "deleted_at" | "prioritaet" | "updated_at" | "status" | "uid">) {
export async function createTicket(info: OmitKeys<TicketClient, "created_at" | "deleted_at" | "prioritaet" | "updated_at" | "status">) {
return await api.ticket.PUT.fetch(info)
}

View File

@@ -49,7 +49,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
required
data-cy="ausstellgrund"
>
<option disabled selected >Bitte auswählen</option>
<option disabled selected value={null}>Bitte auswählen</option>
{#each ausstellgrund as name}
<option value={name}>{name}</option>
{/each}
@@ -73,7 +73,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
required
bind:value={aufnahme.gebaeudetyp}
>
<option disabled selected value>Bitte auswählen</option>
<option disabled selected value={null}>Bitte auswählen</option>
{#if ausweisart==Enums.Ausweisart.VerbrauchsausweisWohnen || ausweisart === Enums.Ausweisart.GEGNachweisWohnen || ausweisart === Enums.Ausweisart.BedarfsausweisWohnen}
<option value="Einfamilienhaus">Einfamilienhaus</option>
@@ -225,7 +225,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
required
bind:value={aufnahme.saniert}
>
<option disabled selected>Bitte auswählen</option>
<option disabled selected value={null}>Bitte auswählen</option>
<option value={true}>saniert</option>
<option value={false}>unsaniert</option>
</select>

View File

@@ -5,7 +5,7 @@
import Overlay from "#components/Overlay.svelte";
import EmbeddedAuthFlowModule from "#modules/EmbeddedAuthFlowModule.svelte";
import { AusweisTyp, BedarfsausweisGewerbe, Enums, GEGNachweisGewerbe, GEGNachweisWohnen, Unterlage } from "#lib/client/prisma.js";
import { AusweisTyp, BedarfsausweisGewerbe, Enums, GEGNachweisGewerbe, GEGNachweisWohnen, Unterlage, VerbrauchsausweisWohnen } from "#lib/client/prisma.js";
import { openWindowWithPost } from "#lib/helpers/window.js";
import { PRICES } from "#lib/constants.js";
import { nachweisSpeichern } from "#client/lib/nachweisSpeichern.js";
@@ -19,6 +19,7 @@
export let ausweisart: Enums.Ausweisart
export let form: HTMLFormElement;
export let skala: HTMLDivElement;
export let blockLocalStorageSync: boolean = false;
export let showWeiter: boolean = true;
export let showHelpButton: boolean = true;
@@ -38,26 +39,39 @@
(form.querySelector("input[name='baujahr_heizung']") as HTMLInputElement).setCustomValidity("")
}
new FormData(form).forEach((value, key) => {
if (key === "baujahr_heizung" || key === "baujahr_gebaeude" || key === "baujahr_klima") {
return
}
const element = (form.querySelector(`[name='${key}']`) as HTMLSelectElement);
if (!value && element.required) {
element.setCustomValidity("Eine Auswahl ist verpflichtend.")
} else {
element.setCustomValidity("")
}
})
if (!form.checkValidity()) {
// Entferne die Klasse "2xl:mt-[370px]" falls vorhanden
form.classList.remove("2xl:mt-[370px]");
// Entferne die Klasse "2xl:mt-[370px]" falls vorhanden
form.classList.remove("2xl:mt-[370px]");
// Verhindere das Scrollen (falls erforderlich)
skala.classList.add("no-scroll");
// Verhindere das Scrollen (falls erforderlich)
skala.classList.add("no-scroll");
// Zeige die Validierungsmeldungen
form.reportValidity();
// Zeige die Validierungsmeldungen
form.reportValidity();
// Finde das erste ungültige Feld und scrolle sanft darauf
let firstInvalidField = form.querySelector(":invalid");
if (firstInvalidField) {
let offset = 150; // Abstand für bessere Sichtbarkeit
let fieldPosition = firstInvalidField.getBoundingClientRect().top + window.scrollY;
window.scrollTo({ top: fieldPosition - offset, behavior: "smooth" });
}
// Finde das erste ungültige Feld und scrolle sanft darauf
let firstInvalidField = form.querySelector(":invalid");
if (firstInvalidField) {
let offset = 150; // Abstand für bessere Sichtbarkeit
let fieldPosition = firstInvalidField.getBoundingClientRect().top + window.scrollY;
window.scrollTo({ top: fieldPosition - offset, behavior: "smooth" });
}
return;
}
return;
}
if (ausweisart === Enums.Ausweisart.GEGNachweisWohnen || ausweisart === Enums.Ausweisart.GEGNachweisGewerbe || ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe) {
openWindowWithPost("/kundendaten", {
@@ -95,11 +109,17 @@
let result: Awaited<ReturnType<typeof ausweisSpeichern>> | Awaited<ReturnType<typeof nachweisSpeichern>> | null = null;
if (ausweisart === Enums.Ausweisart.GEGNachweisWohnen || ausweisart === Enums.Ausweisart.GEGNachweisGewerbe || ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe) {
result = await nachweisSpeichern({ ...ausweis, nachweistyp: ausweistyp }, objekt, aufnahme, bilder, unterlagen, ausweisart)
ausweis.id = result.nachweis_id;
result = await nachweisSpeichern({ ...ausweis as GEGNachweisWohnen, nachweistyp: ausweistyp }, objekt, aufnahme, bilder, unterlagen, ausweisart)
if (result) {
ausweis.id = result.nachweis_id;
}
} else {
result = await ausweisSpeichern({ ...ausweis, ausweistyp }, objekt, aufnahme, bilder, ausweisart)
ausweis.id = result.ausweis_id;
result = await ausweisSpeichern({ ...ausweis as VerbrauchsausweisWohnen, ausweistyp }, objekt, aufnahme, bilder, ausweisart)
if (result) {
ausweis.id = result.ausweis_id;
}
}
if (result !== null) {
@@ -108,7 +128,7 @@
"",
`${location.pathname}?id=${ausweis.id}`
);
blockLocalStorageSync = true;
localStorage.clear()
window.location.href = `/speichern-erfolgreich?id=${ausweis.id}`
}

View File

@@ -183,7 +183,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
bind:value={aufnahme.gebaeudeteil}
required
>
<option disabled selected value>Bitte auswählen</option>
<option disabled selected value={null}>Bitte auswählen</option>
<option value="Gesamtgebäude">Gesamtgebäude</option>
<option value="Wohnen">Wohnen</option>
</select>
@@ -214,7 +214,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
bind:value={aufnahme.dachgeschoss}
required
>
<option disabled selected >Bitte auswählen</option>
<option disabled selected value={null}>Bitte auswählen</option>
<option value={Enums.Heizungsstatus.NICHT_VORHANDEN}
>nicht vorhanden</option
>
@@ -243,7 +243,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
required
bind:value={aufnahme.keller}
>
<option disabled selected >Bitte auswählen</option>
<option disabled selected value={null}>Bitte auswählen</option>
<option value={Enums.Heizungsstatus.NICHT_VORHANDEN}
>nicht vorhanden</option
>

View File

@@ -1,454 +1,475 @@
<script lang="ts">
import HelpLabel from "#components/labels/HelpLabel.svelte";
import Inputlabel from "#components/labels/InputLabel.svelte";
export let ausweis;
import HelpLabel from "#components/labels/HelpLabel.svelte";
import Inputlabel from "#components/labels/InputLabel.svelte";
export let ausweis;
const arrayRange = (start: number, stop: number, step: number) =>
const arrayRange = (start: number, stop: number, step: number) =>
Array.from(
{ length: (stop - start) / step + 1 },
(value, index) => start + index * step
);
</script>
<div
id="superBereich2"
class="grid w-full items-start
id="superBereich2"
class="grid w-full items-start
grid-cols-1 gap-x-4 gap-y-4
sm:grid-cols-2 sm:gap-x-6 sm:gap-y-8
xl:grid-cols-2 xl:gap-x-8 xl:gap-y-8
">
"
>
<div class="bereich-box col-span-2">
<div
class="w-full grid grid-cols-2 sm:grid-cols-4 gap-4 justify-between justify-items-center items-center"
>
<div class="ring-1 ring-black/15 bg-white rounded-md">
<img src="/images/form-r.svg" alt="rechteck" />
</div>
<div class="ring-1 ring-black/15 bg-white rounded-md">
<img src="/images/form-l.svg" alt="l-form" />
</div>
<div class="ring-1 ring-black/15 bg-white rounded-md">
<img src="/images/form-t.svg" alt="t-form" />
</div>
<div class="ring-1 ring-black/15 bg-white rounded-md">
<img src="/images/form-u.svg" alt="u-form" />
</div>
</div>
</div>
<div class="bereich-box col-span-2">
<div class="w-full grid grid-cols-2 sm:grid-cols-4 gap-4 justify-between justify-items-center items-center">
<div class="ring-1 ring-black/15 bg-white rounded-md"><img src="/images/form-r.svg" alt="rechteck"/></div>
<div class="ring-1 ring-black/15 bg-white rounded-md"><img src="/images/form-l.svg" alt="l-form" /></div>
<div class="ring-1 ring-black/15 bg-white rounded-md"><img src="/images/form-t.svg" alt="t-form" /></div>
<div class="ring-1 ring-black/15 bg-white rounded-md"><img src="/images/form-u.svg" alt="u-form" /></div>
</div>
</div>
<div class="col-span-2 xl:col-span-1">
<div
id="Berechnungshilfe2"
class="bereich-box grid w-full
<div class="col-span-2 xl:col-span-1">
<div
id="Berechnungshilfe2"
class="bereich-box grid w-full
grid-cols-2 gap-x-4 gap-y-8
sm:grid-cols-3 sm:gap-x-6 sm:gap-y-8
xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
"
>
>
<div class="input-standard col-span-2 sm:col-span-3">
<h4
class="m-0 font-bold p-1 pt-2 min-h-[38px] ring-1 bg-white ring-black/15 rounded-sm;"
>
Berechnungshilfe - Eingabe der Grundfläche, Gechossanzahl
und -höhe
</h4>
<div class="help-label">
<HelpLabel
>Hier wählen Sie Ihren passenden Grundriss aus, und
tragen die entsprechenden Maße unten ein. Bitte
berücksichtigen Sie nur den Grundriss der zum beheizten
Gebäude gehört. Garagen oder Schuppen die an das Haus
herangebaut sind aber keine Verbindung zum Wohnhaus
haben bitte weglassen.</HelpLabel
>
</div>
</div>
<div class="input-standard col-span-2 sm:col-span-3">
<h4 class="m-0 font-bold p-1 pt-2 min-h-[38px] ring-1 bg-white ring-black/15 rounded-sm;">Berechnungshilfe - Eingabe der Grundfläche, Gechossanzahl und -höhe</h4>
<div class="help-label">
<HelpLabel>Hier wählen Sie Ihren passenden Grundriss aus, und tragen die entsprechenden Maße unten ein.
Bitte berücksichtigen Sie nur den Grundriss der zum beheizten Gebäude gehört.
Garagen oder Schuppen die an das Haus herangebaut sind aber keine Verbindung zum Wohnhaus haben bitte weglassen.</HelpLabel>
</div>
</div>
<div class="input-standard order-1 md:order-1 xl:order-1">
<Inputlabel title="A"></Inputlabel>
<div class="input-standard order-1 md:order-1 xl:order-1">
<Inputlabel title="A"></Inputlabel>
<input
name="masse_a"
type="number"
bind:value={ausweis.masse_a}
/>
<input
name="masse_a"
type="number"
bind:value={ausweis.masse_a}
/>
<div class="help-label">
<HelpLabel></HelpLabel>
</div>
</div>
<div class="help-label">
<HelpLabel></HelpLabel>
</div>
</div>
<div class="input-standard order-2 md:order-2 xl:order-2">
<Inputlabel title="B"></Inputlabel>
<div class="input-standard order-2 md:order-2 xl:order-2">
<Inputlabel title="B"></Inputlabel>
<input
name="masse_b"
type="number"
bind:value={ausweis.masse_b}
/>
<input
name="masse_b"
type="number"
bind:value={ausweis.masse_b}
/>
<div class="help-label">
<HelpLabel></HelpLabel>
</div>
</div>
<div class="help-label">
<HelpLabel></HelpLabel>
</div>
</div>
<div class="input-standard order-3 md:order-3 xl:order-3">
<Inputlabel title="C"></Inputlabel>
<div class="input-standard order-3 md:order-3 xl:order-3">
<Inputlabel title="C"></Inputlabel>
<input
name="masse_c"
type="number"
bind:value={ausweis.masse_c}
/>
<input
name="masse_c"
type="number"
bind:value={ausweis.masse_c}
/>
<div class="help-label">
<HelpLabel></HelpLabel>
</div>
</div>
<div class="help-label">
<HelpLabel></HelpLabel>
</div>
</div>
<div class="input-standard order-4 md:order-4 xl:order-4">
<Inputlabel title="D"></Inputlabel>
<div class="input-standard order-4 md:order-4 xl:order-4">
<Inputlabel title="D"></Inputlabel>
<input
name="masse_d"
type="number"
bind:value={ausweis.masse_d}
/>
<input
name="masse_d"
type="number"
bind:value={ausweis.masse_d}
/>
<div class="help-label">
<HelpLabel></HelpLabel>
</div>
</div>
<div class="help-label">
<HelpLabel></HelpLabel>
</div>
<div class="input-standard order-5 md:order-5 xl:order-5">
<Inputlabel title="E"></Inputlabel>
</div>
<input
name="masse_e"
type="number"
bind:value={ausweis.masse_e}
/>
<div class="input-standard order-5 md:order-5 xl:order-5">
<Inputlabel title="E"></Inputlabel>
<div class="help-label">
<HelpLabel></HelpLabel>
</div>
</div>
<input
name="masse_e"
type="number"
bind:value={ausweis.masse_e}
/>
<div class="input-standard order-6 md:order-6 xl:order-6">
<Inputlabel title="F"></Inputlabel>
<div class="help-label">
<HelpLabel></HelpLabel>
</div>
<input
name="masse_f"
type="number"
bind:value={ausweis.masse_f}
/>
</div>
<div class="help-label">
<HelpLabel></HelpLabel>
</div>
</div>
</div>
<div class="input-standard order-6 md:order-6 xl:order-6">
<Inputlabel title="F"></Inputlabel>
<input
name="masse_f"
type="number"
bind:value={ausweis.masse_f}
/>
<div class="help-label">
<HelpLabel></HelpLabel>
</div>
</div>
</div>
<div
id="Berechnungshilfe1"
class="bereich-box grid w-full mt-6
<div
id="Berechnungshilfe1"
class="bereich-box grid w-full mt-6
grid-cols-1 gap-x-4 gap-y-8
sm:grid-cols-2 sm:gap-x-6 sm:gap-y-8
xl:grid-cols-2 xl:gap-x-8 xl:gap-y-8
"
>
>
<div class="input-standard order-1 md:order-1 xl:order-1">
<Inputlabel title="Anzahl Vollgeschosse *"></Inputlabel>
<div class="input-standard order-1 md:order-1 xl:order-1">
<Inputlabel title="Anzahl Vollgeschosse *"></Inputlabel>
<input
name="anzahl_vollgeschosse"
bind:value={ausweis.anzahl_vollgeschosse}
type="number"
required
/>
<input
name="anzahl_vollgeschosse"
bind:value={ausweis.anzahl_vollgeschosse}
type="number"
required
/>
<div class="help-label">
<HelpLabel
>Bitte geben Sie hier die Anzahl der Vollgeschosse an.
Keller und Dachgeschoss mit Schrägen zählen nicht dazu.</HelpLabel
>
</div>
</div>
<div class="help-label">
<HelpLabel>Bitte geben Sie hier die Anzahl der Vollgeschosse
an. Keller und Dachgeschoss mit Schrägen zählen
nicht dazu.</HelpLabel>
</div>
</div>
<div class="input-standard order-2 md:order-2 xl:order-2">
<Inputlabel title="Geschosshöhe *"></Inputlabel>
<div class="input-standard order-2 md:order-2 xl:order-2">
<Inputlabel title="Geschosshöhe *"></Inputlabel>
<select
name="geschosshoehe"
bind:value={ausweis.geschosshoehe}
required
>
<option>Bitte auswählen</option>
{#each arrayRange(2.1, 4.5, 0.1) as step}
<option value={step}>{step.toFixed(2)} m</option>
{/each}
</select>
<select
name="geschosshoehe"
bind:value={ausweis.geschosshoehe}
required
>
<option>Bitte auswählen</option>
{#each arrayRange(2.1, 4.5, 0.1) as step}
<option value={step}>{step.toFixed(2)} m</option
>
{/each}
</select>
<div class="help-label">
<HelpLabel
>Bitte geben Sie hier die Geschosshöhe (lichte Raumhöhe
+ Deckenstärke) des Gebäudes ein. Bei unterschiedlichen
Geschosshöhen bilden Sie einen Mittelwert.</HelpLabel
>
</div>
</div>
<div class="help-label">
<HelpLabel>Bitte geben Sie hier die Geschosshöhe (lichte
Raumhöhe + Deckenstärke) des Gebäudes ein. Bei
unterschiedlichen Geschosshöhen bilden Sie einen
Mittelwert.</HelpLabel>
</div>
</div>
<div class="input-standard order-3 md:order-3 xl:order-3">
<Inputlabel title="Gaubenanzahl"></Inputlabel>
<div class="input-standard order-3 md:order-3 xl:order-3">
<Inputlabel title="Gaubenanzahl"></Inputlabel>
<input
name="anzahl_gauben"
bind:value={ausweis.anzahl_gauben}
type="number"
/>
<input
name="anzahl_gauben"
bind:value={ausweis.anzahl_gauben}
type="number"
/>
<div class="help-label">
<HelpLabel
>Wenn Ihr Gebäude Dachgauben besitzt geben Sie hier die
Anzahl ein.</HelpLabel
>
</div>
</div>
<div class="help-label">
<HelpLabel>Wenn Ihr Gebäude Dachgauben besitzt geben Sie hier
die Anzahl ein.</HelpLabel>
</div>
</div>
<div class="input-standard order-4 md:order-4 xl:order-4">
<Inputlabel title="Breite aller Gauben in m"></Inputlabel>
<div class="input-standard order-4 md:order-4 xl:order-4">
<Inputlabel title="Breite aller Gauben in m"></Inputlabel>
<select name="breite_gauben" bind:value={ausweis.breite_gauben}>
<option>Bitte auswählen</option>
{#each arrayRange(0.5, 10, 0.1) as step}
<option value={step}>{step.toFixed(2)} m</option>
{/each}
</select>
<select
name="breite_gauben"
bind:value={ausweis.breite_gauben}
>
<option>Bitte auswählen</option>
{#each arrayRange(0.5, 10, 0.1) as step}
<option value={step}>{step.toFixed(2)} m</option
>
{/each}
</select>
<div class="help-label">
<HelpLabel
>Bitte geben Sie hier die Gesamtbreite aller Gauben in m
ein.</HelpLabel
>
</div>
</div>
</div>
</div>
<div class="help-label">
<HelpLabel>Bitte geben Sie hier die Gesamtbreite aller Gauben
in m ein.</HelpLabel>
</div>
</div>
</div>
</div>
<div class="bereich-box col-span-2 xl:col-span-1">
<div
id="Berechnungstabelle"
class="grid w-full
<div class="bereich-box col-span-2 xl:col-span-1">
<div
id="Berechnungstabelle"
class="grid w-full
grid-cols-2 gap-x-4 gap-y-8
sm:grid-cols-2 sm:gap-x-6 sm:gap-y-8
xl:grid-cols-2 xl:gap-x-8 xl:gap-y-8 xl:col-span-1
xl:grid-cols-2 xl:gap-x-8 xl:gap-y-8 xl:col-span-1
"
>
<div class="input-standard col-span-2">
<h4 class="m-0 font-bold p-1 pt-2 min-h-[38px] ring-1 bg-white ring-black/15 rounded-sm ">Außenflächen, U-Werte und Volumen</h4>
<div class="help-label">
<HelpLabel>Die wärmeübertragende Umfassungsflächen sind die Hüllflächen des beheizten Gebäudes die an die Außenluft bzw. an unbeheizte Vorbauten grenzen.
Wenn Ihnen die Außenwand-,Dach-,Decken- und Bodenflächen vorliegen können Sie die Eingabe direkt vornehmen.
Hier können Sie auch das von den Umfassungsflächen eingeschlossene Volumen des Gebäudes eingeben.
Die ermittelten Werte der Berechnungshilfe können hier präzisiert werden.</HelpLabel>
>
<div class="input-standard col-span-2">
<h4
class="m-0 font-bold p-1 pt-2 min-h-[38px] ring-1 bg-white ring-black/15 rounded-sm"
>
Außenflächen, U-Werte und Volumen
</h4>
<div class="help-label">
<HelpLabel
>Die wärmeübertragende Umfassungsflächen sind die
Hüllflächen des beheizten Gebäudes die an die Außenluft
bzw. an unbeheizte Vorbauten grenzen. Wenn Ihnen die
Außenwand-,Dach-,Decken- und Bodenflächen vorliegen
können Sie die Eingabe direkt vornehmen. Hier können Sie
auch das von den Umfassungsflächen eingeschlossene
Volumen des Gebäudes eingeben. Die ermittelten Werte der
Berechnungshilfe können hier präzisiert werden.</HelpLabel
>
</div>
</div>
<div class="input-standard col-span-2">
<Inputlabel title="Tabellenwerte"></Inputlabel>
<div class="input-checkboxen">
<div
class="grid grid-cols-[25px_max-content] items-center justify-items-start"
>
<input
id="tabellenwerte_aendern"
type="checkbox"
bind:checked={ausweis.tabellenwerte_aendern}
name="tabellenwerte_aendern"
/>
<label for="tabellenwerte_aendern"
>Tabellenwerte manuell ändern</label
>
</div>
</div>
<div class="help-label">
<HelpLabel></HelpLabel>
</div>
</div>
<div class="input-standard order-1 md:order-1 xl:order-1">
<Inputlabel title="Dachfläche in m²"></Inputlabel>
<input
name="dachflaeche"
bind:value={ausweis.dachflaeche}
readonly={!ausweis.tabellenwerte_aendern}
type="number"
/>
<div class="help-label">
<HelpLabel></HelpLabel>
</div>
</div>
<div class="input-standard order-2 md:order-2 xl:order-2">
<Inputlabel title="U-Wert in W/m²K"></Inputlabel>
<input
name="dach_u_wert"
bind:value={ausweis.dach_u_wert}
readonly={!ausweis.tabellenwerte_aendern}
type="number"
/>
<div class="help-label">
<HelpLabel></HelpLabel>
</div>
</div>
<div class="input-standard order-3 md:order-3 xl:order-3">
<Inputlabel title="Geschoßdecke&nbsp;in&nbsp;m²"></Inputlabel>
<input
name="deckenflaeche"
bind:value={ausweis.deckenflaeche}
readonly={!ausweis.tabellenwerte_aendern}
type="number"
/>
<div class="help-label">
<HelpLabel></HelpLabel>
</div>
</div>
<div class="input-standard order-4 md:order-4 xl:order-4">
<Inputlabel title="U-Wert in W/m²K"></Inputlabel>
<input
name="decke_u_wert"
bind:value={ausweis.decke_u_wert}
readonly={!ausweis.tabellenwerte_aendern}
type="number"
/>
<div class="help-label">
<HelpLabel></HelpLabel>
</div>
</div>
<div class="input-standard order-5 md:order-5 xl:order-5">
<Inputlabel title="Außenwand in m²"></Inputlabel>
<input
name="aussenwand_flaeche"
bind:value={ausweis.aussenwand_flaeche}
readonly={!ausweis.tabellenwerte_aendern}
type="number"
/>
<div class="help-label">
<HelpLabel></HelpLabel>
</div>
</div>
<div class="input-standard order-6 md:order-6 xl:order-6">
<Inputlabel title="U-Wert in W/m²K"></Inputlabel>
<input
name="aussenwand_u_wert"
bind:value={ausweis.aussenwand_u_wert}
readonly={!ausweis.tabellenwerte_aendern}
type="number"
/>
<div class="help-label">
<HelpLabel></HelpLabel>
</div>
</div>
<div class="input-standard order-7 md:order-7 xl:order-7">
<Inputlabel title="Fußboden in m²"></Inputlabel>
<input
name="fussboden_flaeche"
bind:value={ausweis.fussboden_flaeche}
readonly={!ausweis.tabellenwerte_aendern}
type="number"
/>
<div class="help-label">
<HelpLabel></HelpLabel>
</div>
</div>
<div class="input-standard order-8 md:order-8 xl:order-8">
<Inputlabel title="U-Wert in W/m²K"></Inputlabel>
<input
name="fussboden_u_wert"
bind:value={ausweis.fussboden_u_wert}
readonly={!ausweis.tabellenwerte_aendern}
type="number"
/>
<div class="help-label">
<HelpLabel></HelpLabel>
</div>
</div>
<div
class="input-standard order-9 md:order-9 xl:order-9 col-span-2"
>
<Inputlabel title="eingeschlossenes Gebäudevolumen in m³"
></Inputlabel>
<input
name="volumen"
type="number"
bind:value={ausweis.volumen}
readonly={!ausweis.tabellenwerte_aendern}
/>
<div class="help-label">
<HelpLabel></HelpLabel>
</div>
</div>
<div
class="input-standard order-10 md:order-10 xl:order-10 col-span-2"
>
<Inputlabel title="Blower-Door-Test erfolgreich durchgeführt:"
></Inputlabel>
<div
class="grid grid-cols-[max-content_max-content] bg-white gap-x-12 p-1 min-h-[38px] ring-1 ring-black/15 rounded-sm"
>
<div
class="grid grid-cols-[25px_1fr] items-center justify-items-start"
>
<input
id="bow-yes"
type="radio"
value={true}
bind:group={ausweis.dicht}
name="dichtheit"
/>
<label for="bow-yes" class="radio-inline">Ja</label>
</div>
<div
class="grid grid-cols-[25px_1fr] items-center justify-items-start"
>
<input
id="bow-no"
type="radio"
value={false}
bind:group={ausweis.dicht}
name="dichtheit"
/>
<label for="bow-no" class="radio-inline">Nein</label>
</div>
</div>
<div class="help-label">
<HelpLabel></HelpLabel>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="input-standard col-span-2">
<Inputlabel title="Tabellenwerte"></Inputlabel>
<div class="input-checkboxen">
<div
class="grid grid-cols-[25px_max-content] items-center justify-items-start"
>
<input
id="tabellenwerte_aendern"
type="checkbox"
bind:checked={ausweis.tabellenwerte_aendern}
name="tabellenwerte_aendern"
/>
<label for="tabellenwerte_aendern">Tabellenwerte manuell ändern</label>
</div>
</div>
<div class="help-label">
<HelpLabel></HelpLabel>
</div>
</div>
<div class="input-standard order-1 md:order-1 xl:order-1">
<Inputlabel title="Dachfläche in m²"></Inputlabel>
<input
name="dachflaeche"
bind:value={ausweis.dachflaeche}
readonly={!ausweis.tabellenwerte_aendern}
type="number"
/>
<div class="help-label">
<HelpLabel></HelpLabel>
</div>
</div>
<div class="input-standard order-2 md:order-2 xl:order-2">
<Inputlabel title="U-Wert in W/m²K"></Inputlabel>
<input
name="dach_u_wert"
bind:value={ausweis.dach_u_wert}
readonly={!ausweis.tabellenwerte_aendern}
type="number"
/>
<div class="help-label">
<HelpLabel></HelpLabel>
</div>
</div>
<div class="input-standard order-3 md:order-3 xl:order-3">
<Inputlabel title="Geschoßdecke&nbsp;in&nbsp;m²"></Inputlabel>
<input
name="deckenflaeche"
bind:value={ausweis.deckenflaeche}
readonly={!ausweis.tabellenwerte_aendern}
type="number"
/>
<div class="help-label">
<HelpLabel></HelpLabel>
</div>
</div>
<div class="input-standard order-4 md:order-4 xl:order-4">
<Inputlabel title="U-Wert in W/m²K"></Inputlabel>
<input
name="decke_u_wert"
bind:value={ausweis.decke_u_wert}
readonly={!ausweis.tabellenwerte_aendern}
type="number"
/>
<div class="help-label">
<HelpLabel></HelpLabel>
</div>
</div>
<div class="input-standard order-5 md:order-5 xl:order-5">
<Inputlabel title="Außenwand in m²"></Inputlabel>
<input
name="aussenwand_flaeche"
bind:value={ausweis.aussenwand_flaeche}
readonly={!ausweis.tabellenwerte_aendern}
type="number"
/>
<div class="help-label">
<HelpLabel></HelpLabel>
</div>
</div>
<div class="input-standard order-6 md:order-6 xl:order-6">
<Inputlabel title="U-Wert in W/m²K"></Inputlabel>
<input
name="aussenwand_u_wert"
bind:value={ausweis.aussenwand_u_wert}
readonly={!ausweis.tabellenwerte_aendern}
type="number"
/>
<div class="help-label">
<HelpLabel></HelpLabel>
</div>
</div>
<div class="input-standard order-7 md:order-7 xl:order-7">
<Inputlabel title="Fußboden in m²"></Inputlabel>
<input
name="fussboden_flaeche"
bind:value={ausweis.fussboden_flaeche}
readonly={!ausweis.tabellenwerte_aendern}
type="number"
/>
<div class="help-label">
<HelpLabel></HelpLabel>
</div>
</div>
<div class="input-standard order-8 md:order-8 xl:order-8">
<Inputlabel title="U-Wert in W/m²K"></Inputlabel>
<input
name="fussboden_u_wert"
bind:value={ausweis.fussboden_u_wert}
readonly={!ausweis.tabellenwerte_aendern}
type="number"
/>
<div class="help-label">
<HelpLabel></HelpLabel>
</div>
</div>
<div class="input-standard order-9 md:order-9 xl:order-9 col-span-2">
<Inputlabel title="eingeschlossenes Gebäudevolumen in m³"></Inputlabel>
<input
name="volumen"
type="number"
bind:value={ausweis.volumen}
readonly={!ausweis.tabellenwerte_aendern}
/>
<div class="help-label">
<HelpLabel></HelpLabel>
</div>
</div>
<div class="input-standard order-10 md:order-10 xl:order-10 col-span-2">
<Inputlabel title="Blower-Door-Test erfolgreich durchgeführt:"></Inputlabel>
<div class="grid grid-cols-[max-content_max-content] bg-white gap-x-12 p-1 min-h-[38px] ring-1 ring-black/15 rounded-sm">
<div class="grid grid-cols-[25px_1fr] items-center justify-items-start">
<input
id="bow-yes"
type="radio"
value={true}
bind:group={ausweis.dicht}
name="dichtheit"
/>
<label for="bow-yes" class="radio-inline">Ja</label>
</div>
<div class="grid grid-cols-[25px_1fr] items-center justify-items-start">
<input
id="bow-no"
type="radio"
value={false}
bind:group={ausweis.dicht}
name="dichtheit"
/>
<label for="bow-no" class="radio-inline">Nein</label>
</div>
</div>
<div class="help-label">
<HelpLabel></HelpLabel>
</div>
</div>
</div>
</div>
</div>
<!--<div class="grid grid-cols-[3fr_2fr] gap-4">
<div class="GRB3 gap-4">
@@ -692,4 +713,4 @@ xl:grid-cols-2 xl:gap-x-8 xl:gap-y-8 xl:col-span-1
</div>
</div>
-->
-->

View File

@@ -50,7 +50,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
required
bind:value={aufnahme.lueftung}
>
<option disabled selected >Bitte auswählen</option>
<option disabled selected value={null}>Bitte auswählen</option>
<option value="Fensterlueftung">Fensterlüftung</option>
<option value="Schachtlueftung">Schachtlüftung</option>
<option value="LueftungsanlageOhneWaermerueckgewinnung"
@@ -83,7 +83,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
required
bind:value={aufnahme.kuehlung}
>
<option disabled selected value>Bitte auswählen</option>
<option disabled selected value={null}>Bitte auswählen</option>
<option value="1">vorhanden</option>
<option value="0">nicht vorhanden</option>
</select>

View File

@@ -1,7 +1,5 @@
<script lang="ts">
import HelpLabel from "#components/labels/HelpLabel.svelte";
import Inputlabel from "#components/labels/InputLabel.svelte";
import FensterImage from "./FensterImage.svelte";
//import Label from "../Label.svelte";
@@ -13,12 +11,12 @@
VerbrauchsausweisGewerbeClient,
VerbrauchsausweisWohnenClient,
} from "./types.js";
import { boolean } from "astro:schema";
import SanierungsOption from "#components/Ausweis/SanierungsOption.svelte";
import { BedarfsausweisWohnen } from "#lib/client/prisma.js";
export let objekt: ObjektClient;
export let aufnahme: AufnahmeClient;
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient;
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnen;
export let images: BildClient[];
</script>

View File

@@ -1,5 +1,5 @@
<script lang="ts">
import { Enums } from "#lib/client/prisma.js";
import { BedarfsausweisWohnen, Enums } from "#lib/client/prisma.js";
import HeizungImage from "./HeizungImage.svelte";
import {
@@ -14,7 +14,7 @@
export let objekt: ObjektClient;
export let aufnahme: AufnahmeClient;
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient;
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnen;
export let images: BildClient[];
export let ausweisart: Enums.Ausweisart;

View File

@@ -265,7 +265,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
disabled={!ausweis.brennstoff_1}
required
>
<option disabled selected >Bitte auswählen</option>
<option disabled selected value={null}>Bitte auswählen</option>
{#each fuelMap.hasOwnProperty(ausweis.brennstoff_1) ? fuelMap[ausweis.brennstoff_1] : [] as unit}
<option value={unit}>{unit}</option>
{/each}
@@ -423,7 +423,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
bind:value={ausweis.brennstoff_2}
required
>
<option disabled selected
<option disabled selected value={null}
>Bitte auswählen</option
>
{#each Object.keys(fuelMap) as fuel}
@@ -458,7 +458,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
disabled={!ausweis.brennstoff_2}
required
>
<option disabled selected
<option disabled selected value={null}
>Bitte auswählen</option
>
{#each fuelMap.hasOwnProperty(ausweis.brennstoff_2) ? fuelMap[ausweis.brennstoff_2] : [] as unit}

View File

@@ -236,7 +236,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
bind:value={ausweis.brennstoff_1}
required
>
<option disabled selected value>Bitte auswählen</option>
<option disabled selected value={null}>Bitte auswählen</option>
{#each Object.keys(fuelMap) as fuel}
<option value={fuel}>{fuel}</option>
{/each}
@@ -276,7 +276,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
disabled={!ausweis.brennstoff_1}
required
>
<option disabled selected value>Bitte auswählen</option>
<option disabled selected value={null}>Bitte auswählen</option>
{#each fuelMap.hasOwnProperty(ausweis.brennstoff_1) ? fuelMap[ausweis.brennstoff_1] : [] as unit}
<option value={unit}>{unit}</option>
{/each}
@@ -440,7 +440,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
required
data-cy="brennstoff_2"
>
<option disabled selected
<option disabled selected value={null}
>Bitte auswählen</option
>
{#each Object.keys(fuelMap) as fuel}
@@ -483,7 +483,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
disabled={!ausweis.brennstoff_2}
required
>
<option disabled selected
<option disabled selected value={null}
>Bitte auswählen</option
>
{#each fuelMap.hasOwnProperty(ausweis.brennstoff_2) ? fuelMap[ausweis.brennstoff_2] : [] as unit}

View File

@@ -7,7 +7,7 @@
export let objekt: ObjektKomplettClient;
</script>
<div class=" bg-white grid grid-cols-3 md:grid-cols-3 lg:grid-cols-3 gap-4">
<div class=" bg-white grid grid-cols-1 md:grid-cols-3 lg:grid-cols-3 gap-4">
{#if objekt.aufnahmen.length > 0}
{@const bild = objekt.aufnahmen[0].bilder.find(bild => bild.kategorie === Enums.BilderKategorie.Gebaeude)}
<div>
@@ -21,18 +21,14 @@
{/if}
<div class="flex gap-4">
<div>
<div class="inline-block border rounded-lg bg-white">
<img src="/public/images/dashboard/ausweishaken.jpg" class="h-auto w-auto max-h-[150px] max-w-full object-contain p-1" alt="Energieausweis ausgestellt">
</div>
<div class="text-sm text-center">Energieausweis</div>
</div>
<div>
<div class="inline-block border rounded-lg bg-white">
<img src="/public/images/dashboard/ausweishaken.jpg" class="h-auto w-auto max-h-[150px] max-w-full object-contain p-1" alt="Energieausweis ausgestellt">
</div>
<div class="text-sm text-center">Energieausweis</div>
</div>
{#if objekt.aufnahmen.at(-1)?.verbrauchsausweise_wohnen.length}
<a href="/pdf/ansichtsausweis?id={objekt.aufnahmen.at(-1)?.verbrauchsausweise_wohnen.at(-1).id}" target="_blank">
<div class="inline-block border rounded-lg bg-white">
<img src="/images/dashboard/ausweishaken.jpg" class="h-auto w-auto max-h-[150px] max-w-full object-contain p-1" alt="Energieausweis ausgestellt">
</div>
<div class="text-sm text-center">Energieausweis</div>
</a>
{/if}
</div>
<div class="flex flex-col gap-4">
{#each objekt.aufnahmen as aufnahme}
@@ -42,12 +38,6 @@
<a href="/dashboard/aufnahme/{aufnahme.id}" class="rounded-lg p-2 hover:bg-gray-100"><OpenInNewWindow size={30}></OpenInNewWindow></a>
</div>
</div>
<div class="inline-block border rounded-lg px-4 py-2 w-full">
<div class="flex justify-between items-center w-full">
<span class="text-sm">Detailübersicht<br>Stand vom {moment(aufnahme.erstellungsdatum).format("DD.MM.YYYY")}</span>
<a href="/dashboard/aufnahme/{aufnahme.id}" class="rounded-lg p-2 hover:bg-gray-100"><OpenInNewWindow size={30}></OpenInNewWindow></a>
</div>
</div>
{/each}
</div>
</div>

View File

@@ -28,17 +28,16 @@
AufnahmeClient
} from "#components/Ausweis/types.js";
import ButtonSpaeterHilfe from "#components/Ausweis/ButtonSpaeterHilfe.svelte";
export let ausweis: BedarfsausweisWohnenClient;
export let objekt: ObjektClient
export let aufnahme: AufnahmeClient
export let user: BenutzerClient = {} as BenutzerClient;
export let ausweistyp: Enums.AusweisTyp
export let bilder: BildClient[] = []
export let uid: string;
export let id: string;
if (!uid && (!ausweis.updated_at || moment(localStorage.getItem("bedarfsausweis-wohnen.updated_at") || new Date()).isAfter(ausweis.updated_at))) {
if (((user && user.rolle !== Enums.BenutzerRolle.ADMIN) || !user) && !id && (!ausweis.updated_at || moment(localStorage.getItem("bedarfsausweis-wohnen.updated_at") || new Date()).isAfter(ausweis.updated_at))) {
const localStorageAusweis = localStorage.getItem("bedarfsausweis-wohnen.ausweis");
if (localStorageAusweis) {
ausweis = JSON.parse(localStorageAusweis)
@@ -61,68 +60,21 @@
}
$: {
localStorage.setItem("bedarfsausweis-wohnen.ausweis", JSON.stringify(ausweis))
localStorage.setItem("bedarfsausweis-wohnen.aufnahme", JSON.stringify(aufnahme))
localStorage.setItem("bedarfsausweis-wohnen.objekt", JSON.stringify(objekt))
localStorage.setItem("bedarfsausweis-wohnen.bilder", JSON.stringify(bilder))
localStorage.setItem("bedarfsausweis-wohnen.updated_at", moment().toString())
if (!blockLocalStorageSync) {
localStorage.setItem("bedarfsausweis-wohnen.ausweis", JSON.stringify(ausweis))
localStorage.setItem("bedarfsausweis-wohnen.aufnahme", JSON.stringify(aufnahme))
localStorage.setItem("bedarfsausweis-wohnen.objekt", JSON.stringify(objekt))
localStorage.setItem("bedarfsausweis-wohnen.bilder", JSON.stringify(bilder))
localStorage.setItem("bedarfsausweis-wohnen.updated_at", moment().toString())
}
}
let daemmungsBreiten = [0, 0.02, 0.05, 0.08, 0.12, 0.16, 0.2, 0.3, 0.4];
let fensterArten = {
Einfachverglasung: 5,
"Holzfenster Doppelverglasung": 2.7,
"Kunststofffenster Doppelverglasung": 3,
"Alu- oder Stahlfenster Doppelverglasung": 4.3,
"Fenster Doppelverglasung (ab 1995)": 1.8,
"Fenster Doppelverglasung (U-Wert 1,1)": 1.1,
"Dreifach-Wärmeschutzverglasung(U-Wert 0,9)": 0.9,
"Dreifach-Wärmeschutzverglasung(U-Wert 0,85)": 0.85,
"Passivhausfenster(U-Wert 0,7)": 0.7,
"Passivhausfenster(U-Wert 0,6)": 0.6,
"Fenster mit U-Wert 2,3": 2.3,
"Fenster mit U-Wert 1,6": 1.6,
"Fenster mit U-Wert 1,7": 1.7,
"Fenster mit U-Wert 1,3": 1.3,
"Fenster mit U-Wert 1": 1,
};
async function spaeterWeitermachen() {
// const result = await verbrauchsausweisWohnenSpeichern(
// ausweis,
// gebaeude,
// aufnahme,
// images,
// user
// );
// if (result !== null) {
// // Falls der Nutzer zurück navigiert, sollte er wieder auf seinen Vorgang kommen.
// // Sonst müsste er alles neu eingeben...
// ausweis.uid = result.uid;
// gebaeude.uid = result.gebaeude_uid;
// aufnahme.uid = result.gebaeude_aufnahme_uid;
// window.history.pushState(
// {},
// "",
// `${location.pathname}?uid=${result.uid}`
// );
// speichernOverlayHidden = false;
// }
}
const arrayRange = (start: number, stop: number, step: number) =>
Array.from(
{ length: (stop - start) / step + 1 },
(value, index) => start + index * step
);
const ausweisart = Enums.Ausweisart.BedarfsausweisWohnen
const anliegen = "Energieausweis erstellen";
let form: HTMLFormElement;
let skala: HTMLDivElement;
let blockLocalStorageSync: boolean = false;
</script>
@@ -143,7 +95,19 @@
<div id="formular-box" class="formular-boxen ring-0">
<ButtonSpaeterHilfe {spaeterWeitermachen} />
<ButtonWeiterHilfe
bind:ausweis
bind:bilder
bind:user
bind:objekt
bind:aufnahme
bind:blockLocalStorageSync
{ausweisart}
showWeiter={false}
{form}
{skala}
>
</ButtonWeiterHilfe>
<!-- A Prüfung der Ausweisart -->
@@ -240,16 +204,19 @@ title="Angabe zu Lüftung und Kühlung"
</div>
<ButtonWeiterHilfe {spaeterWeitermachen}
bind:ausweis
bind:bilder
bind:user
bind:objekt
bind:aufnahme
ausweisart={Enums.Ausweisart.BedarfsausweisWohnen}
{form}
{skala}
/>
<ButtonWeiterHilfe
bind:ausweis
bind:bilder
bind:user
bind:objekt
bind:aufnahme
bind:blockLocalStorageSync
{ausweisart}
showWeiter={true}
{form}
{skala}
>
</ButtonWeiterHilfe>
</form>

View File

@@ -2,7 +2,7 @@
import PerformanceScore from "#components/Ausweis/PerformanceScore.svelte";
import Progressbar from "#components/Ausweis/Progressbar.svelte";
import Bereich from "#components/labels/Bereich.svelte";
import type { Bezahlmethoden, Unterlage } from "#lib/client/prisma.js";
import type { BedarfsausweisGewerbe, Bezahlmethoden, GEGNachweisGewerbe, GEGNachweisWohnen, Unterlage } from "#lib/client/prisma.js";
import { Enums } from "#lib/client/prisma.js";
import {
API_ACCESS_TOKEN_COOKIE_NAME,
@@ -232,7 +232,7 @@
let result: Awaited<ReturnType<typeof ausweisSpeichern>> | Awaited<ReturnType<typeof nachweisSpeichern>> | null = null;
try {
if (ausweisart === Enums.Ausweisart.GEGNachweisWohnen || ausweisart === Enums.Ausweisart.GEGNachweisGewerbe || ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe) {
result = await nachweisSpeichern(ausweis, objekt, aufnahme, bilder, unterlagen, ausweisart)
result = await nachweisSpeichern(ausweis as unknown as GEGNachweisWohnen | GEGNachweisGewerbe | BedarfsausweisGewerbe, objekt, aufnahme, bilder, unterlagen, ausweisart)
} else {
result = await ausweisSpeichern(ausweis, objekt, aufnahme, bilder, ausweisart)
}

View File

@@ -42,16 +42,17 @@
} from "#components/Notifications/index.js";
export let ausweis: VerbrauchsausweisGewerbeClient;
export let user: BenutzerClient;
export let user: BenutzerClient | null;
export let objekt: ObjektClient;
export let ausweistyp: Enums.AusweisTyp;
export let aufnahme: AufnahmeClient;
export let bilder: BildClient[];
export let id: string | null;
const ausweisart = Enums.Ausweisart.VerbrauchsausweisGewerbe
const anliegen = "Energieausweis erstellen";
if (!ausweis.updated_at || moment(localStorage.getItem("verbrauchsausweis-gewerbe.updated_at") || new Date()).isAfter(ausweis.updated_at)) {
if (((user && user.rolle !== Enums.BenutzerRolle.ADMIN) || !user) && !id && (!ausweis.updated_at || moment(localStorage.getItem("verbrauchsausweis-gewerbe.updated_at") || new Date()).isAfter(ausweis.updated_at))) {
const localStorageAusweis = localStorage.getItem("verbrauchsausweis-gewerbe.ausweis");
if (localStorageAusweis) {
ausweis = JSON.parse(localStorageAusweis)
@@ -74,13 +75,16 @@
}
$: {
localStorage.setItem("verbrauchsausweis-gewerbe.ausweis", JSON.stringify(ausweis))
localStorage.setItem("verbrauchsausweis-gewerbe.aufnahme", JSON.stringify(aufnahme))
localStorage.setItem("verbrauchsausweis-gewerbe.objekt", JSON.stringify(objekt))
localStorage.setItem("verbrauchsausweis-gewerbe.bilder", JSON.stringify(bilder))
localStorage.setItem("verbrauchsausweis-gewerbe.updated_at", moment().toString())
if (!blockLocalStorageSync) {
localStorage.setItem("verbrauchsausweis-gewerbe.ausweis", JSON.stringify(ausweis))
localStorage.setItem("verbrauchsausweis-gewerbe.aufnahme", JSON.stringify(aufnahme))
localStorage.setItem("verbrauchsausweis-gewerbe.objekt", JSON.stringify(objekt))
localStorage.setItem("verbrauchsausweis-gewerbe.bilder", JSON.stringify(bilder))
localStorage.setItem("verbrauchsausweis-gewerbe.updated_at", moment().toString())
}
}
let blockLocalStorageSync: boolean = false;
let form: HTMLFormElement;
let skala: HTMLDivElement;
</script>
@@ -114,6 +118,7 @@
bind:user
bind:objekt
bind:aufnahme
bind:blockLocalStorageSync
ausweisart={Enums.Ausweisart.VerbrauchsausweisGewerbe}
showWeiter={false}
{form}
@@ -229,6 +234,7 @@
bind:user
bind:objekt
bind:aufnahme
bind:blockLocalStorageSync
ausweisart={Enums.Ausweisart.VerbrauchsausweisGewerbe}
showWeiter={true}
{form}

View File

@@ -1,4 +1,6 @@
import { GEGNachweisWohnenClient, OptionalNullable, UUidWithPrefix, ZodOverlap } from "#components/Ausweis/types.js";
import { VALID_UUID_PREFIXES } from "#lib/constants.js";
import { generatePrefixedId } from "#lib/db.js";
import { exclude } from "#lib/exclude.js";
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
import { prisma } from "#lib/server/prisma.js";
@@ -8,11 +10,16 @@ import { z } from "zod";
export const PATCH = defineApiRoute({
input: BedarfsausweisGewerbeSchema.omit({
uid: true,
id: true,
benutzer_id: true,
geg_einpreisung_id: true,
aufnahme_id: true,
bestellt: true,
created_at: true,
rechnung_id: true,
storniert: true,
updated_at: true,
zurueckgestellt: true
}),
output: z.void(),
headers: {
@@ -22,7 +29,7 @@ export const PATCH = defineApiRoute({
async fetch(input, ctx, user) {
const objekt = await prisma.bedarfsausweisGewerbe.findUnique({
where: {
uid: ctx.params.uid,
id: ctx.params.id,
benutzer: {
id: user.id
}
@@ -38,7 +45,7 @@ export const PATCH = defineApiRoute({
await prisma.bedarfsausweisGewerbe.update({
where: {
uid: ctx.params.uid
id: ctx.params.id
},
data: input
})
@@ -52,9 +59,9 @@ export const DELETE = defineApiRoute({
headers: authorizationHeaders,
middleware: authorizationMiddleware,
async fetch(input, ctx, user) {
const { uid } = ctx.params;
const { id } = ctx.params;
if (!UUidWithPrefix.safeParse(uid).success) {
if (!UUidWithPrefix.safeParse(id).success) {
throw new APIError({
code: "BAD_REQUEST",
message: "UID konnte nicht verifiziert werden."
@@ -65,7 +72,7 @@ export const DELETE = defineApiRoute({
// Dieser MUSS mit dem Nutzer verknüpft sein.
const nachweis = await prisma.bedarfsausweisGewerbe.findUnique({
where: {
uid,
id,
}
});
@@ -112,10 +119,13 @@ export const DELETE = defineApiRoute({
}
})
const event_id = generatePrefixedId(6, VALID_UUID_PREFIXES.Ticket)
// Wir erstellen ein Event, dass der Nachweis storniert wurde
// Dann können wir das in der Historie anzeigen
await prisma.event.create({
data: {
id: event_id,
title: "Nachweis storniert",
description: ((user.rolle === "ADMIN") && (nachweis.benutzer_id !== user.id)) ? "Nachweis wurde von einem Administrator storniert." : "Nachweis wurde vom Besitzer storniert.",
benutzer: {
@@ -151,9 +161,9 @@ export const GET = defineApiRoute({
}
},
output: BedarfsausweisGewerbeSchema.merge(z.object({
uid_aufnahme: UUidWithPrefix,
uid_objekt: UUidWithPrefix,
uid_benutzer: UUidWithPrefix.optional()
aufnahme_id: UUidWithPrefix,
objekt_id: UUidWithPrefix,
benutzer_id: UUidWithPrefix.optional()
})).omit({
id: true,
aufnahme_id: true,
@@ -161,9 +171,9 @@ export const GET = defineApiRoute({
}),
middleware: authorizationMiddleware,
async fetch(input, context, user) {
const { uid } = context.params;
const { id } = context.params;
if (!uid) {
if (!id) {
throw new APIError({
code: "BAD_REQUEST",
message: "Missing uid in request params"
@@ -172,21 +182,21 @@ export const GET = defineApiRoute({
const nachweis = await prisma.bedarfsausweisGewerbe.findUnique({
where: {
uid,
id,
benutzer_id: user.id
},
include: {
benutzer: {
select: {
uid: true
id: true
}
},
aufnahme: {
select: {
uid: true,
id: true,
objekt: {
select: {
uid: true
id: true
}
}
}
@@ -203,9 +213,9 @@ export const GET = defineApiRoute({
}
return {
uid_aufnahme: nachweis.aufnahme.uid,
uid_objekt: nachweis.aufnahme.objekt.uid,
uid_benutzer: nachweis.benutzer?.uid,
aufnahme_id: nachweis.aufnahme.id,
objekt_id: nachweis.aufnahme.objekt.id,
benutzer_id: nachweis.benutzer?.id,
...exclude(nachweis, ["id", "aufnahme_id", "benutzer_id", "aufnahme"])
}
},

View File

@@ -1,4 +1,6 @@
import { UUidWithPrefix } from "#components/Ausweis/types.js";
import { VALID_UUID_PREFIXES } from "#lib/constants.js";
import { generatePrefixedId } from "#lib/db.js";
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
import { prisma } from "#lib/server/prisma.js";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
@@ -16,24 +18,24 @@ export const PUT = defineApiRoute({
nachweis: BedarfsausweisGewerbeSchema.omit({
id: true,
benutzer_id: true,
uid: true,
aufnahme_id: true,
geg_einpreisung_id: true,
rechnung_id: true
aufnahme_id: true,
bestellt: true,
created_at: true,
rechnung_id: true,
storniert: true,
updated_at: true,
zurueckgestellt: true
}),
uid_aufnahme: UUidWithPrefix
}),
output: z.object({
uid: UUidWithPrefix,
objekt_uid: UUidWithPrefix,
aufnahme_uid: UUidWithPrefix,
aufnahme_id: UUidWithPrefix
}),
output: UUidWithPrefix,
headers: authorizationHeaders,
middleware: authorizationMiddleware,
async fetch(input, ctx, user) {
const aufnahme = await prisma.aufnahme.findUnique({
where: {
uid: input.uid_aufnahme
id: input.aufnahme_id
}
})
@@ -44,8 +46,11 @@ export const PUT = defineApiRoute({
})
}
const id = generatePrefixedId(6, VALID_UUID_PREFIXES.GEGNachweisGewerbe)
const nachweis = await prisma.bedarfsausweisGewerbe.create({
data: {
id,
...input.nachweis,
benutzer: {
connect: {
@@ -57,27 +62,10 @@ export const PUT = defineApiRoute({
id: aufnahme.id,
},
}
},
select: {
uid: true,
aufnahme: {
select: {
uid: true,
objekt: {
select: {
uid: true,
},
},
},
},
},
}
});
return {
uid: nachweis.uid,
objekt_uid: nachweis.aufnahme.objekt.uid,
aufnahme_uid: nachweis.aufnahme.uid,
};
return nachweis.id
},
});
@@ -101,11 +89,11 @@ export const GET = defineApiRoute({
headers: authorizationHeaders,
middleware: authorizationMiddleware,
async fetch(input, context, user) {
const { uid } = context.params;
const { id } = context.params;
const nachweis = await prisma.bedarfsausweisGewerbe.findUnique({
where: {
uid,
id,
},
include: {
benutzer: true,
@@ -115,7 +103,7 @@ export const GET = defineApiRoute({
include: {
benutzer: {
select: {
uid: true,
id: true,
},
},
},

View File

@@ -1,16 +1,25 @@
import { BedarfsausweisWohnenClient, OptionalNullable, UUidWithPrefix, VerbrauchsausweisWohnenClient, ZodOverlap } from "#components/Ausweis/types.js";
import { VALID_UUID_PREFIXES } from "#lib/constants.js";
import { generatePrefixedId } from "#lib/db.js";
import { exclude } from "#lib/exclude.js";
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
import { BedarfsausweisWohnenSchema, prisma, VerbrauchsausweisWohnenSchema } from "#lib/server/prisma";
import { BedarfsausweisWohnen, prisma } from "#lib/server/prisma.js";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import { BedarfsausweisWohnenSchema } from "src/generated/zod/bedarfsausweiswohnen.js";
import { z } from "zod";
export const PATCH = defineApiRoute({
input: VerbrauchsausweisWohnenSchema.omit({
uid: true,
input: BedarfsausweisWohnenSchema.omit({
id: true,
benutzer_id: true,
aufnahme_id: true,
rechnung_id: true,
ausgestellt: true,
bestellt: true,
zurueckgestellt: true,
created_at: true,
updated_at: true,
storniert: true
}),
output: z.void(),
headers: {
@@ -18,9 +27,9 @@ export const PATCH = defineApiRoute({
},
middleware: authorizationMiddleware,
async fetch(input, ctx, user) {
const objekt = await prisma.verbrauchsausweisWohnen.findUnique({
const objekt = await prisma.bedarfsausweisWohnen.findUnique({
where: {
uid: ctx.params.uid,
id: ctx.params.id,
benutzer: {
id: user.id
}
@@ -34,9 +43,9 @@ export const PATCH = defineApiRoute({
})
}
await prisma.verbrauchsausweisWohnen.update({
await prisma.bedarfsausweisWohnen.update({
where: {
uid: ctx.params.uid
id: ctx.params.id
},
data: input
})
@@ -50,9 +59,9 @@ export const DELETE = defineApiRoute({
headers: authorizationHeaders,
middleware: authorizationMiddleware,
async fetch(input, ctx, user) {
const { uid } = ctx.params;
const { id } = ctx.params;
if (!UUidWithPrefix.safeParse(uid).success) {
if (!UUidWithPrefix.safeParse(id).success) {
throw new APIError({
code: "BAD_REQUEST",
message: "UID konnte nicht verifiziert werden."
@@ -61,15 +70,11 @@ export const DELETE = defineApiRoute({
// Wir holen uns den Bedarfsausweis
// Dieser MUSS mit dem Nutzer verknüpft sein.
const ausweis = await prisma.verbrauchsausweisWohnen.findUnique({
const ausweis = await prisma.bedarfsausweisWohnen.findUnique({
where: {
uid,
},
include: {
aufnahme: {
select: {
storniert: true
}
id,
benutzer: {
id: user.id
}
}
});
@@ -100,7 +105,7 @@ export const DELETE = defineApiRoute({
// });
// }
if (ausweis.aufnahme.storniert) {
if (ausweis.storniert) {
// Falls der Ausweis bereits storniert ist, werfen wir einen Fehler
throw new APIError({
code: "BAD_REQUEST",
@@ -108,19 +113,22 @@ export const DELETE = defineApiRoute({
});
}
await prisma.aufnahme.update({
await prisma.bedarfsausweisWohnen.update({
where: {
id: ausweis.aufnahme_id
id
},
data: {
storniert: true
}
})
const event_id = generatePrefixedId(6, VALID_UUID_PREFIXES.Ticket)
// Wir erstellen ein Event, dass der Ausweis storniert wurde
// Dann können wir das in der Historie anzeigen
await prisma.event.create({
data: {
id: event_id,
title: "Ausweis storniert",
description: ((user.rolle === "ADMIN") && (ausweis.benutzer_id !== user.id)) ? "Ausweis wurde von einem Administrator storniert." : "Ausweis wurde vom Besitzer storniert.",
benutzer: {
@@ -155,10 +163,10 @@ export const GET = defineApiRoute({
}
}
},
output: ZodOverlap<OptionalNullable<VerbrauchsausweisWohnenClient>>(VerbrauchsausweisWohnenSchema.merge(z.object({
uid_aufnahme: UUidWithPrefix,
uid_objekt: UUidWithPrefix,
uid_benutzer: UUidWithPrefix.optional()
output: ZodOverlap<OptionalNullable<BedarfsausweisWohnenClient>>(BedarfsausweisWohnenSchema.merge(z.object({
aufnahme_id: UUidWithPrefix,
objekt_id: UUidWithPrefix,
benutzer_id: UUidWithPrefix.optional()
})).omit({
id: true,
aufnahme_id: true,
@@ -166,9 +174,9 @@ export const GET = defineApiRoute({
})),
middleware: authorizationMiddleware,
async fetch(input, context, user) {
const { uid } = context.params;
const { id } = context.params;
if (!uid) {
if (!id) {
throw new APIError({
code: "BAD_REQUEST",
message: "Missing uid in request params"
@@ -177,21 +185,21 @@ export const GET = defineApiRoute({
const ausweis = await prisma.verbrauchsausweisWohnen.findUnique({
where: {
uid,
id,
benutzer_id: user.id
},
include: {
benutzer: {
select: {
uid: true
id: true
}
},
aufnahme: {
select: {
uid: true,
id: true,
objekt: {
select: {
uid: true
id: true
}
}
}
@@ -208,9 +216,9 @@ export const GET = defineApiRoute({
}
return {
uid_aufnahme: ausweis.aufnahme.uid,
uid_objekt: ausweis.aufnahme.objekt.uid,
uid_benutzer: ausweis.benutzer?.uid,
aufnahme_id: ausweis.aufnahme.id,
objekt_id: ausweis.aufnahme.objekt.id,
benutzer_id: ausweis.benutzer?.id,
...exclude(ausweis, ["id", "aufnahme_id", "benutzer_id", "aufnahme"])
}
},

View File

@@ -1,5 +1,10 @@
import { UUidWithPrefix } from "#components/Ausweis/types.js";
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
import { VALID_UUID_PREFIXES } from "#lib/constants.js";
import { generatePrefixedId } from "#lib/db.js";
import {
authorizationHeaders,
authorizationMiddleware,
} from "#lib/middleware/authorization.js";
import { prisma } from "#lib/server/prisma.js";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import { BedarfsausweisWohnenSchema } from "src/generated/zod/bedarfsausweiswohnen.js";
@@ -16,66 +21,58 @@ export const PUT = defineApiRoute({
ausweis: BedarfsausweisWohnenSchema.omit({
id: true,
benutzer_id: true,
uid: true,
aufnahme_id: true
aufnahme_id: true,
rechnung_id: true,
ausgestellt: true,
bestellt: true,
zurueckgestellt: true,
created_at: true,
updated_at: true,
storniert: true,
}),
uid_aufnahme: UUidWithPrefix
}),
output: z.object({
uid: UUidWithPrefix,
objekt_uid: UUidWithPrefix,
aufnahme_uid: UUidWithPrefix,
aufnahme_id: UUidWithPrefix,
}),
output: UUidWithPrefix,
headers: authorizationHeaders,
middleware: authorizationMiddleware,
async fetch(input, ctx, user) {
const aufnahme = await prisma.aufnahme.findUnique({
where: {
uid: input.uid_aufnahme
}
})
id: input.aufnahme_id,
},
});
if (!aufnahme || aufnahme.benutzer_id !== user.id) {
throw new APIError({
code: "FORBIDDEN",
message: "Aufnahme konnte nicht gefunden werden oder gehört nicht zu diesem Benutzer."
})
message:
"Aufnahme konnte nicht gefunden werden oder gehört nicht zu diesem Benutzer.",
});
}
const createdAusweis = await prisma.bedarfsausweisWohnen.create({
data: {
...input.ausweis,
benutzer: {
connect: {
id: user.id,
},
},
aufnahme: {
connect: {
uid: aufnahme.uid,
},
},
},
select: {
uid: true,
aufnahme: {
select: {
uid: true,
objekt: {
select: {
uid: true,
},
},
},
},
},
});
const id = generatePrefixedId(
6,
VALID_UUID_PREFIXES.BedarfsausweisWohnen
);
return {
uid: createdAusweis.uid,
objekt_uid: createdAusweis.aufnahme.objekt.uid,
aufnahme_uid: createdAusweis.aufnahme.uid,
};
await prisma.bedarfsausweisWohnen.create({
data: {
id,
...input.ausweis,
benutzer: {
connect: {
id: user.id,
},
},
aufnahme: {
connect: {
id: aufnahme.id,
},
},
},
});
return id;
},
});
@@ -98,27 +95,22 @@ export const GET = defineApiRoute({
},
middleware: authorizationMiddleware,
async fetch(input, context, user) {
const { uid } = context.params;
const { id } = context.params;
const ausweis = await prisma.bedarfsausweisWohnen.findUnique({
where: {
uid,
id,
},
include: {
benutzer: true,
aufnahme: {
include: {
objekt: {
include: {
bilder: true,
},
},
rechnungen: true,
bilder: true,
events: {
include: {
benutzer: {
select: {
uid: true,
id: true,
},
},
},

View File

@@ -1,17 +1,25 @@
import { GEGNachweisWohnenClient, OptionalNullable, UUidWithPrefix, ZodOverlap } from "#components/Ausweis/types.js";
import { VALID_UUID_PREFIXES } from "#lib/constants.js";
import { generatePrefixedId } from "#lib/db.js";
import { exclude } from "#lib/exclude.js";
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
import { GEGNachweisGewerbeSchema, GEGNachweisWohnenSchema, prisma } from "#lib/server/prisma";
import { prisma } from "#lib/server/prisma.js";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import { GEGNachweisGewerbeSchema } from "src/generated/zod/gegnachweisgewerbe.js";
import { z } from "zod";
export const PATCH = defineApiRoute({
input: GEGNachweisGewerbeSchema.omit({
uid: true,
id: true,
benutzer_id: true,
geg_einpreisung_id: true,
aufnahme_id: true,
geg_einpreisung_id: true
bestellt: true,
created_at: true,
rechnung_id: true,
storniert: true,
updated_at: true,
zurueckgestellt: true
}),
output: z.void(),
headers: {
@@ -21,7 +29,7 @@ export const PATCH = defineApiRoute({
async fetch(input, ctx, user) {
const objekt = await prisma.gEGNachweisGewerbe.findUnique({
where: {
uid: ctx.params.uid,
id: ctx.params.id,
benutzer: {
id: user.id
}
@@ -37,7 +45,7 @@ export const PATCH = defineApiRoute({
await prisma.gEGNachweisGewerbe.update({
where: {
uid: ctx.params.uid
id: ctx.params.id
},
data: input
})
@@ -51,9 +59,9 @@ export const DELETE = defineApiRoute({
headers: authorizationHeaders,
middleware: authorizationMiddleware,
async fetch(input, ctx, user) {
const { uid } = ctx.params;
const { id } = ctx.params;
if (!UUidWithPrefix.safeParse(uid).success) {
if (!UUidWithPrefix.safeParse(id).success) {
throw new APIError({
code: "BAD_REQUEST",
message: "UID konnte nicht verifiziert werden."
@@ -64,7 +72,7 @@ export const DELETE = defineApiRoute({
// Dieser MUSS mit dem Nutzer verknüpft sein.
const nachweis = await prisma.gEGNachweisGewerbe.findUnique({
where: {
uid,
id,
}
});
@@ -111,10 +119,13 @@ export const DELETE = defineApiRoute({
}
})
const event_id = generatePrefixedId(6, VALID_UUID_PREFIXES.Ticket)
// Wir erstellen ein Event, dass der Nachweis storniert wurde
// Dann können wir das in der Historie anzeigen
await prisma.event.create({
data: {
id: event_id,
title: "Nachweis storniert",
description: ((user.rolle === "ADMIN") && (nachweis.benutzer_id !== user.id)) ? "Nachweis wurde von einem Administrator storniert." : "Nachweis wurde vom Besitzer storniert.",
benutzer: {
@@ -150,9 +161,9 @@ export const GET = defineApiRoute({
}
},
output: GEGNachweisGewerbeSchema.merge(z.object({
uid_aufnahme: UUidWithPrefix,
uid_objekt: UUidWithPrefix,
uid_benutzer: UUidWithPrefix.optional()
aufnahme_id: UUidWithPrefix,
objekt_id: UUidWithPrefix,
benutzer_id: UUidWithPrefix.optional()
})).omit({
id: true,
aufnahme_id: true,
@@ -160,9 +171,9 @@ export const GET = defineApiRoute({
}),
middleware: authorizationMiddleware,
async fetch(input, context, user) {
const { uid } = context.params;
const { id } = context.params;
if (!uid) {
if (!id) {
throw new APIError({
code: "BAD_REQUEST",
message: "Missing uid in request params"
@@ -171,21 +182,21 @@ export const GET = defineApiRoute({
const nachweis = await prisma.gEGNachweisGewerbe.findUnique({
where: {
uid,
id,
benutzer_id: user.id
},
include: {
benutzer: {
select: {
uid: true
id: true
}
},
aufnahme: {
select: {
uid: true,
id: true,
objekt: {
select: {
uid: true
id: true
}
}
}
@@ -202,9 +213,9 @@ export const GET = defineApiRoute({
}
return {
uid_aufnahme: nachweis.aufnahme.uid,
uid_objekt: nachweis.aufnahme.objekt.uid,
uid_benutzer: nachweis.benutzer?.uid,
aufnahme_id: nachweis.aufnahme.id,
objekt_id: nachweis.aufnahme.objekt.id,
benutzer_id: nachweis.benutzer?.id,
...exclude(nachweis, ["id", "aufnahme_id", "benutzer_id", "aufnahme"])
}
},

View File

@@ -18,11 +18,14 @@ export const PUT = defineApiRoute({
nachweis: GEGNachweisGewerbeSchema.omit({
id: true,
benutzer_id: true,
aufnahme_id: true,
created_at: true,
updated_at: true,
geg_einpreisung_id: true,
rechnung_id: true
aufnahme_id: true,
bestellt: true,
created_at: true,
rechnung_id: true,
storniert: true,
updated_at: true,
zurueckgestellt: true
}),
aufnahme_id: UUidWithPrefix
}),

View File

@@ -14,6 +14,12 @@ export const PATCH = defineApiRoute({
benutzer_id: true,
geg_einpreisung_id: true,
aufnahme_id: true,
bestellt: true,
created_at: true,
rechnung_id: true,
storniert: true,
updated_at: true,
zurueckgestellt: true
}),
output: z.void(),
headers: {

View File

@@ -18,11 +18,14 @@ export const PUT = defineApiRoute({
nachweis: GEGNachweisWohnenSchema.omit({
id: true,
benutzer_id: true,
aufnahme_id: true,
updated_at: true,
created_at: true,
geg_einpreisung_id: true,
rechnung_id: true
aufnahme_id: true,
bestellt: true,
created_at: true,
rechnung_id: true,
storniert: true,
updated_at: true,
zurueckgestellt: true
}),
aufnahme_id: UUidWithPrefix
}),

View File

@@ -3,6 +3,8 @@ import { prisma } from "#lib/server/prisma.js";
import { defineApiRoute } from "astro-typesafe-api/server";
import { UUidWithPrefix } from "#components/Ausweis/types.js";
import { TicketsSchema } from "src/generated/zod/tickets.js";
import { generatePrefixedId } from "#lib/db.js";
import { VALID_UUID_PREFIXES } from "#lib/constants.js";
export const PUT = defineApiRoute({
meta: {
@@ -20,23 +22,22 @@ export const PUT = defineApiRoute({
id: true,
prioritaet: true,
status: true,
uid: true,
updated_at: true,
}),
output: z.object({
uid: UUidWithPrefix,
id: UUidWithPrefix,
}),
async fetch(input, ctx) {
const id = generatePrefixedId(6, VALID_UUID_PREFIXES.Ticket)
const ticket = await prisma.tickets.create({
data: {
id,
beschreibung: input.beschreibung,
email: input.email,
titel: input.titel,
metadata: input.metadata,
},
select: {
uid: true,
},
}
});
// Das sind die Label IDs von Trello
@@ -71,7 +72,7 @@ export const PUT = defineApiRoute({
return {
uid: ticket.uid,
id: ticket.id,
};
},
});

View File

@@ -1,112 +1,85 @@
---
import AusweisLayout from "#layouts/AusweisLayoutDaten.astro";
import { AufnahmeClient, ObjektClient, BildClient, VerbrauchsausweisGewerbeClient } from "#components/Ausweis/types";
import { createCaller } from "src/astro-typesafe-api-caller";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants";
import { validateAccessTokenServer } from "#server/lib/validateAccessToken";
import VerbrauchsausweisGewerbeModule from "#modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte";
import { Enums } from "#lib/server/prisma";
import { Aufnahme, Enums, Objekt, VerbrauchsausweisGewerbe } from "#lib/server/prisma";
import { getAufnahme, getObjekt, getBilder, getVerbrauchsausweisGewerbe } from "#lib/server/db";
import { getCurrentUser } from "#lib/server/user";
const id = Astro.url.searchParams.get("uid");
const id = Astro.url.searchParams.get("id");
const aufnahme_id = Astro.url.searchParams.get("aufnahme")
const ausweistyp = Astro.url.searchParams.get("ausweistyp") || Enums.AusweisTyp.Standard;
let ausweistyp = Astro.url.searchParams.get("ausweistyp") as Enums.AusweisTyp || Enums.AusweisTyp.Standard;
let ausweis: VerbrauchsausweisGewerbeClient = {} as VerbrauchsausweisGewerbeClient;
let aufnahme: AufnahmeClient = {} as AufnahmeClient;
let objekt: ObjektClient = {} as ObjektClient;
let bilder: BildClient[] = []
const valid = validateAccessTokenServer(Astro);
const caller = createCaller(Astro);
const user = await getCurrentUser(Astro)
if (id) {
if (!valid) {
if (!user) {
return Astro.redirect(
`/auth/login?redirect=${Astro.url.toString()}`
);
}
try {
let { aufnahme_id, objekt_id, benutzer_id, ...result } = await caller["verbrauchsausweis-gewerbe"]._id.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
id
}
});
ausweis = await getVerbrauchsausweisGewerbe(id) as VerbrauchsausweisGewerbe
ausweis = result
aufnahme = await caller.aufnahme._id.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
id: aufnahme_id
}
})
objekt = await caller.objekt._id.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
id: objekt_id
}
})
bilder = await caller.aufnahme._id.bilder.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
id: aufnahme_id
}
})
if (!ausweis) {
// Der Ausweis scheint nicht zu existieren.
// Wir leiten auf die generische Ausweisseite ohne UID weiter.
return Astro.redirect(
"/energieausweis-erstellen/verbrauchsausweis-gewerbe"
);
}
} catch(e) {
if (!ausweis || ausweis.benutzer_id !== user.id) {
// Der Ausweis scheint nicht zu existieren.
// Wir leiten auf die generische Ausweisseite ohne ID weiter.
return Astro.redirect(
"/energieausweis-erstellen/verbrauchsausweis-gewerbe"
"/energieausweis-erstellen/verbrauchsausweis-wohngebaeude"
);
}
aufnahme = await getAufnahme(ausweis.aufnahme_id) as Aufnahme
if (!aufnahme) {
// Die Aufnahme existiert nicht, das sollte eigentlich nicht passieren aber so können wir nicht fortfahren.
return Astro.redirect(
"/energieausweis-erstellen/verbrauchsausweis-wohngebaeude"
);
}
objekt = await getObjekt(aufnahme.objekt_id) as Objekt
if (!objekt) {
// Das Objekt existiert nicht, das sollte eigentlich nicht passieren aber so können wir nicht fortfahren.
return Astro.redirect(
"/energieausweis-erstellen/verbrauchsausweis-wohngebaeude"
);
}
bilder = await getBilder(aufnahme.id);
} else if (aufnahme_id) {
if (!valid) {
if (!user) {
return Astro.redirect(
`/auth/login?redirect=${Astro.url.toString()}`
);
}
let { objekt_id, ...result} = await caller.aufnahme._id.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
id: aufnahme_id
}
})
aufnahme = await getAufnahme(ausweis.aufnahme_id) as Aufnahme
aufnahme = result;
if (!aufnahme) {
// Die Aufnahme existiert wohl nicht.
return Astro.redirect(
"/energieausweis-erstellen/verbrauchsausweis-wohngebaeude"
);
}
objekt = await caller.objekt._id.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
id: objekt_id
}
})
objekt = await getObjekt(aufnahme.objekt_id) as Objekt
if (!objekt) {
// Das Objekt existiert nicht.
return Astro.redirect(
"/energieausweis-erstellen/verbrauchsausweis-wohngebaeude"
);
}
}
---
<AusweisLayout title="Verbrauchsausweis Gewerbe erstellen | IBCornelsen">
<VerbrauchsausweisGewerbeModule client:only {ausweis} {objekt} {aufnahme} {bilder} {ausweistyp} />
<VerbrauchsausweisGewerbeModule client:only {ausweis} {objekt} {aufnahme} {bilder} {ausweistyp} {user} {id} />
</AusweisLayout>