Merge pull request #470 from IBCornelsen/main

get main
This commit is contained in:
Jens Cornelsen
2025-04-02 12:02:52 +02:00
committed by GitHub
86 changed files with 1560 additions and 1703 deletions

View File

@@ -6,7 +6,6 @@ import node from "@astrojs/node";
import mdx from "@astrojs/mdx"; import mdx from "@astrojs/mdx";
import astroTypesafeAPI from "astro-typesafe-api" import astroTypesafeAPI from "astro-typesafe-api"
// https://astro.build/config // https://astro.build/config
export default defineConfig({ export default defineConfig({
integrations: [svelte(), tailwind(), mdx(), astroTypesafeAPI()], integrations: [svelte(), tailwind(), mdx(), astroTypesafeAPI()],

View File

@@ -32,7 +32,7 @@
"js-interpolate": "^1.3.2", "js-interpolate": "^1.3.2",
"jsonwebtoken": "^9.0.2", "jsonwebtoken": "^9.0.2",
"jwt-decode": "^4.0.0", "jwt-decode": "^4.0.0",
"mime-types": "^2.1.35", "mime": "^4.0.6",
"moment": "^2.30.1", "moment": "^2.30.1",
"moment-timezone": "^0.5.46", "moment-timezone": "^0.5.46",
"nodemailer": "^6.10.0", "nodemailer": "^6.10.0",
@@ -64,7 +64,6 @@
"@types/is-base64": "^1.1.3", "@types/is-base64": "^1.1.3",
"@types/js-cookie": "^3.0.6", "@types/js-cookie": "^3.0.6",
"@types/jsonwebtoken": "^9.0.7", "@types/jsonwebtoken": "^9.0.7",
"@types/mime-types": "^2.1.4",
"@types/nodemailer": "^6.4.17", "@types/nodemailer": "^6.4.17",
"@types/papaparse": "^5.3.15", "@types/papaparse": "^5.3.15",
"@types/siema": "^1.4.11", "@types/siema": "^1.4.11",
@@ -772,8 +771,6 @@
"@types/mime": ["@types/mime@1.3.5", "", {}, "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w=="], "@types/mime": ["@types/mime@1.3.5", "", {}, "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w=="],
"@types/mime-types": ["@types/mime-types@2.1.4", "", {}, "sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w=="],
"@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="],
"@types/nlcst": ["@types/nlcst@2.0.3", "", { "dependencies": { "@types/unist": "*" } }, "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA=="], "@types/nlcst": ["@types/nlcst@2.0.3", "", { "dependencies": { "@types/unist": "*" } }, "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA=="],
@@ -1856,7 +1853,7 @@
"micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="],
"mime": ["mime@1.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="], "mime": ["mime@4.0.6", "", { "bin": { "mime": "bin/cli.js" } }, "sha512-4rGt7rvQHBbaSOF9POGkk1ocRP16Md1x36Xma8sz8h8/vfCUI2OtEIeCqe4Ofes853x4xDoPiFLIT47J5fI/7A=="],
"mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="],
@@ -2868,6 +2865,8 @@
"node-mocks-http/depd": ["depd@1.1.2", "", {}, "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ=="], "node-mocks-http/depd": ["depd@1.1.2", "", {}, "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ=="],
"node-mocks-http/mime": ["mime@1.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="],
"normalize-package-data/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="], "normalize-package-data/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="],
"npm-packlist/glob": ["glob@8.1.0", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^5.0.1", "once": "^1.3.0" } }, "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ=="], "npm-packlist/glob": ["glob@8.1.0", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^5.0.1", "once": "^1.3.0" } }, "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ=="],
@@ -2938,6 +2937,8 @@
"send/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], "send/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
"send/mime": ["mime@1.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="],
"serve-static/send": ["send@0.19.0", "", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "2.4.1", "range-parser": "~1.2.1", "statuses": "2.0.1" } }, "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw=="], "serve-static/send": ["send@0.19.0", "", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "2.4.1", "range-parser": "~1.2.1", "statuses": "2.0.1" } }, "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw=="],
"soap/strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], "soap/strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="],
@@ -3022,6 +3023,8 @@
"express/send/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="], "express/send/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="],
"express/send/mime": ["mime@1.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="],
"finalhandler/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], "finalhandler/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="],
"form-render/@ant-design/icons/@ant-design/colors": ["@ant-design/colors@6.0.0", "", { "dependencies": { "@ctrl/tinycolor": "^3.4.0" } }, "sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ=="], "form-render/@ant-design/icons/@ant-design/colors": ["@ant-design/colors@6.0.0", "", { "dependencies": { "@ctrl/tinycolor": "^3.4.0" } }, "sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ=="],
@@ -3094,6 +3097,8 @@
"serve-static/send/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="], "serve-static/send/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="],
"serve-static/send/mime": ["mime@1.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="],
"tsx/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.0", "", { "os": "aix", "cpu": "ppc64" }, "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ=="], "tsx/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.0", "", { "os": "aix", "cpu": "ppc64" }, "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ=="],
"tsx/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.0", "", { "os": "android", "cpu": "arm" }, "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g=="], "tsx/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.0", "", { "os": "android", "cpu": "arm" }, "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g=="],

View File

@@ -35,6 +35,14 @@ export default defineConfig({
on("task", { on("task", {
async verbrauchsausweisWohnen(query) { async verbrauchsausweisWohnen(query) {
return await prisma.verbrauchsausweisWohnen.findFirst(query) return await prisma.verbrauchsausweisWohnen.findFirst(query)
},
async plz() {
const total = await prisma.postleitzahlen.count()
const result = await prisma.postleitzahlen.findFirst({
skip: Math.floor(Math.random() * total)
})
return result?.plz
} }
}) })
}, },

View File

@@ -46,7 +46,7 @@
"js-interpolate": "^1.3.2", "js-interpolate": "^1.3.2",
"jsonwebtoken": "^9.0.2", "jsonwebtoken": "^9.0.2",
"jwt-decode": "^4.0.0", "jwt-decode": "^4.0.0",
"mime-types": "^2.1.35", "mime": "^4.0.6",
"moment": "^2.30.1", "moment": "^2.30.1",
"moment-timezone": "^0.5.46", "moment-timezone": "^0.5.46",
"nodemailer": "^6.10.0", "nodemailer": "^6.10.0",
@@ -78,7 +78,6 @@
"@types/is-base64": "^1.1.3", "@types/is-base64": "^1.1.3",
"@types/js-cookie": "^3.0.6", "@types/js-cookie": "^3.0.6",
"@types/jsonwebtoken": "^9.0.7", "@types/jsonwebtoken": "^9.0.7",
"@types/mime-types": "^2.1.4",
"@types/nodemailer": "^6.4.17", "@types/nodemailer": "^6.4.17",
"@types/papaparse": "^5.3.15", "@types/papaparse": "^5.3.15",
"@types/siema": "^1.4.11", "@types/siema": "^1.4.11",

View File

@@ -0,0 +1,44 @@
/*
Warnings:
- You are about to drop the column `ausstellungsdatum` on the `Aufnahme` table. All the data in the column will be lost.
- You are about to drop the column `ausweisart` on the `Aufnahme` table. All the data in the column will be lost.
- You are about to drop the column `boxpruefung` on the `Aufnahme` table. All the data in the column will be lost.
- You are about to drop the column `brennstoff_1` on the `Aufnahme` table. All the data in the column will be lost.
- You are about to drop the column `brennstoff_2` on the `Aufnahme` table. All the data in the column will be lost.
- You are about to drop the column `energieeffizienzklasse` on the `Aufnahme` table. All the data in the column will be lost.
- You are about to drop the column `uid` on the `Bild` table. All the data in the column will be lost.
- You are about to drop the column `keller_beheizt` on the `VerbrauchsausweisWohnen` table. All the data in the column will be lost.
*/
-- DropIndex
DROP INDEX "Bild_uid_key";
-- AlterTable
ALTER TABLE "Aufnahme" DROP COLUMN "ausstellungsdatum",
DROP COLUMN "ausweisart",
DROP COLUMN "boxpruefung",
DROP COLUMN "brennstoff_1",
DROP COLUMN "brennstoff_2",
DROP COLUMN "energieeffizienzklasse";
-- AlterTable
ALTER TABLE "BedarfsausweisWohnen" ADD COLUMN "ausstellungsdatum" TIMESTAMP(3),
ADD COLUMN "boxpruefung" BOOLEAN DEFAULT false,
ADD COLUMN "energieeffizienzklasse" VARCHAR(5);
-- AlterTable
ALTER TABLE "Bild" DROP COLUMN "uid";
-- AlterTable
ALTER TABLE "VerbrauchsausweisGewerbe" ADD COLUMN "ausstellungsdatum" TIMESTAMP(3),
ADD COLUMN "boxpruefung" BOOLEAN DEFAULT false,
ADD COLUMN "energieeffizienzklasse" VARCHAR(5);
-- AlterTable
ALTER TABLE "VerbrauchsausweisWohnen" DROP COLUMN "keller_beheizt",
ADD COLUMN "ausstellungsdatum" TIMESTAMP(3),
ADD COLUMN "boxpruefung" BOOLEAN DEFAULT false,
ADD COLUMN "brennstoff_1" VARCHAR(50),
ADD COLUMN "brennstoff_2" VARCHAR(50),
ADD COLUMN "energieeffizienzklasse" VARCHAR(5);

View File

@@ -0,0 +1,22 @@
/*
Warnings:
- Added the required column `updated_at` to the `BedarfsausweisGewerbe` table without a default value. This is not possible if the table is not empty.
- Added the required column `updated_at` to the `GEGNachweisGewerbe` table without a default value. This is not possible if the table is not empty.
- Added the required column `updated_at` to the `GEGNachweisWohnen` table without a default value. This is not possible if the table is not empty.
*/
-- AlterTable
ALTER TABLE "BedarfsausweisGewerbe" ADD COLUMN "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
ADD COLUMN "nachweistyp" "AusweisTyp" NOT NULL DEFAULT 'Standard',
ADD COLUMN "updated_at" TIMESTAMP(3) NOT NULL;
-- AlterTable
ALTER TABLE "GEGNachweisGewerbe" ADD COLUMN "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
ADD COLUMN "nachweistyp" "AusweisTyp" NOT NULL DEFAULT 'Standard',
ADD COLUMN "updated_at" TIMESTAMP(3) NOT NULL;
-- AlterTable
ALTER TABLE "GEGNachweisWohnen" ADD COLUMN "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
ADD COLUMN "nachweistyp" "AusweisTyp" NOT NULL DEFAULT 'Standard',
ADD COLUMN "updated_at" TIMESTAMP(3) NOT NULL;

View File

@@ -16,8 +16,6 @@ model Aufnahme {
id String @id @unique @db.VarChar(8) id String @id @unique @db.VarChar(8)
benutzer_id String? benutzer_id String?
benutzer Benutzer? @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction) benutzer Benutzer? @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
/// @zod.describe("Art des korrespondierenden Ausweises, wie z.B. VerbrauchsausweisWohnen")
ausweisart Ausweisart?
/// @zod.describe("Art des Gebäudes und seiner primären Nutzungsart") /// @zod.describe("Art des Gebäudes und seiner primären Nutzungsart")
gebaeudetyp String? @db.VarChar gebaeudetyp String? @db.VarChar
/// @zod.describe("Betrachteter Teil des Gebäudes, z.B. Gesamtgebäude, Wohnteil, Gewerbeteil") /// @zod.describe("Betrachteter Teil des Gebäudes, z.B. Gesamtgebäude, Wohnteil, Gewerbeteil")
@@ -56,20 +54,8 @@ model Aufnahme {
/// @zod.describe("Falls die Kühlung alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen") /// @zod.describe("Falls die Kühlung alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen")
alternative_kuehlung Boolean? alternative_kuehlung Boolean?
/// @zod.describe("Genutzer Brennstoff der primären Energiequelle") /// @zod.describe("Datum an dem der Kunde die Aufnahme erstellt hat")
brennstoff_1 String? @db.VarChar(50)
/// @zod.describe("Genutzer Brennstoff der sekundären Energiequelle")
brennstoff_2 String? @db.VarChar(50)
boxpruefung Boolean? @default(false)
/// @zod.describe("Die aus der Berechnung hervorgehende Energieeffizienzklasse des Gebäudes")
energieeffizienzklasse String? @db.VarChar(5)
/// @zod.describe("Datum an dem der Kunde den Ausweis erstellt hat")
erstellungsdatum DateTime? @default(now()) erstellungsdatum DateTime? @default(now())
/// @zod.describe("Datum an dem der Aussteller den Ausweis ausgestellt hat")
ausstellungsdatum DateTime?
/// @zod.describe("Falls das Gebäude über eine Zentralbeheizung verfügt, sollte dieser Wert auf true stehen") /// @zod.describe("Falls das Gebäude über eine Zentralbeheizung verfügt, sollte dieser Wert auf true stehen")
zentralheizung Boolean? zentralheizung Boolean?

View File

@@ -25,6 +25,11 @@ model BedarfsausweisGewerbe {
bauteilaktivierung Boolean? @default(false) bauteilaktivierung Boolean? @default(false)
klimatisierung Boolean? @default(false) klimatisierung Boolean? @default(false)
nachweistyp AusweisTyp @default(Standard)
created_at DateTime @default(now())
updated_at DateTime @updatedAt
/// @zod.describe("Die ID des Benutzers, welchem dieser Ausweis gehört") /// @zod.describe("Die ID des Benutzers, welchem dieser Ausweis gehört")
benutzer_id String? benutzer_id String?
benutzer Benutzer? @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction) benutzer Benutzer? @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction)

View File

@@ -11,6 +11,12 @@ model BedarfsausweisWohnen {
alternative_lueftung Boolean? alternative_lueftung Boolean?
alternative_kuehlung Boolean? alternative_kuehlung Boolean?
/// @zod.describe("Die aus der Berechnung hervorgehende Energieeffizienzklasse des Gebäudes")
energieeffizienzklasse String? @db.VarChar(5)
/// @zod.describe("Datum an dem der Aussteller den Ausweis ausgestellt hat")
ausstellungsdatum DateTime?
boxpruefung Boolean? @default(false)
anzahl_vollgeschosse Int? anzahl_vollgeschosse Int?
geschosshoehe Float? geschosshoehe Float?
anzahl_gauben Int? anzahl_gauben Int?

View File

@@ -16,6 +16,11 @@ model GEGNachweisGewerbe {
/// @zod.describe("Beschreibung des Bauvorhabens") /// @zod.describe("Beschreibung des Bauvorhabens")
beschreibung String? @db.Text beschreibung String? @db.Text
nachweistyp AusweisTyp @default(Standard)
created_at DateTime @default(now())
updated_at DateTime @updatedAt
/// @zod.describe("Die ID des Benutzers, welchem dieser Ausweis gehört") /// @zod.describe("Die ID des Benutzers, welchem dieser Ausweis gehört")
benutzer_id String? benutzer_id String?
benutzer Benutzer? @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction) benutzer Benutzer? @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction)

View File

@@ -16,6 +16,11 @@ model GEGNachweisWohnen {
/// @zod.describe("Beschreibung des Bauvorhabens") /// @zod.describe("Beschreibung des Bauvorhabens")
beschreibung String? @db.Text beschreibung String? @db.Text
nachweistyp AusweisTyp @default(Standard)
created_at DateTime @default(now())
updated_at DateTime @updatedAt
/// @zod.describe("Die ID des Benutzers, welchem dieser Ausweis gehört") /// @zod.describe("Die ID des Benutzers, welchem dieser Ausweis gehört")
benutzer_id String? benutzer_id String?
benutzer Benutzer? @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction) benutzer Benutzer? @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction)

View File

