Merge pull request #451 from IBCornelsen/main

getMain
This commit is contained in:
UMBENOMENA
2025-03-15 16:35:00 +01:00
committed by GitHub
55 changed files with 2521 additions and 1157 deletions

View File

@@ -1,721 +0,0 @@
//// ------------------------------------------------------
//// THIS FILE WAS AUTOMATICALLY GENERATED (DO NOT MODIFY)
//// ------------------------------------------------------
Project "IBCornelsen Database" {
database_type: 'PostgreSQL'
Note: ''
}
Table Anteilshaber {
id Int [pk, increment]
benutzer_id Int [not null]
rolle String
privilegien BigInt
uid String [unique, not null]
benutzer benutzer [not null]
objekt_id Int [not null]
objekt Objekt [not null]
}
Table ApiRequests {
id Int [pk, increment]
date DateTime [default: `now()`, not null]
ip String [not null]
method String [not null]
path String [not null]
status Int [not null]
responseTime Float [not null]
responseSize Int [not null]
userAgent String [not null]
user_id Int
user benutzer
}
Table Aufnahme {
id Int [pk, increment]
uid String [unique, not null, note: '@zod.describe("UID der Gebäude Aufnahme")']
benutzer_id Int
benutzer benutzer
ausweisart Ausweisart [note: '@zod.describe("Art des korrespondierenden Ausweises, wie z.B. VerbrauchsausweisWohnen")']
gebaeudetyp String [note: '@zod.describe("Art des Gebäudes und seiner primären Nutzungsart")']
gebaeudeteil String [note: '@zod.describe("Betrachteter Teil des Gebäudes, z.B. Gesamtgebäude, Wohnteil, Gewerbeteil")']
baujahr_gebaeude Int[] [not null, note: '@zod.describe("Alle Jahre in denen das Gebäude konstruiert oder grundlegend verändert wurde")']
baujahr_heizung Int[] [not null, note: '@zod.describe("Alle Jahre in denen die Heizung eingebaut oder grundlegend verändert wurde")']
baujahr_klima Int[] [not null, note: '@zod.describe("Alle Jahre in denen die Klimaanlage eingebaut oder grundlegend verändert wurde")']
einheiten Int [note: '@zod.describe("Anzahl der (Wohn)Einheiten im Gebäude")']
flaeche Int [note: '@zod.describe("Wohnfläche bei Wohngebäuden, Nutzfläche bei Gewerbegebäuden")']
nutzflaeche Int [note: '@zod.describe("(energetische) Nutzfläche des Gebäudes. Bei Gewerbegebäuden entspricht Sie der Nutzfläche")']
saniert Boolean [note: '@zod.describe("Falls das Gebäude energetisch saniert ist, sollte dieser Wert auf true stehen")']
keller Heizungsstatus [note: '@zod.describe("Ob ein Keller vorhanden, beheizt oder unbeheizt ist")']
dachgeschoss Heizungsstatus [note: '@zod.describe("Ob ein Dachgeschoss vorhanden, beheizt oder unbeheizt ist")']
lueftung Lueftungskonzept [note: '@zod.describe("Art der Gebäudelüftung")']
kuehlung String [note: '@zod.describe("Art der Gebäudekühlung")']
leerstand Int [note: '@zod.describe("Prozentualer Leerstand des Gebäudes in einem durchschnittlichen Jahr")']
alternative_heizung Boolean [note: '@zod.describe("Falls der Heizungsverbrauch alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen")']
alternative_warmwasser Boolean [note: '@zod.describe("Falls der Warmwasserverbrauch alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen")']
alternative_lueftung Boolean [note: '@zod.describe("Falls die Lüftung alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen")']
alternative_kuehlung Boolean [note: '@zod.describe("Falls die Kühlung alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen")']
brennstoff_1 String [note: '@zod.describe("Genutzer Brennstoff der primären Energiequelle")']
brennstoff_2 String [note: '@zod.describe("Genutzer Brennstoff der sekundären Energiequelle")']
boxpruefung Boolean [default: false]
energieeffizienzklasse String [note: '@zod.describe("Die aus der Berechnung hervorgehende Energieeffizienzklasse des Gebäudes")']
erstellungsdatum DateTime [default: `now()`, note: '@zod.describe("Datum an dem der Kunde den Ausweis erstellt hat")']
ausstellungsdatum DateTime [note: '@zod.describe("Datum an dem der Aussteller den Ausweis ausgestellt hat")']
zentralheizung Boolean [note: '@zod.describe("Falls das Gebäude über eine Zentralbeheizung verfügt, sollte dieser Wert auf true stehen")']
solarsystem_warmwasser Boolean [note: '@zod.describe("Falls das Gebäude über ein Solarsystem für Warmwasser verfügt, sollte dieser Wert auf true stehen")']
warmwasser_rohre_gedaemmt Boolean [note: '@zod.describe("Falls die Warmwasserrohre des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen")']
niedertemperatur_kessel Boolean [note: '@zod.describe("Falls das Gebäude über einen Niedertemperaturkessel verfügt, sollte dieser Wert auf true stehen")']
brennwert_kessel Boolean [note: '@zod.describe("Falls das Gebäude über einen Brennwertkessel verfügt, sollte dieser Wert auf true stehen")']
heizungsrohre_gedaemmt Boolean [note: '@zod.describe("Falls die Heizungsrohre des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen")']
standard_kessel Boolean
waermepumpe Boolean [note: '@zod.describe("Falls das Gebäude über eine Wärmepumpe verfügt, sollte dieser Wert auf true stehen")']
raum_temperatur_regler Boolean [note: '@zod.describe("Falls das Gebäude über einen Raumtemperaturregler verfügt, sollte dieser Wert auf true stehen")']
photovoltaik Boolean [note: '@zod.describe("Falls das Gebäude über eine Photovoltaikanlage verfügt, sollte dieser Wert auf true stehen")']
durchlauf_erhitzer Boolean [note: '@zod.describe("Falls das Gebäude über einen Durchlauferhitzer verfügt, sollte dieser Wert auf true stehen")']
einzelofen Boolean
zirkulation Boolean [note: '@zod.describe("Falls das Gebäude über eine Zirkulationspumpe verfügt, sollte dieser Wert auf true stehen")']
einfach_verglasung Boolean [note: '@zod.describe("Falls die Fenster des Gebäudes einfach gedämmt sind, sollte dieser Wert auf true stehen")']
dreifach_verglasung Boolean [note: '@zod.describe("Falls die Fenster des Gebäudes dreifach gedämmt sind, sollte dieser Wert auf true stehen")']
fenster_teilweise_undicht Boolean [note: '@zod.describe("Falls die Fenster des Gebäudes teilweise undicht sind, sollte dieser Wert auf true stehen")']
doppel_verglasung Boolean [note: '@zod.describe("Falls die Fenster des Gebäudes doppelt gedämmt sind, sollte dieser Wert auf true stehen")']
fenster_dicht Boolean [note: '@zod.describe("Falls die Fenster des Gebäudes dicht sind, sollte dieser Wert auf true stehen")']
rolllaeden_kaesten_gedaemmt Boolean [note: '@zod.describe("Falls das Gebäude über gedämmte Rolllädenkästen verfügt, sollte dieser Wert auf true stehen")']
isolier_verglasung Boolean [note: '@zod.describe("Falls die Fenster des Gebäudes isolier Verglasung haben, sollte dieser Wert auf true stehen")']
tueren_undicht Boolean [note: '@zod.describe("Falls die Türen des Gebäudes undicht sind, sollte dieser Wert auf true stehen")']
tueren_dicht Boolean [note: '@zod.describe("Falls die Türen des Gebäudes dicht sind, sollte dieser Wert auf true stehen")']
dachgeschoss_gedaemmt Boolean [note: '@zod.describe("Falls das Dachgeschoss des Gebäudes gedämmt ist, sollte dieser Wert auf true stehen")']
keller_decke_gedaemmt Boolean [note: '@zod.describe("Falls die Kellerdecke des Gebäudes gedämmt ist, sollte dieser Wert auf true stehen")']
keller_wand_gedaemmt Boolean [note: '@zod.describe("Falls die Kellerwände des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen")']
aussenwand_gedaemmt Boolean [note: '@zod.describe("Falls die Außenwände des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen")']
oberste_geschossdecke_gedaemmt Boolean [note: '@zod.describe("Falls die oberste Geschossdecke des Gebäudes gedämmt ist, sollte dieser Wert auf true stehen")']
aussenwand_min_12cm_gedaemmt Boolean [note: '@zod.describe("Falls die Außenwände des Gebäudes mindestens 12cm gedämmt sind, sollte dieser Wert auf true stehen")']
dachgeschoss_min_12cm_gedaemmt Boolean [note: '@zod.describe("Falls das Dachgeschoss des Gebäudes mindestens 12cm gedämmt ist, sollte dieser Wert auf true stehen")']
oberste_geschossdecke_min_12cm_gedaemmt Boolean [note: '@zod.describe("Falls die oberste Geschossdecke des Gebäudes mindestens 12cm gedämmt ist, sollte dieser Wert auf true stehen")']
events Event [not null]
bilder Bild [not null]
unterlagen Unterlage [not null]
bedarfsausweise_wohnen BedarfsausweisWohnen [not null]
verbrauchsausweise_gewerbe VerbrauchsausweisGewerbe [not null]
verbrauchsausweise_wohnen VerbrauchsausweisWohnen [not null]
geg_nachweise_wohnen GEGNachweisWohnen [not null]
geg_nachweise_gewerbe GEGNachweisGewerbe [not null]
bedarfsausweise_gewerbe BedarfsausweisGewerbe [not null]
objekt_id Int [not null]
objekt Objekt [not null]
}
Table BedarfsausweisGewerbe {
id Int [pk, increment]
uid String [unique, not null]
benutzer_id Int [note: '@zod.describe("Die ID des Benutzers, welchem dieser Ausweis gehört")']
benutzer benutzer
aufnahme_id Int [unique, not null]
aufnahme Aufnahme [not null]
rechnung_id Int [unique]
rechnung Rechnung
geg_einpreisung_id Int [unique]
geg_einpreisung GEGEinpreisung
}
Table BedarfsausweisWohnen {
id Int [pk, increment]
uid String [unique, not null]
benutzer_id Int
ausstellgrund Ausstellgrund
registriernummer String
alternative_heizung Boolean
alternative_warmwasser Boolean
alternative_lueftung Boolean
alternative_kuehlung Boolean
anzahl_vollgeschosse Int
geschosshoehe Float
anzahl_gauben Int
breite_gauben Float
masse_a Float
masse_b Float
masse_c Float
masse_d Float
masse_e Float
masse_f Float
fensterflaeche_so_sw Float
fensterflaeche_nw_no Float
aussenwandflaeche_unbeheizt Float
dachflaeche Float
deckenflaeche Float
dach_u_wert Float
decke_u_wert Float
aussenwand_flaeche Float
aussenwand_u_wert Float
fussboden_flaeche Float
fussboden_u_wert Float
volumen Float
dicht Boolean
fenster_flaeche_1 Float
fenster_art_1 Float
fenster_flaeche_2 Float
fenster_art_2 Float
dachfenster_flaeche Float
dachfenster_art Float
haustuer_flaeche Float
haustuer_art Float
dach_bauart String
decke_bauart String
dach_daemmung Float
decke_daemmung Float
aussenwand_daemmung Float
boden_daemmung Float
aussenwand_bauart String
boden_bauart String
warmwasser_verteilung String
warmwasser_speicherung String
warmwasser_erzeugung String
heizung_zentral Boolean
heizung_verteilung String
heizung_speicherung String
waerme_erzeugung_heizung String
anteil_zusatzheizung Float
kollektor_flaeche Float
ausgestellt Boolean [default: false]
storniert Boolean [default: false, note: '@zod.describe("Falls der Ausweis storniert wurde, sollte dieser Wert auf true stehen")']
bestellt Boolean [default: false, note: '@zod.describe("Falls der Ausweis bestellt wurde, sollte dieser Wert auf true stehen")']
zurueckgestellt Boolean [default: false, note: '@zod.describe("Falls der Ausweis vom Aussteller zurückgestellt wurde, sollte dieser Wert auf true stehen")']
prueftext String [note: '@zod.describe("Durch den Kunden hinzugefügte Anmerkung zur Vorabprüfung")']
beschreibung String
kontrolldatei_angefragt Boolean [default: false, note: '@zod.describe("Ob bei der Anfrage der Registriernummer eine Kontrolldatei angefragt wurde")']
benutzer benutzer
rechnung_id Int [unique]
rechnung Rechnung
aufnahme_id Int [unique, not null, note: '@zod.describe("ID der korrespondierenden Gebäudeaufnahme")']
aufnahme Aufnahme [not null]
}
Table benutzer {
id Int [pk, increment]
uid String [unique, not null]
name String
vorname String
email String [unique, not null]
passwort String [not null]
profilbild String
plz String
ort String
adresse String
telefon String
anrede String
rolle BenutzerRolle [not null, default: 'USER']
firma String
lex_office_id String
verified Boolean [not null, default: false]
BedarfsausweisWohnen BedarfsausweisWohnen [not null]
documenttemplates documenttemplates [not null]
objekte Objekt [not null]
rechnungen Rechnung [not null]
tokens tokens [not null]
VerbrauchsausweisGewerbe VerbrauchsausweisGewerbe [not null]
VerbrauchsausweisWohnen VerbrauchsausweisWohnen [not null]
ApiRequests ApiRequests [not null]
RefreshTokens RefreshTokens [not null]
aufnahmen Aufnahme [not null]
geg_einpreisungen GEGEinpreisung [not null]
geg_nachweise_gewerbe GEGNachweisGewerbe [not null]
geg_nachweise_wohnen GEGNachweisWohnen [not null]
bedarfsausweise_gewerbe BedarfsausweisGewerbe [not null]
ErstellteTickets Tickets [not null]
BearbeiteteTickets Tickets [not null]
events Event [not null]
}
Table Bild {
id Int [pk, increment]
kategorie BilderKategorie [not null]
uid String [unique, not null]
aufnahme_id Int
aufnahme Aufnahme
}
Table Event {
id Int [pk, increment]
uid String [unique, not null]
date DateTime [default: `now()`, not null]
title String [not null]
description String
aufnahme_id Int [not null]
aufnahme Aufnahme [not null]
benutzer_id Int
benutzer benutzer
}
Table GEGEinpreisung {
id Int [pk, increment]
uid String [unique, not null]
empfaenger String
strasse String
plz String
ort String
zusatzzeile String
telefon String
email String
abweichende_versand_adresse Boolean [default: false]
versand_empfaenger String
versand_strasse String
versand_plz String
versand_ort String
versand_zusatzzeile String
status Einpreisungsstatus [not null]
geg_nachweis_wohnen GEGNachweisWohnen
geg_nachweis_gewerbe GEGNachweisGewerbe
bedarfsausweis_gewerbe BedarfsausweisGewerbe
benutzer_id Int [note: '@zod.describe("Die ID des Benutzers, der diese Einpreisung bekommt.")']
benutzer benutzer
}
Table GEGNachweisGewerbe {
id Int [pk, increment]
uid String [unique, not null]
ausstellgrund Ausstellgrund [note: '@zod.describe("Ausstellgrund wie z.B. Vermietung oder Verkauf")']
keller_beheizt Boolean [note: '@zod.describe("Falls der Keller des Gebäudes beheizt wird, sollte dieser Wert auf true stehen")']
storniert Boolean [default: false, note: '@zod.describe("Falls die Nachweisanfrage storniert wurde, sollte dieser Wert auf true stehen")']
bestellt Boolean [default: false, note: '@zod.describe("Falls der Nachweis bestellt wurde, sollte dieser Wert auf true stehen")']
zurueckgestellt Boolean [default: false, note: '@zod.describe("Falls der Nachweis vom Aussteller zurückgestellt wurde, sollte dieser Wert auf true stehen")']
beschreibung String [note: '@zod.describe("Beschreibung des Bauvorhabens")']
benutzer_id Int [note: '@zod.describe("Die ID des Benutzers, welchem dieser Ausweis gehört")']
benutzer benutzer
aufnahme_id Int [unique, not null]
aufnahme Aufnahme [not null]
rechnung_id Int [unique]
rechnung Rechnung
geg_einpreisung_id Int [unique]
geg_einpreisung GEGEinpreisung
}
Table GEGNachweisWohnen {
id Int [pk, increment]
uid String [unique, not null]
ausstellgrund Ausstellgrund [note: '@zod.describe("Ausstellgrund wie z.B. Vermietung oder Verkauf")']
keller_beheizt Boolean [note: '@zod.describe("Falls der Keller des Gebäudes beheizt wird, sollte dieser Wert auf true stehen")']
storniert Boolean [default: false, note: '@zod.describe("Falls die Nachweisanfrage storniert wurde, sollte dieser Wert auf true stehen")']
bestellt Boolean [default: false, note: '@zod.describe("Falls der Nachweis bestellt wurde, sollte dieser Wert auf true stehen")']
zurueckgestellt Boolean [default: false, note: '@zod.describe("Falls der Nachweis vom Aussteller zurückgestellt wurde, sollte dieser Wert auf true stehen")']
beschreibung String [note: '@zod.describe("Beschreibung des Bauvorhabens")']
benutzer_id Int [note: '@zod.describe("Die ID des Benutzers, welchem dieser Ausweis gehört")']
benutzer benutzer
aufnahme_id Int [unique, not null]
aufnahme Aufnahme [not null]
rechnung_id Int [unique]
rechnung Rechnung
geg_einpreisung_id Int [unique]
geg_einpreisung GEGEinpreisung
}
Table Klimafaktoren {
id Int [pk, increment]
plz String [not null]
month Int [not null]
year Int [not null]
klimafaktor Float [not null, default: 1]
indexes {
(plz, month, year) [unique]
}
}
Table Objekt {
id Int [pk, increment]
uid String [unique, not null]
benutzer_id Int
latitude Float
longitude Float
plz String [note: '@zod.describe("Postleitzahl des Gebäudes")']
ort String [note: '@zod.describe("Ort des Gebäudes")']
adresse String [note: '@zod.describe("Adresse (Straße und Hausnummer) des Gebäudes")']
erstellungsdatum DateTime [default: `now()`]
benutzer benutzer
aufnahmen Aufnahme [not null]
anteilshaber Anteilshaber [not null]
}
Table Postleitzahlen {
id Int [pk, increment]
plz String [not null]
stadt String [not null]
bundesland String [not null]
landkreis String [not null]
lat Float [not null]
lon Float [not null]
}
Table Rechnung {
id Int [pk, increment]
uid String [unique, not null]
benutzer_id Int [not null]
empfaenger String
strasse String
plz String
ort String
zusatzzeile String
telefon String
email String
abweichende_versand_adresse Boolean [default: false]
versand_empfaenger String
versand_strasse String
versand_plz String
versand_ort String
versand_zusatzzeile String
bezahlmethode Bezahlmethoden [not null]
status Rechnungsstatus [not null]
services Service[] [not null]
ausweistyp AusweisTyp [not null, default: 'Standard']
betrag Float [not null]
erstellt_am DateTime [default: `now()`, not null]
bezahlt_am DateTime
storniert_am DateTime
transaktions_referenz String [unique]
benutzer benutzer [not null]
verbrauchsausweis_wohnen VerbrauchsausweisWohnen
verbrauchsausweis_gewerbe VerbrauchsausweisGewerbe
bedarfsausweis_wohnen BedarfsausweisWohnen
bedarfsausweis_gewerbe BedarfsausweisGewerbe
geg_nachweis_gewerbe GEGNachweisGewerbe
geg_nachweis_wohnen GEGNachweisWohnen
}
Table RefreshTokens {
id Int [pk, increment]
benutzer_id Int [not null]
token String [unique, not null]
ip String [not null]
expiry DateTime [not null]
user benutzer [not null]
}
Table Tickets {
id Int [pk, increment]
uid String [unique, not null]
benutzer_id Int
created_at DateTime [default: `now()`, not null]
updated_at DateTime
deleted_at DateTime
status TicketStatus [not null, default: 'OFFEN']
titel String [not null]
beschreibung String [not null]
metadata Json
email String [not null]
bearbeiter_id Int
prioritaet Int [default: 0]
benutzer benutzer
bearbeiter benutzer
}
Table Unterlage {
id Int [pk, increment]
uid String [unique, not null]
name String
kategorie String
mime String
aufnahme_id Int
aufnahme Aufnahme
}
Table VerbrauchsausweisGewerbe {
id Int [pk, increment]
uid String [unique, not null]
benutzer_id Int
ausstellgrund Ausstellgrund
registriernummer String
zusaetzliche_heizquelle Boolean
brennstoff_1 String
einheit_1 String
brennstoff_2 String
einheit_2 String
startdatum DateTime
verbrauch_1 Int
verbrauch_2 Int
verbrauch_3 Int
verbrauch_4 Int
verbrauch_5 Int
verbrauch_6 Int
strom_1 Int
strom_2 Int
strom_3 Int
stromverbrauch_enthaelt_heizung Boolean
stromverbrauch_enthaelt_warmwasser Boolean
stromverbrauch_enthaelt_lueftung Boolean
stromverbrauch_enthaelt_beleuchtung Boolean
stromverbrauch_enthaelt_kuehlung Boolean
stromverbrauch_enthaelt_sonstige String
kuehlung_enthalten Boolean
anteil_kuehlung_1 Float
anteil_kuehlung_2 Float
keller_beheizt Boolean
alternative_heizung Boolean
alternative_warmwasser Boolean
alternative_lueftung Boolean
alternative_kuehlung Boolean
warmwasser_enthalten Boolean
warmwasser_anteil_bekannt Boolean [note: '@zod.describe("Falls der Warmwasser Anteil am Verbrauch bekannt ist, sollte dieser Wert auf true stehen")']
anteil_warmwasser_1 Float
anteil_warmwasser_2 Float
ausgestellt Boolean [default: false]
storniert Boolean [default: false, note: '@zod.describe("Falls der Ausweis storniert wurde, sollte dieser Wert auf true stehen")']
bestellt Boolean [default: false, note: '@zod.describe("Falls der Ausweis bestellt wurde, sollte dieser Wert auf true stehen")']
zurueckgestellt Boolean [default: false, note: '@zod.describe("Falls der Ausweis vom Aussteller zurückgestellt wurde, sollte dieser Wert auf true stehen")']
prueftext String [note: '@zod.describe("Durch den Kunden hinzugefügte Anmerkung zur Vorabprüfung")']
beschreibung String
kontrolldatei_angefragt Boolean [default: false, note: '@zod.describe("Ob bei der Anfrage der Registriernummer eine Kontrolldatei angefragt wurde")']
created_at DateTime [default: `now()`, not null]
updated_at DateTime [not null]
benutzer benutzer
rechnung_id Int [unique]
rechnung Rechnung
aufnahme_id Int [unique, not null, note: '@zod.describe("ID der korrespondierenden Gebäudeaufnahme")']
aufnahme Aufnahme [not null]
}
Table VerbrauchsausweisWohnen {
id Int [pk, increment]
uid String [unique, not null, note: '@zod.describe("UID des Ausweises")']
benutzer_id Int [note: '@zod.describe("Die ID des Benutzers, welchem dieser Ausweis gehört")']
ausstellgrund Ausstellgrund [note: '@zod.describe("Ausstellgrund wie z.B. Vermietung oder Verkauf")']
registriernummer String [note: '@zod.describe("Die Registriernummer des Ausweises")']
zusaetzliche_heizquelle Boolean [note: '@zod.describe("Falls eine sekundäre Heizquelle existiert, sollte dieser Wert auf true stehen")']
einheit_1 String [note: '@zod.describe("Einheit des Energieträgers der primären Heizquelle")']
einheit_2 String [note: '@zod.describe("Einheit des Energieträgers der sekundären Heizquelle")']
startdatum DateTime
verbrauch_1 Int [note: '@zod.describe("Energieverbrauch der primären Heizquelle im ersten der drei Verbrauchsjahre")']
verbrauch_2 Int [note: '@zod.describe("Energieverbrauch der primären Heizquelle im zweiten der drei Verbrauchsjahre")']
verbrauch_3 Int [note: '@zod.describe("Energieverbrauch der primären Heizquelle im letzten der drei Verbrauchsjahre")']
verbrauch_4 Int [note: '@zod.describe("Energieverbrauch der sekund̈́ären Heizquelle im ersten der drei Verbrauchsjahre")']
verbrauch_5 Int [note: '@zod.describe("Energieverbrauch der sekund̈́ären Heizquelle im zweiten der drei Verbrauchsjahre")']
verbrauch_6 Int [note: '@zod.describe("Energieverbrauch der sekund̈́ären Heizquelle im letzten der drei Verbrauchsjahre")']
warmwasser_enthalten Boolean [note: '@zod.describe("Falls Warmwasser im Verbrauchswert enthalten ist, sollte dieser Wert auf true stehen")']
warmwasser_anteil_bekannt Boolean [note: '@zod.describe("Falls der Warmwasser Anteil am Verbrauch bekannt ist, sollte dieser Wert auf true stehen")']
keller_beheizt Boolean [note: '@zod.describe("Falls der Keller des Gebäudes beheizt wird, sollte dieser Wert auf true stehen")']
faktorKeller Float [note: '@zod.describe("Der Faktor mit dem die Wohnfläche erhöht wird wenn die beheizte Gesamtfläche (energetische Nutzfläche) unbekannt ist.")']
alternative_heizung Boolean [note: '@zod.describe("Falls der Heizungsverbrauch alternative Energieversorgungssysteme beinhaltet, sollte dieser Wert auf true stehen.")']
alternative_warmwasser Boolean [note: '@zod.describe("Falls der Warmwasserverbrauch alternative Energieversorgungssysteme (z.B. Solarsystem, Wärmepumpe, etc.) beinhaltet, sollte dieser Wert auf true stehen.")']
alternative_lueftung Boolean [note: '@zod.describe("Falls die Lüftung alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen.")']
alternative_kuehlung Boolean [note: '@zod.describe("Falls die Kühlung alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen.")']
anteil_warmwasser_1 Float [note: '@zod.describe("Anteil des Warmwassers am Gesamtverbrauch der primären Energiequelle in Prozent")']
anteil_warmwasser_2 Float [note: '@zod.describe("Anteil des Warmwassers am Gesamtverbrauch der sekundären Energiequelle in Prozent")']
ausgestellt Boolean [default: false]
storniert Boolean [default: false, note: '@zod.describe("Falls der Ausweis storniert wurde, sollte dieser Wert auf true stehen")']
bestellt Boolean [default: false, note: '@zod.describe("Falls der Ausweis bestellt wurde, sollte dieser Wert auf true stehen")']
zurueckgestellt Boolean [default: false, note: '@zod.describe("Falls der Ausweis vom Aussteller zurückgestellt wurde, sollte dieser Wert auf true stehen")']
prueftext String [note: '@zod.describe("Durch den Kunden hinzugefügte Anmerkung zur Vorabprüfung")']
beschreibung String
kontrolldatei_angefragt Boolean [default: false, note: '@zod.describe("Ob bei der Anfrage der Registriernummer eine Kontrolldatei angefragt wurde")']
created_at DateTime [default: `now()`, not null]
updated_at DateTime [not null]
benutzer benutzer
rechnung_id Int [unique]
rechnung Rechnung
aufnahme_id Int [unique, not null, note: '@zod.describe("ID der korrespondierenden Gebäudeaufnahme")']
aufnahme Aufnahme [not null]
}
Table documenttemplates {
id Int [pk, increment]
name String [not null]
shortdescription String [not null]
longdescription String [not null]
user_id Int [not null]
is_private Boolean [not null, default: true]
documenttype Int [not null]
filename String [not null]
created_at DateTime [default: `now()`, not null]
updated_at DateTime [default: `now()`, not null]
benutzer benutzer [not null]
documenttypes documenttypes [not null]
}
Table documenttypes {
id Int [pk, increment]
name String [not null]
shortdescription String [not null]
longdescription String [not null]
documenttemplates documenttemplates [not null]
}
Table tokens {
id Int [pk, increment]
token String [not null]
user_id Int [not null]
date_created DateTime [default: `now()`, not null]
last_used DateTime [default: `now()`, not null]
times_used Int [not null, default: 0]
permissions Int [not null, default: 0]
benutzer benutzer [not null]
}
Enum Heizungsstatus {
BEHEIZT
UNBEHEIZT
NICHT_VORHANDEN
}
Enum Lueftungskonzept {
Fensterlueftung
Schachtlueftung
LueftungsanlageMitWaermerueckgewinnung
LueftungsanlageOhneWaermerueckgewinnung
}
Enum BenutzerRolle {
USER
ADMIN
}
Enum BilderKategorie {
Heizung
Fenster
Gebaeude
Daemmung
}
Enum Einpreisungsstatus {
open
canceled
pending
expired
}
Enum Bezahlmethoden {
paypal
giropay
sofort
creditcard
rechnung
}
Enum Rechnungsstatus {
open
canceled
pending
authorized
expired
failed
paid
}
Enum AusweisTyp {
Standard
Beratung
Offline
}
Enum TicketStatus {
OFFEN
IN_BEARBEITUNG
IN_WARTESCHLEIFE
GESCHLOSSEN
GELOEST
}
Enum UnterlagenKategorie {
Grundriss
Sonstiges
}
Enum Ausstellgrund {
Neubau
Vermietung
Verkauf
Modernisierung
Sonstiges
}
Enum Ausweisart {
VerbrauchsausweisWohnen
VerbrauchsausweisGewerbe
BedarfsausweisWohnen
BedarfsausweisGewerbe
GEGNachweisWohnen
GEGNachweisBedarfsausweis
GEGNachweisGewerbe
}
Enum Service {
Telefonberatung
Aushang
Qualitaetsdruck
SameDay
}
Ref: Anteilshaber.benutzer_id - benutzer.id [delete: No Action]
Ref: Anteilshaber.objekt_id > Objekt.id [delete: No Action]
Ref: ApiRequests.user_id > benutzer.id [delete: No Action]
Ref: Aufnahme.benutzer_id > benutzer.id [delete: No Action]
Ref: Aufnahme.objekt_id > Objekt.id [delete: No Action]
Ref: BedarfsausweisGewerbe.benutzer_id > benutzer.id [delete: No Action]
Ref: BedarfsausweisGewerbe.aufnahme_id > Aufnahme.id [delete: No Action]
Ref: BedarfsausweisGewerbe.rechnung_id - Rechnung.id [delete: No Action]
Ref: BedarfsausweisGewerbe.geg_einpreisung_id - GEGEinpreisung.id [delete: No Action]
Ref: BedarfsausweisWohnen.benutzer_id > benutzer.id [delete: No Action]
Ref: BedarfsausweisWohnen.rechnung_id - Rechnung.id [delete: No Action]
Ref: BedarfsausweisWohnen.aufnahme_id > Aufnahme.id [delete: No Action]
Ref: Bild.aufnahme_id > Aufnahme.id [delete: No Action]
Ref: Event.aufnahme_id > Aufnahme.id [delete: No Action]
Ref: Event.benutzer_id > benutzer.id [delete: No Action]
Ref: GEGEinpreisung.benutzer_id > benutzer.id [delete: No Action]
Ref: GEGNachweisGewerbe.benutzer_id > benutzer.id [delete: No Action]
Ref: GEGNachweisGewerbe.aufnahme_id > Aufnahme.id [delete: No Action]
Ref: GEGNachweisGewerbe.rechnung_id - Rechnung.id [delete: No Action]
Ref: GEGNachweisGewerbe.geg_einpreisung_id - GEGEinpreisung.id [delete: No Action]
Ref: GEGNachweisWohnen.benutzer_id > benutzer.id [delete: No Action]
Ref: GEGNachweisWohnen.aufnahme_id > Aufnahme.id [delete: No Action]
Ref: GEGNachweisWohnen.rechnung_id - Rechnung.id [delete: No Action]
Ref: GEGNachweisWohnen.geg_einpreisung_id - GEGEinpreisung.id [delete: No Action]
Ref: Objekt.benutzer_id > benutzer.id
Ref: Rechnung.benutzer_id > benutzer.id [delete: No Action]
Ref: RefreshTokens.benutzer_id > benutzer.id [delete: Cascade]
Ref: Tickets.benutzer_id > benutzer.id
Ref: Tickets.bearbeiter_id > benutzer.id
Ref: Unterlage.aufnahme_id > Aufnahme.id [delete: No Action]
Ref: VerbrauchsausweisGewerbe.benutzer_id > benutzer.id [delete: No Action]
Ref: VerbrauchsausweisGewerbe.rechnung_id - Rechnung.id [delete: No Action]
Ref: VerbrauchsausweisGewerbe.aufnahme_id > Aufnahme.id [delete: No Action]
Ref: VerbrauchsausweisWohnen.benutzer_id > benutzer.id [delete: No Action]
Ref: VerbrauchsausweisWohnen.rechnung_id - Rechnung.id [delete: No Action]
Ref: VerbrauchsausweisWohnen.aufnahme_id > Aufnahme.id [delete: No Action]
Ref: documenttemplates.user_id > benutzer.id [delete: Cascade]
Ref: documenttemplates.documenttype > documenttypes.id [delete: Cascade]
Ref: tokens.user_id > benutzer.id [delete: No Action]

