Cypress und API
@@ -1,17 +1,42 @@
|
||||
import { defineConfig } from "cypress";
|
||||
import dsv from "@rollup/plugin-dsv"
|
||||
|
||||
import { fileURLToPath } from "url";
|
||||
import vitePreprocessor from "cypress-vite";
|
||||
|
||||
export default defineConfig({
|
||||
e2e: {
|
||||
baseUrl: "http://localhost:3000",
|
||||
supportFile: false,
|
||||
viewportHeight: 900,
|
||||
viewportWidth: 1660,
|
||||
supportFile: false,
|
||||
specPattern: "./src/cypress/e2e/**/*.{ts,js}",
|
||||
setupNodeEvents(on, config) {
|
||||
on("file:preprocessor", vitePreprocessor({
|
||||
optimizeDeps: {
|
||||
exclude: ["@ibcornelsen/api", "@ibcornelsen/database"]
|
||||
},
|
||||
resolve: {
|
||||
alias: {
|
||||
"#": fileURLToPath(new URL("./src", import.meta.url)),
|
||||
"#components": fileURLToPath(new URL("./src/components", import.meta.url)),
|
||||
"#lib": fileURLToPath(new URL("./src/lib", import.meta.url))
|
||||
}
|
||||
},
|
||||
base: fileURLToPath(new URL("./src", import.meta.url)),
|
||||
build: {
|
||||
commonjsOptions: {
|
||||
transformMixedEsModules: false
|
||||
}
|
||||
},
|
||||
plugins: [dsv()]
|
||||
}))
|
||||
},
|
||||
},
|
||||
|
||||
component: {
|
||||
devServer: {
|
||||
framework: "svelte",
|
||||
bundler: "vite",
|
||||
},
|
||||
bundler: "vite"
|
||||
},
|
||||
}
|
||||
});
|
||||
|
||||
@@ -1,282 +0,0 @@
|
||||
import fuelList from "#components/Ausweis/brennstoffListe";
|
||||
import { faker } from "@faker-js/faker";
|
||||
import { Enums } from "@ibcornelsen/database/client";
|
||||
import "cypress-file-upload"
|
||||
|
||||
describe("Verbrauchsausweis erstellen Schritt 1", () => {
|
||||
it("erstellt einen neuen Verbrauchsausweis Wohngebäude.", () => {
|
||||
cy.visit("/energieausweis-erstellen/verbrauchsausweis-wohnen");
|
||||
|
||||
cy.wait(1000);
|
||||
|
||||
// Wir überprüfen, ob alle Ausstelgründe vorhanden sind, diese sollten genau so viele sein wie in der Datenbank vorhanden sind.
|
||||
cy.get("input[name='ausstellgrund']")
|
||||
.should("have.length", Object.values(Enums.Ausstellgrund).length)
|
||||
.eq(
|
||||
faker.number.int({
|
||||
min: 0,
|
||||
max: Object.values(Enums.Ausstellgrund).length - 1,
|
||||
})
|
||||
)
|
||||
.check();
|
||||
|
||||
// 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 }
|
||||
);
|
||||
|
||||
// Anzahl Einheiten
|
||||
cy.get("input[name='einheiten']")
|
||||
.should("have.attr", "type", "number")
|
||||
.type(faker.number.int({ min: 1, max: 5 }).toString());
|
||||
|
||||
// Sanierungsstatus
|
||||
cy.get("select[name='saniert']").select(
|
||||
Math.random() > 0.5 ? "true" : "false"
|
||||
);
|
||||
|
||||
// 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.
|
||||
|
||||
// Flaeche
|
||||
cy.get("input[name='flaeche']")
|
||||
.should("have.attr", "type", "number")
|
||||
.type(faker.number.int({ min: 50, max: 1000 }).toString());
|
||||
|
||||
// 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", Object.values(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", Object.values(Enums.Heizungsstatus).length).parent().select(faker.number.int({
|
||||
max: Object.values(Enums.Heizungsstatus).length,
|
||||
min: 1
|
||||
}));
|
||||
|
||||
// Brennstoff und Einheit 1
|
||||
const brennstoffKombo = fuelList[faker.number.int({ min: 0, max: fuelList.length - 1 })];
|
||||
|
||||
cy.get("select[name='brennstoff_1']").select(brennstoffKombo[0]);
|
||||
cy.get("select[name='einheit_1']").select(brennstoffKombo[1]);
|
||||
|
||||
// Verbrauchszeitraum
|
||||
cy.get("select[name='energieverbrauch_zeitraum_monat']").select(faker.number.int({ min: 1, max: 12 }).toString());
|
||||
cy.get("select[name='energieverbrauch_zeitraum_jahr']").select(faker.number.int({ min: 2018, max: 2019 }).toString());
|
||||
|
||||
// Verbrauch
|
||||
cy.get("input[name='verbrauch_1']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
|
||||
cy.get("input[name='verbrauch_2']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
|
||||
cy.get("input[name='verbrauch_3']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
|
||||
|
||||
|
||||
const zusaetzlicheHeizquelle = Math.random() > 0.5;
|
||||
|
||||
if (zusaetzlicheHeizquelle) {
|
||||
cy.get("input[name='zusaetzliche_heizquelle']").check();
|
||||
|
||||
// Brennstoff und Einheit 2
|
||||
const brennstoffKombo2 = fuelList[faker.number.int({ min: 0, max: fuelList.length - 1 })];
|
||||
|
||||
cy.get("select[name='brennstoff_2']").select(brennstoffKombo2[0]);
|
||||
cy.get("select[name='einheit_2']").select(brennstoffKombo2[1]);
|
||||
|
||||
// Verbrauch
|
||||
cy.get("input[name='verbrauch_4']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
|
||||
cy.get("input[name='verbrauch_5']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
|
||||
cy.get("input[name='verbrauch_6']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
|
||||
}
|
||||
|
||||
// Warmwasser enthalten und bekannt
|
||||
const warmwasserEnthalten = Math.random() > 0.5;
|
||||
const anteilBekannt = Math.random() > 0.5;
|
||||
|
||||
if (warmwasserEnthalten) {
|
||||
cy.get("input[name='warmwasser_enthalten']").check();
|
||||
|
||||
if (anteilBekannt) {
|
||||
// Der Anteil ist bekannt, wir müssen ihn also angeben.
|
||||
cy.get("input[name='warmwasser_anteil_bekannt']").check();
|
||||
|
||||
cy.get("input[name='anteil_warmwasser_1']").type(faker.number.int({ min: 0, max: 50 }).toString());
|
||||
|
||||
if (zusaetzlicheHeizquelle) {
|
||||
// Zusätzliche Heizquelle existiert, also müssen wir auch hier den Anteil angeben.
|
||||
cy.get("input[name='anteil_warmwasser_2']").type(faker.number.int({ min: 0, max: 50 }).toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Alternative Energieversorgungssysteme
|
||||
if (Math.random() > 0.5) cy.get("input[name='alternative_heizung']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='alternative_warmwasser']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='alternative_lueftung']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='alternative_kuehlung']").check();
|
||||
|
||||
// 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);
|
||||
});
|
||||
|
||||
// Gebäudeteil
|
||||
cy.get("select[name='gebaeudeteil']").then(($dropdown) => {
|
||||
const options = $dropdown.find('option');
|
||||
// Select the option at the random index
|
||||
cy.get("select[name='gebaeudeteil']").select(options.eq(faker.number.int({ min: 1, max: options.length - 1 })).val() as string);
|
||||
});
|
||||
|
||||
// Lüftung
|
||||
cy.get("select[name='lueftung']").then(($dropdown) => {
|
||||
const options = $dropdown.find('option');
|
||||
// Select the option at the random index
|
||||
cy.get("select[name='lueftung']").select(options.eq(faker.number.int({ min: 1, max: options.length - 1 })).val() as string);
|
||||
});
|
||||
|
||||
// Kühlung
|
||||
cy.get("select[name='kuehlung']").then(($dropdown) => {
|
||||
const options = $dropdown.find('option');
|
||||
// Select the option at the random index
|
||||
cy.get("select[name='kuehlung']").select(options.eq(faker.number.int({ min: 1, max: options.length - 1 })).val() as string);
|
||||
});
|
||||
|
||||
// Leerstand
|
||||
cy.get("input[name='leerstand']").should("have.attr", "type", "number").type(faker.number.int({ min: 0, max: 30 }).toString());
|
||||
|
||||
// Heizungsanlage Daten
|
||||
if (Math.random() > 0.5) cy.get("input[name='zentralheizung']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='einzelofen']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='durchlauf_erhitzer']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='standard_kessel']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='solarsystem_warmwasser']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='waermepumpe']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='niedertemperatur_kessel']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='brennwert_kessel']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='warmwasser_rohre_gedaemmt']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='heizungsrohre_gedaemmt']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='zirkulation']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='raum_temperatur_regler']").check();
|
||||
|
||||
// Heizungsanlage Bilder
|
||||
cy.get("input[name='heizung_image']").should("have.attr", "type", "file").attachFile("images/heizungsanlage/1.jpeg", { subjectType: "input" });
|
||||
cy.get("input[name='heizung_image']").should("have.attr", "type", "file").attachFile("images/heizungsanlage/2.jpeg", { subjectType: "input" });
|
||||
|
||||
// Fenster Daten
|
||||
if (Math.random() > 0.5) cy.get("input[name='einfach_verglasung']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='doppel_verglasung']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='isolier_verglasung']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='dreifach_verglasung']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='fenster_dicht']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='fenster_teilweise_undicht']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='tueren_dicht']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='tueren_undicht']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='rolllaeden_kaesten_gedaemmt']").check();
|
||||
|
||||
// Fenster Bilder
|
||||
cy.get("input[name='fenster_image']").should("have.attr", "type", "file").attachFile("images/fenster/1.jpeg", { subjectType: "input" });
|
||||
cy.get("input[name='fenster_image']").should("have.attr", "type", "file").attachFile("images/fenster/2.jpeg", { subjectType: "input" });
|
||||
|
||||
// Wärmedämmung Daten
|
||||
if (Math.random() > 0.5) cy.get("input[name='aussenwand_gedaemmt']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='keller_wand_gedaemmt']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='keller_decke_gedaemmt']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='dachgeschoss_gedaemmt']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='oberste_geschossdecke_gedaemmt']").check();
|
||||
if (Math.random() > 0.5) cy.get("input[name='oberste_geschossdecke_min_12cm_gedaemmt']").check();
|
||||
|
||||
// Wärmedämmung Bilder
|
||||
cy.get("input[name='daemmung_image']").should("have.attr", "type", "file").attachFile("images/daemmung/1.jpeg", { subjectType: "input" });
|
||||
cy.get("input[name='daemmung_image']").should("have.attr", "type", "file").attachFile("images/daemmung/2.jpeg", { subjectType: "input" });
|
||||
|
||||
// Gebäude Bild
|
||||
cy.get("input[name='gebaeude_image']").should("have.attr", "type", "file").attachFile("images/gebaeude/1.jpeg", { subjectType: "input" });
|
||||
|
||||
// Jetzt können wir den Verbrauchsausweis erstellen.
|
||||
cy.get("form[name='ausweis'] button[type='submit']").click({ force: true });
|
||||
|
||||
// Wir sind nicht eingeloggt also sollte jetzt ein Login Screen erscheinen.
|
||||
// Wir klicken auf registrieren und erstellen einen neuen Benutzer, danach loggen wir uns mit diesem ein.
|
||||
cy.get("button[name='registrieren']").click();
|
||||
|
||||
const email = faker.internet.email();
|
||||
const passwort = "test1234";
|
||||
const vorname = faker.person.firstName();
|
||||
const nachname = faker.person.lastName();
|
||||
|
||||
cy.get("form[name='signup'] input[name='email']").should("be.visible").should("have.attr", "type", "email").type(email);
|
||||
cy.get("form[name='signup'] input[name='passwort']").should("be.visible").should("have.attr", "type", "password").type(passwort);
|
||||
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'] button[type='submit']").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='login'] input[name='email']").should("be.visible").should("have.attr", "type", "email").should("contain.value", email);
|
||||
cy.get("form[name='login'] input[name='passwort']").should("be.visible").should("have.attr", "type", "password").type(passwort);
|
||||
|
||||
cy.get("form[name='login'] button[type='submit']").click();
|
||||
|
||||
// Der Ausweis sollte jetzt schon erstellt worden sein und wir sollten auf die kundendaten seite weitergeleitet worden sein.
|
||||
cy.url().should("contain", "/kundendaten");
|
||||
|
||||
cy.wait(1000)
|
||||
|
||||
// Wir füllen jetzt die Kundendaten aus.
|
||||
cy.get("select[name='anrede']").select(Math.random() > 0.5 ? "Herr" : "Frau");
|
||||
cy.get("input[name='vorname']").should("contain.value", vorname);
|
||||
cy.get("input[name='name']").should("contain.value", nachname);
|
||||
cy.get("input[name='email']").should("contain.value", email);
|
||||
cy.get("input[name='telefon']").type(faker.phone.number());
|
||||
|
||||
cy.get("input[name='rechnung_empfaenger']").type(`${vorname} ${nachname}`);
|
||||
cy.get("input[name='rechnung_strasse']").type(faker.location.streetAddress());
|
||||
// TODO: Random Plz generieren, allerdings muss die auch in der Datenbank vorhanden sein...
|
||||
cy.get("input[name='rechnung_plz']").type("2103");
|
||||
// Jetzt sollte der PLZ Container erscheinen, dort klicken wir einfach das erste Element an.
|
||||
cy.get("div[data-test='plz-container']").children().first().click();
|
||||
cy.get("input[name='rechnung_telefon']").type(faker.phone.number());
|
||||
cy.get("input[name='rechnung_email']").type(faker.internet.email());
|
||||
cy.get("button[data-test='paypal']").click();
|
||||
|
||||
// Datenschutz und AGB akzeptieren, dann schicken wir das Formular ab.
|
||||
cy.get("input[name='agb-akzeptieren']").check()
|
||||
cy.get("input[name='datenschutz-akzeptieren']").check()
|
||||
cy.get("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.
|
||||
})
|
||||
});
|
||||
});
|
||||
@@ -75,6 +75,7 @@
|
||||
"bun-types": "^1.1.45",
|
||||
"cypress": "^13.17.0",
|
||||
"cypress-file-upload": "^5.0.8",
|
||||
"cypress-vite": "^1.6.0",
|
||||
"daisyui": "^4.12.23",
|
||||
"eslint": "~8.15.0",
|
||||
"eslint-config-prettier": "8.1.0",
|
||||
|
||||
@@ -4,12 +4,13 @@ export const createCaller = createCallerFactory({
|
||||
"klimafaktoren": await import("../src/pages/api/klimafaktoren.ts"),
|
||||
"postleitzahlen": await import("../src/pages/api/postleitzahlen.ts"),
|
||||
"ticket": await import("../src/pages/api/ticket.ts"),
|
||||
"bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"),
|
||||
"aufnahme/[uid]": await import("../src/pages/api/aufnahme/[uid].ts"),
|
||||
"aufnahme": await import("../src/pages/api/aufnahme/index.ts"),
|
||||
"bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"),
|
||||
"auth/access-token": await import("../src/pages/api/auth/access-token.ts"),
|
||||
"auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"),
|
||||
"objekt": await import("../src/pages/api/objekt/index.ts"),
|
||||
"user": await import("../src/pages/api/user/index.ts"),
|
||||
"user/self": await import("../src/pages/api/user/self.ts"),
|
||||
"verbrauchsausweis-gewerbe": await import("../src/pages/api/verbrauchsausweis-gewerbe/index.ts"),
|
||||
"verbrauchsausweis-wohnen/[uid]": await import("../src/pages/api/verbrauchsausweis-wohnen/[uid].ts"),
|
||||
|
||||
@@ -13,8 +13,7 @@ export async function verbrauchsausweisWohnenSpeichern(
|
||||
ausweis: VerbrauchsausweisWohnenClient,
|
||||
objekt: ObjektClient,
|
||||
aufnahme: AufnahmeClient,
|
||||
images: (UploadedGebaeudeBild & { base64?: string })[],
|
||||
user: BenutzerClient
|
||||
bilder: (UploadedGebaeudeBild & { base64?: string })[]
|
||||
) {
|
||||
if (objekt.uid) {
|
||||
await api.objekt._uid.PATCH.fetch({
|
||||
@@ -87,6 +86,26 @@ export async function verbrauchsausweisWohnenSpeichern(
|
||||
})
|
||||
}
|
||||
|
||||
for (const bild of bilder) {
|
||||
if (bild.uid) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const response = await api.objekt._uid.bilder.PUT.fetch({
|
||||
base64: bild.base64,
|
||||
kategorie: bild.kategorie
|
||||
}, {
|
||||
params: {
|
||||
uid: objekt.uid
|
||||
},
|
||||
headers: {
|
||||
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
|
||||
}
|
||||
})
|
||||
|
||||
bild.uid = response.uid
|
||||
}
|
||||
|
||||
return {
|
||||
uid_ausweis: ausweis.uid,
|
||||
uid_aufnahme: aufnahme.uid,
|
||||
|
||||
@@ -7,6 +7,7 @@ import {
|
||||
VerbrauchsausweisGewerbe,
|
||||
VerbrauchsausweisWohnen,
|
||||
} from "@ibcornelsen/database/client";
|
||||
import { z, ZodSchema } from "zod";
|
||||
|
||||
type OmitKeys<T, K extends keyof T> = Omit<T, K>;
|
||||
|
||||
@@ -78,6 +79,14 @@ export type ObjektClient = OmitKeys<Objekt, "benutzer_id" | "id">;
|
||||
export type AufnahmeClient = OmitKeys<
|
||||
Aufnahme,
|
||||
"id" | "objekt_id" | "benutzer_id"
|
||||
>;
|
||||
> & {
|
||||
uid_objekt: string
|
||||
};
|
||||
|
||||
export type BenutzerClient = OmitKeys<Benutzer, "id" | "passwort">;
|
||||
|
||||
type ZodOverlapType<T> = z.ZodType<T, z.ZodTypeDef, T>;
|
||||
|
||||
export function ZodOverlap<T, S = z.ZodType<T, z.ZodTypeDef, T>>(arg: S): S {
|
||||
return arg;
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
---
|
||||
const currentYear = new Date().getFullYear();
|
||||
---
|
||||
|
||||
<div class="flex flex-row justify-between px-4 items-center bg-primary py-2 mt-auto">
|
||||
<a class="text-white font-medium text-lg" href="/impressum">Impressum und Datenschutz</a>
|
||||
<a class="text-white font-medium text-lg" href="/">© {currentYear} IB Cornelsen Hamburg.</a>
|
||||
</div>
|
||||
@@ -1,67 +0,0 @@
|
||||
---
|
||||
import { validateAccessTokenServer } from "#server/lib/validateAccessToken";
|
||||
import ThemeController from "./ThemeController.svelte";
|
||||
|
||||
const valid = await validateAccessTokenServer(Astro)
|
||||
|
||||
const lightTheme = Astro.cookies.get("theme")?.value === "light";
|
||||
---
|
||||
|
||||
<header>
|
||||
<a class="hidden md:block w-full h-48 bg-base-200" href="/">
|
||||
<img
|
||||
src="/images/header/header-bg.jpg"
|
||||
class="w-full h-full object-cover"
|
||||
alt="Hintergrund - Rollen Architektenpapier"
|
||||
/>
|
||||
<img
|
||||
src="/images/header/logo-big.svg"
|
||||
class="absolute top-4 right-0 w-[464px]"
|
||||
alt="IBCornelsen - Logo"
|
||||
/>
|
||||
<h2
|
||||
class="text-secondary font-semibold text-2xl absolute top-8 right-4"
|
||||
>
|
||||
Energieausweis online erstellen
|
||||
</h2>
|
||||
<h2
|
||||
class="text-primary font-semibold text-xl absolute top-16 right-4"
|
||||
>
|
||||
Energieausweise nach aktueller GEG
|
||||
</h2>
|
||||
</a>
|
||||
|
||||
<div class="px-4 flex flex-row w-full md:justify-end items-center bg-primary">
|
||||
<a
|
||||
class="header-button hidden md:block"
|
||||
href="/energieausweis-erstellen/verbrauchsausweis-erstellen"
|
||||
>Energieausweis erstellen</a
|
||||
>
|
||||
<a class="header-button hidden md:block" href="/kontakt"
|
||||
>Kontakt</a
|
||||
>
|
||||
<a class="header-button hidden md:block" href="/agb">AGB</a>
|
||||
{
|
||||
valid ? (
|
||||
<a class="header-button" href="/dashboard">
|
||||
Profil
|
||||
</a>
|
||||
) : (
|
||||
<a class="header-button" href="/auth/login">
|
||||
Login
|
||||
</a>
|
||||
)
|
||||
}
|
||||
<ThemeController lightTheme={lightTheme} client:load />
|
||||
<a class="hamburger_menu"
|
||||
><img src="/images/hamburger.png" width="22" alt="hamburger" /></a
|
||||
>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
|
||||
<style>
|
||||
.header-button {
|
||||
@apply px-4 py-2 text-primary-content font-medium text-lg tracking-normal hover:bg-secondary h-full;
|
||||
}
|
||||
</style>
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
import CardNavigation from "#components/design/sidebars/cards/cardNavigation.svelte";
|
||||
import NavigationCard from "#components/design/sidebars/cards/NavigationCard.svelte";
|
||||
import CardPriceiInfo from "#components/design/sidebars/cards/cardPriceiInfo.svelte";
|
||||
import CardProduktSidebar from "#components/design/sidebars/cards/CardProduktSidebar.svelte";
|
||||
|
||||
@@ -9,7 +9,7 @@ import { PRICES } from "#lib/constants";
|
||||
|
||||
<div class="">
|
||||
|
||||
<CardNavigation client:load/>
|
||||
<NavigationCard client:load/>
|
||||
|
||||
<CardProduktSidebar art="Verbrauchsausweis Gewerbe" price={PRICES.VerbrauchsausweisGewerbe[0]}></CardProduktSidebar>
|
||||
<CardPriceiInfo />
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
import CardContact from "#components/design/sidebars/cards/cardContact.svelte";
|
||||
import CardContact from "#components/design/sidebars/cards/ContactCard.svelte";
|
||||
import CardPriceiInfo from "#components/design/sidebars/cards/cardPriceiInfo.svelte";
|
||||
import CardProduktSidebar from "#components/design/sidebars/cards/CardProduktSidebar.svelte";
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<div id ="cardContact" class="box card">
|
||||
<div class="box card">
|
||||
|
||||
<div class="grid grid-cols-[max-content,1fr] gap-x-2 border-b-[1px] pb-2 mb-4">
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
</script>
|
||||
|
||||
<div
|
||||
id="cardLogin"
|
||||
class="box card"
|
||||
>
|
||||
<div class="grid">
|
||||
455
src/components/design/sidebars/cards/NavigationCard.svelte
Normal file
@@ -0,0 +1,455 @@
|
||||
<script lang="ts">
|
||||
let innerWidth: number;
|
||||
|
||||
function dropdown() {
|
||||
if (innerWidth < 1024) {
|
||||
const check_element = this.lastChild;
|
||||
|
||||
const rotate_list = document.querySelectorAll(".dd-symbol-clone");
|
||||
const rotate_element = this.childNodes[0].children[0];
|
||||
|
||||
var first_check = check_element.classList.contains(
|
||||
"show-dropdown-content"
|
||||
);
|
||||
const nodeList = document.querySelectorAll(".dropdown-content");
|
||||
|
||||
if (first_check == true) {
|
||||
check_element.classList.remove("show-dropdown-content");
|
||||
rotate_element.classList.toggle("rotate-symbol");
|
||||
} else {
|
||||
for (let i = 0; i < nodeList.length; i++) {
|
||||
const element = nodeList[i];
|
||||
element.classList.remove("show-dropdown-content");
|
||||
}
|
||||
for (let i = 0; i < rotate_list.length; i++) {
|
||||
const element = rotate_list[i];
|
||||
element.classList.remove("rotate-symbol");
|
||||
}
|
||||
|
||||
check_element.classList.add("show-dropdown-content");
|
||||
rotate_element.classList.add("rotate-symbol");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function hover() {
|
||||
if (innerWidth > 1024) {
|
||||
const check_element = this.firstChild.lastChild;
|
||||
check_element.style.visibility = "visible";
|
||||
}
|
||||
}
|
||||
|
||||
function hoverout() {
|
||||
if (innerWidth > 1024) {
|
||||
const check_element = this.firstChild.lastChild;
|
||||
check_element.style.visibility = "hidden";
|
||||
}
|
||||
}
|
||||
|
||||
function hamburger() {
|
||||
const nodeList = document.querySelectorAll(".dropdown-content");
|
||||
for (let i = 0; i < nodeList.length; i++) {
|
||||
nodeList[i].classList.remove("show-dropdown-content");
|
||||
}
|
||||
var element = document.getElementById("cardNavigation");
|
||||
element.classList.toggle("hidden");
|
||||
|
||||
const spans = this.children;
|
||||
var first_check = spans[0].classList.contains("hamburger-swing-0");
|
||||
|
||||
if (first_check == true) {
|
||||
for (let i = 0; i < spans.length; i++) {
|
||||
spans[i].classList.remove("hamburger-swing-" + i);
|
||||
}
|
||||
const rotate_list = document.querySelectorAll(".dd-symbol");
|
||||
for (let i = 0; i < rotate_list.length; i++) {
|
||||
rotate_list[i].classList.remove("rotate-symbol");
|
||||
}
|
||||
} else {
|
||||
for (let i = 0; i < spans.length; i++) {
|
||||
spans[i].classList.add("hamburger-swing-" + i);
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<svelte:window bind:innerWidth />
|
||||
|
||||
<div
|
||||
class="hamburger_menu py-1 px-2 bg-secondary
|
||||
xs:px-4
|
||||
lg:hidden"
|
||||
>
|
||||
<div
|
||||
id="hamburger"
|
||||
on:click={hamburger}
|
||||
on:keydown={hamburger}
|
||||
class="cursor-pointer"
|
||||
>
|
||||
<span></span>
|
||||
<span></span>
|
||||
<span></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<nav
|
||||
id="cardNavigation"
|
||||
class="cardNavigation box hidden relative ring-0 md:ring-2 ring-primary/50 rounded-tr-none lg:block mb-0 lg:mb-5"
|
||||
>
|
||||
<div class="nav-element bg-secondary/5 py-1 pl-2 text-xs font-bold">
|
||||
Jetzt bestellen
|
||||
</div>
|
||||
|
||||
<div class="nav-element">
|
||||
<a class="no-dropdown nav-element-child" href="/welcher-energieausweis/"
|
||||
>Welcher Energieausweis?</a
|
||||
>
|
||||
</div>
|
||||
|
||||
<!-- svelte-ignore a11y-mouse-events-have-key-events -->
|
||||
<div
|
||||
class="nav-element dropdown lg:dropdown-right"
|
||||
on:click={dropdown}
|
||||
on:keydown={dropdown}
|
||||
on:mouseover={hover}
|
||||
on:mouseleave={hoverout}
|
||||
>
|
||||
{#if innerWidth > 1023}
|
||||
<a href={undefined} class="nav-element-child"
|
||||
>Energieausweis erstellen<span class="dd-symbol-clone">❯</span
|
||||
><span class="dd-symbol">❯</span></a
|
||||
>
|
||||
{:else}
|
||||
<a href={undefined} class="nav-element-child"
|
||||
>Energieausweis erstellen<span class="dd-symbol-clone">❯</span
|
||||
><span class="dd-symbol">❯</span></a
|
||||
>
|
||||
{/if}
|
||||
|
||||
<ul class="dropdown-content energieasusweis-erstellen">
|
||||
{#if innerWidth < 1023}
|
||||
<li>
|
||||
<a href="/energieausweis-erstellen"
|
||||
>Energieausweis erstellen</a
|
||||
>
|
||||
</li>
|
||||
{/if}
|
||||
<li>
|
||||
<a
|
||||
href="/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/"
|
||||
>Verbrauchsausweis erstellen</a
|
||||
>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/energieausweis-erstellen/bedarfsausweis-wohngebaeude/"
|
||||
>Bedarfsausweis erstellen</a
|
||||
>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/energieausweis-erstellen/verbrauchsausweis-gewerbe/"
|
||||
>Verbrauchsausweis Gewerbe erstellen</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<!-- svelte-ignore a11y-mouse-events-have-key-events -->
|
||||
<div
|
||||
class="nav-element dropdown lg:dropdown-right"
|
||||
on:click={dropdown}
|
||||
on:keydown={dropdown}
|
||||
on:mouseover={hover}
|
||||
on:mouseleave={hoverout}
|
||||
>
|
||||
{#if innerWidth > 1023}
|
||||
<a href={undefined} class="nav-element-child"
|
||||
>Angebot anfragen<span class="dd-symbol-clone">❯</span><span
|
||||
class="dd-symbol">❯</span
|
||||
></a
|
||||
>
|
||||
{:else}
|
||||
<a href={undefined} class="nav-element-child"
|
||||
>Angebot anfragen<span class="dd-symbol-clone">❯</span><span
|
||||
class="dd-symbol">❯</span
|
||||
></a
|
||||
>
|
||||
{/if}
|
||||
|
||||
<ul class="dropdown-content angebot-anfragen">
|
||||
{#if innerWidth < 1023}
|
||||
<li>
|
||||
<a href="/energieausweis-erstellen">Angebot anfragen</a>
|
||||
</li>
|
||||
{/if}
|
||||
<li>
|
||||
<a
|
||||
href="/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/"
|
||||
>Bedarfsausweis Gewerbe anfragen</a
|
||||
>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/energieausweis-erstellen/bedarfsausweis-wohngebaeude/"
|
||||
>GEG Nachweis Wohnen anfragen</a
|
||||
>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/energieausweis-erstellen/verbrauchsausweis-gewerbe/"
|
||||
>GEG Nachweis Gewerbe anfragen</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="nav-element">
|
||||
<a class="no-dropdown nav-element-child" href="/sanierungsfahrplan"
|
||||
>Sanierungsfahrplan (iSFP)</a
|
||||
>
|
||||
</div>
|
||||
|
||||
<div class="nav-element bg-secondary/5 py-1 pl-2 text-xs font-bold">
|
||||
Produkte & Preise
|
||||
</div>
|
||||
|
||||
<!-- svelte-ignore a11y-mouse-events-have-key-events -->
|
||||
<div
|
||||
class="nav-element dropdown lg:dropdown-right"
|
||||
on:click={dropdown}
|
||||
on:keydown={dropdown}
|
||||
on:mouseover={hover}
|
||||
on:mouseleave={hoverout}
|
||||
>
|
||||
<a href={undefined} class="nav-element-child"
|
||||
>Verbrauchsausweis<span class="dd-symbol-clone">❯</span><span
|
||||
class="dd-symbol">❯</span
|
||||
></a
|
||||
>
|
||||
<ul class="dropdown-content verbrauchsausweis">
|
||||
{#if innerWidth < 1023}
|
||||
<li><a href="index">Verbrauchsausweis</a></li>
|
||||
{/if}
|
||||
<li><a href="index">Verbrauchsausweis Wohngebäude</a></li>
|
||||
<li><a href="index">Verbrauchsausweis online erstellen</a></li>
|
||||
<li><a href="index">Häufige Fragen zum Verbrauchsausweis</a></li>
|
||||
<li>
|
||||
<a href="index">Statistiken zum Verbrauchsausweis Wohngebäude</a
|
||||
>
|
||||
</li>
|
||||
<li><a href="index">Verbrauchsausweis Gewerbe</a></li>
|
||||
<li>
|
||||
<a href="index">Verbrauchsausweis Gewerbe online erstellen</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="index">Häufige Fragen zum Verbrauchsausweis Gewerbe</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="index">Statistiken zum Verbrauchsausweis Gewerbe</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<!-- svelte-ignore a11y-mouse-events-have-key-events -->
|
||||
<div
|
||||
class="nav-element dropdown lg:dropdown-right"
|
||||
on:click={dropdown}
|
||||
on:keydown={dropdown}
|
||||
on:mouseover={hover}
|
||||
on:mouseleave={hoverout}
|
||||
>
|
||||
<a href={undefined} class="nav-element-child"
|
||||
>Bedarfsausweis<span class="dd-symbol-clone">❯</span><span
|
||||
class="dd-symbol">❯</span
|
||||
></a
|
||||
>
|
||||
<ul class="dropdown-content bedarfsausweis">
|
||||
{#if innerWidth < 1023}
|
||||
<li><a href="index">Bedarfsausweis</a></li>
|
||||
{/if}
|
||||
<li><a href="index">Bedarfsausweis Wohngebäude</a></li>
|
||||
<li><a href="index">Bedarfsausweis online erstellen</a></li>
|
||||
<li><a href="index">Häufige Fragen zum Bedarfsausweis</a></li>
|
||||
<li>
|
||||
<a href="index">Statistiken zum Bedarfsausweis Wohngebäude</a>
|
||||
</li>
|
||||
<li><a href="index">Bedarfsausweis Gewerbe</a></li>
|
||||
<li><a href="index">Bedarfsausweis Gewerbe online erstellen</a></li>
|
||||
<li>
|
||||
<a href="index">Häufige Fragen zum Bedarfsausweis Gewerbe</a>
|
||||
</li>
|
||||
<li><a href="index">Statistiken zum Bedarfsausweis Gewerbe</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="nav-element">
|
||||
<a class="no-dropdown nav-element-child" href="/sanierungsfahrplan"
|
||||
>Sanierungsfahrplan</a
|
||||
>
|
||||
</div>
|
||||
|
||||
<!-- svelte-ignore a11y-mouse-events-have-key-events -->
|
||||
<div
|
||||
class="nav-element dropdown lg:dropdown-right"
|
||||
on:click={dropdown}
|
||||
on:keydown={dropdown}
|
||||
on:mouseover={hover}
|
||||
on:mouseleave={hoverout}
|
||||
>
|
||||
<a href={undefined} class="nav-element-child"
|
||||
>Energieausweis<span class="dd-symbol-clone">❯</span><span
|
||||
class="dd-symbol">❯</span
|
||||
></a
|
||||
>
|
||||
<ul class="dropdown-content energieausweis">
|
||||
{#if innerWidth < 1023}
|
||||
<li><a href="index">Energieausweis</a></li>
|
||||
{/if}
|
||||
<li><a href="index">Energieausweis Pflicht</a></li>
|
||||
<li><a href="index">Energieausweis Kosten</a></li>
|
||||
<li><a href="index">Energieausweis Haus</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="nav-element">
|
||||
<a
|
||||
class="no-dropdown nav-element-child"
|
||||
href="/energieausweis-aussteller">Energieberater finden</a
|
||||
>
|
||||
</div>
|
||||
|
||||
<div class="nav-element bg-secondary/5 py-1 pl-2 text-xs font-bold">
|
||||
FAQ & Hilfe
|
||||
</div>
|
||||
|
||||
<!-- svelte-ignore a11y-mouse-events-have-key-events -->
|
||||
<div
|
||||
class="nav-element dropdown lg:dropdown-right"
|
||||
on:click={dropdown}
|
||||
on:keydown={dropdown}
|
||||
on:mouseover={hover}
|
||||
on:mouseleave={hoverout}
|
||||
>
|
||||
{#if innerWidth > 1023}
|
||||
<a href="/bestellprozess-energieausweis" class="nav-element-child"
|
||||
>Bestellprozess Energieausweis<span class="dd-symbol-clone"
|
||||
>❯</span
|
||||
><span class="dd-symbol">❯</span></a
|
||||
>
|
||||
{:else}
|
||||
<a href="/bestellprozess-energieausweis" class="nav-element-child"
|
||||
>Bestellprozess Energieausweis<span class="dd-symbol-clone"
|
||||
>❯</span
|
||||
><span class="dd-symbol">❯</span></a
|
||||
>
|
||||
{/if}
|
||||
|
||||
<ul class="dropdown-content bestellprozess-energieausweis">
|
||||
{#if innerWidth < 1023}
|
||||
<li>
|
||||
<a href="/bestellprozess-energieausweis"
|
||||
>Bestellprozess Energieausweis</a
|
||||
>
|
||||
</li>
|
||||
{/if}
|
||||
<li>
|
||||
<a
|
||||
href="/bestellprozess-energieausweis/merkblatt-verbrauchsausweis-wohnen/"
|
||||
>Merkblatt Verbrauchsausweis Wohnen</a
|
||||
>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/energieausweis-erstellen/bedarfsausweis-wohngebaeude/"
|
||||
>Merkblatt Bedarfsausweis Wohnen</a
|
||||
>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/energieausweis-erstellen/verbrauchsausweis-gewerbe/"
|
||||
>Merkblatt Verbrauchsausweis Gewerbe</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="nav-element">
|
||||
<a class="no-dropdown nav-element-child" href="/geg/"
|
||||
>Gebäudeenergiegesetz (GEG)</a
|
||||
>
|
||||
</div>
|
||||
|
||||
<div class="nav-element">
|
||||
<a class="no-dropdown nav-element-child" href="/enev-zusammenfassung/"
|
||||
>EnEV Zusammenfassung - Archiv</a
|
||||
>
|
||||
</div>
|
||||
|
||||
<div class="nav-element">
|
||||
<a class="no-dropdown nav-element-child" href="/faq/">FAQ</a>
|
||||
</div>
|
||||
|
||||
<div class="nav-element">
|
||||
<a class="no-dropdown nav-element-child" href="/glossar/">Glossar</a>
|
||||
</div>
|
||||
|
||||
<div class="nav-element">
|
||||
<a class="no-dropdown nav-element-child" href="/kundenbewertungen/"
|
||||
>Kundenbewertungen</a
|
||||
>
|
||||
</div>
|
||||
<div class="nav-element">
|
||||
<a
|
||||
class="no-dropdown nav-element-child lg:!rounded-b-lg xl:!rounded-b-xl"
|
||||
href="/fuer-entwickler/">Für Entwickler</a
|
||||
>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<style lang="scss">
|
||||
.dd-symbol::before {
|
||||
content: "❯";
|
||||
font-size: 0.95rem;
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
left: -7px;
|
||||
animation-name: flim;
|
||||
animation-duration: 2s;
|
||||
animation-iteration-count: infinite;
|
||||
}
|
||||
|
||||
.dd-symbol {
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
.dd-symbol::after {
|
||||
content: "❯";
|
||||
font-size: 0.95rem;
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
right: -7px;
|
||||
animation-name: flim;
|
||||
animation-duration: 2s;
|
||||
animation-delay: 1s;
|
||||
animation-iteration-count: infinite;
|
||||
}
|
||||
|
||||
@keyframes flim {
|
||||
0% {
|
||||
opacity: 0;
|
||||
}
|
||||
16.66% {
|
||||
opacity: 0.25;
|
||||
}
|
||||
33.32% {
|
||||
opacity: 0.5;
|
||||
}
|
||||
49.98% {
|
||||
opacity: 0.75;
|
||||
}
|
||||
66.64% {
|
||||
opacity: 0.5;
|
||||
}
|
||||
83.33% {
|
||||
opacity: 0.25;
|
||||
}
|
||||
100% {
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,286 +0,0 @@
|
||||
<script>
|
||||
|
||||
let innerWidth
|
||||
|
||||
function dropdown(){
|
||||
|
||||
const innerWidth = window.innerWidth;
|
||||
if(innerWidth<1024){
|
||||
|
||||
const check_element = this.lastChild;
|
||||
|
||||
const rotate_list = document.querySelectorAll(".dd-symbol-clone");
|
||||
const rotate_element = this.childNodes[0].children[0];
|
||||
|
||||
var first_check = check_element.classList.contains("show-dropdown-content");
|
||||
const nodeList = document.querySelectorAll(".dropdown-content");
|
||||
|
||||
if(first_check == true){
|
||||
check_element.classList.remove("show-dropdown-content");
|
||||
rotate_element.classList.toggle("rotate-symbol");
|
||||
|
||||
}else{
|
||||
for (let i = 0; i < nodeList.length; i++) {
|
||||
const element = nodeList[i];
|
||||
element.classList.remove("show-dropdown-content");
|
||||
|
||||
}
|
||||
for (let i = 0; i < rotate_list.length; i++) {
|
||||
const element = rotate_list[i];
|
||||
element.classList.remove("rotate-symbol");
|
||||
}
|
||||
|
||||
check_element.classList.add("show-dropdown-content");
|
||||
rotate_element.classList.add("rotate-symbol");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function hover(){
|
||||
const innerWidth = window.innerWidth;
|
||||
if(innerWidth>1024){
|
||||
const check_element = this.firstChild.lastChild;
|
||||
check_element.style.visibility = "visible";
|
||||
}
|
||||
}
|
||||
|
||||
function hoverout(){
|
||||
const innerWidth = window.innerWidth;
|
||||
if(innerWidth>1024){
|
||||
const check_element = this.firstChild.lastChild;
|
||||
check_element.style.visibility = "hidden";
|
||||
}
|
||||
}
|
||||
|
||||
function hamburger(){
|
||||
const nodeList = document.querySelectorAll(".dropdown-content");
|
||||
for (let i = 0; i < nodeList.length; i++) {
|
||||
nodeList[i].classList.remove("show-dropdown-content");}
|
||||
var element = document.getElementById("cardNavigation");
|
||||
element.classList.toggle("hidden");
|
||||
|
||||
const spans = this.children;
|
||||
var first_check = spans[0].classList.contains("hamburger-swing-0");
|
||||
|
||||
if(first_check == true){
|
||||
for (let i = 0; i < spans.length; i++)
|
||||
{spans[i].classList.remove("hamburger-swing-"+i);}
|
||||
const rotate_list = document.querySelectorAll(".dd-symbol");
|
||||
for (let i = 0; i < rotate_list.length; i++)
|
||||
{rotate_list[i].classList.remove("rotate-symbol");}
|
||||
}else{
|
||||
for (let i = 0; i < spans.length; i++)
|
||||
{spans[i].classList.add("hamburger-swing-"+i);} }
|
||||
}
|
||||
</script>
|
||||
|
||||
<svelte:window bind:innerWidth />
|
||||
|
||||
|
||||
<div class="hamburger_menu py-1 px-2 bg-secondary
|
||||
xs:px-4
|
||||
lg:hidden">
|
||||
|
||||
<div id="hamburger" on:click={hamburger} on:keydown={hamburger} class="cursor-pointer">
|
||||
<span></span>
|
||||
<span></span>
|
||||
<span></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<nav id="cardNavigation" class="cardNavigation box hidden relative ring-0 md:ring-2 ring-primary/50 rounded-tr-none lg:block mb-0 lg:mb-5">
|
||||
|
||||
<div class="nav-element bg-secondary/5 py-1 pl-2 text-xs font-bold">Jetzt bestellen</div>
|
||||
|
||||
<div class="nav-element">
|
||||
<a class="no-dropdown nav-element-child" href="/welcher-energieausweis/">Welcher Energieausweis?</a>
|
||||
</div>
|
||||
|
||||
<!-- svelte-ignore a11y-mouse-events-have-key-events -->
|
||||
<div class="nav-element dropdown lg:dropdown-right" on:click={dropdown} on:keydown={dropdown} on:mouseover={hover} on:mouseleave={hoverout}>
|
||||
{#if innerWidth > 1023}
|
||||
<a href={undefined} class="nav-element-child" >Energieausweis erstellen<span class="dd-symbol-clone">❯</span><span class="dd-symbol">❯</span></a>
|
||||
{:else}
|
||||
<a href={undefined} class="nav-element-child">Energieausweis erstellen<span class="dd-symbol-clone">❯</span><span class="dd-symbol">❯</span></a>
|
||||
{/if}
|
||||
|
||||
<ul class="dropdown-content energieasusweis-erstellen">
|
||||
{#if innerWidth < 1023}
|
||||
<li><a href="/energieausweis-erstellen">Energieausweis erstellen</a></li>
|
||||
{/if}
|
||||
<li><a href="/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/">Verbrauchsausweis erstellen</a></li>
|
||||
<li><a href="/energieausweis-erstellen/bedarfsausweis-wohngebaeude/">Bedarfsausweis erstellen</a></li>
|
||||
<li><a href="/energieausweis-erstellen/verbrauchsausweis-gewerbe/">Verbrauchsausweis Gewerbe erstellen</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<!-- svelte-ignore a11y-mouse-events-have-key-events -->
|
||||
<div class="nav-element dropdown lg:dropdown-right" on:click={dropdown} on:keydown={dropdown} on:mouseover={hover} on:mouseleave={hoverout}>
|
||||
{#if innerWidth > 1023}
|
||||
<a href={undefined} class="nav-element-child" >Angebot anfragen<span class="dd-symbol-clone">❯</span><span class="dd-symbol">❯</span></a>
|
||||
{:else}
|
||||
<a href={undefined} class="nav-element-child">Angebot anfragen<span class="dd-symbol-clone">❯</span><span class="dd-symbol">❯</span></a>
|
||||
{/if}
|
||||
|
||||
<ul class="dropdown-content angebot-anfragen">
|
||||
{#if innerWidth < 1023}
|
||||
<li><a href="/energieausweis-erstellen">Angebot anfragen</a></li>
|
||||
{/if}
|
||||
<li><a href="/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/">Bedarfsausweis Gewerbe anfragen</a></li>
|
||||
<li><a href="/energieausweis-erstellen/bedarfsausweis-wohngebaeude/">GEG Nachweis Wohnen anfragen</a></li>
|
||||
<li><a href="/energieausweis-erstellen/verbrauchsausweis-gewerbe/">GEG Nachweis Gewerbe anfragen</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="nav-element">
|
||||
<a class="no-dropdown nav-element-child" href="/sanierungsfahrplan">Sanierungsfahrplan (iSFP)</a>
|
||||
</div>
|
||||
|
||||
<div class="nav-element bg-secondary/5 py-1 pl-2 text-xs font-bold">Produkte & Preise</div>
|
||||
|
||||
<!-- svelte-ignore a11y-mouse-events-have-key-events -->
|
||||
<div class="nav-element dropdown lg:dropdown-right" on:click={dropdown} on:keydown={dropdown} on:mouseover={hover} on:mouseleave={hoverout}>
|
||||
<a href={undefined} class="nav-element-child">Verbrauchsausweis<span class="dd-symbol-clone">❯</span><span class="dd-symbol">❯</span></a>
|
||||
<ul class="dropdown-content verbrauchsausweis">
|
||||
{#if innerWidth < 1023}
|
||||
<li><a href="index">Verbrauchsausweis</a></li>
|
||||
{/if}
|
||||
<li><a href="index">Verbrauchsausweis Wohngebäude</a></li>
|
||||
<li><a href="index">Verbrauchsausweis online erstellen</a></li>
|
||||
<li><a href="index">Häufige Fragen zum Verbrauchsausweis</a></li>
|
||||
<li><a href="index">Statistiken zum Verbrauchsausweis Wohngebäude</a></li>
|
||||
<li><a href="index">Verbrauchsausweis Gewerbe</a></li>
|
||||
<li><a href="index">Verbrauchsausweis Gewerbe online erstellen</a></li>
|
||||
<li><a href="index">Häufige Fragen zum Verbrauchsausweis Gewerbe</a></li>
|
||||
<li><a href="index">Statistiken zum Verbrauchsausweis Gewerbe</a></li>
|
||||
</div>
|
||||
|
||||
<!-- svelte-ignore a11y-mouse-events-have-key-events -->
|
||||
<div class="nav-element dropdown lg:dropdown-right" on:click={dropdown} on:keydown={dropdown} on:mouseover={hover} on:mouseleave={hoverout}>
|
||||
<a href={undefined} class="nav-element-child">Bedarfsausweis<span class="dd-symbol-clone">❯</span><span class="dd-symbol">❯</span></a>
|
||||
<ul class="dropdown-content bedarfsausweis">
|
||||
{#if innerWidth < 1023}
|
||||
<li><a href="index">Bedarfsausweis</a></li>
|
||||
{/if}
|
||||
<li><a href="index">Bedarfsausweis Wohngebäude</a></li>
|
||||
<li><a href="index">Bedarfsausweis online erstellen</a></li>
|
||||
<li><a href="index">Häufige Fragen zum Bedarfsausweis</a></li>
|
||||
<li><a href="index">Statistiken zum Bedarfsausweis Wohngebäude</a></li>
|
||||
<li><a href="index">Bedarfsausweis Gewerbe</a></li>
|
||||
<li><a href="index">Bedarfsausweis Gewerbe online erstellen</a></li>
|
||||
<li><a href="index">Häufige Fragen zum Bedarfsausweis Gewerbe</a></li>
|
||||
<li><a href="index">Statistiken zum Bedarfsausweis Gewerbe</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="nav-element">
|
||||
<a class="no-dropdown nav-element-child" href="/sanierungsfahrplan">Sanierungsfahrplan</a>
|
||||
</div>
|
||||
|
||||
<!-- svelte-ignore a11y-mouse-events-have-key-events -->
|
||||
<div class="nav-element dropdown lg:dropdown-right" on:click={dropdown} on:keydown={dropdown} on:mouseover={hover} on:mouseleave={hoverout}>
|
||||
<a href={undefined} class="nav-element-child">Energieausweis<span class="dd-symbol-clone">❯</span><span class="dd-symbol">❯</span></a>
|
||||
<ul class="dropdown-content energieausweis">
|
||||
{#if innerWidth < 1023}
|
||||
<li><a href="index">Energieausweis</a></li>
|
||||
{/if}
|
||||
<li><a href="index">Energieausweis Pflicht</a></li>
|
||||
<li><a href="index">Energieausweis Kosten</a></li>
|
||||
<li><a href="index">Energieausweis Haus</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="nav-element">
|
||||
<a class="no-dropdown nav-element-child" href="/energieausweis-aussteller">Energieberater finden</a>
|
||||
</div>
|
||||
|
||||
<div class="nav-element bg-secondary/5 py-1 pl-2 text-xs font-bold">FAQ & Hilfe</div>
|
||||
|
||||
<!-- svelte-ignore a11y-mouse-events-have-key-events -->
|
||||
<div class="nav-element dropdown lg:dropdown-right" on:click={dropdown} on:keydown={dropdown} on:mouseover={hover} on:mouseleave={hoverout}>
|
||||
{#if innerWidth > 1023}
|
||||
<a href="/bestellprozess-energieausweis" class="nav-element-child" >Bestellprozess Energieausweis<span class="dd-symbol-clone">❯</span><span class="dd-symbol">❯</span></a>
|
||||
{:else}
|
||||
<a href="/bestellprozess-energieausweis" class="nav-element-child">Bestellprozess Energieausweis<span class="dd-symbol-clone">❯</span><span class="dd-symbol">❯</span></a>
|
||||
{/if}
|
||||
|
||||
<ul class="dropdown-content bestellprozess-energieausweis">
|
||||
{#if innerWidth < 1023}
|
||||
<li><a href="/bestellprozess-energieausweis">Bestellprozess Energieausweis</a></li>
|
||||
{/if}
|
||||
<li><a href="/bestellprozess-energieausweis/merkblatt-verbrauchsausweis-wohnen/">Merkblatt Verbrauchsausweis Wohnen</a></li>
|
||||
<li><a href="/energieausweis-erstellen/bedarfsausweis-wohngebaeude/">Merkblatt Bedarfsausweis Wohnen</a></li>
|
||||
<li><a href="/energieausweis-erstellen/verbrauchsausweis-gewerbe/">Merkblatt Verbrauchsausweis Gewerbe</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="nav-element">
|
||||
<a class="no-dropdown nav-element-child" href="/geg/">Gebäudeenergiegesetz (GEG)</a>
|
||||
</div>
|
||||
|
||||
<div class="nav-element">
|
||||
<a class="no-dropdown nav-element-child" href="/enev-zusammenfassung/">EnEV Zusammenfassung - Archiv</a>
|
||||
</div>
|
||||
|
||||
<div class="nav-element">
|
||||
<a class="no-dropdown nav-element-child" href="/faq/">FAQ</a>
|
||||
</div>
|
||||
|
||||
<div class="nav-element">
|
||||
<a class="no-dropdown nav-element-child" href="/glossar/">Glossar</a>
|
||||
</div>
|
||||
|
||||
<div class="nav-element">
|
||||
<a class="no-dropdown nav-element-child" href="/kundenbewertungen/">Kundenbewertungen</a>
|
||||
</div>
|
||||
<div class="nav-element">
|
||||
<a class="no-dropdown nav-element-child lg:!rounded-b-lg xl:!rounded-b-xl"href="/fuer-entwickler/">Für Entwickler</a>
|
||||
</div>
|
||||
|
||||
|
||||
</nav>
|
||||
|
||||
|
||||
<style lang="scss">
|
||||
|
||||
.dd-symbol::before{
|
||||
content:'❯';
|
||||
font-size:0.95rem;
|
||||
position:absolute;
|
||||
top:0px;
|
||||
left:-7px;
|
||||
animation-name: flim;
|
||||
animation-duration: 2s;
|
||||
animation-iteration-count: infinite;
|
||||
}
|
||||
|
||||
.dd-symbol{visibility: hidden;}
|
||||
|
||||
.dd-symbol::after{
|
||||
content:'❯';
|
||||
font-size:0.95rem;
|
||||
position:absolute;
|
||||
top:0px;
|
||||
right:-7px;
|
||||
animation-name: flim;
|
||||
animation-duration: 2s;
|
||||
animation-delay: 1s;
|
||||
animation-iteration-count: infinite;
|
||||
}
|
||||
|
||||
@keyframes flim{
|
||||
0% {opacity: 0;}
|
||||
16.66% {opacity: 0.25;}
|
||||
33.32% {opacity: 0.5;}
|
||||
49.98% {opacity: 0.75;}
|
||||
66.64% {opacity: 0.5;}
|
||||
83.33% {opacity: 0.25;}
|
||||
100% {opacity: 0;}
|
||||
}
|
||||
|
||||
|
||||
|
||||
</style>
|
||||
@@ -1,253 +0,0 @@
|
||||
<div class="flex flex-col gap-6">
|
||||
<nav>
|
||||
<div class="nav-card">
|
||||
<div class="card-menu-option dropdown dropdown-right dropdown-hover">
|
||||
<a href="/energieausweis-erstellen/verbrauchsausweis-wohnen"
|
||||
>Energieausweis erstellen</a
|
||||
>
|
||||
<div class="dropdown-content">
|
||||
<a href="/energieausweis-erstellen/verbrauchsausweis-wohnen">Verbrauchsausweis erstellen</a>
|
||||
<a href="/bedarfsausweis">Bedarfsausweis erstellen</a>
|
||||
<a href="/energieausweis-erstellen/verbrauchsausweis-gewerbe"
|
||||
>Verbrauchsausweis Gewerbe erstellen</a
|
||||
>
|
||||
<a href="/bedarfsausweis-gewerbe"
|
||||
>Bedarfsausweis Gewerbe anfragen</a
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<a class="card-menu-option" href="/welcher-energieausweis"
|
||||
>Welcher Energieausweis ?</a
|
||||
>
|
||||
<div class="card-menu-option dropdown dropdown-right dropdown-hover">
|
||||
<a href="/energieausweis-erstellen/verbrauchsausweis-wohnen">Verbrauchsausweis</a>
|
||||
<div class="dropdown-content">
|
||||
<a
|
||||
href="/energieausweis-erstellen/verbrauchsausweis-wohnenverbrauchsausweis-wohngebaeude"
|
||||
>Verbrauchsausweis Wohngebäude</a
|
||||
>
|
||||
<a
|
||||
href="/energieausweis-erstellen/verbrauchsausweis-erstellen"
|
||||
>Verbrauchsausweis online erstellen</a
|
||||
>
|
||||
<a
|
||||
href="/energieausweis-erstellen/verbrauchsausweis-wohnenhaeufige-fragen-zum-verbrauchsausweis"
|
||||
>Häufige Fragen zum Verbrauchsausweis</a
|
||||
>
|
||||
<a
|
||||
href="/energieausweis-erstellen/verbrauchsausweis-wohnenstatistiken-zum-verbrauchsausweis"
|
||||
>Statistiken zum Verbrauchsausweis Wohngebäude</a
|
||||
>
|
||||
<hr class="nav-hr" />
|
||||
<a href="/energieausweis-erstellen/verbrauchsausweis-wohnenverbrauchsausweis-gewerbe"
|
||||
>Verbrauchsausweis Gewerbe</a
|
||||
>
|
||||
<a
|
||||
href="/energieausweis-erstellen/verbrauchsausweis-gewerbe-erstellen"
|
||||
>Verbrauchsausweis Gewerbe online erstellen</a
|
||||
>
|
||||
<a
|
||||
href="/energieausweis-erstellen/verbrauchsausweis-wohnenhaeufige-fragen-zum-verbrauchsausweis-gewerbe"
|
||||
>Häufige Fragen zum Verbrauchsausweis Gewerbe</a
|
||||
>
|
||||
<a
|
||||
href="/energieausweis-erstellen/verbrauchsausweis-wohnenstatistiken-zum-verbrauchsausweis-gewerbe"
|
||||
>Statistiken zum Verbrauchsausweis Gewerbe</a
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-menu-option dropdown dropdown-right dropdown-hover">
|
||||
<a href="/bedarfsausweis/">Bedarfsausweis</a>
|
||||
<div class="dropdown-content">
|
||||
<a href="/bedarfsausweis/bedarfsausweis-wohngebaeude"
|
||||
>Bedarfsausweis Wohngebäude</a
|
||||
>
|
||||
<a
|
||||
href="/energieausweis-erstellen/bedarfsausweis-erstellen"
|
||||
>Bedarfsausweis online erstellen</a
|
||||
>
|
||||
<a
|
||||
href="/bedarfsausweis/haeufige-fragen-zum-bedarfsausweis"
|
||||
>Häufige Fragen zum Bedarfsausweis</a
|
||||
>
|
||||
<a href="/bedarfsausweis/statistiken-zum-bedarfsausweis"
|
||||
>Statistiken zum Bedarfsausweis Wohngebäude</a
|
||||
>
|
||||
<hr class="nav-hr" />
|
||||
<a href="/bedarfsausweis/bedarfsausweis-gewerbe"
|
||||
>Bedarfsausweis Gewerbe</a
|
||||
>
|
||||
<a
|
||||
href="/energieausweis-erstellen/bedarfsausweis-gewerbe-anfragen"
|
||||
>Bedarfsausweis Gewerbe anfragen</a
|
||||
>
|
||||
<a
|
||||
href="/bedarfsausweis/haeufige-fragen-zum-bedarfsausweis-gewerbe"
|
||||
>Häufige Fragen zum Bedarfsausweis Gewerbe</a
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-menu-option dropdown dropdown-right dropdown-hover">
|
||||
<a href="/">Energieausweis</a>
|
||||
<div class="dropdown-content">
|
||||
<a href="/energieausweis-pflicht"
|
||||
>Energieausweis Pflicht</a
|
||||
>
|
||||
<a href="/energieausweis-kosten"
|
||||
>Energieausweis Kosten</a
|
||||
>
|
||||
<a href="/energieausweis-haus">Energieausweis Haus</a>
|
||||
</div>
|
||||
</div>
|
||||
<a class="card-menu-option" href="/enev-zusammenfassung"
|
||||
>EnEV Zusammenfassung - Archiv</a
|
||||
>
|
||||
<a class="card-menu-option" href="/energieausweis-aussteller"
|
||||
>Energieausweis Aussteller</a
|
||||
>
|
||||
<a class="card-menu-option" href="/kundenbewertungen"
|
||||
>Kundenbewertungen</a
|
||||
>
|
||||
<a class="card-menu-option" href="/faq">FAQ</a>
|
||||
<a class="card-menu-option" href="/developers">Für Entwickler</a>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div class="infoCard">
|
||||
<div class="flex-column align-center">
|
||||
<img
|
||||
src="/images/right-sidebar/ing-niedersachsen.png"
|
||||
alt="Mitglied Ingenieurkammer Niedersachen"
|
||||
style="height: 150px;margin-bottom: 25px; width: auto;"
|
||||
/>
|
||||
<img
|
||||
src="/images/right-sidebar/mitglied-haendlerbund.png"
|
||||
alt="Mitglied im Händlerbund"
|
||||
style="width:auto;
|
||||
"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="infoCard">
|
||||
<div class="heading1">Was wird der Energieausweis kosten?</div>
|
||||
<hr style="margin-bottom:15px;" />
|
||||
<ul>
|
||||
<li>Verbrauchsausweis Wohngebäude<br />45€ inkl. MwSt.<hr /></li>
|
||||
<li>Bedarfsausweis Wohngebäude<br />75€ inkl. MwSt.<hr /></li>
|
||||
<li>Verbrauchsausweis Gewerbe<br />65€ inkl. MwSt.<hr /></li>
|
||||
<li>Bedarfsausweis Gewerbe<br />ab 300€ inkl. MwSt.<hr /></li>
|
||||
<li>EnEV-Nachweis Wohngebäude<br />ab 400€ inkl. MwSt.<hr /></li>
|
||||
<li>EnEV-Nachweis Gewerbe<br />ab 450€ inkl. MwSt.</li>
|
||||
</ul>
|
||||
<hr />
|
||||
</div>
|
||||
<div class="infoCard">
|
||||
<div class="heading1">Zahlungsoptionen</div>
|
||||
<hr style="margin-bottom:15px;" />
|
||||
<p style="text-align:center; font-size: 1.1em;">
|
||||
Ihre online Zahlungen werden sicher über eine SSL Verschlüsselung
|
||||
abgewickelt.
|
||||
</p>
|
||||
<hr style="margin-bottom:15px;" />
|
||||
<div class="align-center">
|
||||
<img
|
||||
src="/images/left-sidebar/payment.png"
|
||||
alt="Bezahloptionen - Paypal, Visa, Kreditkarte..."
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.nav-card {
|
||||
@apply rounded-lg w-full flex flex-col shadow-md border border-base-300;
|
||||
}
|
||||
|
||||
.infoCard {
|
||||
@apply bg-base-200 border-base-300 rounded-lg border p-4 shadow-md;
|
||||
}
|
||||
|
||||
.dropdown-content > .card-menu-option,
|
||||
.dropdown-content > a {
|
||||
@apply block w-[350px] bg-base-200 border text-lg px-4 py-2 border-base-300;
|
||||
}
|
||||
|
||||
.dropdown-content > a:first-child {
|
||||
@apply rounded-tr-lg rounded-tl-lg;
|
||||
}
|
||||
|
||||
.dropdown-content > a:last-child {
|
||||
@apply rounded-br-lg rounded-bl-lg;
|
||||
}
|
||||
|
||||
.dropdown-content > .card-menu-option:hover,
|
||||
.dropdown-content > a:hover {
|
||||
background-color: #444f94 !important;
|
||||
color: #fff !important;
|
||||
}
|
||||
|
||||
.dropdown-content {
|
||||
@apply absolute bg-base-200 left-full top-[-1px] shadow-md z-10 hidden rounded-lg;
|
||||
}
|
||||
|
||||
.dropdown:hover > .dropdown-content {
|
||||
@apply block;
|
||||
}
|
||||
|
||||
.dropdown::after {
|
||||
content: "\276F";
|
||||
position: absolute;
|
||||
top: 20px;
|
||||
right: 10px;
|
||||
font-size: 14px;
|
||||
font-weight: 300;
|
||||
transform: translate(0, -50%) rotate(0deg);
|
||||
transition: transform 0.25s;
|
||||
}
|
||||
|
||||
.dropdown {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.dropdown-content:hover {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.dropdown::after {
|
||||
content: "\276F";
|
||||
font-size: 14px;
|
||||
font-weight: 300;
|
||||
position: absolute;
|
||||
right: 10px;
|
||||
top: 20px;
|
||||
transform: translate(0, -50%) rotate(0deg);
|
||||
transition: transform 0.25s;
|
||||
}
|
||||
|
||||
.card-menu-option {
|
||||
@apply bg-base-200 border-b border-base-300 text-base-content text-lg py-2.5 px-5 select-none no-underline w-auto cursor-pointer;
|
||||
}
|
||||
|
||||
.nav-card .card-menu-option:first-child {
|
||||
@apply rounded-tr-lg rounded-tl-lg;
|
||||
}
|
||||
|
||||
.nav-card .card-menu-option:last-child {
|
||||
@apply rounded-br-lg rounded-bl-lg;
|
||||
}
|
||||
|
||||
.nav-card .card-menu-option a {
|
||||
@apply text-base-content;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.nav-card .card-menu-option:hover > a {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.nav-card .card-menu-option:hover {
|
||||
background-color: #ff7d26;
|
||||
color: #fff;
|
||||
text-decoration: none;
|
||||
}
|
||||
</style>
|
||||
@@ -1,144 +0,0 @@
|
||||
---
|
||||
import { validateAccessTokenServer } from "#server/lib/validateAccessToken";
|
||||
import SidebarWidgetLogin from "./SidebarWidgetLogin.svelte";
|
||||
import SidebarWidgetProfile from "./SidebarWidgetProfile.svelte"
|
||||
|
||||
const loggedin = await validateAccessTokenServer(Astro)
|
||||
---
|
||||
|
||||
<div class="flex flex-col gap-4">
|
||||
{ !loggedin ?
|
||||
<SidebarWidgetLogin client:load></SidebarWidgetLogin> : <SidebarWidgetProfile></SidebarWidgetProfile>}
|
||||
|
||||
<div class="infoCard">
|
||||
<h2 style="font-weight: bold; font-size: 1.2em; color: #3A4AB5;">
|
||||
Rufen Sie uns an<br /> Wir sind gerne für Sie da
|
||||
</h2>
|
||||
<hr style="margin-bottom:15px;" />
|
||||
<div class="flex-row justify-between">
|
||||
<div class="flex-column align-left">
|
||||
<p>Telefonische Beratung unter</p>
|
||||
<h2 style="font-weight: bold; font-size: 1.2em; color: #3A4AB5;">
|
||||
<a href="tel:+4940209339850">040 / 209 339 850</a>
|
||||
</h2>
|
||||
</div>
|
||||
<img
|
||||
src="/images/right-sidebar/telefon-1.png"
|
||||
style="width:70px; height: 73px;"
|
||||
alt="Telefon - Rufen sie uns an."
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="infoCard">
|
||||
<h2 style="font-weight: bold; font-size: 1.2em; color: #3A4AB5;">
|
||||
Bitte bewerten Sie uns!
|
||||
</h2>
|
||||
<hr style="margin-bottom:15px;" />
|
||||
<div
|
||||
class="review-widget_net"
|
||||
data-uuid="d908c994-f1f2-4ab6-bad1-b2d3538086e7"
|
||||
data-template="7"
|
||||
data-filter=""
|
||||
data-lang="de"
|
||||
data-theme="light"
|
||||
>
|
||||
<a href="https://www.review-widget.net/" target="_blank" rel="noopener"
|
||||
><img
|
||||
src="https://grwapi.net/assets/spinner/spin.svg"
|
||||
title="Google Review Widget"
|
||||
alt="Review Widget"
|
||||
/></a>
|
||||
</div><script async src="https://grwapi.net/widget.min.js"></script>
|
||||
<hr />
|
||||
</div>
|
||||
|
||||
<div class="infoCard">
|
||||
<h2 style="font-weight: bold; font-size: 1.2em; color: #3A4AB5;">
|
||||
Verbrauchsausweis für Wohngebäude
|
||||
</h2>
|
||||
<hr style="margin-bottom:15px;" />
|
||||
<div class="flex-column align-center">
|
||||
<img
|
||||
src="/images/right-sidebar/wohnhaus-1.png"
|
||||
alt="Verbrauchsausweis ab 45€ für Wohngebäude."
|
||||
/>
|
||||
<a
|
||||
href="/energieausweis-erstellen/verbrauchsausweis-erstellen"
|
||||
class="large-button">Jetzt Verbrauchsausweis erstellen</a
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="infoCard">
|
||||
<h2 style="font-weight: bold; font-size: 1.2em; color: #3A4AB5;">
|
||||
Welche Häuser benötigen einen Energieausweis?
|
||||
</h2>
|
||||
<hr style="margin-bottom:15px;" />
|
||||
<ul>
|
||||
<li>Wohngebäude > 50m² mit dauerhaftem Aufenthalt<hr /></li>
|
||||
<li>Nichtwohngebäude > 50m² mit dauerhaftem Aufenthalt<hr /></li>
|
||||
<li>Beheizte Gebäude > 50m²<hr /></li>
|
||||
<li>Neubauten<hr /></li>
|
||||
<li>Anbauten > 50 m²<hr /></li>
|
||||
<li>Sanierung mit Austausch der Heizungsanlage</li>
|
||||
</ul>
|
||||
<hr />
|
||||
</div>
|
||||
<div class="infoCard">
|
||||
<h2 style="font-weight: bold; font-size: 1.2em; color: #3A4AB5;">
|
||||
Bedarfsausweis für Wohngebäude
|
||||
</h2>
|
||||
<hr style="margin-bottom:15px;" />
|
||||
<div class="flex-column align-center">
|
||||
<img
|
||||
src="/images/right-sidebar/wohnhaus-ba-1.png"
|
||||
alt="Bedarfsausweis ab 75€ für Wohngebäude"
|
||||
/>
|
||||
<a
|
||||
href="/energieausweis-erstellen/bedarfsausweis-erstellen"
|
||||
class="large-button">Jetzt Bedarfsausweis erstellen</a
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<div class="infoCard">
|
||||
<h2 style="font-weight: bold; font-size: 1.2em; color: #3A4AB5;">
|
||||
Welcher Energieausweis ist der richtige?
|
||||
</h2>
|
||||
<hr style="margin-bottom:15px;" />
|
||||
<ul>
|
||||
<li>
|
||||
Verbrauchsausweis bei Vermietung, Verkauf und Aushang (Baujahr nach 1977
|
||||
bzw. saniert).<hr />
|
||||
</li>
|
||||
<li>
|
||||
Bedarfsausweis bei Neubau, Sanierung, Erweiterung und
|
||||
Fördermittelantrag.
|
||||
</li>
|
||||
</ul>
|
||||
<hr />
|
||||
</div>
|
||||
<div class="infoCard">
|
||||
<h2 style="font-weight: bold; font-size: 1.2em; color: #3A4AB5;">
|
||||
Verbrauchsausweis für Gewerbe
|
||||
</h2>
|
||||
<hr style="margin-bottom:15px;" />
|
||||
<div class="flex-column align-center">
|
||||
<img
|
||||
src="/images/right-sidebar/gewerbe-1.png"
|
||||
alt="Verbrauchsausweis Gewerbe für 65€"
|
||||
/>
|
||||
<a
|
||||
href="/energieausweis-erstellen/verbrauchsausweis-gewerbe-erstellen"
|
||||
class="large-button">Jetzt Verbrauchsausweis erstellen</a
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<style>
|
||||
.infoCard {
|
||||
@apply bg-base-200 rounded-lg border border-base-300 p-4 shadow-md;
|
||||
}
|
||||
</style>
|
||||
@@ -1,25 +0,0 @@
|
||||
---
|
||||
import Login from "#components/design/sidebars/cards/cardlogin_1.svelte";
|
||||
import Contact from "#components/design/sidebars/cards/cardcontact.svelte";
|
||||
import Review from "#components/design/sidebars/cards/cardreview.svelte";
|
||||
import VApromo from "#components/design/sidebars/cards/cardVApromo.svelte";
|
||||
import VAGpromo from "#components/design/sidebars/cards/cardVAGpromo.svelte";
|
||||
import BApromo from "#components/design/sidebars/cards/cardBApromo.svelte";
|
||||
import BAGpromo from "#components/design/sidebars/cards/cardBAGpromo.svelte";
|
||||
---
|
||||
|
||||
<div class="hidden
|
||||
xl:flex xl:flex-col xl:grow
|
||||
">
|
||||
|
||||
<Login client:load />
|
||||
<Contact client:load />
|
||||
<Review client:load />
|
||||
<VApromo client:load />
|
||||
<VAGpromo client:load />
|
||||
<BApromo client:load />
|
||||
<BAGpromo client:load />
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
286
src/cypress/e2e/VerbrauchsausweisWohnen/erstellen.cy.ts
Normal file
@@ -0,0 +1,286 @@
|
||||
import fuelList from "#components/Ausweis/brennstoffListe.js";
|
||||
import { faker } from "@faker-js/faker";
|
||||
import { Enums } from "@ibcornelsen/database/client";
|
||||
|
||||
import "cypress-file-upload"
|
||||
|
||||
describe("Verbrauchsausweis erstellen Schritt 1", () => {
|
||||
it("erstellt einen neuen Verbrauchsausweis Wohngebäude.", () => {
|
||||
cy.visit("/energieausweis-erstellen/verbrauchsausweis-wohngebaeude");
|
||||
|
||||
console.log(Enums);
|
||||
|
||||
|
||||
// cy.wait(1000);
|
||||
|
||||
// // Wir überprüfen, ob alle Ausstelgründe vorhanden sind, diese sollten genau so viele sein wie in der Datenbank vorhanden sind.
|
||||
// cy.get("input[name='ausstellgrund']")
|
||||
// .should("have.length", Object.values(Enums.Ausstellgrund).length)
|
||||
// .eq(
|
||||
// faker.number.int({
|
||||
// min: 0,
|
||||
// max: Object.values(Enums.Ausstellgrund).length - 1,
|
||||
// })
|
||||
// )
|
||||
// .check();
|
||||
|
||||
// // 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 }
|
||||
// );
|
||||
|
||||
// // Anzahl Einheiten
|
||||
// cy.get("input[name='einheiten']")
|
||||
// .should("have.attr", "type", "number")
|
||||
// .type(faker.number.int({ min: 1, max: 5 }).toString());
|
||||
|
||||
// // Sanierungsstatus
|
||||
// cy.get("select[name='saniert']").select(
|
||||
// Math.random() > 0.5 ? "true" : "false"
|
||||
// );
|
||||
|
||||
// // 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.
|
||||
|
||||
// // Flaeche
|
||||
// cy.get("input[name='flaeche']")
|
||||
// .should("have.attr", "type", "number")
|
||||
// .type(faker.number.int({ min: 50, max: 1000 }).toString());
|
||||
|
||||
// // 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", Object.values(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", Object.values(Enums.Heizungsstatus).length).parent().select(faker.number.int({
|
||||
// max: Object.values(Enums.Heizungsstatus).length,
|
||||
// min: 1
|
||||
// }));
|
||||
|
||||
// // Brennstoff und Einheit 1
|
||||
// const brennstoffKombo = fuelList[faker.number.int({ min: 0, max: fuelList.length - 1 })];
|
||||
|
||||
// cy.get("select[name='brennstoff_1']").select(brennstoffKombo[0]);
|
||||
// cy.get("select[name='einheit_1']").select(brennstoffKombo[1]);
|
||||
|
||||
// // Verbrauchszeitraum
|
||||
// cy.get("select[name='energieverbrauch_zeitraum_monat']").select(faker.number.int({ min: 1, max: 12 }).toString());
|
||||
// cy.get("select[name='energieverbrauch_zeitraum_jahr']").select(faker.number.int({ min: 2018, max: 2019 }).toString());
|
||||
|
||||
// // Verbrauch
|
||||
// cy.get("input[name='verbrauch_1']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
|
||||
// cy.get("input[name='verbrauch_2']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
|
||||
// cy.get("input[name='verbrauch_3']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
|
||||
|
||||
|
||||
// const zusaetzlicheHeizquelle = Math.random() > 0.5;
|
||||
|
||||
// if (zusaetzlicheHeizquelle) {
|
||||
// cy.get("input[name='zusaetzliche_heizquelle']").check();
|
||||
|
||||
// // Brennstoff und Einheit 2
|
||||
// const brennstoffKombo2 = fuelList[faker.number.int({ min: 0, max: fuelList.length - 1 })];
|
||||
|
||||
// cy.get("select[name='brennstoff_2']").select(brennstoffKombo2[0]);
|
||||
// cy.get("select[name='einheit_2']").select(brennstoffKombo2[1]);
|
||||
|
||||
// // Verbrauch
|
||||
// cy.get("input[name='verbrauch_4']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
|
||||
// cy.get("input[name='verbrauch_5']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
|
||||
// cy.get("input[name='verbrauch_6']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
|
||||
// }
|
||||
|
||||
// // Warmwasser enthalten und bekannt
|
||||
// const warmwasserEnthalten = Math.random() > 0.5;
|
||||
// const anteilBekannt = Math.random() > 0.5;
|
||||
|
||||
// if (warmwasserEnthalten) {
|
||||
// cy.get("input[name='warmwasser_enthalten']").check();
|
||||
|
||||
// if (anteilBekannt) {
|
||||
// // Der Anteil ist bekannt, wir müssen ihn also angeben.
|
||||
// cy.get("input[name='warmwasser_anteil_bekannt']").check();
|
||||
|
||||
// cy.get("input[name='anteil_warmwasser_1']").type(faker.number.int({ min: 0, max: 50 }).toString());
|
||||
|
||||
// if (zusaetzlicheHeizquelle) {
|
||||
// // Zusätzliche Heizquelle existiert, also müssen wir auch hier den Anteil angeben.
|
||||
// cy.get("input[name='anteil_warmwasser_2']").type(faker.number.int({ min: 0, max: 50 }).toString());
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
// // Alternative Energieversorgungssysteme
|
||||
// if (Math.random() > 0.5) cy.get("input[name='alternative_heizung']").check();
|
||||
// if (Math.random() > 0.5) cy.get("input[name='alternative_warmwasser']").check();
|
||||
// if (Math.random() > 0.5) cy.get("input[name='alternative_lueftung']").check();
|
||||
// if (Math.random() > 0.5) cy.get("input[name='alternative_kuehlung']").check();
|
||||
|
||||
// // 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);
|
||||
// });
|
||||
|
||||
// // Gebäudeteil
|
||||
// cy.get("select[name='gebaeudeteil']").then(($dropdown) => {
|
||||
// const options = $dropdown.find('option');
|
||||
// // Select the option at the random index
|
||||
// cy.get("select[name='gebaeudeteil']").select(options.eq(faker.number.int({ min: 1, max: options.length - 1 })).val() as string);
|
||||
// });
|
||||
|
||||
// // Lüftung
|
||||
// cy.get("select[name='lueftung']").then(($dropdown) => {
|
||||
// const options = $dropdown.find('option');
|
||||
// // Select the option at the random index
|
||||
// cy.get("select[name='lueftung']").select(options.eq(faker.number.int({ min: 1, max: options.length - 1 })).val() as string);
|
||||
// });
|
||||
|
||||
// // Kühlung
|
||||
// cy.get("select[name='kuehlung']").then(($dropdown) => {
|
||||
// const options = $dropdown.find('option');
|
||||
// // Select the option at the random index
|
||||
// cy.get("select[name='kuehlung']").select(options.eq(faker.number.int({ min: 1, max: options.length - 1 })).val() as string);
|
||||
// });
|
||||
|
||||
// // Leerstand
|
||||
// cy.get("input[name='leerstand']").should("have.attr", "type", "number").type(faker.number.int({ min: 0, max: 30 }).toString());
|
||||
|
||||
// // Heizungsanlage Daten
|
||||
// if (Math.random() > 0.5) cy.get("input[name='zentralheizung']").check();
|
||||
// if (Math.random() > 0.5) cy.get("input[name='einzelofen']").check();
|
||||
// if (Math.random() > 0.5) cy.get("input[name='durchlauf_erhitzer']").check();
|
||||
// if (Math.random() > 0.5) cy.get("input[name='standard_kessel']").check();
|
||||
// if (Math.random() > 0.5) cy.get("input[name='solarsystem_warmwasser']").check();
|
||||
// if (Math.random() > 0.5) cy.get("input[name='waermepumpe']").check();
|
||||
// if (Math.random() > 0.5) cy.get("input[name='niedertemperatur_kessel']").check();
|
||||
// if (Math.random() > 0.5) cy.get("input[name='brennwert_kessel']").check();
|
||||
// if (Math.random() > 0.5) cy.get("input[name='warmwasser_rohre_gedaemmt']").check();
|
||||
// if (Math.random() > 0.5) cy.get("input[name='heizungsrohre_gedaemmt']").check();
|
||||
// if (Math.random() > 0.5) cy.get("input[name='zirkulation']").check();
|
||||
// if (Math.random() > 0.5) cy.get("input[name='raum_temperatur_regler']").check();
|
||||
|
||||
// // Heizungsanlage Bilder
|
||||
// cy.get("input[name='heizung_image']").should("have.attr", "type", "file").attachFile("images/heizungsanlage/1.jpeg", { subjectType: "input" });
|
||||
// cy.get("input[name='heizung_image']").should("have.attr", "type", "file").attachFile("images/heizungsanlage/2.jpeg", { subjectType: "input" });
|
||||
|
||||
// // Fenster Daten
|
||||
// if (Math.random() > 0.5) cy.get("input[name='einfach_verglasung']").check();
|
||||
// if (Math.random() > 0.5) cy.get("input[name='doppel_verglasung']").check();
|
||||
// if (Math.random() > 0.5) cy.get("input[name='isolier_verglasung']").check();
|
||||
// if (Math.random() > 0.5) cy.get("input[name='dreifach_verglasung']").check();
|
||||
// if (Math.random() > 0.5) cy.get("input[name='fenster_dicht']").check();
|
||||
// if (Math.random() > 0.5) cy.get("input[name='fenster_teilweise_undicht']").check();
|
||||
// if (Math.random() > 0.5) cy.get("input[name='tueren_dicht']").check();
|
||||
// if (Math.random() > 0.5) cy.get("input[name='tueren_undicht']").check();
|
||||
// if (Math.random() > 0.5) cy.get("input[name='rolllaeden_kaesten_gedaemmt']").check();
|
||||
|
||||
// // Fenster Bilder
|
||||
// cy.get("input[name='fenster_image']").should("have.attr", "type", "file").attachFile("images/fenster/1.jpeg", { subjectType: "input" });
|
||||
// cy.get("input[name='fenster_image']").should("have.attr", "type", "file").attachFile("images/fenster/2.jpeg", { subjectType: "input" });
|
||||
|
||||
// // Wärmedämmung Daten
|
||||
// if (Math.random() > 0.5) cy.get("input[name='aussenwand_gedaemmt']").check();
|
||||
// if (Math.random() > 0.5) cy.get("input[name='keller_wand_gedaemmt']").check();
|
||||
// if (Math.random() > 0.5) cy.get("input[name='keller_decke_gedaemmt']").check();
|
||||
// if (Math.random() > 0.5) cy.get("input[name='dachgeschoss_gedaemmt']").check();
|
||||
// if (Math.random() > 0.5) cy.get("input[name='oberste_geschossdecke_gedaemmt']").check();
|
||||
// if (Math.random() > 0.5) cy.get("input[name='oberste_geschossdecke_min_12cm_gedaemmt']").check();
|
||||
|
||||
// // Wärmedämmung Bilder
|
||||
// cy.get("input[name='daemmung_image']").should("have.attr", "type", "file").attachFile("images/daemmung/1.jpeg", { subjectType: "input" });
|
||||
// cy.get("input[name='daemmung_image']").should("have.attr", "type", "file").attachFile("images/daemmung/2.jpeg", { subjectType: "input" });
|
||||
|
||||
// // Gebäude Bild
|
||||
// cy.get("input[name='gebaeude_image']").should("have.attr", "type", "file").attachFile("images/gebaeude/1.jpeg", { subjectType: "input" });
|
||||
|
||||
// // Jetzt können wir den Verbrauchsausweis erstellen.
|
||||
// cy.get("form[name='ausweis'] button[type='submit']").click({ force: true });
|
||||
|
||||
// // Wir sind nicht eingeloggt also sollte jetzt ein Login Screen erscheinen.
|
||||
// // Wir klicken auf registrieren und erstellen einen neuen Benutzer, danach loggen wir uns mit diesem ein.
|
||||
// cy.get("button[name='registrieren']").click();
|
||||
|
||||
// const email = faker.internet.email();
|
||||
// const passwort = "test1234";
|
||||
// const vorname = faker.person.firstName();
|
||||
// const nachname = faker.person.lastName();
|
||||
|
||||
// cy.get("form[name='signup'] input[name='email']").should("be.visible").should("have.attr", "type", "email").type(email);
|
||||
// cy.get("form[name='signup'] input[name='passwort']").should("be.visible").should("have.attr", "type", "password").type(passwort);
|
||||
// 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'] button[type='submit']").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='login'] input[name='email']").should("be.visible").should("have.attr", "type", "email").should("contain.value", email);
|
||||
// cy.get("form[name='login'] input[name='passwort']").should("be.visible").should("have.attr", "type", "password").type(passwort);
|
||||
|
||||
// cy.get("form[name='login'] button[type='submit']").click();
|
||||
|
||||
// // Der Ausweis sollte jetzt schon erstellt worden sein und wir sollten auf die kundendaten seite weitergeleitet worden sein.
|
||||
// cy.url().should("contain", "/kundendaten");
|
||||
|
||||
// cy.wait(1000)
|
||||
|
||||
// // Wir füllen jetzt die Kundendaten aus.
|
||||
// cy.get("select[name='anrede']").select(Math.random() > 0.5 ? "Herr" : "Frau");
|
||||
// cy.get("input[name='vorname']").should("contain.value", vorname);
|
||||
// cy.get("input[name='name']").should("contain.value", nachname);
|
||||
// cy.get("input[name='email']").should("contain.value", email);
|
||||
// cy.get("input[name='telefon']").type(faker.phone.number());
|
||||
|
||||
// cy.get("input[name='rechnung_empfaenger']").type(`${vorname} ${nachname}`);
|
||||
// cy.get("input[name='rechnung_strasse']").type(faker.location.streetAddress());
|
||||
// // TODO: Random Plz generieren, allerdings muss die auch in der Datenbank vorhanden sein...
|
||||
// cy.get("input[name='rechnung_plz']").type("2103");
|
||||
// // Jetzt sollte der PLZ Container erscheinen, dort klicken wir einfach das erste Element an.
|
||||
// cy.get("div[data-test='plz-container']").children().first().click();
|
||||
// cy.get("input[name='rechnung_telefon']").type(faker.phone.number());
|
||||
// cy.get("input[name='rechnung_email']").type(faker.internet.email());
|
||||
// cy.get("button[data-test='paypal']").click();
|
||||
|
||||
// // Datenschutz und AGB akzeptieren, dann schicken wir das Formular ab.
|
||||
// cy.get("input[name='agb-akzeptieren']").check()
|
||||
// cy.get("input[name='datenschutz-akzeptieren']").check()
|
||||
// cy.get("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.
|
||||
// })
|
||||
});
|
||||
});
|
||||
@@ -1,4 +1,4 @@
|
||||
import { API_ACCESS_TOKEN_COOKIE_NAME, API_REFRESH_TOKEN_COOKIE_NAME } from "#lib/constants";
|
||||
import { API_ACCESS_TOKEN_COOKIE_NAME, API_REFRESH_TOKEN_COOKIE_NAME } from "#lib/constants.js";
|
||||
import {faker} from "@faker-js/faker";
|
||||
|
||||
describe('Benutzer Authentifizierung', () => {
|
||||
@@ -11,6 +11,8 @@ describe('Benutzer Authentifizierung', () => {
|
||||
it("erstellt einen Nutzer und leitet auf die Login Seite weiter", () => {
|
||||
cy.visit("/auth/signup")
|
||||
|
||||
cy.wait(1000)
|
||||
|
||||
cy.get('input[name="email"]').type(email)
|
||||
cy.get('input[name="passwort"]').type(password)
|
||||
cy.get('input[name="vorname"]').type(name)
|
||||
@@ -24,12 +26,14 @@ describe('Benutzer Authentifizierung', () => {
|
||||
it("meldet einen Nutzer an und leitet auf die Startseite weiter", () => {
|
||||
cy.visit("/auth/login")
|
||||
|
||||
cy.wait(1000)
|
||||
|
||||
cy.get('input[name="email"]').type(email)
|
||||
cy.get('input[name="passwort"]').type(password)
|
||||
|
||||
cy.get('button[type="submit"]').click()
|
||||
|
||||
cy.url().should("include", "/user")
|
||||
cy.url().should("include", "/dashboard")
|
||||
|
||||
// Wir sollten nun einen Access Token und Refresh Token in unseren Cookies sehen.
|
||||
cy.getCookie(API_ACCESS_TOKEN_COOKIE_NAME).should("exist")
|
||||
|
Before Width: | Height: | Size: 69 KiB After Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 78 KiB |
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 50 KiB |
@@ -14,7 +14,7 @@
|
||||
// ***********************************************************
|
||||
|
||||
// Import commands.js using ES2015 syntax:
|
||||
import './commands'
|
||||
import './commands.js'
|
||||
|
||||
// Alternatively you can use CommonJS syntax:
|
||||
// require('./commands')
|
||||
@@ -4,7 +4,7 @@ import "../style/formular.css";
|
||||
import "../../svelte-dialogs.config"
|
||||
import Header from "#components/design/header/AusweisHeader.astro";
|
||||
import Footer from "#components/design/footer/Footer.astro";
|
||||
import SidebarLeft from "#components/design/sidebars/left/SidebarLeft.astro";
|
||||
import SidebarLeft from "#components/design/sidebars/SidebarLeft.astro";
|
||||
import { NotificationWrapper } from "@ibcornelsen/ui";
|
||||
|
||||
export interface Props {
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
import "../style/global.css";
|
||||
import "../style/formular.css";
|
||||
import "../../svelte-dialogs.config"
|
||||
import Header from "#header/AusweisHeader.astro";
|
||||
import Footer from "#footer/Footer.astro";
|
||||
import SidebarLeft from "#sidebarLeft/SidebarLeft.astro";
|
||||
import Header from "#components/design/header/AusweisHeader.astro";
|
||||
import Footer from "#components/design/footer/Footer.astro";
|
||||
import SidebarLeft from "#components/design/sidebars/SidebarLeft.astro";
|
||||
import { NotificationWrapper } from "@ibcornelsen/ui";
|
||||
|
||||
export interface Props {
|
||||
|
||||
@@ -3,8 +3,8 @@ import "../style/global.css";
|
||||
import "../../svelte-dialogs.config"
|
||||
import Header from "#components/design/header/Header.astro";
|
||||
import Footer from "#components/design/footer/Footer.astro";
|
||||
import SidebarLeft from "#components/design/sidebars/left/SidebarLeft.astro";
|
||||
import SidebarRight from "#components/design/sidebars/right/SidebarRight.astro";
|
||||
import SidebarLeft from "#components/design/sidebars/SidebarLeft.astro";
|
||||
import SidebarRight from "#components/design/sidebars/SidebarRight.astro";
|
||||
import { NotificationWrapper } from "@ibcornelsen/ui";
|
||||
|
||||
export interface Props {
|
||||
|
||||
@@ -1,63 +0,0 @@
|
||||
---
|
||||
import "../style/global.css";
|
||||
import "../../svelte-dialogs.config"
|
||||
import Header from "#components/design/header/Header_1.astro";
|
||||
import Footer from "#components/design/footer/Footer.astro";
|
||||
import SidebarLeft from "#components/design/sidebars/left/SidebarLeft.astro";
|
||||
import SidebarRight from "#components/design/sidebars/right/SidebarRight_1.astro";
|
||||
import { NotificationWrapper } from "@ibcornelsen/ui";
|
||||
|
||||
export interface Props {
|
||||
title: string;
|
||||
}
|
||||
|
||||
const { title } = Astro.props;
|
||||
|
||||
---
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width" />
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.jpg" />
|
||||
<meta
|
||||
name="description"
|
||||
content="✅ Jetzt Ihren Energieausweis online erstellen. Erhalten Sie Ihren online Energieausweis rechtssicher und nach aktueller GEG (vormals EnEV) vom Diplom Ingenieur geprüft."
|
||||
/>
|
||||
<title>
|
||||
{title || "Energieausweis online erstellen - Online Energieausweis"}
|
||||
</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<container class="w-full max-w-[1920px]">
|
||||
|
||||
<Header />
|
||||
|
||||
<main
|
||||
class="w-full p-0 grid
|
||||
sm:grid-cols-[minmax(1fr,1fr)] sm:gap-1 sm:px-0
|
||||
md:grid-cols-[minmax(1fr,1fr)] md:gap-2 md:px-0
|
||||
lg:grid-cols-[minmax(250px,250px)1fr] lg:gap-3 lg:p-3
|
||||
xl:grid-cols-[minmax(350px,350px)1fr] xl:gap-4 xl:p-4
|
||||
2xl:grid-cols-[minmax(350px,350px)1fr_minmax(350px,350px)] 2xl:gap-5 2xl:p-5
|
||||
">
|
||||
|
||||
<SidebarLeft />
|
||||
|
||||
<article class="box grow rounded-tl-none">
|
||||
<slot />
|
||||
</article>
|
||||
|
||||
<SidebarRight />
|
||||
|
||||
</main>
|
||||
|
||||
<Footer />
|
||||
<NotificationWrapper client:load />
|
||||
</container>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
@@ -1,154 +0,0 @@
|
||||
---
|
||||
import i18next from "i18next";
|
||||
|
||||
import "../style/UMBE_global.css";
|
||||
import "#style/global.css";
|
||||
import "../../svelte-dialogs.config"
|
||||
import Footer from "../components/Footer.astro";
|
||||
import Header from "../components/Header.astro";
|
||||
import SidebarLeft from "../components/SidebarLeft.astro";
|
||||
import SidebarRight from "../components/SidebarRight.astro";
|
||||
import { NotificationWrapper } from "@ibcornelsen/ui";
|
||||
import TicketPopup from "../components/Tickets/TicketButton.svelte"
|
||||
|
||||
export interface Props {
|
||||
title: string;
|
||||
}
|
||||
|
||||
const { title } = Astro.props;
|
||||
|
||||
const schema = JSON.stringify({
|
||||
"@context": "http://schema.org",
|
||||
"@type": "Corporation",
|
||||
name: "IB Cornelsen",
|
||||
alternateName: "online-energieausweis.org",
|
||||
url: "https://online-energieausweis.org",
|
||||
logo: "https://online-energieausweis.org/ib-cornelsen.png",
|
||||
address: {
|
||||
"@type": "PostalAddress",
|
||||
streetAddress: "Katendeich 5A",
|
||||
addressLocality: "Hamburg",
|
||||
postalCode: "21035",
|
||||
addressCountry: "Deutschland",
|
||||
email: "info@online-energieausweis.org",
|
||||
},
|
||||
contactPoint: {
|
||||
"@type": "ContactPoint",
|
||||
telephone: "+49-040-209339850",
|
||||
faxNumber: "+49-040-209339859",
|
||||
contactType: "customer service",
|
||||
areaServed: "DE",
|
||||
availableLanguage: "German",
|
||||
},
|
||||
});
|
||||
---
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang={i18next.language}>
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width" />
|
||||
<script type="application/ld+json" set:html={schema}></script>
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.jpg" />
|
||||
|
||||
<meta
|
||||
name="description"
|
||||
content="✅ Jetzt Ihren Energieausweis online erstellen. Erhalten Sie Ihren online Energieausweis rechtssicher und nach aktueller GEG (vormals EnEV) vom Diplom Ingenieur geprüft."
|
||||
/>
|
||||
<link rel="canonical" href="https://online-energieausweis.org/" />
|
||||
|
||||
<meta property="og:locale" content="de_DE" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta
|
||||
property="og:title"
|
||||
content="Energieausweis online erstellen - Online Energieausweis"
|
||||
/>
|
||||
<meta
|
||||
property="og:description"
|
||||
content="✅ Jetzt Ihren Energieausweis online erstellen. Erhalten Sie Ihren online Energieausweis rechtssicher und nach aktueller GEG (vormals EnEV) vom Diplom Ingenieur geprüft."
|
||||
/>
|
||||
<meta property="og:url" content="https://online-energieausweis.org/" />
|
||||
<meta
|
||||
property="og:site_name"
|
||||
content="Energieausweis online erstellen"
|
||||
/>
|
||||
|
||||
<meta name="twitter:card" content="summary_large_image" />
|
||||
<meta
|
||||
name="twitter:description"
|
||||
content="✅ Jetzt Ihren Energieausweis online erstellen. Erhalten Sie Ihren online Energieausweis rechtssicher und nach aktueller GEG (vormals EnEV) vom Diplom Ingenieur geprüft."
|
||||
/>
|
||||
<meta
|
||||
name="twitter:title"
|
||||
content="Energieausweis online erstellen - Online Energieausweis"
|
||||
/>
|
||||
<meta
|
||||
name="twitter:image"
|
||||
content="https://online-energieausweis.org/images/energieausweis-online-erstellen.jpg"
|
||||
/>
|
||||
<title>
|
||||
{title || "Energieausweis online erstellen - Online Energieausweis"}
|
||||
</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<Header />
|
||||
<main
|
||||
class="lg:grid gap-6 md:p-6 lg:grid-cols-[2fr,6fr,2fr] max-w-[1920px] w-full bg-base-100"
|
||||
>
|
||||
<SidebarLeft />
|
||||
<article class="w-full max-w-full bg-base-200 border border-base-300">
|
||||
<slot />
|
||||
</article>
|
||||
<div class="hidden lg:block">
|
||||
<SidebarRight />
|
||||
<div>
|
||||
</main>
|
||||
<Footer />
|
||||
<NotificationWrapper client:load />
|
||||
<TicketPopup client:load />
|
||||
</body>
|
||||
</html>
|
||||
|
||||
<style is:global lang="scss">
|
||||
|
||||
:root {
|
||||
@apply bg-base-100 text-base-content;
|
||||
}
|
||||
|
||||
article {
|
||||
@apply rounded-lg w-full shadow-md border;
|
||||
}
|
||||
|
||||
.mainContent {
|
||||
p, h1, h2, h3, h4, h5, h6 {
|
||||
@apply text-base-content;
|
||||
}
|
||||
}
|
||||
|
||||
body {
|
||||
min-height: 100vh;
|
||||
}
|
||||
|
||||
.button {
|
||||
@apply px-8 py-2 bg-secondary rounded-lg text-white font-medium hover:shadow-lg transition-all hover:underline active:bg-blue-900 text-center cursor-pointer;
|
||||
color: #fff !important;
|
||||
}
|
||||
|
||||
h3 {
|
||||
@apply text-xl font-medium mt-6 mb-4;
|
||||
}
|
||||
|
||||
input {
|
||||
@apply py-1.5 px-4 w-full rounded-lg outline-none text-lg text-slate-700 border bg-gray-50 transition-colors;
|
||||
}
|
||||
|
||||
input:hover,
|
||||
input:focus {
|
||||
@apply bg-gray-100;
|
||||
}
|
||||
|
||||
label {
|
||||
@apply text-base font-semibold;
|
||||
}
|
||||
</style>
|
||||
@@ -1,23 +0,0 @@
|
||||
---
|
||||
|
||||
---
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width" />
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.jpg" />
|
||||
<meta
|
||||
name="description"
|
||||
content="IB Cornelsen - Widget"
|
||||
/>
|
||||
<title>
|
||||
IB Cornelsen - Widget
|
||||
</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<slot />
|
||||
</body>
|
||||
</html>
|
||||
@@ -3,8 +3,8 @@ import "../style/global.css";
|
||||
import "../../svelte-dialogs.config"
|
||||
import Header from "#components/design/header/Header.astro";
|
||||
import Footer from "#components/design/footer/Footer.astro";
|
||||
import SidebarLeft from "#components/design/sidebars/left/SidebarLeft.astro";
|
||||
import SidebarRight from "#components/design/sidebars/right/SidebarRight.astro";
|
||||
import SidebarLeft from "#components/design/sidebars/SidebarLeft.astro";
|
||||
import SidebarRight from "#components/design/sidebars/SidebarRight.astro";
|
||||
import { NotificationWrapper } from "@ibcornelsen/ui";
|
||||
|
||||
export interface Props {
|
||||
|
||||
131
src/lib/faker.ts
Normal file
@@ -0,0 +1,131 @@
|
||||
import {
|
||||
AufnahmeClient,
|
||||
VerbrauchsausweisWohnenClient,
|
||||
ObjektClient,
|
||||
} from "#components/Ausweis/types.js";
|
||||
import { faker } from "@faker-js/faker";
|
||||
import { Enums } from "@ibcornelsen/database/client";
|
||||
|
||||
export function fakeObjekt(seed: number = 42): ObjektClient {
|
||||
faker.seed(seed);
|
||||
return {
|
||||
adresse: faker.location.streetAddress(),
|
||||
plz: faker.location.zipCode({ format: "#####" }),
|
||||
ort: faker.location.city(),
|
||||
uid: faker.string.uuid(),
|
||||
latitude: faker.location.latitude(),
|
||||
longitude: faker.location.longitude(),
|
||||
};
|
||||
}
|
||||
|
||||
export function fakeAufnahme(seed: number = 42, uid_objekt: string = faker.string.uuid()): AufnahmeClient {
|
||||
faker.seed(seed);
|
||||
const tuerenDicht = faker.datatype.boolean();
|
||||
|
||||
return {
|
||||
baujahr_gebaeude: [faker.number.int({ min: 1960, max: 2014 })],
|
||||
baujahr_heizung: [faker.number.int({ min: 1960, max: 2014 })],
|
||||
baujahr_klima: [faker.number.int({ min: 1985, max: 2014 })],
|
||||
nutzflaeche: faker.number.int({ min: 50, max: 300 }),
|
||||
einheiten: faker.number.int({ min: 1, max: 3 }),
|
||||
saniert: faker.datatype.boolean(),
|
||||
keller: faker.helpers.enumValue(Enums.Heizungsstatus),
|
||||
dachgeschoss: faker.helpers.enumValue(Enums.Heizungsstatus),
|
||||
flaeche: faker.number.int({ min: 50, max: 300 }),
|
||||
gebaeudetyp: "Einfamilienhaus",
|
||||
gebaeudeteil: "Gesamtgebäude",
|
||||
lueftung: "Fensterlueftung",
|
||||
kuehlung: "Vorhanden",
|
||||
brennstoff_1: "Erdgas H",
|
||||
alternative_heizung: faker.datatype.boolean(),
|
||||
alternative_kuehlung: faker.datatype.boolean(),
|
||||
alternative_lueftung: faker.datatype.boolean(),
|
||||
alternative_warmwasser: faker.datatype.boolean(),
|
||||
aussenwand_gedaemmt: faker.datatype.boolean(),
|
||||
aussenwand_min_12cm_gedaemmt: faker.datatype.boolean(),
|
||||
ausweisart: Enums.Ausweisart.VerbrauchsausweisWohnen,
|
||||
bestellt: faker.datatype.boolean(),
|
||||
boxpruefung: faker.datatype.boolean(),
|
||||
brennstoff_2: "Erdgas H",
|
||||
brennwert_kessel: faker.datatype.boolean(),
|
||||
dachgeschoss_gedaemmt: faker.datatype.boolean(),
|
||||
dachgeschoss_min_12cm_gedaemmt: faker.datatype.boolean(),
|
||||
doppel_verglasung: faker.datatype.boolean(),
|
||||
dreifach_verglasung: faker.datatype.boolean(),
|
||||
durchlauf_erhitzer: faker.datatype.boolean(),
|
||||
einfach_verglasung: faker.datatype.boolean(),
|
||||
einzelofen: faker.datatype.boolean(),
|
||||
energieeffizienzklasse: "",
|
||||
erledigt: faker.datatype.boolean(),
|
||||
erstellungsdatum: faker.date.past(),
|
||||
fenster_dicht: faker.datatype.boolean(),
|
||||
fenster_teilweise_undicht: faker.datatype.boolean(),
|
||||
heizungsrohre_gedaemmt: faker.datatype.boolean(),
|
||||
isolier_verglasung: faker.datatype.boolean(),
|
||||
keller_decke_gedaemmt: faker.datatype.boolean(),
|
||||
keller_wand_gedaemmt: faker.datatype.boolean(),
|
||||
leerstand: faker.number.int({ min: 0, max: 20 }),
|
||||
niedertemperatur_kessel: faker.datatype.boolean(),
|
||||
oberste_geschossdecke_gedaemmt: faker.datatype.boolean(),
|
||||
oberste_geschossdecke_min_12cm_gedaemmt: faker.datatype.boolean(),
|
||||
photovoltaik: faker.datatype.boolean(),
|
||||
prueftext: faker.lorem.sentence(),
|
||||
raum_temperatur_regler: faker.datatype.boolean(),
|
||||
rolllaeden_kaesten_gedaemmt: faker.datatype.boolean(),
|
||||
solarsystem_warmwasser: faker.datatype.boolean(),
|
||||
standard_kessel: faker.datatype.boolean(),
|
||||
storniert: false,
|
||||
tueren_dicht: tuerenDicht,
|
||||
tueren_undicht: !tuerenDicht,
|
||||
waermepumpe: faker.datatype.boolean(),
|
||||
warmwasser_rohre_gedaemmt: faker.datatype.boolean(),
|
||||
zentralheizung: faker.datatype.boolean(),
|
||||
zirkulation: faker.datatype.boolean(),
|
||||
zurueckgestellt: faker.datatype.boolean(),
|
||||
uid: faker.string.uuid(),
|
||||
ausstellungsdatum: faker.date.past(),
|
||||
uid_objekt
|
||||
};
|
||||
}
|
||||
|
||||
export function fakeVerbrauchsausweisWohnen(
|
||||
seed: number = 42,
|
||||
uid_aufnahme: string = faker.string.uuid(),
|
||||
uid_objekt: string = faker.string.uuid()
|
||||
): VerbrauchsausweisWohnenClient {
|
||||
faker.seed(seed);
|
||||
|
||||
const verbrauch_1 = faker.number.int({ min: 5000, max: 20000 });
|
||||
const verbrauch_4 = faker.number.int({ min: 5000, max: 15000 });
|
||||
|
||||
const ausweis: VerbrauchsausweisWohnenClient = {
|
||||
verbrauch_1: verbrauch_1,
|
||||
verbrauch_2: verbrauch_1 + faker.number.int({ min: -2000, max: 2000 }),
|
||||
verbrauch_3: verbrauch_1 + faker.number.int({ min: -2000, max: 2000 }),
|
||||
einheit_1: "kWh",
|
||||
warmwasser_enthalten: faker.datatype.boolean(),
|
||||
uid: faker.string.uuid(),
|
||||
alternative_heizung: faker.datatype.boolean(),
|
||||
alternative_kuehlung: faker.datatype.boolean(),
|
||||
alternative_lueftung: faker.datatype.boolean(),
|
||||
alternative_warmwasser: faker.datatype.boolean(),
|
||||
anteil_warmwasser_1: faker.number.int({ min: 0, max: 60 }),
|
||||
anteil_warmwasser_2: faker.number.int({ min: 0, max: 60 }),
|
||||
ausstellgrund: faker.helpers.enumValue(Enums.Ausstellgrund),
|
||||
einheit_2: "kWh",
|
||||
keller_beheizt: faker.datatype.boolean(),
|
||||
registriernummer: faker.string.uuid(),
|
||||
startdatum: faker.date.past({ years: 3 }),
|
||||
verbrauch_4: verbrauch_4,
|
||||
verbrauch_5: verbrauch_4 + faker.number.int({ min: -2000, max: 2000 }),
|
||||
verbrauch_6: verbrauch_4 + faker.number.int({ min: -2000, max: 2000 }),
|
||||
warmwasser_anteil_bekannt: faker.datatype.boolean(),
|
||||
wird_gekuehlt: faker.datatype.boolean(),
|
||||
zusaetzliche_heizquelle: faker.datatype.boolean(),
|
||||
faktorKeller: faker.number.float({ min: 0, max: 1 }),
|
||||
uid_aufnahme,
|
||||
uid_objekt
|
||||
};
|
||||
|
||||
return ausweis;
|
||||
}
|
||||
@@ -1,116 +0,0 @@
|
||||
import { VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
|
||||
import { faker } from "@faker-js/faker";
|
||||
import { Enums } from "@ibcornelsen/database/client";
|
||||
|
||||
export function verbrauchsausweisWohnenFaker(seed: number = 42): VerbrauchsausweisWohnenClient {
|
||||
faker.seed(seed);
|
||||
|
||||
const tuerenDicht = faker.datatype.boolean();
|
||||
const verbrauch_1 = faker.number.int({ min: 5000, max: 20000 });
|
||||
const verbrauch_4 = faker.number.int({ min: 5000, max: 15000 });
|
||||
|
||||
const ausweis: VerbrauchsausweisWohnenClient = {
|
||||
aufnahme: {
|
||||
rechnungen: [],
|
||||
baujahr_gebaeude: [faker.number.int({ min: 1960, max: 2014 })],
|
||||
baujahr_heizung: [faker.number.int({ min: 1960, max: 2014 })],
|
||||
baujahr_klima: [faker.number.int({ min: 1985, max: 2014 })],
|
||||
adresse: faker.location.streetAddress(),
|
||||
plz: faker.location.zipCode({ format: "#####" }),
|
||||
ort: faker.location.city(),
|
||||
nutzflaeche: faker.number.int({ min: 50, max: 300 }),
|
||||
einheiten: faker.number.int({ min: 1, max: 3 }),
|
||||
saniert: faker.datatype.boolean(),
|
||||
keller: faker.helpers.enumValue(Enums.Heizungsstatus),
|
||||
dachgeschoss: faker.helpers.enumValue(Enums.Heizungsstatus),
|
||||
flaeche: faker.number.int({ min: 50, max: 300 }),
|
||||
gebaeudetyp: "Einfamilienhaus",
|
||||
gebaeudeteil: "Gesamtgebäude",
|
||||
lueftung: "Fensterlüftung",
|
||||
kuehlung: "Vorhanden",
|
||||
objekt: {
|
||||
adresse: faker.location.streetAddress(),
|
||||
plz: faker.location.zipCode({ format: "#####" }),
|
||||
ort: faker.location.city(),
|
||||
uid: faker.string.uuid(),
|
||||
gebaeude_bilder: [],
|
||||
latitude: faker.location.latitude(),
|
||||
longitude: faker.location.longitude(),
|
||||
},
|
||||
brennstoff_1: "Erdgas H",
|
||||
alternative_heizung: faker.datatype.boolean(),
|
||||
alternative_kuehlung: faker.datatype.boolean(),
|
||||
alternative_lueftung: faker.datatype.boolean(),
|
||||
alternative_warmwasser: faker.datatype.boolean(),
|
||||
aussenwand_gedaemmt: faker.datatype.boolean(),
|
||||
aussenwand_min_12cm_gedaemmt: faker.datatype.boolean(),
|
||||
ausweisart: Enums.Ausweisart.VerbrauchsausweisWohnen,
|
||||
bestellt: faker.datatype.boolean(),
|
||||
boxpruefung: faker.datatype.boolean(),
|
||||
brennstoff_2: "Erdgas H",
|
||||
brennwert_kessel: faker.datatype.boolean(),
|
||||
dachgeschoss_gedaemmt: faker.datatype.boolean(),
|
||||
dachgeschoss_min_12cm_gedaemmt: faker.datatype.boolean(),
|
||||
doppel_verglasung: faker.datatype.boolean(),
|
||||
dreifach_verglasung: faker.datatype.boolean(),
|
||||
durchlauf_erhitzer: faker.datatype.boolean(),
|
||||
einfach_verglasung: faker.datatype.boolean(),
|
||||
einzelofen: faker.datatype.boolean(),
|
||||
energieeffizienzklasse: "",
|
||||
erledigt: faker.datatype.boolean(),
|
||||
erstellungsdatum: faker.date.past(),
|
||||
fenster_dicht: faker.datatype.boolean(),
|
||||
fenster_teilweise_undicht: faker.datatype.boolean(),
|
||||
heizungsrohre_gedaemmt: faker.datatype.boolean(),
|
||||
isolier_verglasung: faker.datatype.boolean(),
|
||||
keller_decke_gedaemmt: faker.datatype.boolean(),
|
||||
keller_wand_gedaemmt: faker.datatype.boolean(),
|
||||
leerstand: faker.number.int({ min: 0, max: 20 }),
|
||||
niedertemperatur_kessel: faker.datatype.boolean(),
|
||||
oberste_geschossdecke_gedaemmt: faker.datatype.boolean(),
|
||||
oberste_geschossdecke_min_12cm_gedaemmt: faker.datatype.boolean(),
|
||||
photovoltaik: faker.datatype.boolean(),
|
||||
prueftext: faker.lorem.sentence(),
|
||||
raum_temperatur_regler: faker.datatype.boolean(),
|
||||
rolllaeden_kaesten_gedaemmt: faker.datatype.boolean(),
|
||||
solarsystem_warmwasser: faker.datatype.boolean(),
|
||||
standard_kessel: faker.datatype.boolean(),
|
||||
storniert: false,
|
||||
tueren_dicht: tuerenDicht,
|
||||
tueren_undicht: !tuerenDicht,
|
||||
waermepumpe: faker.datatype.boolean(),
|
||||
warmwasser_rohre_gedaemmt: faker.datatype.boolean(),
|
||||
zentralheizung: faker.datatype.boolean(),
|
||||
zirkulation: faker.datatype.boolean(),
|
||||
zurueckgestellt: faker.datatype.boolean(),
|
||||
uid: faker.string.uuid(),
|
||||
events: [],
|
||||
ausstellungsdatum: faker.date.past()
|
||||
},
|
||||
verbrauch_1: verbrauch_1,
|
||||
verbrauch_2: verbrauch_1 + faker.number.int({ min: -2000, max: 2000 }),
|
||||
verbrauch_3: verbrauch_1 + faker.number.int({ min: -2000, max: 2000 }),
|
||||
einheit_1: "kWh",
|
||||
warmwasser_enthalten: faker.datatype.boolean(),
|
||||
uid: faker.string.uuid(),
|
||||
alternative_heizung: faker.datatype.boolean(),
|
||||
alternative_kuehlung: faker.datatype.boolean(),
|
||||
alternative_lueftung: faker.datatype.boolean(),
|
||||
alternative_warmwasser: faker.datatype.boolean(),
|
||||
anteil_warmwasser_1: faker.number.int({ min: 0, max: 60 }),
|
||||
anteil_warmwasser_2: faker.number.int({ min: 0, max: 60 }),
|
||||
ausstellgrund: faker.helpers.enumValue(Enums.Ausstellgrund),
|
||||
einheit_2: "kWh",
|
||||
keller_beheizt: faker.datatype.boolean(),
|
||||
registriernummer: faker.string.uuid(),
|
||||
startdatum: faker.date.past({ years: 3 }),
|
||||
verbrauch_4: verbrauch_4,
|
||||
verbrauch_5: verbrauch_4 + faker.number.int({ min: -2000, max: 2000 }),
|
||||
verbrauch_6: verbrauch_4 + faker.number.int({ min: -2000, max: 2000 }),
|
||||
warmwasser_anteil_bekannt: faker.datatype.boolean(),
|
||||
wird_gekuehlt: faker.datatype.boolean(),
|
||||
zusaetzliche_heizquelle: faker.datatype.boolean(),
|
||||
}
|
||||
|
||||
return ausweis;
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
import { z } from "zod";
|
||||
|
||||
export function zodGenerateDefaultSchema<Schema extends z.ZodFirstPartySchemaTypes>(schema: Schema): z.TypeOf<Schema> {
|
||||
switch (schema._def.typeName) {
|
||||
case z.ZodFirstPartyTypeKind.ZodDefault:
|
||||
return schema._def.defaultValue();
|
||||
case z.ZodFirstPartyTypeKind.ZodObject: {
|
||||
// The switch wasn't able to infer this but the cast should
|
||||
// be safe.
|
||||
return Object.fromEntries(
|
||||
Object.entries(
|
||||
(schema as z.SomeZodObject).shape
|
||||
).map(([key, value]) => [key, zodGenerateDefaultSchema(value)])
|
||||
);
|
||||
}
|
||||
case z.ZodFirstPartyTypeKind.ZodString:
|
||||
return "";
|
||||
case z.ZodFirstPartyTypeKind.ZodNull:
|
||||
return null;
|
||||
case z.ZodFirstPartyTypeKind.ZodNullable:
|
||||
return null;
|
||||
case z.ZodFirstPartyTypeKind.ZodUndefined:
|
||||
return undefined;
|
||||
case z.ZodFirstPartyTypeKind.ZodNumber:
|
||||
return 0;
|
||||
case z.ZodFirstPartyTypeKind.ZodBoolean:
|
||||
return false;
|
||||
case z.ZodFirstPartyTypeKind.ZodOptional:
|
||||
return undefined;
|
||||
case z.ZodFirstPartyTypeKind.ZodNativeEnum:
|
||||
return schema._def.values[0];
|
||||
case z.ZodFirstPartyTypeKind.ZodArray:
|
||||
return [];
|
||||
default:
|
||||
throw new Error(`Unsupported type ${schema._def.typeName}`);
|
||||
}
|
||||
}
|
||||
@@ -1,296 +0,0 @@
|
||||
<script lang="ts">
|
||||
import ProgressBar from "#components/Ausweis/Progressbar.svelte";
|
||||
import type { Bezahlmethoden } from "@ibcornelsen/database/client";
|
||||
import { Enums } from "@ibcornelsen/database/client";
|
||||
import { dialogs } from "svelte-dialogs";
|
||||
import LoginDialog from "#components/LoginDialog.svelte";
|
||||
import { PRICES } from "#lib/constants.js";
|
||||
import {
|
||||
BenutzerClient,
|
||||
VerbrauchsausweisWohnenClient,
|
||||
} from "#components/Ausweis/types.js";
|
||||
import { validateAccessTokenClient } from "src/client/lib/validateAccessToken.js";
|
||||
import { client } from "src/trpc.js";
|
||||
|
||||
export let user: BenutzerClient;
|
||||
export let ausweis: VerbrauchsausweisWohnenClient;
|
||||
|
||||
let services = [
|
||||
{
|
||||
name: "Qualitätsdruck per Post (zusätzlich zur PDF Version) für 9€ inkl. MwSt.",
|
||||
id: Enums.Service.Qualitaetsdruck,
|
||||
price: 9,
|
||||
selected: false,
|
||||
},
|
||||
{
|
||||
name: "Aushang (für öffentliche Gebäude gesetzlich vorgeschrieben) für 10€ inkl. MwSt.",
|
||||
id: Enums.Service.Aushang,
|
||||
price: 10,
|
||||
selected: false,
|
||||
},
|
||||
{
|
||||
name: "Same Day Service (Bestellung Werktags vor 12:00 Uhr - Ausstellung bis 18:00 Uhr am gleichen Tag) für 29€ inkl. MwSt.",
|
||||
id: Enums.Service.SameDay,
|
||||
price: 29,
|
||||
selected: false,
|
||||
},
|
||||
{
|
||||
name: "Telefonische Energieeffizienzberatung für 75€ inkl. MwSt.",
|
||||
id: Enums.Service.Telefonberatung,
|
||||
price: 75,
|
||||
selected: false,
|
||||
},
|
||||
];
|
||||
|
||||
export let selectedPaymentType: Bezahlmethoden =
|
||||
Enums.Bezahlmethoden.paypal;
|
||||
|
||||
let prices: number[] = [];
|
||||
|
||||
if (ausweis.aufnahme.ausweisart) {
|
||||
prices = PRICES[ausweis.aufnahme.ausweisart];
|
||||
}
|
||||
|
||||
let basePrice: number = prices[0];
|
||||
|
||||
$: price =
|
||||
basePrice +
|
||||
services.reduce(
|
||||
(acc, service) => (service.selected && acc + service.price) || acc,
|
||||
0
|
||||
);
|
||||
|
||||
async function speichern(e: SubmitEvent) {
|
||||
e.preventDefault();
|
||||
|
||||
// Um einen Ausweis zu speichern müssen wir eingeloggt sein, andernfalls wird die API den call ablehnen.
|
||||
// Wir prüfen also ob wir eingeloggt sind und leiten den Nutzer ggf. auf die Login Seite weiter.
|
||||
if (!(await validateAccessTokenClient())) {
|
||||
// TOOD: Auf Dialog umstellen.
|
||||
const loggedIn = await dialogs.modal(LoginDialog);
|
||||
|
||||
if (!loggedIn) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Falls der Ausweis noch keine benutzer_id hat müssen wir ihn claimen, damit er dem jetzigen Nutzer zugewiesen wird...
|
||||
await client.v1.verbrauchsausweisWohnen.claim.mutate({
|
||||
uid: ausweis.uid,
|
||||
});
|
||||
|
||||
window.location.href = `/kaufabschluss?uid=${ausweis.uid}`;
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
|
||||
<form on:submit={speichern}>
|
||||
<div class="grid grid-cols-[1.5fr_2fr] gap-4">
|
||||
<div
|
||||
class="rounded-lg border p-4 border-base-300 bg-base-100 flex flex-col gap-4"
|
||||
>
|
||||
<div class="flex flex-col gap-2 test-box">
|
||||
<strong>A - Prüfung der Ausweisart</strong>
|
||||
<div>
|
||||
<span>Vermietung, Verkauf oder sonstiges</span>
|
||||
<span
|
||||
>Baujahr Heizung nicht kleiner als Baujahr Gebäude</span
|
||||
><span
|
||||
>Baujahr nach 1977 oder saniert oder mehr als 4
|
||||
Wohneinheiten</span
|
||||
><span>Heizung min. 3 Jahre alt</span><span
|
||||
>Verbrauchsausweis zulässig</span
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-col gap-2 test-box">
|
||||
<strong
|
||||
>B - Prüfung der Adresse, Wohnfläche, Keller und Dach</strong
|
||||
>
|
||||
<div>
|
||||
<span>PLZ gültig</span><span>Klimafaktorern</span><span
|
||||
>Wohnfläche passt zu Wohneinheiten</span
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-col gap-2 test-box">
|
||||
<strong>C - Prüfung der Verbrauchsangaben</strong>
|
||||
<div>
|
||||
<span>Verbrauchsmenge schlüssig</span><span
|
||||
>Verbrauchsabweichung im Rahmen</span
|
||||
><span>Endenergieverbrauch schlüssig</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-col gap-2 test-box">
|
||||
<strong
|
||||
>D - Prüfung Warmwasser und alternative
|
||||
Energieversorgung</strong
|
||||
>
|
||||
<div>
|
||||
<span>Warmwasseranteil schlüssig</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-col gap-2 test-box">
|
||||
<strong
|
||||
>E - Prüfung von Gebäudetyp, Lüftung, Kühlung und
|
||||
Leerstand</strong
|
||||
>
|
||||
<div>
|
||||
<span>Leerstand nicht größer als 30%</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-col gap-2 test-box">
|
||||
<strong
|
||||
>F - Prüfung des Sanierungsstandes und der Gebäudebilder</strong
|
||||
>
|
||||
<div>
|
||||
<span>Mindestens ein Bild pro Abschnitt vorhanden</span
|
||||
><span>Angaben zum Sanierungsstand vorhanden</span><span
|
||||
>Bei Baujahr vor 1978 Dach oder Geschossdecke min.
|
||||
12 cm gedämmt</span
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<div
|
||||
class="rounded-lg border p-4 border-base-300 bg-base-100 flex flex-col"
|
||||
>
|
||||
<table>
|
||||
<tr>
|
||||
<td><strong>Produkt:</strong></td>
|
||||
<td><div class="py-2">Verbrauchsausweis</div></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Beschreibung:</strong></td>
|
||||
<td>
|
||||
<div class="py-2">
|
||||
Registrierung beim DiBt<br />
|
||||
Prüfung durch Diplom Ingenieur<br />
|
||||
Energieausweis Vorschau als PDF<br />
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Netto-Preis</td>
|
||||
<td
|
||||
><div class="py-2">
|
||||
{(price * 0.81).toFixed(2) + "€"}
|
||||
</div></td
|
||||
>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>19% gesetzl. MwSt.</td>
|
||||
<td
|
||||
><div class="py-2">
|
||||
{(price * 0.19).toFixed(2) + "€"}
|
||||
</div></td
|
||||
>
|
||||
</tr>
|
||||
<hr />
|
||||
<tr>
|
||||
<td>Preis inkl. MwSt.</td>
|
||||
<td
|
||||
><div class="py-2">
|
||||
<strong>{price + "€"}</strong>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<h3 class="font-semibold mt-8">
|
||||
Hiermit bestelle ich folgende Version des Energieausweises:
|
||||
</h3>
|
||||
<div
|
||||
class="rounded-lg border p-4 border-base-300 bg-base-100 flex flex-col"
|
||||
>
|
||||
<table>
|
||||
<tr>
|
||||
<td
|
||||
>Verbrauchsausweis online für {prices[0]} € inkl.
|
||||
MwSt. als PDF per E-Mail</td
|
||||
>
|
||||
<td
|
||||
><input
|
||||
type="radio"
|
||||
class="radio radio-secondary"
|
||||
bind:group={basePrice}
|
||||
value={prices[0]}
|
||||
name="Preis"
|
||||
checked
|
||||
/>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td
|
||||
>Verbrauchsausweis online inkl. Beratung für {prices[1]}
|
||||
€ inkl. MwSt. als PDF per E-Mail</td
|
||||
>
|
||||
<td
|
||||
><input
|
||||
type="radio"
|
||||
class="radio radio-secondary"
|
||||
bind:group={basePrice}
|
||||
value={prices[1]}
|
||||
name="Preis"
|
||||
/>
|
||||
</td>
|
||||
</tr><tr>
|
||||
<td
|
||||
>Verbrauchsausweis offline für {prices[2]} € inkl.
|
||||
MwSt. als PDF per E-Mail (Sie schicken uns 3 Verbrauchsabrechnungen)</td
|
||||
>
|
||||
<td
|
||||
><input
|
||||
type="radio"
|
||||
class="radio radio-secondary"
|
||||
bind:group={basePrice}
|
||||
value={prices[2]}
|
||||
name="Preis"
|
||||
/></td
|
||||
>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<h3 class="font-semibold mt-8">Zusatzleistungen</h3>
|
||||
<div
|
||||
class="rounded-lg border p-4 border-base-300 bg-base-100 flex flex-col"
|
||||
>
|
||||
<table>
|
||||
{#each services as service}
|
||||
<tr>
|
||||
<td>{service.name}</td>
|
||||
<td
|
||||
><input
|
||||
type="checkbox"
|
||||
class="checkbox checkbox-secondary"
|
||||
bind:checked={service.selected}
|
||||
/>
|
||||
</td>
|
||||
</tr>
|
||||
{/each}
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-row justify-between">
|
||||
<!-- TODO: Zurück implementieren -->
|
||||
<button class="btn btn-secondary mt-4">Zurück</button>
|
||||
<div class="flex flex-row gap-4">
|
||||
<!-- TODO: Speichern implementieren -->
|
||||
<button class="btn btn-secondary mt-4">Speichern</button>
|
||||
<button class="btn btn-secondary mt-4">Zum Kaufabschluss</button
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
|
||||
<style>
|
||||
.test-box div {
|
||||
@apply flex flex-col gap-1.5;
|
||||
}
|
||||
</style>
|
||||
@@ -1,8 +1,8 @@
|
||||
<script lang="ts">
|
||||
import { addNotification } from "@ibcornelsen/ui";
|
||||
import { CrossCircled } from "radix-svelte-icons";
|
||||
import {client} from "src/trpc.js";
|
||||
import { fade } from "svelte/transition";
|
||||
import { api } from "astro-typesafe-api/client";
|
||||
|
||||
let passwort: string;
|
||||
let email: string;
|
||||
@@ -14,7 +14,7 @@
|
||||
async function login(e: SubmitEvent) {
|
||||
e.preventDefault()
|
||||
try {
|
||||
const response = await client.v1.benutzer.erstellen.mutate({
|
||||
const { uid } = await api.user.PUT.fetch({
|
||||
email,
|
||||
passwort,
|
||||
vorname,
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
import { validateAccessTokenClient } from "#client/lib/validateAccessToken.js";
|
||||
import { verbrauchsausweisWohnenSpeichern } from "#client/lib/verbrauchsausweisWohnenSpeichern.js";
|
||||
import { AufnahmeClient, BenutzerClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
|
||||
import { addNotification, updateNotification } from "#components/Notifications/index.js";
|
||||
import { addNotification } from "#components/Notifications/index.js";
|
||||
import Overlay from "#components/Overlay.svelte";
|
||||
import EmbeddedAuthFlowModule from "#modules/EmbeddedAuthFlowModule.svelte";
|
||||
|
||||
@@ -14,56 +14,6 @@
|
||||
export let user: BenutzerClient;
|
||||
export let aufnahme: AufnahmeClient;
|
||||
|
||||
async function bilderHochladen() {
|
||||
// Alle Bilder hochladen
|
||||
if (images.length === 0) {
|
||||
return
|
||||
}
|
||||
|
||||
const notification = addNotification({
|
||||
dismissable: false,
|
||||
message: "Bilder hochladen.",
|
||||
subtext: `${images.length} Bilder werden hochgeladen, bitte haben sie Geduld.`,
|
||||
timeout: 0,
|
||||
type: "info"
|
||||
})
|
||||
for (let i = 0; i < images.length; i++) {
|
||||
const image = images[i];
|
||||
if (image.uid) {
|
||||
// Bild wurde bereits hochgeladen, wir müssen es also nicht nochmal hochladen.
|
||||
continue
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await api.objekt._uid.bilder.PUT.fetch({
|
||||
base64: image.base64,
|
||||
kategorie: image.kategorie
|
||||
}, {
|
||||
params: {
|
||||
uid: objekt.uid
|
||||
}
|
||||
})
|
||||
|
||||
image.uid = response.uid
|
||||
|
||||
updateNotification(notification, {
|
||||
dismissable: true,
|
||||
message: "Bild hochgeladen.",
|
||||
subtext: `${i + 1}/${images.length} Bildern wurden erfolgreich hochgeladen, bitte haben sie Geduld.`,
|
||||
timeout: 4000
|
||||
})
|
||||
} catch (e) {
|
||||
updateNotification(notification, {
|
||||
dismissable: true,
|
||||
message: "Bild konnte nicht hochgeladen werden.",
|
||||
subtext: `Bild ${i + 1}/${images.length} konnte nicht hochgeladen werden, wir haben bereits ein Ticket erstellt und melden uns so schnell wie möglich bei ihnen.`,
|
||||
timeout: 150000,
|
||||
type: "error"
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function ausweisSpeichern() {
|
||||
// Um einen Ausweis zu speichern müssen wir eingeloggt sein, andernfalls wird die API den call ablehnen.
|
||||
// Wir prüfen also ob wir eingeloggt sind und leiten den Nutzer ggf. auf die Login Seite weiter.
|
||||
@@ -81,11 +31,9 @@
|
||||
const response = await verbrauchsausweisWohnenSpeichern(ausweis,
|
||||
objekt,
|
||||
aufnahme,
|
||||
images,
|
||||
user)
|
||||
images)
|
||||
|
||||
if (response !== null) {
|
||||
await bilderHochladen();
|
||||
// Falls der Nutzer zurück navigiert, sollte er wieder auf seinen Vorgang kommen.
|
||||
// Sonst müsste er alles neu eingeben...
|
||||
ausweis.uid = response.uid_ausweis;
|
||||
@@ -94,8 +42,6 @@
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
return false;
|
||||
} catch (e: any) {
|
||||
await api.ticket.PUT.fetch({
|
||||
titel: "Ausweis konnte nicht gespeichert werden",
|
||||
|
||||
@@ -1,858 +0,0 @@
|
||||
<script lang="ts">
|
||||
import PerformanceScore from "#components/Ausweis/PerformanceScore.svelte";
|
||||
import Progressbar from "#components/Ausweis/Progressbar.svelte";
|
||||
import Hilfe from "#components/Ausweis/Hilfe.svelte";
|
||||
import HelpLabel from "#components/HelpLabel.svelte";
|
||||
import Verbrauch from "#components/Ausweis/Verbrauch.svelte";
|
||||
import Label from "#components/Label.svelte";
|
||||
import Ausweisart from "#components/Ausweis/Ausweisart.svelte";
|
||||
import ZipSearch from "#components/PlzSuche.svelte";
|
||||
import moment from "moment";
|
||||
import BilderZusatzsysteme from "#components/Ausweis/BilderZusatzsysteme.svelte";
|
||||
import { RawNotificationWrapper, RawNotification, notifications } from "#components/Notifications/index.js";
|
||||
import { auditHeizungGebaeudeBaujahr } from "#components/Verbrauchsausweis/audits/HeizungGebaeudeBaujahr.js";
|
||||
import { auditHeizungJuengerDreiJahre } from "#components/Verbrauchsausweis/audits/HeizungJuengerDreiJahre.js";
|
||||
import { auditZeitraumAktuell } from "#components/Verbrauchsausweis/audits/ZeitraumAktuell.js";
|
||||
import { auditKlimaFaktoren } from "#components/Verbrauchsausweis/audits/KlimaFaktoren.js";
|
||||
import { auditWohnFlaeche } from "#components/Verbrauchsausweis/audits/WohnFlaeche.js";
|
||||
import { auditWarmWasser } from "#components/Verbrauchsausweis/audits/WarmWasser.js";
|
||||
import { auditLeerStand } from "#components/Verbrauchsausweis/audits/LeerStand.js";
|
||||
import { auditPlzNichtErkannt } from "#components/Verbrauchsausweis/audits/PlzNichtErkannt.js";
|
||||
import { AuditType, hidden } from "#components/Verbrauchsausweis/audits/hidden.js";
|
||||
import { auditBedarfsausweisBenoetigt } from "#components/Verbrauchsausweis/audits/BedarfsausweisBenoetigt.js";
|
||||
import { auditVerbrauchAbweichung } from "#components/Verbrauchsausweis/audits/VerbrauchAbweichung.js";
|
||||
import { auditEndEnergie } from "#components/Verbrauchsausweis/audits/EndEnergie.js";
|
||||
import { auditWohnflaecheGroesserGesamtflaeche } from "#components/Verbrauchsausweis/audits/WohnflaecheGroesserGesamtflaeche.js";
|
||||
import { Enums } from "@ibcornelsen/database/client"
|
||||
import Overlay from "#components/Overlay.svelte";
|
||||
import AusweisGespeichertModule from "./AusweisGespeichertModule.svelte";
|
||||
import { VerbrauchsausweisWohnenClient, BenutzerClient, UploadedGebaeudeBild } from "#components/Ausweis/types.js";
|
||||
import { verbrauchsausweisWohnenSpeichern } from "src/client/lib/verbrauchsausweisWohnenSpeichern.js";
|
||||
|
||||
// TODO: Vom Server sollte ein volles Objekt kommen, dass alle Subobjekte enthält, weil es sonst zu Problemen führen kann
|
||||
// wenn aufnahme oder objekt nicht existiert...
|
||||
export let ausweis: VerbrauchsausweisWohnenClient;
|
||||
export let user: BenutzerClient = {} as BenutzerClient;
|
||||
|
||||
let aufnahme = ausweis.aufnahme || {};
|
||||
let gebaeude = ausweis.aufnahme?.objekt || {};
|
||||
let images: (UploadedGebaeudeBild & { base64?: string })[] = ausweis.aufnahme?.objekt?.gebaeude_bilder || [];
|
||||
|
||||
async function spaeterWeitermachen() {
|
||||
const result = await verbrauchsausweisWohnenSpeichern(ausweis, gebaeude, aufnahme, images, user);
|
||||
|
||||
if (result !== null) {
|
||||
// Falls der Nutzer zurück navigiert, sollte er wieder auf seinen Vorgang kommen.
|
||||
// Sonst müsste er alles neu eingeben...
|
||||
ausweis.uid = result.uid
|
||||
gebaeude.uid = result.gebaeude_uid
|
||||
aufnahme.uid = result.gebaeude_aufnahme_uid
|
||||
window.history.pushState({}, "", `${location.pathname}?uid=${result.uid}`);
|
||||
speichernOverlayHidden = false;
|
||||
}
|
||||
}
|
||||
|
||||
function automatischAusfüllen() {
|
||||
aufnahme.baujahr_gebaeude = [1962];
|
||||
aufnahme.baujahr_heizung = [1952];
|
||||
aufnahme.saniert = true;
|
||||
aufnahme.einheiten = 1;
|
||||
ausweis.ausstellgrund = "Vermietung";
|
||||
ausweis.verbrauch_1 = 15000;
|
||||
ausweis.verbrauch_2 = 14000;
|
||||
ausweis.verbrauch_3 = 16000;
|
||||
aufnahme.flaeche = 152;
|
||||
aufnahme.nutzflaeche = 172;
|
||||
ausweis.keller_beheizt = true;
|
||||
aufnahme.brennstoff_1 = "Erdgas H";
|
||||
ausweis.einheit_1 = "kWh";
|
||||
ausweis.anteil_warmwasser_1 = 18;
|
||||
ausweis.startdatum = moment("01.01.2019").toDate();
|
||||
aufnahme.plz = "21039";
|
||||
aufnahme.ort = "Hamburg";
|
||||
aufnahme.adresse = "Curslacker Deich 170";
|
||||
aufnahme.gebaeudeteil = "Gesamtgebäude";
|
||||
|
||||
gebaeude = gebaeude;
|
||||
ausweis = ausweis;
|
||||
}
|
||||
|
||||
|
||||
async function ausweisAbschicken(e: SubmitEvent) {
|
||||
if (e && e.preventDefault) e.preventDefault();
|
||||
const result = await verbrauchsausweisWohnenSpeichern(ausweis, gebaeude, aufnahme, images, user);
|
||||
|
||||
if (result !== null) {
|
||||
// Falls der Nutzer zurück navigiert, sollte er wieder auf seinen Vorgang kommen.
|
||||
// Sonst müsste er alles neu eingeben...
|
||||
ausweis.uid = result.uid
|
||||
gebaeude.uid = result.gebaeude_uid
|
||||
aufnahme.uid = result.gebaeude_aufnahme_uid
|
||||
window.history.pushState({}, "", `${location.pathname}?uid=${result.uid}`);
|
||||
window.location.href = `/kundendaten?uid=${result.uid}`;
|
||||
}
|
||||
}
|
||||
|
||||
let waitOverlayHidden = true;
|
||||
let speichernOverlayHidden = true;
|
||||
|
||||
$: {
|
||||
if (aufnahme.saniert
|
||||
&& aufnahme.oberste_geschossdecke_gedaemmt === undefined
|
||||
&& aufnahme.dachgeschoss_gedaemmt === undefined) {
|
||||
|
||||
aufnahme.oberste_geschossdecke_gedaemmt = true;
|
||||
aufnahme.dachgeschoss_gedaemmt = true;
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<Overlay bind:hidden={speichernOverlayHidden}>
|
||||
<div class="bg-white w-full max-w-screen-sm py-8 px-8">
|
||||
<AusweisGespeichertModule uid={ausweis.uid}></AusweisGespeichertModule>
|
||||
</div>
|
||||
</Overlay>
|
||||
|
||||
<Overlay bind:hidden={waitOverlayHidden}>
|
||||
<p class="text-white font-semibold text-4xl">
|
||||
Bitte warten sie, ihr Ausweis wird nun erstellt.
|
||||
</p>
|
||||
</Overlay>
|
||||
|
||||
<div class="flex flex-row gap-8 items-center mb-8">
|
||||
<div class="flex flex-col w-full">
|
||||
<h1>Verbrauchsausweis erstellen - 45€</h1>
|
||||
<Progressbar progress={0} />
|
||||
</div>
|
||||
|
||||
<PerformanceScore
|
||||
bind:ausweis
|
||||
bind:aufnahme={aufnahme}
|
||||
bind:objekt={gebaeude}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<form on:submit={ausweisAbschicken} name="ausweis" data-test="ausweis">
|
||||
<div class="yellow-box">
|
||||
<div class="flex flex-row justify-between">
|
||||
<button class="button" type="button" on:click={spaeterWeitermachen}
|
||||
>Später Weitermachen</button
|
||||
>
|
||||
<div class="flex gap-4">
|
||||
<Hilfe />
|
||||
<button
|
||||
on:click={automatischAusfüllen}
|
||||
type="button"
|
||||
class="button">Automatisch Ausfüllen</button
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
|
||||
<Label>A - Prüfung der Ausweisart</Label>
|
||||
|
||||
<Ausweisart
|
||||
bind:objekt={gebaeude}
|
||||
bind:aufnahme={aufnahme}
|
||||
bind:ausweis
|
||||
/>
|
||||
|
||||
<hr />
|
||||
|
||||
<Label
|
||||
>B - Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Kellerund
|
||||
Dachgeschoss</Label
|
||||
>
|
||||
|
||||
<div class="GRB">
|
||||
<!-- Strasse -->
|
||||
<div class="form-group col-md-4">
|
||||
<HelpLabel title="Straße, Hausnummer *">
|
||||
Bitte geben Sie hier die Straße und Hausnummer des Gebäudes
|
||||
ein.
|
||||
</HelpLabel>
|
||||
<div>
|
||||
<input
|
||||
name="adresse"
|
||||
data-test="adresse"
|
||||
type="text"
|
||||
autocomplete="off"
|
||||
required
|
||||
data-msg-minlength="min. 5 Zeichen"
|
||||
data-msg-maxlength="max. 40 Zeichen"
|
||||
bind:value={aufnahme.adresse}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- PLZ -->
|
||||
<div class="form-group col-md-4 PLZ">
|
||||
<ZipSearch
|
||||
bind:zip={aufnahme.plz}
|
||||
bind:city={aufnahme.ort}
|
||||
name="plz"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="form-group col-md-4">
|
||||
<HelpLabel title="Ort *">
|
||||
Ort des Gebäudes wird automatisch ermittelt.
|
||||
</HelpLabel>
|
||||
<div>
|
||||
<input
|
||||
name="ort"
|
||||
data-test="ort"
|
||||
readonly={true}
|
||||
bind:value={aufnahme.ort}
|
||||
type="text"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Wohnfläche -->
|
||||
<div class="form-group col-md-3">
|
||||
<HelpLabel title="Wohnfläche m² *">
|
||||
Bitte geben Sie hier die beheizte Wohnfläche in m² ein.
|
||||
Dabei handelt es sich um die Wohnfläche abzüglich
|
||||
vorhandener Flächen die sich außerhalb des Gebäudes
|
||||
befinden. (Balkone, Terassen,etc.).
|
||||
</HelpLabel>
|
||||
<div>
|
||||
<input
|
||||
name="flaeche"
|
||||
data-test="flaeche"
|
||||
maxlength="4"
|
||||
type="number"
|
||||
required
|
||||
autocomplete="off"
|
||||
data-rule-minlength="2"
|
||||
data-msg-minlength="min. 2 Zeichen"
|
||||
bind:value={aufnahme.flaeche}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Keller -->
|
||||
<div class="form-group col-md-3">
|
||||
<Label>Keller *</Label>
|
||||
<div>
|
||||
<select
|
||||
name="keller"
|
||||
data-test="keller"
|
||||
required
|
||||
bind:value={aufnahme.keller}
|
||||
>
|
||||
<option disabled>Bitte auswählen</option>
|
||||
<option value={Enums.Heizungsstatus.NICHT_VORHANDEN}
|
||||
>nicht vorhanden</option
|
||||
>
|
||||
<option value={Enums.Heizungsstatus.UNBEHEIZT}
|
||||
>unbeheizt</option
|
||||
>
|
||||
<option value={Enums.Heizungsstatus.BEHEIZT}
|
||||
>beheizt</option
|
||||
>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Dachgeschoss -->
|
||||
<div class="form-group col-md-3">
|
||||
<Label>Dachgeschoss *</Label>
|
||||
<div>
|
||||
<select
|
||||
name="dachgeschoss"
|
||||
data-test="dachgeschoss"
|
||||
bind:value={aufnahme.dachgeschoss}
|
||||
required
|
||||
>
|
||||
<option disabled>Bitte auswählen</option>
|
||||
<option value={Enums.Heizungsstatus.NICHT_VORHANDEN}
|
||||
>nicht vorhanden</option
|
||||
>
|
||||
<option value={Enums.Heizungsstatus.UNBEHEIZT}
|
||||
>unbeheizt</option
|
||||
>
|
||||
<option value={Enums.Heizungsstatus.BEHEIZT}
|
||||
>beheizt</option
|
||||
>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Gesamtfläche -->
|
||||
<div class="form-group col-md-3">
|
||||
<HelpLabel title="Gesamtfläche m²">
|
||||
Bitte geben Sie hier die beheizte Gesamtfläche in m² ein
|
||||
(wenn bekannt). Dabei handelt es sich um die Wohnfläche +
|
||||
weiterer Flächen innerhalb des Gebäudes (z.B. Fläche des
|
||||
beheizten Kellers). Diese Fläche wird dann im Energieausweis
|
||||
als energetische Nutzfläche (An) ausgewiesen.
|
||||
</HelpLabel>
|
||||
<div>
|
||||
<input
|
||||
name="nutzflaeche"
|
||||
data-test="nutzflaeche"
|
||||
maxlength="4"
|
||||
type="number"
|
||||
required
|
||||
autocomplete="off"
|
||||
data-rule-minlength="2"
|
||||
data-msg-minlength="min. 2 Zeichen"
|
||||
bind:value={aufnahme.nutzflaeche}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
|
||||
<Label>C - Eingabe von 3 zusammenhängenden Verbrauchsjahren</Label>
|
||||
|
||||
<div class="GRB">
|
||||
<Verbrauch
|
||||
bind:gebaeude
|
||||
bind:aufnahme
|
||||
bind:ausweis
|
||||
/>
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
|
||||
<Label
|
||||
>D - Eingabe Warmwasseranteil und Verwendung von alternativen
|
||||
Energieversorgungssystemen</Label
|
||||
>
|
||||
|
||||
<div class="GRB">
|
||||
<!-- Anteil WW enthalten -->
|
||||
<div class="flex flex-col">
|
||||
<div class="flex flex-row gap-4 items-center">
|
||||
<input
|
||||
type="checkbox"
|
||||
class="checkbox"
|
||||
name="warmwasser_enthalten"
|
||||
data-test="warmwasser_enthalten"
|
||||
bind:checked={ausweis.warmwasser_enthalten}
|
||||
/>
|
||||
<Label>Warmwasser im Verbrauch enthalten</Label>
|
||||
</div>
|
||||
<div class="flex flex-row gap-4 items-center">
|
||||
<input
|
||||
type="checkbox"
|
||||
class="checkbox"
|
||||
name="warmwasser_anteil_bekannt"
|
||||
data-test="warmwasser_anteil_bekannt"
|
||||
bind:checked={ausweis.warmwasser_anteil_bekannt}
|
||||
disabled={!ausweis.warmwasser_enthalten}
|
||||
/>
|
||||
<Label>Anteil bekannt</Label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Warmwasser Antel -->
|
||||
<div class="form-group col-md-2">
|
||||
<HelpLabel title="% Anteil Warmwasser">
|
||||
Wenn bekannt geben Sie den Anteil der Warmwasser-Versorgung
|
||||
hier ein. Standardmäßig wird ein Anteil von 18% angenommen.
|
||||
</HelpLabel>
|
||||
|
||||
<input
|
||||
name="anteil_warmwasser_1"
|
||||
data-test="anteil_warmwasser_1"
|
||||
maxlength="2"
|
||||
type="number"
|
||||
bind:value={ausweis.anteil_warmwasser_1}
|
||||
disabled={!ausweis.warmwasser_anteil_bekannt ||
|
||||
!ausweis.warmwasser_enthalten}
|
||||
autocomplete="off"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="form-group col-md-2">
|
||||
<HelpLabel title="zusätzliche Heizquelle">
|
||||
Wenn bekannt geben Sie den Anteil der Warmwasser-Versorgung
|
||||
von der zusätzlichen Heizquelle hier ein. Standardmäßig wird
|
||||
ein Anteil von 18% angenommen.
|
||||
</HelpLabel>
|
||||
<input
|
||||
name="anteil_warmwasser_2"
|
||||
data-test="anteil_warmwasser_2"
|
||||
maxlength="3"
|
||||
type="number"
|
||||
autocomplete="off"
|
||||
bind:value={ausweis.anteil_warmwasser_2}
|
||||
disabled={!ausweis.zusaetzliche_heizquelle ||
|
||||
!ausweis.warmwasser_anteil_bekannt ||
|
||||
!ausweis.warmwasser_enthalten}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<!-- Alternative Energieversorgungssyteme -->
|
||||
<div class="form-group col-md-5">
|
||||
<HelpLabel
|
||||
title="Alternative Energieversorgungssysteme genutzt für "
|
||||
>
|
||||
Bitte setzen Sie den Haken falls nachhaltige CO2-Effiziente
|
||||
Heizungssysteme vorhanden sind. Das wäre beispielsweise bei
|
||||
Pelletofen, Wärmepumpe, BHKW, Solarsystem, etc. der Fall.
|
||||
</HelpLabel>
|
||||
<div class="flex flex-row gap-4">
|
||||
<label class="checkbox-inline"
|
||||
><input
|
||||
type="checkbox"
|
||||
name="alternative_heizung"
|
||||
data-test="alternative_heizung"
|
||||
bind:checked={ausweis.alternative_heizung}
|
||||
value="Heizung"
|
||||
/>Heizung</label
|
||||
>
|
||||
<label class="checkbox-inline"
|
||||
><input
|
||||
type="checkbox"
|
||||
name="alternative_warmwasser"
|
||||
data-test="alternative_warmwasser"
|
||||
bind:checked={ausweis.alternative_warmwasser}
|
||||
value="Warmwasser"
|
||||
/>Warmwasser</label
|
||||
>
|
||||
<label class="checkbox-inline"
|
||||
><input
|
||||
type="checkbox"
|
||||
name="alternative_lueftung"
|
||||
data-test="alternative_lueftung"
|
||||
bind:checked={ausweis.alternative_lueftung}
|
||||
value="Lüftung"
|
||||
/>Lüftung</label
|
||||
>
|
||||
<label class="checkbox-inline"
|
||||
><input
|
||||
type="checkbox"
|
||||
name="alternative_kuehlung"
|
||||
data-test="alternative_kuehlung"
|
||||
bind:checked={ausweis.alternative_kuehlung}
|
||||
value="Kühlung"
|
||||
/>Kühlung</label
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
|
||||
<Label
|
||||
>E - Eingabe von Gebäudetyp, Gebäudeteil, Lüftung, Kühlung und
|
||||
Leerstand</Label
|
||||
>
|
||||
|
||||
<div class="GRB">
|
||||
<!-- Gebäudetyp -->
|
||||
<div class="form-group col-md-3">
|
||||
<HelpLabel title="Gebäudetyp *">
|
||||
Bitte wählen Sie hier den Gebäudetyp aus.
|
||||
</HelpLabel>
|
||||
<div>
|
||||
<select
|
||||
name="gebaeudetyp"
|
||||
data-test="gebaeudetyp"
|
||||
bind:value={aufnahme.gebaeudetyp}
|
||||
required
|
||||
>
|
||||
<option disabled>Bitte auswählen</option>
|
||||
<option value="Einfamilienhaus">Einfamilienhaus</option>
|
||||
<option value="Freistehendes Einfamilienhaus"
|
||||
>Freistehendes Einfamilienhaus</option
|
||||
>
|
||||
<option value="Freistehendes Zweifamilienhaus"
|
||||
>Freistehendes Zweifamilienhaus</option
|
||||
>
|
||||
<option value="Doppelhaushälfte"
|
||||
>Doppelhaushälfte</option
|
||||
>
|
||||
<option value="Reihenendhaus">Reihenendhaus</option>
|
||||
<option value="Reihenmittelhaus"
|
||||
>Reihenmittelhaus</option
|
||||
>
|
||||
<option value="Mehrfamilienhaus"
|
||||
>Mehrfamilienhaus</option
|
||||
>
|
||||
<option value="Wohn- und Geschäftshaus"
|
||||
>Wohn- und Geschäftshaus</option
|
||||
>
|
||||
<option value="Atrium-Bungalow">Atrium-Bungalow</option>
|
||||
<option value="Winkelbungalow">Winkelbungalow</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Gebäudeteil -->
|
||||
<div class="form-group col-md-3">
|
||||
<HelpLabel title="Gebäudeteil *">
|
||||
Bitte geben Sie hier den Gebäudeteil ein. In den meisten
|
||||
Fällen handelt es sich um das Gesamtgebäude. Sollte es sich
|
||||
allerdings um ein Gebäude mit mehr als 10% Gewerbeanteil
|
||||
handeln, so sollten 2 Ausweise erstellt werden. In diesem
|
||||
Fall wählen Sie Gebäudeteil 'Wohnen' bzw. Gebäudeteil
|
||||
'Gewerbe'.
|
||||
</HelpLabel>
|
||||
<div>
|
||||
<select
|
||||
name="gebaeudeteil"
|
||||
data-test="gebaeudeteil"
|
||||
bind:value={aufnahme.gebaeudeteil}
|
||||
required
|
||||
>
|
||||
<option disabled>Bitte auswählen</option>
|
||||
<option value="Gesamtgebäude">Gesamtgebäude</option>
|
||||
<option value="Wohnen">Wohnen</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Lüftung -->
|
||||
<div class="form-group col-md-2">
|
||||
<HelpLabel title="Lüftung durch *">
|
||||
Bitte geben Sie hier ein ob über die Fenster natürlich
|
||||
belüftet wird oder über eine Lüftungsanlage.
|
||||
</HelpLabel>
|
||||
<div>
|
||||
<select
|
||||
name="lueftung"
|
||||
data-test="lueftung"
|
||||
required
|
||||
bind:value={aufnahme.lueftung}
|
||||
>
|
||||
<option disabled>Bitte auswählen</option>
|
||||
<option value="Fensterlüftung">Fensterlüftung</option>
|
||||
<option value="Schachtlüftung">Schachtlüftung</option>
|
||||
<option value="Lüftungsanlage ohne Wärmerückgewinnung"
|
||||
>Lüftungsanlage ohne Wärmerückgewinnung</option
|
||||
>
|
||||
<option value="Lüftungsanlage mit Wärmerückgewinnung"
|
||||
>Lüftungsanlage mit Wärmerückgewinnung</option
|
||||
>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Lüftung -->
|
||||
<div class="form-group col-md-2">
|
||||
<HelpLabel title="Anlage Kühlung *">
|
||||
Bitte geben Sie an ob das Gebäude im Sommer zusätzlich
|
||||
gekühlt wird.
|
||||
</HelpLabel>
|
||||
<div>
|
||||
<select
|
||||
name="kuehlung"
|
||||
data-test="kuehlung"
|
||||
required
|
||||
bind:value={aufnahme.kuehlung}
|
||||
>
|
||||
<option disabled>Bitte auswählen</option>
|
||||
<option value="1">vorhanden</option>
|
||||
<option value="0">nicht vorhanden</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Leerstand -->
|
||||
<div class="form-group col-md-2">
|
||||
<HelpLabel title="Leerstand in %">
|
||||
Bitte geben Sie hier den Leerstand in % des Gesamtzeitraumes
|
||||
(3 Jahre) ein. Zum Beispiel 4 Monate Leerstand in 36 Monaten
|
||||
wären dann ca. 11%.
|
||||
</HelpLabel>
|
||||
<div>
|
||||
<input
|
||||
name="leerstand"
|
||||
data-test="leerstand"
|
||||
maxlength="2"
|
||||
type="number"
|
||||
bind:value={aufnahme.leerstand}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
|
||||
<Label
|
||||
>F - Bitte prüfen Sie hier die Angaben zum Sanierungszustand des
|
||||
Gebäudes</Label
|
||||
>
|
||||
<BilderZusatzsysteme bind:images bind:gebaeude bind:aufnahme bind:ausweis />
|
||||
<hr />
|
||||
<div class="flex flex-row justify-between">
|
||||
<Hilfe />
|
||||
<button type="submit" class="button">Weiter</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<RawNotificationWrapper>
|
||||
{#each Object.entries($notifications) as [uid, notification] (uid)}
|
||||
<RawNotification notification={{ ...notification, uid }}>
|
||||
{@html notification.subtext}
|
||||
</RawNotification>
|
||||
{/each}
|
||||
|
||||
{#if auditBedarfsausweisBenoetigt(ausweis, aufnahme)}
|
||||
<RawNotification
|
||||
notification={{
|
||||
message: "Bedarfsausweis benötigt!",
|
||||
timeout: 0,
|
||||
uid: "BEDARFSAUSWEIS",
|
||||
dismissable: false,
|
||||
type: "info",
|
||||
}}
|
||||
>
|
||||
Sie benötigen einen Bedarfsausweis. <a href="/bedarfsausweis"
|
||||
>Bitte führen Sie hier Ihre Eingabe für den Bedarfsausweis fort</a
|
||||
>.
|
||||
</RawNotification>
|
||||
{/if}
|
||||
|
||||
{#await auditPlzNichtErkannt(objekt) then result}
|
||||
{#if result}
|
||||
<RawNotification
|
||||
notification={{
|
||||
message: "Plausibilitätsprüfung",
|
||||
timeout: 0,
|
||||
uid: "PLZ_NICHT_ERKANNT",
|
||||
dismissable: false,
|
||||
type: "warning",
|
||||
}}
|
||||
>
|
||||
Die Postleitzahl konnte nicht zugeordnet werden. Bitte prüfen
|
||||
Sie die Eingabe. Sollte die Postleitzahl korrekt eingegeben
|
||||
sein, werden wir den Ort händisch zuordnen.
|
||||
</RawNotification>
|
||||
{/if}
|
||||
{/await}
|
||||
|
||||
{#if auditHeizungGebaeudeBaujahr(aufnahme)}
|
||||
<RawNotification
|
||||
notification={{
|
||||
message: "Plausibilitätsprüfung",
|
||||
timeout: 0,
|
||||
uid: "HEIZUNG_GEBAEUDE_BAUJAHR",
|
||||
dismissable: true,
|
||||
onUserDismiss: () => {
|
||||
hidden.add(AuditType.HEIZUNG_GEBAEUDE_BAUJAHR);
|
||||
aufnahme = aufnahme;
|
||||
},
|
||||
type: "warning",
|
||||
}}
|
||||
>
|
||||
Sie haben angegeben, dass ihre Heizung vor ihrem Gebäude konstruiert
|
||||
wurde. Sind sie sich sicher, dass das stimmt?
|
||||
</RawNotification>
|
||||
{/if}
|
||||
|
||||
{#if auditHeizungJuengerDreiJahre(aufnahme)}
|
||||
<RawNotification
|
||||
notification={{
|
||||
message: "Plausibilitätsprüfung",
|
||||
timeout: 0,
|
||||
uid: "HEIZUNG_JUENGER_DREI_JAHRE",
|
||||
dismissable: true,
|
||||
onUserDismiss: () => {
|
||||
hidden.add(AuditType.HEIZUNG_JUENGER_DREI_JAHRE);
|
||||
gebaeude = gebaeude;
|
||||
},
|
||||
type: "warning",
|
||||
}}
|
||||
>
|
||||
Ihre Heizungsanlage ist jünger als 3 Jahre. Für den
|
||||
Verbrauchsausweis müssen Sie mindestens 3 Verbrauchsjahre eingeben
|
||||
die den aktuellen Stand des Gebäudes abbilden. Ein Verbrauchsausweis
|
||||
ist daher nicht möglich. Bitte klicken Sie
|
||||
<a href="/bedarfsausweis">hier</a> um zum Eingabeformular für den Bedarfsausweis
|
||||
zu gelangen.
|
||||
</RawNotification>
|
||||
{/if}
|
||||
|
||||
{#if auditZeitraumAktuell(ausweis, gebaeude)}
|
||||
<RawNotification
|
||||
notification={{
|
||||
message: "Plausibilitätsprüfung",
|
||||
timeout: 0,
|
||||
uid: "ZEITRAUM_AKTUELL",
|
||||
dismissable: true,
|
||||
onUserDismiss: () => {
|
||||
hidden.add(AuditType.ZEITRAUM_AKTUELL);
|
||||
gebaeude = gebaeude;
|
||||
},
|
||||
type: "warning",
|
||||
}}
|
||||
>
|
||||
Die Verbrauchszeiträume sind nicht aktuell genug. Das Ende des
|
||||
letzten Verbrauchszeitraumes darf nicht mehr als 18 Monate
|
||||
zurückliegen. Ein Verbrauchsausweis ist mit diesen Zeiträumen daher
|
||||
nicht möglich. Bitte klicken Sie <a href="/bedarfsausweis">hier</a> um
|
||||
zum Eingabeformular für den Bedarfsausweis zu gelangen.
|
||||
</RawNotification>
|
||||
{/if}
|
||||
|
||||
{#await auditKlimaFaktoren(ausweis, gebaeude) then result}
|
||||
{#if result}
|
||||
<RawNotification
|
||||
notification={{
|
||||
message: "Plausibilitätsprüfung",
|
||||
timeout: 0,
|
||||
uid: "KLIMA_FAKTOREN",
|
||||
dismissable: true,
|
||||
onUserDismiss: () => {
|
||||
hidden.add(AuditType.KLIMA_FAKTOREN);
|
||||
gebaeude = gebaeude;
|
||||
},
|
||||
type: "warning",
|
||||
}}
|
||||
>
|
||||
Die Verbrauchszeiträume sind zu aktuell und es liegen noch keine
|
||||
Klimafaktoren dazu vor. Bitte verschieben Sie die
|
||||
Verbrauchszeiträume 1 Jahr nach hinten. Wenn das nicht möglich
|
||||
ist, klicken Sie
|
||||
<a href="/bedarfsausweis">hier</a> um zum Eingabeformular für den
|
||||
Bedarfsausweis zu gelangen.
|
||||
</RawNotification>
|
||||
{/if}
|
||||
{/await}
|
||||
|
||||
{#if auditWohnFlaeche(aufnahme)}
|
||||
<RawNotification
|
||||
notification={{
|
||||
message: "Plausibilitätsprüfung",
|
||||
timeout: 0,
|
||||
uid: "WOHN_FLAECHE",
|
||||
dismissable: true,
|
||||
onUserDismiss: () => {
|
||||
hidden.add(AuditType.WOHN_FLAECHE);
|
||||
gebaeude = gebaeude;
|
||||
},
|
||||
type: "warning",
|
||||
}}
|
||||
>
|
||||
Die Wohnfläche ist viel zu klein. Bitte überprüfen Sie Ihre Eingabe
|
||||
nochmal und stellen sicher, daß sich Ihre Angaben auf das gesamte
|
||||
Gebäude beziehen.
|
||||
</RawNotification>
|
||||
{/if}
|
||||
|
||||
{#if auditWarmWasser(ausweis)}
|
||||
<RawNotification
|
||||
notification={{
|
||||
message: "Plausibilitätsprüfung",
|
||||
timeout: 0,
|
||||
uid: "WARM_WASSER",
|
||||
dismissable: true,
|
||||
onUserDismiss: () => {
|
||||
hidden.add(AuditType.WARM_WASSER);
|
||||
gebaeude = gebaeude;
|
||||
},
|
||||
type: "warning",
|
||||
}}
|
||||
>
|
||||
Bitte überprüfen Sie nochmal die Höhe des Warmwasseranteils. Dieser
|
||||
scheint nicht ganz im Rahmen zu liegen.
|
||||
</RawNotification>
|
||||
{/if}
|
||||
|
||||
{#if auditLeerStand(aufnahme)}
|
||||
<RawNotification
|
||||
notification={{
|
||||
message: "Plausibilitätsprüfung",
|
||||
timeout: 0,
|
||||
uid: "LEER_STAND",
|
||||
dismissable: true,
|
||||
onUserDismiss: () => {
|
||||
hidden.add(AuditType.LEER_STAND);
|
||||
gebaeude = gebaeude;
|
||||
},
|
||||
type: "warning",
|
||||
}}
|
||||
>
|
||||
Bei Leerstand größer als 30% darf kein Verbrauchsausweis ausgestellt
|
||||
werden. Bitte klicken Sie <a href="/bedarfsausweis">hier</a> um zum Eingabeformular
|
||||
für den Bedarfsausweis zu gelangen.
|
||||
</RawNotification>
|
||||
{/if}
|
||||
|
||||
{#if auditVerbrauchAbweichung(ausweis, aufnahme).length > 0}
|
||||
<RawNotification
|
||||
notification={{
|
||||
message: "Plausibilitätsprüfung",
|
||||
timeout: 0,
|
||||
uid: "VERBRAUCH_ABWEICHUNG",
|
||||
dismissable: true,
|
||||
onUserDismiss: () => {
|
||||
hidden.add(AuditType.VERBRAUCH_ABWEICHUNG);
|
||||
gebaeude = gebaeude;
|
||||
},
|
||||
type: "warning",
|
||||
}}
|
||||
>
|
||||
Die Abweichung der Verbräuche zwischen Zeitraum {auditVerbrauchAbweichung(
|
||||
ausweis,
|
||||
aufnahme,
|
||||
)[0]} und {auditVerbrauchAbweichung(ausweis, aufnahme)[1]} beträgt mehr
|
||||
als 30% und sie haben keinen Leerstand angegeben. Sind sie sich sicher,
|
||||
dass das stimmt?
|
||||
</RawNotification>
|
||||
{/if}
|
||||
|
||||
{#await auditEndEnergie(ausweis, gebaeude, aufnahme) then result}
|
||||
{#if result}
|
||||
<RawNotification
|
||||
notification={{
|
||||
message: "Plausibilitätsprüfung",
|
||||
timeout: 0,
|
||||
uid: "END_ENERGIE",
|
||||
dismissable: true,
|
||||
onUserDismiss: () => {
|
||||
hidden.add(AuditType.END_ENERGIE);
|
||||
gebaeude = gebaeude;
|
||||
},
|
||||
type: "warning",
|
||||
}}
|
||||
>
|
||||
Die Endenergie liegt außerhalb des normalen Rahmens. Bitte
|
||||
nochmal überprüfen. Bei Passivhäusern oder ganz alten
|
||||
unsanierten Gebäuden ist so eine Abweichung durchaus möglich.
|
||||
</RawNotification>
|
||||
{/if}
|
||||
{/await}
|
||||
|
||||
{#if auditWohnflaecheGroesserGesamtflaeche(aufnahme)}
|
||||
<RawNotification
|
||||
notification={{
|
||||
message: "Plausibilitätsprüfung",
|
||||
timeout: 0,
|
||||
uid: "WOHNFLAECHE_GROESSER_GESAMTFLAECHE",
|
||||
dismissable: true,
|
||||
onUserDismiss: () => {
|
||||
hidden.add(AuditType.WOHNFLAECHE_GROESSER_GESAMTFLAECHE);
|
||||
gebaeude = gebaeude;
|
||||
},
|
||||
type: "warning",
|
||||
}}
|
||||
>
|
||||
Die Wohnfläche darf nicht größer als die Nutzfläche sein.
|
||||
</RawNotification>
|
||||
{/if}
|
||||
</RawNotificationWrapper>
|
||||
|
||||
<style>
|
||||
:global(input[type="number"]),
|
||||
:global(input[type="text"]) {
|
||||
@apply input input-bordered py-1.5 px-2 h-auto;
|
||||
}
|
||||
|
||||
:global(input[type="number"]:disabled) {
|
||||
@apply bg-gray-200 border border-gray-300;
|
||||
}
|
||||
|
||||
:global(.linked) {
|
||||
@apply border-2 border-red-400;
|
||||
}
|
||||
</style>
|
||||
@@ -66,8 +66,7 @@
|
||||
ausweis,
|
||||
objekt,
|
||||
aufnahme,
|
||||
bilder,
|
||||
user
|
||||
bilder
|
||||
);
|
||||
|
||||
if (result !== null) {
|
||||
@@ -124,8 +123,7 @@
|
||||
ausweis,
|
||||
objekt,
|
||||
aufnahme,
|
||||
bilder,
|
||||
user
|
||||
bilder
|
||||
);
|
||||
|
||||
if (result !== null) {
|
||||
|
||||
@@ -1,736 +0,0 @@
|
||||
<script lang="ts">
|
||||
import PerformanceScore from "#components/Ausweis/PerformanceScore.svelte";
|
||||
import Progressbar from "#components/Ausweis/Progressbar.svelte";
|
||||
import Hilfe from "#components/Ausweis/Hilfe.svelte";
|
||||
import HelpLabel from "#components/HelpLabel.svelte";
|
||||
import Verbrauch from "#components/Ausweis/Verbrauch.svelte";
|
||||
import Label from "#components/Label.svelte";
|
||||
import BereichLabel from "#components/labels/BereichLabel.svelte";
|
||||
import Ausweisart from "#components/Ausweis/Ausweisart.svelte";
|
||||
import ZipSearch from "#components/PlzSuche.svelte";
|
||||
import moment from "moment";
|
||||
import BilderZusatzsysteme from "#components/Ausweis/BilderZusatzsysteme.svelte";
|
||||
import { RawNotificationWrapper, RawNotification, notifications } from "#components/Notifications/index.js";
|
||||
import { auditHeizungGebaeudeBaujahr } from "#components/Verbrauchsausweis/audits/HeizungGebaeudeBaujahr.js";
|
||||
import { auditHeizungJuengerDreiJahre } from "#components/Verbrauchsausweis/audits/HeizungJuengerDreiJahre.js";
|
||||
import { auditZeitraumAktuell } from "#components/Verbrauchsausweis/audits/ZeitraumAktuell.js";
|
||||
import { auditKlimaFaktoren } from "#components/Verbrauchsausweis/audits/KlimaFaktoren.js";
|
||||
import { auditWohnFlaeche } from "#components/Verbrauchsausweis/audits/WohnFlaeche.js";
|
||||
import { auditWarmWasser } from "#components/Verbrauchsausweis/audits/WarmWasser.js";
|
||||
import { auditLeerStand } from "#components/Verbrauchsausweis/audits/LeerStand.js";
|
||||
import { auditPlzNichtErkannt } from "#components/Verbrauchsausweis/audits/PlzNichtErkannt.js";
|
||||
import { AuditType, hidden } from "#components/Verbrauchsausweis/audits/hidden.js";
|
||||
import { auditBedarfsausweisBenoetigt } from "#components/Verbrauchsausweis/audits/BedarfsausweisBenoetigt.js";
|
||||
import { auditVerbrauchAbweichung } from "#components/Verbrauchsausweis/audits/VerbrauchAbweichung.js";
|
||||
import { auditEndEnergie } from "#components/Verbrauchsausweis/audits/EndEnergie.js";
|
||||
import { auditWohnflaecheGroesserGesamtflaeche } from "#components/Verbrauchsausweis/audits/WohnflaecheGroesserGesamtflaeche.js";
|
||||
import { Enums } from "@ibcornelsen/database/client"
|
||||
import Overlay from "#components/Overlay.svelte";
|
||||
import AusweisGespeichertModule from "./AusweisGespeichertModule.svelte";
|
||||
import { VerbrauchsausweisWohnenClient, BenutzerClient, UploadedGebaeudeBild } from "#components/Ausweis/types.js";
|
||||
import { verbrauchsausweisWohnenSpeichern } from "src/client/lib/verbrauchsausweisWohnenSpeichern.js";
|
||||
|
||||
// TODO: Vom Server sollte ein volles Objekt kommen, dass alle Subobjekte enthält, weil es sonst zu Problemen führen kann
|
||||
// wenn aufnahme oder objekt nicht existiert...
|
||||
export let ausweis: VerbrauchsausweisWohnenClient;
|
||||
export let user: BenutzerClient = {} as BenutzerClient;
|
||||
|
||||
let aufnahme = ausweis.aufnahme || {};
|
||||
let gebaeude = ausweis.aufnahme?.objekt || {};
|
||||
let images: (UploadedGebaeudeBild & { base64?: string })[] = ausweis.aufnahme?.objekt?.gebaeude_bilder || [];
|
||||
|
||||
async function spaeterWeitermachen() {
|
||||
const result = await verbrauchsausweisWohnenSpeichern(ausweis, gebaeude, aufnahme, images, user);
|
||||
|
||||
if (result !== null) {
|
||||
// Falls der Nutzer zurück navigiert, sollte er wieder auf seinen Vorgang kommen.
|
||||
// Sonst müsste er alles neu eingeben...
|
||||
ausweis.uid = result.uid
|
||||
gebaeude.uid = result.gebaeude_uid
|
||||
aufnahme.uid = result.gebaeude_aufnahme_uid
|
||||
window.history.pushState({}, "", `${location.pathname}?uid=${result.uid}`);
|
||||
speichernOverlayHidden = false;
|
||||
}
|
||||
}
|
||||
|
||||
function automatischAusfüllen() {
|
||||
aufnahme.baujahr_gebaeude = [1962];
|
||||
aufnahme.baujahr_heizung = [1952];
|
||||
aufnahme.saniert = true;
|
||||
aufnahme.einheiten = 1;
|
||||
ausweis.ausstellgrund = "Vermietung";
|
||||
ausweis.verbrauch_1 = 15000;
|
||||
ausweis.verbrauch_2 = 14000;
|
||||
ausweis.verbrauch_3 = 16000;
|
||||
aufnahme.flaeche = 152;
|
||||
aufnahme.nutzflaeche = 172;
|
||||
ausweis.keller_beheizt = true;
|
||||
aufnahme.brennstoff_1 = "Erdgas H";
|
||||
ausweis.einheit_1 = "kWh";
|
||||
ausweis.anteil_warmwasser_1 = 18;
|
||||
ausweis.startdatum = moment("01.01.2019").toDate();
|
||||
aufnahme.plz = "21039";
|
||||
aufnahme.ort = "Hamburg";
|
||||
aufnahme.adresse = "Curslacker Deich 170";
|
||||
aufnahme.gebaeudeteil = "Gesamtgebäude";
|
||||
|
||||
gebaeude = gebaeude;
|
||||
ausweis = ausweis;
|
||||
}
|
||||
|
||||
|
||||
async function ausweisAbschicken(e: SubmitEvent) {
|
||||
if (e && e.preventDefault) e.preventDefault();
|
||||
const result = await verbrauchsausweisWohnenSpeichern(ausweis, gebaeude, aufnahme, images, user);
|
||||
|
||||
if (result !== null) {
|
||||
// Falls der Nutzer zurück navigiert, sollte er wieder auf seinen Vorgang kommen.
|
||||
// Sonst müsste er alles neu eingeben...
|
||||
ausweis.uid = result.uid
|
||||
gebaeude.uid = result.gebaeude_uid
|
||||
aufnahme.uid = result.gebaeude_aufnahme_uid
|
||||
window.history.pushState({}, "", `${location.pathname}?uid=${result.uid}`);
|
||||
window.location.href = `/kundendaten?uid=${result.uid}`;
|
||||
}
|
||||
}
|
||||
|
||||
let waitOverlayHidden = true;
|
||||
let speichernOverlayHidden = true;
|
||||
|
||||
$: {
|
||||
if (aufnahme.saniert
|
||||
&& aufnahme.oberste_geschossdecke_gedaemmt === undefined
|
||||
&& aufnahme.dachgeschoss_gedaemmt === undefined) {
|
||||
|
||||
aufnahme.oberste_geschossdecke_gedaemmt = true;
|
||||
aufnahme.dachgeschoss_gedaemmt = true;
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<Overlay bind:hidden={speichernOverlayHidden}>
|
||||
<div class="bg-white w-full max-w-screen-sm py-8 px-8">
|
||||
<AusweisGespeichertModule uid={ausweis.uid}></AusweisGespeichertModule>
|
||||
</div>
|
||||
</Overlay>
|
||||
|
||||
<Overlay bind:hidden={waitOverlayHidden}>
|
||||
<p class="text-white font-semibold text-4xl">
|
||||
Bitte warten sie, ihr Ausweis wird nun erstellt.
|
||||
</p>
|
||||
</Overlay>
|
||||
|
||||
<!-- <div class="flex flex-row gap-8 items-center mb-8">
|
||||
<div class="flex flex-col w-full">
|
||||
<h1>Verbrauchsausweis erstellen - 45€</h1>
|
||||
<Progressbar progress={0} />
|
||||
</div>
|
||||
|
||||
<PerformanceScore
|
||||
bind:ausweis
|
||||
bind:aufnahme
|
||||
bind:gebaeude
|
||||
/>
|
||||
</div>-->
|
||||
|
||||
<form on:submit={ausweisAbschicken} name="ausweis" data-test="ausweis">
|
||||
|
||||
<div id="formular-box" class="formular-boxen ring-0">
|
||||
|
||||
<div class="w-full grid gap-x-4 gap-y-2
|
||||
grid-cols-1
|
||||
xs:grid-cols-2
|
||||
">
|
||||
<div class="md:justify-self-start"><button class="button" type="button" on:click={spaeterWeitermachen}>Später Weitermachen</button></div>
|
||||
<div class="md:justify-self-end"><Hilfe /></div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="mt-2"><button class="button" on:click={automatischAusfüllen} type="button" >Automatisch Ausfüllen</button></div>
|
||||
|
||||
<hr />
|
||||
|
||||
<BereichLabel bereich="A">Prüfung der Ausweisart</BereichLabel>
|
||||
|
||||
<div class="bereich-box">
|
||||
|
||||
<Ausweisart
|
||||
bind:objekt={gebaeude}
|
||||
bind:aufnahme={aufnahme}
|
||||
bind:ausweis
|
||||
/>
|
||||
|
||||
</div>
|
||||
<BereichLabel bereich="B">Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgeschoss</BereichLabel>
|
||||
|
||||
<div class="bereich-box">
|
||||
|
||||
<div class="w-full grid
|
||||
grid-cols-bereich-B gap-x-4
|
||||
xl:grid-cols-bereich-B-xl xl:gap-x-8
|
||||
2xl:grid-cols-bereich-B-2xl 2xl:gap-x-8
|
||||
">
|
||||
|
||||
<div class="grid grid-cols-1 gap-x-4
|
||||
md:grid-cols-2 md:gap-x-6 md:mb-6
|
||||
xl:mb-0
|
||||
2xl:grid-cols-3 2xl:gap-x-6
|
||||
">
|
||||
|
||||
<!-- Strasse -->
|
||||
<div class="md:col-span-2 2xl:col-span-1">
|
||||
<HelpLabel title="* Straße, Hausnummer">
|
||||
Bitte geben Sie hier die Straße und Hausnummer des Gebäudes
|
||||
ein.
|
||||
</HelpLabel>
|
||||
<div>
|
||||
<input
|
||||
name="adresse"
|
||||
data-test="adresse"
|
||||
type="text"
|
||||
autocomplete="off"
|
||||
required
|
||||
data-msg-minlength="min. 5 Zeichen"
|
||||
data-msg-maxlength="max. 40 Zeichen"
|
||||
bind:value={aufnahme.adresse}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- PLZ -->
|
||||
<div class="PLZ">
|
||||
<Label>* PLZ</Label>
|
||||
<ZipSearch
|
||||
bind:zip={aufnahme.plz}
|
||||
bind:city={aufnahme.ort}
|
||||
name="plz"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<!-- Ort -->
|
||||
<div class="">
|
||||
<HelpLabel title="* Ort">
|
||||
Ort des Gebäudes wird automatisch ermittelt.
|
||||
</HelpLabel>
|
||||
<div>
|
||||
<input
|
||||
name="ort"
|
||||
data-test="ort"
|
||||
readonly={true}
|
||||
bind:value={aufnahme.ort}
|
||||
type="text"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="grid grid-cols-1 gap-x-4
|
||||
md:grid-cols-2 md:gap-x-6
|
||||
2xl:grid-cols-4 2xl:gap-x-6
|
||||
">
|
||||
|
||||
<!-- Wohnfläche -->
|
||||
<div class="">
|
||||
<HelpLabel title="* Wohnfläche m²">
|
||||
Bitte geben Sie hier die beheizte Wohnfläche in m² ein.
|
||||
Dabei handelt es sich um die Wohnfläche abzüglich
|
||||
vorhandener Flächen die sich außerhalb des Gebäudes
|
||||
befinden. (Balkone, Terassen,etc.).
|
||||
</HelpLabel>
|
||||
<div>
|
||||
<input
|
||||
name="flaeche"
|
||||
data-test="flaeche"
|
||||
maxlength="4"
|
||||
type="number"
|
||||
required
|
||||
autocomplete="off"
|
||||
data-rule-minlength="2"
|
||||
data-msg-minlength="min. 2 Zeichen"
|
||||
bind:value={aufnahme.flaeche}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Gesamtfläche -->
|
||||
<div class="">
|
||||
<HelpLabel title=" Gesamtfläche m²">
|
||||
Bitte geben Sie hier die beheizte Gesamtfläche in m² ein
|
||||
(wenn bekannt). Dabei handelt es sich um die Wohnfläche +
|
||||
weiterer Flächen innerhalb des Gebäudes (z.B. Fläche des
|
||||
beheizten Kellers). Diese Fläche wird dann im Energieausweis
|
||||
als energetische Nutzfläche (An) ausgewiesen.
|
||||
</HelpLabel>
|
||||
<div>
|
||||
<input
|
||||
name="nutzflaeche"
|
||||
data-test="nutzflaeche"
|
||||
maxlength="4"
|
||||
type="number"
|
||||
required
|
||||
autocomplete="off"
|
||||
data-rule-minlength="2"
|
||||
data-msg-minlength="min. 2 Zeichen"
|
||||
bind:value={aufnahme.nutzflaeche}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Keller -->
|
||||
<div class="">
|
||||
<Label>* Keller</Label>
|
||||
<div>
|
||||
<select
|
||||
name="keller"
|
||||
data-test="keller"
|
||||
required
|
||||
bind:value={aufnahme.keller}
|
||||
>
|
||||
<option disabled>Bitte auswählen</option>
|
||||
<option value={Enums.Heizungsstatus.NICHT_VORHANDEN}
|
||||
>nicht vorhanden</option
|
||||
>
|
||||
<option value={Enums.Heizungsstatus.UNBEHEIZT}
|
||||
>unbeheizt</option
|
||||
>
|
||||
<option value={Enums.Heizungsstatus.BEHEIZT}
|
||||
>beheizt</option
|
||||
>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Dachgeschoss -->
|
||||
<div class="">
|
||||
<Label>* Dachgeschoss</Label>
|
||||
<div>
|
||||
<select
|
||||
name="dachgeschoss"
|
||||
data-test="dachgeschoss"
|
||||
bind:value={aufnahme.dachgeschoss}
|
||||
required
|
||||
>
|
||||
<option disabled>Bitte auswählen</option>
|
||||
<option value={Enums.Heizungsstatus.NICHT_VORHANDEN}
|
||||
>nicht vorhanden</option
|
||||
>
|
||||
<option value={Enums.Heizungsstatus.UNBEHEIZT}
|
||||
>unbeheizt</option
|
||||
>
|
||||
<option value={Enums.Heizungsstatus.BEHEIZT}
|
||||
>beheizt</option
|
||||
>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<BereichLabel bereich="C">Eingabe von 3 zusammenhängenden Verbrauchsjahren</BereichLabel>
|
||||
|
||||
<div class="bereich-box">
|
||||
|
||||
<div class="w-full grid
|
||||
grid-cols-bereich-C gap-x-4 gap-y-8
|
||||
xl:grid-cols-bereich-C-xl xl:gap-x-8 xl:gap-y-0
|
||||
2xl:grid-cols-bereich-C-2xl 2xl:gap-x-8
|
||||
">
|
||||
|
||||
<Verbrauch
|
||||
bind:gebaeude
|
||||
bind:aufnahme
|
||||
bind:ausweis
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<BereichLabel bereich="d">Eingabe Warmwasseranteil und Verwendung von alternativenEnergieversorgungssystemen</BereichLabel>
|
||||
|
||||
<div class="bereich-box">
|
||||
|
||||
|
||||
<!-- Anteil WW enthalten -->
|
||||
<div class="flex flex-col">
|
||||
<div class="flex flex-row gap-4 items-center">
|
||||
<input
|
||||
type="checkbox"
|
||||
class="checkbox"
|
||||
name="warmwasser_enthalten"
|
||||
data-test="warmwasser_enthalten"
|
||||
bind:checked={ausweis.warmwasser_enthalten}
|
||||
/>
|
||||
<Label>Warmwasser im Verbrauch enthalten</Label>
|
||||
</div>
|
||||
<div class="flex flex-row gap-4 items-center">
|
||||
<input
|
||||
type="checkbox"
|
||||
class="checkbox"
|
||||
name="warmwasser_anteil_bekannt"
|
||||
data-test="warmwasser_anteil_bekannt"
|
||||
bind:checked={ausweis.warmwasser_anteil_bekannt}
|
||||
disabled={!ausweis.warmwasser_enthalten}
|
||||
/>
|
||||
<Label>Anteil bekannt</Label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Warmwasser Antel -->
|
||||
<div class="form-group col-md-2">
|
||||
<HelpLabel title="% Anteil Warmwasser">
|
||||
Wenn bekannt geben Sie den Anteil der Warmwasser-Versorgung
|
||||
hier ein. Standardmäßig wird ein Anteil von 18% angenommen.
|
||||
</HelpLabel>
|
||||
|
||||
<input
|
||||
name="anteil_warmwasser_1"
|
||||
data-test="anteil_warmwasser_1"
|
||||
maxlength="2"
|
||||
type="number"
|
||||
bind:value={ausweis.anteil_warmwasser_1}
|
||||
disabled={!ausweis.warmwasser_anteil_bekannt ||
|
||||
!ausweis.warmwasser_enthalten}
|
||||
autocomplete="off"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="form-group col-md-2">
|
||||
<HelpLabel title="zusätzliche Heizquelle">
|
||||
Wenn bekannt geben Sie den Anteil der Warmwasser-Versorgung
|
||||
von der zusätzlichen Heizquelle hier ein. Standardmäßig wird
|
||||
ein Anteil von 18% angenommen.
|
||||
</HelpLabel>
|
||||
<input
|
||||
name="anteil_warmwasser_2"
|
||||
data-test="anteil_warmwasser_2"
|
||||
maxlength="3"
|
||||
type="number"
|
||||
autocomplete="off"
|
||||
bind:value={ausweis.anteil_warmwasser_2}
|
||||
disabled={!ausweis.zusaetzliche_heizquelle ||
|
||||
!ausweis.warmwasser_anteil_bekannt ||
|
||||
!ausweis.warmwasser_enthalten}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<!-- Alternative Energieversorgungssyteme -->
|
||||
<div class="form-group col-md-5">
|
||||
<HelpLabel
|
||||
title="Alternative Energieversorgungssysteme genutzt für "
|
||||
>
|
||||
Bitte setzen Sie den Haken falls nachhaltige CO2-Effiziente
|
||||
Heizungssysteme vorhanden sind. Das wäre beispielsweise bei
|
||||
Pelletofen, Wärmepumpe, BHKW, Solarsystem, etc. der Fall.
|
||||
</HelpLabel>
|
||||
<div class="flex flex-row gap-4">
|
||||
<label class="checkbox-inline"
|
||||
><input
|
||||
type="checkbox"
|
||||
name="alternative_heizung"
|
||||
data-test="alternative_heizung"
|
||||
bind:checked={ausweis.alternative_heizung}
|
||||
value="Heizung"
|
||||
/>Heizung</label
|
||||
>
|
||||
<label class="checkbox-inline"
|
||||
><input
|
||||
type="checkbox"
|
||||
name="alternative_warmwasser"
|
||||
data-test="alternative_warmwasser"
|
||||
bind:checked={ausweis.alternative_warmwasser}
|
||||
value="Warmwasser"
|
||||
/>Warmwasser</label
|
||||
>
|
||||
<label class="checkbox-inline"
|
||||
><input
|
||||
type="checkbox"
|
||||
name="alternative_lueftung"
|
||||
data-test="alternative_lueftung"
|
||||
bind:checked={ausweis.alternative_lueftung}
|
||||
value="Lüftung"
|
||||
/>Lüftung</label
|
||||
>
|
||||
<label class="checkbox-inline"
|
||||
><input
|
||||
type="checkbox"
|
||||
name="alternative_kuehlung"
|
||||
data-test="alternative_kuehlung"
|
||||
bind:checked={ausweis.alternative_kuehlung}
|
||||
value="Kühlung"
|
||||
/>Kühlung</label
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<hr />
|
||||
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<RawNotificationWrapper>
|
||||
{#each Object.entries($notifications) as [uid, notification] (uid)}
|
||||
<RawNotification notification={{ ...notification, uid }}>
|
||||
{@html notification.subtext}
|
||||
</RawNotification>
|
||||
{/each}
|
||||
|
||||
{#if auditBedarfsausweisBenoetigt(ausweis, aufnahme)}
|
||||
<RawNotification
|
||||
notification={{
|
||||
message: "Bedarfsausweis benötigt!",
|
||||
timeout: 0,
|
||||
uid: "BEDARFSAUSWEIS",
|
||||
dismissable: false,
|
||||
type: "info",
|
||||
}}
|
||||
>
|
||||
Sie benötigen einen Bedarfsausweis. <a href="/bedarfsausweis"
|
||||
>Bitte führen Sie hier Ihre Eingabe für den Bedarfsausweis fort</a
|
||||
>.
|
||||
</RawNotification>
|
||||
{/if}
|
||||
|
||||
{#await auditPlzNichtErkannt(objekt) then result}
|
||||
{#if result}
|
||||
<RawNotification
|
||||
notification={{
|
||||
message: "Plausibilitätsprüfung",
|
||||
timeout: 0,
|
||||
uid: "PLZ_NICHT_ERKANNT",
|
||||
dismissable: false,
|
||||
type: "warning",
|
||||
}}
|
||||
>
|
||||
Die Postleitzahl konnte nicht zugeordnet werden. Bitte prüfen
|
||||
Sie die Eingabe. Sollte die Postleitzahl korrekt eingegeben
|
||||
sein, werden wir den Ort händisch zuordnen.
|
||||
</RawNotification>
|
||||
{/if}
|
||||
{/await}
|
||||
|
||||
{#if auditHeizungGebaeudeBaujahr(aufnahme)}
|
||||
<RawNotification
|
||||
notification={{
|
||||
message: "Plausibilitätsprüfung",
|
||||
timeout: 0,
|
||||
uid: "HEIZUNG_GEBAEUDE_BAUJAHR",
|
||||
dismissable: true,
|
||||
onUserDismiss: () => {
|
||||
hidden.add(AuditType.HEIZUNG_GEBAEUDE_BAUJAHR);
|
||||
aufnahme = aufnahme;
|
||||
},
|
||||
type: "warning",
|
||||
}}
|
||||
>
|
||||
Sie haben angegeben, dass ihre Heizung vor ihrem Gebäude konstruiert
|
||||
wurde. Sind sie sich sicher, dass das stimmt?
|
||||
</RawNotification>
|
||||
{/if}
|
||||
|
||||
{#if auditHeizungJuengerDreiJahre(aufnahme)}
|
||||
<RawNotification
|
||||
notification={{
|
||||
message: "Plausibilitätsprüfung",
|
||||
timeout: 0,
|
||||
uid: "HEIZUNG_JUENGER_DREI_JAHRE",
|
||||
dismissable: true,
|
||||
onUserDismiss: () => {
|
||||
hidden.add(AuditType.HEIZUNG_JUENGER_DREI_JAHRE);
|
||||
gebaeude = gebaeude;
|
||||
},
|
||||
type: "warning",
|
||||
}}
|
||||
>
|
||||
Ihre Heizungsanlage ist jünger als 3 Jahre. Für den
|
||||
Verbrauchsausweis müssen Sie mindestens 3 Verbrauchsjahre eingeben
|
||||
die den aktuellen Stand des Gebäudes abbilden. Ein Verbrauchsausweis
|
||||
ist daher nicht möglich. Bitte klicken Sie
|
||||
<a href="/bedarfsausweis">hier</a> um zum Eingabeformular für den Bedarfsausweis
|
||||
zu gelangen.
|
||||
</RawNotification>
|
||||
{/if}
|
||||
|
||||
{#if auditZeitraumAktuell(ausweis, gebaeude)}
|
||||
<RawNotification
|
||||
notification={{
|
||||
message: "Plausibilitätsprüfung",
|
||||
timeout: 0,
|
||||
uid: "ZEITRAUM_AKTUELL",
|
||||
dismissable: true,
|
||||
onUserDismiss: () => {
|
||||
hidden.add(AuditType.ZEITRAUM_AKTUELL);
|
||||
gebaeude = gebaeude;
|
||||
},
|
||||
type: "warning",
|
||||
}}
|
||||
>
|
||||
Die Verbrauchszeiträume sind nicht aktuell genug. Das Ende des
|
||||
letzten Verbrauchszeitraumes darf nicht mehr als 18 Monate
|
||||
zurückliegen. Ein Verbrauchsausweis ist mit diesen Zeiträumen daher
|
||||
nicht möglich. Bitte klicken Sie <a href="/bedarfsausweis">hier</a> um
|
||||
zum Eingabeformular für den Bedarfsausweis zu gelangen.
|
||||
</RawNotification>
|
||||
{/if}
|
||||
|
||||
{#await auditKlimaFaktoren(ausweis, gebaeude) then result}
|
||||
{#if result}
|
||||
<RawNotification
|
||||
notification={{
|
||||
message: "Plausibilitätsprüfung",
|
||||
timeout: 0,
|
||||
uid: "KLIMA_FAKTOREN",
|
||||
dismissable: true,
|
||||
onUserDismiss: () => {
|
||||
hidden.add(AuditType.KLIMA_FAKTOREN);
|
||||
gebaeude = gebaeude;
|
||||
},
|
||||
type: "warning",
|
||||
}}
|
||||
>
|
||||
Die Verbrauchszeiträume sind zu aktuell und es liegen noch keine
|
||||
Klimafaktoren dazu vor. Bitte verschieben Sie die
|
||||
Verbrauchszeiträume 1 Jahr nach hinten. Wenn das nicht möglich
|
||||
ist, klicken Sie
|
||||
<a href="/bedarfsausweis">hier</a> um zum Eingabeformular für den
|
||||
Bedarfsausweis zu gelangen.
|
||||
</RawNotification>
|
||||
{/if}
|
||||
{/await}
|
||||
|
||||
{#if auditWohnFlaeche(aufnahme)}
|
||||
<RawNotification
|
||||
notification={{
|
||||
message: "Plausibilitätsprüfung",
|
||||
timeout: 0,
|
||||
uid: "WOHN_FLAECHE",
|
||||
dismissable: true,
|
||||
onUserDismiss: () => {
|
||||
hidden.add(AuditType.WOHN_FLAECHE);
|
||||
gebaeude = gebaeude;
|
||||
},
|
||||
type: "warning",
|
||||
}}
|
||||
>
|
||||
Die Wohnfläche ist viel zu klein. Bitte überprüfen Sie Ihre Eingabe
|
||||
nochmal und stellen sicher, daß sich Ihre Angaben auf das gesamte
|
||||
Gebäude beziehen.
|
||||
</RawNotification>
|
||||
{/if}
|
||||
|
||||
{#if auditWarmWasser(ausweis)}
|
||||
<RawNotification
|
||||
notification={{
|
||||
message: "Plausibilitätsprüfung",
|
||||
timeout: 0,
|
||||
uid: "WARM_WASSER",
|
||||
dismissable: true,
|
||||
onUserDismiss: () => {
|
||||
hidden.add(AuditType.WARM_WASSER);
|
||||
gebaeude = gebaeude;
|
||||
},
|
||||
type: "warning",
|
||||
}}
|
||||
>
|
||||
Bitte überprüfen Sie nochmal die Höhe des Warmwasseranteils. Dieser
|
||||
scheint nicht ganz im Rahmen zu liegen.
|
||||
</RawNotification>
|
||||
{/if}
|
||||
|
||||
{#if auditLeerStand(aufnahme)}
|
||||
<RawNotification
|
||||
notification={{
|
||||
message: "Plausibilitätsprüfung",
|
||||
timeout: 0,
|
||||
uid: "LEER_STAND",
|
||||
dismissable: true,
|
||||
onUserDismiss: () => {
|
||||
hidden.add(AuditType.LEER_STAND);
|
||||
gebaeude = gebaeude;
|
||||
},
|
||||
type: "warning",
|
||||
}}
|
||||
>
|
||||
Bei Leerstand größer als 30% darf kein Verbrauchsausweis ausgestellt
|
||||
werden. Bitte klicken Sie <a href="/bedarfsausweis">hier</a> um zum Eingabeformular
|
||||
für den Bedarfsausweis zu gelangen.
|
||||
</RawNotification>
|
||||
{/if}
|
||||
|
||||
{#if auditVerbrauchAbweichung(ausweis, aufnahme).length > 0}
|
||||
<RawNotification
|
||||
notification={{
|
||||
message: "Plausibilitätsprüfung",
|
||||
timeout: 0,
|
||||
uid: "VERBRAUCH_ABWEICHUNG",
|
||||
dismissable: true,
|
||||
onUserDismiss: () => {
|
||||
hidden.add(AuditType.VERBRAUCH_ABWEICHUNG);
|
||||
gebaeude = gebaeude;
|
||||
},
|
||||
type: "warning",
|
||||
}}
|
||||
>
|
||||
Die Abweichung der Verbräuche zwischen Zeitraum {auditVerbrauchAbweichung(
|
||||
ausweis,
|
||||
aufnahme,
|
||||
)[0]} und {auditVerbrauchAbweichung(ausweis, aufnahme)[1]} beträgt mehr
|
||||
als 30% und sie haben keinen Leerstand angegeben. Sind sie sich sicher,
|
||||
dass das stimmt?
|
||||
</RawNotification>
|
||||
{/if}
|
||||
|
||||
{#await auditEndEnergie(ausweis, gebaeude, aufnahme) then result}
|
||||
{#if result}
|
||||
<RawNotification
|
||||
notification={{
|
||||
message: "Plausibilitätsprüfung",
|
||||
timeout: 0,
|
||||
uid: "END_ENERGIE",
|
||||
dismissable: true,
|
||||
onUserDismiss: () => {
|
||||
hidden.add(AuditType.END_ENERGIE);
|
||||
gebaeude = gebaeude;
|
||||
},
|
||||
type: "warning",
|
||||
}}
|
||||
>
|
||||
Die Endenergie liegt außerhalb des normalen Rahmens. Bitte
|
||||
nochmal überprüfen. Bei Passivhäusern oder ganz alten
|
||||
unsanierten Gebäuden ist so eine Abweichung durchaus möglich.
|
||||
</RawNotification>
|
||||
{/if}
|
||||
{/await}
|
||||
|
||||
{#if auditWohnflaecheGroesserGesamtflaeche(aufnahme)}
|
||||
<RawNotification
|
||||
notification={{
|
||||
message: "Plausibilitätsprüfung",
|
||||
timeout: 0,
|
||||
uid: "WOHNFLAECHE_GROESSER_GESAMTFLAECHE",
|
||||
dismissable: true,
|
||||
onUserDismiss: () => {
|
||||
hidden.add(AuditType.WOHNFLAECHE_GROESSER_GESAMTFLAECHE);
|
||||
gebaeude = gebaeude;
|
||||
},
|
||||
type: "warning",
|
||||
}}
|
||||
>
|
||||
Die Wohnfläche darf nicht größer als die Nutzfläche sein.
|
||||
</RawNotification>
|
||||
{/if}
|
||||
</RawNotificationWrapper>
|
||||
|
||||
<style>
|
||||
</style>
|
||||
@@ -1,365 +0,0 @@
|
||||
---
|
||||
|
||||
import { BoxWithHeading } from "@ibcornelsen/ui";
|
||||
import Widget from "#components/Widget.svelte";
|
||||
import Layout from "#layouts/Layout.astro";
|
||||
import FeatureCard from "#components/FeatureCard.svelte";
|
||||
|
||||
|
||||
---
|
||||
|
||||
<Layout title="Energieausweis online erstellen - Online Energieausweis">
|
||||
<h1>Energieausweis online erstellen</h1>
|
||||
|
||||
<Widget client:load />
|
||||
|
||||
<h2>GEG gilt ab 1. Mai 2021 und löst die EnEV ab</h2>
|
||||
<BoxWithHeading heading="Folgende Punkte ändern sich:">
|
||||
<ul>
|
||||
<li>
|
||||
Erhöhte Sorgfaltspflicht bei der Erstellung der Energieausweise.
|
||||
Insbesondere zur Einschätzung der Modernisierungsempfehlungen
|
||||
werden jetzt Fotos der relevanten Bereiche von Dach, Fenster,
|
||||
Heizung und Außenwand benötigt.
|
||||
</li>
|
||||
<li>
|
||||
Die Primärenergiefaktoren zur Ermittlung des Gebäudekennwerts
|
||||
werden jetzt direkt im GEG (§22 Primärenergiefaktoren) geregelt.
|
||||
Dadurch wird mehr Transparenz und Nachvollziehbarkeit
|
||||
geschaffen. Auch findet die Verwendung von Biogas aus dem
|
||||
Erdgasnetz jetzt angemessen Berücksichtigung.
|
||||
</li>
|
||||
<li>
|
||||
Die lokale Erzeugung von Strom über eine PV-Anlage wird besser
|
||||
berücksichtigt und kann vom Jahres-Primärenergiebedarf abgezogen
|
||||
werden (bis 45%).
|
||||
</li>
|
||||
<li>
|
||||
Die Angabe der CO2-Emission des Gebäudes im Energieausweis wird
|
||||
verplichtend eingeführt.
|
||||
</li>
|
||||
</ul>
|
||||
</BoxWithHeading>
|
||||
|
||||
<h2>
|
||||
Energieausweis nach aktueller GEG (vormals EnEV) geprüft vom Diplom
|
||||
Ingenieur
|
||||
</h2>
|
||||
<div class="right-img">
|
||||
<img
|
||||
title="Energieausweis online erstellen"
|
||||
src="images/Bedarfsausweis-Wohngebaeude-Beispiel.jpg"
|
||||
alt="Energieausweis online erstellen"
|
||||
/>
|
||||
</div>Sie möchten Ihren <strong>Energieausweis online erstellen</strong>?
|
||||
Auf dieser Seite finden Sie alle nötigen Informationen hierzu. Sollten Sie
|
||||
sich nicht sicher sein <a href="/energieausweis-welcher-energieausweis"
|
||||
>welchen Energieausweis</a
|
||||
> Sie benötigen, können Sie sich bei uns umfassend informieren. Wir haben fürs
|
||||
Sie alle wichtigen Informationen rund um die GEG und zur
|
||||
<a href="/energieausweis-pflicht">Energieausweis Pflicht</a> zusammengetragen.
|
||||
Zusätzlich haben wir die entscheidenden Informationen auf übersichtlichen Merkblättern
|
||||
im PDF Format zum Download zusammengefasst. Sollten Sie noch Fragen zum Thema
|
||||
Energieausweis online erstellen haben, stehen wir Ihnen gerne telefonisch unter
|
||||
folgender Nummer: 040/209 339 850 zur Verfügung.
|
||||
<hr />Mit dem <strong>Energieausweis</strong> werden Wohngebäude und Nichtwohngebäude
|
||||
nach den Vorgaben der Energieeinsparverordnung <a
|
||||
href="/enev-zusammenfassung">EnEV</a
|
||||
>
|
||||
energetisch bewertet. Das <a href="https://www.dibt.de/" target="blank"
|
||||
>DIBt</a
|
||||
>
|
||||
(Deutsches Institut für Bautechnik) regelt die Grundsätze zur Ausstellung, Berechnung
|
||||
und der Qualitätssicherung. Der Energieausweis beschreibt die entsprechenden
|
||||
Energiekennwerte auf einer Farbskala, grün (A+/Effizienzhaus), gelb (D) und rot
|
||||
(H / unsaniert). Es wird grundsätzlich zwischen zwei Energieausweisarten unterschieden:
|
||||
<hr />
|
||||
<div
|
||||
style="border-left: 5px solid #f5b68c; border-right: 5px solid #f5b68c;"
|
||||
class="px-4"
|
||||
>
|
||||
|
||||
<p>
|
||||
Der verbrauchsbasierte Energieausweis wird als <a
|
||||
title="Verbrauchsausweis"
|
||||
href="/energieausweis-erstellen/verbrauchsausweis-wohnen"
|
||||
><strong>Verbrauchsausweis</strong></a
|
||||
> bezeichnet. Dies ist der „kleine“ Energieausweis und kann bei Vermietung
|
||||
und Verkauf in den meisten Fällen verwendet werden. Hier gehts direkt
|
||||
zum Eingabeformular <br />→ <a
|
||||
title="Energieausweis online erstellen - Verbrauchsausweis"
|
||||
href="/energieausweis-erstellen/verbrauchsausweis-erstellen"
|
||||
>Energieausweis online erstellen</a
|
||||
>
|
||||
<hr />
|
||||
</p>
|
||||
<p>
|
||||
Der bedarfsbasierte Energieausweis wird als <a
|
||||
title="Bedarfsausweis"
|
||||
href="/bedarfsausweis/"><strong>Bedarfsausweis</strong></a
|
||||
>bezeichnet. Dies ist der „große“ Energieausweis und kann immer
|
||||
verwendet werden. Bei Neubau und Modernisierung ist er zwingend
|
||||
vorgeschrieben. Hier gehts direkt zum Eingabeformular <br />→ <a
|
||||
title="Energieausweis online erstellen - Bedarfsausweis"
|
||||
href="/energieausweis-erstellen/bedarfsausweis-erstellen"
|
||||
>Energieausweis online erstellen</a
|
||||
>
|
||||
</p>
|
||||
</div>
|
||||
<hr />
|
||||
<div class="grid grid-cols-1 lg:grid-cols-3 gap-4">
|
||||
<FeatureCard heading="Verbrauchsausweis Wohngebäude" price={45} href="/energieausweis-erstellen/verbrauchsausweis-wohnen">
|
||||
<div class="rpt_feature">Unsere Leistungen:</div>
|
||||
<div class="rpt_feature">Prüfung durch Diplom Ingenieur</div>
|
||||
<div class="rpt_feature">Energieausweis Vorschau als PDF</div>
|
||||
<div class="rpt_feature">Ausweisdokument als PDF per E-Mail</div>
|
||||
<div class="rpt_feature">Registrierung beim DiBt</div>
|
||||
<div class="rpt_feature">Bearbeitung innhalb 24h</div>
|
||||
<div class="rpt_feature">rechtssicher nach aktueller EnEV</div>
|
||||
<div class="rpt_feature">telefonische Beratung</div>
|
||||
</FeatureCard>
|
||||
<FeatureCard heading="Bedarfsausweis Wohngebäude" price={75} href="/bedarfsausweis">
|
||||
<div class="rpt_feature">Unsere Leistungen:</div>
|
||||
<div class="rpt_feature">Prüfung durch Diplom Ingenieur</div>
|
||||
<div class="rpt_feature">Energieausweis Vorschau als PDF</div>
|
||||
<div class="rpt_feature">Ausweisdokument als PDF per E-Mail</div>
|
||||
<div class="rpt_feature">Registrierung beim DiBt</div>
|
||||
<div class="rpt_feature">Bearbeitung innhalb 24h</div>
|
||||
<div class="rpt_feature">rechtssicher nach aktueller EnEV</div>
|
||||
<div class="rpt_feature">telefonische Beratung</div>
|
||||
</FeatureCard>
|
||||
<FeatureCard heading="Verbrauchsausweis Gewerbe" price={65} href="/energieausweis-erstellen/verbrauchsausweis-gewerbe">
|
||||
<div class="rpt_feature">Unsere Leistungen:</div>
|
||||
<div class="rpt_feature">Prüfung durch Diplom Ingenieur</div>
|
||||
<div class="rpt_feature">Energieausweis Vorschau als PDF</div>
|
||||
<div class="rpt_feature">Ausweisdokument als PDF per E-Mail</div>
|
||||
<div class="rpt_feature">Registrierung beim DiBt</div>
|
||||
<div class="rpt_feature">Bearbeitung innhalb 24h</div>
|
||||
<div class="rpt_feature">rechtssicher nach aktueller EnEV</div>
|
||||
<div class="rpt_feature">telefonische Beratung</div>
|
||||
</FeatureCard>
|
||||
</div>
|
||||
<hr />
|
||||
|
||||
<h2>Unterschied: Verbrauchsausweis und Bedarfsausweis</h2> Grundsätzlich unterscheidet
|
||||
man beim Energieausweis zwischen Verbrauchsausweis und Bedarfsausweis.<h3>
|
||||
Was ist ein Verbrauchsausweis?
|
||||
</h3>
|
||||
Der Verbrauchsausweis gibt den Energieverbrauch der Gebäudebewohner in den vergangenen
|
||||
drei Jahren für Heizung und Warmwasserbereitung an. Um den <a
|
||||
href="/enev-zusammenfassung#§-19-EnEV"
|
||||
>Energieverbrauchskennwert zu ermitteln</a
|
||||
>, wird der tatsächliche Energieverbrauch mithilfe eines standortbezogenen
|
||||
Klimafaktors bereinigt. Der Durchschnittswert wird dann durch die sogenannte
|
||||
energetische Gebäudenutzfläche (An) geteilt. So führt beispielsweise ein
|
||||
hoher Verbrauch in einem einzelnen harten Winter nicht zu einer schlechteren
|
||||
Beurteilung des Gebäudes. Der tatsächliche Energieverbrauch in einem Gebäude
|
||||
oder einer Wohnung kann aufgrund des Witterungseinflusses vom
|
||||
Energieverbrauchskennwert abweichen.Das Ergebnis im Verbrauchsausweis ist
|
||||
stark vom individuellen Nutzungsverhalten der Bewohner abhängig. Wird in
|
||||
einem energetisch schlechten Gebäude kaum geheizt, so kann der
|
||||
Energieausweis trotzdem sehr gut ausfallen.<h3>
|
||||
Was ist ein Bedarfsausweis?
|
||||
</h3> Der Bedarfsausweis entsteht auf Grundlage einer technischen <a
|
||||
href="/enev-zusammenfassung#§-18-EnEV"
|
||||
>Analyse der Bausubstanz und der Heizungsanlage eines Gebäudes</a
|
||||
> und ist unabhängig vom individuellen Nutzerverhalten. Die Farbverlaufsskala
|
||||
im Bedarfsausweis weist zwei verschiedene Werte aus, die sehr unterschiedlich
|
||||
ausfallen können – einen Wert für den Endenergiebedarf und einen für den Primärenergiebedarf.
|
||||
Zusätzlich wird noch ein Kennwert für die energetische Qualität der Gebäudehülle
|
||||
dargestellt.Der Energiebedarf gibt die nach technischen Regeln berechnete, vom
|
||||
konkreten Gebäude jährlich benötigte Energiemenge für Heizung, Lüftung und Warmwasserbereitung
|
||||
an. Dabei werden bei der Berechnung standardisierte Randbedingungen – beispielsweise
|
||||
eine Innentemperatur von 19 Grad im beheizten Bereich des Gebäudes – zugrunde
|
||||
gelegt. Am Endenergiebedarf sollten sich Hausbewohner orientieren, wenn sie ihren
|
||||
künftigen Energieverbrauch und die Energiekosten abschätzen wollen.Der Primärenergiebedarf
|
||||
bildet die Gesamtenergieeffizienz eines Gebäudes ab. Er berücksichtigt neben
|
||||
der Endenergie auch die so genannte „Vorkette“ (Erkundung, Gewinnung, Verteilung,
|
||||
Umwandlung) der jeweils eingesetzten Energieträger (z.B. Heizöl, Gas, Strom,
|
||||
erneuerbare Energien).Besonders niedrig fällt der Primärenergiebedarf aus, wenn
|
||||
erneuerbare Energien (solare Strahlungsenergie, Geothermie, Energie aus Biomasse)
|
||||
für die Energieversorgung im Gebäude eingesetzt werden. Am Primärenergiebedarf
|
||||
können Verbraucher erkennen, wie umweltfreundlich ihr Gebäude ist.<h3>
|
||||
Fazit – Verbrauchsausweis / Bedarfsausweis
|
||||
</h3> Geht es um den tatsächlichen Verbrauch der Energie, der den Aufwand für
|
||||
Heizung und zentrale Warmwasserbereitung der vergangenen drei Jahre berücksichtigt,
|
||||
wird der Energieverbrauchskennwert für den Verbrauchsausweis ermittelt. Bei gewerblichen
|
||||
Objekten wird zusätzlich der Verbrauch für Beleuchtung und Klimatisierung mit
|
||||
eingerechnet. Anhand der Zeiträume und der Lage des Gebäudes (Postleitzahl) werden
|
||||
diese Daten ausgewertet und sowohl zeit-, als auch klimabereinigt zur Bewertung
|
||||
der vorhandenen energetischen Qualität herangezogen.Für das Ausstellen des Bedarfsausweis
|
||||
wird der rechnerische Energiebedarf unter standardisierten Randbedingungen benötigt.
|
||||
Daten rund um Bausubstanz, Gebäudehülle und Heizanlage fließen in die Berechnung
|
||||
mit ein. Bedarfsausweise widerspiegeln die tatsächliche energetische Qualität
|
||||
eines Gebäudes damit wesentlich besser als die Verbrauchsausweise.
|
||||
|
||||
<hr />
|
||||
<div class="start_infobox" title="Verbrauchsausweis Wohngebäude">
|
||||
<div class="start_infobox_inside IB_VA_WG">
|
||||
<img
|
||||
alt="Energieausweis online erstellen - Verbrauchsausweis"
|
||||
title="Energieausweis online erstellen - Verbrauchsausweis"
|
||||
class="start_infobox_img"
|
||||
src="/images/energieausweis-online-erstellen-verbrauchsausweis.png"
|
||||
/>
|
||||
<div class="title">Verbrauchsausweis Wohngebäude</div>
|
||||
<hr />
|
||||
<ul>
|
||||
<li>
|
||||
3 zusammenhängende Heizenergieverbräuche müssen eingegeben
|
||||
werden.
|
||||
</li>
|
||||
<li>
|
||||
Wohnfläche, Baujahr Gebäude und Baujahr Heizung müssen
|
||||
eingegeben werden.
|
||||
</li>
|
||||
<li>
|
||||
<div class="start_infobox_link">
|
||||
<a
|
||||
title="Verbrauchsausweis"
|
||||
href="/energieausweis-erstellen/verbrauchsausweis-wohnenverbrauchsausweis-wohngebaeude"
|
||||
>Verbrauchsausweis</a
|
||||
>
|
||||
bei fast allen Gebäuden möglich. (Baujahr > 1977 - Vermietung/Verkauf)
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="start_infobox_button">
|
||||
<a
|
||||
title="Verbrauchsausweis erstellen"
|
||||
href="/energieausweis-erstellen/verbrauchsausweis-erstellen"
|
||||
>Jetzt Verbrauchsausweis erstellen</a
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="start_infobox BA-WG" title="Bedarfssausweis Wohngebäude">
|
||||
<div class="start_infobox_inside">
|
||||
<img
|
||||
alt="Energieausweis online erstellen - Bedarfsausweis"
|
||||
title="Energieausweis online erstellen - Bedarfsausweis"
|
||||
class="start_infobox_img"
|
||||
src="/images/energieausweis-online-erstellen-verbrauchsausweis.png"
|
||||
/>
|
||||
<div class="title">Bedarfsausweis Wohngebäude</div>
|
||||
<hr />
|
||||
<ul>
|
||||
<li>
|
||||
Die verwendete Heizungsanlage (Standardkessel,
|
||||
Brennwertkessel, etc.) muß eingegeben werden.
|
||||
</li>
|
||||
<li>
|
||||
Grundrissgeometrie sowie Baujahr Heizung und Gebäude müssen
|
||||
eingegeben werden.
|
||||
</li>
|
||||
<li>
|
||||
<a
|
||||
title="Bedarfsausweis"
|
||||
href="/bedarfsausweis/bedarfsausweis-wohngebaeude"
|
||||
>Bedarfsausweis</a
|
||||
> bei allen Gebäuden möglich. Die Berechnung ist umfangreicher
|
||||
und besser vergleichbar.
|
||||
</li>
|
||||
</ul>
|
||||
<div class="start_infobox_button">
|
||||
<a
|
||||
title="Bedarfsausweis erstellen"
|
||||
href="/energieausweis-erstellen/bedarfsausweis-erstellen"
|
||||
>Jetzt Bedarfsausweis erstellen</a
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="start_infobox VANW_WG" title="Bedarfsausweis Gewerbe">
|
||||
<div class="start_infobox_inside">
|
||||
<img
|
||||
alt="Energieausweis online erstellen - Bedarfsausweis Gewerbe"
|
||||
title="Energieausweis online erstellen - Bedarfsausweis Gewerbe"
|
||||
class="start_infobox_img"
|
||||
src="/images/energieausweis-online-erstellen-verbrauchsausweis-gewerbe.png"
|
||||
/>
|
||||
<div class="title">Bedarfsausweis Gewerbe</div>
|
||||
<hr />
|
||||
<ul>
|
||||
<li>
|
||||
Aktuelle Grundriss- und Ansichtspläne werden für die
|
||||
Zonierung benötigt.
|
||||
</li>
|
||||
<li>
|
||||
Baubeschreibung (z.B. aus der Baugenehmigung) mit Angabe der
|
||||
verwendeten Baustoffe und TGA.
|
||||
</li>
|
||||
<li>
|
||||
Angabe vom Baujahr der Heizung, Gebäude und Klimaanlage.
|
||||
</li>
|
||||
<li>
|
||||
<a
|
||||
title="Bedarfsausweis Gewerbe"
|
||||
href="/bedarfsausweis/bedarfsausweis-gewerbe"
|
||||
>Bedarfsausweis Gewerbe</a
|
||||
> bei allen Nichtwohngebäuden möglich (kann immmer verwendet
|
||||
werden).
|
||||
</li>
|
||||
</ul>
|
||||
<div class="start_infobox_button">
|
||||
<a
|
||||
href="/energieausweis-erstellen/bedarfsausweis-gewerbe-anfragen"
|
||||
title="Bedarfsausweis Gewerbe anfragen"
|
||||
>Jetzt Bedarfsausweis Gewerbe anfragen</a
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
<h2>Energieausweis online erstellen</h2> Soll Wohneigentum veräußert oder bauliches
|
||||
Teileigentum zum Erwerb angeboten werden, muss dem möglichen Käufer oder Leasingnehmer
|
||||
auf Verlangen unverzüglich ein
|
||||
<a href="enev-zusammenfassung#§-16a-EnEV">Energieausweis gezeigt werden</a>.
|
||||
In den meisten Fällen ist hier ein Verbrauchsausweis ausreichend. Auch
|
||||
Mietern oder Pächtern soll der Energieausweis unmittelbaren Aufschluss über
|
||||
die energetischen Bedingungen des Gebäudes aufzeigen.Kommt der Anbieter der
|
||||
offerierten Immobilie diesem Auftrag nach der Energieeinsparverordnung nicht
|
||||
nach, drohen Bußgelder bis zu 15 000 Euro. Als Ausnahmen gelten Gebäude mit
|
||||
nicht mehr als 50 m² Fläche sowie Baudenkmäler (<a
|
||||
href="enev-zusammenfassung#§-16-EnEV">§ 16 Abs. 4 EnEV</a
|
||||
>).Die Deutsche Energie-Agentur GmbH (<a
|
||||
href="https://www.dena.de/"
|
||||
target="blank">dena</a
|
||||
>) empfiehlt bei Wohngebäuden generell den Bedarfsausweis. Er erlaubt eine
|
||||
nutzerunabhängige Bewertung des Gebäudes. Zusätzlich können bei der
|
||||
Erstellung eines Bedarfsausweises die Empfehlungen für Modernisierungen auf
|
||||
der Basis einer technischen Analyse des Gebäudes ermittelt werden.
|
||||
<hr />
|
||||
<h2>Zusammenfassung: Was ist ein Energieausweis?</h2>
|
||||
<ul id="start_ul_1">
|
||||
<li>
|
||||
Der Gesetzgeber hat zwei Arten des Energieausweises bestimmt: Den
|
||||
Verbrauchsausweis und den Bedarfsausweis.
|
||||
</li>
|
||||
<li>
|
||||
Je nach Gebäudeart, Baujahr, Nutzungsart gilt es verschiedene
|
||||
Kriterien für den Energieausweis zu beachten.
|
||||
</li>
|
||||
<li>
|
||||
Der Energieausweis ist ein Mittel, das als Starter für
|
||||
Energiesparmaßnahmen definiert werden kann.
|
||||
</li>
|
||||
<li>
|
||||
Mit Hilfe des Energieausweises kann sich der Marktwert einer
|
||||
Immobilie erhöhen.
|
||||
</li>
|
||||
<li>
|
||||
Der Energieausweis offenbart bauliche Mängel, die eine
|
||||
Energieverschwendung mit sich bringen.
|
||||
</li>
|
||||
<li>
|
||||
Im Energieausweis werden Sanierungs- bzw. Modernisierungsvorschläge
|
||||
dokumentiert.
|
||||
</li>
|
||||
<li>
|
||||
Anhand des Energiepasses lässt sich der energetische Zustand
|
||||
verschiedener Gebäude miteinander vergleichen.
|
||||
</li>
|
||||
</ul>
|
||||
</Layout>
|
||||
@@ -1,128 +0,0 @@
|
||||
---
|
||||
layout: ../layouts/Layout.astro
|
||||
title: "Welcher Energieausweis?"
|
||||
---
|
||||
|
||||
import WelcherAusweisWidget from "#components/widgets/WelcherAusweisWidget.svelte";
|
||||
import TextboxCardTemplate from "#components/design/content/TextboxCardTemplate.svelte";
|
||||
|
||||
# Welcher Energieausweis ist der richtige?
|
||||
|
||||
## Machen Sie hier den Online Check, welcher Energieausweis der richtige ist:
|
||||
|
||||
Falls Sie nicht wissen sollten welchen Energieausweis Sie benötigen, können Sie
|
||||
hier ganz einfach den Gebäudetyp und die entsprechende Maßnahme angeben und
|
||||
bekommen als Ergebnis, den für Sie pasenden Energieausweis angezeigt.
|
||||
|
||||
<WelcherAusweisWidget client:load/>
|
||||
|
||||
## Bei Vermietung und Verkauf Ihres Wohnhauses ist der Verbrauchsausweis Wohngebäude ausreichend
|
||||
|
||||
In den meisten Fällen können Sie bei Vermietung oder Verkauf Ihrer Immobilie den
|
||||
einfacheren Energieausweis erstellen lassen. Dieser Ausweis ist
|
||||
verbrauchsorientiert und benötigt als Berechnungsgrundlage 3 zusammenhängende
|
||||
Jahre der Heizenergieabrechnugen des Gebäudes. Wenn Ihnen also diese 3
|
||||
Abrechnugsjahre vorliegen, und es gab dazwischen keine grundlegenden
|
||||
Sanierungsmaßnahmen bzw. Heizungsaustausch, dann steht der Dateneingabe nichts
|
||||
im Wege. Laut GEG (vormals EnEV) gibt es nur eine rechtliche Ausnahme, bei der
|
||||
es nicht zulässig ist einen Verbrauchsausweis bei Vermietung und Verkauf zu
|
||||
verwenden. Dies ist dann der Fall, wenn Ihr Gebäude gänzlich unsaniert ist, vor
|
||||
1978 gebaut wurde und weniger als 5 Wohneinheiten besitzt. In diesem Fall oder
|
||||
bei unvollständigen Verbrauchsabrechnungen (z.B. bei Leerstand), kann der
|
||||
Bedarfsausweis Wohngebäude erstellt werden.
|
||||
|
||||
---
|
||||
|
||||
## Bei Neubau, Modernisierung, Änderung oder Erweiterung Ihres Wohnhauses benötigen Sie den Bedarfsausweis für Wohngebäude
|
||||
|
||||
Im der aktuellen GEG ist geregelt, wie bei Änderungen im Baubestand zu verfahren
|
||||
ist. In §46-51 des GEG ist festgelegt welche Mindestanforderungen bei
|
||||
Änderungen, Erweiterungen und Ausbau eingehalten werden müssen. Außerdem wird
|
||||
beschrieben unter welchen Voraussetzungen ein Bedarfsausweis erstellt werden
|
||||
muß. Dies ist z.B. nicht der Fall wenn nur einzelne Bauteile wie Dach, Außenwand
|
||||
und Fenster erneuert werden oder die Erweiterung < 50 m² ist. Dann muß nur ein
|
||||
Bauteilnachweis geführt werden.Bei Austausch der Heizungsanlage muß in jedem
|
||||
Fall ein Bedarfsausweis erstellt werden. Es kann auch vorkommen, daß bei
|
||||
Einzelmaßnahmen eine komplette Bedarfsberechnung durchgeführt werden muss wenn
|
||||
der Bauteilnachweis die EnEV-Anforderungen nicht erfüllt. Bei
|
||||
genehmigungspflichtigen Neubaumaßnahmen ist es vorgeschrieben vor Baubeginn
|
||||
einen GEG-Nachweis (früher Wärmeschutznachweis) zu erstellen. Aus der
|
||||
GEG-Berechnung kann später nach Fertigstellung der Bedarfsausweis erstellt
|
||||
werden. In § 15-19 des GEG ist geregelt welche Anforderungen für Wohngebäude
|
||||
eingehalten werden müssen.
|
||||
|
||||
---
|
||||
|
||||
<TextboxCardTemplate
|
||||
TitelName="Folgende Dokumente und Informationen werden für den Bedarfsausweis benötigt:"
|
||||
BulletPoints={[
|
||||
|
||||
["Grundriss- und Ansichtspläne sowie Baubeschreibung.", true],
|
||||
["Die wärmeübertragenden Umfassngsflächen wie Dach, Außenwand, Fenster,Kellerdecke bzw. Boden werden aus den Plänen ermittelt.", true],
|
||||
["Auch das Gebäudevolumen zur Ermittlung der energetischen Gebäudenutzfläche und die verschiedenen Nutzungszonen werden aus den Plänen erhoben.", false],
|
||||
["Die verwendete Heizungsanlage mit den Wärmeübergabekomponenten (Heizkörper, Fußbodenheizung, etc) sowie Energieträger und Kessel werden aus der Baubeschreibung oder aus den Angaben des Bauherren herangezogen.", false],
|
||||
]}
|
||||
></TextboxCardTemplate>
|
||||
|
||||
|
||||
|
||||
|
||||
Sollten Sie den Bedarfsausweis nur für Vermietung und Verkauf benötigen, dann
|
||||
können Sie den Ausweis bei uns auch online erstellen lassen. Die Eingabedaten
|
||||
werden dann nach einem vereinfachten Verfahren erhoben.
|
||||
|
||||
---
|
||||
|
||||
## Bei Vermietung und Verkauf Ihres Gewerbegebäudes benötigen Sie den Verbrauchsausweis Nichtwohngebäude (Gewerbe)
|
||||
|
||||
Bei Vermietung oder Verkauf Ihrer Gewerbeimmobilie können Sie den einfacheren
|
||||
Energieausweis erstellen lassen. Der gewerbliche Verbrauchsausweis benötigt als
|
||||
Berechnungsgrundlage den Stromverbrauch und den Heizenergieverbrauch des
|
||||
Gebäudes. Es werden 3 zusammenhängende Jahre der Heizenergieabrechnugen und der
|
||||
Stromabrechnung des Gebäudes benötigt. Wenn Ihnen also diese 3 Abrechnugsjahre
|
||||
vorliegen und die Verbräuche lassen sich eindeutig zuordnen, dann steht der
|
||||
Dateneingabe nichts im Wege.Es dürfen keine grundlegenden Sanierungsmaßnahmen
|
||||
bzw. Heizungsaustausch während dieses Zeitraums durchgeführt worden sein. Wenn
|
||||
diese Voraussetzungen nicht vorliegen, oder keine vollständigen
|
||||
Verbrauchsabrechnungen vorliegen (z.B. bei Leerstand), dann kann alternativ der
|
||||
Bedarfsausweis Nichtwohngebäude (Gewerbe) erstellt werden.
|
||||
|
||||
---
|
||||
|
||||
## Bei Neubau, Modernisierung, Änderung oder Erweiterung Ihres Gewerbegebäudes benötigen Sie den Bedarfsausweis für Nichtwohngebäude (Gewerbe)
|
||||
|
||||
In §46-51 des GEG ist festgelegt welche Mindestanforderungen bei Änderungen,
|
||||
Erweiterungen und Ausbau eingehalten werden müssen. Außerdem wird beschrieben
|
||||
unter welchen Voraussetzungen ein Bedarfsausweis erstellt werden muß. Dies ist
|
||||
z.B. nicht der Fall wenn nur einzelne Bauteile wie Dach, Außenwand und Fenster
|
||||
erneuert werden oder die Erweiterung < 50 m² ist. Dann muß nur ein
|
||||
Bauteilnachweis geführt werden.Bei Austausch der Heizungsanlage muß in jedem
|
||||
Fall ein Bedarfsausweis erstellt werden. Es kann auch vorkommen, daß bei
|
||||
Einzelmaßnahmen eine komplette Bedarfsberechnung durchgeführt werden muss wenn
|
||||
der Bauteilnachweis die EnEV-Anforderungen nicht erfüllt.Bei Neubauten ist es
|
||||
vorgeschrieben vor Baubeginn einen GEG-Nachweis (früher Wärmeschutznachweis) zu
|
||||
erstellen. Aus der GEG-Berechnung kann später nach Fertigstellung der
|
||||
Bedarfsausweis erstellt werden. Im §18-19 des GEG ist geregelt welche
|
||||
Anforderungen für Nichtwohngebäude eingehalten werden müssen.
|
||||
|
||||
---
|
||||
|
||||
<TextboxCardTemplate
|
||||
TitelName="Folgende Dokumente und Informationen werden für den Bedarfsausweis Gewerbe benötigt:"
|
||||
BulletPoints={[
|
||||
|
||||
["Grundriss- und Ansichtspläne sowie Baubeschreibung.", true],
|
||||
["Die wärmeübertragenden Umfassngsflächen wie Dach, Außenwand, Fenster,Kellerdecke bzw. Boden werden aus den Plänen ermittelt.", true],
|
||||
["Auch das Gebäudevolumen zur Ermittlung der energetischen Gebäudenutzfläche und die verschiedenen Nutzungszonen werden aus den Plänen erhoben.", false],
|
||||
["Die verwendete Heizungsanlage mit den Wärmeübergabekomponenten (Heizkörper,Fußbodenheizung, etc) sowie Energieträger und Kessel werden aus der Baubeschreibung oder aus den Angaben des Bauherren herangezogen.", false],
|
||||
["Anlagentechnik zu Kühlung und Lüftung der entsprechenden Nutzungszonen müssen definiert sein.", true],
|
||||
["Die verwendete Beleuchtung der verschiedenen Nutzungszonen wird ebenfalls herangezogen", true],
|
||||
]}
|
||||
></TextboxCardTemplate>
|
||||
|
||||
|
||||
Sollten Sie den Bedarfsausweis nur für Vermietung und Verkauf benötigen, dann
|
||||
können Sie den Ausweis bei uns auch online erstellen lassen. Die Eingabedaten
|
||||
werden dann nach einem vereinfachten Verfahren erhoben.
|
||||
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import { AufnahmeClient, ZodOverlap } from "#components/Ausweis/types.js";
|
||||
import { exclude } from "#lib/exclude.js";
|
||||
import { authorizationMiddleware } from "#lib/middleware/authorization.js";
|
||||
import { AufnahmeSchema, prisma } from "@ibcornelsen/database/server";
|
||||
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
||||
@@ -55,6 +57,13 @@ export const GET = defineApiRoute({
|
||||
}
|
||||
}
|
||||
},
|
||||
output: ZodOverlap<AufnahmeClient>(AufnahmeSchema.omit({
|
||||
id: true,
|
||||
objekt_id: true,
|
||||
benutzer_id: true
|
||||
}).merge(z.object({
|
||||
uid_objekt: z.string().uuid()
|
||||
}))),
|
||||
middleware: authorizationMiddleware,
|
||||
async fetch(input, context, user) {
|
||||
const { uid } = context.params;
|
||||
@@ -64,6 +73,13 @@ export const GET = defineApiRoute({
|
||||
uid,
|
||||
benutzer_id: user.id
|
||||
},
|
||||
include: {
|
||||
objekt: {
|
||||
select: {
|
||||
uid: true
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if (!aufnahme) {
|
||||
@@ -73,6 +89,9 @@ export const GET = defineApiRoute({
|
||||
})
|
||||
}
|
||||
|
||||
return aufnahme
|
||||
return exclude({
|
||||
uid_objekt: aufnahme.objekt.uid,
|
||||
...aufnahme
|
||||
}, ["id", "objekt_id", "benutzer_id", "objekt"])
|
||||
},
|
||||
});
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import { ObjektClient, ZodOverlap } from "#components/Ausweis/types.js";
|
||||
import { exclude } from "#lib/exclude.js";
|
||||
import { authorizationMiddleware } from "#lib/middleware/authorization.js";
|
||||
import { ObjektSchema, prisma } from "@ibcornelsen/database/server";
|
||||
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
||||
@@ -57,6 +59,10 @@ export const GET = defineApiRoute({
|
||||
}
|
||||
}
|
||||
},
|
||||
output: ZodOverlap<ObjektClient>(ObjektSchema.omit({
|
||||
benutzer_id: true,
|
||||
id: true
|
||||
})),
|
||||
middleware: authorizationMiddleware,
|
||||
async fetch(input, ctx, user) {
|
||||
const { uid } = ctx.params;
|
||||
@@ -75,6 +81,6 @@ export const GET = defineApiRoute({
|
||||
})
|
||||
}
|
||||
|
||||
return objekt
|
||||
return exclude(objekt, ["benutzer_id", "id"])
|
||||
},
|
||||
});
|
||||
|
||||
41
src/pages/api/user/index.ts
Normal file
@@ -0,0 +1,41 @@
|
||||
import { hashPassword } from "#lib/password.js";
|
||||
import { prisma } from "@ibcornelsen/database/server";
|
||||
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
||||
import { z } from "zod";
|
||||
|
||||
export const PUT = defineApiRoute({
|
||||
input: z.object({
|
||||
email: z.string().email(),
|
||||
passwort: z.string().min(6),
|
||||
vorname: z.string(),
|
||||
name: z.string()
|
||||
}),
|
||||
output: z.object({
|
||||
uid: z.string().uuid()
|
||||
}),
|
||||
async fetch(input) {
|
||||
const user = await prisma.benutzer.findUnique({
|
||||
where: {
|
||||
email: input.email
|
||||
}
|
||||
})
|
||||
|
||||
if (user) {
|
||||
throw new APIError({
|
||||
code: "CONFLICT",
|
||||
message: "Email Adresse ist bereits vergeben."
|
||||
})
|
||||
}
|
||||
|
||||
const { uid } = await prisma.benutzer.create({
|
||||
data: {
|
||||
email: input.email,
|
||||
passwort: hashPassword(input.passwort),
|
||||
vorname: input.vorname,
|
||||
name: input.name
|
||||
}
|
||||
})
|
||||
|
||||
return { uid }
|
||||
},
|
||||
})
|
||||
@@ -1,3 +1,4 @@
|
||||
import { VerbrauchsausweisWohnenClient, ZodOverlap } from "#components/Ausweis/types.js";
|
||||
import { exclude } from "#lib/exclude.js";
|
||||
import { authorizationMiddleware } from "#lib/middleware/authorization.js";
|
||||
import { prisma, VerbrauchsausweisWohnenSchema } from "@ibcornelsen/database/server";
|
||||
@@ -59,15 +60,15 @@ export const GET = defineApiRoute({
|
||||
}
|
||||
}
|
||||
},
|
||||
output: VerbrauchsausweisWohnenSchema.merge(z.object({
|
||||
output: ZodOverlap<VerbrauchsausweisWohnenClient>(VerbrauchsausweisWohnenSchema.merge(z.object({
|
||||
uid_aufnahme: z.string().uuid(),
|
||||
uid_objekt: z.string().uuid(),
|
||||
uid_benutzer: z.string().uuid().optional()
|
||||
})).omit({
|
||||
id: true,
|
||||
aufnahme_id: true,
|
||||
benutzer_id: true,
|
||||
}),
|
||||
benutzer_id: true
|
||||
})),
|
||||
middleware: authorizationMiddleware,
|
||||
async fetch(input, context, user) {
|
||||
const { uid } = context.params;
|
||||
|
||||
@@ -4,6 +4,7 @@ import VerbrauchsausweisWohnenModule from "#modules/VerbrauchsausweisWohnen/Verb
|
||||
import { AufnahmeClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
|
||||
import { createCaller } from "../../../astro-typesafe-api-caller.js";
|
||||
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants";
|
||||
import { validateAccessTokenServer } from "#server/lib/validateAccessToken";
|
||||
|
||||
const uid = Astro.url.searchParams.get("uid");
|
||||
let ausweis: VerbrauchsausweisWohnenClient = {} as VerbrauchsausweisWohnenClient;
|
||||
@@ -11,9 +12,17 @@ let aufnahme: AufnahmeClient = {} as AufnahmeClient;
|
||||
let objekt: ObjektClient = {} as ObjektClient;
|
||||
let bilder: UploadedGebaeudeBild[] = []
|
||||
|
||||
const valid = validateAccessTokenServer(Astro);
|
||||
|
||||
const caller = createCaller(Astro);
|
||||
|
||||
if (uid) {
|
||||
if (!valid) {
|
||||
return Astro.redirect(
|
||||
`/auth/login?redirect=${Astro.url.toString()}`
|
||||
);
|
||||
}
|
||||
|
||||
try {
|
||||
ausweis = await caller["verbrauchsausweis-wohnen"]._uid.GET.fetch(null, {
|
||||
headers: {
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
import { createCaller } from "#lib/caller.js";
|
||||
import { API_ACCESS_TOKEN_COOKIE_NAME, API_REFRESH_TOKEN_COOKIE_NAME, API_UID_COOKIE_NAME } from "#lib/constants.js";
|
||||
import type { AstroGlobal } from "astro";
|
||||
import moment from "moment";
|
||||
|
||||
import { createCaller } from "../../astro-typesafe-api-caller.js"
|
||||
import jwt from "jsonwebtoken"
|
||||
import { TokenData, TokenType } from "#lib/auth/token.js";
|
||||
|
||||
export async function validateAccessTokenServer(astro: AstroGlobal) {
|
||||
const accessToken = astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value;
|
||||
@@ -17,12 +18,14 @@ export async function validateAccessTokenServer(astro: AstroGlobal) {
|
||||
}
|
||||
|
||||
if (accessToken) {
|
||||
const { valid } = await createCaller(astro).v1.benutzer.validateAccessToken({accessToken})
|
||||
const { exp, typ, uid } = jwt.decode(accessToken, {
|
||||
json: true
|
||||
}) as TokenData
|
||||
|
||||
if (!valid) {
|
||||
astro.cookies.delete(API_ACCESS_TOKEN_COOKIE_NAME);
|
||||
if (exp > Date.now() && typ === TokenType.Access) {
|
||||
return true;
|
||||
} else {
|
||||
return true
|
||||
astro.cookies.delete(API_ACCESS_TOKEN_COOKIE_NAME);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,7 +35,7 @@ export async function validateAccessTokenServer(astro: AstroGlobal) {
|
||||
// Wenn das nicht klappt, dann müssen wir uns neu anmelden.
|
||||
// TODO: Schlägt fehl! Ich habe keine Ahnung warum. Ich habe das Gefühl, dass das an der Astro-Implementierung liegt. Der Refresh Token updated sich nicht richtig....
|
||||
try {
|
||||
const { accessToken: newAccessToken, accessTokenExpiry, refreshToken: newRefreshToken, refreshTokenExpiry } = await createCaller(astro).v1.benutzer.getAccessToken({
|
||||
const { accessToken: newAccessToken, accessTokenExpiry, refreshToken: newRefreshToken, refreshTokenExpiry } = await createCaller(astro).auth["access-token"].GET.fetch({
|
||||
refreshToken
|
||||
})
|
||||
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
import { test, describe, expect } from "bun:test";
|
||||
import { pdfVerbrauchsausweisWohnen } from "#lib/pdf/pdfVerbrauchsausweisWohnen";
|
||||
import { verbrauchsausweisWohnenFaker } from "#lib/faker/verbrauchsausweis-wohnen";
|
||||
import { VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
|
||||
import { pdfVerbrauchsausweisWohnen } from "#lib/pdf/pdfVerbrauchsausweisWohnen.js";
|
||||
import { fakeVerbrauchsausweisWohnen } from "#lib/faker.js";
|
||||
import { VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
|
||||
|
||||
|
||||
describe('Verbrauchsausweis Wohnen PDF', async () => {
|
||||
const ausweis: VerbrauchsausweisWohnenClient = verbrauchsausweisWohnenFaker(42);
|
||||
const ausweis: VerbrauchsausweisWohnenClient = fakeVerbrauchsausweisWohnen(42);
|
||||
|
||||
test("Ausweis Erstellung", async () => {
|
||||
const pdf = await pdfVerbrauchsausweisWohnen(ausweis);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { test, describe, expect } from "bun:test";
|
||||
import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016";
|
||||
import { importVerbrauchsausweisWohnenAltesSystem, verbrauchsausweisWohnenImportTranslate } from "#lib/altes-system/import";
|
||||
import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js";
|
||||
import { importVerbrauchsausweisWohnenAltesSystem, verbrauchsausweisWohnenImportTranslate } from "#lib/altes-system/import.js";
|
||||
|
||||
describe('Energieverbrauch', async () => {
|
||||
const request = await importVerbrauchsausweisWohnenAltesSystem();
|
||||
|
||||