@@ -5,9 +5,7 @@ model VerbrauchsausweisGewerbe {
ausstellgrund Ausstellgrund? ausstellgrund Ausstellgrund?
registriernummer String? @db.VarChar registriernummer String? @db.VarChar
zusaetzliche_heizquelle Boolean? zusaetzliche_heizquelle Boolean?
brennstoff_1 String? @db.VarChar(50)
einheit_1 String? @db.VarChar(50) einheit_1 String? @db.VarChar(50)
brennstoff_2 String? @db.VarChar(50)
einheit_2 String? @db.VarChar(50) einheit_2 String? @db.VarChar(50)
startdatum DateTime? @db.Timestamp(6) startdatum DateTime? @db.Timestamp(6)
verbrauch_1 Int? verbrauch_1 Int?
@@ -17,6 +15,17 @@ model VerbrauchsausweisGewerbe {
verbrauch_5 Int? verbrauch_5 Int?
verbrauch_6 Int? verbrauch_6 Int?
/// @zod.describe("Genutzer Brennstoff der primären Energiequelle")
brennstoff_1 String? @db.VarChar(50)
/// @zod.describe("Genutzer Brennstoff der sekundären Energiequelle")
brennstoff_2 String? @db.VarChar(50)
/// @zod.describe("Die aus der Berechnung hervorgehende Energieeffizienzklasse des Gebäudes")
energieeffizienzklasse String? @db.VarChar(5)
/// @zod.describe("Datum an dem der Aussteller den Ausweis ausgestellt hat")
ausstellungsdatum DateTime?
boxpruefung Boolean? @default(false)
strom_1 Int? strom_1 Int?
strom_2 Int? strom_2 Int?
strom_3 Int? strom_3 Int?

View File

@@ -13,6 +13,18 @@ model VerbrauchsausweisWohnen {
einheit_1 String? @db.VarChar(50) einheit_1 String? @db.VarChar(50)
/// @zod.describe("Einheit des Energieträgers der sekundären Heizquelle") /// @zod.describe("Einheit des Energieträgers der sekundären Heizquelle")
einheit_2 String? @db.VarChar(50) einheit_2 String? @db.VarChar(50)
/// @zod.describe("Genutzer Brennstoff der primären Energiequelle")
brennstoff_1 String? @db.VarChar(50)
/// @zod.describe("Genutzer Brennstoff der sekundären Energiequelle")
brennstoff_2 String? @db.VarChar(50)
/// @zod.describe("Die aus der Berechnung hervorgehende Energieeffizienzklasse des Gebäudes")
energieeffizienzklasse String? @db.VarChar(5)
/// @zod.describe("Datum an dem der Aussteller den Ausweis ausgestellt hat")
ausstellungsdatum DateTime?
boxpruefung Boolean? @default(false)
startdatum DateTime? @db.Timestamptz(6) startdatum DateTime? @db.Timestamptz(6)
/// @zod.describe("Energieverbrauch der primären Heizquelle im ersten der drei Verbrauchsjahre") /// @zod.describe("Energieverbrauch der primären Heizquelle im ersten der drei Verbrauchsjahre")
verbrauch_1 Int? verbrauch_1 Int?
@@ -30,8 +42,6 @@ model VerbrauchsausweisWohnen {
warmwasser_enthalten Boolean? warmwasser_enthalten Boolean?
/// @zod.describe("Falls der Warmwasser Anteil am Verbrauch bekannt ist, sollte dieser Wert auf true stehen") /// @zod.describe("Falls der Warmwasser Anteil am Verbrauch bekannt ist, sollte dieser Wert auf true stehen")
warmwasser_anteil_bekannt Boolean? warmwasser_anteil_bekannt Boolean?
/// @zod.describe("Falls der Keller des Gebäudes beheizt wird, sollte dieser Wert auf true stehen")
keller_beheizt Boolean?
/// @zod.describe("Der Faktor mit dem die Wohnfläche erhöht wird wenn die beheizte Gesamtfläche (energetische Nutzfläche) unbekannt ist.") /// @zod.describe("Der Faktor mit dem die Wohnfläche erhöht wird wenn die beheizte Gesamtfläche (energetische Nutzfläche) unbekannt ist.")
faktorKeller Float? faktorKeller Float?

View File

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

View File

@@ -57,9 +57,6 @@ export async function ausweisSpeichern(
alternative_warmwasser: aufnahme.alternative_warmwasser, alternative_warmwasser: aufnahme.alternative_warmwasser,
aussenwand_gedaemmt: aufnahme.aussenwand_gedaemmt, aussenwand_gedaemmt: aufnahme.aussenwand_gedaemmt,
aussenwand_min_12cm_gedaemmt: aufnahme.aussenwand_min_12cm_gedaemmt, aussenwand_min_12cm_gedaemmt: aufnahme.aussenwand_min_12cm_gedaemmt,
ausweisart: aufnahme.ausweisart,
brennstoff_1: aufnahme.brennstoff_1,
brennstoff_2: aufnahme.brennstoff_2,
brennwert_kessel: aufnahme.brennwert_kessel, brennwert_kessel: aufnahme.brennwert_kessel,
dachgeschoss: aufnahme.dachgeschoss, dachgeschoss: aufnahme.dachgeschoss,
dachgeschoss_gedaemmt: aufnahme.dachgeschoss_gedaemmt, dachgeschoss_gedaemmt: aufnahme.dachgeschoss_gedaemmt,
@@ -70,7 +67,6 @@ export async function ausweisSpeichern(
einfach_verglasung: aufnahme.einfach_verglasung, einfach_verglasung: aufnahme.einfach_verglasung,
einheiten: aufnahme.einheiten, einheiten: aufnahme.einheiten,
einzelofen: aufnahme.einzelofen, einzelofen: aufnahme.einzelofen,
energieeffizienzklasse: aufnahme.energieeffizienzklasse,
fenster_dicht: aufnahme.fenster_dicht, fenster_dicht: aufnahme.fenster_dicht,
fenster_teilweise_undicht: aufnahme.fenster_teilweise_undicht, fenster_teilweise_undicht: aufnahme.fenster_teilweise_undicht,
flaeche: aufnahme.flaeche, flaeche: aufnahme.flaeche,
@@ -119,10 +115,7 @@ export async function ausweisSpeichern(
alternative_warmwasser: aufnahme.alternative_warmwasser, alternative_warmwasser: aufnahme.alternative_warmwasser,
aussenwand_gedaemmt: aufnahme.aussenwand_gedaemmt, aussenwand_gedaemmt: aufnahme.aussenwand_gedaemmt,
aussenwand_min_12cm_gedaemmt: aufnahme.aussenwand_min_12cm_gedaemmt, aussenwand_min_12cm_gedaemmt: aufnahme.aussenwand_min_12cm_gedaemmt,
ausweisart: aufnahme.ausweisart,
baujahr_klima: aufnahme.baujahr_klima, baujahr_klima: aufnahme.baujahr_klima,
brennstoff_1: aufnahme.brennstoff_1,
brennstoff_2: aufnahme.brennstoff_2,
brennwert_kessel: aufnahme.brennwert_kessel, brennwert_kessel: aufnahme.brennwert_kessel,
dachgeschoss: aufnahme.dachgeschoss, dachgeschoss: aufnahme.dachgeschoss,
dachgeschoss_gedaemmt: aufnahme.dachgeschoss_gedaemmt, dachgeschoss_gedaemmt: aufnahme.dachgeschoss_gedaemmt,
@@ -133,7 +126,6 @@ export async function ausweisSpeichern(
einfach_verglasung: aufnahme.einfach_verglasung, einfach_verglasung: aufnahme.einfach_verglasung,
einheiten: aufnahme.einheiten, einheiten: aufnahme.einheiten,
einzelofen: aufnahme.einzelofen, einzelofen: aufnahme.einzelofen,
energieeffizienzklasse: aufnahme.energieeffizienzklasse,
erstellungsdatum: aufnahme.erstellungsdatum, erstellungsdatum: aufnahme.erstellungsdatum,
fenster_dicht: aufnahme.fenster_dicht, fenster_dicht: aufnahme.fenster_dicht,
fenster_teilweise_undicht: aufnahme.fenster_teilweise_undicht, fenster_teilweise_undicht: aufnahme.fenster_teilweise_undicht,

View File

@@ -4,10 +4,10 @@ import { exclude } from "#lib/exclude.js";
import Cookies from "js-cookie"; import Cookies from "js-cookie";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js"; import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
import { AufnahmeClient, BedarfsausweisWohnenClient, BildClient, ObjektClient, UnterlageClient, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient, } from "#components/Ausweis/types.js"; import { AufnahmeClient, BedarfsausweisWohnenClient, BildClient, ObjektClient, UnterlageClient, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient, } from "#components/Ausweis/types.js";
import { Enums } from "#lib/client/prisma.js"; import { BedarfsausweisGewerbe, Enums, GEGNachweisGewerbe, GEGNachweisWohnen } from "#lib/client/prisma.js";
export async function nachweisSpeichern( export async function nachweisSpeichern(
nachweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient, nachweis: BedarfsausweisGewerbe | GEGNachweisWohnen | GEGNachweisGewerbe,
objekt: ObjektClient, objekt: ObjektClient,
aufnahme: AufnahmeClient, aufnahme: AufnahmeClient,
bilder: BildClient[], bilder: BildClient[],
@@ -58,9 +58,6 @@ export async function nachweisSpeichern(
alternative_warmwasser: aufnahme.alternative_warmwasser, alternative_warmwasser: aufnahme.alternative_warmwasser,
aussenwand_gedaemmt: aufnahme.aussenwand_gedaemmt, aussenwand_gedaemmt: aufnahme.aussenwand_gedaemmt,
aussenwand_min_12cm_gedaemmt: aufnahme.aussenwand_min_12cm_gedaemmt, aussenwand_min_12cm_gedaemmt: aufnahme.aussenwand_min_12cm_gedaemmt,
ausweisart: aufnahme.ausweisart,
brennstoff_1: aufnahme.brennstoff_1,
brennstoff_2: aufnahme.brennstoff_2,
brennwert_kessel: aufnahme.brennwert_kessel, brennwert_kessel: aufnahme.brennwert_kessel,
dachgeschoss: aufnahme.dachgeschoss, dachgeschoss: aufnahme.dachgeschoss,
dachgeschoss_gedaemmt: aufnahme.dachgeschoss_gedaemmt, dachgeschoss_gedaemmt: aufnahme.dachgeschoss_gedaemmt,
@@ -71,7 +68,6 @@ export async function nachweisSpeichern(
einfach_verglasung: aufnahme.einfach_verglasung, einfach_verglasung: aufnahme.einfach_verglasung,
einheiten: aufnahme.einheiten, einheiten: aufnahme.einheiten,
einzelofen: aufnahme.einzelofen, einzelofen: aufnahme.einzelofen,
energieeffizienzklasse: aufnahme.energieeffizienzklasse,
fenster_dicht: aufnahme.fenster_dicht, fenster_dicht: aufnahme.fenster_dicht,
fenster_teilweise_undicht: aufnahme.fenster_teilweise_undicht, fenster_teilweise_undicht: aufnahme.fenster_teilweise_undicht,
flaeche: aufnahme.flaeche, flaeche: aufnahme.flaeche,
@@ -120,10 +116,7 @@ export async function nachweisSpeichern(
alternative_warmwasser: aufnahme.alternative_warmwasser, alternative_warmwasser: aufnahme.alternative_warmwasser,
aussenwand_gedaemmt: aufnahme.aussenwand_gedaemmt, aussenwand_gedaemmt: aufnahme.aussenwand_gedaemmt,
aussenwand_min_12cm_gedaemmt: aufnahme.aussenwand_min_12cm_gedaemmt, aussenwand_min_12cm_gedaemmt: aufnahme.aussenwand_min_12cm_gedaemmt,
ausweisart: aufnahme.ausweisart,
baujahr_klima: aufnahme.baujahr_klima, baujahr_klima: aufnahme.baujahr_klima,
brennstoff_1: aufnahme.brennstoff_1,
brennstoff_2: aufnahme.brennstoff_2,
brennwert_kessel: aufnahme.brennwert_kessel, brennwert_kessel: aufnahme.brennwert_kessel,
dachgeschoss: aufnahme.dachgeschoss, dachgeschoss: aufnahme.dachgeschoss,
dachgeschoss_gedaemmt: aufnahme.dachgeschoss_gedaemmt, dachgeschoss_gedaemmt: aufnahme.dachgeschoss_gedaemmt,
@@ -134,7 +127,6 @@ export async function nachweisSpeichern(
einfach_verglasung: aufnahme.einfach_verglasung, einfach_verglasung: aufnahme.einfach_verglasung,
einheiten: aufnahme.einheiten, einheiten: aufnahme.einheiten,
einzelofen: aufnahme.einzelofen, einzelofen: aufnahme.einzelofen,
energieeffizienzklasse: aufnahme.energieeffizienzklasse,
erstellungsdatum: aufnahme.erstellungsdatum, erstellungsdatum: aufnahme.erstellungsdatum,
fenster_dicht: aufnahme.fenster_dicht, fenster_dicht: aufnahme.fenster_dicht,
fenster_teilweise_undicht: aufnahme.fenster_teilweise_undicht, fenster_teilweise_undicht: aufnahme.fenster_teilweise_undicht,
@@ -203,7 +195,7 @@ export async function nachweisSpeichern(
} else { } else {
const { id } = await putRoute.fetch({ const { id } = await putRoute.fetch({
nachweis, nachweis,
uid_aufnahme: aufnahme.id aufnahme_id: aufnahme.id
}, { }, {
headers: { headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}` "Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`

View File

@@ -5,12 +5,12 @@
import Overlay from "#components/Overlay.svelte"; import Overlay from "#components/Overlay.svelte";
import EmbeddedAuthFlowModule from "#modules/EmbeddedAuthFlowModule.svelte"; import EmbeddedAuthFlowModule from "#modules/EmbeddedAuthFlowModule.svelte";
import { AusweisTyp, Enums } from "#lib/client/prisma.js"; import { AusweisTyp, BedarfsausweisGewerbe, Enums, GEGNachweisGewerbe, GEGNachweisWohnen } from "#lib/client/prisma.js";
import { openWindowWithPost } from "#lib/helpers/window.js"; import { openWindowWithPost } from "#lib/helpers/window.js";
import { PRICES } from "#lib/constants.js"; import { PRICES } from "#lib/constants.js";
import { nachweisSpeichern } from "#client/lib/nachweisSpeichern.js"; import { nachweisSpeichern } from "#client/lib/nachweisSpeichern.js";
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient | GEGNachweisWohnenClient; export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient | BedarfsausweisGewerbe | GEGNachweisWohnen | GEGNachweisGewerbe;
export let bilder: BildClient[]; export let bilder: BildClient[];
export let unterlagen: UnterlageClient[] = []; export let unterlagen: UnterlageClient[] = [];
export let user: BenutzerClient | null; export let user: BenutzerClient | null;
@@ -46,16 +46,27 @@
return; return;
} }
if (ausweisart === Enums.Ausweisart.GEGNachweisWohnen || ausweisart === Enums.Ausweisart.GEGNachweisGewerbe || ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe) {
openWindowWithPost("/kundendaten", { openWindowWithPost("/kundendaten", {
ausweis: { ...ausweis, ausweistyp }, ausweis: { ...ausweis, nachweistyp: ausweistyp },
objekt, objekt,
aufnahme, aufnahme,
bilder, bilder,
unterlagen, unterlagen,
ausweisart, ausweisart,
ausweistyp ausweistyp
}, "") }, "")
} else {
openWindowWithPost("/kundendaten", {
ausweis: { ...ausweis, ausweistyp },
objekt,
aufnahme,
bilder,
unterlagen,
ausweisart,
ausweistyp
}, "")
}
} }
let loginAction: () => any = ausweisAbschicken; let loginAction: () => any = ausweisAbschicken;
@@ -71,7 +82,7 @@
let result: Awaited<ReturnType<typeof ausweisSpeichern>> | Awaited<ReturnType<typeof nachweisSpeichern>> | null = null; let result: Awaited<ReturnType<typeof ausweisSpeichern>> | Awaited<ReturnType<typeof nachweisSpeichern>> | null = null;
if (ausweisart === Enums.Ausweisart.GEGNachweisWohnen || ausweisart === Enums.Ausweisart.GEGNachweisGewerbe || ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe) { if (ausweisart === Enums.Ausweisart.GEGNachweisWohnen || ausweisart === Enums.Ausweisart.GEGNachweisGewerbe || ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe) {
result = await nachweisSpeichern({ ...ausweis, ausweistyp }, objekt, aufnahme, bilder, unterlagen, ausweisart) result = await nachweisSpeichern({ ...ausweis, nachweistyp: ausweistyp }, objekt, aufnahme, bilder, unterlagen, ausweisart)
ausweis.id = result.nachweis_id; ausweis.id = result.nachweis_id;
} else { } else {
result = await ausweisSpeichern({ ...ausweis, ausweistyp }, objekt, aufnahme, bilder, ausweisart) result = await ausweisSpeichern({ ...ausweis, ausweistyp }, objekt, aufnahme, bilder, ausweisart)

View File

@@ -26,6 +26,10 @@
Bedarfsausweis Wohnen Bedarfsausweis Wohnen
{:else if ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe} {:else if ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe}
Bedarfsausweis Gewerbe Bedarfsausweis Gewerbe
{:else if ausweisart === Enums.Ausweisart.GEGNachweisWohnen}
GEG Nachweis Wohngebäude
{:else if ausweisart === Enums.Ausweisart.GEGNachweisGewerbe}
GEG Nachweis Gewerbegebäude
{/if} {/if}
{#if ausweistyp === Enums.AusweisTyp.Beratung} {#if ausweistyp === Enums.AusweisTyp.Beratung}
mit Beratung mit Beratung

View File

@@ -79,11 +79,6 @@
} }
} }
$: {
console.log(aufnahme.brennstoff_1);
}
$: abweichung = auditVerbrauchAbweichung(ausweis, aufnahme); $: abweichung = auditVerbrauchAbweichung(ausweis, aufnahme);
</script> </script>
@@ -234,7 +229,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
class="rounded-e-none" class="rounded-e-none"
name="brennstoff_1" name="brennstoff_1"
data-cy="brennstoff_1" data-cy="brennstoff_1"
bind:value={aufnahme.brennstoff_1} bind:value={ausweis.brennstoff_1}
required required
> >
<option disabled selected value={null}>Bitte auswählen</option> <option disabled selected value={null}>Bitte auswählen</option>
@@ -267,11 +262,11 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
name="einheit_1" name="einheit_1"
data-cy="einheit_1" data-cy="einheit_1"
bind:value={ausweis.einheit_1} bind:value={ausweis.einheit_1}
disabled={!aufnahme.brennstoff_1} disabled={!ausweis.brennstoff_1}
required required
> >
<option disabled selected >Bitte auswählen</option> <option disabled selected >Bitte auswählen</option>
{#each fuelMap.hasOwnProperty(aufnahme.brennstoff_1) ? fuelMap[aufnahme.brennstoff_1] : [] as unit} {#each fuelMap.hasOwnProperty(ausweis.brennstoff_1) ? fuelMap[ausweis.brennstoff_1] : [] as unit}
<option value={unit}>{unit}</option> <option value={unit}>{unit}</option>
{/each} {/each}
</select> </select>
@@ -425,7 +420,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
class="rounded-e-none" class="rounded-e-none"
name="brennstoff_2" name="brennstoff_2"
data-cy="brennstoff_2" data-cy="brennstoff_2"
bind:value={aufnahme.brennstoff_2} bind:value={ausweis.brennstoff_2}
required required
> >
<option disabled selected <option disabled selected
@@ -460,13 +455,13 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
name="einheit_2" name="einheit_2"
data-cy="einheit_2" data-cy="einheit_2"
bind:value={ausweis.einheit_2} bind:value={ausweis.einheit_2}
disabled={!aufnahme.brennstoff_2} disabled={!ausweis.brennstoff_2}
required required
> >
<option disabled selected <option disabled selected
>Bitte auswählen</option >Bitte auswählen</option
> >
{#each fuelMap.hasOwnProperty(aufnahme.brennstoff_2) ? fuelMap[aufnahme.brennstoff_2] : [] as unit} {#each fuelMap.hasOwnProperty(ausweis.brennstoff_2) ? fuelMap[ausweis.brennstoff_2] : [] as unit}
<option value={unit}>{unit}</option> <option value={unit}>{unit}</option>
{/each} {/each}
</select> </select>

View File

@@ -233,7 +233,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<select <select
class="rounded-e-none" class="rounded-e-none"
name="brennstoff_1" name="brennstoff_1"
bind:value={aufnahme.brennstoff_1} bind:value={ausweis.brennstoff_1}
required required
> >
<option disabled selected value>Bitte auswählen</option> <option disabled selected value>Bitte auswählen</option>
@@ -273,11 +273,11 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
class="rounded-s-none" class="rounded-s-none"
name="einheit_1" name="einheit_1"
bind:value={ausweis.einheit_1} bind:value={ausweis.einheit_1}
disabled={!aufnahme.brennstoff_1} disabled={!ausweis.brennstoff_1}
required required
> >
<option disabled selected value>Bitte auswählen</option> <option disabled selected value>Bitte auswählen</option>
{#each fuelMap.hasOwnProperty(aufnahme.brennstoff_1) ? fuelMap[aufnahme.brennstoff_1] : [] as unit} {#each fuelMap.hasOwnProperty(ausweis.brennstoff_1) ? fuelMap[ausweis.brennstoff_1] : [] as unit}
<option value={unit}>{unit}</option> <option value={unit}>{unit}</option>
{/each} {/each}
</select> </select>
@@ -436,7 +436,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
<select <select
class="rounded-e-none" class="rounded-e-none"
name="brennstoff_2" name="brennstoff_2"
bind:value={aufnahme.brennstoff_2} bind:value={ausweis.brennstoff_2}
required required
data-cy="brennstoff_2" data-cy="brennstoff_2"
> >
@@ -480,13 +480,13 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
name="einheit_2" name="einheit_2"
data-cy="einheit_2" data-cy="einheit_2"
bind:value={ausweis.einheit_2} bind:value={ausweis.einheit_2}
disabled={!aufnahme.brennstoff_2} disabled={!ausweis.brennstoff_2}
required required
> >
<option disabled selected <option disabled selected
>Bitte auswählen</option >Bitte auswählen</option
> >
{#each fuelMap.hasOwnProperty(aufnahme.brennstoff_2) ? fuelMap[aufnahme.brennstoff_2] : [] as unit} {#each fuelMap.hasOwnProperty(ausweis.brennstoff_2) ? fuelMap[ausweis.brennstoff_2] : [] as unit}
<option value={unit}>{unit}</option> <option value={unit}>{unit}</option>
{/each} {/each}
</select> </select>

View File

@@ -107,7 +107,7 @@ export const UUidWithPrefix = z.string().refine((value) => {
return false; return false;
}) })
export function getAusweisartFromUUID(id: string): Enums.Ausweisart | null { export function getAusweisartFromId(id: string): Enums.Ausweisart | null {
if (!UUidWithPrefix.safeParse(id).success) { if (!UUidWithPrefix.safeParse(id).success) {
return null return null
} }

View File

@@ -3,7 +3,7 @@
import moment from "moment"; import moment from "moment";
import { import {
AufnahmeClient, AufnahmeClient,
getAusweisartFromUUID, getAusweisartFromId,
ObjektClient, ObjektClient,
BildClient, BildClient,
VerbrauchsausweisWohnenClient, VerbrauchsausweisWohnenClient,
@@ -31,7 +31,7 @@
async function ausweisAusstellen(uid: string) { async function ausweisAusstellen(uid: string) {
try { try {
await api.admin.ausstellen.GET.fetch({ await api.admin.ausstellen.GET.fetch({
uid_ausweis: uid id_ausweis: uid
}, { }, {
headers: { headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}` "Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
@@ -49,7 +49,7 @@
const ausweisArt = getAusweisartFromUUID(ausweis.id) const ausweisArt = getAusweisartFromId(ausweis.id)
let verbrauchWWGesamt_1 = ""; let verbrauchWWGesamt_1 = "";
let verbrauchWWGesamt_2 = ""; let verbrauchWWGesamt_2 = "";
@@ -141,7 +141,7 @@
Abgeschlossen = 2; Abgeschlossen = 2;
} }
if (aufnahme.boxpruefung) { if (ausweis.boxpruefung) {
symbolPruefung = "/images/dashboard/kreishaken.png"; symbolPruefung = "/images/dashboard/kreishaken.png";
} else { } else {
symbolPruefung = "/images/dashboard/kreiskreuz.png"; symbolPruefung = "/images/dashboard/kreiskreuz.png";
@@ -205,7 +205,7 @@
" x " + " x " +
aufnahme.flaeche + aufnahme.flaeche +
" m² Energetische Nutzfläche (Keller " + " m² Energetische Nutzfläche (Keller " +
ausweis.keller_beheizt + aufnahme.keller +
" ) in m²"; " ) in m²";
table3Z1 = aufnahme.flaeche; table3Z1 = aufnahme.flaeche;
table3Z2 = calculations?.energetischeNutzflaeche; table3Z2 = calculations?.energetischeNutzflaeche;
@@ -229,8 +229,8 @@
" kWh/" + " kWh/" +
ausweis.einheit_1 + ausweis.einheit_1 +
" >> Verbrauch 1 " + " >> Verbrauch 1 " +
aufnahme.brennstoff_1 + ausweis.brennstoff_1 +
" in kWh"; " in kWh";
tooltip4Z2 = tooltip4Z2 =
"(" + "(" +
ausweis.verbrauch_4 + ausweis.verbrauch_4 +
@@ -249,7 +249,7 @@
" kWh/" + " kWh/" +
ausweis.einheit_2 + ausweis.einheit_2 +
" >> Verbrauch 2 " + " >> Verbrauch 2 " +
aufnahme.brennstoff_2 + ausweis.brennstoff_2 +
" in kWh"; " in kWh";
table4Z1 = calculations?.energieVerbrauchGesamt_1; table4Z1 = calculations?.energieVerbrauchGesamt_1;
table4Z2 = calculations?.energieVerbrauchGesamt_2; table4Z2 = calculations?.energieVerbrauchGesamt_2;
@@ -764,7 +764,7 @@
<div slot="tooltip"> <div slot="tooltip">
<span>{aufnahme.prueftext}</span> <span>{aufnahme.prueftext}</span>
</div> </div>
{#if aufnahme.boxpruefung} {#if ausweis.boxpruefung}
<CheckCircled size={22}></CheckCircled> <CheckCircled size={22}></CheckCircled>
{:else} {:else}
<CrossCircled size={22}></CrossCircled> <CrossCircled size={22}></CrossCircled>
@@ -880,7 +880,7 @@
</tr> </tr>
<tr> <tr>
<td>Informationen des Nutzers</td> <td>Informationen des Nutzers</td>
<td>{aufnahme.boxpruefung}</td> <td>{ausweis.boxpruefung}</td>
</tr> </tr>
<tr> <tr>
<td>UID</td> <td>UID</td>

View File

@@ -1,5 +1,5 @@
<script lang="ts"> <script lang="ts">
import { AufnahmeKomplettClient, BedarfsausweisWohnenClient, BenutzerClient, getAusweisartFromUUID, RechnungClient, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js"; import { AufnahmeKomplettClient, BedarfsausweisWohnenClient, BenutzerClient, getAusweisartFromId, RechnungClient, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
import moment from "moment"; import moment from "moment";
import { dialogs } from "svelte-dialogs"; import { dialogs } from "svelte-dialogs";
import { import {
@@ -24,7 +24,7 @@
export let benutzer: BenutzerClient; export let benutzer: BenutzerClient;
const progress = ausweis.ausgestellt ? 100 : ausweis.bestellt ? 66 : 33; const progress = ausweis.ausgestellt ? 100 : ausweis.bestellt ? 66 : 33;
const ausweisart = getAusweisartFromUUID(ausweis.id); const ausweisart = getAusweisartFromId(ausweis.id);
const id = ausweis.alte_ausweis_id || ausweis.id; const id = ausweis.alte_ausweis_id || ausweis.id;
@@ -144,7 +144,7 @@
async function ausweisAusstellen() { async function ausweisAusstellen() {
try { try {
await api.admin.ausstellen.GET.fetch({ await api.admin.ausstellen.GET.fetch({
uid_ausweis: ausweis.id id_ausweis: ausweis.id
}, { }, {
headers: { headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}` "Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`

View File

@@ -1,7 +1,6 @@
<script lang="ts"> <script lang="ts">
import { AufnahmeKomplettClient, GEGNachweisWohnenClient, getAusweisartFromUUID } from "#components/Ausweis/types.js"; import { AufnahmeKomplettClient, GEGNachweisWohnenClient, getAusweisartFromId } from "#components/Ausweis/types.js";
import { import {
CrossCircled,
DotsVertical, DotsVertical,
Pencil2, Pencil2,
QuestionMarkCircled, QuestionMarkCircled,
@@ -12,7 +11,7 @@
export let aufnahme: AufnahmeKomplettClient; export let aufnahme: AufnahmeKomplettClient;
export let objekt: Objekt; export let objekt: Objekt;
const ausweisart = getAusweisartFromUUID(nachweis.uid); const ausweisart = getAusweisartFromId(nachweis.id);
let hilfeModal: HTMLDialogElement; let hilfeModal: HTMLDialogElement;
</script> </script>

View File

@@ -4,14 +4,15 @@
import HelpLabel from "#components/labels/HelpLabel.svelte"; import HelpLabel from "#components/labels/HelpLabel.svelte";
export let kategorie: string = ""; export let kategorie: string = "";
export let files: UnterlageClient[] = []; export let files: Unterlage[] = [];
export let max: number = Infinity; export let max: number = Infinity;
export let min: number = 1; export let min: number = 1;
export let name: string = ""; export let name: string = "";
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient | GEGNachweisWohnenClient; export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient | BedarfsausweisGewerbe | GEGNachweisWohnen | GEGNachweisGewerbe;
export let objekt: ObjektClient; export let objekt: ObjektClient;
import mime from "mime-types"; import mime from "mime"
import { api } from "astro-typesafe-api/client"; import { api } from "astro-typesafe-api/client";
import { BedarfsausweisGewerbe, GEGNachweisGewerbe, GEGNachweisWohnen, Unterlage } from "#lib/client/prisma.js";
function getAllFiles(this: HTMLInputElement) { function getAllFiles(this: HTMLInputElement) {
@@ -40,16 +41,16 @@
return; return;
} }
const mimeType = mime.types[file.name.split(".").pop() as string] const mimeType = mime.getType(file.name.split(".").pop() as string)
const { uid } = await api.unterlage.PUT.fetch({ const { id } = await api.unterlage.PUT.fetch({
data: reader.result as string, data: reader.result as string,
kategorie, kategorie,
mime: mimeType, mime: mimeType,
name: file.name name: file.name
}) })
files.push({ uid, kategorie, name: file.name, mime: mimeType }); files.push({ id, kategorie, name: file.name, mime: mimeType, aufnahme_id: null });
files = files; files = files;

View File

@@ -7,7 +7,7 @@
import { auditHeizungGebaeudeBaujahr } from "../Verbrauchsausweis/audits/HeizungGebaeudeBaujahr.js"; import { auditHeizungGebaeudeBaujahr } from "../Verbrauchsausweis/audits/HeizungGebaeudeBaujahr.js";
import { addNotification, deleteNotification } from "#components/Notifications/shared.js"; import { addNotification, deleteNotification } from "#components/Notifications/shared.js";
import TagInput from "../TagInput.svelte"; import TagInput from "../TagInput.svelte";
import { Enums } from "#lib/client/prisma.js"; import { BedarfsausweisGewerbe, Enums, GEGNachweisGewerbe, GEGNachweisWohnen } from "#lib/client/prisma.js";
import { import {
AufnahmeClient, AufnahmeClient,
ObjektClient, ObjektClient,
@@ -15,8 +15,8 @@
} from "../Ausweis/types.js"; } from "../Ausweis/types.js";
export let objekt: ObjektClient; export let objekt: ObjektClient;
export let ausweis: export let nachweis:
GEGNachweisWohnenClient; BedarfsausweisGewerbe | GEGNachweisWohnen | GEGNachweisGewerbe;
export let aufnahme: AufnahmeClient; export let aufnahme: AufnahmeClient;
export let ausweisart: Enums.Ausweisart; export let ausweisart: Enums.Ausweisart;
@@ -38,7 +38,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
class="rounded-e-none" class="rounded-e-none"
name="ausstellgrund" name="ausstellgrund"
placeholder="Anlass" placeholder="Anlass"
bind:value={ausweis.ausstellgrund} bind:value={nachweis.ausstellgrund}
required required
data-cy="ausstellgrund" data-cy="ausstellgrund"
> >

View File

@@ -1,6 +1,7 @@
<script lang="ts"> <script lang="ts">
import HelpLabel from "#components/labels/HelpLabel.svelte"; import HelpLabel from "#components/labels/HelpLabel.svelte";
import type { Enums } from "#lib/client/prisma.js"; import type { Enums } from "#lib/client/prisma.js";
import { tryCatch } from "#lib/tryCatch.js";
export let max: number = 2; export let max: number = 2;
export let min: number = 1; export let min: number = 1;
@@ -15,6 +16,7 @@
VerbrauchsausweisWohnenClient, VerbrauchsausweisWohnenClient,
} from "./Ausweis/types.js"; } from "./Ausweis/types.js";
import { api } from "astro-typesafe-api/client"; import { api } from "astro-typesafe-api/client";
import { addNotification } from "./Notifications/shared.js";
export let images: BildClient[] = []; export let images: BildClient[] = [];
export let ausweis: export let ausweis:
@@ -79,17 +81,27 @@
// Get the scaled-down data from the canvas in the desired output format and quality // Get the scaled-down data from the canvas in the desired output format and quality
const dataURL = canvas.toDataURL("image/jpeg", 0.8); const dataURL = canvas.toDataURL("image/jpeg", 0.8);
const { id } = await api.bild.PUT.fetch({ const [result, error] = await tryCatch(api.bild.PUT.fetch({
data: dataURL, data: dataURL,
kategorie, kategorie,
name: file.name name: file.name
}) }))
images.push({ id, kategorie }); if (error) {
images = images; addNotification({
message: "Das hat nicht geklappt.",
type: "error",
timeout: 3000,
subtext: "Bild konnte nicht hochgeladen werden, bitte versuchen sie es erneut.",
dismissable: true
})
} else {
images.push({ id: result.id, kategorie });
images = images;
if (i == Math.min(files.length, max) - 1) { if (i == Math.min(files.length, max) - 1) {
this.value = ""; this.value = "";
}
} }
}; };

View File

@@ -1,11 +1,9 @@
<script> <script>
import { PRICES } from "#lib/constants"; import { PRICES } from "#lib/constants";
import { Enums } from "#lib/client/prisma"; import { Enums } from "#lib/client/prisma";
export let bullets;
export let title;
export let ref = ""; export let ref = "";
bullets = [ const bullets = [
["Prüfung durch Dipl.&nbsp;Ing.<br>Registrierung beim DiBt<br>rechtssicher nach&nbsp;GEG",true, true, true], ["Prüfung durch Dipl.&nbsp;Ing.<br>Registrierung beim DiBt<br>rechtssicher nach&nbsp;GEG",true, true, true],
["Originalausweis als&nbsp;PDF per&nbsp;<span class='text-nowrap'>E-Mail</span><br>Originalausweis per&nbsp;Post (zubuchbar)",true, true, true], ["Originalausweis als&nbsp;PDF per&nbsp;<span class='text-nowrap'>E-Mail</span><br>Originalausweis per&nbsp;Post (zubuchbar)",true, true, true],
["Bearbeitung innerhalb 24&nbsp;Stunden<br>Selbsteingabe",true, true, false], ["Bearbeitung innerhalb 24&nbsp;Stunden<br>Selbsteingabe",true, true, false],
@@ -17,7 +15,6 @@
["telefonische&nbsp;Beratung<br>persönlicher&nbsp;Energieberater",false, true, true], ["telefonische&nbsp;Beratung<br>persönlicher&nbsp;Energieberater",false, true, true],
["Dokumentenupload (Verbrauchsabrechnungen)",false, false, true], ["Dokumentenupload (Verbrauchsabrechnungen)",false, false, true],
["Eingabe durch Dipl.&nbsp;Ing.",false, false, true], ["Eingabe durch Dipl.&nbsp;Ing.",false, false, true],
] ]

View File

@@ -1,23 +1,24 @@
<script lang="ts"> <script lang="ts">
import { VerbrauchsausweisGewerbe, VerbrauchsausweisWohnen } from "#lib/client/prisma.js";
import moment from "moment"; import moment from "moment";
export let addYear: number; export let addYear: number;
export let heizquelle: number; export let heizquelle: number;
export let aufnahme; export let aufnahme;
export let ausweis; export let ausweis: VerbrauchsausweisWohnen | VerbrauchsausweisGewerbe;
</script> </script>
{#if ausweis.startdatum} {#if ausweis.startdatum}
Bitte geben Sie Ihren Bitte geben Sie Ihren
{#if heizquelle == 1} {#if heizquelle == 1}
{#if aufnahme.brennstoff_1}<b> {#if ausweis.brennstoff_1}<b>
{aufnahme.brennstoff_1} {ausweis.brennstoff_1}
</b>{/if} </b>{/if}
Verbrauch {#if ausweis.einheit_1} Verbrauch {#if ausweis.einheit_1}
in <b>{ausweis.einheit_1} </b>{/if} in <b>{ausweis.einheit_1} </b>{/if}
{:else if heizquelle == 2} {:else if heizquelle == 2}
{#if aufnahme.brennstoff_2}<b> {#if ausweis.brennstoff_2}<b>
{aufnahme.brennstoff_2} {ausweis.brennstoff_2}
</b>{/if} </b>{/if}
Verbräuche {#if ausweis.einheit_2} Verbräuche {#if ausweis.einheit_2}
in <b>{ausweis.einheit_2} </b>{/if} in <b>{ausweis.einheit_2} </b>{/if}

View File

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

View File

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

View File

@@ -1,312 +1,296 @@
import fuelList from "#components/Ausweis/brennstoffListe.js"; import fuelList from "#components/Ausweis/brennstoffListe.js";
import { faker } from "@faker-js/faker"; import { faker } from "@faker-js/faker";
import { type Enums } from "#lib/client/prisma.js"; import { Enums } from "#lib/client/prisma.js";
import "cypress-file-upload" import "cypress-file-upload"
import moment from "moment"; import moment from "moment";
describe("Verbrauchsausweis erstellen Schritt 1", () => { describe("Verbrauchsausweis erstellen Schritt 1", () => {
const ausstellgrund = (["Modernisierung", "Neubau", "Sonstiges", "Verkauf", "Vermietung"] as Enums.Ausstellgrund[]);
const heizungsstatus = (["BEHEIZT", "NICHT_VORHANDEN", "UNBEHEIZT"] as Enums.Heizungsstatus[]);
it("erstellt einen neuen Verbrauchsausweis Wohngebäude.", () => { it("erstellt einen neuen Verbrauchsausweis Wohngebäude.", () => {
cy.visit("/energieausweis-erstellen/verbrauchsausweis-gewerbe"); cy.task("plz").then(plz => {
cy.visit("/energieausweis-erstellen/verbrauchsausweis-gewerbe");
cy.wait(1000); cy.wait(1000);
// Wir überprüfen, ob alle Ausstelgründe vorhanden sind, diese sollten genau so viele sein wie in der Datenbank vorhanden sind. // Wir überprüfen, ob alle Ausstelgründe vorhanden sind, diese sollten genau so viele sein wie in der Datenbank vorhanden sind.
cy.get("select[data-cy='ausstellgrund']") cy.get("select[data-cy='ausstellgrund']")
.select( .select(
faker.number.int({ faker.number.int({
min: 1, min: 1,
max: (["Modernisierung", "Neubau", "Sonstiges", "Verkauf", "Vermietung"] as Enums.Ausstellgrund[]).length, max: (["Modernisierung", "Neubau", "Sonstiges", "Verkauf", "Vermietung"] as Enums.Ausstellgrund[]).length,
}) })
) )
// Jetzt Füllen wir das Baujahr vom Gebäude aus. // Jetzt Füllen wir das Baujahr vom Gebäude aus.
cy.get("input[name='baujahr_gebaeude']") cy.get("input[name='baujahr_gebaeude']")
.should("have.attr", "type", "number") .should("have.attr", "type", "number")
.type( .type(
faker.number.int({ min: 1900, max: 2021 }).toString() + faker.number.int({ min: 1900, max: 2021 }).toString() +
"{enter}", "{enter}",
{ delay: 50 } { 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"
); );
// Jetzt Füllen wir das Baujahr der Heizung aus. // Adresse
cy.get("input[name='baujahr_heizung']") cy.get("input[name='adresse']").type(faker.location.streetAddress());
.should("have.attr", "type", "number")
.type( // Postleitzahl
faker.number.int({ min: 1900, max: 2021 }).toString() + cy.get("input[name='plz']").type(
"{enter}", plz as string
{ delay: 50 }
); );
// // Anzahl Einheiten // TODO: Ort - Dieser wird aus der Datenbank abgefragt, wir müssen also warten, bis der Dropdown da ist.
// cy.get("input[name='einheiten']") cy.get("[data-cy='plz-container']").find("button").first().click()
// .should("have.attr", "type", "number")
// .type(faker.number.int({ min: 1, max: 5 }).toString());
// Sanierungsstatus // // Flaeche
cy.get("select[name='saniert']").select( // cy.get("input[name='flaeche']")
Math.random() > 0.5 ? "true" : "false" // .should("have.attr", "type", "number")
); // .type(faker.number.int({ min: 50, max: 1000 }).toString());
// Adresse // Nutzlaeche
cy.get("input[name='adresse']").type(faker.location.streetAddress()); cy.get("input[name='nutzflaeche']")
.should("have.attr", "type", "number")
.type(faker.number.int({ min: 50, max: 1000 }).toString());
// Postleitzahl // Keller
cy.get("input[name='plz']").type( cy.get("select[name='keller']").find("option:not([disabled])").should("have.length", Object.keys(Enums.Heizungsstatus).length).parent().select(faker.number.int({
faker.location.zipCode({ max: Object.keys(Enums.Heizungsstatus).length,
format: "#####", min: 1
}) }));
);
// TODO: Ort - Dieser wird aus der Datenbank abgefragt, wir müssen also warten, bis der Dropdown da ist. // Dachgeschoss
cy.get("[data-cy='plz-container']").find("button").first().click() cy.get("select[name='dachgeschoss']").find("option:not([disabled])").should("have.length", Object.keys(Enums.Heizungsstatus).length).parent().select(faker.number.int({
max: Object.keys(Enums.Heizungsstatus).length,
min: 1
}));
// // Flaeche // Brennstoff und Einheit 1
// cy.get("input[name='flaeche']") const brennstoffKombo = fuelList[faker.number.int({ min: 0, max: fuelList.length - 1 })];
// .should("have.attr", "type", "number")
// .type(faker.number.int({ min: 50, max: 1000 }).toString());
// Nutzlaeche cy.get("select[name='brennstoff_1']").select(brennstoffKombo[0]);
cy.get("input[name='nutzflaeche']") cy.get("select[name='einheit_1']").select(brennstoffKombo[1]);
.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", heizungsstatus.length).parent().select(faker.number.int({
max: heizungsstatus.length,
min: 1
}));
// Dachgeschoss
cy.get("select[name='dachgeschoss']").find("option:not([disabled])").should("have.length", heizungsstatus.length).parent().select(faker.number.int({
max: 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]);
let availableDates = [];
const startDate = moment()
.subtract(4, "years")
.subtract(6, "months");
const endDate = moment().subtract(3, "years");
for (let m = moment(startDate); m.isBefore(endDate); m.add(1, "month")) {
availableDates.push({
year: m.year(),
month: m.month(),
});
}
// Verbrauchszeitraum
cy.get("select[name='energieverbrauch_zeitraum_jahr']").select(availableDates[0].year.toString());
cy.get("select[name='energieverbrauch_zeitraum_monat']").select(availableDates[0].month.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());
let availableDates = [];
const startDate = moment()
.subtract(4, "years")
.subtract(6, "months");
const endDate = moment().subtract(3, "years");
const zusaetzlicheHeizquelle = Math.random() > 0.5; for (let m = moment(startDate); m.isBefore(endDate); m.add(1, "month")) {
availableDates.push({
year: m.year(),
month: m.month(),
});
}
if (zusaetzlicheHeizquelle) { // Verbrauchszeitraum
cy.get("[data-cy='zusaetzliche_heizquelle']").check(); cy.get("select[name='energieverbrauch_zeitraum_jahr']").select(availableDates[0].year.toString());
cy.get("select[name='energieverbrauch_zeitraum_monat']").select(availableDates[0].month.toString());
// Brennstoff und Einheit 2
const brennstoffKombo2 = fuelList[faker.number.int({ min: 0, max: fuelList.length - 1 })];
cy.get("[data-cy='brennstoff_2']").select(brennstoffKombo2[0], { force: true });
cy.get("[data-cy='einheit_2']").select(brennstoffKombo2[1], { force: true });
// Verbrauch // Verbrauch
cy.get("input[name='verbrauch_4']").type(faker.number.int({ min: 4000, max: 15000 }).toString(), { force: true }); cy.get("input[name='verbrauch_1']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
cy.get("input[name='verbrauch_5']").type(faker.number.int({ min: 4000, max: 15000 }).toString(), { force: true }); cy.get("input[name='verbrauch_2']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
cy.get("input[name='verbrauch_6']").type(faker.number.int({ min: 4000, max: 15000 }).toString(), { force: true }); cy.get("input[name='verbrauch_3']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
}
// Gebäudestrom
cy.get("input[name='strom_1']").type(faker.number.int({ min: 4000, max: 15000 }).toString()); const zusaetzlicheHeizquelle = Math.random() > 0.5;
cy.get("input[name='strom_2']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
cy.get("input[name='strom_3']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
// Stromverbrauch Enthält if (zusaetzlicheHeizquelle) {
if (Math.random() > 0.5) cy.get("input[name='stromverbrauch_enthaelt_heizung']").check(); cy.get("[data-cy='zusaetzliche_heizquelle']").check();
if (Math.random() > 0.5) cy.get("input[name='stromverbrauch_enthaelt_warmwasser']").check();
if (Math.random() > 0.5) cy.get("input[name='stromverbrauch_enthaelt_lueftung']").check();
if (Math.random() > 0.5) cy.get("input[name='stromverbrauch_enthaelt_beleuchtung']").check();
if (Math.random() > 0.5) cy.get("input[name='stromverbrauch_enthaelt_kuehlung']").check();
// Warmwasser enthalten und bekannt // Brennstoff und Einheit 2
const warmwasserEnthalten = Math.random() > 0.5; const brennstoffKombo2 = fuelList[faker.number.int({ min: 0, max: fuelList.length - 1 })];
const anteilBekannt = Math.random() > 0.5;
if (warmwasserEnthalten) { cy.get("[data-cy='brennstoff_2']").select(brennstoffKombo2[0], { force: true });
cy.get("input[name='warmwasser_enthalten']").check(); cy.get("[data-cy='einheit_2']").select(brennstoffKombo2[1], { force: true });
if (anteilBekannt) { // Verbrauch
// Der Anteil ist bekannt, wir müssen ihn also angeben. cy.get("input[name='verbrauch_4']").type(faker.number.int({ min: 4000, max: 15000 }).toString(), { force: true });
cy.get("input[name='warmwasser_anteil_bekannt']").check(); cy.get("input[name='verbrauch_5']").type(faker.number.int({ min: 4000, max: 15000 }).toString(), { force: true });
cy.get("input[name='verbrauch_6']").type(faker.number.int({ min: 4000, max: 15000 }).toString(), { force: true });
}
cy.get("input[name='anteil_warmwasser_1']").type(faker.number.int({ min: 0, max: 50 }).toString()); // Gebäudestrom
cy.get("input[name='strom_1']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
cy.get("input[name='strom_2']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
cy.get("input[name='strom_3']").type(faker.number.int({ min: 4000, max: 15000 }).toString());
// Stromverbrauch Enthält
if (Math.random() > 0.5) cy.get("input[name='stromverbrauch_enthaelt_heizung']").check();
if (Math.random() > 0.5) cy.get("input[name='stromverbrauch_enthaelt_warmwasser']").check();
if (Math.random() > 0.5) cy.get("input[name='stromverbrauch_enthaelt_lueftung']").check();
if (Math.random() > 0.5) cy.get("input[name='stromverbrauch_enthaelt_beleuchtung']").check();
if (Math.random() > 0.5) cy.get("input[name='stromverbrauch_enthaelt_kuehlung']").check();
// 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_1']").type(faker.number.int({ min: 0, max: 50 }).toString());
}
}
}
// Thermische Kühlung enthalten
const kuehlungEnthalten = Math.random() > 0.5;
if (kuehlungEnthalten) {
cy.get("input[name='kuehlung_enthalten']").check();
cy.get("input[name='anteil_kuehlung_1']").type(faker.number.int({ min: 0, max: 50 }).toString());
if (zusaetzlicheHeizquelle) { if (zusaetzlicheHeizquelle) {
// Zusätzliche Heizquelle existiert, also müssen wir auch hier den Anteil angeben. // Zusätzliche Heizquelle existiert, also müssen wir auch hier den Anteil angeben.
cy.get("input[name='anteil_warmwasser_1']").type(faker.number.int({ min: 0, max: 50 }).toString()); cy.get("input[name='anteil_kuehlung_2']").type(faker.number.int({ min: 0, max: 50 }).toString());
} }
} }
}
// Thermische Kühlung enthalten // Alternative Energieversorgungssysteme
const kuehlungEnthalten = Math.random() > 0.5; 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();
if (kuehlungEnthalten) { // Gebäudetyp
cy.get("input[name='kuehlung_enthalten']").check(); cy.get("select[name='gebaeudetyp']").then(($dropdown) => {
const options = $dropdown.find('option:not([disabled])');
// 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);
});
cy.get("input[name='anteil_kuehlung_1']").type(faker.number.int({ min: 0, max: 50 }).toString()); // 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);
});
if (zusaetzlicheHeizquelle) { // Lüftung
// Zusätzliche Heizquelle existiert, also müssen wir auch hier den Anteil angeben. cy.get("select[name='lueftung']").then(($dropdown) => {
cy.get("input[name='anteil_kuehlung_2']").type(faker.number.int({ min: 0, max: 50 }).toString()); 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);
});
// Alternative Energieversorgungssysteme // Kühlung
if (Math.random() > 0.5) cy.get("input[name='alternative_heizung']").check(); cy.get("select[name='kuehlung']").then(($dropdown) => {
if (Math.random() > 0.5) cy.get("input[name='alternative_warmwasser']").check(); const options = $dropdown.find('option');
if (Math.random() > 0.5) cy.get("input[name='alternative_lueftung']").check(); // Select the option at the random index
if (Math.random() > 0.5) cy.get("input[name='alternative_kuehlung']").check(); cy.get("select[name='kuehlung']").select(options.eq(faker.number.int({ min: 1, max: options.length - 1 })).val() as string);
});
// Gebäudetyp // Leerstand
cy.get("select[name='gebaeudetyp']").then(($dropdown) => { cy.get("input[name='leerstand']").should("have.attr", "type", "number").type(faker.number.int({ min: 0, max: 30 }).toString());
const options = $dropdown.find('option:not([disabled])');
// 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 // Heizungsanlage Daten
cy.get("select[name='gebaeudeteil']").then(($dropdown) => { if (Math.random() > 0.5) cy.get("input[name='zentralheizung']").check();
const options = $dropdown.find('option'); if (Math.random() > 0.5) cy.get("input[name='einzelofen']").check();
// Select the option at the random index if (Math.random() > 0.5) cy.get("input[name='durchlauf_erhitzer']").check();
cy.get("select[name='gebaeudeteil']").select(options.eq(faker.number.int({ min: 1, max: options.length - 1 })).val() as string); 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();
// Lüftung // Heizungsanlage Bilder
cy.get("select[name='lueftung']").then(($dropdown) => { cy.get("input[name='heizung_image']").should("have.attr", "type", "file").attachFile("images/heizungsanlage/1.jpeg", { subjectType: "input" });
const options = $dropdown.find('option'); cy.get("input[name='heizung_image']").should("have.attr", "type", "file").attachFile("images/heizungsanlage/2.jpeg", { subjectType: "input" });
// 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 // Fenster Daten
cy.get("select[name='kuehlung']").then(($dropdown) => { if (Math.random() > 0.5) cy.get("input[name='einfach_verglasung']").check();
const options = $dropdown.find('option'); if (Math.random() > 0.5) cy.get("input[name='doppel_verglasung']").check();
// Select the option at the random index if (Math.random() > 0.5) cy.get("input[name='isolier_verglasung']").check();
cy.get("select[name='kuehlung']").select(options.eq(faker.number.int({ min: 1, max: options.length - 1 })).val() as string); 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();
// Leerstand // Fenster Bilder
cy.get("input[name='leerstand']").should("have.attr", "type", "number").type(faker.number.int({ min: 0, max: 30 }).toString()); 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" });
// Heizungsanlage Daten // Wärmedämmung Daten
if (Math.random() > 0.5) cy.get("input[name='zentralheizung']").check(); if (Math.random() > 0.5) cy.get("input[name='aussenwand_gedaemmt']").check();
if (Math.random() > 0.5) cy.get("input[name='einzelofen']").check(); if (Math.random() > 0.5) cy.get("input[name='keller_wand_gedaemmt']").check();
if (Math.random() > 0.5) cy.get("input[name='durchlauf_erhitzer']").check(); if (Math.random() > 0.5) cy.get("input[name='keller_decke_gedaemmt']").check();
if (Math.random() > 0.5) cy.get("input[name='standard_kessel']").check(); if (Math.random() > 0.5) cy.get("input[name='dachgeschoss_gedaemmt']").check();
if (Math.random() > 0.5) cy.get("input[name='solarsystem_warmwasser']").check(); if (Math.random() > 0.5) cy.get("input[name='oberste_geschossdecke_gedaemmt']").check();
if (Math.random() > 0.5) cy.get("input[name='waermepumpe']").check(); if (Math.random() > 0.5) cy.get("input[name='oberste_geschossdecke_min_12cm_gedaemmt']").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 // Wärmedämmung Bilder
cy.get("input[name='heizung_image']").should("have.attr", "type", "file").attachFile("images/heizungsanlage/1.jpeg", { subjectType: "input" }); cy.get("input[name='daemmung_image']").should("have.attr", "type", "file").attachFile("images/daemmung/1.jpeg", { subjectType: "input" });
cy.get("input[name='heizung_image']").should("have.attr", "type", "file").attachFile("images/heizungsanlage/2.jpeg", { subjectType: "input" }); cy.get("input[name='daemmung_image']").should("have.attr", "type", "file").attachFile("images/daemmung/2.jpeg", { subjectType: "input" });
// Fenster Daten // Gebäude Bild
if (Math.random() > 0.5) cy.get("input[name='einfach_verglasung']").check(); cy.get("input[name='gebaeude_image']").should("have.attr", "type", "file").attachFile("images/gebaeude/1.jpeg", { subjectType: "input" });
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("form[data-cy='ausweis'] button[data-cy='weiter']").click({ force: true });
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 cy.url().should("contain", "/kundendaten");
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 const email = faker.internet.email();
cy.get("input[name='daemmung_image']").should("have.attr", "type", "file").attachFile("images/daemmung/1.jpeg", { subjectType: "input" }); const passwort = "test1234";
cy.get("input[name='daemmung_image']").should("have.attr", "type", "file").attachFile("images/daemmung/2.jpeg", { subjectType: "input" }); const vorname = faker.person.firstName();
const nachname = faker.person.lastName();
const telefon = faker.phone.number()
// Gebäude Bild const strasse = faker.location.streetAddress({ useFullAddress: true })
cy.get("input[name='gebaeude_image']").should("have.attr", "type", "file").attachFile("images/gebaeude/1.jpeg", { subjectType: "input" });
cy.get("form[data-cy='ausweis'] button[data-cy='weiter']").click({ force: true }); cy.get("input[name='vorname']").should("have.attr", "type", "text").type(vorname);
cy.get("input[name='name']").should("have.attr", "type", "text").type(nachname);
cy.get("input[name='telefon']").should("have.attr", "type", "text").type(telefon);
// Rechnung
cy.get("input[name='rechnung_empfaenger']").should("have.attr", "type", "text").type(`${vorname} ${nachname}`);
cy.get("input[name='rechnung_strasse']").should("have.attr", "type", "text").type(strasse);
cy.get("input[name='rechnung_plz']").should("have.attr", "type", "text").type(plz as string);
cy.get("[data-cy='plz-container']").children().first().click()
cy.get("input[name='rechnung_email']").should("have.attr", "type", "email").type(email);
cy.url().should("contain", "/kundendaten"); cy.get("[data-cy='paypal']").click()
const email = faker.internet.email(); cy.get("button[data-cy='bestellen']").click();
const passwort = "test1234";
const vorname = faker.person.firstName();
const nachname = faker.person.lastName();
const telefon = faker.phone.number()
const strasse = faker.location.streetAddress({ useFullAddress: true }) cy["form:signup"](email, passwort, vorname, nachname)
const plz = faker.location.zipCode("#####")
cy.get("input[name='vorname']").should("have.attr", "type", "text").type(vorname); cy.origin('https://www.mollie.com', () => {
cy.get("input[name='name']").should("have.attr", "type", "text").type(nachname); // Jetzt sind wir auf der Mollie Seite, dort wählen wir den "paid" status aus
cy.get("input[name='telefon']").should("have.attr", "type", "text").type(telefon); cy.get("input[type='radio'][name='final_state'][value='paid']").check();
// Rechnung // Da wird unser Test fehlschlagen, da die localhost domain von Mollie aus nicht erreichbar ist.
cy.get("input[name='rechnung_empfaenger']").should("have.attr", "type", "text").type(`${vorname} ${nachname}`); })
cy.get("input[name='rechnung_strasse']").should("have.attr", "type", "text").type(strasse);
cy.get("input[name='rechnung_plz']").should("have.attr", "type", "text").type(plz);
cy.get("[data-cy='plz-container']").children().first().click()
cy.get("input[name='rechnung_email']").should("have.attr", "type", "email").type(email);
cy.get("[data-cy='paypal']").click()
cy.get("button[data-cy='bestellen']").click();
cy.get("a[data-cy='registrieren']").should("be.visible").click();
// Wir sind jetzt registriert und können uns nun einloggen.
// Die Email sollte automatisch eingetragen sein, da wir uns gerade registriert haben.
cy.get("form[name='signup'] input[name='vorname']").should("be.visible").should("have.attr", "type", "text").type(vorname);
cy.get("form[name='signup'] input[name='nachname']").should("be.visible").should("have.attr", "type", "text").type(nachname);
cy.get("form[name='signup'] input[name='email']").should("be.visible").should("have.attr", "type", "email").should("contain.value", email);
cy.get("form[name='signup'] input[name='passwort']").should("be.visible").should("have.attr", "type", "password").type(passwort);
cy.intercept({ method: "PUT", url: "**/api/user" }).as("signup")
cy.get("form[name='signup'] button[type='submit']").click();
cy.wait("@signup")
cy.get("form[name='login'] button[type='submit']").click();
cy.origin('https://www.mollie.com', () => {
// Jetzt sind wir auf der Mollie Seite, dort wählen wir den "paid" status aus
cy.get("input[type='radio'][name='final_state'][value='paid']").check();
// Da wird unser Test fehlschlagen, da die localhost domain von Mollie aus nicht erreichbar ist.
}) })
}); });
}); });

View File

@@ -2,14 +2,17 @@ import fuelList from "#components/Ausweis/brennstoffListe.js";
import { faker } from "@faker-js/faker"; import { faker } from "@faker-js/faker";
import "cypress-file-upload" import "cypress-file-upload"
import moment from "moment"; import moment from "moment";
import { Aufnahme, Enums, Objekt, VerbrauchsausweisWohnen } from "#lib/client/prisma.js"; import { Aufnahme, Benutzer, Enums, Objekt, Rechnung, VerbrauchsausweisWohnen } from "#lib/client/prisma.js";
describe("Verbrauchsausweis für Wohngebäude bearbeiten", async () => { describe("Verbrauchsausweis für Wohngebäude bearbeiten", async () => {
it("bearbeitet einen bereits existierenden Verbrauchsausweis für Wohngebäude", () => { it("bearbeitet einen bereits existierenden Verbrauchsausweis für Wohngebäude", () => {
cy.task("verbrauchsausweisWohnen", { cy.task("verbrauchsausweisWohnen", {
where: { where: {
ausgestellt: false, ausgestellt: false,
bestellt: false bestellt: false,
benutzer: {
email: "user@ib-cornelsen.de"
}
}, },
include: { include: {
aufnahme: { aufnahme: {
@@ -17,261 +20,171 @@ describe("Verbrauchsausweis für Wohngebäude bearbeiten", async () => {
objekt: true objekt: true
} }
}, },
benutzer: true benutzer: true,
rechnung: true
} }
}).then((ausweis: VerbrauchsausweisWohnen & { aufnahme: Aufnahme & { objekt: Objekt } }) => { }).then((ausweis: VerbrauchsausweisWohnen & { benutzer: Benutzer, aufnahme: Aufnahme & { objekt: Objekt }, rechnung: Rechnung | null }) => {
cy.login("user@ib-cornelsen.de", "passwort");
cy.visit(`/energieausweis-erstellen/verbrauchsausweis-wohngebaeude?id=${ausweis.id}`); cy.visit(`/energieausweis-erstellen/verbrauchsausweis-wohngebaeude?id=${ausweis.id}`);
cy.wait(2000); cy.wait(2000);
// Wir überprüfen, ob alle Ausstelgründe vorhanden sind, diese sollten genau so viele sein wie in der Datenbank vorhanden sind. // Wir überprüfen, ob alle Ausstelgründe vorhanden sind, diese sollten genau so viele sein wie in der Datenbank vorhanden sind.
cy.get("select[data-cy='ausstellgrund']") cy.get("select[data-cy='ausstellgrund']")
.find("option:selected").should("have.value", ausweis.ausstellgrund) .find("option:selected").should("have.value", ausweis.ausstellgrund)
// Jetzt Füllen wir das Baujahr vom Gebäude aus. // // Jetzt Füllen wir das Baujahr vom Gebäude aus.
cy.get("input[name='baujahr_gebaeude']") // cy.get("input[name='baujahr_gebaeude']")
.should("have.value", ausweis.aufnahme.baujahr_gebaeude[0]) // .should("have.value", ausweis.aufnahme.baujahr_gebaeude[0])
// Jetzt Füllen wir das Baujahr der Heizung aus. // // Jetzt Füllen wir das Baujahr der Heizung aus.
cy.get("input[name='baujahr_heizung']") // cy.get("input[name='baujahr_heizung']")
.should("have.value", ausweis.aufnahme.baujahr_heizung[0]) // .should("have.value", ausweis.aufnahme.baujahr_heizung[0])
// Anzahl Einheiten // Anzahl Einheiten
cy.get("input[name='einheiten']") cy.get("input[name='einheiten']")
.should("have.value", ausweis.aufnahme.einheiten) .should("have.value", ausweis.aufnahme.einheiten)
// Sanierungsstatus // Sanierungsstatus
cy.get("select[name='saniert']").find("option:selected").should("have.value", ausweis.aufnahme.saniert) cy.get("select[name='saniert']").find("option:selected").should("have.value", (ausweis.aufnahme.saniert || false).toString())
// Adresse // Adresse
cy.get("input[name='adresse']").should("have.value", ausweis.aufnahme.objekt.adresse); cy.get("input[name='adresse']").should("have.value", ausweis.aufnahme.objekt.adresse);
// Postleitzahl // Postleitzahl
cy.get("input[name='plz']").type( cy.get("input[name='plz']").should("have.value", ausweis.aufnahme.objekt.plz);
faker.location.zipCode({ cy.get("input[name='ort']").should("have.value", ausweis.aufnahme.objekt.ort);
format: "#####",
})
);
// TODO: Ort - Dieser wird aus der Datenbank abgefragt, wir müssen also warten, bis der Dropdown da ist.
cy.get("[data-cy='plz-container']").find("button").first().click()
// Flaeche // Flaeche
cy.get("input[name='flaeche']") cy.get("input[name='flaeche']")
.should("have.attr", "type", "number") .should("have.value", ausweis.aufnahme.flaeche)
.type(faker.number.int({ min: 50, max: 1000 }).toString());
// Nutzflaeche // Nutzflaeche
cy.get("input[name='nutzflaeche']") cy.get("input[name='nutzflaeche']")
.should("have.attr", "type", "number") .should("have.value", ausweis.aufnahme.nutzflaeche)
.type(faker.number.int({ min: 50, max: 1000 }).toString());
// Keller // Keller
cy.get("select[name='keller']").find("option:not([disabled])").should("have.length", (["BEHEIZT", "NICHT_VORHANDEN", "UNBEHEIZT"] as Enums.Heizungsstatus[]).length).parent().select(faker.number.int({ cy.get("select[name='keller']").find("option:selected").should("have.value", ausweis.aufnahme.keller)
max: (["BEHEIZT", "NICHT_VORHANDEN", "UNBEHEIZT"] as Enums.Heizungsstatus[]).length,
min: 1
}));
// Dachgeschoss // Dachgeschoss
cy.get("select[name='dachgeschoss']").find("option:not([disabled])").should("have.length", (["BEHEIZT", "NICHT_VORHANDEN", "UNBEHEIZT"] as Enums.Heizungsstatus[]).length).parent().select(faker.number.int({ cy.get("select[name='dachgeschoss']").find("option:selected").should("have.value", ausweis.aufnahme.dachgeschoss)
max: (["BEHEIZT", "NICHT_VORHANDEN", "UNBEHEIZT"] as Enums.Heizungsstatus[]).length,
min: 1
}));
// Brennstoff und Einheit 1 cy.get("select[name='brennstoff_1']").should("have.value", ausweis.brennstoff_1)
const brennstoffKombo = fuelList[faker.number.int({ min: 0, max: fuelList.length - 1 })]; cy.get("select[name='einheit_1']").should("have.value", ausweis.einheit_1)
cy.get("select[name='brennstoff_1']").select(brennstoffKombo[0]);
cy.get("select[name='einheit_1']").select(brennstoffKombo[1]);
let availableDates = [];
const startDate = moment()
.subtract(4, "years")
.subtract(6, "months");
const endDate = moment().subtract(3, "years");
for (let m = moment(startDate); m.isBefore(endDate); m.add(1, "month")) {
availableDates.push({
year: m.year(),
month: m.month(),
});
}
// Verbrauchszeitraum // Verbrauchszeitraum
cy.get("select[name='energieverbrauch_zeitraum_jahr']").select(availableDates[0].year.toString()); cy.get("select[name='energieverbrauch_zeitraum_jahr']").find("option:selected").should("have.value", moment(ausweis.startdatum).get("year"))
cy.get("select[name='energieverbrauch_zeitraum_monat']").select(availableDates[0].month.toString()); cy.get("select[name='energieverbrauch_zeitraum_monat']").find("option:selected").should("have.value", moment(ausweis.startdatum).get("m") + 1)
// Verbrauch // Verbrauch
cy.get("input[name='verbrauch_1']").type(faker.number.int({ min: 4000, max: 15000 }).toString(), { force: true }); cy.get("input[name='verbrauch_1']").should("have.value", ausweis.verbrauch_1);
cy.get("input[name='verbrauch_2']").type(faker.number.int({ min: 4000, max: 15000 }).toString(), { force: true }); cy.get("input[name='verbrauch_2']").should("have.value", ausweis.verbrauch_2);
cy.get("input[name='verbrauch_3']").type(faker.number.int({ min: 4000, max: 15000 }).toString(), { force: true }); cy.get("input[name='verbrauch_3']").should("have.value", ausweis.verbrauch_3);
const zusaetzlicheHeizquelle = Math.random() > 0.5;
if (zusaetzlicheHeizquelle) { if (ausweis.zusaetzliche_heizquelle) {
cy.get("[data-cy='zusaetzliche_heizquelle']").check(); cy.get("[data-cy='zusaetzliche_heizquelle']").should("be.checked");
// Brennstoff und Einheit 2 cy.get("[data-cy='brennstoff_2']").find("option:selected").should("have.value", ausweis.brennstoff_2);
const brennstoffKombo2 = fuelList[faker.number.int({ min: 0, max: fuelList.length - 1 })]; cy.get("[data-cy='einheit_2']").find("option:selected").should("have.value", ausweis.einheit_2);
cy.get("[data-cy='brennstoff_2']").select(brennstoffKombo2[0], { force: true });
cy.get("[data-cy='einheit_2']").select(brennstoffKombo2[1], { force: true });
// Verbrauch // Verbrauch
cy.get("input[name='verbrauch_4']").type(faker.number.int({ min: 4000, max: 15000 }).toString(), { force: true }); cy.get("input[name='verbrauch_4']").should("have.value", ausweis.verbrauch_4);
cy.get("input[name='verbrauch_5']").type(faker.number.int({ min: 4000, max: 15000 }).toString(), { force: true }); cy.get("input[name='verbrauch_5']").should("have.value", ausweis.verbrauch_5);
cy.get("input[name='verbrauch_6']").type(faker.number.int({ min: 4000, max: 15000 }).toString(), { force: true }); cy.get("input[name='verbrauch_6']").should("have.value", ausweis.verbrauch_6);
} }
// Warmwasser enthalten und bekannt if (ausweis.warmwasser_enthalten) {
const warmwasserEnthalten = Math.random() > 0.5; cy.get("input[name='warmwasser_enthalten']").should("be.checked");
const anteilBekannt = Math.random() > 0.5;
if (warmwasserEnthalten) { if (ausweis.warmwasser_anteil_bekannt) {
cy.get("input[name='warmwasser_enthalten']").check();
if (anteilBekannt) {
// Der Anteil ist bekannt, wir müssen ihn also angeben. // Der Anteil ist bekannt, wir müssen ihn also angeben.
cy.get("input[name='warmwasser_anteil_bekannt']").check(); cy.get("input[name='warmwasser_anteil_bekannt']").should("be.checked");
cy.get("input[name='anteil_warmwasser_1']").type(faker.number.int({ min: 0, max: 50 }).toString()); cy.get("input[name='anteil_warmwasser_1']").should("have.value", ausweis.anteil_warmwasser_1);
if (zusaetzlicheHeizquelle) { if (ausweis.zusaetzliche_heizquelle) {
// Zusätzliche Heizquelle existiert, also müssen wir auch hier den Anteil angeben. // 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(), {force: true}); cy.get("input[name='anteil_warmwasser_2']").should('have.value', ausweis.anteil_warmwasser_2);
} }
} }
} }
// Alternative Energieversorgungssysteme // Alternative Energieversorgungssysteme
if (Math.random() > 0.5) cy.get("input[name='alternative_heizung']").check(); if (ausweis.alternative_heizung) cy.get("input[name='alternative_heizung']").should("be.checked");
if (Math.random() > 0.5) cy.get("input[name='alternative_warmwasser']").check(); if (ausweis.alternative_warmwasser) cy.get("input[name='alternative_warmwasser']").should("be.checked");
if (Math.random() > 0.5) cy.get("input[name='alternative_lueftung']").check(); if (ausweis.alternative_lueftung) cy.get("input[name='alternative_lueftung']").should("be.checked");
if (Math.random() > 0.5) cy.get("input[name='alternative_kuehlung']").check(); if (ausweis.alternative_kuehlung) cy.get("input[name='alternative_kuehlung']").should("be.checked");
// Gebäudetyp // Gebäudetyp
cy.get("select[name='gebaeudetyp']").then(($dropdown) => { cy.get("select[name='gebaeudetyp']").find("option:selected").should("have.value", ausweis.aufnahme.gebaeudetyp)
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 // Gebäudeteil
cy.get("select[name='gebaeudeteil']").then(($dropdown) => { cy.get("select[name='gebaeudeteil']").find("option:selected").should("have.value", ausweis.aufnahme.gebaeudeteil)
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 // Lüftung
cy.get("select[name='lueftung']").then(($dropdown) => { cy.get("select[name='lueftung']").find("option:selected").should("have.value", ausweis.aufnahme.lueftung)
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 // Kühlung
cy.get("select[name='kuehlung']").then(($dropdown) => { cy.get("select[name='kuehlung']").find("option:selected").should("have.value", ausweis.aufnahme.kuehlung)
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, { force: true });
});
// Leerstand // Leerstand
cy.get("input[name='leerstand']").should("have.attr", "type", "number").type(faker.number.int({ min: 0, max: 30 }).toString()); cy.get("input[name='leerstand']").should("have.value", ausweis.aufnahme.leerstand || "");
// Heizungsanlage Daten // Heizungsanlage Daten
if (Math.random() > 0.5) cy.get("[data-cy='zentralheizung']").check(); if (ausweis.aufnahme.zentralheizung) cy.get("[data-cy='zentralheizung']").should("be.checked");
if (Math.random() > 0.5) cy.get("[data-cy='einzelofen']").check(); if (ausweis.aufnahme.einzelofen) cy.get("[data-cy='einzelofen']").should("be.checked");
if (Math.random() > 0.5) cy.get("[data-cy='durchlauf_erhitzer']").check(); if (ausweis.aufnahme.durchlauf_erhitzer) cy.get("[data-cy='durchlauf_erhitzer']").should("be.checked");
if (Math.random() > 0.5) cy.get("[data-cy='standard_kessel']").check(); if (ausweis.aufnahme.standard_kessel) cy.get("[data-cy='standard_kessel']").should("be.checked");
if (Math.random() > 0.5) cy.get("[data-cy='solarsystem_warmwasser']").check(); if (ausweis.aufnahme.solarsystem_warmwasser) cy.get("[data-cy='solarsystem_warmwasser']").should("be.checked");
if (Math.random() > 0.5) cy.get("[data-cy='waermepumpe']").check(); if (ausweis.aufnahme.waermepumpe) cy.get("[data-cy='waermepumpe']").should("be.checked");
if (Math.random() > 0.5) cy.get("[data-cy='niedertemperatur_kessel']").check(); if (ausweis.aufnahme.niedertemperatur_kessel) cy.get("[data-cy='niedertemperatur_kessel']").should("be.checked");
if (Math.random() > 0.5) cy.get("[data-cy='brennwert_kessel']").check(); if (ausweis.aufnahme.brennwert_kessel) cy.get("[data-cy='brennwert_kessel']").should("be.checked");
if (Math.random() > 0.5) cy.get("[data-cy='warmwasser_rohre_gedaemmt']").check(); if (ausweis.aufnahme.warmwasser_rohre_gedaemmt) cy.get("[data-cy='warmwasser_rohre_gedaemmt']").should("be.checked");
if (Math.random() > 0.5) cy.get("[data-cy='heizungsrohre_gedaemmt']").check(); if (ausweis.aufnahme.heizungsrohre_gedaemmt) cy.get("[data-cy='heizungsrohre_gedaemmt']").should("be.checked");
if (Math.random() > 0.5) cy.get("[data-cy='zirkulation']").check(); if (ausweis.aufnahme.zirkulation) cy.get("[data-cy='zirkulation']").should("be.checked");
// if (Math.random() > 0.5) cy.get("[data-cy='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 // Fenster Daten
if (Math.random() > 0.5) cy.get("input[name='einfach_verglasung']").check(); if (ausweis.aufnahme.einfach_verglasung) cy.get("input[name='einfach_verglasung']").check();
if (Math.random() > 0.5) cy.get("input[name='doppel_verglasung']").check(); if (ausweis.aufnahme.doppel_verglasung) cy.get("input[name='doppel_verglasung']").check();
if (Math.random() > 0.5) cy.get("input[name='isolier_verglasung']").check(); if (ausweis.aufnahme.isolier_verglasung) cy.get("input[name='isolier_verglasung']").check();
if (Math.random() > 0.5) cy.get("input[name='dreifach_verglasung']").check(); if (ausweis.aufnahme.dreifach_verglasung) cy.get("input[name='dreifach_verglasung']").check();
if (Math.random() > 0.5) cy.get("input[name='fenster_dicht']").check(); if (ausweis.aufnahme.fenster_dicht) cy.get("input[name='fenster_dicht']").check();
if (Math.random() > 0.5) cy.get("input[name='fenster_teilweise_undicht']").check(); if (ausweis.aufnahme.fenster_teilweise_undicht) cy.get("input[name='fenster_teilweise_undicht']").check();
if (Math.random() > 0.5) cy.get("input[name='tueren_dicht']").check(); if (ausweis.aufnahme.tueren_dicht) cy.get("input[name='tueren_dicht']").check();
if (Math.random() > 0.5) cy.get("input[name='tueren_undicht']").check(); if (ausweis.aufnahme.tueren_undicht) cy.get("input[name='tueren_undicht']").check();
if (Math.random() > 0.5) cy.get("input[name='rolllaeden_kaesten_gedaemmt']").check(); if (ausweis.aufnahme.rolllaeden_kaesten_gedaemmt) 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 // Wärmedämmung Daten
if (Math.random() > 0.5) cy.get("input[name='aussenwand_gedaemmt']").check(); if (ausweis.aufnahme.aussenwand_gedaemmt) cy.get("input[name='aussenwand_gedaemmt']").check();
if (Math.random() > 0.5) cy.get("input[name='keller_wand_gedaemmt']").check(); if (ausweis.aufnahme.keller_wand_gedaemmt) cy.get("input[name='keller_wand_gedaemmt']").check();
if (Math.random() > 0.5) cy.get("input[name='keller_decke_gedaemmt']").check(); if (ausweis.aufnahme.keller_decke_gedaemmt) cy.get("input[name='keller_decke_gedaemmt']").check();
if (Math.random() > 0.5) cy.get("input[name='dachgeschoss_gedaemmt']").check(); if (ausweis.aufnahme.dachgeschoss_gedaemmt) cy.get("input[name='dachgeschoss_gedaemmt']").check();
if (Math.random() > 0.5) cy.get("input[name='oberste_geschossdecke_gedaemmt']").check(); if (ausweis.aufnahme.oberste_geschossdecke_gedaemmt) cy.get("input[name='oberste_geschossdecke_gedaemmt']").check();
if (Math.random() > 0.5) cy.get("input[name='oberste_geschossdecke_min_12cm_gedaemmt']").check(); if (ausweis.aufnahme.oberste_geschossdecke_min_12cm_gedaemmt) 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. // Jetzt können wir den Verbrauchsausweis erstellen.
cy.get("form[data-cy='ausweis'] button[data-cy='weiter']").click({ force: true }); cy.get("form[data-cy='ausweis'] button[data-cy='weiter']").click({ force: true });
cy.url().should("contain", "/kundendaten"); cy.url().should("contain", "/kundendaten");
const email = faker.internet.email(); cy.get("input[name='vorname']").should("have.value", ausweis.benutzer.vorname);
const passwort = "test1234"; cy.get("input[name='name']").should("have.value", ausweis.benutzer.name);
const vorname = faker.person.firstName(); cy.get("input[name='telefon']").should("have.value", ausweis.rechnung?.telefon || ausweis.benutzer.telefon || "");
const nachname = faker.person.lastName();
const telefon = faker.phone.number()
const strasse = faker.location.streetAddress({ useFullAddress: true })
const plz = faker.location.zipCode("#####")
cy.get("input[name='vorname']").should("have.attr", "type", "text").type(vorname);
cy.get("input[name='name']").should("have.attr", "type", "text").type(nachname);
cy.get("input[name='telefon']").should("have.attr", "type", "text").type(telefon);
// Rechnung // Rechnung
cy.get("input[name='rechnung_empfaenger']").should("have.attr", "type", "text").type(`${vorname} ${nachname}`); cy.get("input[name='rechnung_empfaenger']").should("have.value", ausweis.rechnung?.empfaenger || `${ausweis.benutzer.vorname} ${ausweis.benutzer.name}`);
cy.get("input[name='rechnung_strasse']").should("have.attr", "type", "text").type(strasse); cy.get("input[name='rechnung_strasse']").should("have.value", ausweis.rechnung?.strasse || ausweis.benutzer.adresse);
cy.get("input[name='rechnung_plz']").should("have.attr", "type", "text").type(plz); cy.get("input[name='rechnung_plz']").should("have.value", ausweis.rechnung?.plz || ausweis.benutzer.plz);
cy.get("[data-cy='plz-container']").children().first().click() cy.get("input[name='rechnung_email']").should("have.value", ausweis.rechnung?.email || ausweis.benutzer.email);
cy.get("input[name='rechnung_email']").should("have.attr", "type", "email").type(email);
cy.get("[data-cy='paypal']").click() cy.get("[data-cy='paypal']").click()
cy.get("button[data-cy='bestellen']").click(); cy.get("button[data-cy='bestellen']").click();
cy.get("a[data-cy='registrieren']").should("be.visible").click();
// Wir sind jetzt registriert und können uns nun einloggen.
// Die Email sollte automatisch eingetragen sein, da wir uns gerade registriert haben.
cy.get("form[name='signup'] input[name='vorname']").should("be.visible").should("have.attr", "type", "text").type(vorname);
cy.get("form[name='signup'] input[name='nachname']").should("be.visible").should("have.attr", "type", "text").type(nachname);
cy.get("form[name='signup'] input[name='email']").should("be.visible").should("have.attr", "type", "email").should("contain.value", email);
cy.get("form[name='signup'] input[name='passwort']").should("be.visible").should("have.attr", "type", "password").type(passwort);
cy.intercept({ method: "PUT", url: "**/api/user" }).as("signup")
cy.get("form[name='signup'] button[type='submit']").click();
cy.wait("@signup")
cy.get("form[name='login'] button[type='submit']").click();
cy.origin('https://www.mollie.com', () => { cy.origin('https://www.mollie.com', () => {
// Jetzt sind wir auf der Mollie Seite, dort wählen wir den "paid" status aus // 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(); cy.get("input[type='radio'][name='final_state'][value='paid']").check();

View File

@@ -6,296 +6,283 @@ import moment from "moment";
describe("Verbrauchsausweis erstellen Schritt 1", () => { describe("Verbrauchsausweis erstellen Schritt 1", () => {
it("erstellt einen neuen Verbrauchsausweis Wohngebäude.", () => { it("erstellt einen neuen Verbrauchsausweis Wohngebäude.", () => {
const email = faker.internet.email(); cy.task("plz").then(plz => {
const passwort = "test1234"; const email = faker.internet.email();
const vorname = faker.person.firstName(); const passwort = "test1234";
const nachname = faker.person.lastName(); const vorname = faker.person.firstName();
const telefon = faker.phone.number() const nachname = faker.person.lastName();
const telefon = faker.phone.number()
const strasse = faker.location.streetAddress({ useFullAddress: true }) const strasse = faker.location.streetAddress({ useFullAddress: true })
const plz = faker.location.zipCode("#####")
const preLogin = Math.random() > 0.5; const preLogin = Math.random() > 0.5;
if (preLogin) { if (preLogin) {
cy.signup(email, passwort, vorname, nachname) cy.signup(email, passwort, vorname, nachname)
cy.login(email, passwort) cy.login(email, passwort)
} }
cy.visit("/energieausweis-erstellen/verbrauchsausweis-wohngebaeude"); cy.visit("/energieausweis-erstellen/verbrauchsausweis-wohngebaeude");
cy.wait(2000); cy.wait(2000);
// Wir überprüfen, ob alle Ausstelgründe vorhanden sind, diese sollten genau so viele sein wie in der Datenbank vorhanden sind. // Wir überprüfen, ob alle Ausstelgründe vorhanden sind, diese sollten genau so viele sein wie in der Datenbank vorhanden sind.
cy.get("select[data-cy='ausstellgrund']") cy.get("select[data-cy='ausstellgrund']")
.select( .select(
faker.number.int({ faker.number.int({
min: 1, min: 1,
max: Object.values(Enums.Ausstellgrund).length - 1, max: Object.values(Enums.Ausstellgrund).length - 1,
}) })
) )
// Jetzt Füllen wir das Baujahr vom Gebäude aus. // Jetzt Füllen wir das Baujahr vom Gebäude aus.
cy.get("input[name='baujahr_gebaeude']") cy.get("input[name='baujahr_gebaeude']")
.should("have.attr", "type", "number") .should("have.attr", "type", "number")
.type( .type(
faker.number.int({ min: 1900, max: 2021 }).toString() + faker.number.int({ min: 1900, max: 2021 }).toString() +
"{enter}", "{enter}",
{ delay: 50 } { 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"
); );
// Jetzt Füllen wir das Baujahr der Heizung aus. // Adresse
cy.get("input[name='baujahr_heizung']") cy.get("input[name='adresse']").type(faker.location.streetAddress());
.should("have.attr", "type", "number")
.type( // Postleitzahl
faker.number.int({ min: 1900, max: 2021 }).toString() + cy.get("input[name='plz']").type(
"{enter}", plz as string
{ delay: 50 }
); );
// Anzahl Einheiten // TODO: Ort - Dieser wird aus der Datenbank abgefragt, wir müssen also warten, bis der Dropdown da ist.
cy.get("input[name='einheiten']") cy.get("[data-cy='plz-container']").find("button").first().click()
.should("have.attr", "type", "number")
.type(faker.number.int({ min: 1, max: 5 }).toString());
// Sanierungsstatus // Flaeche
cy.get("select[name='saniert']").select( cy.get("input[name='flaeche']")
Math.random() > 0.5 ? "true" : "false" .should("have.attr", "type", "number")
); .type(faker.number.int({ min: 50, max: 1000 }).toString());
// Adresse // Nutzflaeche
cy.get("input[name='adresse']").type(faker.location.streetAddress()); cy.get("input[name='nutzflaeche']")
.should("have.attr", "type", "number")
.type(faker.number.int({ min: 50, max: 1000 }).toString());
// Postleitzahl // Keller
cy.get("input[name='plz']").type( cy.get("select[name='keller']").find("option:not([disabled])").should("have.length", (["BEHEIZT", "NICHT_VORHANDEN", "UNBEHEIZT"] as Enums.Heizungsstatus[]).length).parent().select(faker.number.int({
faker.location.zipCode({ max: (["BEHEIZT", "NICHT_VORHANDEN", "UNBEHEIZT"] as Enums.Heizungsstatus[]).length,
format: "#####", min: 1
}) }));
);
// TODO: Ort - Dieser wird aus der Datenbank abgefragt, wir müssen also warten, bis der Dropdown da ist. // Dachgeschoss
cy.get("[data-cy='plz-container']").find("button").first().click() cy.get("select[name='dachgeschoss']").find("option:not([disabled])").should("have.length", (["BEHEIZT", "NICHT_VORHANDEN", "UNBEHEIZT"] as Enums.Heizungsstatus[]).length).parent().select(faker.number.int({
max: (["BEHEIZT", "NICHT_VORHANDEN", "UNBEHEIZT"] as Enums.Heizungsstatus[]).length,
min: 1
}));
// Flaeche // Brennstoff und Einheit 1
cy.get("input[name='flaeche']") const brennstoffKombo = fuelList[faker.number.int({ min: 0, max: fuelList.length - 1 })];
.should("have.attr", "type", "number")
.type(faker.number.int({ min: 50, max: 1000 }).toString());
// Nutzflaeche cy.get("select[name='brennstoff_1']").select(brennstoffKombo[0]);
cy.get("input[name='nutzflaeche']") cy.get("select[name='einheit_1']").select(brennstoffKombo[1]);
.should("have.attr", "type", "number")
.type(faker.number.int({ min: 50, max: 1000 }).toString());
// Keller
cy.get("select[name='keller']").find("option:not([disabled])").should("have.length", (["BEHEIZT", "NICHT_VORHANDEN", "UNBEHEIZT"] as Enums.Heizungsstatus[]).length).parent().select(faker.number.int({
max: (["BEHEIZT", "NICHT_VORHANDEN", "UNBEHEIZT"] as Enums.Heizungsstatus[]).length,
min: 1
}));
// Dachgeschoss
cy.get("select[name='dachgeschoss']").find("option:not([disabled])").should("have.length", (["BEHEIZT", "NICHT_VORHANDEN", "UNBEHEIZT"] as Enums.Heizungsstatus[]).length).parent().select(faker.number.int({
max: (["BEHEIZT", "NICHT_VORHANDEN", "UNBEHEIZT"] as 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]);
let availableDates = [];
const startDate = moment()
.subtract(4, "years")
.subtract(6, "months");
const endDate = moment().subtract(3, "years");
for (let m = moment(startDate); m.isBefore(endDate); m.add(1, "month")) {
availableDates.push({
year: m.year(),
month: m.month(),
});
}
// Verbrauchszeitraum
cy.get("select[name='energieverbrauch_zeitraum_jahr']").select(availableDates[0].year.toString());
cy.get("select[name='energieverbrauch_zeitraum_monat']").select(availableDates[0].month.toString());
// Verbrauch
cy.get("input[name='verbrauch_1']").type(faker.number.int({ min: 4000, max: 15000 }).toString(), { force: true });
cy.get("input[name='verbrauch_2']").type(faker.number.int({ min: 4000, max: 15000 }).toString(), { force: true });
cy.get("input[name='verbrauch_3']").type(faker.number.int({ min: 4000, max: 15000 }).toString(), { force: true });
let availableDates = [];
const startDate = moment()
.subtract(4, "years")
.subtract(6, "months");
const endDate = moment().subtract(3, "years");
const zusaetzlicheHeizquelle = Math.random() > 0.5; for (let m = moment(startDate); m.isBefore(endDate); m.add(1, "month")) {
availableDates.push({
year: m.year(),
month: m.month(),
});
}
if (zusaetzlicheHeizquelle) { // Verbrauchszeitraum
cy.get("[data-cy='zusaetzliche_heizquelle']").check(); cy.get("select[name='energieverbrauch_zeitraum_jahr']").select(availableDates[0].year.toString());
cy.get("select[name='energieverbrauch_zeitraum_monat']").select(availableDates[0].month.toString());
// Brennstoff und Einheit 2
const brennstoffKombo2 = fuelList[faker.number.int({ min: 0, max: fuelList.length - 1 })];
cy.get("[data-cy='brennstoff_2']").select(brennstoffKombo2[0], { force: true });
cy.get("[data-cy='einheit_2']").select(brennstoffKombo2[1], { force: true });
// Verbrauch // Verbrauch
cy.get("input[name='verbrauch_4']").type(faker.number.int({ min: 4000, max: 15000 }).toString(), { force: true }); cy.get("input[name='verbrauch_1']").type(faker.number.int({ min: 4000, max: 15000 }).toString(), { force: true });
cy.get("input[name='verbrauch_5']").type(faker.number.int({ min: 4000, max: 15000 }).toString(), { force: true }); cy.get("input[name='verbrauch_2']").type(faker.number.int({ min: 4000, max: 15000 }).toString(), { force: true });
cy.get("input[name='verbrauch_6']").type(faker.number.int({ min: 4000, max: 15000 }).toString(), { force: true }); cy.get("input[name='verbrauch_3']").type(faker.number.int({ min: 4000, max: 15000 }).toString(), { force: true });
}
// Warmwasser enthalten und bekannt
const warmwasserEnthalten = Math.random() > 0.5; const zusaetzlicheHeizquelle = Math.random() > 0.5;
const anteilBekannt = Math.random() > 0.5;
if (warmwasserEnthalten) { if (zusaetzlicheHeizquelle) {
cy.get("input[name='warmwasser_enthalten']").check(); cy.get("[data-cy='zusaetzliche_heizquelle']").check();
if (anteilBekannt) { // Brennstoff und Einheit 2
// Der Anteil ist bekannt, wir müssen ihn also angeben. const brennstoffKombo2 = fuelList[faker.number.int({ min: 0, max: fuelList.length - 1 })];
cy.get("input[name='warmwasser_anteil_bekannt']").check();
cy.get("input[name='anteil_warmwasser_1']").type(faker.number.int({ min: 0, max: 50 }).toString()); cy.get("[data-cy='brennstoff_2']").select(brennstoffKombo2[0], { force: true });
cy.get("[data-cy='einheit_2']").select(brennstoffKombo2[1], { force: true });
if (zusaetzlicheHeizquelle) { // Verbrauch
// Zusätzliche Heizquelle existiert, also müssen wir auch hier den Anteil angeben. cy.get("input[name='verbrauch_4']").type(faker.number.int({ min: 4000, max: 15000 }).toString(), { force: true });
cy.get("input[name='anteil_warmwasser_2']").type(faker.number.int({ min: 0, max: 50 }).toString(), {force: true}); cy.get("input[name='verbrauch_5']").type(faker.number.int({ min: 4000, max: 15000 }).toString(), { force: true });
cy.get("input[name='verbrauch_6']").type(faker.number.int({ min: 4000, max: 15000 }).toString(), { force: true });
}
// 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(), {force: true});
}
} }
} }
}
// Alternative Energieversorgungssysteme // Alternative Energieversorgungssysteme
if (Math.random() > 0.5) cy.get("input[name='alternative_heizung']").check(); 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_warmwasser']").check();
if (Math.random() > 0.5) cy.get("input[name='alternative_lueftung']").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(); if (Math.random() > 0.5) cy.get("input[name='alternative_kuehlung']").check();
// Gebäudetyp // Gebäudetyp
cy.get("select[name='gebaeudetyp']").then(($dropdown) => { cy.get("select[name='gebaeudetyp']").then(($dropdown) => {
const options = $dropdown.find('option'); const options = $dropdown.find('option');
// Select the option at the random index // 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); 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, { force: true });
});
// 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("[data-cy='zentralheizung']").check();
if (Math.random() > 0.5) cy.get("[data-cy='einzelofen']").check();
if (Math.random() > 0.5) cy.get("[data-cy='durchlauf_erhitzer']").check();
if (Math.random() > 0.5) cy.get("[data-cy='standard_kessel']").check();
if (Math.random() > 0.5) cy.get("[data-cy='solarsystem_warmwasser']").check();
if (Math.random() > 0.5) cy.get("[data-cy='waermepumpe']").check();
if (Math.random() > 0.5) cy.get("[data-cy='niedertemperatur_kessel']").check();
if (Math.random() > 0.5) cy.get("[data-cy='brennwert_kessel']").check();
if (Math.random() > 0.5) cy.get("[data-cy='warmwasser_rohre_gedaemmt']").check();
if (Math.random() > 0.5) cy.get("[data-cy='heizungsrohre_gedaemmt']").check();
if (Math.random() > 0.5) cy.get("[data-cy='zirkulation']").check();
// if (Math.random() > 0.5) cy.get("[data-cy='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[data-cy='ausweis'] button[data-cy='weiter']").click({ force: true });
cy.url().should("contain", "/kundendaten");
cy.get("input[name='telefon']").should("have.attr", "type", "text").type(telefon);
// Rechnung
if (preLogin) {
cy.get("input[name='rechnung_empfaenger']").should("have.attr", "type", "text").should("contain.value", `${vorname} ${nachname}`);
cy.get("input[name='vorname']").should("have.attr", "type", "text").should("contain.value", vorname);
cy.get("input[name='name']").should("have.attr", "type", "text").should("contain.value", nachname);
cy.get("input[name='rechnung_email']").should("have.attr", "type", "email").should("contain.value", email);
} else {
cy.get("input[name='rechnung_empfaenger']").should("have.attr", "type", "text").type(`${vorname} ${nachname}`);
cy.get("input[name='vorname']").should("have.attr", "type", "text").type(vorname);
cy.get("input[name='name']").should("have.attr", "type", "text").type(nachname);
cy.get("input[name='rechnung_email']").should("have.attr", "type", "email").type(email);
}
cy.get("input[name='rechnung_strasse']").should("have.attr", "type", "text").type(strasse);
cy.get("input[name='rechnung_plz']").should("have.attr", "type", "text").type(plz as string);
cy.get("[data-cy='plz-container']").children().first().click()
cy.get("[data-cy='paypal']").click()
cy.get("button[data-cy='bestellen']").click();
if (!preLogin) {
cy["form:signup"](email, passwort, vorname, nachname)
}
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.
})
}); });
// 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, { force: true });
});
// 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("[data-cy='zentralheizung']").check();
if (Math.random() > 0.5) cy.get("[data-cy='einzelofen']").check();
if (Math.random() > 0.5) cy.get("[data-cy='durchlauf_erhitzer']").check();
if (Math.random() > 0.5) cy.get("[data-cy='standard_kessel']").check();
if (Math.random() > 0.5) cy.get("[data-cy='solarsystem_warmwasser']").check();
if (Math.random() > 0.5) cy.get("[data-cy='waermepumpe']").check();
if (Math.random() > 0.5) cy.get("[data-cy='niedertemperatur_kessel']").check();
if (Math.random() > 0.5) cy.get("[data-cy='brennwert_kessel']").check();
if (Math.random() > 0.5) cy.get("[data-cy='warmwasser_rohre_gedaemmt']").check();
if (Math.random() > 0.5) cy.get("[data-cy='heizungsrohre_gedaemmt']").check();
if (Math.random() > 0.5) cy.get("[data-cy='zirkulation']").check();
// if (Math.random() > 0.5) cy.get("[data-cy='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[data-cy='ausweis'] button[data-cy='weiter']").click({ force: true });
cy.url().should("contain", "/kundendaten");
cy.get("input[name='telefon']").should("have.attr", "type", "text").type(telefon);
// Rechnung
if (preLogin) {
cy.get("input[name='rechnung_empfaenger']").should("have.attr", "type", "text").should("contain.value", `${vorname} ${nachname}`);
cy.get("input[name='vorname']").should("have.attr", "type", "text").should("contain.value", vorname);
cy.get("input[name='name']").should("have.attr", "type", "text").should("contain.value", nachname);
cy.get("input[name='rechnung_email']").should("have.attr", "type", "email").should("contain.value", email);
} else {
cy.get("input[name='rechnung_empfaenger']").should("have.attr", "type", "text").type(`${vorname} ${nachname}`);
cy.get("input[name='vorname']").should("have.attr", "type", "text").type(vorname);
cy.get("input[name='name']").should("have.attr", "type", "text").type(nachname);
cy.get("input[name='rechnung_email']").should("have.attr", "type", "email").type(email);
}
cy.get("input[name='rechnung_strasse']").should("have.attr", "type", "text").type(strasse);
cy.get("input[name='rechnung_plz']").should("have.attr", "type", "text").type(plz);
cy.get("[data-cy='plz-container']").children().first().click()
cy.get("[data-cy='paypal']").click()
cy.get("button[data-cy='bestellen']").click();
if (!preLogin) {
cy.get("a[data-cy='registrieren']").should("be.visible").click();
// Wir sind jetzt registriert und können uns nun einloggen.
// Die Email sollte automatisch eingetragen sein, da wir uns gerade registriert haben.
cy.get("form[name='signup'] input[name='vorname']").should("be.visible").should("have.attr", "type", "text").type(vorname);
cy.get("form[name='signup'] input[name='nachname']").should("be.visible").should("have.attr", "type", "text").type(nachname);
cy.get("form[name='signup'] input[name='email']").should("be.visible").should("have.attr", "type", "email").should("contain.value", email);
cy.get("form[name='signup'] input[name='passwort']").should("be.visible").should("have.attr", "type", "password").type(passwort);
cy.intercept({ method: "PUT", url: "**/api/user" }).as("signup")
cy.get("form[name='signup'] button[type='submit']").click();
cy.wait("@signup")
cy.get("form[name='login'] button[type='submit']").click();
}
cy.origin('https://www.mollie.com', () => {
// Jetzt sind wir auf der Mollie Seite, dort wählen wir den "paid" status aus
cy.get("input[type='radio'][name='final_state'][value='paid']").check();
// Da wird unser Test fehlschlagen, da die localhost domain von Mollie aus nicht erreichbar ist.
})
}); });
}); });

View File

@@ -30,11 +30,28 @@ Cypress.Commands.add("signup", (email, passwort, vorname, name) => {
cy.url().should("include", "/auth/login") cy.url().should("include", "/auth/login")
}) })
Cypress.Commands.add("form:signup", (email, passwort, vorname, name) => {
cy.get("a[data-cy='registrieren']").should("be.visible").click();
// Wir sind jetzt registriert und können uns nun einloggen.
// Die Email sollte automatisch eingetragen sein, da wir uns gerade registriert haben.
cy.get("form[name='signup'] input[name='vorname']").should("be.visible").should("have.attr", "type", "text").type(vorname);
cy.get("form[name='signup'] input[name='nachname']").should("be.visible").should("have.attr", "type", "text").type(name);
cy.get("form[name='signup'] input[name='email']").should("be.visible").should("have.attr", "type", "email").should("contain.value", email);
cy.get("form[name='signup'] input[name='passwort']").should("be.visible").should("have.attr", "type", "password").type(passwort);
cy.intercept({ method: "PUT", url: "**/api/user" }).as("signup")
cy.get("form[name='signup'] button[type='submit']").click();
cy.wait("@signup")
cy.get("form[name='login'] button[type='submit']").click();
})
declare global { declare global {
namespace Cypress { namespace Cypress {
interface Chainable { interface Chainable {
login(email: string, passwort: string): Chainable<void> login(email: string, passwort: string): Chainable<void>
signup(email: string, passwort: string, vorname: string, name: string): Chainable<void> signup(email: string, passwort: string, vorname: string, name: string): Chainable<void>
"form:signup"(email: string, passwort: string, vorname: string, name: string): Chainable<void>
} }
} }
} }

View File

@@ -1,10 +1,9 @@
import * as z from "zod" import * as z from "zod"
import { Ausweisart, Heizungsstatus, Heizungsstatus, Lueftungskonzept } from "@prisma/client" import { Heizungsstatus, Heizungsstatus, Lueftungskonzept } from "@prisma/client"
export const AufnahmeSchema = z.object({ export const AufnahmeSchema = z.object({
id: z.string(), id: z.string(),
benutzer_id: z.string().nullish(), benutzer_id: z.string().nullish(),
ausweisart: z.nativeEnum(Ausweisart).describe("Art des korrespondierenden Ausweises, wie z.B. VerbrauchsausweisWohnen").nullish(),
gebaeudetyp: z.string().describe("Art des Gebäudes und seiner primären Nutzungsart").nullish(), gebaeudetyp: z.string().describe("Art des Gebäudes und seiner primären Nutzungsart").nullish(),
gebaeudeteil: z.string().describe("Betrachteter Teil des Gebäudes, z.B. Gesamtgebäude, Wohnteil, Gewerbeteil").nullish(), gebaeudeteil: z.string().describe("Betrachteter Teil des Gebäudes, z.B. Gesamtgebäude, Wohnteil, Gewerbeteil").nullish(),
baujahr_gebaeude: z.number().int().array().describe("Alle Jahre in denen das Gebäude konstruiert oder grundlegend verändert wurde"), baujahr_gebaeude: z.number().int().array().describe("Alle Jahre in denen das Gebäude konstruiert oder grundlegend verändert wurde"),
@@ -23,12 +22,7 @@ export const AufnahmeSchema = z.object({
alternative_warmwasser: z.boolean().describe("Falls der Warmwasserverbrauch alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen").nullish(), alternative_warmwasser: z.boolean().describe("Falls der Warmwasserverbrauch alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen").nullish(),
alternative_lueftung: z.boolean().describe("Falls die Lüftung alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen").nullish(), alternative_lueftung: z.boolean().describe("Falls die Lüftung alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen").nullish(),
alternative_kuehlung: z.boolean().describe("Falls die Kühlung alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen").nullish(), alternative_kuehlung: z.boolean().describe("Falls die Kühlung alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen").nullish(),
brennstoff_1: z.string().describe("Genutzer Brennstoff der primären Energiequelle").nullish(), erstellungsdatum: z.date().describe("Datum an dem der Kunde die Aufnahme erstellt hat").nullish(),
brennstoff_2: z.string().describe("Genutzer Brennstoff der sekundären Energiequelle").nullish(),
boxpruefung: z.boolean().nullish(),
energieeffizienzklasse: z.string().describe("Die aus der Berechnung hervorgehende Energieeffizienzklasse des Gebäudes").nullish(),
erstellungsdatum: z.date().describe("Datum an dem der Kunde den Ausweis erstellt hat").nullish(),
ausstellungsdatum: z.date().describe("Datum an dem der Aussteller den Ausweis ausgestellt hat").nullish(),
zentralheizung: z.boolean().describe("Falls das Gebäude über eine Zentralbeheizung verfügt, sollte dieser Wert auf true stehen").nullish(), zentralheizung: z.boolean().describe("Falls das Gebäude über eine Zentralbeheizung verfügt, sollte dieser Wert auf true stehen").nullish(),
solarsystem_warmwasser: z.boolean().describe("Falls das Gebäude über ein Solarsystem für Warmwasser verfügt, sollte dieser Wert auf true stehen").nullish(), solarsystem_warmwasser: z.boolean().describe("Falls das Gebäude über ein Solarsystem für Warmwasser verfügt, sollte dieser Wert auf true stehen").nullish(),
warmwasser_rohre_gedaemmt: z.boolean().describe("Falls die Warmwasserrohre des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen").nullish(), warmwasser_rohre_gedaemmt: z.boolean().describe("Falls die Warmwasserrohre des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen").nullish(),

View File

@@ -1,5 +1,5 @@
import * as z from "zod" import * as z from "zod"
import { Ausstellgrund } from "@prisma/client" import { Ausstellgrund, AusweisTyp } from "@prisma/client"
export const BedarfsausweisGewerbeSchema = z.object({ export const BedarfsausweisGewerbeSchema = z.object({
id: z.string(), id: z.string(),
@@ -19,6 +19,9 @@ export const BedarfsausweisGewerbeSchema = z.object({
fussbodenheizung: z.boolean().nullish(), fussbodenheizung: z.boolean().nullish(),
bauteilaktivierung: z.boolean().nullish(), bauteilaktivierung: z.boolean().nullish(),
klimatisierung: z.boolean().nullish(), klimatisierung: z.boolean().nullish(),
nachweistyp: z.nativeEnum(AusweisTyp),
created_at: z.date(),
updated_at: z.date(),
benutzer_id: z.string().describe("Die ID des Benutzers, welchem dieser Ausweis gehört").nullish(), benutzer_id: z.string().describe("Die ID des Benutzers, welchem dieser Ausweis gehört").nullish(),
aufnahme_id: z.string(), aufnahme_id: z.string(),
rechnung_id: z.string().nullish(), rechnung_id: z.string().nullish(),

View File

@@ -11,6 +11,9 @@ export const BedarfsausweisWohnenSchema = z.object({
alternative_warmwasser: z.boolean().nullish(), alternative_warmwasser: z.boolean().nullish(),
alternative_lueftung: z.boolean().nullish(), alternative_lueftung: z.boolean().nullish(),
alternative_kuehlung: z.boolean().nullish(), alternative_kuehlung: z.boolean().nullish(),
energieeffizienzklasse: z.string().describe("Die aus der Berechnung hervorgehende Energieeffizienzklasse des Gebäudes").nullish(),
ausstellungsdatum: z.date().describe("Datum an dem der Aussteller den Ausweis ausgestellt hat").nullish(),
boxpruefung: z.boolean().nullish(),
anzahl_vollgeschosse: z.number().int().nullish(), anzahl_vollgeschosse: z.number().int().nullish(),
geschosshoehe: z.number().nullish(), geschosshoehe: z.number().nullish(),
anzahl_gauben: z.number().int().nullish(), anzahl_gauben: z.number().int().nullish(),

View File

@@ -1,5 +1,5 @@
import * as z from "zod" import * as z from "zod"
import { Ausstellgrund } from "@prisma/client" import { Ausstellgrund, AusweisTyp } from "@prisma/client"
export const GEGNachweisGewerbeSchema = z.object({ export const GEGNachweisGewerbeSchema = z.object({
id: z.string(), id: z.string(),
@@ -9,6 +9,9 @@ export const GEGNachweisGewerbeSchema = z.object({
bestellt: z.boolean().describe("Falls der Nachweis bestellt wurde, sollte dieser Wert auf true stehen").nullish(), bestellt: z.boolean().describe("Falls der Nachweis bestellt wurde, sollte dieser Wert auf true stehen").nullish(),
zurueckgestellt: z.boolean().describe("Falls der Nachweis vom Aussteller zurückgestellt wurde, sollte dieser Wert auf true stehen").nullish(), zurueckgestellt: z.boolean().describe("Falls der Nachweis vom Aussteller zurückgestellt wurde, sollte dieser Wert auf true stehen").nullish(),
beschreibung: z.string().describe("Beschreibung des Bauvorhabens").nullish(), beschreibung: z.string().describe("Beschreibung des Bauvorhabens").nullish(),
nachweistyp: z.nativeEnum(AusweisTyp),
created_at: z.date(),
updated_at: z.date(),
benutzer_id: z.string().describe("Die ID des Benutzers, welchem dieser Ausweis gehört").nullish(), benutzer_id: z.string().describe("Die ID des Benutzers, welchem dieser Ausweis gehört").nullish(),
aufnahme_id: z.string(), aufnahme_id: z.string(),
rechnung_id: z.string().nullish(), rechnung_id: z.string().nullish(),

View File

@@ -1,5 +1,5 @@
import * as z from "zod" import * as z from "zod"
import { Ausstellgrund } from "@prisma/client" import { Ausstellgrund, AusweisTyp } from "@prisma/client"
export const GEGNachweisWohnenSchema = z.object({ export const GEGNachweisWohnenSchema = z.object({
id: z.string(), id: z.string(),
@@ -9,6 +9,9 @@ export const GEGNachweisWohnenSchema = z.object({
bestellt: z.boolean().describe("Falls der Nachweis bestellt wurde, sollte dieser Wert auf true stehen").nullish(), bestellt: z.boolean().describe("Falls der Nachweis bestellt wurde, sollte dieser Wert auf true stehen").nullish(),
zurueckgestellt: z.boolean().describe("Falls der Nachweis vom Aussteller zurückgestellt wurde, sollte dieser Wert auf true stehen").nullish(), zurueckgestellt: z.boolean().describe("Falls der Nachweis vom Aussteller zurückgestellt wurde, sollte dieser Wert auf true stehen").nullish(),
beschreibung: z.string().describe("Beschreibung des Bauvorhabens").nullish(), beschreibung: z.string().describe("Beschreibung des Bauvorhabens").nullish(),
nachweistyp: z.nativeEnum(AusweisTyp),
created_at: z.date(),
updated_at: z.date(),
benutzer_id: z.string().describe("Die ID des Benutzers, welchem dieser Ausweis gehört").nullish(), benutzer_id: z.string().describe("Die ID des Benutzers, welchem dieser Ausweis gehört").nullish(),
aufnahme_id: z.string(), aufnahme_id: z.string(),
rechnung_id: z.string().nullish(), rechnung_id: z.string().nullish(),

View File

@@ -1,23 +1,23 @@
export * from "./anteilshaber.js" export * from "./anteilshaber"
export * from "./apirequests.js" export * from "./apirequests"
export * from "./aufnahme.js" export * from "./aufnahme"
export * from "./bedarfsausweisgewerbe.js" export * from "./bedarfsausweisgewerbe"
export * from "./bedarfsausweiswohnen.js" export * from "./bedarfsausweiswohnen"
export * from "./benutzer.js" export * from "./benutzer"
export * from "./bild.js" export * from "./bild"
export * from "./event.js" export * from "./event"
export * from "./gegeinpreisung.js" export * from "./gegeinpreisung"
export * from "./gegnachweisgewerbe.js" export * from "./gegnachweisgewerbe"
export * from "./gegnachweiswohnen.js" export * from "./gegnachweiswohnen"
export * from "./klimafaktoren.js" export * from "./klimafaktoren"
export * from "./objekt.js" export * from "./objekt"
export * from "./postleitzahlen.js" export * from "./postleitzahlen"
export * from "./rechnung.js" export * from "./rechnung"
export * from "./refreshtokens.js" export * from "./refreshtokens"
export * from "./tickets.js" export * from "./tickets"
export * from "./unterlage.js" export * from "./unterlage"
export * from "./verbrauchsausweisgewerbe.js" export * from "./verbrauchsausweisgewerbe"
export * from "./verbrauchsausweiswohnen.js" export * from "./verbrauchsausweiswohnen"
export * from "./documenttemplates.js" export * from "./documenttemplates"
export * from "./documenttypes.js" export * from "./documenttypes"
export * from "./tokens.js" export * from "./tokens"

View File

@@ -7,9 +7,7 @@ export const VerbrauchsausweisGewerbeSchema = z.object({
ausstellgrund: z.nativeEnum(Ausstellgrund).nullish(), ausstellgrund: z.nativeEnum(Ausstellgrund).nullish(),
registriernummer: z.string().nullish(), registriernummer: z.string().nullish(),
zusaetzliche_heizquelle: z.boolean().nullish(), zusaetzliche_heizquelle: z.boolean().nullish(),
brennstoff_1: z.string().nullish(),
einheit_1: z.string().nullish(), einheit_1: z.string().nullish(),
brennstoff_2: z.string().nullish(),
einheit_2: z.string().nullish(), einheit_2: z.string().nullish(),
startdatum: z.date().nullish(), startdatum: z.date().nullish(),
verbrauch_1: z.number().int().nullish(), verbrauch_1: z.number().int().nullish(),
@@ -18,6 +16,11 @@ export const VerbrauchsausweisGewerbeSchema = z.object({
verbrauch_4: z.number().int().nullish(), verbrauch_4: z.number().int().nullish(),
verbrauch_5: z.number().int().nullish(), verbrauch_5: z.number().int().nullish(),
verbrauch_6: z.number().int().nullish(), verbrauch_6: z.number().int().nullish(),
brennstoff_1: z.string().describe("Genutzer Brennstoff der primären Energiequelle").nullish(),
brennstoff_2: z.string().describe("Genutzer Brennstoff der sekundären Energiequelle").nullish(),
energieeffizienzklasse: z.string().describe("Die aus der Berechnung hervorgehende Energieeffizienzklasse des Gebäudes").nullish(),
ausstellungsdatum: z.date().describe("Datum an dem der Aussteller den Ausweis ausgestellt hat").nullish(),
boxpruefung: z.boolean().nullish(),
strom_1: z.number().int().nullish(), strom_1: z.number().int().nullish(),
strom_2: z.number().int().nullish(), strom_2: z.number().int().nullish(),
strom_3: z.number().int().nullish(), strom_3: z.number().int().nullish(),

View File

@@ -9,6 +9,11 @@ export const VerbrauchsausweisWohnenSchema = z.object({
zusaetzliche_heizquelle: z.boolean().describe("Falls eine sekundäre Heizquelle existiert, sollte dieser Wert auf true stehen").nullish(), zusaetzliche_heizquelle: z.boolean().describe("Falls eine sekundäre Heizquelle existiert, sollte dieser Wert auf true stehen").nullish(),
einheit_1: z.string().describe("Einheit des Energieträgers der primären Heizquelle").nullish(), einheit_1: z.string().describe("Einheit des Energieträgers der primären Heizquelle").nullish(),
einheit_2: z.string().describe("Einheit des Energieträgers der sekundären Heizquelle").nullish(), einheit_2: z.string().describe("Einheit des Energieträgers der sekundären Heizquelle").nullish(),
brennstoff_1: z.string().describe("Genutzer Brennstoff der primären Energiequelle").nullish(),
brennstoff_2: z.string().describe("Genutzer Brennstoff der sekundären Energiequelle").nullish(),
energieeffizienzklasse: z.string().describe("Die aus der Berechnung hervorgehende Energieeffizienzklasse des Gebäudes").nullish(),
ausstellungsdatum: z.date().describe("Datum an dem der Aussteller den Ausweis ausgestellt hat").nullish(),
boxpruefung: z.boolean().nullish(),
startdatum: z.date().nullish(), startdatum: z.date().nullish(),
verbrauch_1: z.number().int().describe("Energieverbrauch der primären Heizquelle im ersten der drei Verbrauchsjahre").nullish(), verbrauch_1: z.number().int().describe("Energieverbrauch der primären Heizquelle im ersten der drei Verbrauchsjahre").nullish(),
verbrauch_2: z.number().int().describe("Energieverbrauch der primären Heizquelle im zweiten der drei Verbrauchsjahre").nullish(), verbrauch_2: z.number().int().describe("Energieverbrauch der primären Heizquelle im zweiten der drei Verbrauchsjahre").nullish(),
@@ -18,7 +23,6 @@ export const VerbrauchsausweisWohnenSchema = z.object({
verbrauch_6: z.number().int().describe("Energieverbrauch der sekund̈́ären Heizquelle im letzten der drei Verbrauchsjahre").nullish(), verbrauch_6: z.number().int().describe("Energieverbrauch der sekund̈́ären Heizquelle im letzten der drei Verbrauchsjahre").nullish(),
warmwasser_enthalten: z.boolean().describe("Falls Warmwasser im Verbrauchswert enthalten ist, sollte dieser Wert auf true stehen").nullish(), warmwasser_enthalten: z.boolean().describe("Falls Warmwasser im Verbrauchswert enthalten ist, sollte dieser Wert auf true stehen").nullish(),
warmwasser_anteil_bekannt: z.boolean().describe("Falls der Warmwasser Anteil am Verbrauch bekannt ist, sollte dieser Wert auf true stehen").nullish(), warmwasser_anteil_bekannt: z.boolean().describe("Falls der Warmwasser Anteil am Verbrauch bekannt ist, sollte dieser Wert auf true stehen").nullish(),
keller_beheizt: z.boolean().describe("Falls der Keller des Gebäudes beheizt wird, sollte dieser Wert auf true stehen").nullish(),
faktorKeller: z.number().describe("Der Faktor mit dem die Wohnfläche erhöht wird wenn die beheizte Gesamtfläche (energetische Nutzfläche) unbekannt ist.").nullish(), faktorKeller: z.number().describe("Der Faktor mit dem die Wohnfläche erhöht wird wenn die beheizte Gesamtfläche (energetische Nutzfläche) unbekannt ist.").nullish(),
alternative_heizung: z.boolean().describe("Falls der Heizungsverbrauch alternative Energieversorgungssysteme beinhaltet, sollte dieser Wert auf true stehen.").nullish(), alternative_heizung: z.boolean().describe("Falls der Heizungsverbrauch alternative Energieversorgungssysteme beinhaltet, sollte dieser Wert auf true stehen.").nullish(),
alternative_warmwasser: z.boolean().describe("Falls der Warmwasserverbrauch alternative Energieversorgungssysteme (z.B. Solarsystem, Wärmepumpe, etc.) beinhaltet, sollte dieser Wert auf true stehen.").nullish(), alternative_warmwasser: z.boolean().describe("Falls der Warmwasserverbrauch alternative Energieversorgungssysteme (z.B. Solarsystem, Wärmepumpe, etc.) beinhaltet, sollte dieser Wert auf true stehen.").nullish(),

View File

@@ -99,13 +99,13 @@ export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis:
// Endenergieverbrauch // Endenergieverbrauch
// Um den EEV auszurechnen, müssen die Verbräuche zu kWh konvertiert werden. // Um den EEV auszurechnen, müssen die Verbräuche zu kWh konvertiert werden.
let brennstoff_1 = { coe: 0, energietraeger: "", einheit: "", umrechnungsfaktor: 0, primaerenergiefaktor: 0 }, brennstoff_2 = { coe: 0, energietraeger: "", einheit: "", umrechnungsfaktor: 0, primaerenergiefaktor: 0 }; let brennstoff_1 = { coe: 0, energietraeger: "", einheit: "", umrechnungsfaktor: 0, primaerenergiefaktor: 0 }, brennstoff_2 = { coe: 0, energietraeger: "", einheit: "", umrechnungsfaktor: 0, primaerenergiefaktor: 0 };
if (aufnahme.brennstoff_1 && ausweis.einheit_1) { if (ausweis.brennstoff_1 && ausweis.einheit_1) {
brennstoff_1 = getHeizwertfaktor(aufnahme.brennstoff_1, ausweis.einheit_1); brennstoff_1 = getHeizwertfaktor(ausweis.brennstoff_1, ausweis.einheit_1);
} }
if (aufnahme.brennstoff_2 && ausweis.einheit_2) { if (ausweis.brennstoff_2 && ausweis.einheit_2) {
brennstoff_2 = getHeizwertfaktor(aufnahme.brennstoff_2, ausweis.einheit_2); brennstoff_2 = getHeizwertfaktor(ausweis.brennstoff_2, ausweis.einheit_2);
} }
let energieVerbrauchGesamt_1 = ((ausweis.verbrauch_1 || 0) + (ausweis.verbrauch_2 || 0) + (ausweis.verbrauch_3 || 0)) * brennstoff_1?.umrechnungsfaktor; let energieVerbrauchGesamt_1 = ((ausweis.verbrauch_1 || 0) + (ausweis.verbrauch_2 || 0) + (ausweis.verbrauch_3 || 0)) * brennstoff_1?.umrechnungsfaktor;

View File

@@ -64,11 +64,11 @@ export async function endEnergieVerbrauchVerbrauchsausweis_2016(
// Endenergieverbrauch // Endenergieverbrauch
// Um den EEV auszurechnen, müssen die Verbräuche zu kWh konvertiert werden. // Um den EEV auszurechnen, müssen die Verbräuche zu kWh konvertiert werden.
let brennstoff_1 = getHeizwertfaktor( let brennstoff_1 = getHeizwertfaktor(
aufnahme.brennstoff_1 as string, ausweis.brennstoff_1 as string,
ausweis.einheit_1 as string ausweis.einheit_1 as string
); );
let brennstoff_2 = getHeizwertfaktor( let brennstoff_2 = getHeizwertfaktor(
aufnahme.brennstoff_2 as string, ausweis.brennstoff_2 as string,
ausweis.einheit_2 as string ausweis.einheit_2 as string
); );

View File

@@ -1,38 +0,0 @@
import { Ausweis } from "./Ausweis/Ausweis";
import { Dachgeschoss, Lueftungskonzept } from "./Ausweis/types";
import { BitChecker } from "./BitChecker";
export class Gebaeude {
public typ: string = "";
public plz: string = "";
public ort: string = "";
public strasse: string = "";
public gebaeudeteil: string = "";
public saniert: boolean = false;
public baujahr: number[] = [];
public einheiten: number = 0;
public wohnflaeche: number = 0;
public nutzflaeche: number = 0;
public keller_beheizt: boolean = false;
public dachgeschoss_beheizt: Dachgeschoss = Dachgeschoss.UNBEHEIZT;
public lueftungskonzept: Lueftungskonzept = "Fensterlüftung";
public wird_gekuehlt: boolean = false;
public leerstand: number = 0;
public versorgungssysteme: boolean[] = BitChecker(0);
public fenster_dach: boolean[] = BitChecker(0);
public energiequelle_2_nutzung: boolean[] = BitChecker(0);
public daemmung: boolean[] = BitChecker(0);
public ausweis: Ausweis;
public uid?: string;
public constructor(initializer?: Gebaeude) {
if (initializer) {
this.typ = initializer.typ;
this.plz = initializer.plz;
this.ort = initializer.ort;
}
}
}

View File

@@ -1,8 +1,8 @@
import { AufnahmeClient, BedarfsausweisWohnenClient, ObjektClient, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js"; import { AufnahmeClient, ObjektClient, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
import { Enums } from "#lib/client/prisma"; import { Enums } from "#lib/client/prisma.js";
import moment from "moment"; import moment from "moment";
export function getEmpfehlungen(ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient): { export function getEmpfehlungen(ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient, objekt: ObjektClient): {
title: string, title: string,
description: string, description: string,
anlagenteil: string, anlagenteil: string,
@@ -19,7 +19,6 @@ export function getEmpfehlungen(ausweis: VerbrauchsausweisWohnenClient | Verbrau
let baujahr_anlagesanlage = aufnahme.baujahr_heizung && aufnahme.baujahr_heizung[0]; let baujahr_anlagesanlage = aufnahme.baujahr_heizung && aufnahme.baujahr_heizung[0];
let Zentralheizung = aufnahme.zentralheizung; let Zentralheizung = aufnahme.zentralheizung;
let photovoltaik = aufnahme.photovoltaik; let photovoltaik = aufnahme.photovoltaik;
let Brennstoff = aufnahme.brennstoff_1;
let Aussenwand_gedaemmt = aufnahme.aussenwand_gedaemmt; let Aussenwand_gedaemmt = aufnahme.aussenwand_gedaemmt;
let Dachgeschoss = aufnahme.dachgeschoss; let Dachgeschoss = aufnahme.dachgeschoss;
let Dachgeschoss_gedaemmt = aufnahme.dachgeschoss_gedaemmt; let Dachgeschoss_gedaemmt = aufnahme.dachgeschoss_gedaemmt;
@@ -70,7 +69,7 @@ export function getEmpfehlungen(ausweis: VerbrauchsausweisWohnenClient | Verbrau
let Relanlagenjahr = moment().year() - 35; let Relanlagenjahr = moment().year() - 35;
if ((!Brennwertkessel && !Waermepumpe) && baujahr_anlagesanlage <= Relanlagenjahr && Brennstoff != 'Fernwärme' && Brennstoff != 'Strommix') { if ((!Brennwertkessel && !Waermepumpe) && baujahr_anlagesanlage <= Relanlagenjahr && ausweis.brennstoff_1 != 'Fernwärme' && ausweis.brennstoff_1 != 'Strommix') {
empfehlungen.push({ empfehlungen.push({
"title" : "Anlagentechnik", "title" : "Anlagentechnik",
"description" : "Prüfen Sie, ob Sie bei einer Umrüstung auf einen regenerativen Anteil von 65% kommen. Bei energetisch sanierten Gebäuden z.B. Wärmepumpe. Bei unsanieten Gebäuden Fernwärmeanschluss.", "description" : "Prüfen Sie, ob Sie bei einer Umrüstung auf einen regenerativen Anteil von 65% kommen. Bei energetisch sanierten Gebäuden z.B. Wärmepumpe. Bei unsanieten Gebäuden Fernwärmeanschluss.",
@@ -126,7 +125,7 @@ export function getEmpfehlungen(ausweis: VerbrauchsausweisWohnenClient | Verbrau
} }
} }
if ((baujahr_anlagesanlage <= (moment().year() - 30)) && (Brennstoff == "Heizöl" || Brennstoff == "Erdgas") && !Waermepumpe) { if ((baujahr_anlagesanlage <= (moment().year() - 30)) && (ausweis.brennstoff_1 == "Heizöl" || ausweis.brennstoff_1 == "Erdgas") && !Waermepumpe) {
// Wärmepumpe // Wärmepumpe
empfehlungen.push({ empfehlungen.push({
"title" : "Wärmeerzeuger", "title" : "Wärmeerzeuger",
@@ -137,7 +136,7 @@ export function getEmpfehlungen(ausweis: VerbrauchsausweisWohnenClient | Verbrau
}); });
} }
if (!photovoltaik && Brennstoff == "Strommix") { if (!photovoltaik && ausweis.brennstoff_1 == "Strommix") {
// Wärmepumpe // Wärmepumpe
empfehlungen.push({ empfehlungen.push({
"title" : "Wärmeerzeuger", "title" : "Wärmeerzeuger",

View File

@@ -1,6 +1,6 @@
import { VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js"; import { VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
import { faker } from "@faker-js/faker"; import { faker } from "@faker-js/faker";
import { Enums } from "#lib/client/prisma.js"; import { Aufnahme, Enums, VerbrauchsausweisWohnen } from "#lib/client/prisma.js";
import moment from "moment"; import moment from "moment";
export async function importVerbrauchsausweisWohnenAltesSystem(count: number = 5) { export async function importVerbrauchsausweisWohnenAltesSystem(count: number = 5) {
@@ -19,7 +19,7 @@ export async function importVerbrauchsausweisWohnenAltesSystem(count: number = 5
} }
export function verbrauchsausweisWohnenImportTranslate(ausweis: Record<string, any>) { export function verbrauchsausweisWohnenImportTranslate(ausweis: Record<string, any>) {
const ausweisTranslated: VerbrauchsausweisWohnenClient = { const ausweisTranslated: VerbrauchsausweisWohnen & { aufnahme: Aufnahme } = {
aufnahme: { aufnahme: {
rechnungen: null, rechnungen: null,
baujahr_gebaeude: [ausweis.baujahr_gebaeude], baujahr_gebaeude: [ausweis.baujahr_gebaeude],
@@ -58,7 +58,6 @@ export function verbrauchsausweisWohnenImportTranslate(ausweis: Record<string, a
aussenwand_gedaemmt: ausweis.aussenwand_gedaemmt, aussenwand_gedaemmt: ausweis.aussenwand_gedaemmt,
aussenwand_min_12cm_gedaemmt: ausweis.aussenwand_min_12cm_gedaemmt, aussenwand_min_12cm_gedaemmt: ausweis.aussenwand_min_12cm_gedaemmt,
bestellt: ausweis.bestellt, bestellt: ausweis.bestellt,
boxpruefung: ausweis.boxpruefung,
brennwert_kessel: ausweis.brennwert_kessel, brennwert_kessel: ausweis.brennwert_kessel,
dachgeschoss_gedaemmt: ausweis.dachgeschoss_gedaemmt, dachgeschoss_gedaemmt: ausweis.dachgeschoss_gedaemmt,
dachgeschoss_min_12cm_gedaemmt: ausweis.dachgeschoss_min_12cm_gedaemmt, dachgeschoss_min_12cm_gedaemmt: ausweis.dachgeschoss_min_12cm_gedaemmt,

View File

@@ -16,7 +16,7 @@ export async function loginClient(email: string, passwort: string): Promise<infe
} }
Cookies.set(API_ACCESS_TOKEN_COOKIE_NAME, response.accessToken, options); Cookies.set(API_ACCESS_TOKEN_COOKIE_NAME, response.accessToken, options);
Cookies.set(API_REFRESH_TOKEN_COOKIE_NAME, response.refreshToken, options); Cookies.set(API_REFRESH_TOKEN_COOKIE_NAME, response.refreshToken, options);
Cookies.set("uid", response.uid, options); Cookies.set("uid", response.id, options);
return response; return response;
} catch (e) { } catch (e) {

View File

@@ -12,7 +12,7 @@ export class Checkbox extends PDFElement {
throw new Error('Method not supported.'); throw new Error('Method not supported.');
} }
draw(page: PDFPage, x: number, y: number): void { async draw(page: PDFPage, x: number, y: number) {
page.drawRectangle({ page.drawRectangle({
x: x + this.borderWidth, x: x + this.borderWidth,
// NOTE: Keine Ahnung warum * 1.5 aber dann passt es... // NOTE: Keine Ahnung warum * 1.5 aber dann passt es...

View File

@@ -103,15 +103,15 @@ export class Flex extends PDFElement {
return currentWidth; return currentWidth;
} }
draw(page: PDFPage, x: number = this.x, y: number = this.y): void { async draw(page: PDFPage, x: number = this.x, y: number = this.y) {
const childPositions = this.calculateChildPositions(x + this.margin.left + this.padding.left, y - this.margin.top - this.padding.top); const childPositions = this.calculateChildPositions(x + this.margin.left + this.padding.left, y - this.margin.top - this.padding.top);
// Draw each child for (let i = 0; i < this.children.length; i++) {
this.children.forEach((child, i) => { const child = this.children[i];
const pos = childPositions[i]; const pos = childPositions[i];
child.draw(page, pos.x, pos.y); await child.draw(page, pos.x, pos.y);
}); }
} }
private calculateChildPositions(x: number, y: number): { x: number; y: number }[] { private calculateChildPositions(x: number, y: number): { x: number; y: number }[] {

View File

@@ -50,9 +50,9 @@ export class Image extends PDFElement {
return; return;
} }
if (this.options.src.split(".").pop() === "png") { try {
embed = await page.doc.embedPng(img) embed = await page.doc.embedPng(img)
} else { } catch(e) {
embed = await page.doc.embedJpg(img) embed = await page.doc.embedJpg(img)
} }
} else if (this.options.data) { } else if (this.options.data) {
@@ -73,8 +73,6 @@ export class Image extends PDFElement {
} }
} }
page.drawImage(embed, { page.drawImage(embed, {
x: x + this.margin.left + this.padding.left, x: x + this.margin.left + this.padding.left,
y: y - this.height - this.margin.top - this.padding.top, y: y - this.height - this.margin.top - this.padding.top,

View File

@@ -59,11 +59,11 @@ export class Layout extends PDFElement {
this._height = value; this._height = value;
} }
draw(page: PDFPage, x: number, y: number): void { async draw(page: PDFPage, x: number, y: number) {
let currentY = y - this.margin.top - this.padding.top; let currentY = y - this.margin.top - this.padding.top;
for (const child of this.children) { for (const child of this.children) {
child.draw(page, x + this.margin.left + this.padding.left, currentY); await child.draw(page, x + this.margin.left + this.padding.left, currentY);
currentY -= child.height + child.margin.top + child.margin.bottom; currentY -= child.height + child.margin.top + child.margin.bottom;
} }

View File

@@ -32,7 +32,9 @@ export abstract class PDFElement {
return this._height === "auto" ? 0 : this._height; return this._height === "auto" ? 0 : this._height;
} }
abstract draw(page: PDFPage, x: number, y: number): void; async draw(page: PDFPage, x: number, y: number): Promise<void> {
throw new Error("Method is not implemented.")
}
abstract addChild(...children: PDFElement[]): void; abstract addChild(...children: PDFElement[]): void;
} }

View File

@@ -49,7 +49,7 @@ export class Text extends PDFElement {
return this._width + this.padding.left + this.padding.right; return this._width + this.padding.left + this.padding.right;
} }
draw(page: PDFPage, x: number, y: number): void { async draw(page: PDFPage, x: number, y: number): Promise<void> {
page.drawText(this.content, { page.drawText(this.content, {
x: x + this.margin.left + this.padding.left, x: x + this.margin.left + this.padding.left,
y: y - this.height - this.margin.top - this.padding.top, y: y - this.height - this.margin.top - this.padding.top,

View File

@@ -51,7 +51,7 @@ export function xml2pdf(xml: string, fonts: Record<string, PDFFont> & { "default
color = rgb(...colorValue.map((x) => parseInt(x) / 255) as [number, number, number]); color = rgb(...colorValue.map((x) => parseInt(x) / 255) as [number, number, number]);
} }
const text = new Text(child.children[0] || "", { font: child.attributes.hasOwnProperty("font") ? fonts[child.attributes["font"]] : fonts["default"], lineHeight: parseFloat(child.attributes.lineHeight), fontSize: parseFloat(child.attributes.size) || 10, color, margin: { const text = new Text(child.children[0] as string || "", { font: child.attributes.hasOwnProperty("font") ? fonts[child.attributes["font"]] : fonts["default"], lineHeight: parseFloat(child.attributes.lineHeight), fontSize: parseFloat(child.attributes.size) || 10, color, margin: {
bottom: parseFloat(child.attributes.marginBottom) || 0, bottom: parseFloat(child.attributes.marginBottom) || 0,
left: parseFloat(child.attributes.marginLeft) || 0, left: parseFloat(child.attributes.marginLeft) || 0,
right: parseFloat(child.attributes.marginRight) || 0, right: parseFloat(child.attributes.marginRight) || 0,
@@ -114,43 +114,4 @@ export function xml2pdf(xml: string, fonts: Record<string, PDFFont> & { "default
iterateChildren(tree, layout) iterateChildren(tree, layout)
return layout return layout
} }
// const pdf = await PDFDocument.create()
// const page = pdf.addPage()
// const font = await pdf.embedFont(StandardFonts.Helvetica)
// const bold = await pdf.embedFont(StandardFonts.HelveticaBold)
// console.log(page.getWidth(), "WIDTH");
// const layout = xml2pdf(`
// <flex direction="column" justify="end" width="${page.getWidth()}" height="${page.getHeight()}">
// <flex direction="row" gap="5" align="center">
// <checkbox width="8" height="8"></checkbox>
// <text size="12">awd1</text>
// </flex>
// <flex direction="row" gap="5" align="center">
// <checkbox width="8" height="8"></checkbox>
// <text size="12">awd2</text>
// </flex>
// <flex direction="row" gap="5" align="center">
// <checkbox width="8" height="8"></checkbox>
// <text size="12">awd3</text>
// </flex>
// <flex direction="row" gap="5" align="center">
// <checkbox width="8" height="8"></checkbox>
// <text size="12">awd4</text>
// </flex>
// </flex>`, {
// "default": font
// })
// layout.draw(page, 0, page.getHeight())
// import { writeFileSync } from "fs"
// import { FixedLengthArray } from "#lib/Berechnungen/BedarfsausweisWohnen/types.js"
// writeFileSync("./test-pdf.pdf", await pdf.save())

View File

@@ -165,14 +165,14 @@ export async function pdfDatenblattVerbrauchsausweisGewerbe(ausweis: Verbrauchsa
</flex> </flex>
<flex direction="column" gap="4"> <flex direction="column" gap="4">
<text></text> <text></text>
<text size="12" font="bold">${aufnahme.brennstoff_1}</text> <text size="12" font="bold">${ausweis.brennstoff_1}</text>
<text size="12">${ausweis.verbrauch_1} ${ausweis.einheit_1}</text> <text size="12">${ausweis.verbrauch_1} ${ausweis.einheit_1}</text>
<text size="12">${ausweis.verbrauch_2} ${ausweis.einheit_1}</text> <text size="12">${ausweis.verbrauch_2} ${ausweis.einheit_1}</text>
<text size="12">${ausweis.verbrauch_3} ${ausweis.einheit_1}</text> <text size="12">${ausweis.verbrauch_3} ${ausweis.einheit_1}</text>
</flex> </flex>
<flex direction="column" gap="4"> <flex direction="column" gap="4">
<text size="12">zusätzliche Heizquelle</text> <text size="12">zusätzliche Heizquelle</text>
<text size="12" font="bold">${aufnahme.brennstoff_2 || ""}</text> <text size="12" font="bold">${ausweis.brennstoff_2 || ""}</text>
<text size="12">${ausweis.verbrauch_4 || ""} ${ausweis.einheit_2 || ""}</text> <text size="12">${ausweis.verbrauch_4 || ""} ${ausweis.einheit_2 || ""}</text>
<text size="12">${ausweis.verbrauch_5 || ""} ${ausweis.einheit_2 || ""}</text> <text size="12">${ausweis.verbrauch_5 || ""} ${ausweis.einheit_2 || ""}</text>
<text size="12">${ausweis.verbrauch_6 || ""} ${ausweis.einheit_2 || ""}</text> <text size="12">${ausweis.verbrauch_6 || ""} ${ausweis.einheit_2 || ""}</text>
@@ -382,78 +382,9 @@ export async function pdfDatenblattVerbrauchsausweisGewerbe(ausweis: Verbrauchsa
${images.map(badge => `<flex direction="row" justify="space-between" width="${pages[2].getWidth() - 120}" height="${(pages[2].getHeight() - marginY * 2) / 4}" marginTop="15">${badge.join("")}</flex>`).join("")} ${images.map(badge => `<flex direction="row" justify="space-between" width="${pages[2].getWidth() - 120}" height="${(pages[2].getHeight() - marginY * 2) / 4}" marginTop="15">${badge.join("")}</flex>`).join("")}
</layout>`, { "default": font }) </layout>`, { "default": font })
layout.draw(pages[0], 0, pages[0].getHeight()) await layout.draw(pages[0], 0, pages[0].getHeight())
layoutPage2.draw(pages[1], 0, pages[1].getHeight()) await layoutPage2.draw(pages[1], 0, pages[1].getHeight())
layoutPage3.draw(pages[2], 0, pages[2].getHeight()) await layoutPage3.draw(pages[2], 0, pages[2].getHeight())
// const containerWidth = width - marginX;
// const layout = flex([
// flex([
// checkbox(8, 8), text("Neubau", {
// color: rgb(0,0,0),
// font,
// fontSize: 12
// })
// ], {
// align: "center",
// justify: "center",
// gap: 5,
// height: 12,
// page: pages[0]
// }),
// flex([
// checkbox(8, 8), text("Vermietung/Verkauf", {
// color: rgb(0,0,0),
// font,
// fontSize: 12
// })
// ], {
// align: "center",
// justify: "center",
// gap: 5,
// height: 12,
// page: pages[0]
// }),
// flex([
// checkbox(8, 8), text("Modernisierung", {
// color: rgb(0,0,0),
// font,
// fontSize: 12
// })
// ], {
// align: "center",
// justify: "center",
// gap: 5,
// height: 12,
// page: pages[0]
// }),
// flex([
// checkbox(8, 8), text("Sonstiges", {
// color: rgb(0,0,0),
// font,
// fontSize: 12
// })
// ], {
// align: "center",
// justify: "center",
// gap: 5,
// height: 12,
// page: pages[0]
// })
// ], {
// align: "center",
// justify: "space-between",
// gap: 15,
// x: marginX,
// y: height - marginY - 165,
// height: 12,
// width: containerWidth
// })
// layout.draw(pages[0])
// pdf.getForm().flatten()
return pdf.save(); return pdf.save();
} }

View File

@@ -131,14 +131,14 @@ export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: Verbrauchsau
</flex> </flex>
<flex direction="column" gap="4"> <flex direction="column" gap="4">
<text></text> <text></text>
<text size="12" font="bold">${aufnahme.brennstoff_1}</text> <text size="12" font="bold">${ausweis.brennstoff_1}</text>
<text size="12">${ausweis.verbrauch_1} ${ausweis.einheit_1}</text> <text size="12">${ausweis.verbrauch_1} ${ausweis.einheit_1}</text>
<text size="12">${ausweis.verbrauch_2} ${ausweis.einheit_1}</text> <text size="12">${ausweis.verbrauch_2} ${ausweis.einheit_1}</text>
<text size="12">${ausweis.verbrauch_3} ${ausweis.einheit_1}</text> <text size="12">${ausweis.verbrauch_3} ${ausweis.einheit_1}</text>
</flex> </flex>
<flex direction="column" gap="4"> <flex direction="column" gap="4">
<text size="12">zusätzliche Heizquelle</text> <text size="12">zusätzliche Heizquelle</text>
<text size="12" font="bold">${aufnahme.brennstoff_2 || ""}</text> <text size="12" font="bold">${ausweis.brennstoff_2 || ""}</text>
<text size="12">${ausweis.verbrauch_4 || ""} ${ausweis.einheit_2 || ""}</text> <text size="12">${ausweis.verbrauch_4 || ""} ${ausweis.einheit_2 || ""}</text>
<text size="12">${ausweis.verbrauch_5 || ""} ${ausweis.einheit_2 || ""}</text> <text size="12">${ausweis.verbrauch_5 || ""} ${ausweis.einheit_2 || ""}</text>
<text size="12">${ausweis.verbrauch_6 || ""} ${ausweis.einheit_2 || ""}</text> <text size="12">${ausweis.verbrauch_6 || ""} ${ausweis.einheit_2 || ""}</text>
@@ -298,7 +298,7 @@ export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: Verbrauchsau
const images: string[][] = [] const images: string[][] = []
for (const bild of bilder) { for (const bild of bilder) {
let badge: string[]; let batch: string[];
let image: string = ""; let image: string = "";
if (bild.kategorie === Enums.BilderKategorie.Gebaeude) { if (bild.kategorie === Enums.BilderKategorie.Gebaeude) {
@@ -310,26 +310,30 @@ export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: Verbrauchsau
} }
if (images.length > 0) { if (images.length > 0) {
let badge = images[images.length - 1] let batch = images[images.length - 1]
if (badge.length == 3) { if (batch.length == 3) {
badge = [image] batch = [image]
images.push(badge) images.push(batch)
} else { } else {
badge.push(image) batch.push(image)
} }
} else { } else {
badge = [image] batch = [image]
images.push(badge) images.push(batch)
} }
} }
const layoutPage3 = xml2pdf(`<layout height="${pages[2].getHeight()}" width="${pages[2].getWidth()}" marginTop="150" marginLeft="60" marginRight="60"> const layoutPage3 = xml2pdf(`<layout height="${pages[2].getHeight()}" width="${pages[2].getWidth()}" marginTop="150" marginLeft="60" marginRight="60">
${images.map(badge => `<flex direction="row" justify="space-between" width="${pages[2].getWidth() - 120}" height="${(pages[2].getHeight() - marginY * 2) / 4}" marginTop="15">${badge.join("")}</flex>`).join("")} ${images.map(batch => `<flex direction="row" justify="space-between" width="${pages[2].getWidth() - 120}" height="${(pages[2].getHeight() - marginY * 2) / 4}" marginTop="15">${batch.join("")}</flex>`).join("")}
</layout>`, { "default": font }) </layout>`, { "default": font })
layout.draw(pages[0], 0, pages[0].getHeight()) await layout.draw(pages[0], 0, pages[0].getHeight())
layoutPage2.draw(pages[1], 0, pages[1].getHeight()) await layoutPage2.draw(pages[1], 0, pages[1].getHeight())
layoutPage3.draw(pages[2], 0, pages[2].getHeight()) await layoutPage3.draw(pages[2], 0, pages[2].getHeight())
console.log("DONE");
return pdf.save(); return pdf.save();
} }

View File

@@ -66,7 +66,7 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
size: 10 size: 10
}) })
pages[0].drawText(`${aufnahme.brennstoff_1}, ${aufnahme.brennstoff_2 || ""}`, { pages[0].drawText(`${ausweis.brennstoff_1}, ${ausweis.brennstoff_2 || ""}`, {
x: 211, x: 211,
y: height - 285, y: height - 285,
size: 10 size: 10
@@ -97,7 +97,7 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
}) })
if (ausweis.warmwasser_enthalten) { if (ausweis.warmwasser_enthalten) {
pages[0].drawText(`${aufnahme.brennstoff_1}, ${aufnahme.brennstoff_2 || ""}`, { pages[0].drawText(`${ausweis.brennstoff_1}, ${ausweis.brennstoff_2 || ""}`, {
x: 211, x: 211,
y: height - 299, y: height - 299,
size: 10 size: 10
@@ -422,7 +422,7 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
addVerbrauch( addVerbrauch(
moment(ausweis.startdatum).format("MM.YYYY"), moment(ausweis.startdatum).format("MM.YYYY"),
moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"), moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
aufnahme.brennstoff_1 || "", ausweis.brennstoff_1 || "",
berechnungen?.brennstoff_1.primaerenergiefaktor.toString(), berechnungen?.brennstoff_1.primaerenergiefaktor.toString(),
Math.round(berechnungen?.energieVerbrauchGesamt_1 || 0).toString(), Math.round(berechnungen?.energieVerbrauchGesamt_1 || 0).toString(),
"0", "0",
@@ -436,7 +436,7 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
addVerbrauch( addVerbrauch(
moment(ausweis.startdatum).format("MM.YYYY"), moment(ausweis.startdatum).format("MM.YYYY"),
moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"), moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
aufnahme.brennstoff_1 || "", ausweis.brennstoff_1 || "",
berechnungen?.brennstoff_1.primaerenergiefaktor.toString(), berechnungen?.brennstoff_1.primaerenergiefaktor.toString(),
Math.round(berechnungen?.energieVerbrauchGesamt_1 || 0).toString(), Math.round(berechnungen?.energieVerbrauchGesamt_1 || 0).toString(),
Math.round(berechnungen?.energieVerbrauchWarmwasser_1 || 0).toString(), Math.round(berechnungen?.energieVerbrauchWarmwasser_1 || 0).toString(),
@@ -451,7 +451,7 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
addVerbrauch( addVerbrauch(
moment(ausweis.startdatum).format("MM.YYYY"), moment(ausweis.startdatum).format("MM.YYYY"),
moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"), moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
aufnahme.brennstoff_2 || "", ausweis.brennstoff_2 || "",
berechnungen?.brennstoff_2.primaerenergiefaktor.toString(), berechnungen?.brennstoff_2.primaerenergiefaktor.toString(),
Math.round(berechnungen?.energieVerbrauchGesamt_2 || 0).toString(), Math.round(berechnungen?.energieVerbrauchGesamt_2 || 0).toString(),
Math.round(berechnungen?.energieVerbrauchWarmwasser_2 || 0).toString(), Math.round(berechnungen?.energieVerbrauchWarmwasser_2 || 0).toString(),

View File

@@ -71,14 +71,14 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
size: 10 size: 10
}) })
pages[0].drawText(`${aufnahme.brennstoff_1}, ${aufnahme.brennstoff_2 || ""}`, { pages[0].drawText(`${ausweis.brennstoff_1}, ${ausweis.brennstoff_2 || ""}`, {
x: 211, x: 211,
y: height - 298.5, y: height - 298.5,
size: 10 size: 10
}) })
if (ausweis.warmwasser_enthalten) { if (ausweis.warmwasser_enthalten) {
pages[0].drawText(`${aufnahme.brennstoff_1}, ${aufnahme.brennstoff_2 || ""}`, { pages[0].drawText(`${ausweis.brennstoff_1}, ${ausweis.brennstoff_2 || ""}`, {
x: 211, x: 211,
y: height - 312, y: height - 312,
size: 10 size: 10
@@ -111,7 +111,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
}) })
if (ausweis.warmwasser_enthalten) { if (ausweis.warmwasser_enthalten) {
pages[0].drawText(`${aufnahme.brennstoff_1}, ${aufnahme.brennstoff_2 || ""}`, { pages[0].drawText(`${ausweis.brennstoff_1}, ${ausweis.brennstoff_2 || ""}`, {
x: 211, x: 211,
y: height - 299, y: height - 299,
size: 10 size: 10
@@ -414,7 +414,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
addVerbrauch( addVerbrauch(
moment(ausweis.startdatum).format("MM.YYYY"), moment(ausweis.startdatum).format("MM.YYYY"),
moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"), moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
aufnahme.brennstoff_1 || "", ausweis.brennstoff_1 || "",
berechnungen?.brennstoff_1.primaerenergiefaktor.toString(), berechnungen?.brennstoff_1.primaerenergiefaktor.toString(),
Math.round(berechnungen?.energieVerbrauchGesamt_1 || 0).toString(), Math.round(berechnungen?.energieVerbrauchGesamt_1 || 0).toString(),
"0", "0",
@@ -426,7 +426,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
addVerbrauch( addVerbrauch(
moment(ausweis.startdatum).format("MM.YYYY"), moment(ausweis.startdatum).format("MM.YYYY"),
moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"), moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
aufnahme.brennstoff_1 || "", ausweis.brennstoff_1 || "",
berechnungen?.brennstoff_1.primaerenergiefaktor.toString(), berechnungen?.brennstoff_1.primaerenergiefaktor.toString(),
Math.round(berechnungen?.energieVerbrauchGesamt_1 || 0).toString(), Math.round(berechnungen?.energieVerbrauchGesamt_1 || 0).toString(),
Math.round(berechnungen?.energieVerbrauchWarmwasser_1 || 0).toString(), Math.round(berechnungen?.energieVerbrauchWarmwasser_1 || 0).toString(),
@@ -439,7 +439,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
addVerbrauch( addVerbrauch(
moment(ausweis.startdatum).format("MM.YYYY"), moment(ausweis.startdatum).format("MM.YYYY"),
moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"), moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
aufnahme.brennstoff_2 || "", ausweis.brennstoff_2 || "",
berechnungen?.brennstoff_2.primaerenergiefaktor.toString(), berechnungen?.brennstoff_2.primaerenergiefaktor.toString(),
Math.round(berechnungen?.energieVerbrauchGesamt_2 || 0).toString(), Math.round(berechnungen?.energieVerbrauchGesamt_2 || 0).toString(),
Math.round(berechnungen?.energieVerbrauchWarmwasser_2 || 0).toString(), Math.round(berechnungen?.energieVerbrauchWarmwasser_2 || 0).toString(),

View File

@@ -1,5 +1,6 @@
import { GetObjectCommand, S3Client } from "@aws-sdk/client-s3"; import { GetObjectCommand, S3Client } from "@aws-sdk/client-s3";
import * as fs from "fs"; import * as fs from "fs";
import { tryCatch } from "./tryCatch.js";
export const s3Client = new S3Client({ export const s3Client = new S3Client({
region: "eu-central-1", region: "eu-central-1",
@@ -17,21 +18,18 @@ export async function getS3File(
bucket: string, bucket: string,
key: string key: string
): Promise<Buffer | null> { ): Promise<Buffer | null> {
try { let command = new GetObjectCommand({ Bucket: bucket, Key: key });
let command = new GetObjectCommand({ Bucket: bucket, Key: key });
let response = await s3Client.send(command);
const body = response.Body; let [response, error] = await tryCatch(s3Client.send(command));
if (!body) { if (error || response === null) {
return null;
}
let buffer = await streamToBuffer(body as unknown as fs.ReadStream);
return buffer;
} catch (e) {
return null; return null;
} }
const body = response.Body;
let buffer = await streamToBuffer(body as unknown as fs.ReadStream);
return buffer;
} }
async function streamToBuffer(stream: fs.ReadStream): Promise<Buffer> { async function streamToBuffer(stream: fs.ReadStream): Promise<Buffer> {

View File

@@ -1,4 +1,4 @@
import { AufnahmeClient, BedarfsausweisWohnenClient, BenutzerClient, BildClient, getAusweisartFromUUID, ObjektClient, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js"; import { AufnahmeClient, BedarfsausweisWohnenClient, BenutzerClient, BildClient, getAusweisartFromId, ObjektClient, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
import { pdfDatenblattVerbrauchsausweisGewerbe } from "#lib/pdf/pdfDatenblattVerbrauchsausweisGewerbe.js"; import { pdfDatenblattVerbrauchsausweisGewerbe } from "#lib/pdf/pdfDatenblattVerbrauchsausweisGewerbe.js";
import { pdfDatenblattVerbrauchsausweisWohnen } from "#lib/pdf/pdfDatenblattVerbrauchsausweisWohnen.js"; import { pdfDatenblattVerbrauchsausweisWohnen } from "#lib/pdf/pdfDatenblattVerbrauchsausweisWohnen.js";
import { pdfVerbrauchsausweisGewerbe } from "#lib/pdf/pdfVerbrauchsausweisGewerbe.js"; import { pdfVerbrauchsausweisGewerbe } from "#lib/pdf/pdfVerbrauchsausweisGewerbe.js";
@@ -10,7 +10,7 @@ import { Enums, prisma } from "#lib/server/prisma.js";
* @param id Die Ausweis UID * @param id Die Ausweis UID
*/ */
export function getPrismaAusweisAdapter(id: string) { export function getPrismaAusweisAdapter(id: string) {
const ausweisart = getAusweisartFromUUID(id); const ausweisart = getAusweisartFromId(id);
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) { if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
return prisma.verbrauchsausweisWohnen return prisma.verbrauchsausweisWohnen
@@ -25,7 +25,7 @@ export function getPrismaAusweisAdapter(id: string) {
* Gibt den richtigen Ansichtsausweis basierend auf der Ausweisart zurück. * Gibt den richtigen Ansichtsausweis basierend auf der Ausweisart zurück.
* @param ausweis * @param ausweis
*/ */
export async function getAnsichtsausweis(ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: BildClient[], user: BenutzerClient, ausweisart = getAusweisartFromUUID(ausweis.uid)) { export async function getAnsichtsausweis(ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: BildClient[], user: BenutzerClient, ausweisart = getAusweisartFromId(ausweis.uid)) {
if (!ausweisart) { if (!ausweisart) {
return null return null
} }
@@ -43,7 +43,7 @@ export async function getAnsichtsausweis(ausweis: VerbrauchsausweisWohnenClient
* Gibt das richtige Datenblatt basierend auf der Ausweisart zurück. * Gibt das richtige Datenblatt basierend auf der Ausweisart zurück.
* @param ausweis * @param ausweis
*/ */
export async function getDatenblatt(ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: BildClient[], user: BenutzerClient, ausweisart = getAusweisartFromUUID(ausweis.uid)) { export async function getDatenblatt(ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: BildClient[], user: BenutzerClient, ausweisart = getAusweisartFromId(ausweis.uid)) {
if (!ausweisart) { if (!ausweisart) {
return null return null
} }

View File

@@ -1,4 +1,4 @@
import { Aufnahme, Bild, Objekt, prisma, VerbrauchsausweisWohnen } from "./prisma.js"; import { Aufnahme, BedarfsausweisGewerbe, BedarfsausweisWohnen, Bild, GEGNachweisGewerbe, GEGNachweisWohnen, Objekt, prisma, Unterlage, VerbrauchsausweisGewerbe, VerbrauchsausweisWohnen } from "./prisma.js";
export async function getVerbrauchsausweisWohnen(id: string): Promise<VerbrauchsausweisWohnen | null> { export async function getVerbrauchsausweisWohnen(id: string): Promise<VerbrauchsausweisWohnen | null> {
return await prisma.verbrauchsausweisWohnen.findUnique({ return await prisma.verbrauchsausweisWohnen.findUnique({
@@ -8,6 +8,46 @@ export async function getVerbrauchsausweisWohnen(id: string): Promise<Verbrauchs
}) })
} }
export async function getVerbrauchsausweisGewerbe(id: string): Promise<VerbrauchsausweisGewerbe | null> {
return await prisma.verbrauchsausweisGewerbe.findUnique({
where: {
id
}
})
}
export async function getBedarfsausweisWohnen(id: string): Promise<BedarfsausweisWohnen | null> {
return await prisma.bedarfsausweisWohnen.findUnique({
where: {
id
}
})
}
export async function getBedarfsausweisGewerbe(id: string): Promise<BedarfsausweisGewerbe | null> {
return await prisma.bedarfsausweisGewerbe.findUnique({
where: {
id
}
})
}
export async function getGEGNachweisWohnen(id: string): Promise<GEGNachweisWohnen | null> {
return await prisma.gEGNachweisWohnen.findUnique({
where: {
id
}
})
}
export async function getGEGNachweisGewerbe(id: string): Promise<GEGNachweisGewerbe | null> {
return await prisma.gEGNachweisGewerbe.findUnique({
where: {
id
}
})
}
export async function getAufnahme(id: string): Promise<Aufnahme | null> { export async function getAufnahme(id: string): Promise<Aufnahme | null> {
return await prisma.aufnahme.findUnique({ return await prisma.aufnahme.findUnique({
where: { where: {
@@ -30,4 +70,12 @@ export async function getBilder(aufnahme_id: string): Promise<Bild[]> {
aufnahme_id aufnahme_id
} }
}) })
}
export async function getUnterlagen(aufnahme_id: string): Promise<Unterlage[]> {
return await prisma.unterlage.findMany({
where: {
aufnahme_id
}
})
} }

View File

@@ -1,4 +1,4 @@
import { getAusweisartFromUUID } from "#components/Ausweis/types.js"; import { getAusweisartFromId } from "#components/Ausweis/types.js";
import { BASE_URI } from "#lib/constants.js"; import { BASE_URI } from "#lib/constants.js";
import { transport } from "#lib/mail.js"; import { transport } from "#lib/mail.js";
import { import {
@@ -32,7 +32,7 @@ export async function sendInvoiceMail(
return; return;
} }
const ausweisart = getAusweisartFromUUID(ausweis.id); const ausweisart = getAusweisartFromId(ausweis.id);
if (!ausweisart) { if (!ausweisart) {
return return

View File

@@ -1,4 +1,4 @@
import { getAusweisartFromUUID } from "#components/Ausweis/types.js"; import { getAusweisartFromId } from "#components/Ausweis/types.js";
import { transport } from "#lib/mail.js"; import { transport } from "#lib/mail.js";
import { import {
Benutzer, Benutzer,
@@ -32,7 +32,7 @@ export async function sendPaymentSuccessMail(
} }
let info: string = ""; let info: string = "";
const ausweisart = getAusweisartFromUUID(ausweis.id); const ausweisart = getAusweisartFromId(ausweis.id);
if (!ausweisart) { if (!ausweisart) {
return; return;

View File

@@ -41,15 +41,21 @@
export let ausweisart: Enums.Ausweisart; export let ausweisart: Enums.Ausweisart;
export let aktiveBezahlmethode: Bezahlmethoden = Enums.Bezahlmethoden.paypal; export let aktiveBezahlmethode: Bezahlmethoden = Enums.Bezahlmethoden.paypal;
let email = localStorage.getItem("kundendaten.email") || user.email || "";
let vorname = localStorage.getItem("kundendaten.vorname") || user.vorname || ""; let email: string, vorname: string, name: string, empfaenger: string, strasse: string, plz: string, ort: string, zusatzzeile: string, telefon: string;
let name = localStorage.getItem("kundendaten.name") || user.name || "";
let empfaenger = localStorage.getItem("kundendaten.empfaenger") || (user.vorname && user.name ? `${user.vorname} ${user.name}` : "") if (user.rolle !== Enums.BenutzerRolle.ADMIN) {
let strasse = localStorage.getItem("kundendaten.strasse") || user.adresse || ""; // Falls der aktuelle Benutzer kein Admin ist können wir die Kundendaten aus den Stammdaten vorausfüllen.
let plz = localStorage.getItem("kundendaten.plz") || user.plz || ""; email = localStorage.getItem("kundendaten.email") || user.email || "";
let ort = localStorage.getItem("kundendaten.ort") || user.ort || ""; vorname = localStorage.getItem("kundendaten.vorname") || user.vorname || "";
let zusatzzeile = localStorage.getItem("kundendaten.zusatzzeile") || "" name = localStorage.getItem("kundendaten.name") || user.name || "";
let telefon = localStorage.getItem("kundendaten.telefon") || user.telefon || ""; empfaenger = localStorage.getItem("kundendaten.empfaenger") || (user.vorname && user.name ? `${user.vorname} ${user.name}` : "")
strasse = localStorage.getItem("kundendaten.strasse") || user.adresse || "";
plz = localStorage.getItem("kundendaten.plz") || user.plz || "";
ort = localStorage.getItem("kundendaten.ort") || user.ort || "";
zusatzzeile = localStorage.getItem("kundendaten.zusatzzeile") || ""
telefon = localStorage.getItem("kundendaten.telefon") || user.telefon || "";
}
let abweichende_versand_adresse = JSON.parse(localStorage.getItem("kundendaten.abweichende_versand_adresse") || "false") let abweichende_versand_adresse = JSON.parse(localStorage.getItem("kundendaten.abweichende_versand_adresse") || "false")
@@ -71,6 +77,7 @@
} }
$: { $: {
// Wir speichern jede Änderung an den Kundendaten im localStorage ab.
localStorage.setItem("kundendaten.email", email) localStorage.setItem("kundendaten.email", email)
localStorage.setItem("kundendaten.vorname", vorname) localStorage.setItem("kundendaten.vorname", vorname)
localStorage.setItem("kundendaten.name", name) localStorage.setItem("kundendaten.name", name)
@@ -187,7 +194,7 @@
versand_plz: versand_plz, versand_plz: versand_plz,
versand_ort: versand_ort, versand_ort: versand_ort,
telefon: telefon, telefon: telefon,
nachweis_uid: result.uid_nachweis, nachweis_id: result.nachweis_id,
}, },
{ {
headers: { headers: {
@@ -199,7 +206,7 @@
// Alle alten Ausweisdateien im localStorage löschen. // Alle alten Ausweisdateien im localStorage löschen.
localStorage.clear(); localStorage.clear();
window.location.href = `/einpreisung/success?e=${uid}&a=${result.uid_nachweis}`; window.location.href = `/einpreisung/success?e=${uid}&a=${result.nachweis_id}`;
} catch (e) { } catch (e) {
addNotification({ addNotification({
dismissable: true, dismissable: true,

View File

@@ -58,7 +58,8 @@
export let id: string | null; export let id: string | null;
// Falls die Daten im localStorage neuer sind als der Ausweis den wir von der Datenbank bekommen haben, benutzen wir lieber diese. // Falls die Daten im localStorage neuer sind als der Ausweis den wir von der Datenbank bekommen haben, benutzen wir lieber diese.
if (!id && (!ausweis.updated_at || moment(localStorage.getItem("verbrauchsausweis-wohnen.updated_at") || new Date()).isAfter(ausweis.updated_at))) { // Wir schauen auch ob der Benutzer nicht vielleicht ein Admin ist, dann sollten wir nichts aus dem localStorage holen.
if ((user && user.rolle !== Enums.BenutzerRolle.ADMIN) && !id && (!ausweis.updated_at || moment(localStorage.getItem("verbrauchsausweis-wohnen.updated_at") || new Date()).isAfter(ausweis.updated_at))) {
const localStorageAusweis = localStorage.getItem("verbrauchsausweis-wohnen.ausweis"); const localStorageAusweis = localStorage.getItem("verbrauchsausweis-wohnen.ausweis");
if (localStorageAusweis) { if (localStorageAusweis) {
ausweis = JSON.parse(localStorageAusweis) ausweis = JSON.parse(localStorageAusweis)

View File

@@ -5,11 +5,10 @@
AufnahmeClient, AufnahmeClient,
BenutzerClient, BenutzerClient,
UnterlageClient, UnterlageClient,
GEGNachweisWohnenClient,
BildClient, BildClient,
} from "#components/Ausweis/types.js"; } from "#components/Ausweis/types.js";
import Bereich from "#components/labels/Bereich.svelte"; import Bereich from "#components/labels/Bereich.svelte";
import { Enums } from "#lib/client/prisma.js"; import { BedarfsausweisGewerbe, Enums } from "#lib/client/prisma.js";
import Progressbar from "#components/Ausweis/Progressbar.svelte"; import Progressbar from "#components/Ausweis/Progressbar.svelte";
import FileGrid from "#components/FileGrid.svelte"; import FileGrid from "#components/FileGrid.svelte";
import ButtonWeiterHilfe from "#components/Ausweis/ButtonWeiterHilfe.svelte"; import ButtonWeiterHilfe from "#components/Ausweis/ButtonWeiterHilfe.svelte";
@@ -18,57 +17,45 @@
import SanierungszustandFensterTueren from "#components/Ausweis/SanierungszustandFensterTueren.svelte"; import SanierungszustandFensterTueren from "#components/Ausweis/SanierungszustandFensterTueren.svelte";
import SanierungszustandWaermedammung from "#components/Ausweis/SanierungszustandWaermedammung.svelte"; import SanierungszustandWaermedammung from "#components/Ausweis/SanierungszustandWaermedammung.svelte";
import AnlagenTechnik from "#components/Ausweis/AnlagenTechnik.svelte"; import AnlagenTechnik from "#components/Ausweis/AnlagenTechnik.svelte";
import moment from "moment";
export let nachweis: GEGNachweisWohnenClient; export let nachweis: BedarfsausweisGewerbe;
export let objekt: ObjektClient; export let objekt: ObjektClient;
export let aufnahme: AufnahmeClient; export let aufnahme: AufnahmeClient;
export let user: BenutzerClient = {} as BenutzerClient; export let user: BenutzerClient = {} as BenutzerClient;
export let bilder: BildClient[] = []; export let bilder: BildClient[] = [];
export let plaene: UnterlageClient[] = []; export let plaene: UnterlageClient[] = [];
export let unterlagen: UnterlageClient[] = []; export let unterlagen: UnterlageClient[] = [];
export let ausweistyp: Enums.AusweisTyp;
export let id: string | null;
if (Object.keys(nachweis).length === 0) { // Falls die Daten im localStorage neuer sind als der Ausweis den wir von der Datenbank bekommen haben, benutzen wir lieber diese.
const localStorageAusweis = localStorage.getItem( // Wir schauen auch ob der Benutzer nicht vielleicht ein Admin ist, dann sollten wir nichts aus dem localStorage holen.
"geg-nachweis-wohnen.ausweis" if ((user && user.rolle !== Enums.BenutzerRolle.ADMIN) && !id && (!nachweis.updated_at || moment(localStorage.getItem("geg-nachweis-wohnen.updated_at") || new Date()).isAfter(nachweis.updated_at))) {
); const localStorageAusweis = localStorage.getItem("geg-nachweis-wohnen.ausweis");
if (localStorageAusweis) { if (localStorageAusweis) {
nachweis = JSON.parse(localStorageAusweis); nachweis = JSON.parse(localStorageAusweis)
nachweis.nachweistyp = ausweistyp;
} }
}
if (Object.keys(aufnahme).length === 0) { const localStorageAufnahme = localStorage.getItem("geg-nachweis-wohnen.aufnahme");
const localStorageAufnahme = localStorage.getItem(
"geg-nachweis-wohnen.aufnahme"
);
if (localStorageAufnahme) { if (localStorageAufnahme) {
aufnahme = JSON.parse(localStorageAufnahme); aufnahme = JSON.parse(localStorageAufnahme)
} }
}
if (Object.keys(objekt).length === 0) { const localStorageObjekt = localStorage.getItem("geg-nachweis-wohnen.objekt");
const localStorageObjekt = localStorage.getItem(
"geg-nachweis-wohnen.objekt"
);
if (localStorageObjekt) { if (localStorageObjekt) {
objekt = JSON.parse(localStorageObjekt); objekt = JSON.parse(localStorageObjekt)
} }
}
if (Object.keys(bilder).length === 0) { const localStorageBilder = localStorage.getItem("geg-nachweis-wohnen.bilder");
const localStorageBilder = localStorage.getItem(
"geg-nachweis-wohnen.bilder"
);
if (localStorageBilder) { if (localStorageBilder) {
bilder = JSON.parse(localStorageBilder); bilder = JSON.parse(localStorageBilder)
} }
}
if (Object.keys(unterlagen).length === 0) { const localStorageUnterlagen = localStorage.getItem("geg-nachweis-wohnen.unterlagen");
const localStorageUnterlagen = localStorage.getItem(
"geg-nachweis-wohnen.unterlagen"
);
if (localStorageUnterlagen) { if (localStorageUnterlagen) {
unterlagen = JSON.parse(localStorageUnterlagen); bilder = JSON.parse(localStorageUnterlagen)
} }
} }
@@ -112,6 +99,7 @@
{ausweisart} {ausweisart}
{anliegen} {anliegen}
steps={["Gebäudedaten", "Kundendaten", "Anfragebestätigung"]} steps={["Gebäudedaten", "Kundendaten", "Anfragebestätigung"]}
{ausweistyp}
/> />
</div> </div>
@@ -123,7 +111,7 @@
<GEGAusweisart <GEGAusweisart
bind:objekt bind:objekt
bind:aufnahme bind:aufnahme
bind:ausweis={nachweis} bind:nachweis={nachweis}
{ausweisart} {ausweisart}
/> />
</Bereich> </Bereich>

View File

@@ -9,64 +9,50 @@
BildClient, BildClient,
} from "#components/Ausweis/types.js"; } from "#components/Ausweis/types.js";
import Bereich from "#components/labels/Bereich.svelte"; import Bereich from "#components/labels/Bereich.svelte";
import { Enums } from "#lib/client/prisma.js"; import { Enums, Unterlage } from "#lib/client/prisma.js";
import InputLabel from "#components/labels/InputLabel.svelte"; import InputLabel from "#components/labels/InputLabel.svelte";
import HelpLabel from "#components/labels/HelpLabel.svelte"; import HelpLabel from "#components/labels/HelpLabel.svelte";
import Progressbar from "#components/Ausweis/Progressbar.svelte"; import Progressbar from "#components/Ausweis/Progressbar.svelte";
import FileGrid from "#components/FileGrid.svelte"; import FileGrid from "#components/FileGrid.svelte";
import ButtonWeiterHilfe from "#components/Ausweis/ButtonWeiterHilfe.svelte"; import ButtonWeiterHilfe from "#components/Ausweis/ButtonWeiterHilfe.svelte";
import GEGAusweisart from "#components/GEGNachweis/GEGAusweisart.svelte"; import GEGAusweisart from "#components/GEGNachweis/GEGAusweisart.svelte";
import moment from "moment";
export let nachweis: GEGNachweisWohnenClient; export let nachweis: GEGNachweisWohnenClient;
export let objekt: ObjektClient; export let objekt: ObjektClient;
export let aufnahme: AufnahmeClient; export let aufnahme: AufnahmeClient;
export let user: BenutzerClient = {} as BenutzerClient; export let user: BenutzerClient = {} as BenutzerClient;
export let bilder: BildClient[] = []; export let bilder: BildClient[] = [];
export let plaene: UnterlageClient[] = []; export let plaene: Unterlage[] = [];
export let unterlagen: UnterlageClient[] = []; export let unterlagen: Unterlage[] = [];
export let nachweistyp: Enums.AusweisTyp = Enums.AusweisTyp.Standard;
export let id: string | null;
if (Object.keys(nachweis).length === 0) { if ((user && user.rolle !== Enums.BenutzerRolle.ADMIN) && !id && (!nachweis.updated_at || moment(localStorage.getItem("geg-nachweis-wohnen.updated_at") || new Date()).isAfter(nachweis.updated_at))) {
const localStorageAusweis = localStorage.getItem( const localStorageNachweis = localStorage.getItem("geg-nachweis-wohnen.ausweis");
"geg-nachweis-wohnen.ausweis" if (localStorageNachweis) {
); nachweis = JSON.parse(localStorageNachweis)
if (localStorageAusweis) { nachweis.nachweistyp = nachweistyp;
nachweis = JSON.parse(localStorageAusweis);
} }
}
if (Object.keys(aufnahme).length === 0) { const localStorageAufnahme = localStorage.getItem("geg-nachweis-wohnen.aufnahme");
const localStorageAufnahme = localStorage.getItem(
"geg-nachweis-wohnen.aufnahme"
);
if (localStorageAufnahme) { if (localStorageAufnahme) {
aufnahme = JSON.parse(localStorageAufnahme); aufnahme = JSON.parse(localStorageAufnahme)
} }
}
if (Object.keys(objekt).length === 0) { const localStorageObjekt = localStorage.getItem("geg-nachweis-wohnen.objekt");
const localStorageObjekt = localStorage.getItem(
"geg-nachweis-wohnen.objekt"
);
if (localStorageObjekt) { if (localStorageObjekt) {
objekt = JSON.parse(localStorageObjekt); objekt = JSON.parse(localStorageObjekt)
} }
}
if (Object.keys(bilder).length === 0) { const localStorageBilder = localStorage.getItem("geg-nachweis-wohnen.bilder");
const localStorageBilder = localStorage.getItem(
"geg-nachweis-wohnen.bilder"
);
if (localStorageBilder) { if (localStorageBilder) {
bilder = JSON.parse(localStorageBilder); bilder = JSON.parse(localStorageBilder)
} }
}
if (Object.keys(unterlagen).length === 0) { const localStorageUnterlagen = localStorage.getItem("geg-nachweis-wohnen.unterlagen");
const localStorageUnterlagen = localStorage.getItem(
"geg-nachweis-wohnen.unterlagen"
);
if (localStorageUnterlagen) { if (localStorageUnterlagen) {
unterlagen = JSON.parse(localStorageUnterlagen); unterlagen = JSON.parse(localStorageUnterlagen)
} }
} }
@@ -110,6 +96,7 @@
{ausweisart} {ausweisart}
{anliegen} {anliegen}
steps={["Gebäudedaten", "Kundendaten", "Anfragebestätigung"]} steps={["Gebäudedaten", "Kundendaten", "Anfragebestätigung"]}
ausweistyp={nachweistyp}
/> />
</div> </div>
@@ -121,7 +108,7 @@
<GEGAusweisart <GEGAusweisart
bind:objekt bind:objekt
bind:aufnahme bind:aufnahme
bind:ausweis={nachweis} bind:nachweis
{ausweisart} {ausweisart}
/> />
</Bereich> </Bereich>

View File

@@ -1,90 +1,88 @@
--- ---
import AusweisLayout from "#layouts/AusweisLayoutDaten.astro"; import AusweisLayout from "#layouts/AusweisLayoutDaten.astro";
import { AufnahmeClient, BildClient, GEGNachweisWohnenClient, ObjektClient, UnterlageClient } from "#components/Ausweis/types"; import VerbrauchsausweisWohnenModule from "#modules/VerbrauchsausweisWohnen/VerbrauchsausweisWohnenModule.svelte";
import { createCaller } from "src/astro-typesafe-api-caller"; import { AufnahmeClient, BildClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js"; import { Aufnahme, BedarfsausweisGewerbe, Bild, Enums, Objekt, Unterlage, VerbrauchsausweisWohnen } from "#lib/server/prisma";
import { validateAccessTokenServer } from "#server/lib/validateAccessToken.js"; import { getAufnahme, getBedarfsausweisGewerbe, getBilder, getObjekt, getUnterlagen, getVerbrauchsausweisWohnen } from "#lib/server/db";
import { getCurrentUser } from "#lib/server/user";
import BedarfsausweisGewerbeModule from "#modules/angebot-anfragen/BedarfsausweisGewerbeModule.svelte"; import BedarfsausweisGewerbeModule from "#modules/angebot-anfragen/BedarfsausweisGewerbeModule.svelte";
const uid = Astro.url.searchParams.get("uid"); const id = Astro.url.searchParams.get("id");
let nachweis: GEGNachweisWohnenClient = {} as GEGNachweisWohnenClient; const aufnahme_id = Astro.url.searchParams.get("aufnahme")
let aufnahme: AufnahmeClient = {} as AufnahmeClient; let ausweistyp = Astro.url.searchParams.get("ausweistyp") as Enums.AusweisTyp || Enums.AusweisTyp.Standard;
let objekt: ObjektClient = {} as ObjektClient;
let bilder: BildClient[] = []
let unterlagen: UnterlageClient[] = []
const valid = validateAccessTokenServer(Astro); let nachweis: BedarfsausweisGewerbe = {} as BedarfsausweisGewerbe;
let aufnahme: Aufnahme = {} as Aufnahme;
let objekt: Objekt = {} as Objekt;
let bilder: Bild[] = []
let unterlagen: Unterlage[] = []
const caller = createCaller(Astro); const user = await getCurrentUser(Astro)
if (uid) { if (id) {
if (!valid) { if (!user) {
return Astro.redirect( return Astro.redirect(
`/auth/login?redirect=${Astro.url.toString()}` `/auth/login?redirect=${Astro.url.toString()}`
); );
} }
try { nachweis = await getBedarfsausweisGewerbe(id) as BedarfsausweisGewerbe
nachweis = await caller["bedarfsausweis-gewerbe"]._uid.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid
}
});
aufnahme = await caller.aufnahme._uid.GET.fetch(null, { if (!nachweis || nachweis.benutzer_id !== user.id) {
headers: { // Der Ausweis scheint nicht zu existieren.
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` // Wir leiten auf die generische Ausweisseite ohne ID weiter.
},
params: {
uid: nachweis.uid_aufnahme
}
})
objekt = await caller.objekt._uid.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid: nachweis.uid_objekt
}
})
bilder = await caller.aufnahme._uid.bilder.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid: nachweis.uid_aufnahme
}
})
unterlagen = await caller.aufnahme._uid.unterlagen.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid: nachweis.uid_aufnahme
}
})
if (!nachweis) {
// Der Ausweis scheint nicht zu existieren.
// Wir leiten auf die generische Ausweisseite ohne UID weiter.
return Astro.redirect(
"/angebot-anfragen/bedarfsausweis-gewerbe-anfragen"
);
}
} catch(e) {
return Astro.redirect( return Astro.redirect(
"/angebot-anfragen/bedarfsausweis-gewerbe-anfragen" "/energieausweis-erstellen/verbrauchsausweis-wohngebaeude"
);
}
aufnahme = await getAufnahme(nachweis.aufnahme_id) as Aufnahme
if (!aufnahme) {
// Die Aufnahme existiert nicht, das sollte eigentlich nicht passieren aber so können wir nicht fortfahren.
return Astro.redirect(
"/energieausweis-erstellen/verbrauchsausweis-wohngebaeude"
);
}
objekt = await getObjekt(aufnahme.objekt_id) as Objekt
if (!objekt) {
// Das Objekt existiert nicht, das sollte eigentlich nicht passieren aber so können wir nicht fortfahren.
return Astro.redirect(
"/energieausweis-erstellen/verbrauchsausweis-wohngebaeude"
);
}
bilder = await getBilder(aufnahme.id);
unterlagen = await getUnterlagen(aufnahme.id);
} else if (aufnahme_id) {
if (!user) {
return Astro.redirect(
`/auth/login?redirect=${Astro.url.toString()}`
);
}
aufnahme = await getAufnahme(nachweis.aufnahme_id) as Aufnahme
if (!aufnahme) {
// Die Aufnahme existiert wohl nicht.
return Astro.redirect(
"/energieausweis-erstellen/verbrauchsausweis-wohngebaeude"
);
}
objekt = await getObjekt(aufnahme.objekt_id) as Objekt
if (!objekt) {
// Das Objekt existiert nicht.
return Astro.redirect(
"/energieausweis-erstellen/verbrauchsausweis-wohngebaeude"
); );
} }
} }
--- ---
<AusweisLayout title="Bedarfsausweis Gewerbe anfragen"> <AusweisLayout title="Bedarfsausweis Gewerbe anfragen">
<BedarfsausweisGewerbeModule client:only {nachweis} {objekt} {aufnahme} {bilder} {unterlagen} /> <BedarfsausweisGewerbeModule client:only {nachweis} {objekt} {aufnahme} {bilder} {unterlagen} {id} {ausweistyp} />
</AusweisLayout> </AusweisLayout>

View File

@@ -1,90 +1,87 @@
--- ---
import AusweisLayout from "#layouts/AusweisLayoutDaten.astro"; import AusweisLayout from "#layouts/AusweisLayoutDaten.astro";
import { AufnahmeClient, BildClient, GEGNachweisWohnenClient, ObjektClient, UnterlageClient } from "#components/Ausweis/types";
import { createCaller } from "src/astro-typesafe-api-caller";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
import { validateAccessTokenServer } from "#server/lib/validateAccessToken.js";
import GEGNachweisWohnenModule from "#modules/angebot-anfragen/GEGNachweisWohnenModule.svelte"; import GEGNachweisWohnenModule from "#modules/angebot-anfragen/GEGNachweisWohnenModule.svelte";
import { getGEGNachweisWohnen, getAufnahme, getObjekt, getBilder } from "#lib/server/db";
import { Enums, Aufnahme, Objekt, Bild, GEGNachweisWohnen, Unterlage } from "#lib/server/prisma";
import { getCurrentUser } from "#lib/server/user";
import { getUnterlagen } from "#lib/server/db";
const uid = Astro.url.searchParams.get("uid"); const id = Astro.url.searchParams.get("id");
let nachweis: GEGNachweisWohnenClient = {} as GEGNachweisWohnenClient; const aufnahme_id = Astro.url.searchParams.get("aufnahme")
let aufnahme: AufnahmeClient = {} as AufnahmeClient; let ausweistyp = Astro.url.searchParams.get("ausweistyp") as Enums.AusweisTyp || Enums.AusweisTyp.Standard;
let objekt: ObjektClient = {} as ObjektClient;
let bilder: BildClient[] = []
let unterlagen: UnterlageClient[] = []
const valid = validateAccessTokenServer(Astro); let nachweis: GEGNachweisWohnen = {} as GEGNachweisWohnen;
let aufnahme: Aufnahme = {} as Aufnahme;
let objekt: Objekt = {} as Objekt;
let bilder: Bild[] = []
let unterlagen: Unterlage[] = []
const caller = createCaller(Astro); const user = await getCurrentUser(Astro)
if (uid) { if (id) {
if (!valid) { if (!user) {
return Astro.redirect( return Astro.redirect(
`/auth/login?redirect=${Astro.url.toString()}` `/auth/login?redirect=${Astro.url.toString()}`
); );
} }
try { nachweis = await getGEGNachweisWohnen(id) as GEGNachweisWohnen
nachweis = await caller["geg-nachweis-wohnen"]._uid.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid
}
});
aufnahme = await caller.aufnahme._uid.GET.fetch(null, { if (!nachweis || nachweis.benutzer_id !== user.id) {
headers: { // Der Ausweis scheint nicht zu existieren.
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` // Wir leiten auf die generische Ausweisseite ohne ID weiter.
},
params: {
uid: nachweis.uid_aufnahme
}
})
objekt = await caller.objekt._uid.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid: nachweis.uid_objekt
}
})
bilder = await caller.aufnahme._uid.bilder.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid: nachweis.uid_aufnahme
}
})
unterlagen = await caller.aufnahme._uid.unterlagen.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid: nachweis.uid_aufnahme
}
})
if (!nachweis) {
// Der Ausweis scheint nicht zu existieren.
// Wir leiten auf die generische Ausweisseite ohne UID weiter.
return Astro.redirect(
"/angebot-anfragen/geg-nachweis-wohnen-anfragen"
);
}
} catch(e) {
return Astro.redirect( return Astro.redirect(
"/angebot-anfragen/geg-nachweis-wohnen-anfragen" "/energieausweis-erstellen/verbrauchsausweis-wohngebaeude"
);
}
aufnahme = await getAufnahme(nachweis.aufnahme_id) as Aufnahme
if (!aufnahme) {
// Die Aufnahme existiert nicht, das sollte eigentlich nicht passieren aber so können wir nicht fortfahren.
return Astro.redirect(
"/energieausweis-erstellen/verbrauchsausweis-wohngebaeude"
);
}
objekt = await getObjekt(aufnahme.objekt_id) as Objekt
if (!objekt) {
// Das Objekt existiert nicht, das sollte eigentlich nicht passieren aber so können wir nicht fortfahren.
return Astro.redirect(
"/energieausweis-erstellen/verbrauchsausweis-wohngebaeude"
);
}
bilder = await getBilder(aufnahme.id);
unterlagen = await getUnterlagen(aufnahme.id);
} else if (aufnahme_id) {
if (!user) {
return Astro.redirect(
`/auth/login?redirect=${Astro.url.toString()}`
);
}
aufnahme = await getAufnahme(nachweis.aufnahme_id) as Aufnahme
if (!aufnahme) {
// Die Aufnahme existiert wohl nicht.
return Astro.redirect(
"/energieausweis-erstellen/verbrauchsausweis-wohngebaeude"
);
}
objekt = await getObjekt(aufnahme.objekt_id) as Objekt
if (!objekt) {
// Das Objekt existiert nicht.
return Astro.redirect(
"/energieausweis-erstellen/verbrauchsausweis-wohngebaeude"
); );
} }
} }
--- ---
<AusweisLayout title="GEG Nachweis Wohnen anfragen"> <AusweisLayout title="GEG Nachweis Wohnen anfragen">
<GEGNachweisWohnenModule client:only {nachweis} {objekt} {aufnahme} {bilder} {unterlagen} /> <GEGNachweisWohnenModule client:only {nachweis} {objekt} {aufnahme} {bilder} {unterlagen} {id} />
</AusweisLayout> </AusweisLayout>

View File

@@ -1,8 +1,6 @@
import { getAusweisartFromUUID } from "#components/Ausweis/types.js"; import { getAusweisartFromId } from "#components/Ausweis/types.js";
import { adminMiddleware } from "#lib/middleware/authorization.js"; import { adminMiddleware } from "#lib/middleware/authorization.js";
import { pdfDatenblattVerbrauchsausweisWohnen } from "#lib/pdf/pdfDatenblattVerbrauchsausweisWohnen.js"; import { Enums, prisma } from "#lib/server/prisma.js";
import { pdfVerbrauchsausweisWohnen } from "#lib/pdf/pdfVerbrauchsausweisWohnen.js";
import { Enums, prisma } from "#lib/server/prisma";
import { APIError, defineApiRoute } from "astro-typesafe-api/server"; import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import { z } from "astro:content"; import { z } from "astro:content";
import { fileURLToPath } from "url"; import { fileURLToPath } from "url";
@@ -14,17 +12,17 @@ import { PERSISTENT_DIR } from "#lib/server/constants.js";
export const GET = defineApiRoute({ export const GET = defineApiRoute({
input: z.object({ input: z.object({
uid_ausweis: z.string(), id_ausweis: z.string(),
}), }),
output: z.void(), output: z.void(),
middleware: adminMiddleware, middleware: adminMiddleware,
async fetch({ uid_ausweis }, context, user) { async fetch({ id_ausweis }, context, user) {
const ausweisart = getAusweisartFromUUID(uid); const ausweisart = getAusweisartFromId(id_ausweis);
if (ausweisart === "VerbrauchsausweisWohnen") { if (ausweisart === "VerbrauchsausweisWohnen") {
const ausweis = await prisma.verbrauchsausweisWohnen.findUnique({ const ausweis = await prisma.verbrauchsausweisWohnen.findUnique({
where: { where: {
uid: uid_ausweis, id: id_ausweis
}, },
include: { include: {
aufnahme: { aufnahme: {
@@ -50,7 +48,7 @@ export const GET = defineApiRoute({
const rechnung = await prisma.rechnung.findFirst({ const rechnung = await prisma.rechnung.findFirst({
where: { where: {
verbrauchsausweis_wohnen: { verbrauchsausweis_wohnen: {
uid: uid_ausweis id: id_ausweis
}, },
}, },
orderBy: { orderBy: {
@@ -100,7 +98,7 @@ export const GET = defineApiRoute({
if (pdfAusweis) { if (pdfAusweis) {
const pdfAusweisPath = fileURLToPath( const pdfAusweisPath = fileURLToPath(
new URL( new URL(
`${PERSISTENT_DIR}/generated/Ausweis-${ausweis.uid}.pdf`, `${PERSISTENT_DIR}/generated/Ausweis-${ausweis.id}.pdf`,
import.meta.url import.meta.url
) )
); );
@@ -110,7 +108,7 @@ export const GET = defineApiRoute({
if (pdfDatenblatt) { if (pdfDatenblatt) {
const pdfDatenblattPath = fileURLToPath( const pdfDatenblattPath = fileURLToPath(
new URL( new URL(
`${PERSISTENT_DIR}/generated/Datenblatt-${ausweis.uid}.pdf`, `${PERSISTENT_DIR}/generated/Datenblatt-${ausweis.id}.pdf`,
import.meta.url import.meta.url
) )
); );
@@ -160,7 +158,7 @@ fax 040 · 209339859
<tr><td>IBAN</td><td>:<td>\t DE81 2004 0000 0348 6008 00</td> <tr><td>IBAN</td><td>:<td>\t DE81 2004 0000 0348 6008 00</td>
<tr><td>BIC</td><td>:</td><td>\t COBADEFFXXX</td> <tr><td>BIC</td><td>:</td><td>\t COBADEFFXXX</td>
<tr><td>Betrag</td><td>:</td><td>\t <b>${rechnung.betrag}€</b></td> <tr><td>Betrag</td><td>:</td><td>\t <b>${rechnung.betrag}€</b></td>
<tr><td>Verwendungszweck</td><td>:</td><td>\t <b>${rechnung.uid}</b></td> <tr><td>Verwendungszweck</td><td>:</td><td>\t <b>${rechnung.id}</b></td>
</table> </table>
<br> <br>
@@ -170,11 +168,11 @@ Alternativ können Sie auch direkt online zahlen indem Sie auf den entsprechende
<br> <br>
<table> <table>
<tr><td>Per Einzuglastschrift zahlen</td> <td>:</td> <td><a href='${BASE_URI}/energieausweis-erstellen/kaufabschluss-fortsetzen?uid=${ausweis.uid}&p=SEPA'>jetzt per ELV bezahlen</a></td></tr> <tr><td>Per Einzuglastschrift zahlen</td> <td>:</td> <td><a href='${BASE_URI}/energieausweis-erstellen/kaufabschluss-fortsetzen?uid=${ausweis.id}&p=SEPA'>jetzt per ELV bezahlen</a></td></tr>
<tr><td>Per Sofortüberweisung zahlen</td> <td>:</td> <td><a href='${BASE_URI}/energieausweis-erstellen/kaufabschluss-fortsetzen?uid=${ausweis.uid}&p=Sofort'>jetzt per Sofortüberweisung bezahlen</a></td></tr> <tr><td>Per Sofortüberweisung zahlen</td> <td>:</td> <td><a href='${BASE_URI}/energieausweis-erstellen/kaufabschluss-fortsetzen?uid=${ausweis.id}&p=Sofort'>jetzt per Sofortüberweisung bezahlen</a></td></tr>
<tr><td>Über PayPal zahlen</td> <td>:</td> <td><a href='${BASE_URI}/energieausweis-erstellen/kaufabschluss-fortsetzen?uid=${ausweis.uid}&p=PayPal'>jetzt per Paypal bezahlen</a></td></tr> <tr><td>Über PayPal zahlen</td> <td>:</td> <td><a href='${BASE_URI}/energieausweis-erstellen/kaufabschluss-fortsetzen?uid=${ausweis.id}&p=PayPal'>jetzt per Paypal bezahlen</a></td></tr>
<tr><td>Per Giropay zahlen</td> <td>:</td> <td><a href='${BASE_URI}/energieausweis-erstellen/kaufabschluss-fortsetzen?uid=${ausweis.uid}&p=Giropay'>jetzt per Giropay bezahlen</a></td></tr> <tr><td>Per Giropay zahlen</td> <td>:</td> <td><a href='${BASE_URI}/energieausweis-erstellen/kaufabschluss-fortsetzen?uid=${ausweis.id}&p=Giropay'>jetzt per Giropay bezahlen</a></td></tr>
<tr><td>Per Visa oder MasterCard zahlen</td> <td>:</td> <td><a href='${BASE_URI}/energieausweis-erstellen/kaufabschluss-fortsetzen?uid=${ausweis.uid}&p=Kreditkarte'>jetzt per Kreditkarte bezahlen</a></td></tr> <tr><td>Per Visa oder MasterCard zahlen</td> <td>:</td> <td><a href='${BASE_URI}/energieausweis-erstellen/kaufabschluss-fortsetzen?uid=${ausweis.id}&p=Kreditkarte'>jetzt per Kreditkarte bezahlen</a></td></tr>
</table> </table>
<br> <br>
@@ -204,7 +202,7 @@ fax 040 · 209339859
await transport.sendMail({ await transport.sendMail({
from: `"IBCornelsen" <info@online-energieausweis.org>`, from: `"IBCornelsen" <info@online-energieausweis.org>`,
to: user.email, to: user.email,
subject: `Ihr Originalausweis vom Ingenieurbüro Cornelsen (ID: ${ausweis.uid})`, subject: `Ihr Originalausweis vom Ingenieurbüro Cornelsen (ID: ${ausweis.id})`,
text, text,
}); });

View File

@@ -1,5 +1,5 @@
import { import {
getAusweisartFromUUID, getAusweisartFromId,
UUidWithPrefix, UUidWithPrefix,
} from "#components/Ausweis/types.js"; } from "#components/Ausweis/types.js";
import { import {
@@ -26,7 +26,7 @@ export const GET = defineApiRoute({
headers: authorizationHeaders, headers: authorizationHeaders,
middleware: adminMiddleware, middleware: adminMiddleware,
async fetch({ uid }, context, user) { async fetch({ uid }, context, user) {
const ausweisart = getAusweisartFromUUID(uid); const ausweisart = getAusweisartFromId(uid);
const adapter = getPrismaAusweisAdapter( const adapter = getPrismaAusweisAdapter(
uid uid
) as typeof prisma.verbrauchsausweisWohnen; ) as typeof prisma.verbrauchsausweisWohnen;

View File

@@ -1,4 +1,6 @@
import { UUidWithPrefix } from "#components/Ausweis/types.js"; import { UUidWithPrefix } from "#components/Ausweis/types.js";
import { VALID_UUID_PREFIXES } from "#lib/constants.js";
import { generatePrefixedId } from "#lib/db.js";
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js"; import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
import { prisma } from "#lib/server/prisma.js"; import { prisma } from "#lib/server/prisma.js";
import { APIError, defineApiRoute } from "astro-typesafe-api/server"; import { APIError, defineApiRoute } from "astro-typesafe-api/server";
@@ -16,24 +18,25 @@ export const PUT = defineApiRoute({
nachweis: GEGNachweisGewerbeSchema.omit({ nachweis: GEGNachweisGewerbeSchema.omit({
id: true, id: true,
benutzer_id: true, benutzer_id: true,
uid: true,
aufnahme_id: true, aufnahme_id: true,
created_at: true,
updated_at: true,
geg_einpreisung_id: true, geg_einpreisung_id: true,
rechnung_id: true rechnung_id: true
}), }),
uid_aufnahme: UUidWithPrefix aufnahme_id: UUidWithPrefix
}), }),
output: z.object({ output: z.object({
uid: UUidWithPrefix, id: UUidWithPrefix,
objekt_uid: UUidWithPrefix, objekt_id: UUidWithPrefix,
aufnahme_uid: UUidWithPrefix, aufnahme_id: UUidWithPrefix,
}), }),
headers: authorizationHeaders, headers: authorizationHeaders,
middleware: authorizationMiddleware, middleware: authorizationMiddleware,
async fetch(input, ctx, user) { async fetch(input, ctx, user) {
const aufnahme = await prisma.aufnahme.findUnique({ const aufnahme = await prisma.aufnahme.findUnique({
where: { where: {
uid: input.uid_aufnahme id: input.aufnahme_id
} }
}) })
@@ -44,8 +47,11 @@ export const PUT = defineApiRoute({
}) })
} }
const id = generatePrefixedId(6, VALID_UUID_PREFIXES.GEGNachweisGewerbe)
const nachweis = await prisma.gEGNachweisGewerbe.create({ const nachweis = await prisma.gEGNachweisGewerbe.create({
data: { data: {
id,
...input.nachweis, ...input.nachweis,
benutzer: { benutzer: {
connect: { connect: {
@@ -59,13 +65,13 @@ export const PUT = defineApiRoute({
} }
}, },
select: { select: {
uid: true, id: true,
aufnahme: { aufnahme: {
select: { select: {
uid: true, id: true,
objekt: { objekt: {
select: { select: {
uid: true, id: true,
}, },
}, },
}, },
@@ -74,9 +80,9 @@ export const PUT = defineApiRoute({
}); });
return { return {
uid: nachweis.uid, id: nachweis.id,
objekt_uid: nachweis.aufnahme.objekt.uid, objekt_id: nachweis.aufnahme.objekt.id,
aufnahme_uid: nachweis.aufnahme.uid, aufnahme_id: nachweis.aufnahme.id,
}; };
}, },
}); });
@@ -101,11 +107,11 @@ export const GET = defineApiRoute({
headers: authorizationHeaders, headers: authorizationHeaders,
middleware: authorizationMiddleware, middleware: authorizationMiddleware,
async fetch(input, context, user) { async fetch(input, context, user) {
const { uid } = context.params; const { id } = context.params;
const nachweis = await prisma.gEGNachweisGewerbe.findUnique({ const nachweis = await prisma.gEGNachweisGewerbe.findUnique({
where: { where: {
uid, id,
}, },
include: { include: {
benutzer: true, benutzer: true,
@@ -115,7 +121,7 @@ export const GET = defineApiRoute({
include: { include: {
benutzer: { benutzer: {
select: { select: {
uid: true, id: true,
}, },
}, },
}, },

View File

@@ -1,13 +1,15 @@
import { GEGNachweisWohnenClient, OptionalNullable, UUidWithPrefix, ZodOverlap } from "#components/Ausweis/types.js"; import { UUidWithPrefix } from "#components/Ausweis/types.js";
import { VALID_UUID_PREFIXES } from "#lib/constants.js";
import { generatePrefixedId } from "#lib/db.js";
import { exclude } from "#lib/exclude.js"; import { exclude } from "#lib/exclude.js";
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js"; import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
import { GEGNachweisWohnenSchema, prisma } from "#lib/server/prisma"; import { prisma } from "#lib/server/prisma.js";
import { APIError, defineApiRoute } from "astro-typesafe-api/server"; import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import { GEGNachweisWohnenSchema } from "src/generated/zod/gegnachweiswohnen.js";
import { z } from "zod"; import { z } from "zod";
export const PATCH = defineApiRoute({ export const PATCH = defineApiRoute({
input: GEGNachweisWohnenSchema.omit({ input: GEGNachweisWohnenSchema.omit({
uid: true,
id: true, id: true,
benutzer_id: true, benutzer_id: true,
geg_einpreisung_id: true, geg_einpreisung_id: true,
@@ -21,7 +23,7 @@ export const PATCH = defineApiRoute({
async fetch(input, ctx, user) { async fetch(input, ctx, user) {
const objekt = await prisma.gEGNachweisWohnen.findUnique({ const objekt = await prisma.gEGNachweisWohnen.findUnique({
where: { where: {
uid: ctx.params.uid, id: ctx.params.id,
benutzer: { benutzer: {
id: user.id id: user.id
} }
@@ -37,7 +39,7 @@ export const PATCH = defineApiRoute({
await prisma.gEGNachweisWohnen.update({ await prisma.gEGNachweisWohnen.update({
where: { where: {
uid: ctx.params.uid id: ctx.params.id
}, },
data: input data: input
}) })
@@ -51,9 +53,9 @@ export const DELETE = defineApiRoute({
headers: authorizationHeaders, headers: authorizationHeaders,
middleware: authorizationMiddleware, middleware: authorizationMiddleware,
async fetch(input, ctx, user) { async fetch(input, ctx, user) {
const { uid } = ctx.params; const { id } = ctx.params;
if (!UUidWithPrefix.safeParse(uid).success) { if (!UUidWithPrefix.safeParse(id).success) {
throw new APIError({ throw new APIError({
code: "BAD_REQUEST", code: "BAD_REQUEST",
message: "UID konnte nicht verifiziert werden." message: "UID konnte nicht verifiziert werden."
@@ -64,7 +66,7 @@ export const DELETE = defineApiRoute({
// Dieser MUSS mit dem Nutzer verknüpft sein. // Dieser MUSS mit dem Nutzer verknüpft sein.
const nachweis = await prisma.gEGNachweisWohnen.findUnique({ const nachweis = await prisma.gEGNachweisWohnen.findUnique({
where: { where: {
uid, id,
} }
}); });
@@ -111,10 +113,13 @@ export const DELETE = defineApiRoute({
} }
}) })
const event_id =
// Wir erstellen ein Event, dass der Nachweis storniert wurde // Wir erstellen ein Event, dass der Nachweis storniert wurde
// Dann können wir das in der Historie anzeigen // Dann können wir das in der Historie anzeigen
await prisma.event.create({ await prisma.event.create({
data: { data: {
id: generatePrefixedId(6, VALID_UUID_PREFIXES.Event),
title: "Nachweis storniert", title: "Nachweis storniert",
description: ((user.rolle === "ADMIN") && (nachweis.benutzer_id !== user.id)) ? "Nachweis wurde von einem Administrator storniert." : "Nachweis wurde vom Besitzer storniert.", description: ((user.rolle === "ADMIN") && (nachweis.benutzer_id !== user.id)) ? "Nachweis wurde von einem Administrator storniert." : "Nachweis wurde vom Besitzer storniert.",
benutzer: { benutzer: {
@@ -150,9 +155,9 @@ export const GET = defineApiRoute({
} }
}, },
output: GEGNachweisWohnenSchema.merge(z.object({ output: GEGNachweisWohnenSchema.merge(z.object({
uid_aufnahme: UUidWithPrefix, aufnahme_id: UUidWithPrefix,
uid_objekt: UUidWithPrefix, objekt_id: UUidWithPrefix,
uid_benutzer: UUidWithPrefix.optional() benutzer_id: UUidWithPrefix.optional()
})).omit({ })).omit({
id: true, id: true,
aufnahme_id: true, aufnahme_id: true,
@@ -160,32 +165,32 @@ export const GET = defineApiRoute({
}), }),
middleware: authorizationMiddleware, middleware: authorizationMiddleware,
async fetch(input, context, user) { async fetch(input, context, user) {
const { uid } = context.params; const { id } = context.params;
if (!uid) { if (!id) {
throw new APIError({ throw new APIError({
code: "BAD_REQUEST", code: "BAD_REQUEST",
message: "Missing uid in request params" message: "Missing uid in request params"
}) })
} }
const Nachweis = await prisma.gEGNachweisWohnen.findUnique({ const nachweis = await prisma.gEGNachweisWohnen.findUnique({
where: { where: {
uid, id,
benutzer_id: user.id benutzer_id: user.id
}, },
include: { include: {
benutzer: { benutzer: {
select: { select: {
uid: true id: true
} }
}, },
aufnahme: { aufnahme: {
select: { select: {
uid: true, id: true,
objekt: { objekt: {
select: { select: {
uid: true id: true
} }
} }
} }
@@ -193,7 +198,7 @@ export const GET = defineApiRoute({
} }
}); });
if (!Nachweis) { if (!nachweis) {
// Falls wir den Nachweis nicht finden können, werfen wir einen Fehler // Falls wir den Nachweis nicht finden können, werfen wir einen Fehler
throw new APIError({ throw new APIError({
code: "NOT_FOUND", code: "NOT_FOUND",
@@ -202,10 +207,10 @@ export const GET = defineApiRoute({
} }
return { return {
uid_aufnahme: Nachweis.aufnahme.uid, aufnahme_id: nachweis.aufnahme.id,
uid_objekt: Nachweis.aufnahme.objekt.uid, objekt_id: nachweis.aufnahme.objekt.id,
uid_benutzer: Nachweis.benutzer?.uid, benutzer_id: nachweis.benutzer?.id,
...exclude(Nachweis, ["id", "aufnahme_id", "benutzer_id", "aufnahme"]) ...exclude(nachweis, ["id", "aufnahme_id", "benutzer_id", "aufnahme"])
} }
}, },
}); });

View File

@@ -1,4 +1,6 @@
import { UUidWithPrefix } from "#components/Ausweis/types.js"; import { UUidWithPrefix } from "#components/Ausweis/types.js";
import { VALID_UUID_PREFIXES } from "#lib/constants.js";
import { generatePrefixedId } from "#lib/db.js";
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js"; import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
import { prisma } from "#lib/server/prisma.js"; import { prisma } from "#lib/server/prisma.js";
import { APIError, defineApiRoute } from "astro-typesafe-api/server"; import { APIError, defineApiRoute } from "astro-typesafe-api/server";
@@ -16,24 +18,25 @@ export const PUT = defineApiRoute({
nachweis: GEGNachweisWohnenSchema.omit({ nachweis: GEGNachweisWohnenSchema.omit({
id: true, id: true,
benutzer_id: true, benutzer_id: true,
uid: true,
aufnahme_id: true, aufnahme_id: true,
updated_at: true,
created_at: true,
geg_einpreisung_id: true, geg_einpreisung_id: true,
rechnung_id: true rechnung_id: true
}), }),
uid_aufnahme: UUidWithPrefix aufnahme_id: UUidWithPrefix
}), }),
output: z.object({ output: z.object({
uid: UUidWithPrefix, id: UUidWithPrefix,
objekt_uid: UUidWithPrefix, objekt_id: UUidWithPrefix,
aufnahme_uid: UUidWithPrefix, aufnahme_id: UUidWithPrefix,
}), }),
headers: authorizationHeaders, headers: authorizationHeaders,
middleware: authorizationMiddleware, middleware: authorizationMiddleware,
async fetch(input, ctx, user) { async fetch(input, ctx, user) {
const aufnahme = await prisma.aufnahme.findUnique({ const aufnahme = await prisma.aufnahme.findUnique({
where: { where: {
uid: input.uid_aufnahme id: input.aufnahme_id
} }
}) })
@@ -44,8 +47,11 @@ export const PUT = defineApiRoute({
}) })
} }
const id = generatePrefixedId(6, VALID_UUID_PREFIXES.GEGNachweisWohnen)
const nachweis = await prisma.gEGNachweisWohnen.create({ const nachweis = await prisma.gEGNachweisWohnen.create({
data: { data: {
id,
...input.nachweis, ...input.nachweis,
benutzer: { benutzer: {
connect: { connect: {
@@ -59,13 +65,13 @@ export const PUT = defineApiRoute({
} }
}, },
select: { select: {
uid: true, id: true,
aufnahme: { aufnahme: {
select: { select: {
uid: true, id: true,
objekt: { objekt: {
select: { select: {
uid: true, id: true,
}, },
}, },
}, },
@@ -74,9 +80,9 @@ export const PUT = defineApiRoute({
}); });
return { return {
uid: nachweis.uid, id: nachweis.id,
objekt_uid: nachweis.aufnahme.objekt.uid, objekt_id: nachweis.aufnahme.objekt.id,
aufnahme_uid: nachweis.aufnahme.uid, aufnahme_id: nachweis.aufnahme.id,
}; };
}, },
}); });
@@ -101,11 +107,11 @@ export const GET = defineApiRoute({
headers: authorizationHeaders, headers: authorizationHeaders,
middleware: authorizationMiddleware, middleware: authorizationMiddleware,
async fetch(input, context, user) { async fetch(input, context, user) {
const { uid } = context.params; const { id } = context.params;
const nachweis = await prisma.gEGNachweisGewerbe.findUnique({ const nachweis = await prisma.gEGNachweisGewerbe.findUnique({
where: { where: {
uid, id,
}, },
include: { include: {
benutzer: true, benutzer: true,
@@ -115,7 +121,7 @@ export const GET = defineApiRoute({
include: { include: {
benutzer: { benutzer: {
select: { select: {
uid: true, id: true,
}, },
}, },
}, },

View File

@@ -1,4 +1,4 @@
import { UUidWithPrefix, getAusweisartFromUUID } from "#components/Ausweis/types.js" import { UUidWithPrefix, getAusweisartFromId } from "#components/Ausweis/types.js"
import { Enums } from "#lib/client/prisma.js" import { Enums } from "#lib/client/prisma.js"
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js" import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js"
import { mollieClient } from "#lib/mollie.js" import { mollieClient } from "#lib/mollie.js"
@@ -88,7 +88,7 @@ export const PATCH = defineApiRoute({
}) })
} }
const ausweisart = getAusweisartFromUUID(ausweis.id) const ausweisart = getAusweisartFromId(ausweis.id)
if (!ausweisart) { if (!ausweisart) {
throw new APIError({ throw new APIError({

View File

@@ -1,8 +1,10 @@
import { getAusweisartFromUUID, UUidWithPrefix } from "#components/Ausweis/types.js"; import { getAusweisartFromId, UUidWithPrefix } from "#components/Ausweis/types.js";
import { VALID_UUID_PREFIXES } from "#lib/constants.js";
import { generatePrefixedId } from "#lib/db.js";
import { omit } from "#lib/helpers.js"; import { omit } from "#lib/helpers.js";
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js"; import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
import { sendGEGAnforderungsMail } from "#lib/server/mail/geg-anfordern.js"; import { sendGEGAnforderungsMail } from "#lib/server/mail/geg-anfordern.js";
import { Enums, GEGNachweisGewerbe, GEGNachweisWohnen, prisma } from "#lib/server/prisma.js"; import { BedarfsausweisGewerbe, Enums, GEGNachweisGewerbe, GEGNachweisWohnen, prisma } from "#lib/server/prisma.js";
import { APIError, defineApiRoute } from "astro-typesafe-api/server"; import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import { GEGEinpreisungSchema } from "src/generated/zod/gegeinpreisung.js"; import { GEGEinpreisungSchema } from "src/generated/zod/gegeinpreisung.js";
import { z } from "zod"; import { z } from "zod";
@@ -11,34 +13,33 @@ export const PUT = defineApiRoute({
input: GEGEinpreisungSchema.omit({ input: GEGEinpreisungSchema.omit({
benutzer_id: true, benutzer_id: true,
id: true, id: true,
uid: true,
status: true, status: true,
}).merge(z.object({ }).merge(z.object({
nachweis_uid: UUidWithPrefix nachweis_id: UUidWithPrefix
})), })),
headers: authorizationHeaders, headers: authorizationHeaders,
middleware: authorizationMiddleware, middleware: authorizationMiddleware,
async fetch(input, context, user) { async fetch(input, context, user) {
const ausweisart = getAusweisartFromUUID(input.nachweis_uid); const ausweisart = getAusweisartFromId(input.nachweis_id);
let einpreisung; let einpreisung;
let nachweis: GEGNachweisWohnen | GEGNachweisGewerbe; let nachweis: GEGNachweisWohnen | GEGNachweisGewerbe | BedarfsausweisGewerbe;
if (ausweisart === Enums.Ausweisart.GEGNachweisWohnen) { if (ausweisart === Enums.Ausweisart.GEGNachweisWohnen) {
nachweis = await prisma.gEGNachweisWohnen.findUnique({ nachweis = await prisma.gEGNachweisWohnen.findUnique({
where: { where: {
uid: input.nachweis_uid id: input.nachweis_id
} }
}) })
} else if (ausweisart === Enums.Ausweisart.GEGNachweisGewerbe) { } else if (ausweisart === Enums.Ausweisart.GEGNachweisGewerbe) {
nachweis = await prisma.gEGNachweisGewerbe.findUnique({ nachweis = await prisma.gEGNachweisGewerbe.findUnique({
where: { where: {
uid: input.nachweis_uid id: input.nachweis_id
} }
}) })
} else if (ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe) { } else if (ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe) {
nachweis = await prisma.bedarfsausweisGewerbe.findUnique({ nachweis = await prisma.bedarfsausweisGewerbe.findUnique({
where: { where: {
uid: input.nachweis_uid id: input.nachweis_id
} }
}) })
} else { } else {
@@ -56,10 +57,13 @@ export const PUT = defineApiRoute({
}) })
} }
const id = generatePrefixedId(6, VALID_UUID_PREFIXES.GEGEinpreisung)
if (ausweisart === Enums.Ausweisart.GEGNachweisWohnen) { if (ausweisart === Enums.Ausweisart.GEGNachweisWohnen) {
einpreisung = await prisma.gEGEinpreisung.create({ einpreisung = await prisma.gEGEinpreisung.create({
data: { data: {
...omit(input, ["nachweis_uid"]), id,
...omit(input, ["nachweis_id"]),
status: Enums.Einpreisungsstatus.open, status: Enums.Einpreisungsstatus.open,
benutzer: { benutzer: {
connect: { connect: {
@@ -68,7 +72,7 @@ export const PUT = defineApiRoute({
}, },
geg_nachweis_wohnen: { geg_nachweis_wohnen: {
connect: { connect: {
uid: input.nachweis_uid id: input.nachweis_id
} }
} }
} }
@@ -76,7 +80,8 @@ export const PUT = defineApiRoute({
} else if (ausweisart === Enums.Ausweisart.GEGNachweisGewerbe) { } else if (ausweisart === Enums.Ausweisart.GEGNachweisGewerbe) {
einpreisung = await prisma.gEGEinpreisung.create({ einpreisung = await prisma.gEGEinpreisung.create({
data: { data: {
...omit(input, ["nachweis_uid"]), id,
...omit(input, ["nachweis_id"]),
status: Enums.Einpreisungsstatus.open, status: Enums.Einpreisungsstatus.open,
benutzer: { benutzer: {
connect: { connect: {
@@ -85,7 +90,7 @@ export const PUT = defineApiRoute({
}, },
geg_nachweis_gewerbe: { geg_nachweis_gewerbe: {
connect: { connect: {
uid: input.nachweis_uid id: input.nachweis_id
} }
} }
} }
@@ -93,7 +98,8 @@ export const PUT = defineApiRoute({
} else if (ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe) { } else if (ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe) {
einpreisung = await prisma.gEGEinpreisung.create({ einpreisung = await prisma.gEGEinpreisung.create({
data: { data: {
...omit(input, ["nachweis_uid"]), id,
...omit(input, ["nachweis_id"]),
status: Enums.Einpreisungsstatus.open, status: Enums.Einpreisungsstatus.open,
benutzer: { benutzer: {
connect: { connect: {
@@ -102,7 +108,7 @@ export const PUT = defineApiRoute({
}, },
bedarfsausweis_gewerbe: { bedarfsausweis_gewerbe: {
connect: { connect: {
uid: input.nachweis_uid id: input.nachweis_id
} }
} }
} }
@@ -112,7 +118,7 @@ export const PUT = defineApiRoute({
await sendGEGAnforderungsMail(nachweis, user) await sendGEGAnforderungsMail(nachweis, user)
return { return {
uid: einpreisung.uid id
} }
}, },
}) })

View File

@@ -1,4 +1,5 @@
--- ---
return Astro.redirect("/dashboard/objekte/1", 301); return Astro.redirect("/dashboard/objekte/1", 301);
---
--- <script></script>

View File

@@ -3,19 +3,19 @@ import Layout from "#layouts/Layout.astro";
import { getCurrentUser } from "#lib/server/user"; import { getCurrentUser } from "#lib/server/user";
import { prisma } from "#lib/server/prisma"; import { prisma } from "#lib/server/prisma";
const uidEinpreisung = Astro.url.searchParams.get("e"); const einpreisung_id = Astro.url.searchParams.get("e");
const uidAusweis = Astro.url.searchParams.get("a"); const ausweis_id = Astro.url.searchParams.get("a");
const user = await getCurrentUser(Astro) const user = await getCurrentUser(Astro)
if (!uidEinpreisung || !uidAusweis || !user) { if (!einpreisung_id || !ausweis_id || !user) {
return Astro.redirect("/") return Astro.redirect("/")
} }
const einpreisung = await prisma.gEGEinpreisung.findUnique({ const einpreisung = await prisma.gEGEinpreisung.findUnique({
where: { where: {
uid: uidEinpreisung, id: einpreisung_id,
benutzer: { benutzer: {
uid: user.uid id: user.id
} }
} }
}) })

View File

@@ -1,5 +1,5 @@
--- ---
import { getAusweisartFromUUID } from "#components/Ausweis/types"; import { getAusweisartFromId } from "#components/Ausweis/types";
import AusweisLayoutPruefung from "#layouts/AusweisLayoutPruefung.astro"; import AusweisLayoutPruefung from "#layouts/AusweisLayoutPruefung.astro";
import { getPrismaAusweisAdapter } from "#lib/server/ausweis"; import { getPrismaAusweisAdapter } from "#lib/server/ausweis";
import { Enums } from "#lib/server/prisma"; import { Enums } from "#lib/server/prisma";
@@ -16,7 +16,7 @@ if (!uid) {
const user = await getCurrentUser(Astro) const user = await getCurrentUser(Astro)
const adapter = getPrismaAusweisAdapter(uid) const adapter = getPrismaAusweisAdapter(uid)
const ausweisart = getAusweisartFromUUID(uid) const ausweisart = getAusweisartFromId(uid)
if (!user || !adapter || !ausweisart) { if (!user || !adapter || !ausweisart) {
return Astro.redirect("/404") return Astro.redirect("/404")

View File

@@ -1,4 +1,4 @@
import { AufnahmeClient, BenutzerClient, getAusweisartFromUUID, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js"; import { AufnahmeClient, BenutzerClient, getAusweisartFromId, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js"; import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
import { pdfVerbrauchsausweisGewerbe } from "#lib/pdf/pdfVerbrauchsausweisGewerbe.js"; import { pdfVerbrauchsausweisGewerbe } from "#lib/pdf/pdfVerbrauchsausweisGewerbe.js";
import { pdfVerbrauchsausweisWohnen } from "#lib/pdf/pdfVerbrauchsausweisWohnen.js"; import { pdfVerbrauchsausweisWohnen } from "#lib/pdf/pdfVerbrauchsausweisWohnen.js";
@@ -6,17 +6,17 @@ import { Enums } from "#lib/client/prisma.js";
import { APIRoute } from "astro"; import { APIRoute } from "astro";
import { createCaller } from "src/astro-typesafe-api-caller.js"; import { createCaller } from "src/astro-typesafe-api-caller.js";
import { getS3File } from "#lib/s3.js"; import { getS3File } from "#lib/s3.js";
import { getVerbrauchsausweisWohnen, getVerbrauchsausweisGewerbe, getAufnahme, getObjekt, getBilder } from "#lib/server/db.js";
import { getCurrentUser } from "#lib/server/user.js";
export const GET: APIRoute = async (Astro) => { export const GET: APIRoute = async (Astro) => {
const ausweis_id = Astro.url.searchParams.get("uid"); const ausweis_id = Astro.url.searchParams.get("id");
if (!ausweis_id) { if (!ausweis_id) {
return new Response(null, { status: 404 }); return new Response(null, { status: 404 });
} }
const ausweisart = getAusweisartFromUUID(ausweis_id) const ausweisart = getAusweisartFromId(ausweis_id)
const caller = createCaller(Astro);
let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | null = null; let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | null = null;
let aufnahme: AufnahmeClient = {} as AufnahmeClient; let aufnahme: AufnahmeClient = {} as AufnahmeClient;
@@ -25,23 +25,9 @@ export const GET: APIRoute = async (Astro) => {
let bilder: UploadedGebaeudeBild[] = [] let bilder: UploadedGebaeudeBild[] = []
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) { if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
ausweis = await caller["verbrauchsausweis-wohnen"]._id.GET.fetch(undefined, { ausweis = await getVerbrauchsausweisWohnen(ausweis_id)
params: {
id: ausweis_id
},
headers: {
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
}
});
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) { } else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
ausweis = await caller["verbrauchsausweis-gewerbe"]._id.GET.fetch(undefined, { ausweis = await getVerbrauchsausweisGewerbe(ausweis_id)
params: {
id: ausweis_id
},
headers: {
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
}
});
} }
@@ -49,29 +35,13 @@ export const GET: APIRoute = async (Astro) => {
return new Response(null, { status: 404 }); return new Response(null, { status: 404 });
} }
aufnahme = await caller.aufnahme._id.GET.fetch(undefined, { aufnahme = await getAufnahme(ausweis.aufnahme_id)
params: {
id: ausweis.aufnahme_id
},
headers: {
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
}
});
objekt = await caller.objekt._id.GET.fetch(undefined, { objekt = await getObjekt(aufnahme.objekt_id)
params: {
id: ausweis.objekt_id
},
headers: {
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
}
});
user = await caller.user.self.GET.fetch(undefined, { bilder = await getBilder(ausweis.aufnahme_id)
headers: {
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` user = await getCurrentUser(Astro)
}
});
let pdf: Uint8Array<ArrayBufferLike> | null = null; let pdf: Uint8Array<ArrayBufferLike> | null = null;
if (ausweis.alte_ausweis_id) { if (ausweis.alte_ausweis_id) {

View File

@@ -1,49 +1,33 @@
import { AufnahmeClient, BenutzerClient, getAusweisartFromUUID, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js"; import { BenutzerClient, getAusweisartFromId, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js"; import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
import { pdfDatenblattVerbrauchsausweisGewerbe } from "#lib/pdf/pdfDatenblattVerbrauchsausweisGewerbe.js"; import { pdfDatenblattVerbrauchsausweisGewerbe } from "#lib/pdf/pdfDatenblattVerbrauchsausweisGewerbe.js";
import { pdfDatenblattVerbrauchsausweisWohnen } from "#lib/pdf/pdfDatenblattVerbrauchsausweisWohnen.js"; import { pdfDatenblattVerbrauchsausweisWohnen } from "#lib/pdf/pdfDatenblattVerbrauchsausweisWohnen.js";
import { pdfVerbrauchsausweisGewerbe } from "#lib/pdf/pdfVerbrauchsausweisGewerbe.js"; import { Aufnahme, Benutzer, Bild, Enums, Objekt, VerbrauchsausweisGewerbe, VerbrauchsausweisWohnen } from "#lib/client/prisma.js";
import { pdfVerbrauchsausweisWohnen } from "#lib/pdf/pdfVerbrauchsausweisWohnen.js";
import { Enums } from "#lib/client/prisma.js";
import { APIRoute } from "astro"; import { APIRoute } from "astro";
import { createCaller } from "src/astro-typesafe-api-caller.js"; import { createCaller } from "src/astro-typesafe-api-caller.js";
import { getS3File } from "#lib/s3.js"; import { getS3File } from "#lib/s3.js";
import { getAufnahme, getBilder, getObjekt, getVerbrauchsausweisGewerbe, getVerbrauchsausweisWohnen } from "#lib/server/db.js";
import { getCurrentUser } from "#lib/server/user.js";
export const GET: APIRoute = async (Astro) => { export const GET: APIRoute = async (Astro) => {
const uidAusweis = Astro.url.searchParams.get("uid"); const ausweis_id = Astro.url.searchParams.get("id");
if (!uidAusweis) { if (!ausweis_id) {
return new Response(null, { status: 404 }); return new Response(null, { status: 404 });
} }
const ausweisart = getAusweisartFromUUID(uidAusweis) const ausweisart = getAusweisartFromId(ausweis_id)
const caller = createCaller(Astro); let ausweis: VerbrauchsausweisWohnen | VerbrauchsausweisGewerbe | null = null;
let aufnahme: Aufnahme = {} as Aufnahme;
let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | null = null; let objekt: Objekt = {} as Objekt;
let aufnahme: AufnahmeClient = {} as AufnahmeClient; let user: Benutzer = {} as Benutzer;
let objekt: ObjektClient = {} as ObjektClient; let bilder: Bild[] = []
let user: BenutzerClient = {} as BenutzerClient;
let bilder: UploadedGebaeudeBild[] = []
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) { if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
ausweis = await caller["verbrauchsausweis-wohnen"]._id.GET.fetch(undefined, { ausweis = await getVerbrauchsausweisWohnen(ausweis_id)
params: {
id: uidAusweis
},
headers: {
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
}
});
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) { } else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
ausweis = await caller["verbrauchsausweis-gewerbe"]._id.GET.fetch(undefined, { ausweis = await getVerbrauchsausweisGewerbe(ausweis_id)
params: {
id: uidAusweis
},
headers: {
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
}
});
} }
@@ -51,29 +35,13 @@ export const GET: APIRoute = async (Astro) => {
return new Response(null, { status: 404 }); return new Response(null, { status: 404 });
} }
aufnahme = await caller.aufnahme._id.GET.fetch(undefined, { aufnahme = await getAufnahme(ausweis.aufnahme_id)
params: {
id: ausweis.aufnahme_id
},
headers: {
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
}
});
objekt = await caller.objekt._id.GET.fetch(undefined, { objekt = await getObjekt(aufnahme.objekt_id)
params: {
id: ausweis.objekt_id
},
headers: {
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
}
});
user = await caller.user.self.GET.fetch(undefined, { bilder = await getBilder(ausweis.aufnahme_id)
headers: {
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}` user = await getCurrentUser(Astro)
}
});
let pdf: Uint8Array<ArrayBufferLike> | null = null; let pdf: Uint8Array<ArrayBufferLike> | null = null;
if (ausweis.alte_ausweis_id) { if (ausweis.alte_ausweis_id) {

View File

@@ -1,5 +1,9 @@
Verbrauchsausweis Wohnen Verbrauchsausweis Wohnen
[Wenn der Kunde über das Dashboard über "Ausweis erstellen" kommt gibt es Daten aus der
letzten aktuellen Vorlage. Die sollten nach klick auf den Button in LocalStorage inkl.
Objekt ID geschrieben werden. Die Verknüpfung zum Gebäude/Objekt sollte dann gewährleistet
sein.]
if Domain hat bereits eine vorhandene ID? if Domain hat bereits eine vorhandene ID?
if LocalStorage hat Daten? if LocalStorage hat Daten?
Wir vergleichen ob der LocalStorage neuer ist als die Datenbank Wir vergleichen ob der LocalStorage neuer ist als die Datenbank
@@ -26,7 +30,11 @@ else
if *Klick auf Weiter || Klick auf Hilfe* if *Klick auf Weiter || Klick auf Hilfe*
Wir leiten weiter auf Kundendaten mit dem entsprechenden Produkt Wir leiten weiter auf Kundendaten mit dem entsprechenden Produkt
[Hier sollte auch geprüft werden ob Daten im LocalStorage vorliegen
(so wie oben). Wenn Kundendaten leer sind sollen die Stammdaten geladen
werden. Aber bitte nicht wenn der Aussteller/Admin eingeloggt ist]
*User gibt Kundendaten ein* *User gibt Kundendaten ein*
[Wir speichern alles im LocalStorage mit dem aktuallen Timestamp]
if *Klick auf Speichern* if *Klick auf Speichern*
if Ausweis hat bereits eine id? if Ausweis hat bereits eine id?
Wir updaten den bereits gespeicherten Ausweis mit den neuen Daten Wir updaten den bereits gespeicherten Ausweis mit den neuen Daten
@@ -43,7 +51,9 @@ if *Klick auf Weiter || Klick auf Hilfe*
Wir erstellen einen neuen Ausweis Wir erstellen einen neuen Ausweis
else else
*User klickt auf Bestellen* [Bei schon bestellten Produkten (Beratung und Offline) kann man nicht nochmal bestellen
sondern nur Freigeben. Statt Bestellbestätigung Freigabebestätigung]
*User klickt auf Bestellen* [bzw. *User klickt auf Freigabe*]
if Ausweis hat bereits eine id? if Ausweis hat bereits eine id?
Wir updaten den bereits gespeicherten Ausweis mit den neuen Daten Wir updaten den bereits gespeicherten Ausweis mit den neuen Daten
else else