Merge pull request #442 from IBCornelsen/main

get main
This commit is contained in:
Jens Cornelsen
2025-03-13 22:08:50 +01:00
committed by GitHub
10 changed files with 201 additions and 761 deletions

View File

@@ -1,737 +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]
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")']
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]
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
AnlagenTechnik
}
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
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

@@ -13,7 +13,7 @@
import { api } from "astro-typesafe-api/client"; import { api } from "astro-typesafe-api/client";
import Cookies from "js-cookie"; import Cookies from "js-cookie";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js"; import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
import { 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 { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.js";
import { shortenUID } from "#server/lib/hash.js"; import { shortenUID } from "#server/lib/hash.js";
@@ -131,19 +131,21 @@
</ul> </ul>
</div> </div>
<div class="flex flex-row flex-wrap items-center gap-2"> <div class="flex flex-row flex-wrap items-center gap-2">
{#if ausweisart == Enums.Ausweisart.VerbrauchsausweisWohnen} <div class="text-lg font-semibold">
<div class="text-lg font-semibold"> {#if ausweisart == Enums.Ausweisart.VerbrauchsausweisWohnen}
Verbrauchsausweis Wohnen Verbrauchsausweis Wohnen
</div> {:else if ausweisart == Enums.Ausweisart.BedarfsausweisWohnen}
{:else if ausweisart == Enums.Ausweisart.BedarfsausweisWohnen} Bedarfsausweis Wohnen
<div class="text-lg font-semibold"> {:else if ausweisart == Enums.Ausweisart.VerbrauchsausweisGewerbe}
Bedarfsausweis Wohnen Verbrauchsausweis Gewerbe
</div> {/if}
{:else if ausweisart == Enums.Ausweisart.VerbrauchsausweisGewerbe}
<div class="text-lg font-semibold"> {#if rechnung.ausweistyp === Enums.AusweisTyp.Beratung}
Verbrauchsausweis Gewerbe (Beratung)
</div> {:else if rechnung.ausweistyp === Enums.AusweisTyp.Offline}
{/if} (Offline)
{/if}
</div>
{#if ausweis.ausgestellt} {#if ausweis.ausgestellt}
<span class="bg-green-600 px-2 py-0.5 text-sm font-semibold rounded-lg text-white">Ausgestellt</span> <span class="bg-green-600 px-2 py-0.5 text-sm font-semibold rounded-lg text-white">Ausgestellt</span>

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

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

View File

@@ -0,0 +1,32 @@
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;
}

View File

@@ -11,6 +11,7 @@ import { prisma } from "#lib/server/prisma.js";
import { getAnsichtsausweis } from "../ausweis.js"; import { getAnsichtsausweis } from "../ausweis.js";
import Mail from "nodemailer/lib/mailer/index.js"; import Mail from "nodemailer/lib/mailer/index.js";
import { shortenUID } from "#server/lib/hash.js"; import { shortenUID } from "#server/lib/hash.js";
import { getPaymentSuccessSubject } from "./helpers.js";
export async function sendInvoiceMail( export async function sendInvoiceMail(
ausweis: VerbrauchsausweisWohnen, ausweis: VerbrauchsausweisWohnen,
@@ -33,6 +34,10 @@ export async function sendInvoiceMail(
const ausweisart = getAusweisartFromUUID(ausweis.uid); const ausweisart = getAusweisartFromUUID(ausweis.uid);
if (!ausweisart) {
return
}
const attachments: Mail.Attachment[] = []; const attachments: Mail.Attachment[] = [];
const id = shortenUID(ausweis.uid) const id = shortenUID(ausweis.uid)
@@ -65,7 +70,7 @@ export async function sendInvoiceMail(
attachments, attachments,
from: `"IBCornelsen" <info@online-energieausweis.org>`, from: `"IBCornelsen" <info@online-energieausweis.org>`,
to: user.email, to: user.email,
subject: `Bestellbestätigung vom IBCornelsen (ID: ${id})`, subject: getPaymentSuccessSubject(ausweis, rechnung, ausweisart),
cc: { cc: {
address: rechnung.email || "", address: rechnung.email || "",
name: rechnung.empfaenger || "", name: rechnung.empfaenger || "",

View File

@@ -10,6 +10,7 @@ import { prisma } from "#lib/server/prisma.js";
import { getAnsichtsausweis } from "../ausweis.js"; import { getAnsichtsausweis } from "../ausweis.js";
import Mail from "nodemailer/lib/mailer/index.js"; import Mail from "nodemailer/lib/mailer/index.js";
import { shortenUID } from "#server/lib/hash.js"; import { shortenUID } from "#server/lib/hash.js";
import { getPaymentSuccessSubject } from "./helpers.js";
export async function sendPaymentSuccessMail( export async function sendPaymentSuccessMail(
ausweis: VerbrauchsausweisWohnen, ausweis: VerbrauchsausweisWohnen,
@@ -32,6 +33,11 @@ export async function sendPaymentSuccessMail(
let info: string = ""; let info: string = "";
const ausweisart = getAusweisartFromUUID(ausweis.uid); const ausweisart = getAusweisartFromUUID(ausweis.uid);
if (!ausweisart) {
return;
}
const attachments: Mail.Attachment[] = []; const attachments: Mail.Attachment[] = [];
const id = shortenUID(ausweis.uid) const id = shortenUID(ausweis.uid)
@@ -63,12 +69,12 @@ export async function sendPaymentSuccessMail(
info = info =
"Die Erstellung des Bedarfsausweises dauert momentan leider etwas länger. Bitte kontaktieren Sie uns in dringenden Fällen telefonisch (9 - 12 Uhr)."; "Die Erstellung des Bedarfsausweises dauert momentan leider etwas länger. Bitte kontaktieren Sie uns in dringenden Fällen telefonisch (9 - 12 Uhr).";
} }
await transport.sendMail({ await transport.sendMail({
attachments, attachments,
from: `"IBCornelsen" <info@online-energieausweis.org>`, from: `"IBCornelsen" <info@online-energieausweis.org>`,
to: user.email, to: user.email,
subject: `Bestellbestätigung vom IBCornelsen (ID: ${id})`, subject: getPaymentSuccessSubject(ausweis, rechnung, ausweisart),
cc: { cc: {
address: rechnung.email || "", address: rechnung.email || "",
name: rechnung.empfaenger || "", name: rechnung.empfaenger || "",

View File

@@ -113,7 +113,7 @@
/> />
</div> </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"> <div id="formular-box" class="formular-boxen ring-0">
<!-- A Prüfung der Ausweisart --> <!-- A Prüfung der Ausweisart -->
@@ -144,6 +144,7 @@
<textarea <textarea
class="rounded-e-none" class="rounded-e-none"
rows="10" rows="10"
data-cy="beschreibung"
bind:value={nachweis.beschreibung} bind:value={nachweis.beschreibung}
></textarea> ></textarea>

View File

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

View File

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