Speichern verbessert

This commit is contained in:
Moritz Utcke
2025-04-06 10:42:36 -04:00
parent 074ee8b463
commit 0b89320007
13 changed files with 1030 additions and 557 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 { exclude } from "#lib/exclude.js";
import Cookies from "js-cookie"; import Cookies from "js-cookie";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js"; import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
import { AufnahmeClient, BedarfsausweisWohnenClient, BildClient, ObjektClient, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient, } from "#components/Ausweis/types.js"; import {
import { Enums } from "#lib/client/prisma.js"; 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( export async function ausweisSpeichern(
ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient, ausweis:
| VerbrauchsausweisWohnenClient
| VerbrauchsausweisGewerbeClient
| BedarfsausweisWohnenClient,
objekt: ObjektClient, objekt: ObjektClient,
aufnahme: AufnahmeClient, aufnahme: AufnahmeClient,
bilder: BildClient[], bilder: BildClient[],
ausweisart: Enums.Ausweisart ausweisart: Enums.Ausweisart
) { ) {
if (objekt.id) { const [objekt_id, objekt_error] = await tryCatch(objektSpeichern(objekt));
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)}`
}
})
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) { if (aufnahme_error) {
await api.aufnahme._id.PATCH.fetch({ addNotification({
baujahr_gebaeude: aufnahme.baujahr_gebaeude, message: "Das hat nicht geklappt.",
baujahr_heizung: aufnahme.baujahr_heizung, subtext:
baujahr_klima: aufnahme.baujahr_klima || [], "Beim Speichern der Objektaufnahme ist ein Fehler aufgetreten, bitte versuchen sie es erneut.",
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)}`
}
})
aufnahme.id = id return;
} }
let patchRoute: any; aufnahme.id = aufnahme_id;
let putRoute: any;
if (ausweisart == Enums.Ausweisart.VerbrauchsausweisWohnen) { if (ausweisart == Enums.Ausweisart.VerbrauchsausweisWohnen) {
patchRoute = api["verbrauchsausweis-wohnen"]._id.PATCH const id = await verbrauchsausweisWohnenSpeichern(ausweis as VerbrauchsausweisWohnen, aufnahme_id)
putRoute = api["verbrauchsausweis-wohnen"].PUT ausweis.id = id;
} else if (ausweisart == Enums.Ausweisart.VerbrauchsausweisGewerbe) { } else if (ausweisart == Enums.Ausweisart.VerbrauchsausweisGewerbe) {
patchRoute = api["verbrauchsausweis-gewerbe"]._id.PATCH const id = await verbrauchsausweisGewerbeSpeichern(ausweis as VerbrauchsausweisGewerbe, aufnahme_id)
putRoute = api["verbrauchsausweis-gewerbe"].PUT ausweis.id = id;
} else if (ausweisart == Enums.Ausweisart.BedarfsausweisWohnen) { } else if (ausweisart == Enums.Ausweisart.BedarfsausweisWohnen) {
patchRoute = api["bedarfsausweis-wohnen"]._id.PATCH const id = await bedarfsausweisWohnenSpeichern(ausweis as BedarfsausweisWohnen, aufnahme_id)
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)}`
}
})
ausweis.id = id; ausweis.id = id;
} }
await api.aufnahme._id.bilder.PUT.fetch(bilder.map(bild => bild.id), { await api.aufnahme._id.bilder.PUT.fetch(
params: { bilder.map((bild) => bild.id),
id: aufnahme.id {
}, params: {
headers: { id: aufnahme.id,
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}` },
headers: {
Authorization: `Bearer ${Cookies.get(
API_ACCESS_TOKEN_COOKIE_NAME
)}`,
},
} }
}) );
return { return {
ausweis_id: ausweis.id, ausweis_id: ausweis.id,
aufnahme_id: aufnahme.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 { api } from "astro-typesafe-api/client"
import { exclude } from "#lib/exclude.js";
import Cookies from "js-cookie"; import Cookies from "js-cookie";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js"; import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
import { AufnahmeClient, BildClient, ObjektClient, } from "#components/Ausweis/types.js"; import { AufnahmeClient, BildClient, ObjektClient, } from "#components/Ausweis/types.js";
import { BedarfsausweisGewerbe, Enums, GEGNachweisGewerbe, GEGNachweisWohnen, Unterlage } from "#lib/client/prisma.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( export async function nachweisSpeichern(
nachweis: BedarfsausweisGewerbe | GEGNachweisWohnen | GEGNachweisGewerbe, nachweis: BedarfsausweisGewerbe | GEGNachweisWohnen | GEGNachweisGewerbe,
@@ -14,195 +147,38 @@ export async function nachweisSpeichern(
unterlagen: Unterlage[], unterlagen: Unterlage[],
ausweisart: Enums.Ausweisart ausweisart: Enums.Ausweisart
) { ) {
if (objekt.id) { const [objekt_id, objekt_error] = await tryCatch(objektSpeichern(objekt))
await api.objekt._id.PATCH.fetch({
adresse: objekt.adresse, if (objekt_error) {
latitude: 0, addNotification({
longitude: 0, message: "Das hat nicht geklappt.",
ort: objekt.ort, subtext: "Beim Speichern des Objektes ist ein Fehler aufgetreten, bitte versuchen sie es erneut."
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)}`
}
}) })
objekt.id = id; return;
} }
objekt.id = objekt_id
let [aufnahme_id, aufnahme_error] = await tryCatch(aufnahmeSpeichern(aufnahme, objekt_id))
if (aufnahme.id) { if (aufnahme_error) {
await api.aufnahme._id.PATCH.fetch({ addNotification({
baujahr_gebaeude: aufnahme.baujahr_gebaeude || [], message: "Das hat nicht geklappt.",
baujahr_heizung: aufnahme.baujahr_heizung || [], subtext: "Beim Speichern der Objektaufnahme ist ein Fehler aufgetreten, bitte versuchen sie es erneut."
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)}`
}
}) })
aufnahme.id = id return;
} }
let patchRoute: any; aufnahme.id = aufnahme_id
let putRoute: any;
if (ausweisart == Enums.Ausweisart.GEGNachweisWohnen) { if (ausweisart == Enums.Ausweisart.GEGNachweisWohnen) {
patchRoute = api["geg-nachweis-wohnen"]._id.PATCH gegNachweisWohnenSpeichern(nachweis as GEGNachweisWohnen, aufnahme_id)
putRoute = api["geg-nachweis-wohnen"].PUT
} else if (ausweisart === Enums.Ausweisart.GEGNachweisGewerbe) { } else if (ausweisart === Enums.Ausweisart.GEGNachweisGewerbe) {
patchRoute = api["geg-nachweis-gewerbe"]._id.PATCH gegNachweisGewerbeSpeichern(nachweis as GEGNachweisGewerbe, aufnahme_id)
putRoute = api["geg-nachweis-gewerbe"].PUT
} else if (ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe) { } else if (ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe) {
patchRoute = api["bedarfsausweis-gewerbe"]._id.PATCH bedarfsausweisGewerbeSpeichern(nachweis as BedarfsausweisGewerbe, aufnahme_id)
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;
} }
await api.aufnahme._id.bilder.PUT.fetch(bilder.map(bild => bild.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)}` "Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
} }
}) })
console.log(unterlagen);
await api.aufnahme._id.unterlagen.PUT.fetch(unterlagen.map(unterlage => unterlage.id), { await api.aufnahme._id.unterlagen.PUT.fetch(unterlagen.map(unterlage => unterlage.id), {
params: { 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

@@ -39,26 +39,39 @@
(form.querySelector("input[name='baujahr_heizung']") as HTMLInputElement).setCustomValidity("") (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()) { if (!form.checkValidity()) {
// Entferne die Klasse "2xl:mt-[370px]" falls vorhanden // Entferne die Klasse "2xl:mt-[370px]" falls vorhanden
form.classList.remove("2xl:mt-[370px]"); form.classList.remove("2xl:mt-[370px]");
// Verhindere das Scrollen (falls erforderlich) // Verhindere das Scrollen (falls erforderlich)
skala.classList.add("no-scroll"); skala.classList.add("no-scroll");
// Zeige die Validierungsmeldungen // Zeige die Validierungsmeldungen
form.reportValidity(); form.reportValidity();
// Finde das erste ungültige Feld und scrolle sanft darauf // Finde das erste ungültige Feld und scrolle sanft darauf
let firstInvalidField = form.querySelector(":invalid"); let firstInvalidField = form.querySelector(":invalid");
if (firstInvalidField) { if (firstInvalidField) {
let offset = 150; // Abstand für bessere Sichtbarkeit let offset = 150; // Abstand für bessere Sichtbarkeit
let fieldPosition = firstInvalidField.getBoundingClientRect().top + window.scrollY; let fieldPosition = firstInvalidField.getBoundingClientRect().top + window.scrollY;
window.scrollTo({ top: fieldPosition - offset, behavior: "smooth" }); window.scrollTo({ top: fieldPosition - offset, behavior: "smooth" });
} }
return; return;
} }
if (ausweisart === Enums.Ausweisart.GEGNachweisWohnen || ausweisart === Enums.Ausweisart.GEGNachweisGewerbe || ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe) { if (ausweisart === Enums.Ausweisart.GEGNachweisWohnen || ausweisart === Enums.Ausweisart.GEGNachweisGewerbe || ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe) {
openWindowWithPost("/kundendaten", { openWindowWithPost("/kundendaten", {
@@ -97,10 +110,16 @@
let result: Awaited<ReturnType<typeof ausweisSpeichern>> | Awaited<ReturnType<typeof nachweisSpeichern>> | null = null; 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) { if (ausweisart === Enums.Ausweisart.GEGNachweisWohnen || ausweisart === Enums.Ausweisart.GEGNachweisGewerbe || ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe) {
result = await nachweisSpeichern({ ...ausweis as GEGNachweisWohnen, nachweistyp: ausweistyp }, objekt, aufnahme, bilder, unterlagen, ausweisart) result = await nachweisSpeichern({ ...ausweis as GEGNachweisWohnen, nachweistyp: ausweistyp }, objekt, aufnahme, bilder, unterlagen, ausweisart)
ausweis.id = result.nachweis_id;
if (result) {
ausweis.id = result.nachweis_id;
}
} else { } else {
result = await ausweisSpeichern({ ...ausweis as VerbrauchsausweisWohnen, ausweistyp }, objekt, aufnahme, bilder, ausweisart) result = await ausweisSpeichern({ ...ausweis as VerbrauchsausweisWohnen, ausweistyp }, objekt, aufnahme, bilder, ausweisart)
ausweis.id = result.ausweis_id;
if (result) {
ausweis.id = result.ausweis_id;
}
} }
if (result !== null) { if (result !== null) {

View File

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

View File

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

View File

@@ -1,4 +1,6 @@
import { UUidWithPrefix } from "#components/Ausweis/types.js"; 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 { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
import { prisma } from "#lib/server/prisma.js"; import { prisma } from "#lib/server/prisma.js";
import { APIError, defineApiRoute } from "astro-typesafe-api/server"; import { APIError, defineApiRoute } from "astro-typesafe-api/server";
@@ -16,24 +18,24 @@ export const PUT = defineApiRoute({
nachweis: BedarfsausweisGewerbeSchema.omit({ nachweis: BedarfsausweisGewerbeSchema.omit({
id: true, id: true,
benutzer_id: true, benutzer_id: true,
uid: true,
aufnahme_id: true,
geg_einpreisung_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 aufnahme_id: UUidWithPrefix
}),
output: z.object({
uid: UUidWithPrefix,
objekt_uid: UUidWithPrefix,
aufnahme_uid: UUidWithPrefix,
}), }),
output: UUidWithPrefix,
headers: authorizationHeaders, headers: authorizationHeaders,
middleware: authorizationMiddleware, middleware: authorizationMiddleware,
async fetch(input, ctx, user) { async fetch(input, ctx, user) {
const aufnahme = await prisma.aufnahme.findUnique({ const aufnahme = await prisma.aufnahme.findUnique({
where: { 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({ const nachweis = await prisma.bedarfsausweisGewerbe.create({
data: { data: {
id,
...input.nachweis, ...input.nachweis,
benutzer: { benutzer: {
connect: { connect: {
@@ -57,27 +62,10 @@ export const PUT = defineApiRoute({
id: aufnahme.id, id: aufnahme.id,
}, },
} }
}, }
select: {
uid: true,
aufnahme: {
select: {
uid: true,
objekt: {
select: {
uid: true,
},
},
},
},
},
}); });
return { return nachweis.id
uid: nachweis.uid,
objekt_uid: nachweis.aufnahme.objekt.uid,
aufnahme_uid: nachweis.aufnahme.uid,
};
}, },
}); });
@@ -101,11 +89,11 @@ export const GET = defineApiRoute({
headers: authorizationHeaders, headers: authorizationHeaders,
middleware: authorizationMiddleware, middleware: authorizationMiddleware,
async fetch(input, context, user) { async fetch(input, context, user) {
const { uid } = context.params; const { id } = context.params;
const nachweis = await prisma.bedarfsausweisGewerbe.findUnique({ const nachweis = await prisma.bedarfsausweisGewerbe.findUnique({
where: { where: {
uid, id,
}, },
include: { include: {
benutzer: true, benutzer: true,
@@ -115,7 +103,7 @@ export const GET = defineApiRoute({
include: { include: {
benutzer: { benutzer: {
select: { select: {
uid: true, id: true,
}, },
}, },
}, },

View File

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

View File

@@ -1,5 +1,10 @@
import { UUidWithPrefix } from "#components/Ausweis/types.js"; 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 { prisma } from "#lib/server/prisma.js";
import { APIError, defineApiRoute } from "astro-typesafe-api/server"; import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import { BedarfsausweisWohnenSchema } from "src/generated/zod/bedarfsausweiswohnen.js"; import { BedarfsausweisWohnenSchema } from "src/generated/zod/bedarfsausweiswohnen.js";
@@ -16,66 +21,58 @@ export const PUT = defineApiRoute({
ausweis: BedarfsausweisWohnenSchema.omit({ ausweis: BedarfsausweisWohnenSchema.omit({
id: true, id: true,
benutzer_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 aufnahme_id: UUidWithPrefix,
}),
output: z.object({
uid: UUidWithPrefix,
objekt_uid: UUidWithPrefix,
aufnahme_uid: UUidWithPrefix,
}), }),
output: UUidWithPrefix,
headers: authorizationHeaders, headers: authorizationHeaders,
middleware: authorizationMiddleware, middleware: authorizationMiddleware,
async fetch(input, ctx, user) { async fetch(input, ctx, user) {
const aufnahme = await prisma.aufnahme.findUnique({ const aufnahme = await prisma.aufnahme.findUnique({
where: { where: {
uid: input.uid_aufnahme id: input.aufnahme_id,
} },
}) });
if (!aufnahme || aufnahme.benutzer_id !== user.id) { if (!aufnahme || aufnahme.benutzer_id !== user.id) {
throw new APIError({ throw new APIError({
code: "FORBIDDEN", 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({ const id = generatePrefixedId(
data: { 6,
...input.ausweis, VALID_UUID_PREFIXES.BedarfsausweisWohnen
benutzer: { );
connect: {
id: user.id,
},
},
aufnahme: {
connect: {
uid: aufnahme.uid,
},
},
},
select: {
uid: true,
aufnahme: {
select: {
uid: true,
objekt: {
select: {
uid: true,
},
},
},
},
},
});
return { await prisma.bedarfsausweisWohnen.create({
uid: createdAusweis.uid, data: {
objekt_uid: createdAusweis.aufnahme.objekt.uid, id,
aufnahme_uid: createdAusweis.aufnahme.uid, ...input.ausweis,
}; benutzer: {
connect: {
id: user.id,
},
},
aufnahme: {
connect: {
id: aufnahme.id,
},
},
},
});
return id;
}, },
}); });
@@ -98,27 +95,22 @@ export const GET = defineApiRoute({
}, },
middleware: authorizationMiddleware, middleware: authorizationMiddleware,
async fetch(input, context, user) { async fetch(input, context, user) {
const { uid } = context.params; const { id } = context.params;
const ausweis = await prisma.bedarfsausweisWohnen.findUnique({ const ausweis = await prisma.bedarfsausweisWohnen.findUnique({
where: { where: {
uid, id,
}, },
include: { include: {
benutzer: true, benutzer: true,
aufnahme: { aufnahme: {
include: { include: {
objekt: { bilder: true,
include: {
bilder: true,
},
},
rechnungen: true,
events: { events: {
include: { include: {
benutzer: { benutzer: {
select: { select: {
uid: true, id: true,
}, },
}, },
}, },

View File

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

View File

@@ -18,11 +18,14 @@ export const PUT = defineApiRoute({
nachweis: GEGNachweisGewerbeSchema.omit({ nachweis: GEGNachweisGewerbeSchema.omit({
id: true, id: true,
benutzer_id: true, benutzer_id: true,
aufnahme_id: true,
created_at: true,
updated_at: true,
geg_einpreisung_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
}), }),
aufnahme_id: UUidWithPrefix aufnahme_id: UUidWithPrefix
}), }),

View File

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

View File

@@ -18,11 +18,14 @@ export const PUT = defineApiRoute({
nachweis: GEGNachweisWohnenSchema.omit({ nachweis: GEGNachweisWohnenSchema.omit({
id: true, id: true,
benutzer_id: true, benutzer_id: true,
aufnahme_id: true,
updated_at: true,
created_at: true,
geg_einpreisung_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
}), }),
aufnahme_id: UUidWithPrefix aufnahme_id: UUidWithPrefix
}), }),