View File

@@ -0,0 +1,47 @@
-- AlterTable
ALTER TABLE "Anteilshaber" ALTER COLUMN "uid" SET DEFAULT 'ant-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Aufnahme" ALTER COLUMN "uid" SET DEFAULT 'auf-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "BedarfsausweisGewerbe" ALTER COLUMN "uid" SET DEFAULT 'bag-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "BedarfsausweisWohnen" ALTER COLUMN "uid" SET DEFAULT 'baw-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Bild" ALTER COLUMN "uid" SET DEFAULT 'img-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Event" ALTER COLUMN "uid" SET DEFAULT 'evt-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "GEGEinpreisung" ALTER COLUMN "uid" SET DEFAULT 'gge-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "GEGNachweisGewerbe" ALTER COLUMN "uid" SET DEFAULT 'gng-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "GEGNachweisWohnen" ALTER COLUMN "uid" SET DEFAULT 'gnw-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Objekt" ALTER COLUMN "uid" SET DEFAULT 'obj-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Rechnung" ALTER COLUMN "uid" SET DEFAULT 'inv-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Tickets" ALTER COLUMN "uid" SET DEFAULT 'tkt-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Unterlage" ALTER COLUMN "uid" SET DEFAULT 'pln-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "VerbrauchsausweisGewerbe" ALTER COLUMN "uid" SET DEFAULT 'vag-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "VerbrauchsausweisWohnen" ALTER COLUMN "uid" SET DEFAULT 'vaw-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "benutzer" ALTER COLUMN "uid" SET DEFAULT 'usr-' || gen_random_uuid();

View File

@@ -0,0 +1,47 @@
-- AlterTable
ALTER TABLE "Anteilshaber" ALTER COLUMN "uid" SET DEFAULT 'ant-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Aufnahme" ALTER COLUMN "uid" SET DEFAULT 'auf-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "BedarfsausweisGewerbe" ALTER COLUMN "uid" SET DEFAULT 'bag-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "BedarfsausweisWohnen" ALTER COLUMN "uid" SET DEFAULT 'baw-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Bild" ALTER COLUMN "uid" SET DEFAULT 'img-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Event" ALTER COLUMN "uid" SET DEFAULT 'evt-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "GEGEinpreisung" ALTER COLUMN "uid" SET DEFAULT 'gge-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "GEGNachweisGewerbe" ALTER COLUMN "uid" SET DEFAULT 'gnw-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "GEGNachweisWohnen" ALTER COLUMN "uid" SET DEFAULT 'gnw-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Objekt" ALTER COLUMN "uid" SET DEFAULT 'obj-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Rechnung" ALTER COLUMN "uid" SET DEFAULT 'inv-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Tickets" ALTER COLUMN "uid" SET DEFAULT 'tkt-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Unterlage" ALTER COLUMN "uid" SET DEFAULT 'pln-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "VerbrauchsausweisGewerbe" ALTER COLUMN "uid" SET DEFAULT 'vag-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "VerbrauchsausweisWohnen" ALTER COLUMN "uid" SET DEFAULT 'vaw-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "benutzer" ALTER COLUMN "uid" SET DEFAULT 'usr-' || gen_random_uuid();

View File

@@ -0,0 +1,66 @@
-- AlterEnum
ALTER TYPE "BilderKategorie" ADD VALUE 'AnlagenTechnik';
-- AlterTable
ALTER TABLE "Anteilshaber" ALTER COLUMN "uid" SET DEFAULT 'ant-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Aufnahme" ALTER COLUMN "uid" SET DEFAULT 'auf-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "BedarfsausweisGewerbe" ADD COLUMN "abluftanlage" BOOLEAN DEFAULT false,
ADD COLUMN "ausstellgrund" "Ausstellgrund",
ADD COLUMN "bauteilaktivierung" BOOLEAN DEFAULT false,
ADD COLUMN "bestellt" BOOLEAN DEFAULT false,
ADD COLUMN "direktheizung" BOOLEAN DEFAULT false,
ADD COLUMN "dunkelstrahler" BOOLEAN DEFAULT false,
ADD COLUMN "fussbodenheizung" BOOLEAN DEFAULT false,
ADD COLUMN "hallenheizung" BOOLEAN DEFAULT false,
ADD COLUMN "infrarotstrahler" BOOLEAN DEFAULT false,
ADD COLUMN "keller_beheizt" BOOLEAN,
ADD COLUMN "klimatisierung" BOOLEAN DEFAULT false,
ADD COLUMN "konditionierung_der_zuluft" BOOLEAN DEFAULT false,
ADD COLUMN "luftheizung" BOOLEAN DEFAULT false,
ADD COLUMN "storniert" BOOLEAN DEFAULT false,
ADD COLUMN "zu_abluftanlage" BOOLEAN DEFAULT false,
ADD COLUMN "zurueckgestellt" BOOLEAN DEFAULT false,
ALTER COLUMN "uid" SET DEFAULT 'bag-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "BedarfsausweisWohnen" ALTER COLUMN "uid" SET DEFAULT 'baw-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Bild" ALTER COLUMN "uid" SET DEFAULT 'img-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Event" ALTER COLUMN "uid" SET DEFAULT 'evt-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "GEGEinpreisung" ALTER COLUMN "uid" SET DEFAULT 'gge-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "GEGNachweisGewerbe" ALTER COLUMN "uid" SET DEFAULT 'gng-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "GEGNachweisWohnen" ALTER COLUMN "uid" SET DEFAULT 'gnw-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Objekt" ALTER COLUMN "uid" SET DEFAULT 'obj-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Rechnung" ALTER COLUMN "uid" SET DEFAULT 'inv-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Tickets" ALTER COLUMN "uid" SET DEFAULT 'tkt-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Unterlage" ALTER COLUMN "uid" SET DEFAULT 'pln-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "VerbrauchsausweisGewerbe" ALTER COLUMN "uid" SET DEFAULT 'vag-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "VerbrauchsausweisWohnen" ALTER COLUMN "uid" SET DEFAULT 'vaw-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "benutzer" ALTER COLUMN "uid" SET DEFAULT 'usr-' || gen_random_uuid();

View File

@@ -0,0 +1,62 @@
/*
Warnings:
- The values [GEGNachweisBedarfsausweis] on the enum `Ausweisart` will be removed. If these variants are still used in the database, this will fail.
*/
-- AlterEnum
BEGIN;
CREATE TYPE "Ausweisart_new" AS ENUM ('VerbrauchsausweisWohnen', 'VerbrauchsausweisGewerbe', 'BedarfsausweisWohnen', 'BedarfsausweisGewerbe', 'GEGNachweisWohnen', 'GEGNachweisGewerbe');
ALTER TABLE "Aufnahme" ALTER COLUMN "ausweisart" TYPE "Ausweisart_new" USING ("ausweisart"::text::"Ausweisart_new");
ALTER TYPE "Ausweisart" RENAME TO "Ausweisart_old";
ALTER TYPE "Ausweisart_new" RENAME TO "Ausweisart";
DROP TYPE "Ausweisart_old";
COMMIT;
-- AlterTable
ALTER TABLE "Anteilshaber" ALTER COLUMN "uid" SET DEFAULT 'ant-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Aufnahme" ALTER COLUMN "uid" SET DEFAULT 'auf-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "BedarfsausweisGewerbe" ALTER COLUMN "uid" SET DEFAULT 'bag-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "BedarfsausweisWohnen" ALTER COLUMN "uid" SET DEFAULT 'baw-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Bild" ALTER COLUMN "uid" SET DEFAULT 'img-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Event" ALTER COLUMN "uid" SET DEFAULT 'evt-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "GEGEinpreisung" ALTER COLUMN "uid" SET DEFAULT 'gge-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "GEGNachweisGewerbe" ALTER COLUMN "uid" SET DEFAULT 'gng-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "GEGNachweisWohnen" ALTER COLUMN "uid" SET DEFAULT 'gnw-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Objekt" ALTER COLUMN "uid" SET DEFAULT 'obj-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Rechnung" ALTER COLUMN "uid" SET DEFAULT 'inv-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Tickets" ALTER COLUMN "uid" SET DEFAULT 'tkt-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "Unterlage" ALTER COLUMN "uid" SET DEFAULT 'pln-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "VerbrauchsausweisGewerbe" ALTER COLUMN "uid" SET DEFAULT 'vag-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "VerbrauchsausweisWohnen" ALTER COLUMN "uid" SET DEFAULT 'vaw-' || gen_random_uuid();
-- AlterTable
ALTER TABLE "benutzer" ALTER COLUMN "uid" SET DEFAULT 'usr-' || gen_random_uuid();

View File

@@ -2,6 +2,30 @@ model BedarfsausweisGewerbe {
id Int @id @default(autoincrement())
uid String @unique @default(dbgenerated("'bag-' || gen_random_uuid()"))
/// @zod.describe("Ausstellgrund wie z.B. Vermietung oder Verkauf")
ausstellgrund Ausstellgrund?
/// @zod.describe("Falls der Keller des Gebäudes beheizt wird, sollte dieser Wert auf true stehen")
keller_beheizt Boolean?
/// @zod.describe("Falls die Nachweisanfrage storniert wurde, sollte dieser Wert auf true stehen")
storniert Boolean? @default(false)
/// @zod.describe("Falls der Nachweis bestellt wurde, sollte dieser Wert auf true stehen")
bestellt Boolean? @default(false)
/// @zod.describe("Falls der Nachweis vom Aussteller zurückgestellt wurde, sollte dieser Wert auf true stehen")
zurueckgestellt Boolean? @default(false)
abluftanlage Boolean? @default(false)
zu_abluftanlage Boolean? @default(false)
konditionierung_der_zuluft Boolean? @default(false)
luftheizung Boolean? @default(false)
hallenheizung Boolean? @default(false)
dunkelstrahler Boolean? @default(false)
direktheizung Boolean? @default(false)
infrarotstrahler Boolean? @default(false)
fussbodenheizung Boolean? @default(false)
bauteilaktivierung Boolean? @default(false)
klimatisierung Boolean? @default(false)
/// @zod.describe("Die ID des Benutzers, welchem dieser Ausweis gehört")
benutzer_id Int?
benutzer Benutzer? @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
@@ -10,7 +34,6 @@ model BedarfsausweisGewerbe {
rechnung_id Int? @unique
rechnung Rechnung? @relation(fields: [rechnung_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
geg_einpreisung_id Int? @unique
geg_einpreisung GEGEinpreisung? @relation(fields: [geg_einpreisung_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
}

View File

@@ -4,6 +4,7 @@ enum BilderKategorie {
Fenster
Gebaeude
Daemmung
AnlagenTechnik
}
model Bild {

View File

@@ -1,6 +1,6 @@
model GEGNachweisGewerbe {
id Int @id @default(autoincrement())
uid String @unique @default(dbgenerated("'gnw-' || gen_random_uuid()"))
uid String @unique @default(dbgenerated("'gng-' || gen_random_uuid()"))
/// @zod.describe("Ausstellgrund wie z.B. Vermietung oder Verkauf")
ausstellgrund Ausstellgrund?

View File

@@ -53,7 +53,6 @@ enum Ausweisart {
BedarfsausweisWohnen
BedarfsausweisGewerbe
GEGNachweisWohnen
GEGNachweisBedarfsausweis
GEGNachweisGewerbe
}

View File

@@ -5,7 +5,6 @@ export const createCaller = createCallerFactory({
"klimafaktoren": await import("../src/pages/api/klimafaktoren.ts"),
"postleitzahlen": await import("../src/pages/api/postleitzahlen.ts"),
"unterlage": await import("../src/pages/api/unterlage.ts"),
"aufnahme": await import("../src/pages/api/aufnahme/index.ts"),
"admin/ausstellen": await import("../src/pages/api/admin/ausstellen.ts"),
"admin/bestellbestaetigung": await import("../src/pages/api/admin/bestellbestaetigung.ts"),
"admin/erinnern": await import("../src/pages/api/admin/erinnern.ts"),
@@ -14,9 +13,12 @@ export const createCaller = createCallerFactory({
"admin/registriernummer": await import("../src/pages/api/admin/registriernummer.ts"),
"admin/stornieren": await import("../src/pages/api/admin/stornieren.ts"),
"ausweise": await import("../src/pages/api/ausweise/index.ts"),
"aufnahme": await import("../src/pages/api/aufnahme/index.ts"),
"auth/access-token": await import("../src/pages/api/auth/access-token.ts"),
"auth/passwort-vergessen": await import("../src/pages/api/auth/passwort-vergessen.ts"),
"auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"),
"bedarfsausweis-gewerbe/[uid]": await import("../src/pages/api/bedarfsausweis-gewerbe/[uid].ts"),
"bedarfsausweis-gewerbe": await import("../src/pages/api/bedarfsausweis-gewerbe/index.ts"),
"bedarfsausweis-wohnen/[uid]": await import("../src/pages/api/bedarfsausweis-wohnen/[uid].ts"),
"bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"),
"bilder/[uid]": await import("../src/pages/api/bilder/[uid].ts"),
@@ -29,10 +31,10 @@ export const createCaller = createCallerFactory({
"rechnung/anfordern": await import("../src/pages/api/rechnung/anfordern.ts"),
"rechnung": await import("../src/pages/api/rechnung/index.ts"),
"ticket": await import("../src/pages/api/ticket/index.ts"),
"user": await import("../src/pages/api/user/index.ts"),
"user/self": await import("../src/pages/api/user/self.ts"),
"verbrauchsausweis-gewerbe/[uid]": await import("../src/pages/api/verbrauchsausweis-gewerbe/[uid].ts"),
"verbrauchsausweis-gewerbe": await import("../src/pages/api/verbrauchsausweis-gewerbe/index.ts"),
"user": await import("../src/pages/api/user/index.ts"),
"user/self": await import("../src/pages/api/user/self.ts"),
"verbrauchsausweis-wohnen/[uid]": await import("../src/pages/api/verbrauchsausweis-wohnen/[uid].ts"),
"verbrauchsausweis-wohnen": await import("../src/pages/api/verbrauchsausweis-wohnen/index.ts"),
"webhooks/mollie": await import("../src/pages/api/webhooks/mollie.ts"),

View File

@@ -59,8 +59,3 @@ export function getZodBaseType(schema: ZodType<any>): ZodType<any> {
}
return schema;
}
export const sqids = new Sqids({
alphabet: "0123456789abcdefghijklmnopqrstuvw",
minLength: 8
})

View File

@@ -16,7 +16,11 @@ export async function nachweisSpeichern(
) {
if (objekt.uid) {
await api.objekt._uid.PATCH.fetch({
...exclude(objekt, ["uid"])
adresse: objekt.adresse,
latitude: 0,
longitude: 0,
ort: objekt.ort,
plz: objekt.plz
}, {
params: {
uid: objekt.uid
@@ -27,7 +31,11 @@ export async function nachweisSpeichern(
})
} else {
const { uid } = await api.objekt.PUT.fetch({
...exclude(objekt, ["uid"])
adresse: objekt.adresse,
latitude: 0,
longitude: 0,
ort: objekt.ort,
plz: objekt.plz
}, {
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
@@ -41,10 +49,58 @@ export async function nachweisSpeichern(
if (aufnahme.uid) {
await api.aufnahme._uid.PATCH.fetch({
...exclude(aufnahme, ["uid"]),
baujahr_gebaeude: aufnahme.baujahr_gebaeude || [],
baujahr_klima: aufnahme.baujahr_klima || [],
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,
ausweisart: aufnahme.ausweisart,
brennstoff_1: aufnahme.brennstoff_1,
brennstoff_2: aufnahme.brennstoff_2,
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,
energieeffizienzklasse: aufnahme.energieeffizienzklasse,
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: {
uid: aufnahme.uid
@@ -55,7 +111,61 @@ export async function nachweisSpeichern(
})
} else {
const { uid } = await api.aufnahme.PUT.fetch({
aufnahme,
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,
ausweisart: aufnahme.ausweisart,
baujahr_klima: aufnahme.baujahr_klima,
brennstoff_1: aufnahme.brennstoff_1,
brennstoff_2: aufnahme.brennstoff_2,
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,
energieeffizienzklasse: aufnahme.energieeffizienzklasse,
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
},
uid_objekt: objekt.uid
}, {
headers: {
@@ -74,6 +184,9 @@ export async function nachweisSpeichern(
} else if (ausweisart === Enums.Ausweisart.GEGNachweisGewerbe) {
patchRoute = api["geg-nachweis-gewerbe"]._uid.PATCH
putRoute = api["geg-nachweis-gewerbe"].PUT
} else if (ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe) {
patchRoute = api["bedarfsausweis-gewerbe"]._uid.PATCH
putRoute = api["bedarfsausweis-gewerbe"].PUT
}
if (nachweis.uid) {
@@ -114,25 +227,4 @@ export async function nachweisSpeichern(
uid_aufnahme: aufnahme.uid,
uid_objekt: objekt.uid
}
// await client.v1.tickets.erstellen.mutate({
// titel: "Ausweis konnte nicht gespeichert werden",
// beschreibung: e.stack,
// email: user.email ?? "",
// metadata: JSON.stringify({
// ausweis,
// }),
// });
// addNotification({
// dismissable: false,
// message:
// "Ausweis konnte nicht gespeichert werden, bitte versuchen sie es erneut.",
// subtext:
// "Sollte das Problem weiterhin bestehen, kontaktieren sie bitte den Support.",
// timeout: 6000,
// type: "error",
// });
return null;
}

View File

@@ -0,0 +1,110 @@
<script lang="ts">
import {
AufnahmeClient,
ObjektClient,
UploadedGebaeudeBild,
} from "./types.js";
import SanierungsOption from "#components/Ausweis/SanierungsOption.svelte";
import AnlagenTechnikImage from "./AnlagenTechnikImage.svelte";
import { BedarfsausweisGewerbe } from "#lib/client/prisma.js";
export let objekt: ObjektClient;
export let aufnahme: AufnahmeClient;
export let ausweis: BedarfsausweisGewerbe;
export let images: UploadedGebaeudeBild[];
</script>
<div
id="sanierungszustand"
class="bereich-box grid
grid-cols-1 gap-x-4 gap-y-2
sm:grid-cols-1 sm:gap-x-6 sm:gap-y-1
md:grid-cols-2 md:gap-x-6 md:gap-y-8
xl:grid-cols-2 xl:gap-x-8 xl:gap-y-8
2xl:grid-cols-3 2xl:gap-x-8 2xl:gap-y-2
"
>
<SanierungsOption
label="Abluftanlage"
name="abluftanlage"
help=""
value="AWD"
bind:checked={ausweis.abluftanlage}
></SanierungsOption>
<SanierungsOption
label="Zu- und Abluftanlage"
name="zu_abluftanlage"
help=""
value="KWD"
bind:checked={ausweis.zu_abluftanlage}
></SanierungsOption>
<SanierungsOption
label="Konditionierung der Zuluft"
name="konditionierung_der_zuluft"
help=""
value="KDD"
bind:checked={ausweis.konditionierung_der_zuluft}
></SanierungsOption>
<SanierungsOption
label="Luftheizung"
name="luftheizung"
help=""
value="DGD"
bind:checked={ausweis.luftheizung}
></SanierungsOption>
<SanierungsOption
label="Hallenheizung"
name="hallenheizung"
help=""
value="DGD"
bind:checked={ausweis.hallenheizung}
></SanierungsOption>
<SanierungsOption
label="Dunkelstrahler"
name="dunkelstrahler"
help=""
value="DGD"
bind:checked={ausweis.dunkelstrahler}
></SanierungsOption>
<SanierungsOption
label="Direktheizung"
name="direktheizung"
help=""
value="DGD"
bind:checked={ausweis.direktheizung}
></SanierungsOption>
<SanierungsOption
label="Infrarotstrahler"
name="infrarotstrahler"
help=""
value="DGD"
bind:checked={ausweis.infrarotstrahler}
></SanierungsOption>
<SanierungsOption
label="Fußbodenheizung"
name="fussbodenheizung"
help=""
value="DGD"
bind:checked={ausweis.fussbodenheizung}
></SanierungsOption>
<SanierungsOption
label="Bauteilaktivierung"
name="bauteilaktivierung"
help=""
value="DGD"
bind:checked={ausweis.bauteilaktivierung}
></SanierungsOption>
<SanierungsOption
label="Klimatisierung"
name="klimatisierung"
help=""
value="DGD"
bind:checked={ausweis.klimatisierung}
></SanierungsOption>
</div>
<AnlagenTechnikImage bind:images bind:ausweis bind:objekt />
<style lang="postcss">
</style>

View File

@@ -0,0 +1,39 @@
<script lang="ts">
import ImageGrid from "../ImageGrid.svelte";;
import { BedarfsausweisGewerbe, Enums } from "#lib/client/prisma.js";
import { BildClient, ObjektClient } from "./types.js";
export let images: BildClient[] = [];
export let ausweis: BedarfsausweisGewerbe;
export let objekt: ObjektClient;
</script>
<div class="grid grid-cols-1 lg:grid-cols-2 gap-x-6 mt-6 p-2 sm:px-0">
<div class="md:box md:card mb-0 bereich-box">
<div class="font-bold mb-2">
<span class="text-red-500">WICHTIG:</span>
Bild Upload - Anlagentechnik
</div>
</div>
<div class="md:box md:card mb-0 mt-6 md:mt-0">
<div>
Diese Bilder erscheinen <span class="text-red-500">nicht</span> auf Ihrem
Energieausweis!<br />
</div>
<ImageGrid
max={4}
min={0}
name={"anlagen_technik_image"}
kategorie={Enums.BilderKategorie.AnlagenTechnik}
bind:images
bind:ausweis
bind:objekt
>
TEXT FEHLT
</ImageGrid>
</div>
</div>

View File

@@ -24,6 +24,8 @@
export let aufnahme: AufnahmeClient;
export let ausweisart: Enums.Ausweisart;
export let ausstellgrund: string[] = Object.values(Enums.Ausstellgrund);
</script>
<div id="ausweisart" class="bereich-box grid
@@ -47,8 +49,8 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
data-cy="ausstellgrund"
>
<option disabled selected value={null}>Bitte auswählen</option>
{#each Object.entries(Enums.Ausstellgrund) as [name, ausstellgrund]}
<option value={ausstellgrund}>{name}</option>
{#each ausstellgrund as name}
<option value={name}>{name}</option>
{/each}
</select>

View File

@@ -69,8 +69,8 @@
loginOverlayHidden = true
let result: Awaited<ReturnType<typeof ausweisSpeichern>> | null = null;
if (ausweisart === Enums.Ausweisart.GEGNachweisWohnen || ausweisart === Enums.Ausweisart.GEGNachweisGewerbe || ausweisart === Enums.Ausweisart.GEGNachweisBedarfsausweis) {
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, objekt, aufnahme, bilder, unterlagen, ausweisart)
} else {
result = await ausweisSpeichern(ausweis, objekt, aufnahme, bilder, ausweisart)

View File

@@ -1,6 +1,6 @@
<script lang="ts">
import ImageGrid from "../ImageGrid.svelte";;
import { Enums } from "#lib/client/prisma";
import { Enums } from "#lib/client/prisma.js";
import { BedarfsausweisWohnenClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "./types.js";
export let images: UploadedGebaeudeBild[] = [];

View File

@@ -13,8 +13,9 @@
import { api } from "astro-typesafe-api/client";
import Cookies from "js-cookie";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
import { Enums, Objekt } from "#lib/client/prisma.js";
import { AusweisTyp, Enums, Objekt } from "#lib/client/prisma.js";
import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.js";
import { shortenUID } from "#server/lib/hash.js";
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
export let aufnahme: AufnahmeKomplettClient;
@@ -24,6 +25,8 @@
const ausweisart = getAusweisartFromUUID(ausweis.uid);
const id = shortenUID(ausweis.uid)
async function ausweisStornieren() {
const result = await dialogs.confirm({
title: "Ausweis Stornieren",
@@ -89,7 +92,7 @@
</script>
<div class="relative bg-base-200 border border-base-300 rounded-lg p-4">
<div class="relative bg-base-200 border border-base-300 rounded-lg p-4 mr-4">
{#if ausweis.storniert}
<div
class="absolute top-0 left-0 w-full h-full bg-[rgba(0,0,0,0.7)] z-[5] rounded-lg select-none"
@@ -128,24 +131,28 @@
</ul>
</div>
<div class="flex flex-row flex-wrap items-center gap-2">
<div class="text-lg font-semibold">
{#if ausweisart == Enums.Ausweisart.VerbrauchsausweisWohnen}
<div class="text-lg font-semibold">
Verbrauchsausweis Wohnen
</div>
{:else if ausweisart == Enums.Ausweisart.BedarfsausweisWohnen}
<div class="text-lg font-semibold">
Bedarfsausweis Wohnen
</div>
{:else if ausweisart == Enums.Ausweisart.VerbrauchsausweisGewerbe}
<div class="text-lg font-semibold">
Verbrauchsausweis Gewerbe
</div>
{/if}
{#if rechnung.ausweistyp === Enums.AusweisTyp.Beratung}
(Beratung)
{:else if rechnung.ausweistyp === Enums.AusweisTyp.Offline}
(Offline)
{/if}
</div>
{#if ausweis.ausgestellt}
<span class="bg-green-600 px-2 py-0.5 text-sm font-semibold rounded-lg text-white">Ausgestellt</span>
{:else if ausweis.bestellt}
<span class="bg-yellow-600 px-2 py-0.5 text-sm font-semibold rounded-lg text-white">Bestellt</span>
<span class="bg-primary px-2 py-0.5 text-sm font-semibold rounded-lg text-white">Bestellt</span>
{:else}
<span class="bg-red-600 px-2 py-0.5 text-sm font-semibold rounded-lg text-white">Gespeichert</span>
{/if}
</div>
<div class="badge badge-accent font-semibold text-black text-m">{objekt.adresse}</div>
@@ -202,7 +209,7 @@
<div class="flex flex-row justify-between">
<span>ID</span>
<span class="font-bold text-base-content"
>{ausweis.uid}</span
>{id}</span
>
</div>
</div>

View File

@@ -59,7 +59,7 @@
<div class="text-lg font-semibold">
GEG Nachweis Gewerbe
</div>
{:else if ausweisart == Enums.Ausweisart.GEGNachweisBedarfsausweis}
{:else if ausweisart == Enums.Ausweisart.BedarfsausweisGewerbe}
<div class="text-lg font-semibold">
Bedarfsausweis Gewerbe
</div>

View File

@@ -79,7 +79,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<option value="Atrium-Bungalow">Atrium-Bungalow</option>
<option value="Winkelbungalow">Winkelbungalow</option>
{:else if ausweisart==Enums.Ausweisart.VerbrauchsausweisGewerbe}
{:else if ausweisart==Enums.Ausweisart.VerbrauchsausweisGewerbe || ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe}
<option value="Verwaltungsgebäude (allgemein)">Verwaltungsgebäude (allgemein)</option>
<option value="Parlaments- und Gerichtsgebäude">Parlaments- und Gerichtsgebäude</option>
<option value="Ministerien u. Ämter u. Behörden">Ministerien u. Ämter u. Behörden</option>

View File

@@ -0,0 +1,134 @@
import fuelList from "#components/Ausweis/brennstoffListe.js";
import { faker } from "@faker-js/faker";
import { Enums } from "#lib/client/prisma.js";
import "cypress-file-upload"
import moment from "moment";
describe("Verbrauchsausweis erstellen Schritt 1", () => {
it("erstellt einen neuen Verbrauchsausweis Wohngebäude.", () => {
cy.visit("/angebot-anfragen/geg-nachweis-gewerbe-anfragen");
cy.wait(2000);
// Wir überprüfen, ob alle Ausstelgründe vorhanden sind, diese sollten genau so viele sein wie in der Datenbank vorhanden sind.
cy.get("select[data-cy='ausstellgrund']")
.select(
faker.number.int({
min: 1,
max: [Enums.Ausstellgrund.Modernisierung, Enums.Ausstellgrund.Neubau].length - 1,
})
)
// Gebäudetyp
cy.get("select[name='gebaeudetyp']").then(($dropdown) => {
const options = $dropdown.find('option');
// Select the option at the random index
cy.get("select[name='gebaeudetyp']").select(options.eq(faker.number.int({ min: 1, max: options.length - 1 })).val() as string);
});
// Sanierungsstatus
cy.get("select[name='saniert']").select(
Math.random() > 0.5 ? "true" : "false"
);
// Jetzt Füllen wir das Baujahr vom Gebäude aus.
cy.get("input[name='baujahr_gebaeude']")
.should("have.attr", "type", "number")
.type(
faker.number.int({ min: 1900, max: 2021 }).toString() +
"{enter}",
{ delay: 50 }
);
// Jetzt Füllen wir das Baujahr der Heizung aus.
cy.get("input[name='baujahr_heizung']")
.should("have.attr", "type", "number")
.type(
faker.number.int({ min: 1900, max: 2021 }).toString() +
"{enter}",
{ delay: 50 }
);
// Adresse
cy.get("input[name='adresse']").type(faker.location.streetAddress());
// Postleitzahl
cy.get("input[name='plz']").type(
faker.location.zipCode({
format: "#####",
})
);
// TODO: Ort - Dieser wird aus der Datenbank abgefragt, wir müssen also warten, bis der Dropdown da ist.
cy.get("[data-cy='plz-container']").find("button").first().click()
// Nutzflaeche
cy.get("input[name='nutzflaeche']")
.should("have.attr", "type", "number")
.type(faker.number.int({ min: 50, max: 1000 }).toString());
// Keller
cy.get("select[name='keller']").find("option:not([disabled])").should("have.length", (["BEHEIZT", "NICHT_VORHANDEN", "UNBEHEIZT"] as Enums.Heizungsstatus[]).length).parent().select(faker.number.int({
max: Object.values(Enums.Heizungsstatus).length,
min: 1
}));
// Dachgeschoss
cy.get("select[name='dachgeschoss']").find("option:not([disabled])").should("have.length", (["BEHEIZT", "NICHT_VORHANDEN", "UNBEHEIZT"] as Enums.Heizungsstatus[]).length).parent().select(faker.number.int({
max: Object.values(Enums.Heizungsstatus).length,
min: 1
}));
cy.get("[data-cy='beschreibung']").type(faker.lorem.paragraphs({ min: 2, max: 10 }))
// Wärmedämmung Bilder
cy.get("input[type='file'][name='plaene']").should("have.attr", "type", "file").attachFile("images/daemmung/1.jpeg", { subjectType: "input" }).attachFile("images/daemmung/2.jpeg", { subjectType: "input" });
cy.get("input[type='file'][name='unterlagen']").should("have.attr", "type", "file").attachFile("images/gebaeude/1.jpeg", { subjectType: "input" }).attachFile("images/daemmung/2.jpeg", { subjectType: "input" });
// Jetzt können wir den Verbrauchsausweis erstellen.
cy.get("form[data-cy='nachweis'] button[data-cy='weiter']").click({ force: true });
cy.url().should("contain", "/kundendaten");
const email = faker.internet.email();
const passwort = "test1234";
const vorname = faker.person.firstName();
const nachname = faker.person.lastName();
const telefon = faker.phone.number()
const strasse = faker.location.streetAddress({ useFullAddress: true })
const plz = faker.location.zipCode("#####")
cy.get("input[name='vorname']").should("have.attr", "type", "text").type(vorname);
cy.get("input[name='name']").should("have.attr", "type", "text").type(nachname);
cy.get("input[name='telefon']").should("have.attr", "type", "text").type(telefon);
// Rechnung
cy.get("input[name='rechnung_empfaenger']").should("have.attr", "type", "text").type(`${vorname} ${nachname}`);
cy.get("input[name='rechnung_strasse']").should("have.attr", "type", "text").type(strasse);
cy.get("input[name='rechnung_plz']").should("have.attr", "type", "text").type(plz);
cy.get("[data-cy='plz-container']").children().first().click()
cy.get("input[name='rechnung_email']").should("have.attr", "type", "email").type(email);
cy.get("button[data-cy='bestellen']").click();
cy.get("a[data-cy='registrieren']").should("be.visible").click();
// Wir sind jetzt registriert und können uns nun einloggen.
// Die Email sollte automatisch eingetragen sein, da wir uns gerade registriert haben.
cy.get("form[name='signup'] input[name='vorname']").should("be.visible").should("have.attr", "type", "text").type(vorname);
cy.get("form[name='signup'] input[name='nachname']").should("be.visible").should("have.attr", "type", "text").type(nachname);
cy.get("form[name='signup'] input[name='email']").should("be.visible").should("have.attr", "type", "email").should("contain.value", email);
cy.get("form[name='signup'] input[name='passwort']").should("be.visible").should("have.attr", "type", "password").type(passwort);
cy.get("form[name='signup'] button[type='submit']").click();
cy.get("form[name='login'] button[type='submit']").click();
cy.origin('https://www.mollie.com', () => {
// Jetzt sind wir auf der Mollie Seite, dort wählen wir den "paid" status aus
cy.get("input[type='radio'][name='final_state'][value='paid']").check();
// Da wird unser Test fehlschlagen, da die localhost domain von Mollie aus nicht erreichbar ist.
})
});
});

View File

@@ -0,0 +1,125 @@
import fuelList from "#components/Ausweis/brennstoffListe.js";
import { faker } from "@faker-js/faker";
import { Enums } from "#lib/client/prisma.js";
import "cypress-file-upload"
import moment from "moment";
describe("Verbrauchsausweis erstellen Schritt 1", () => {
it("erstellt einen neuen Verbrauchsausweis Wohngebäude.", () => {
cy.visit("/angebot-anfragen/geg-nachweis-wohnen-anfragen");
cy.wait(2000);
// Wir überprüfen, ob alle Ausstelgründe vorhanden sind, diese sollten genau so viele sein wie in der Datenbank vorhanden sind.
cy.get("select[data-cy='ausstellgrund']")
.select(
faker.number.int({
min: 1,
max: [Enums.Ausstellgrund.Modernisierung, Enums.Ausstellgrund.Neubau].length - 1,
})
)
// Gebäudetyp
cy.get("select[name='gebaeudetyp']").then(($dropdown) => {
const options = $dropdown.find('option');
// Select the option at the random index
cy.get("select[name='gebaeudetyp']").select(options.eq(faker.number.int({ min: 1, max: options.length - 1 })).val() as string);
});
// Jetzt Füllen wir das Baujahr vom Gebäude aus.
cy.get("input[name='baujahr_gebaeude']")
.should("have.attr", "type", "number")
.type(
faker.number.int({ min: 1900, max: 2021 }).toString() +
"{enter}",
{ delay: 50 }
);
// Jetzt Füllen wir das Baujahr der Heizung aus.
cy.get("input[name='baujahr_heizung']")
.should("have.attr", "type", "number")
.type(
faker.number.int({ min: 1900, max: 2021 }).toString() +
"{enter}",
{ delay: 50 }
);
// Adresse
cy.get("input[name='adresse']").type(faker.location.streetAddress());
// Postleitzahl
cy.get("input[name='plz']").type(
faker.location.zipCode({
format: "#####",
})
);
// TODO: Ort - Dieser wird aus der Datenbank abgefragt, wir müssen also warten, bis der Dropdown da ist.
cy.get("[data-cy='plz-container']").find("button").first().click()
// Nutzflaeche
cy.get("input[name='nutzflaeche']")
.should("have.attr", "type", "number")
.type(faker.number.int({ min: 50, max: 1000 }).toString());
// Keller
cy.get("select[name='keller']").find("option:not([disabled])").should("have.length", (["BEHEIZT", "NICHT_VORHANDEN", "UNBEHEIZT"] as Enums.Heizungsstatus[]).length).parent().select(faker.number.int({
max: Object.values(Enums.Heizungsstatus).length,
min: 1
}));
// Dachgeschoss
cy.get("select[name='dachgeschoss']").find("option:not([disabled])").should("have.length", (["BEHEIZT", "NICHT_VORHANDEN", "UNBEHEIZT"] as Enums.Heizungsstatus[]).length).parent().select(faker.number.int({
max: Object.values(Enums.Heizungsstatus).length,
min: 1
}));
cy.get("[data-cy='beschreibung']").type(faker.lorem.paragraphs({ min: 2, max: 10 }))
// Wärmedämmung Bilder
cy.get("input[type='file'][name='plaene']").should("have.attr", "type", "file").attachFile("images/daemmung/1.jpeg", { subjectType: "input" }).attachFile("images/daemmung/2.jpeg", { subjectType: "input" });
cy.get("input[type='file'][name='unterlagen']").should("have.attr", "type", "file").attachFile("images/gebaeude/1.jpeg", { subjectType: "input" }).attachFile("images/daemmung/2.jpeg", { subjectType: "input" });
// Jetzt können wir den Verbrauchsausweis erstellen.
cy.get("form[data-cy='nachweis'] button[data-cy='weiter']").click({ force: true });
cy.url().should("contain", "/kundendaten");
const email = faker.internet.email();
const passwort = "test1234";
const vorname = faker.person.firstName();
const nachname = faker.person.lastName();
const telefon = faker.phone.number()
const strasse = faker.location.streetAddress({ useFullAddress: true })
const plz = faker.location.zipCode("#####")
cy.get("input[name='vorname']").should("have.attr", "type", "text").type(vorname);
cy.get("input[name='name']").should("have.attr", "type", "text").type(nachname);
cy.get("input[name='telefon']").should("have.attr", "type", "text").type(telefon);
// Rechnung
cy.get("input[name='rechnung_empfaenger']").should("have.attr", "type", "text").type(`${vorname} ${nachname}`);
cy.get("input[name='rechnung_strasse']").should("have.attr", "type", "text").type(strasse);
cy.get("input[name='rechnung_plz']").should("have.attr", "type", "text").type(plz);
cy.get("[data-cy='plz-container']").children().first().click()
cy.get("input[name='rechnung_email']").should("have.attr", "type", "email").type(email);
cy.get("button[data-cy='bestellen']").click();
cy.get("a[data-cy='registrieren']").should("be.visible").click();
// Wir sind jetzt registriert und können uns nun einloggen.
// Die Email sollte automatisch eingetragen sein, da wir uns gerade registriert haben.
cy.get("form[name='signup'] input[name='vorname']").should("be.visible").should("have.attr", "type", "text").type(vorname);
cy.get("form[name='signup'] input[name='nachname']").should("be.visible").should("have.attr", "type", "text").type(nachname);
cy.get("form[name='signup'] input[name='email']").should("be.visible").should("have.attr", "type", "email").should("contain.value", email);
cy.get("form[name='signup'] input[name='passwort']").should("be.visible").should("have.attr", "type", "password").type(passwort);
cy.get("form[name='signup'] button[type='submit']").click();
cy.get("form[name='login'] button[type='submit']").click();
cy.url().should("contain", "/einpreisung/success")
});
});

View File

@@ -28,6 +28,7 @@ export const BilderKategorie = {
Fenster: "Fenster",
Gebaeude: "Gebaeude",
Daemmung: "Daemmung",
AnlagenTechnik: "AnlagenTechnik",
} as const;
export type BilderKategorie = (typeof BilderKategorie)[keyof typeof BilderKategorie];
@@ -104,7 +105,6 @@ export const Ausweisart = {
BedarfsausweisWohnen: "BedarfsausweisWohnen",
BedarfsausweisGewerbe: "BedarfsausweisGewerbe",
GEGNachweisWohnen: "GEGNachweisWohnen",
GEGNachweisBedarfsausweis: "GEGNachweisBedarfsausweis",
GEGNachweisGewerbe: "GEGNachweisGewerbe",
} as const;

View File

@@ -55,7 +55,7 @@ export const AufnahmeSchema = z.object({
dachgeschoss_gedaemmt: z.boolean().describe("Falls das Dachgeschoss des Gebäudes gedämmt ist, sollte dieser Wert auf true stehen").nullish(),
keller_decke_gedaemmt: z.boolean().describe("Falls die Kellerdecke des Gebäudes gedämmt ist, sollte dieser Wert auf true stehen").nullish(),
keller_wand_gedaemmt: z.boolean().describe("Falls die Kellerwände des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen").nullish(),
aussenwand_gedaemmt: z.boolean().describe("Falls die Außenwände des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen").nullish(),
aussenwand_gedaemmt: z.boolean().describe("Falls die Außenwände des Gebäudes ged<EFBFBD><EFBFBD>mmt sind, sollte dieser Wert auf true stehen").nullish(),
oberste_geschossdecke_gedaemmt: z.boolean().describe("Falls die oberste Geschossdecke des Gebäudes gedämmt ist, sollte dieser Wert auf true stehen").nullish(),
aussenwand_min_12cm_gedaemmt: z.boolean().describe("Falls die Außenwände des Gebäudes mindestens 12cm gedämmt sind, sollte dieser Wert auf true stehen").nullish(),
dachgeschoss_min_12cm_gedaemmt: z.boolean().describe("Falls das Dachgeschoss des Gebäudes mindestens 12cm gedämmt ist, sollte dieser Wert auf true stehen").nullish(),

View File

@@ -1,8 +1,25 @@
import * as z from "zod"
import { Ausstellgrund } from "@prisma/client"
export const BedarfsausweisGewerbeSchema = z.object({
id: z.number().int(),
uid: z.string(),
ausstellgrund: z.nativeEnum(Ausstellgrund).describe("Ausstellgrund wie z.B. Vermietung oder Verkauf").nullish(),
keller_beheizt: z.boolean().describe("Falls der Keller des Gebäudes beheizt wird, sollte dieser Wert auf true stehen").nullish(),
storniert: z.boolean().describe("Falls die Nachweisanfrage storniert wurde, sollte dieser Wert auf true stehen").nullish(),
bestellt: z.boolean().describe("Falls der Nachweis bestellt wurde, sollte dieser Wert auf true stehen").nullish(),
zurueckgestellt: z.boolean().describe("Falls der Nachweis vom Aussteller zurückgestellt wurde, sollte dieser Wert auf true stehen").nullish(),
abluftanlage: z.boolean().nullish(),
zu_abluftanlage: z.boolean().nullish(),
konditionierung_der_zuluft: z.boolean().nullish(),
luftheizung: z.boolean().nullish(),
hallenheizung: z.boolean().nullish(),
dunkelstrahler: z.boolean().nullish(),
direktheizung: z.boolean().nullish(),
infrarotstrahler: z.boolean().nullish(),
fussbodenheizung: z.boolean().nullish(),
bauteilaktivierung: z.boolean().nullish(),
klimatisierung: z.boolean().nullish(),
benutzer_id: z.number().int().describe("Die ID des Benutzers, welchem dieser Ausweis gehört").nullish(),
aufnahme_id: z.number().int(),
rechnung_id: z.number().int().nullish(),

View File

@@ -12,7 +12,7 @@ import { PERSISTENT_DIR } from "#lib/server/constants.js";
/* -------------------------------- Pdf Tools ------------------------------- */
export async function pdfDatenblattVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient, objekt: ObjektClient, benutzer: BenutzerClient, bilder: UploadedGebaeudeBild[]) {
export async function pdfDatenblattVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient, objekt: ObjektClient, benutzer: BenutzerClient, bilder: BildClient[]) {
const VerbrauchsausweisWohnenGEG2024PDF = fs.readFileSync(new URL("../../../public/pdf/templates/Leerseite_Datenblatt.pdf", import.meta.url), "base64");
const pdf = await PDFDocument.load(VerbrauchsausweisWohnenGEG2024PDF)
const page3 = copyPage(pdf.getPages()[0]);
@@ -365,8 +365,6 @@ export async function pdfDatenblattVerbrauchsausweisGewerbe(ausweis: Verbrauchsa
if (bild.uid) {
image = `<img src="${fileURLToPath(new URL(`${PERSISTENT_DIR}/images/${bild.uid}.jpg`, import.meta.url))}" width="${(pages[2].getWidth() - 120) / 3.1}" height="${(pages[2].getHeight() - marginY * 2) / 4}" />`
} else if (bild.data) {
image = `<img data="${bild.data}" width="${(pages[2].getWidth() - 120) / 3.1}" height="180" />`
}
if (images.length > 0) {

View File

@@ -12,7 +12,7 @@ import { PERSISTENT_DIR } from "#lib/server/constants.js";
/* -------------------------------- Pdf Tools ------------------------------- */
export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient, benutzer: BenutzerClient, bilder: UploadedGebaeudeBild[]) {
export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient, benutzer: BenutzerClient, bilder: BildClient[]) {
const VerbrauchsausweisWohnenGEG2024PDF = fs.readFileSync(new URL("../../../public/pdf/templates/Leerseite_Datenblatt.pdf", import.meta.url), "base64");
const pdf = await PDFDocument.load(VerbrauchsausweisWohnenGEG2024PDF)
const page3 = copyPage(pdf.getPages()[0]);
@@ -308,8 +308,6 @@ export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: Verbrauchsau
if (bild.uid) {
image = `<img src="${fileURLToPath(new URL(`${PERSISTENT_DIR}/images/${bild.uid}.jpg`, import.meta.url))}" width="${(pages[2].getWidth() - 120) / 3.1}" height="${(pages[2].getHeight() - marginY * 2) / 4}" />`
} else if (bild.data) {
image = `<img data="${bild.data}" width="${(pages[2].getWidth() - 120) / 3.1}" height="180" />`
}
if (images.length > 0) {

View File

@@ -1,16 +1,18 @@
import { AufnahmeClient, BenutzerClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
import { AufnahmeClient, BenutzerClient, BildClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient } from "#components/Ausweis/types.js";
import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.js";
import { getEmpfehlungen } from "#lib/XML/getEmpfehlungen.js";
import { Enums } from "#lib/server/prisma.js";
import * as fs from "fs"
import moment from "moment";
import { PDFDocument, PDFFont, PDFImage, PDFName, PDFNumber, PDFPage, rgb, RotationTypes, StandardFonts, TextAlignment } from "pdf-lib";
import { PDFDocument, PDFFont, PDFImage, PDFPage, StandardFonts } from "pdf-lib";
import { addCheckMark } from "./utils/checkbox.js";
import { addText } from "./utils/text.js";
import { addAnsichtsausweisLabel, addDatumGEG } from "./utils/helpers.js";
import { PERSISTENT_DIR } from "#lib/server/constants.js";
import { fileURLToPath } from "url";
export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: UploadedGebaeudeBild[], user: BenutzerClient) {
export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: BildClient[], user: BenutzerClient) {
const VerbrauchsausweisWohnenGEG2024PDF = fs.readFileSync(new URL("../../../public/pdf/templates/GEG24_Nichtwohngebaeude.pdf", import.meta.url), "base64");
const pdf = await PDFDocument.load(VerbrauchsausweisWohnenGEG2024PDF)
const pages = pdf.getPages()
@@ -137,20 +139,15 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
const gebaeudeBild = bilder.find(image => image.kategorie === Enums.BilderKategorie.Gebaeude);
const bild = bilder && bilder.find(image => image.kategorie === Enums.BilderKategorie.Gebaeude);
if (gebaeudeBild) {
let image: PDFImage | null;
try {
image = await pdf.embedJpg(gebaeudeBild.data)
} catch(e) {
try {
image = await pdf.embedPng(gebaeudeBild.data)
} catch(e) {
image = null;
}
}
if (image) {
if (bild) {
const path = `${PERSISTENT_DIR}/images/${bild.uid}.jpg`;
if (fs.existsSync(path)) {
const file = fs.readFileSync(fileURLToPath(new URL(path, import.meta.url)))
let image: PDFImage;
image = await pdf.embedJpg(file)
pages[0].drawImage(image, {
x: 460.5,
y: height - 289,
@@ -469,70 +466,70 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
// TODO
// if (!ausweis.warmwasser_enthalten) {
// /**
// * Dezentrale Warmwasserversorgung - Pauschale Erhöhung um 20kWh/m²
// * @link https://www.bundesanzeiger.de/pub/publication/MRYM4nI84Sdlr0EIvvW?2
// */
// addVerbrauch(
// moment(ausweis.startdatum).format("MM.YYYY"),
// moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
// "Warmwasserzuschlag",
// berechnungen?.brennstoff_1.primaerenergiefaktor.toString(),
// Math.round(berechnungen?.energieVerbrauchWarmwasser_1 || 0).toString(),
// Math.round(berechnungen?.energieVerbrauchWarmwasser_1 || 0).toString(),
// 0,
// "0"
// );
// }
if (!ausweis.warmwasser_enthalten) {
/**
* Dezentrale Warmwasserversorgung - Pauschale Erhöhung um 20kWh/m²
* @link https://www.bundesanzeiger.de/pub/publication/MRYM4nI84Sdlr0EIvvW?2
*/
addVerbrauch(
moment(ausweis.startdatum).format("MM.YYYY"),
moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
"Warmwasserzuschlag",
berechnungen?.brennstoff_1.primaerenergiefaktor.toString(),
Math.round(berechnungen?.energieVerbrauchWarmwasser_1 || 0).toString(),
Math.round(berechnungen?.energieVerbrauchWarmwasser_1 || 0).toString(),
0,
"0"
);
}
// if (aufnahme.leerstand && aufnahme.leerstand > 0) {
// /**
// * Leerstandszuschlag
// * @link https://www.bundesanzeiger.de/pub/publication/MRYM4nI84Sdlr0EIvvW?2
// */
// if (ausweis.warmwasser_enthalten && ausweis.warmwasser_anteil_bekannt) {
// addVerbrauch(
// moment(ausweis.startdatum).format("MM.YYYY"),
// moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
// "Leerstandszuschlag",
// berechnungen?.brennstoff_1.primaerenergiefaktor.toString(),
// Math.round((berechnungen?.leerstandsZuschlagHeizung || 0) + (berechnungen?.leerstandsZuschlagWarmwasser || 0)).toString(),
// Math.round((berechnungen?.leerstandsZuschlagWarmwasser || 0)).toString(),
// Math.round((berechnungen?.leerstandsZuschlagHeizung || 0)),
// berechnungen?.durchschnittsKlimafaktor.toString()
// );
// } else {
// addVerbrauch(
// moment(ausweis.startdatum).format("MM.YYYY"),
// moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
// "Leerstandszuschlag",
// berechnungen?.brennstoff_1.primaerenergiefaktor.toString(),
// Math.round((berechnungen?.leerstandsZuschlagHeizung || 0) + (berechnungen?.leerstandsZuschlagWarmwasser || 0)).toString(),
// "0",
// 0,
// berechnungen?.durchschnittsKlimafaktor.toString()
// );
// }
// }
if (aufnahme.leerstand && aufnahme.leerstand > 0) {
/**
* Leerstandszuschlag
* @link https://www.bundesanzeiger.de/pub/publication/MRYM4nI84Sdlr0EIvvW?2
*/
if (ausweis.warmwasser_enthalten && ausweis.warmwasser_anteil_bekannt) {
addVerbrauch(
moment(ausweis.startdatum).format("MM.YYYY"),
moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
"Leerstandszuschlag",
berechnungen?.brennstoff_1.primaerenergiefaktor.toString(),
Math.round((berechnungen?.leerstandsZuschlagHeizung || 0) + (berechnungen?.leerstandsZuschlagWarmwasser || 0)).toString(),
Math.round((berechnungen?.leerstandsZuschlagWarmwasser || 0)).toString(),
Math.round((berechnungen?.leerstandsZuschlagHeizung || 0)),
berechnungen?.durchschnittsKlimafaktor.toString()
);
} else {
addVerbrauch(
moment(ausweis.startdatum).format("MM.YYYY"),
moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
"Leerstandszuschlag",
berechnungen?.brennstoff_1.primaerenergiefaktor.toString(),
Math.round((berechnungen?.leerstandsZuschlagHeizung || 0) + (berechnungen?.leerstandsZuschlagWarmwasser || 0)).toString(),
"0",
0,
berechnungen?.durchschnittsKlimafaktor.toString()
);
}
}
// if (aufnahme.kuehlung) {
// /**
// * Kühlungszuschlag - Pauschale Erhöhung um 6kWh/m²
// * Primärenergiefaktor Strom
// * @link https://www.bundesanzeiger.de/pub/publication/MRYM4nI84Sdlr0EIvvW?2
// */
// addVerbrauch(
// moment(ausweis.startdatum).format("MM.YYYY"),
// moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
// "Kühlungszuschlag",
// berechnungen?.primaerfaktorww.toString(),
// Math.round(berechnungen?.kuehlungsZuschlag || 0).toString(),
// "0",
// "0",
// ""
// );
// }
if (aufnahme.kuehlung) {
/**
* Kühlungszuschlag - Pauschale Erhöhung um 6kWh/m²
* Primärenergiefaktor Strom
* @link https://www.bundesanzeiger.de/pub/publication/MRYM4nI84Sdlr0EIvvW?2
*/
addVerbrauch(
moment(ausweis.startdatum).format("MM.YYYY"),
moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
"Kühlungszuschlag",
berechnungen?.primaerfaktorww.toString(),
Math.round(berechnungen?.kuehlungsZuschlag_1 || 0).toString(),
"0",
0,
""
);
}
/* -------------------------------- Seite 4 -------------------------------- */

View File

@@ -48,40 +48,122 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
}
}
const gebaeudetyp = fillFormField("gebaeudetyp", aufnahme.gebaeudetyp || "")
pages[0].drawText(aufnahme.gebaeudetyp || "", {
x: 211,
y: height - 166,
size: 10
})
const adresse = fillFormField("adresse", objekt.adresse || "")
pages[0].drawText(objekt.adresse || "", {
x: 211,
y: height - 194,
size: 10
})
pages[0].drawText(aufnahme.gebaeudeteil || "", {
x: 211,
y: height - 214.5,
size: 10
})
const gebaeudeteil = fillFormField("gebaeudeteil", aufnahme.gebaeudeteil || "")
pages[0].drawText(aufnahme.baujahr_gebaeude?.toString() || "", {
x: 211,
y: height - 229.5,
size: 10
})
const baujahr_gebaeude = fillFormField("baujahr_gebaeude", aufnahme.baujahr_gebaeude?.toString())
pages[0].drawText(aufnahme.baujahr_heizung?.toString() || "", {
x: 211,
y: height - 250,
size: 10
})
const baujahr_heizung = fillFormField("baujahr_heizung", aufnahme.baujahr_heizung?.toString())
pages[0].drawText(aufnahme.einheiten?.toString() || "", {
x: 211,
y: height - 271.5,
size: 10
})
const einheiten = fillFormField("einheiten", (aufnahme.einheiten || 1).toString())
pages[0].drawText(aufnahme.nutzflaeche?.toString() || "", {
x: 211,
y: height - 285,
size: 10
})
const nutzflaeche = fillFormField("nutzflaeche", `${berechnungen?.energetischeNutzflaeche?.toString()}`)
fillFormField("energietraeger_heizung", `${aufnahme.brennstoff_1}, ${aufnahme.brennstoff_2 || ""}`)
pages[0].drawText(`${aufnahme.brennstoff_1}, ${aufnahme.brennstoff_2 || ""}`, {
x: 211,
y: height - 298.5,
size: 10
})
if (ausweis.warmwasser_enthalten) {
fillFormField("energietraeger_warmwasser", `${aufnahme.brennstoff_1}, ${aufnahme.brennstoff_2 || ""}`)
pages[0].drawText(`${aufnahme.brennstoff_1}, ${aufnahme.brennstoff_2 || ""}`, {
x: 211,
y: height - 312,
size: 10
})
}
if (aufnahme.durchlauf_erhitzer && !ausweis.warmwasser_enthalten) {
fillFormField("energietraeger_warmwasser", "Strommix");
const erneuerbareEnergienVerwendung = []
if (ausweis.alternative_heizung) {
erneuerbareEnergienVerwendung.push("Heizung")
}
toggleCheck("fensterlueftung", aufnahme.lueftung == Enums.Lueftungskonzept.Fensterlueftung)
toggleCheck("schachtlueftung", aufnahme.lueftung == Enums.Lueftungskonzept.Schachtlueftung)
toggleCheck("lueftungsanlage_ohne_waermerueckgewinnung", aufnahme.lueftung == Enums.Lueftungskonzept.LueftungsanlageOhneWaermerueckgewinnung)
toggleCheck("lueftungsanlage_waermerueckgewinnung", aufnahme.lueftung == Enums.Lueftungskonzept.LueftungsanlageMitWaermerueckgewinnung)
if (ausweis.alternative_kuehlung) {
erneuerbareEnergienVerwendung.push("Kühlung")
}
toggleCheck("anlass_neubau", ausweis.ausstellgrund == "Neubau")
toggleCheck("anlass_vermietung", ausweis.ausstellgrund == "Vermietung" || ausweis.ausstellgrund == "Verkauf")
toggleCheck("anlass_modernisierung", ausweis.ausstellgrund == "Modernisierung")
toggleCheck("anlass_sonstiges", ausweis.ausstellgrund == "Sonstiges")
if (ausweis.alternative_lueftung) {
erneuerbareEnergienVerwendung.push("Lüftung")
}
if (ausweis.alternative_warmwasser) {
erneuerbareEnergienVerwendung.push("Warmwasser")
}
pages[0].drawText(erneuerbareEnergienVerwendung.join(", "), {
x: 358,
y: height - 325,
size: 8
})
if (ausweis.warmwasser_enthalten) {
pages[0].drawText(`${aufnahme.brennstoff_1}, ${aufnahme.brennstoff_2 || ""}`, {
x: 211,
y: height - 299,
size: 10
})
}
if (aufnahme.lueftung === Enums.Lueftungskonzept.Fensterlueftung) {
addCheckMark(pages[0], 213, height - 347)
} else if (aufnahme.lueftung === Enums.Lueftungskonzept.Schachtlueftung) {
addCheckMark(pages[0], 213, height - 358)
} else if (aufnahme.lueftung === Enums.Lueftungskonzept.LueftungsanlageMitWaermerueckgewinnung) {
addCheckMark(pages[0], 355, height - 347)
} else if (aufnahme.lueftung === Enums.Lueftungskonzept.LueftungsanlageOhneWaermerueckgewinnung) {
addCheckMark(pages[0], 355, height - 358)
}
// Kühlung
if (aufnahme.kuehlung) {
addCheckMark(pages[0], 213, height - 375.5)
} else {
addCheckMark(pages[0], 355, height - 386.5)
}
if (ausweis.ausstellgrund === Enums.Ausstellgrund.Neubau) {
addCheckMark(pages[0], 213, height - 419)
} else if (ausweis.ausstellgrund === Enums.Ausstellgrund.Vermietung || ausweis.ausstellgrund === Enums.Ausstellgrund.Verkauf) {
addCheckMark(pages[0], 213, height - 430)
} else if (ausweis.ausstellgrund === Enums.Ausstellgrund.Modernisierung) {
addCheckMark(pages[0], 344.5, height - 419)
} else if (ausweis.ausstellgrund === Enums.Ausstellgrund.Sonstiges) {
addCheckMark(pages[0], 463, height - 419)
}
const bild = bilder && bilder.find(image => image.kategorie === Enums.BilderKategorie.Gebaeude);
@@ -150,35 +232,6 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
height: 50
})
const erneuerbareEnergienVerwendung = []
if (ausweis.alternative_heizung) {
erneuerbareEnergienVerwendung.push("Heizung")
}
if (ausweis.alternative_kuehlung) {
erneuerbareEnergienVerwendung.push("Kühlung")
}
if (ausweis.alternative_lueftung) {
erneuerbareEnergienVerwendung.push("Lüftung")
}
if (ausweis.alternative_warmwasser) {
erneuerbareEnergienVerwendung.push("Warmwasser")
}
pages[0].drawText(erneuerbareEnergienVerwendung.join(", "), {
x: 358,
y: height - 337,
size: 8
})
// Kühlung
if (aufnahme.kuehlung) {
addCheckMark(pages[0], 354, height - 376.5)
}
/* -------------------------------- Seite 2 -------------------------------- */

View File

@@ -31,9 +31,9 @@ export async function getAnsichtsausweis(ausweis: VerbrauchsausweisWohnenClient
}
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
return await pdfVerbrauchsausweisWohnen(ausweis, aufnahme, objekt, bilder, user)
return await pdfVerbrauchsausweisWohnen(ausweis as VerbrauchsausweisWohnenClient, aufnahme, objekt, bilder, user)
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
return await pdfVerbrauchsausweisGewerbe(ausweis, aufnahme, objekt, bilder, user)
return await pdfVerbrauchsausweisGewerbe(ausweis as VerbrauchsausweisGewerbeClient, aufnahme, objekt, bilder, user)
}
return null
@@ -49,9 +49,9 @@ export async function getDatenblatt(ausweis: VerbrauchsausweisWohnenClient | Ver
}
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
return await pdfDatenblattVerbrauchsausweisWohnen(ausweis, aufnahme, objekt, bilder, user)
return await pdfDatenblattVerbrauchsausweisWohnen(ausweis as VerbrauchsausweisWohnenClient, aufnahme, objekt, user, bilder)
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
return await pdfDatenblattVerbrauchsausweisGewerbe(ausweis, aufnahme, objekt, bilder, user)
return await pdfDatenblattVerbrauchsausweisGewerbe(ausweis as VerbrauchsausweisGewerbeClient, aufnahme, objekt, user, bilder)
}
return null

View File

@@ -13,7 +13,7 @@ export async function sendGEGAnforderungsMail(
await transport.sendMail({
from: `"IBCornelsen" <info@online-energieausweis.org>`,
to: user.email,
subject: `GEG Nachweis angefordert beim IBCornelsen (ID: ${nachweis.id})`,
subject: `Angebotsanfrage GEG Nachweis - IBCornelsen (ID: ${nachweis.id})`,
cc: {
address: user.email || "",
name: user.name || "",
@@ -22,7 +22,7 @@ export async function sendGEGAnforderungsMail(
html: `<p>Sehr geehrte/r ${user.vorname} ${user.name},
<br>
<br>
Sie haben einen GEG Nachweis bei uns angefordert.</p>
Ihre Angebotsanfrage zum GEG Nachweis ist bei uns eingegangen.</p>
<p>
Mit freundlichen Grüßen,
<br>

View File

@@ -3,6 +3,7 @@ import {
Benutzer,
GEGNachweisWohnen,
} from "#lib/client/prisma.js";
import { getPaymentSuccessSubject } from "./helpers.js";
export async function sendGEGBestellungsMail(
nachweis: GEGNachweisWohnen,
@@ -11,7 +12,8 @@ export async function sendGEGBestellungsMail(
await transport.sendMail({
from: `"IBCornelsen" <info@online-energieausweis.org>`,
to: user.email,
subject: `Bestellbestätigung vom IBCornelsen (ID: ${nachweis.uid})`,
// subject: getPaymentSuccessSubject(nachweis, ),
// TODO
cc: {
address: user.email || "",
name: user.name || "",

View File

@@ -0,0 +1,491 @@
import { shortenUID } from "#server/lib/hash.js";
import { BedarfsausweisWohnen, Enums, Rechnung, VerbrauchsausweisGewerbe, VerbrauchsausweisWohnen } from "../prisma.js";
export function getPaymentSuccessSubject(ausweis: VerbrauchsausweisWohnen | VerbrauchsausweisGewerbe | BedarfsausweisWohnen, rechnung: Rechnung, ausweisart: Enums.Ausweisart) {
const id = shortenUID(ausweis.uid);
let subject: string = "";
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
subject = `Bestellbestätigung vom IB Cornelsen - Verbrauchsausweis Wohnen (ID: ${id})`;
if (rechnung.ausweistyp === Enums.AusweisTyp.Beratung) {
subject = `Bestellbestätigung vom IB Cornelsen - Verbrauchsausweis Wohnen mit Beratung (ID: ${id})`
} else if (rechnung.ausweistyp === Enums.AusweisTyp.Offline) {
subject = `Bestellbestätigung vom IB Cornelsen - Verbrauchsausweis Wohnen - offline Service (ID: ${id})`
}
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
subject = `Bestellbestätigung vom IB Cornelsen - Verbrauchsausweis Gewerbe (ID: ${id})`
if (rechnung.ausweistyp === Enums.AusweisTyp.Beratung) {
subject = `Bestellbestätigung vom IB Cornelsen - Verbrauchsausweis Gewerbe mit Beratung (ID: ${id})`
} else if (rechnung.ausweistyp === Enums.AusweisTyp.Offline) {
subject = `Bestellbestätigung vom IB Cornelsen - Verbrauchsausweis Gewerbe - offline Service (ID: ${id})`
}
} else if (ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) {
subject = `Bestellbestätigung vom IB Cornelsen - Bedarfsausweis Wohnen (ID: ${id})`
if (rechnung.ausweistyp === Enums.AusweisTyp.Beratung) {
subject = `Bestellbestätigung vom IB Cornelsen - Bedarfsausweis Wohnen mit Beratung (ID: ${id})`
} else if (rechnung.ausweistyp === Enums.AusweisTyp.Offline) {
subject = `Bestellbestätigung vom IB Cornelsen - Bedarfsausweis Wohnen - offline Service (ID: ${id})`
}
}
return subject;
}
export function getPaymentInvoiceBody(ausweis: VerbrauchsausweisWohnen | VerbrauchsausweisGewerbe | BedarfsausweisWohnen, rechnung: Rechnung, ausweisart: Enums.Ausweisart) {
const id = shortenUID(ausweis.uid);
let body: string = "";
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
body = `
<p>vielen Dank für Ihre Bestellung. Im Anhang finden Sie den Ansichtsausweis als PDF-Datei. Wir werden den Ausweis nun prüfen und Originalausweis und Rechnung nach Prüfung zuschicken.<br>
In der Regel erhalten Sie Ihren Ausweis innerhalb von 24 Stunden. Die Ausstellung erfolgt nach aktuellem GEG und Ihr Ausweis wird beim DIBT registriert.</p>
<p>Eine Zahlung wurde noch nicht durchgeführt. Sie erhalten Bankverbindung und Verwendungszweck zusammen mit der Rechnung, sobald ihr Ausweis ausgestellt wurde.</p>
<p>
Mit freundlichen Grüßen,
<br>
Dipl.-Ing. Jens Cornelsen
<br>
<br>
<strong>IB Cornelsen</strong>
<br>
Katendeich 5A
<br>
21035 Hamburg
<br>
www.online-energieausweis.org
<br>
<br>
fon 040 · 209339850
<br>
fax 040 · 209339859
</p>`
if (rechnung.ausweistyp === Enums.AusweisTyp.Beratung) {
body = `
<p>vielen Dank für Ihre Bestellung. Sie haben telefonische Beratung zu Ihrer online Eingabe angefordert.<br>
Wir werden Sie innerhalb von 48 Stunden unter der von Ihnen hinterlegten Telefonnummer kontaktieren und dann die offenen Fragen zu Ihrer Eingabe beantworten.</p>
<p>Eine Zahlung wurde noch nicht durchgeführt. Sie erhalten Bankverbindung und Verwendungszweck zusammen mit der Rechnung, sobald ihr Ausweis ausgestellt wurde.</p>
<p>
Mit freundlichen Grüßen,
<br>
Dipl.-Ing. Jens Cornelsen
<br>
<br>
<strong>IB Cornelsen</strong>
<br>
Katendeich 5A
<br>
21035 Hamburg
<br>
www.online-energieausweis.org
<br>
<br>
fon 040 · 209339850
<br>
fax 040 · 209339859
</p>`
} else if (rechnung.ausweistyp === Enums.AusweisTyp.Offline) {
body = `
<p>vielen Dank für Ihre Bestellung. Sie haben unseren offline Service für Ihren Energieausweis angefordert.<br>
Bitte antworten Sie auf diese E-Mail und schicken uns drei aktuelle Heizkostenabrechnungen Ihres Energieversorgers zu. Wir werden Sie innerhalb von 48 Stunden unter der von Ihnen hinterlegten Telefonnummer kontaktieren und die Eingabe in Absprache mit Ihnen durchführen.</p>
<p>Eine Zahlung wurde noch nicht durchgeführt. Sie erhalten Bankverbindung und Verwendungszweck zusammen mit der Rechnung, sobald ihr Ausweis ausgestellt wurde.</p>
<p>
Mit freundlichen Grüßen,
<br>
Dipl.-Ing. Jens Cornelsen
<br>
<br>
<strong>IB Cornelsen</strong>
<br>
Katendeich 5A
<br>
21035 Hamburg
<br>
www.online-energieausweis.org
<br>
<br>
fon 040 · 209339850
<br>
fax 040 · 209339859
</p>`
}
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
body = `
<p>vielen Dank für Ihre Bestellung. Im Anhang finden Sie den Ansichtsausweis als PDF-Datei. Wir werden den Ausweis nun prüfen und Originalausweis und Rechnung nach Prüfung zuschicken.<br>
In der Regel erhalten Sie Ihren Ausweis innerhalb von 24 Stunden. Die Ausstellung erfolgt nach aktuellem GEG und Ihr Ausweis wird beim DIBT registriert.</p>
<p>Eine Zahlung wurde noch nicht durchgeführt. Sie erhalten Bankverbindung und Verwendungszweck zusammen mit der Rechnung, sobald ihr Ausweis ausgestellt wurde.</p>
<p>
Mit freundlichen Grüßen,
<br>
Dipl.-Ing. Jens Cornelsen
<br>
<br>
<strong>IB Cornelsen</strong>
<br>
Katendeich 5A
<br>
21035 Hamburg
<br>
www.online-energieausweis.org
<br>
<br>
fon 040 · 209339850
<br>
fax 040 · 209339859
</p>`
if (rechnung.ausweistyp === Enums.AusweisTyp.Beratung) {
body = `
<p>vielen Dank für Ihre Bestellung. Sie haben telefonische Beratung zu Ihrer online Eingabe angefordert.<br>
Wir werden Sie innerhalb von 48 Stunden unter der von Ihnen hinterlegten Telefonnummer kontaktieren und dann die offenen Fragen zu Ihrer Eingabe beantworten.</p>
<p>Eine Zahlung wurde noch nicht durchgeführt. Sie erhalten Bankverbindung und Verwendungszweck zusammen mit der Rechnung, sobald ihr Ausweis ausgestellt wurde.</p>
<p>
Mit freundlichen Grüßen,
<br>
Dipl.-Ing. Jens Cornelsen
<br>
<br>
<strong>IB Cornelsen</strong>
<br>
Katendeich 5A
<br>
21035 Hamburg
<br>
www.online-energieausweis.org
<br>
<br>
fon 040 · 209339850
<br>
fax 040 · 209339859
</p>`
} else if (rechnung.ausweistyp === Enums.AusweisTyp.Offline) {
body = `
<p>vielen Dank für Ihre Bestellung. Sie haben unseren offline Service für Ihren Energieausweis angefordert.<br>
Bitte antworten Sie auf diese E-Mail und schicken uns drei aktuelle Heizkostenabrechnungen Ihres Energieversorgers zu. Wir werden Sie innerhalb von 48 Stunden unter der von Ihnen hinterlegten Telefonnummer kontaktieren und die Eingabe in Absprache mit Ihnen durchführen.</p>
<p>Eine Zahlung wurde noch nicht durchgeführt. Sie erhalten Bankverbindung und Verwendungszweck zusammen mit der Rechnung, sobald ihr Ausweis ausgestellt wurde.</p>
<p>
Mit freundlichen Grüßen,
<br>
Dipl.-Ing. Jens Cornelsen
<br>
<br>
<strong>IB Cornelsen</strong>
<br>
Katendeich 5A
<br>
21035 Hamburg
<br>
www.online-energieausweis.org
<br>
<br>
fon 040 · 209339850
<br>
fax 040 · 209339859
</p>`
}
} else if (ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) {
body = `
<p>vielen Dank für Ihre Bestellung. Im Anhang finden Sie den Ansichtsausweis als PDF-Datei. Wir werden den Ausweis nun prüfen und Originalausweis und Rechnung nach Prüfung zuschicken.<br>
Die Erstellung des Bedarfsausweises dauert momentan leider etwas länger. Bitte kontaktieren Sie uns in dringenden Fällen telefonisch (9 - 12 Uhr). Die Ausstellung erfolgt nach aktuellem GEG und Ihr Ausweis wird beim DIBT registriert.</p>
<p>Eine Zahlung wurde noch nicht durchgeführt. Sie erhalten Bankverbindung und Verwendungszweck zusammen mit der Rechnung, sobald ihr Ausweis ausgestellt wurde.</p>
<p>
Mit freundlichen Grüßen,
<br>
Dipl.-Ing. Jens Cornelsen
<br>
<br>
<strong>IB Cornelsen</strong>
<br>
Katendeich 5A
<br>
21035 Hamburg
<br>
www.online-energieausweis.org
<br>
<br>
fon 040 · 209339850
<br>
fax 040 · 209339859
</p>`
if (rechnung.ausweistyp === Enums.AusweisTyp.Beratung) {
body = `
<p>vielen Dank für Ihre Bestellung. Sie haben telefonische Beratung zu Ihrer online Eingabe angefordert.<br>
Wir werden Sie innerhalb von 48 Stunden unter der von Ihnen hinterlegten Telefonnummer kontaktieren und dann die offenen Fragen zu Ihrer Eingabe beantworten.</p>
<p>Eine Zahlung wurde noch nicht durchgeführt. Sie erhalten Bankverbindung und Verwendungszweck zusammen mit der Rechnung, sobald ihr Ausweis ausgestellt wurde.</p>
<p>
Mit freundlichen Grüßen,
<br>
Dipl.-Ing. Jens Cornelsen
<br>
<br>
<strong>IB Cornelsen</strong>
<br>
Katendeich 5A
<br>
21035 Hamburg
<br>
www.online-energieausweis.org
<br>
<br>
fon 040 · 209339850
<br>
fax 040 · 209339859
</p>`
} else if (rechnung.ausweistyp === Enums.AusweisTyp.Offline) {
body = `
<p>vielen Dank für Ihre Bestellung. Sie haben unseren offline Service für Ihren Energieausweis angefordert.<br>
Bitte antworten Sie auf diese E-Mail und schicken uns Grundriss- und Ansichtspläne Ihres Gebäudes zu. Wir werden Sie innerhalb von 48 Stunden unter der von Ihnen hinterlegten Telefonnummer kontaktieren und die Eingabe in Absprache mit Ihnen durchführen.</p>
<p>Eine Zahlung wurde noch nicht durchgeführt. Sie erhalten Bankverbindung und Verwendungszweck zusammen mit der Rechnung, sobald ihr Ausweis ausgestellt wurde.</p>
<p>
Mit freundlichen Grüßen,
<br>
Dipl.-Ing. Jens Cornelsen
<br>
<br>
<strong>IB Cornelsen</strong>
<br>
Katendeich 5A
<br>
21035 Hamburg
<br>
www.online-energieausweis.org
<br>
<br>
fon 040 · 209339850
<br>
fax 040 · 209339859
</p>`
}
}
return body;
}
export function getPaymentSuccessBody(ausweis: VerbrauchsausweisWohnen | VerbrauchsausweisGewerbe | BedarfsausweisWohnen, rechnung: Rechnung, ausweisart: Enums.Ausweisart) {
const id = shortenUID(ausweis.uid);
let body: string = "";
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
body = `
<p>vielen Dank für Ihre Bestellung. Im Anhang finden Sie den Ansichtsausweis als PDF-Datei. Wir werden den Ausweis nun prüfen und Originalausweis und Rechnung nach Prüfung zuschicken.<br>
In der Regel erhalten Sie Ihren Ausweis innerhalb von 24 Stunden. Die Ausstellung erfolgt nach aktuellem GEG und Ihr Ausweis wird beim DIBT registriert.</p>
<p>Den Rechnungsbetrag haben Sie bereits bezahlt. Vielen Dank.</p>
<p>
Mit freundlichen Grüßen,
<br>
Dipl.-Ing. Jens Cornelsen
<br>
<br>
<strong>IB Cornelsen</strong>
<br>
Katendeich 5A
<br>
21035 Hamburg
<br>
www.online-energieausweis.org
<br>
<br>
fon 040 · 209339850
<br>
fax 040 · 209339859
</p>`
if (rechnung.ausweistyp === Enums.AusweisTyp.Beratung) {
body = `
<p>vielen Dank für Ihre Bestellung. Sie haben telefonische Beratung zu Ihrer online Eingabe angefordert.<br>
Wir werden Sie innerhalb von 48 Stunden unter der von Ihnen hinterlegten Telefonnummer kontaktieren und dann die offenen Fragen zu Ihrer Eingabe beantworten.</p>
<p>Den Rechnungsbetrag haben Sie bereits bezahlt. Vielen Dank.</p>
<p>
Mit freundlichen Grüßen,
<br>
Dipl.-Ing. Jens Cornelsen
<br>
<br>
<strong>IB Cornelsen</strong>
<br>
Katendeich 5A
<br>
21035 Hamburg
<br>
www.online-energieausweis.org
<br>
<br>
fon 040 · 209339850
<br>
fax 040 · 209339859
</p>`
} else if (rechnung.ausweistyp === Enums.AusweisTyp.Offline) {
body = `
<p>vielen Dank für Ihre Bestellung. Sie haben unseren offline Service für Ihren Energieausweis angefordert.<br>
Bitte antworten Sie auf diese E-Mail und schicken uns drei aktuelle Heizkostenabrechnungen Ihres Energieversorgers zu. Wir werden Sie innerhalb von 48 Stunden unter der von Ihnen hinterlegten Telefonnummer kontaktieren und die Eingabe in Absprache mit Ihnen durchführen.</p>
<p>Den Rechnungsbetrag haben Sie bereits bezahlt. Vielen Dank.</p>
<p>
Mit freundlichen Grüßen,
<br>
Dipl.-Ing. Jens Cornelsen
<br>
<br>
<strong>IB Cornelsen</strong>
<br>
Katendeich 5A
<br>
21035 Hamburg
<br>
www.online-energieausweis.org
<br>
<br>
fon 040 · 209339850
<br>
fax 040 · 209339859
</p>`
}
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
body = `
<p>vielen Dank für Ihre Bestellung. Im Anhang finden Sie den Ansichtsausweis als PDF-Datei. Wir werden den Ausweis nun prüfen und Originalausweis und Rechnung nach Prüfung zuschicken.<br>
In der Regel erhalten Sie Ihren Ausweis innerhalb von 24 Stunden. Die Ausstellung erfolgt nach aktuellem GEG und Ihr Ausweis wird beim DIBT registriert.</p>
<p>Den Rechnungsbetrag haben Sie bereits bezahlt. Vielen Dank.</p>
<p>
Mit freundlichen Grüßen,
<br>
Dipl.-Ing. Jens Cornelsen
<br>
<br>
<strong>IB Cornelsen</strong>
<br>
Katendeich 5A
<br>
21035 Hamburg
<br>
www.online-energieausweis.org
<br>
<br>
fon 040 · 209339850
<br>
fax 040 · 209339859
</p>`
if (rechnung.ausweistyp === Enums.AusweisTyp.Beratung) {
body = `
<p>vielen Dank für Ihre Bestellung. Sie haben telefonische Beratung zu Ihrer online Eingabe angefordert.<br>
Wir werden Sie innerhalb von 48 Stunden unter der von Ihnen hinterlegten Telefonnummer kontaktieren und dann die offenen Fragen zu Ihrer Eingabe beantworten.</p>
<p>Den Rechnungsbetrag haben Sie bereits bezahlt. Vielen Dank.</p>
<p>
Mit freundlichen Grüßen,
<br>
Dipl.-Ing. Jens Cornelsen
<br>
<br>
<strong>IB Cornelsen</strong>
<br>
Katendeich 5A
<br>
21035 Hamburg
<br>
www.online-energieausweis.org
<br>
<br>
fon 040 · 209339850
<br>
fax 040 · 209339859
</p>`
} else if (rechnung.ausweistyp === Enums.AusweisTyp.Offline) {
body = `
<p>vielen Dank für Ihre Bestellung. Sie haben unseren offline Service für Ihren Energieausweis angefordert.<br>
Bitte antworten Sie auf diese E-Mail und schicken uns drei aktuelle Heizkostenabrechnungen Ihres Energieversorgers zu. Wir werden Sie innerhalb von 48 Stunden unter der von Ihnen hinterlegten Telefonnummer kontaktieren und die Eingabe in Absprache mit Ihnen durchführen.</p>
<p>Den Rechnungsbetrag haben Sie bereits bezahlt. Vielen Dank.</p>
<p>
Mit freundlichen Grüßen,
<br>
Dipl.-Ing. Jens Cornelsen
<br>
<br>
<strong>IB Cornelsen</strong>
<br>
Katendeich 5A
<br>
21035 Hamburg
<br>
www.online-energieausweis.org
<br>
<br>
fon 040 · 209339850
<br>
fax 040 · 209339859
</p>`
}
} else if (ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) {
body = `
<p>vielen Dank für Ihre Bestellung. Im Anhang finden Sie den Ansichtsausweis als PDF-Datei. Wir werden den Ausweis nun prüfen und Originalausweis und Rechnung nach Prüfung zuschicken.<br>
Die Erstellung des Bedarfsausweises dauert momentan leider etwas länger. Bitte kontaktieren Sie uns in dringenden Fällen telefonisch (9 - 12 Uhr). Die Ausstellung erfolgt nach aktuellem GEG und Ihr Ausweis wird beim DIBT registriert.</p>
<p>Den Rechnungsbetrag haben Sie bereits bezahlt. Vielen Dank.</p>
<p>
Mit freundlichen Grüßen,
<br>
Dipl.-Ing. Jens Cornelsen
<br>
<br>
<strong>IB Cornelsen</strong>
<br>
Katendeich 5A
<br>
21035 Hamburg
<br>
www.online-energieausweis.org
<br>
<br>
fon 040 · 209339850
<br>
fax 040 · 209339859
</p>`
if (rechnung.ausweistyp === Enums.AusweisTyp.Beratung) {
body = `
<p>vielen Dank für Ihre Bestellung. Sie haben telefonische Beratung zu Ihrer online Eingabe angefordert.<br>
Wir werden Sie innerhalb von 48 Stunden unter der von Ihnen hinterlegten Telefonnummer kontaktieren und dann die offenen Fragen zu Ihrer Eingabe beantworten.</p>
<p>Den Rechnungsbetrag haben Sie bereits bezahlt. Vielen Dank.</p>
<p>
Mit freundlichen Grüßen,
<br>
Dipl.-Ing. Jens Cornelsen
<br>
<br>
<strong>IB Cornelsen</strong>
<br>
Katendeich 5A
<br>
21035 Hamburg
<br>
www.online-energieausweis.org
<br>
<br>
fon 040 · 209339850
<br>
fax 040 · 209339859
</p>`
} else if (rechnung.ausweistyp === Enums.AusweisTyp.Offline) {
body = `
<p>vielen Dank für Ihre Bestellung. Sie haben unseren offline Service für Ihren Energieausweis angefordert.<br>
Bitte antworten Sie auf diese E-Mail und schicken uns Grundriss- und Ansichtspläne Ihres Gebäudes zu. Wir werden Sie innerhalb von 48 Stunden unter der von Ihnen hinterlegten Telefonnummer kontaktieren und die Eingabe in Absprache mit Ihnen durchführen.</p>
<p>Den Rechnungsbetrag haben Sie bereits bezahlt. Vielen Dank.</p>
<p>
Mit freundlichen Grüßen,
<br>
Dipl.-Ing. Jens Cornelsen
<br>
<br>
<strong>IB Cornelsen</strong>
<br>
Katendeich 5A
<br>
21035 Hamburg
<br>
www.online-energieausweis.org
<br>
<br>
fon 040 · 209339850
<br>
fax 040 · 209339859
</p>`
}
}
return body;
}

View File

@@ -10,7 +10,9 @@ import {
import { prisma } from "#lib/server/prisma.js";
import { getAnsichtsausweis } from "../ausweis.js";
import Mail from "nodemailer/lib/mailer/index.js";
import { sqids } from "#client/lib/helpers.js";
import { shortenUID } from "#server/lib/hash.js";
import { getPaymentSuccessSubject } from "./helpers.js";
import { getPaymentInvoiceBody } from "./helpers.js";
export async function sendInvoiceMail(
ausweis: VerbrauchsausweisWohnen,
@@ -33,8 +35,15 @@ export async function sendInvoiceMail(
const ausweisart = getAusweisartFromUUID(ausweis.uid);
if (!ausweisart) {
return
}
const attachments: Mail.Attachment[] = [];
const id = shortenUID(ausweis.uid)
if (ausweisart != Enums.Ausweisart.BedarfsausweisWohnen) {
const ansichtsausweis = await getAnsichtsausweis(
ausweis,
@@ -48,7 +57,7 @@ export async function sendInvoiceMail(
if (ansichtsausweis) {
attachments.push(
{
filename: `ID_${ausweis.id}_Ansichtsausweis.pdf`,
filename: `ID_${id}_Ansichtsausweis.pdf`,
encoding: "binary",
content: Buffer.from(ansichtsausweis),
contentType: "application/pdf",
@@ -62,61 +71,12 @@ export async function sendInvoiceMail(
attachments,
from: `"IBCornelsen" <info@online-energieausweis.org>`,
to: user.email,
subject: `Bestellbestätigung vom IBCornelsen (ID: ${ausweis.id})`,
subject: getPaymentSuccessSubject(ausweis, rechnung, ausweisart),
cc: {
address: rechnung.email || "",
name: rechnung.empfaenger || "",
},
bcc: "info@online-energieausweis.org",
html: `<p>Sehr geehrte*r ${user.vorname} ${user.name},</p>
<p>im Anhang finden Sie Ihren geprüften Energieusweis inkl. Rechnung als PDF-Datei. Nachfolgend finden Sie unsere Bankverbindung. Bitte geben Sie als Verwendungszweck die Rechnungsnummer an (siehe unten). Vielen Dank.</p>
<br>
<table>
<tr><td>Kreditinstitut</td><td>:</td><td>\t Commerzbank AG</td>
<tr><td>Empfänger</td><td>:</td><td>\t IB Cornelsen</td>
<tr><td>IBAN</td><td>:<td>\t DE81 2004 0000 0348 6008 00</td>
<tr><td>BIC</td><td>:</td><td>\t COBADEFFXXX</td>
<tr><td>Betrag</td><td>:</td><td>\t <b>${rechnung.betrag}€</b></td>
<tr><td>Verwendungszweck</td><td>:</td><td>\t <b>${rechnung.id}</b></td>
</table>
<br>
<p>
Alternativ können Sie auch direkt online zahlen indem Sie auf den entsprechenden Link klicken:
</p>
<br>
<table>
<tr><td>Per Einzuglastschrift zahlen</td> <td>:</td> <td><a href='${BASE_URI}/energieausweis-erstellen/kaufabschluss-fortsetzen?uid=${ausweis.uid}&p=SEPA'>jetzt per ELV bezahlen</a></td></tr>
<tr><td>Per Sofortüberweisung zahlen</td> <td>:</td> <td><a href='${BASE_URI}/energieausweis-erstellen/kaufabschluss-fortsetzen?uid=${ausweis.uid}&p=Sofort'>jetzt per Sofortüberweisung bezahlen</a></td></tr>
<tr><td>Über PayPal zahlen</td> <td>:</td> <td><a href='${BASE_URI}/energieausweis-erstellen/kaufabschluss-fortsetzen?uid=${ausweis.uid}&p=PayPal'>jetzt per Paypal bezahlen</a></td></tr>
<tr><td>Per Giropay zahlen</td> <td>:</td> <td><a href='${BASE_URI}/energieausweis-erstellen/kaufabschluss-fortsetzen?uid=${ausweis.uid}&p=Giropay'>jetzt per Giropay bezahlen</a></td></tr>
<tr><td>Per Visa oder MasterCard zahlen</td> <td>:</td> <td><a href='${BASE_URI}/energieausweis-erstellen/kaufabschluss-fortsetzen?uid=${ausweis.uid}&p=Kreditkarte'>jetzt per Kreditkarte bezahlen</a></td></tr>
</table>
<br>
<p>
Mit freundlichen Grüßen,
<br>
Dipl.-Ing. Jens Cornelsen
<br>
<br>
<strong>IB Cornelsen</strong>
<br>
Katendeich 5A
<br>
21035 Hamburg
<br>
www.online-energieausweis.org
<br>
<br>
fon 040 · 209339850
<br>
fax 040 · 209339859
</p>`,
html: `<p>Sehr geehrte*r ${user.vorname} ${user.name},</p>` + getPaymentInvoiceBody(ausweis, rechnung, ausweisart),
});
}

View File

@@ -8,8 +8,10 @@ import {
} from "#lib/client/prisma.js";
import { prisma } from "#lib/server/prisma.js";
import { getAnsichtsausweis } from "../ausweis.js";
import { sqids } from "#client/lib/helpers.js";
import Mail from "nodemailer/lib/mailer/index.js";
import { shortenUID } from "#server/lib/hash.js";
import { getPaymentSuccessSubject } from "./helpers.js";
import { getPaymentSuccessBody } from "./helpers.js";
export async function sendPaymentSuccessMail(
ausweis: VerbrauchsausweisWohnen,
@@ -32,8 +34,15 @@ export async function sendPaymentSuccessMail(
let info: string = "";
const ausweisart = getAusweisartFromUUID(ausweis.uid);
if (!ausweisart) {
return;
}
const attachments: Mail.Attachment[] = [];
const id = shortenUID(ausweis.uid)
if (ausweisart != Enums.Ausweisart.BedarfsausweisWohnen) {
const ansichtsausweis = await getAnsichtsausweis(
ausweis,
@@ -47,7 +56,7 @@ export async function sendPaymentSuccessMail(
if (ansichtsausweis) {
attachments.push(
{
filename: `ID_${ausweis.id}_Ansichtsausweis.pdf`,
filename: `ID_${id}_Ansichtsausweis.pdf`,
encoding: "binary",
content: Buffer.from(ansichtsausweis),
contentType: "application/pdf",
@@ -66,37 +75,12 @@ export async function sendPaymentSuccessMail(
attachments,
from: `"IBCornelsen" <info@online-energieausweis.org>`,
to: user.email,
subject: `Bestellbestätigung vom IBCornelsen (ID: ${ausweis.id})`,
subject: getPaymentSuccessSubject(ausweis, rechnung, ausweisart),
cc: {
address: rechnung.email || "",
name: rechnung.empfaenger || "",
},
bcc: "info@online-energieausweis.org",
html: `<p>Sehr geehrte/r ${user.name},
<br>
<br>
vielen Dank für ihre Bestellung. Wir werden Ihnen Originalausweis und Rechnung nach Prüfung zuschicken. ${info} Die Ausstellung erfolgt nach aktuellem GEG und Ihr Ausweis wird beim DIBT registriert.<br><br>
Den Rechnungsbetrag haben Sie bereits bezahlt. Vielen Dank.</p>
<p>
Mit freundlichen Grüßen,
<br>
Dipl.-Ing. Jens Cornelsen
<br>
<br>
<strong>IB Cornelsen</strong>
<br>
Katendeich 5A
<br>
21035 Hamburg
<br>
www.online-energieausweis.org
<br>
<br>
fon 040 · 209339850
<br>
fax 040 · 209339859
</p>`,
html: `<p>Sehr geehrte*r ${user.vorname} ${user.name},</p>` + getPaymentSuccessBody(ausweis, rechnung, ausweisart),
});
}

View File

@@ -130,13 +130,11 @@
`/energieausweis-erstellen/verbrauchsausweis-gewerbe?uid=${ausweis.uid}`,
[Enums.Ausweisart.BedarfsausweisWohnen]:
`/energieausweis-erstellen/bedarfsausweis-wohnen?uid=${ausweis.uid}`,
[Enums.Ausweisart.BedarfsausweisGewerbe]:
`/energieausweis-erstellen/bedarfsausweis-gewerbe?uid=${ausweis.uid}`,
[Enums.Ausweisart.GEGNachweisWohnen]:
`/angebot-anfragen/geg-nachweis-wohnen-anfragen?uid=${ausweis.uid}`,
[Enums.Ausweisart.GEGNachweisGewerbe]:
`/angebot-anfragen/geg-nachweis-gewerbe-anfragen?uid=${ausweis.uid}`,
[Enums.Ausweisart.GEGNachweisBedarfsausweis]:
[Enums.Ausweisart.BedarfsausweisGewerbe]:
`/angebot-anfragen/bedarfsausweis-gewerbe-anfragen?uid=${ausweis.uid}`,
}[ausweisart];
@@ -153,27 +151,24 @@
}
if (!await validateAccessTokenClient()) {
loginAction = bestellen
loginAction = anfordern
loginOverlayHidden = false;
return
}
loginOverlayHidden = true
let result: Awaited<ReturnType<typeof ausweisSpeichern>> | null = null;
let result: Awaited<ReturnType<typeof nachweisSpeichern>> | null = null;
try {
if (ausweisart === Enums.Ausweisart.GEGNachweisWohnen) {
result = await nachweisSpeichern(ausweis, objekt, aufnahme, bilder, unterlagen, ausweisart)
} else {
result = await ausweisSpeichern(ausweis, objekt, aufnahme, bilder, ausweisart)
}
} catch(e) {
addNotification({
dismissable: true,
message: "Ups... Das hat nicht geklappt.",
subtext: "Speichern ist fehlgeschlagen, bitte versuchen sie es erneut oder kontaktieren sie unseren Support."
})
return;
}
try {
@@ -189,7 +184,7 @@
versand_plz: $versand_plz,
versand_ort: $versand_ort,
telefon: $telefon,
nachweis_uid: ausweis.uid,
nachweis_uid: result.uid_nachweis,
},
{
headers: {
@@ -201,7 +196,7 @@
// Alle alten Ausweisdateien im localStorage löschen.
localStorage.clear();
window.location.href = `/einpreisung/success?e=${uid}&a=${ausweis.uid}`;
window.location.href = `/einpreisung/success?e=${uid}&a=${result.uid_nachweis}`;
} catch (e) {
addNotification({
dismissable: true,
@@ -220,9 +215,9 @@
loginOverlayHidden = true
let result: Awaited<ReturnType<typeof ausweisSpeichern>> | null = null;
let result: Awaited<ReturnType<typeof ausweisSpeichern>> | Awaited<ReturnType<typeof nachweisSpeichern>> | null = null;
try {
if (ausweisart === Enums.Ausweisart.GEGNachweisWohnen) {
if (ausweisart === Enums.Ausweisart.GEGNachweisWohnen || ausweisart === Enums.Ausweisart.GEGNachweisGewerbe || ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe) {
result = await nachweisSpeichern(ausweis, objekt, aufnahme, bilder, unterlagen, ausweisart)
} else {
result = await ausweisSpeichern(ausweis, objekt, aufnahme, bilder, ausweisart)
@@ -267,15 +262,15 @@
loginOverlayHidden = true
let result: Awaited<ReturnType<typeof ausweisSpeichern>> | null = null;
if (ausweisart === Enums.Ausweisart.GEGNachweisWohnen || ausweisart === Enums.Ausweisart.GEGNachweisGewerbe || ausweisart === Enums.Ausweisart.GEGNachweisBedarfsausweis) {
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, objekt, aufnahme, bilder, unterlagen, ausweisart)
} else {
result = await ausweisSpeichern(ausweis, objekt, aufnahme, bilder, ausweisart)
}
if (result === null) {
if (ausweisart === Enums.Ausweisart.GEGNachweisWohnen || ausweisart === Enums.Ausweisart.GEGNachweisGewerbe || ausweisart === Enums.Ausweisart.GEGNachweisBedarfsausweis) {
if (ausweisart === Enums.Ausweisart.GEGNachweisWohnen || ausweisart === Enums.Ausweisart.GEGNachweisGewerbe || ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe) {
addNotification({
dismissable: true,
message: "Ups... Das hat nicht geklappt.",
@@ -399,7 +394,7 @@
const gegAnfrage =
ausweisart === Enums.Ausweisart.GEGNachweisWohnen ||
ausweisart === Enums.Ausweisart.GEGNachweisBedarfsausweis ||
ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe ||
ausweisart === Enums.Ausweisart.GEGNachweisGewerbe;
let loginOverlayHidden = true;
@@ -487,7 +482,7 @@
<div class="input-standard order-3 md:order-3 xl:order-3">
<InputLabel title="Telefonnummer *"></InputLabel>
<input name="telefon" bind:value={$telefon} type="text" />
<input name="telefon" bind:value={$telefon} type="text" required />
<div class="help-label">
<HelpLabel>

View File

@@ -59,7 +59,7 @@
export let bilder: UploadedGebaeudeBild[];
export let ausweistyp: Enums.AusweisTyp;
if (moment(localStorage.getItem("verbrauchsausweis-wohnen.updated_at") || new Date()).isAfter(ausweis.updated_at)) {
if (!ausweis.updated_at || moment(localStorage.getItem("verbrauchsausweis-wohnen.updated_at") || new Date()).isAfter(ausweis.updated_at)) {
const localStorageAusweis = localStorage.getItem("verbrauchsausweis-wohnen.ausweis");
if (localStorageAusweis) {
ausweis = JSON.parse(localStorageAusweis)

View File

@@ -0,0 +1,233 @@
<script lang="ts">
import GebaeudeDaten from "#components/Ausweis/GebaeudeDaten.svelte";
import {
ObjektClient,
AufnahmeClient,
BenutzerClient,
UnterlageClient,
GEGNachweisWohnenClient,
BildClient,
} from "#components/Ausweis/types.js";
import Bereich from "#components/labels/Bereich.svelte";
import { Enums } from "#lib/client/prisma.js";
import Progressbar from "#components/Ausweis/Progressbar.svelte";
import FileGrid from "#components/FileGrid.svelte";
import ButtonWeiterHilfe from "#components/Ausweis/ButtonWeiterHilfe.svelte";
import GEGAusweisart from "#components/GEGNachweis/GEGAusweisart.svelte";
import SanierungszustandHeizungsanlage from "#components/Ausweis/SanierungszustandHeizungsanlage.svelte";
import SanierungszustandFensterTueren from "#components/Ausweis/SanierungszustandFensterTueren.svelte";
import SanierungszustandWaermedammung from "#components/Ausweis/SanierungszustandWaermedammung.svelte";
import AnlagenTechnik from "#components/Ausweis/AnlagenTechnik.svelte";
export let nachweis: GEGNachweisWohnenClient;
export let objekt: ObjektClient;
export let aufnahme: AufnahmeClient;
export let user: BenutzerClient = {} as BenutzerClient;
export let bilder: BildClient[] = [];
export let plaene: UnterlageClient[] = [];
export let unterlagen: UnterlageClient[] = [];
if (Object.keys(nachweis).length === 0) {
const localStorageAusweis = localStorage.getItem(
"geg-nachweis-wohnen.ausweis"
);
if (localStorageAusweis) {
nachweis = JSON.parse(localStorageAusweis);
}
}
if (Object.keys(aufnahme).length === 0) {
const localStorageAufnahme = localStorage.getItem(
"geg-nachweis-wohnen.aufnahme"
);
if (localStorageAufnahme) {
aufnahme = JSON.parse(localStorageAufnahme);
}
}
if (Object.keys(objekt).length === 0) {
const localStorageObjekt = localStorage.getItem(
"geg-nachweis-wohnen.objekt"
);
if (localStorageObjekt) {
objekt = JSON.parse(localStorageObjekt);
}
}
if (Object.keys(bilder).length === 0) {
const localStorageBilder = localStorage.getItem(
"geg-nachweis-wohnen.bilder"
);
if (localStorageBilder) {
bilder = JSON.parse(localStorageBilder);
}
}
if (Object.keys(unterlagen).length === 0) {
const localStorageUnterlagen = localStorage.getItem(
"geg-nachweis-wohnen.unterlagen"
);
if (localStorageUnterlagen) {
unterlagen = JSON.parse(localStorageUnterlagen);
}
}
$: {
localStorage.setItem(
"geg-nachweis-wohnen.ausweis",
JSON.stringify(nachweis)
);
localStorage.setItem(
"geg-nachweis-wohnen.aufnahme",
JSON.stringify(aufnahme)
);
localStorage.setItem(
"geg-nachweis-wohnen.objekt",
JSON.stringify(objekt)
);
localStorage.setItem(
"geg-nachweis-wohnen.bilder",
JSON.stringify(bilder)
);
localStorage.setItem(
"geg-nachweis-wohnen.unterlagen",
JSON.stringify(unterlagen)
);
}
const ausweisart = Enums.Ausweisart.BedarfsausweisGewerbe;
const anliegen = "Angebot anfragen";
let form: HTMLFormElement;
let skala: HTMLDivElement;
</script>
<div
id="skala"
bind:this={skala}
class="bg-white grid grid-cols-1 p-4 lg:grid-cols-2 lg:gap-x-6 no-scroll"
>
<Progressbar
active={0}
{ausweisart}
{anliegen}
steps={["Gebäudedaten", "Kundendaten", "Anfragebestätigung"]}
/>
</div>
<form id="formInput-1" name="ausweis" data-test="ausweis" bind:this={form}>
<div id="formular-box" class="formular-boxen ring-0">
<!-- A Prüfung der Ausweisart -->
<Bereich bereich="A" title="Prüfung der Ausweisart">
<GEGAusweisart
bind:objekt
bind:aufnahme
bind:ausweis={nachweis}
{ausweisart}
/>
</Bereich>
<!-- B Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgeschoss -->
<Bereich
bereich="B"
title="Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgeschoss"
><GebaeudeDaten bind:aufnahme bind:objekt {ausweisart} /></Bereich
>
<Bereich
bereich="C"
title="Angaben zur Heizungsanlage"
><SanierungszustandHeizungsanlage bind:ausweis={nachweis} bind:images={bilder} bind:aufnahme bind:objekt {ausweisart} /></Bereich
>
<Bereich
bereich="D"
title="Angaben zu Fenster, Dachfenster und Türen"
><SanierungszustandFensterTueren bind:ausweis={nachweis} bind:images={bilder} bind:aufnahme bind:objekt {ausweisart} /></Bereich
>
<Bereich
bereich="E"
title="Angaben zur Wärmedämmung"
><SanierungszustandWaermedammung bind:ausweis={nachweis} bind:images={bilder} bind:aufnahme bind:objekt {ausweisart} /></Bereich
>
<Bereich
bereich="F"
title="Angaben zur Wärmedämmung"
><AnlagenTechnik bind:ausweis={nachweis} bind:images={bilder} bind:aufnahme bind:objekt {ausweisart} /></Bereich
>
<Bereich bereich="G" title="Gebäudepläne & Unterlagen">
<div
class="bereich-box grid grid-cols-1 lg:grid-cols-2 gap-x-6 mt-6"
>
<div class="md:box md:card mb-0">
<div class="font-bold mb-2">Pläne</div>
<div>
Hier können sie Grundrisspläne, Ansichtspläne und
Schnitte hochladen. Die Dateien können entweder im PDF
Format oder als Bild hochgeladen werden.
</div>
</div>
<div class="md:box md:card mb-0 mt-6 md:mt-0">
<div>
<strong
>Bitte laden Sie hier mind. 1 Dokument hoch:</strong
>
</div>
<FileGrid
max={Infinity}
min={1}
name={"plaene"}
bind:files={plaene}
bind:ausweis={nachweis}
bind:objekt
></FileGrid>
</div>
</div>
<div
class="bereich-box grid grid-cols-1 lg:grid-cols-2 gap-x-6 mt-6"
>
<div class="md:box md:card mb-0">
<div class="font-bold mb-2">Unterlagen</div>
<div>
Hier können sie weitere Unterlagen wie z.B.
Baugenehmigungen, U-Wert Berechnungen, Anlagentechnik
oder ihren alten Energieausweis hochladen. Die Dateien
können entweder im PDF Format oder als Bild hochgeladen
werden.
</div>
</div>
<div class="md:box md:card mb-0 mt-6 md:mt-0">
<FileGrid
max={Infinity}
min={0}
name={"unterlagen"}
bind:files={unterlagen}
bind:ausweis={nachweis}
bind:objekt
></FileGrid>
</div>
</div>
</Bereich>
</div>
<ButtonWeiterHilfe
bind:ausweis={nachweis}
bind:bilder
bind:unterlagen
bind:user
bind:objekt
bind:aufnahme
ausweisart={Enums.Ausweisart.BedarfsausweisGewerbe}
{form}
{skala}
></ButtonWeiterHilfe>
</form>

View File

@@ -10,87 +10,124 @@
GEGNachweisWohnenClient,
} from "#components/Ausweis/types.js";
import Bereich from "#components/labels/Bereich.svelte";
import { Enums } from "#lib/client/prisma";
import { Enums } from "#lib/client/prisma.js";
import InputLabel from "#components/labels/InputLabel.svelte";
import HelpLabel from "#components/labels/HelpLabel.svelte";
import Progressbar from "#components/Ausweis/Progressbar.svelte";
import FileGrid from "#components/FileGrid.svelte";
import ButtonWeiterHilfe from "#components/Ausweis/ButtonWeiterHilfe.svelte";
export let nachweis: GEGNachweisWohnenClient;
export let objekt: ObjektClient;
export let aufnahme: AufnahmeClient;
export let user: BenutzerClient = {} as BenutzerClient;
export let bilder: UploadedGebaeudeBild[] = [];
export let plaene: UnterlageClient[] =
[];
export let plaene: UnterlageClient[] = [];
export let unterlagen: UnterlageClient[] = [];
if (Object.keys(nachweis).length === 0) {
const localStorageAusweis = localStorage.getItem("ausweis");
const localStorageAusweis = localStorage.getItem(
"geg-nachweis-gewerbe.ausweis"
);
if (localStorageAusweis) {
nachweis = JSON.parse(localStorageAusweis)
nachweis = JSON.parse(localStorageAusweis);
}
}
if (Object.keys(aufnahme).length === 0) {
const localStorageAufnahme = localStorage.getItem("aufnahme");
const localStorageAufnahme = localStorage.getItem(
"geg-nachweis-gewerbe.aufnahme"
);
if (localStorageAufnahme) {
aufnahme = JSON.parse(localStorageAufnahme)
aufnahme = JSON.parse(localStorageAufnahme);
}
}
if (Object.keys(objekt).length === 0) {
const localStorageObjekt = localStorage.getItem("objekt");
const localStorageObjekt = localStorage.getItem(
"geg-nachweis-gewerbe.objekt"
);
if (localStorageObjekt) {
objekt = JSON.parse(localStorageObjekt)
objekt = JSON.parse(localStorageObjekt);
}
}
if (Object.keys(bilder).length === 0) {
const localStorageBilder = localStorage.getItem("bilder");
const localStorageBilder = localStorage.getItem(
"geg-nachweis-gewerbe.bilder"
);
if (localStorageBilder) {
bilder = JSON.parse(localStorageBilder)
bilder = JSON.parse(localStorageBilder);
}
}
if (Object.keys(unterlagen).length === 0) {
const localStorageUnterlagen = localStorage.getItem("unterlagen");
const localStorageUnterlagen = localStorage.getItem(
"geg-nachweis-gewerbe.unterlagen"
);
if (localStorageUnterlagen) {
unterlagen = JSON.parse(localStorageUnterlagen)
unterlagen = JSON.parse(localStorageUnterlagen);
}
}
$: {
localStorage.setItem("ausweis", JSON.stringify(nachweis))
localStorage.setItem("aufnahme", JSON.stringify(aufnahme))
localStorage.setItem("objekt", JSON.stringify(objekt))
localStorage.setItem("bilder", JSON.stringify(bilder))
localStorage.setItem("unterlagen", JSON.stringify(unterlagen))
localStorage.setItem(
"geg-nachweis-gewerbe.ausweis",
JSON.stringify(nachweis)
);
localStorage.setItem(
"geg-nachweis-gewerbe.aufnahme",
JSON.stringify(aufnahme)
);
localStorage.setItem(
"geg-nachweis-gewerbe.objekt",
JSON.stringify(objekt)
);
localStorage.setItem(
"geg-nachweis-gewerbe.bilder",
JSON.stringify(bilder)
);
localStorage.setItem(
"geg-nachweis-gewerbe.unterlagen",
JSON.stringify(unterlagen)
);
}
const ausweisart = Enums.Ausweisart.GEGNachweisGewerbe;
const anliegen = "Angebot anfragen";
let skala: HTMLDivElement;
let form: HTMLFormElement;
</script>
<div id="skala" class="bg-white grid grid-cols-1 p-4 lg:grid-cols-2 lg:gap-x-6 no-scroll">
<Progressbar active={0} {ausweisart} {anliegen} steps={["Gebäudedaten","Kundendaten","Anfragebestätigung"]} />
<div
id="skala"
bind:this={skala}
class="bg-white grid grid-cols-1 p-4 lg:grid-cols-2 lg:gap-x-6 no-scroll"
>
<Progressbar
active={0}
{ausweisart}
{anliegen}
steps={["Gebäudedaten", "Kundendaten", "Anfragebestätigung"]}
/>
</div>
<form
id="formInput-1"
name="ausweis"
data-test="ausweis"
>
<form id="formInput-1" name="ausweis" data-cy="nachweis" bind:this={form}>
<div id="formular-box" class="formular-boxen ring-0">
<!-- A Prüfung der Ausweisart -->
<Bereich bereich="A" title="Prüfung der Ausweisart">
<Ausweisart bind:objekt bind:aufnahme bind:ausweis={nachweis} {ausweisart} />
<Ausweisart
bind:objekt
bind:aufnahme
bind:ausweis={nachweis}
{ausweisart}
ausstellgrund={[
Enums.Ausstellgrund.Neubau,
Enums.Ausstellgrund.Modernisierung,
]}
/>
</Bereich>
<!-- B Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgeschoss -->
@@ -108,7 +145,12 @@
title="Angaben zur Heizung, Lüftung, Energieerezugung, Qualität und Aufbau der Gebäudehülle usw."
></InputLabel>
<textarea class="rounded-e-none" rows="10" bind:value={nachweis.beschreibung}></textarea>
<textarea
class="rounded-e-none"
rows="10"
data-cy="beschreibung"
bind:value={nachweis.beschreibung}
></textarea>
<div class="help-label">
<HelpLabel>
@@ -188,7 +230,7 @@
bind:objekt
bind:aufnahme
ausweisart={Enums.Ausweisart.GEGNachweisGewerbe}
>
</ButtonWeiterHilfe>
{form}
{skala}
></ButtonWeiterHilfe>
</form>

View File

@@ -1,13 +1,12 @@
<script lang="ts">
import Ausweisart from "#components/Ausweis/Ausweisart.svelte";
import GebaeudeDaten from "#components/Ausweis/GebaeudeDaten.svelte";
import {
ObjektClient,
AufnahmeClient,
BenutzerClient,
UploadedGebaeudeBild,
UnterlageClient,
GEGNachweisWohnenClient,
BildClient,
} from "#components/Ausweis/types.js";
import Bereich from "#components/labels/Bereich.svelte";
import { Enums } from "#lib/client/prisma.js";
@@ -18,57 +17,80 @@
import ButtonWeiterHilfe from "#components/Ausweis/ButtonWeiterHilfe.svelte";
import GEGAusweisart from "#components/GEGNachweis/GEGAusweisart.svelte";
export let nachweis: GEGNachweisWohnenClient;
export let objekt: ObjektClient;
export let aufnahme: AufnahmeClient;
export let user: BenutzerClient = {} as BenutzerClient;
export let bilder: UploadedGebaeudeBild[] = [];
export let bilder: BildClient[] = [];
export let plaene: UnterlageClient[] = [];
export let unterlagen: UnterlageClient[] = [];
if (Object.keys(nachweis).length === 0) {
const localStorageAusweis = localStorage.getItem("geg-nachweis-wohnen.ausweis");
const localStorageAusweis = localStorage.getItem(
"geg-nachweis-wohnen.ausweis"
);
if (localStorageAusweis) {
nachweis = JSON.parse(localStorageAusweis)
nachweis = JSON.parse(localStorageAusweis);
}
}
if (Object.keys(aufnahme).length === 0) {
const localStorageAufnahme = localStorage.getItem("geg-nachweis-wohnen.aufnahme");
const localStorageAufnahme = localStorage.getItem(
"geg-nachweis-wohnen.aufnahme"
);
if (localStorageAufnahme) {
aufnahme = JSON.parse(localStorageAufnahme)
aufnahme = JSON.parse(localStorageAufnahme);
}
}
if (Object.keys(objekt).length === 0) {
const localStorageObjekt = localStorage.getItem("geg-nachweis-wohnen.objekt");
const localStorageObjekt = localStorage.getItem(
"geg-nachweis-wohnen.objekt"
);
if (localStorageObjekt) {
objekt = JSON.parse(localStorageObjekt)
objekt = JSON.parse(localStorageObjekt);
}
}
if (Object.keys(bilder).length === 0) {
const localStorageBilder = localStorage.getItem("geg-nachweis-wohnen.bilder");
const localStorageBilder = localStorage.getItem(
"geg-nachweis-wohnen.bilder"
);
if (localStorageBilder) {
bilder = JSON.parse(localStorageBilder)
bilder = JSON.parse(localStorageBilder);
}
}
if (Object.keys(unterlagen).length === 0) {
const localStorageUnterlagen = localStorage.getItem("geg-nachweis-wohnen.unterlagen");
const localStorageUnterlagen = localStorage.getItem(
"geg-nachweis-wohnen.unterlagen"
);
if (localStorageUnterlagen) {
unterlagen = JSON.parse(localStorageUnterlagen)
unterlagen = JSON.parse(localStorageUnterlagen);
}
}
$: {
localStorage.setItem("geg-nachweis-wohnen.ausweis", JSON.stringify(nachweis))
localStorage.setItem("geg-nachweis-wohnen.aufnahme", JSON.stringify(aufnahme))
localStorage.setItem("geg-nachweis-wohnen.objekt", JSON.stringify(objekt))
localStorage.setItem("geg-nachweis-wohnen.bilder", JSON.stringify(bilder))
localStorage.setItem("geg-nachweis-wohnen.unterlagen", JSON.stringify(unterlagen))
localStorage.setItem(
"geg-nachweis-wohnen.ausweis",
JSON.stringify(nachweis)
);
localStorage.setItem(
"geg-nachweis-wohnen.aufnahme",
JSON.stringify(aufnahme)
);
localStorage.setItem(
"geg-nachweis-wohnen.objekt",
JSON.stringify(objekt)
);
localStorage.setItem(
"geg-nachweis-wohnen.bilder",
JSON.stringify(bilder)
);
localStorage.setItem(
"geg-nachweis-wohnen.unterlagen",
JSON.stringify(unterlagen)
);
}
const ausweisart = Enums.Ausweisart.GEGNachweisWohnen;
@@ -78,23 +100,30 @@
let skala: HTMLDivElement;
</script>
<div id="skala" bind:this={skala} class="bg-white grid grid-cols-1 p-4 lg:grid-cols-2 lg:gap-x-6 no-scroll">
<Progressbar active={0} {ausweisart} {anliegen} steps={["Gebäudedaten","Kundendaten","Anfragebestätigung"]} />
<div
id="skala"
bind:this={skala}
class="bg-white grid grid-cols-1 p-4 lg:grid-cols-2 lg:gap-x-6 no-scroll"
>
<Progressbar
active={0}
{ausweisart}
{anliegen}
steps={["Gebäudedaten", "Kundendaten", "Anfragebestätigung"]}
/>
</div>
<form
id="formInput-1"
name="ausweis"
data-test="ausweis"
bind:this={form}
>
<form id="formInput-1" name="ausweis" data-cy="nachweis" bind:this={form}>
<div id="formular-box" class="formular-boxen ring-0">
<!-- A Prüfung der Ausweisart -->
<Bereich bereich="A" title="Prüfung der Ausweisart">
<GEGAusweisart bind:objekt bind:aufnahme bind:ausweis={nachweis} {ausweisart} />
<GEGAusweisart
bind:objekt
bind:aufnahme
bind:ausweis={nachweis}
{ausweisart}
/>
</Bereich>
<!-- B Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgeschoss -->
@@ -112,7 +141,12 @@
title="Angaben zur Heizung, Lüftung, Energieerezugung, Qualität und Aufbau der Gebäudehülle usw."
></InputLabel>
<textarea class="rounded-e-none" rows="10" bind:value={nachweis.beschreibung}></textarea>
<textarea
class="rounded-e-none"
rows="10"
data-cy="beschreibung"
bind:value={nachweis.beschreibung}
></textarea>
<div class="help-label">
<HelpLabel>
@@ -194,7 +228,5 @@
ausweisart={Enums.Ausweisart.GEGNachweisWohnen}
{form}
{skala}
>
</ButtonWeiterHilfe>
></ButtonWeiterHilfe>
</form>

View File

@@ -1 +1,90 @@
bedarfsausweis Gewerbe anfragen
---
import AusweisLayout from "#layouts/AusweisLayoutDaten.astro";
import { AufnahmeClient, BildClient, GEGNachweisWohnenClient, ObjektClient, UnterlageClient } from "#components/Ausweis/types";
import { createCaller } from "src/astro-typesafe-api-caller";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
import { validateAccessTokenServer } from "#server/lib/validateAccessToken.js";
import BedarfsausweisGewerbeModule from "#modules/angebot-anfragen/BedarfsausweisGewerbeModule.svelte";
const uid = Astro.url.searchParams.get("uid");
let nachweis: GEGNachweisWohnenClient = {} as GEGNachweisWohnenClient;
let aufnahme: AufnahmeClient = {} as AufnahmeClient;
let objekt: ObjektClient = {} as ObjektClient;
let bilder: BildClient[] = []
let unterlagen: UnterlageClient[] = []
const valid = validateAccessTokenServer(Astro);
const caller = createCaller(Astro);
if (uid) {
if (!valid) {
return Astro.redirect(
`/auth/login?redirect=${Astro.url.toString()}`
);
}
try {
nachweis = await caller["bedarfsausweis-gewerbe"]._uid.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid
}
});
aufnahme = await caller.aufnahme._uid.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid: nachweis.uid_aufnahme
}
})
objekt = await caller.objekt._uid.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid: nachweis.uid_objekt
}
})
bilder = await caller.aufnahme._uid.bilder.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid: nachweis.uid_aufnahme
}
})
unterlagen = await caller.aufnahme._uid.unterlagen.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid: nachweis.uid_aufnahme
}
})
if (!nachweis) {
// Der Ausweis scheint nicht zu existieren.
// Wir leiten auf die generische Ausweisseite ohne UID weiter.
return Astro.redirect(
"/angebot-anfragen/bedarfsausweis-gewerbe-anfragen"
);
}
} catch(e) {
return Astro.redirect(
"/angebot-anfragen/bedarfsausweis-gewerbe-anfragen"
);
}
}
---
<AusweisLayout title="Bedarfsausweis Gewerbe anfragen">
<BedarfsausweisGewerbeModule client:only {nachweis} {objekt} {aufnahme} {bilder} {unterlagen} />
</AusweisLayout>

View File

@@ -74,17 +74,17 @@ if (uid) {
// Der Ausweis scheint nicht zu existieren.
// Wir leiten auf die generische Ausweisseite ohne UID weiter.
return Astro.redirect(
"/angebot-anfragen/geg-nachweis-wohnen-anfragen"
"/angebot-anfragen/geg-nachweis-gewerbe-anfragen"
);
}
} catch(e) {
return Astro.redirect(
"/angebot-anfragen/geg-nachweis-wohnen-anfragen"
"/angebot-anfragen/geg-nachweis-gewerbe-anfragen"
);
}
}
---
<AusweisLayout title="GEG Nachweis Wohnen anfragen">
<AusweisLayout title="GEG Nachweis Gewerbe anfragen">
<GEGNachweisGewerbeModule client:only {nachweis} {objekt} {aufnahme} {bilder} {unterlagen} />
</AusweisLayout>

View File

@@ -1,6 +1,6 @@
---
import AusweisLayout from "#layouts/AusweisLayoutDaten.astro";
import { AufnahmeClient, GEGNachweisWohnenClient, ObjektClient, UnterlageClient, UploadedGebaeudeBild } from "#components/Ausweis/types";
import { AufnahmeClient, BildClient, GEGNachweisWohnenClient, ObjektClient, UnterlageClient } from "#components/Ausweis/types";
import { createCaller } from "src/astro-typesafe-api-caller";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
import { validateAccessTokenServer } from "#server/lib/validateAccessToken.js";
@@ -10,7 +10,7 @@ const uid = Astro.url.searchParams.get("uid");
let nachweis: GEGNachweisWohnenClient = {} as GEGNachweisWohnenClient;
let aufnahme: AufnahmeClient = {} as AufnahmeClient;
let objekt: ObjektClient = {} as ObjektClient;
let bilder: UploadedGebaeudeBild[] = []
let bilder: BildClient[] = []
let unterlagen: UnterlageClient[] = []
const valid = validateAccessTokenServer(Astro);

View File

@@ -1,7 +1,8 @@
import { UUidWithPrefix } from "#components/Ausweis/types.js"
import { authorizationMiddleware } from "#lib/middleware/authorization.js"
import { AufnahmeSchema, ObjektSchema, prisma } from "#lib/server/prisma.js"
import { prisma } from "#lib/server/prisma.js"
import { APIError, defineApiRoute } from "astro-typesafe-api/server"
import { AufnahmeSchema } from "src/generated/zod/aufnahme.js"
import { z } from "zod"
export const PUT = defineApiRoute({

View File

@@ -2,7 +2,7 @@ import { AufnahmeClient, ObjektClient, UploadedGebaeudeBild, UUidWithPrefix, Ver
import { filterAusweise } from "#lib/filters.js";
import { omit } from "#lib/helpers.js";
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
import { Enums, prisma, VerbrauchsausweisWohnenSchema } from "#lib/server/prisma";
import { Enums, prisma } from "#lib/server/prisma.js";
import { defineApiRoute } from "astro-typesafe-api/server";
import { z } from "zod";
@@ -15,12 +15,16 @@ export const GET = defineApiRoute({
skip: z.number().optional()
}),
async fetch(input, context, user) {
if (user.rolle !== Enums.BenutzerRolle.ADMIN) {
input.filters = input.filters || {}
input.filters["benutzer"] = {
uid: user.uid
}
}
const ausweise = await prisma.verbrauchsausweisWohnen.findMany({
where: {
...input.filters,
benutzer: {
uid: user.uid
},
...input.filters
},
include: {
aufnahme: {

View File

@@ -0,0 +1,212 @@
import { GEGNachweisWohnenClient, OptionalNullable, UUidWithPrefix, ZodOverlap } from "#components/Ausweis/types.js";
import { exclude } from "#lib/exclude.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 { BedarfsausweisGewerbeSchema } from "src/generated/zod/bedarfsausweisgewerbe.js";
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,
}),
output: z.void(),
headers: {
"Authorization": z.string()
},
middleware: authorizationMiddleware,
async fetch(input, ctx, user) {
const objekt = await prisma.bedarfsausweisGewerbe.findUnique({
where: {
uid: ctx.params.uid,
benutzer: {
id: user.id
}
}
})
if (!objekt) {
throw new APIError({
code: "NOT_FOUND",
message: "Nachweis konnte nicht gefunden werden oder gehört einem anderen Benutzer."
})
}
await prisma.bedarfsausweisGewerbe.update({
where: {
uid: ctx.params.uid
},
data: input
})
},
})
export const DELETE = defineApiRoute({
meta: {
description: "Storniert einen Nachweis"
},
headers: authorizationHeaders,
middleware: authorizationMiddleware,
async fetch(input, ctx, user) {
const { uid } = ctx.params;
if (!UUidWithPrefix.safeParse(uid).success) {
throw new APIError({
code: "BAD_REQUEST",
message: "UID konnte nicht verifiziert werden."
})
}
// Wir holen uns den BedarfsNachweis
// Dieser MUSS mit dem Nutzer verknüpft sein.
const nachweis = await prisma.bedarfsausweisGewerbe.findUnique({
where: {
uid,
}
});
if (!nachweis) {
// Falls wir den Nachweis nicht finden können, werfen wir einen Fehler
throw new APIError({
code: "NOT_FOUND",
message: "Nachweis konnte nicht gefunden werden.",
});
}
// Wir dürfen den Nachweis nur stornieren, wenn er noch nicht ausgestellt wurde
// Außerdem müssen wir schauen, ob wir Admin oder der Besitzer des Nachweises sind.
if ((nachweis.benutzer_id !== user.id) && user.rolle !== "ADMIN") {
// Falls der Nachweis nicht dem Nutzer gehört, werfen wir einen Fehler
throw new APIError({
code: "FORBIDDEN",
message: "Nachweis gehört nicht dem Nutzer.",
});
}
// if (Nachweis.erledigt) {
// // Falls der Nachweis bereits ausgestellt wurde, werfen wir einen Fehler
// throw new TRPCError({
// code: "BAD_REQUEST",
// message: "Nachweis wurde bereits ausgestellt.",
// });
// }
if (nachweis.storniert) {
// Falls der Nachweis bereits storniert ist, werfen wir einen Fehler
throw new APIError({
code: "BAD_REQUEST",
message: "Nachweis wurde bereits storniert.",
});
}
await prisma.gEGNachweisWohnen.update({
where: {
id: nachweis.id
},
data: {
storniert: true
}
})
// Wir erstellen ein Event, dass der Nachweis storniert wurde
// Dann können wir das in der Historie anzeigen
await prisma.event.create({
data: {
title: "Nachweis storniert",
description: ((user.rolle === "ADMIN") && (nachweis.benutzer_id !== user.id)) ? "Nachweis wurde von einem Administrator storniert." : "Nachweis wurde vom Besitzer storniert.",
benutzer: {
connect: {
id: user.id
}
},
aufnahme: {
connect: {
id: nachweis.aufnahme_id
}
}
}
})
},
})
export const GET = defineApiRoute({
meta: {
description: "Gibt ein spezifisches Gebäude des Benutzers zurück.",
tags: ["Gebäude"],
headers: {
"Authorization": {
description: "Ein gültiger Authentifizierungstoken",
required: true,
allowEmptyValue: false,
examples: {
Bearer: {
value: "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
}
}
}
},
output: BedarfsausweisGewerbeSchema.merge(z.object({
uid_aufnahme: UUidWithPrefix,
uid_objekt: UUidWithPrefix,
uid_benutzer: UUidWithPrefix.optional()
})).omit({
id: true,
aufnahme_id: true,
benutzer_id: true
}),
middleware: authorizationMiddleware,
async fetch(input, context, user) {
const { uid } = context.params;
if (!uid) {
throw new APIError({
code: "BAD_REQUEST",
message: "Missing uid in request params"
})
}
const nachweis = await prisma.bedarfsausweisGewerbe.findUnique({
where: {
uid,
benutzer_id: user.id
},
include: {
benutzer: {
select: {
uid: true
}
},
aufnahme: {
select: {
uid: true,
objekt: {
select: {
uid: true
}
}
}
}
}
});
if (!nachweis) {
// Falls wir den Nachweis nicht finden können, werfen wir einen Fehler
throw new APIError({
code: "NOT_FOUND",
message: "Nachweis konnte nicht gefunden werden.",
});
}
return {
uid_aufnahme: nachweis.aufnahme.uid,
uid_objekt: nachweis.aufnahme.objekt.uid,
uid_benutzer: nachweis.benutzer?.uid,
...exclude(nachweis, ["id", "aufnahme_id", "benutzer_id", "aufnahme"])
}
},
});

View File

@@ -0,0 +1,144 @@
import { UUidWithPrefix } from "#components/Ausweis/types.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 { BedarfsausweisGewerbeSchema } from "src/generated/zod/bedarfsausweisgewerbe.js";
import { z } from "zod";
export const PUT = defineApiRoute({
meta: {
contentTypes: ["application/json"],
description:
"Erstellt einen neuen Bedarfsausweis Gewerbe.",
tags: ["GEG Nachweis", "Bedarfsausweis Gewerbe"],
},
input: z.object({
nachweis: BedarfsausweisGewerbeSchema.omit({
id: true,
benutzer_id: true,
uid: true,
aufnahme_id: true,
geg_einpreisung_id: true,
rechnung_id: true
}),
uid_aufnahme: UUidWithPrefix
}),
output: z.object({
uid: UUidWithPrefix,
objekt_uid: UUidWithPrefix,
aufnahme_uid: UUidWithPrefix,
}),
headers: authorizationHeaders,
middleware: authorizationMiddleware,
async fetch(input, ctx, user) {
const aufnahme = await prisma.aufnahme.findUnique({
where: {
uid: input.uid_aufnahme
}
})
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."
})
}
const nachweis = await prisma.bedarfsausweisGewerbe.create({
data: {
...input.nachweis,
benutzer: {
connect: {
id: user.id,
},
},
aufnahme: {
connect: {
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,
};
},
});
export const GET = defineApiRoute({
meta: {
description: "Gibt eine spezifische GEG Nachweis Anfrage des Benutzers zurück.",
tags: ["GEG Nachweis"],
headers: {
Authorization: {
description: "Ein gültiger Authentifizierungstoken",
required: true,
allowEmptyValue: false,
examples: {
Bearer: {
value: "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
},
},
},
},
},
headers: authorizationHeaders,
middleware: authorizationMiddleware,
async fetch(input, context, user) {
const { uid } = context.params;
const nachweis = await prisma.bedarfsausweisGewerbe.findUnique({
where: {
uid,
},
include: {
benutzer: true,
aufnahme: {
include: {
events: {
include: {
benutzer: {
select: {
uid: true,
},
},
},
orderBy: {
date: "asc",
},
},
},
},
},
});
if (
!nachweis ||
(nachweis.benutzer_id !== null && nachweis.benutzer_id !== user.id)
) {
// Falls wir den Ausweis nicht finden können, werfen wir einen Fehler
throw new APIError({
code: "NOT_FOUND",
message: "GEG Nachweis konnte nicht gefunden werden.",
});
}
return nachweis;
},
});

View File

@@ -1,7 +1,8 @@
import { UUidWithPrefix } from "#components/Ausweis/types.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 PUT = defineApiRoute({
@@ -18,6 +19,7 @@ export const PUT = defineApiRoute({
uid: true,
aufnahme_id: true,
geg_einpreisung_id: true,
rechnung_id: true
}),
uid_aufnahme: UUidWithPrefix
}),
@@ -109,7 +111,6 @@ export const GET = defineApiRoute({
benutzer: true,
aufnahme: {
include: {
rechnungen: true,
events: {
include: {
benutzer: {

View File

@@ -1,7 +1,8 @@
import { UUidWithPrefix } from "#components/Ausweis/types.js";
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
import { GEGNachweisWohnenSchema, prisma } from "#lib/server/prisma";
import { prisma } from "#lib/server/prisma.js";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import { GEGNachweisWohnenSchema } from "src/generated/zod/gegnachweiswohnen.js";
import { z } from "zod";
export const PUT = defineApiRoute({
@@ -17,7 +18,8 @@ export const PUT = defineApiRoute({
benutzer_id: true,
uid: true,
aufnahme_id: true,
geg_einpreisung_id: true
geg_einpreisung_id: true,
rechnung_id: true
}),
uid_aufnahme: UUidWithPrefix
}),
@@ -109,7 +111,6 @@ export const GET = defineApiRoute({
benutzer: true,
aufnahme: {
include: {
rechnungen: true,
events: {
include: {
benutzer: {

View File

@@ -140,7 +140,7 @@ function getPaymentDescription(ausweisart: Enums.Ausweisart) {
return "Verbrauchsausweis Gewerbegebäude"
case "VerbrauchsausweisWohnen":
return "Verbrauchsausweis Wohngebäude"
case "GEGNachweisBedarfsausweis":
case "BedarfsausweisGewerbe":
case "GEGNachweisGewerbe":
case "GEGNachweisWohnen":
return "GEG Nachweis"

View File

@@ -2,7 +2,7 @@ import { getAusweisartFromUUID, UUidWithPrefix } from "#components/Ausweis/types
import { omit } from "#lib/helpers.js";
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
import { sendGEGAnforderungsMail } from "#lib/server/mail/geg-anfordern.js";
import { Enums, prisma } from "#lib/server/prisma.js";
import { Enums, GEGNachweisGewerbe, GEGNachweisWohnen, prisma } from "#lib/server/prisma.js";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import { GEGEinpreisungSchema } from "src/generated/zod/gegeinpreisung.js";
import { z } from "zod";
@@ -22,12 +22,32 @@ export const PUT = defineApiRoute({
const ausweisart = getAusweisartFromUUID(input.nachweis_uid);
let einpreisung;
let nachweis: GEGNachweisWohnen | GEGNachweisGewerbe;
if (ausweisart === Enums.Ausweisart.GEGNachweisWohnen) {
const nachweis = await prisma.gEGNachweisWohnen.findUnique({
nachweis = await prisma.gEGNachweisWohnen.findUnique({
where: {
uid: input.nachweis_uid
}
})
} else if (ausweisart === Enums.Ausweisart.GEGNachweisGewerbe) {
nachweis = await prisma.gEGNachweisGewerbe.findUnique({
where: {
uid: input.nachweis_uid
}
})
} else if (ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe) {
nachweis = await prisma.bedarfsausweisGewerbe.findUnique({
where: {
uid: input.nachweis_uid
}
})
} else {
throw new APIError({
"code": "BAD_REQUEST",
"message": `Ausweisart wird nicht unterstützt: ${ausweisart}`
})
}
if (!nachweis || nachweis.benutzer_id !== user.id) {
throw new APIError({
@@ -36,7 +56,7 @@ export const PUT = defineApiRoute({
})
}
if (ausweisart === Enums.Ausweisart.GEGNachweisWohnen) {
einpreisung = await prisma.gEGEinpreisung.create({
data: {
...omit(input, ["nachweis_uid"]),
@@ -53,16 +73,43 @@ export const PUT = defineApiRoute({
}
}
})
await sendGEGAnforderungsMail(nachweis, user)
} else {
throw new APIError({
"code": "BAD_REQUEST",
"message": `Ausweisart wird nicht unterstützt: ${ausweisart}`
} else if (ausweisart === Enums.Ausweisart.GEGNachweisGewerbe) {
einpreisung = await prisma.gEGEinpreisung.create({
data: {
...omit(input, ["nachweis_uid"]),
status: Enums.Einpreisungsstatus.open,
benutzer: {
connect: {
id: user.id
}
},
geg_nachweis_gewerbe: {
connect: {
uid: input.nachweis_uid
}
}
}
})
} else if (ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe) {
einpreisung = await prisma.gEGEinpreisung.create({
data: {
...omit(input, ["nachweis_uid"]),
status: Enums.Einpreisungsstatus.open,
benutzer: {
connect: {
id: user.id
}
},
bedarfsausweis_gewerbe: {
connect: {
uid: input.nachweis_uid
}
}
}
})
}
await sendGEGAnforderungsMail(nachweis, user)
return {
uid: einpreisung.uid

View File

@@ -1,3 +1,3 @@
---
return Astro.redirect("/dashboard/admin/ausweise-pruefen/1")
return Astro.redirect("/dashboard/admin/ausweise-pruefen/1");
---

View File

@@ -35,6 +35,6 @@ try {
---
<AusweisLayout title="Kundendaten Aufnehmen - IBCornelsen">
<KundendatenModule {user} {ausweis} {objekt} {aufnahme} {bilder} {ausweisart} {ausweistyp} aktiveBezahlmethode={Enums.Bezahlmethoden.paypal} client:only></KundendatenModule>
<KundendatenModule {user} {ausweis} {objekt} {aufnahme} {bilder} {ausweisart} {ausweistyp} unterlagen={[]} aktiveBezahlmethode={Enums.Bezahlmethoden.paypal} client:only></KundendatenModule>
</AusweisLayout>

11
src/server/lib/hash.ts Normal file
View File

@@ -0,0 +1,11 @@
function murmurHash36(str: string) {
let h = 0xdeadbeef;
for (let i = 0; i < str.length; i++) {
h = Math.imul(h ^ str.charCodeAt(i), 2654435761);
}
return (h >>> 0).toString(36).toUpperCase().slice(0, 6);
}
export function shortenUID(uid: string) {
return murmurHash36(uid);
}

View File

@@ -165,10 +165,32 @@ export function fakeAufnahmeComplete() {
objekt_id: faker.number.int(),
};
}
export function fakeBedarfsausweisGewerbe() {
return {
ausstellgrund: undefined,
keller_beheizt: undefined,
};
}
export function fakeBedarfsausweisGewerbeComplete() {
return {
id: faker.number.int({ max: 2147483647 }),
uid: '[object Object]',
ausstellgrund: undefined,
keller_beheizt: undefined,
storniert: false,
bestellt: false,
zurueckgestellt: false,
abluftanlage: false,
zu_abluftanlage: false,
konditionierung_der_zuluft: false,
luftheizung: false,
hallenheizung: false,
dunkelstrahler: false,
direktheizung: false,
infrarotstrahler: false,
fussbodenheizung: false,
bauteilaktivierung: false,
klimatisierung: false,
benutzer_id: undefined,
aufnahme_id: faker.number.int(),
rechnung_id: undefined,
@@ -343,13 +365,13 @@ export function fakeBenutzerComplete() {
}
export function fakeBild() {
return {
kategorie: faker.helpers.arrayElement([BilderKategorie.Heizung, BilderKategorie.Fenster, BilderKategorie.Gebaeude, BilderKategorie.Daemmung] as const),
kategorie: faker.helpers.arrayElement([BilderKategorie.Heizung, BilderKategorie.Fenster, BilderKategorie.Gebaeude, BilderKategorie.Daemmung, BilderKategorie.AnlagenTechnik] as const),
};
}
export function fakeBildComplete() {
return {
id: faker.number.int({ max: 2147483647 }),
kategorie: faker.helpers.arrayElement([BilderKategorie.Heizung, BilderKategorie.Fenster, BilderKategorie.Gebaeude, BilderKategorie.Daemmung] as const),
kategorie: faker.helpers.arrayElement([BilderKategorie.Heizung, BilderKategorie.Fenster, BilderKategorie.Gebaeude, BilderKategorie.Daemmung, BilderKategorie.AnlagenTechnik] as const),
uid: '[object Object]',
aufnahme_id: undefined,
};