Highlight und neue ID

This commit is contained in:
Moritz Utcke
2025-03-25 14:01:13 -03:00
parent 84a3a2dd39
commit 5d66eb10ca
89 changed files with 1650 additions and 601 deletions

View File

@@ -9,6 +9,7 @@
"@astrojs/svelte": "^2.2.0",
"@astrojs/tailwind": "^3.1.3",
"@aws-sdk/client-s3": "^3.758.0",
"@highlight-run/node": "^3.12.0",
"@ibcornelsen/ui": "^0.0.2",
"@mollie/api-client": "^4.1.0",
"@pdfme/common": "^5.2.16",
@@ -25,6 +26,7 @@
"express": "^4.21.2",
"flag-icons": "^6.15.0",
"fontkit": "^2.0.4",
"highlight.run": "^9.14.0",
"is-base64": "^1.1.0",
"js-cookie": "^3.0.5",
"js-interpolate": "^1.3.2",
@@ -346,6 +348,8 @@
"@hapi/bourne": ["@hapi/bourne@3.0.0", "", {}, "sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w=="],
"@highlight-run/node": ["@highlight-run/node@3.12.0", "", { "dependencies": { "@prisma/instrumentation": ">=5.0.0", "require-in-the-middle": "^7.4.0" } }, "sha512-wmvj8rf+p/JbUTfgsbhc5srP87sfZNofHTlXlaLI5JT8XpfRgBHXgSHWOw79l8dgncqceUkct1cN+liR5LdnKg=="],
"@humanwhocodes/config-array": ["@humanwhocodes/config-array@0.9.5", "", { "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", "minimatch": "^3.0.4" } }, "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw=="],
"@humanwhocodes/object-schema": ["@humanwhocodes/object-schema@1.2.1", "", {}, "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA=="],
@@ -416,6 +420,10 @@
"@opentelemetry/api": ["@opentelemetry/api@1.4.1", "", {}, "sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA=="],
"@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.57.2", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A=="],
"@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="],
"@oslojs/encoding": ["@oslojs/encoding@1.1.0", "", {}, "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ=="],
"@oven/bun-darwin-aarch64": ["@oven/bun-darwin-aarch64@1.2.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ggZfdpgUJ/OiWrfcfTgHeSTHcec5HAjkGrZHL9FJ/R60sydRKPYHgAgexdIoJAGfsCVAL+x7y8NSTRIAX8J4Ng=="],
@@ -500,6 +508,8 @@
"@prisma/get-platform": ["@prisma/get-platform@6.4.1", "", { "dependencies": { "@prisma/debug": "6.4.1" } }, "sha512-gXqZaDI5scDkBF8oza7fOD3Q3QMD0e0rBynlzDDZdTWbWmzjuW58PRZtj+jkvKje2+ZigCWkH8SsWZAsH6q1Yw=="],
"@prisma/instrumentation": ["@prisma/instrumentation@6.5.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.52.0 || ^0.53.0 || ^0.54.0 || ^0.55.0 || ^0.56.0 || ^0.57.0" }, "peerDependencies": { "@opentelemetry/api": "^1.8" } }, "sha512-morJDtFRoAp5d/KENEm+K6Y3PQcn5bCvpJ5a9y3V3DNMrNy/ZSn2zulPGj+ld+Xj2UYVoaMJ8DpBX/o6iF6OiA=="],
"@prisma/internals": ["@prisma/internals@5.0.0", "", { "dependencies": { "@antfu/ni": "0.21.4", "@opentelemetry/api": "1.4.1", "@prisma/debug": "5.0.0", "@prisma/engines": "5.0.0", "@prisma/fetch-engine": "5.0.0", "@prisma/generator-helper": "5.0.0", "@prisma/get-platform": "5.0.0", "@prisma/prisma-schema-wasm": "4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584", "archiver": "5.3.1", "arg": "5.0.2", "checkpoint-client": "1.1.24", "cli-truncate": "2.1.0", "dotenv": "16.0.3", "escape-string-regexp": "4.0.0", "execa": "5.1.1", "find-up": "5.0.0", "fp-ts": "2.16.0", "fs-extra": "11.1.1", "fs-jetpack": "5.1.0", "global-dirs": "3.0.1", "globby": "11.1.0", "indent-string": "4.0.0", "is-windows": "1.0.2", "is-wsl": "2.2.0", "kleur": "4.1.5", "new-github-issue-url": "0.2.1", "node-fetch": "2.6.12", "npm-packlist": "5.1.3", "open": "7.4.2", "p-map": "4.0.0", "prompts": "2.4.2", "read-pkg-up": "7.0.1", "replace-string": "3.1.0", "resolve": "1.22.2", "string-width": "4.2.3", "strip-ansi": "6.0.1", "strip-indent": "3.0.0", "temp-dir": "2.0.0", "temp-write": "4.0.0", "tempy": "1.0.1", "terminal-link": "2.1.1", "tmp": "0.2.1", "ts-pattern": "4.3.0" } }, "sha512-VGWyFk6QlSBXT8z65Alq5F3o9E8IiTtaBoa3rmKkGpZjUk85kJy3jZz4xkRv53TaeghGE5rWfwkfak26KtY5yQ=="],
"@prisma/prisma-schema-wasm": ["@prisma/prisma-schema-wasm@4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584", "", {}, "sha512-JFdsnSgBPN8reDTLOI9Vh/6ccCb2aD1LbY/LWQnkcIgNo6IdpzvuM+qRVbBuA6IZP2SdqQI8Lu6RL2P8EFBQUA=="],
@@ -792,6 +802,8 @@
"@types/serve-static": ["@types/serve-static@1.15.7", "", { "dependencies": { "@types/http-errors": "*", "@types/node": "*", "@types/send": "*" } }, "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw=="],
"@types/shimmer": ["@types/shimmer@1.2.0", "", {}, "sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg=="],
"@types/siema": ["@types/siema@1.4.11", "", {}, "sha512-bPazsNVnMryrzZx2HiAeDXEpgaO98ToQk0cYJ/7yomLlVNHsn4IYPrLoQ50tQt11FGvkkNoepRyKcTNUhqjj+g=="],
"@types/sinonjs__fake-timers": ["@types/sinonjs__fake-timers@8.1.1", "", {}, "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g=="],
@@ -834,6 +846,8 @@
"acorn": ["acorn@8.14.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="],
"acorn-import-attributes": ["acorn-import-attributes@1.9.5", "", { "peerDependencies": { "acorn": "^8" } }, "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ=="],
"acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="],
"add-dom-event-listener": ["add-dom-event-listener@1.1.0", "", { "dependencies": { "object-assign": "4.x" } }, "sha512-WCxx1ixHT0GQU9hb0KI/mhgRQhnU+U3GvwY6ZvVjYq8rsihIGoaIOUbY0yMPBxLH5MDtr0kz3fisWGNcbWW7Jw=="],
@@ -1012,6 +1026,8 @@
"ci-info": ["ci-info@4.1.0", "", {}, "sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A=="],
"cjs-module-lexer": ["cjs-module-lexer@1.4.3", "", {}, "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q=="],
"classnames": ["classnames@2.5.1", "", {}, "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow=="],
"clean-stack": ["clean-stack@2.2.0", "", {}, "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A=="],
@@ -1470,6 +1486,8 @@
"hexoid": ["hexoid@2.0.0", "", {}, "sha512-qlspKUK7IlSQv2o+5I7yhUd7TxlOG2Vr5LTa3ve2XSNVKAL/n/u/7KLvKmFNimomDIKvZFXWHv0T12mv7rT8Aw=="],
"highlight.run": ["highlight.run@9.14.0", "", {}, "sha512-ZR+ZLHlVU8lXqsuto0ZEMAOuvptaTBBf1jradnKDIn9OfAXupcYFbkASDlbsZtyBh2SYJSK50xwrucXujhksRg=="],
"hosted-git-info": ["hosted-git-info@2.8.9", "", {}, "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw=="],
"hotkeys-js": ["hotkeys-js@3.13.9", "", {}, "sha512-3TRCj9u9KUH6cKo25w4KIdBfdBfNRjfUwrljCLDC2XhmPDG0SjAZFcFZekpUZFmXzfYoGhFDcdx2gX/vUVtztQ=="],
@@ -1504,6 +1522,8 @@
"import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="],
"import-in-the-middle": ["import-in-the-middle@1.13.1", "", { "dependencies": { "acorn": "^8.14.0", "acorn-import-attributes": "^1.9.5", "cjs-module-lexer": "^1.2.2", "module-details-from-path": "^1.0.3" } }, "sha512-k2V9wNm9B+ysuelDTHjI9d5KPc4l8zAZTGqj+pcynvWkypZd857ryzN8jNC7Pg2YZXNMJcHRPpaDyCBbNyVRpA=="],
"import-meta-resolve": ["import-meta-resolve@4.1.0", "", {}, "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw=="],
"imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="],
@@ -1862,6 +1882,8 @@
"mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="],
"module-details-from-path": ["module-details-from-path@1.0.3", "", {}, "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A=="],
"moment": ["moment@2.30.1", "", {}, "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how=="],
"moment-timezone": ["moment-timezone@0.5.47", "", { "dependencies": { "moment": "^2.29.4" } }, "sha512-UbNt/JAWS0m/NJOebR0QMRHBk0hu03r5dx9GK8Cs0AS3I81yDcOc9k+DytPItgVvBP7J6Mf6U2n3BPAacAV9oA=="],
@@ -2246,6 +2268,8 @@
"request-progress": ["request-progress@3.0.0", "", { "dependencies": { "throttleit": "^1.0.0" } }, "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg=="],
"require-in-the-middle": ["require-in-the-middle@7.5.2", "", { "dependencies": { "debug": "^4.3.5", "module-details-from-path": "^1.0.3", "resolve": "^1.22.8" } }, "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ=="],
"resize-observer-polyfill": ["resize-observer-polyfill@1.5.1", "", {}, "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="],
"resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="],
@@ -2326,6 +2350,8 @@
"shiki": ["shiki@1.29.2", "", { "dependencies": { "@shikijs/core": "1.29.2", "@shikijs/engine-javascript": "1.29.2", "@shikijs/engine-oniguruma": "1.29.2", "@shikijs/langs": "1.29.2", "@shikijs/themes": "1.29.2", "@shikijs/types": "1.29.2", "@shikijs/vscode-textmate": "^10.0.1", "@types/hast": "^3.0.4" } }, "sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg=="],
"shimmer": ["shimmer@1.2.1", "", {}, "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw=="],
"side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="],
"side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="],

View File

@@ -1,6 +1,6 @@
import { defineConfig } from "cypress";
import dsv from "@rollup/plugin-dsv"
import { prisma } from "./src/lib/server/prisma"
import { fileURLToPath } from "url";
import vitePreprocessor from "cypress-vite";
@@ -18,6 +18,7 @@ export default defineConfig({
},
resolve: {
alias: {
".prisma/client/index-browser": fileURLToPath(new URL("./node_modules/.prisma/client/index-browser.js", import.meta.url)),
"#": fileURLToPath(new URL("./src", import.meta.url)),
"#components": fileURLToPath(new URL("./src/components", import.meta.url)),
"#lib": fileURLToPath(new URL("./src/lib", import.meta.url))
@@ -31,6 +32,11 @@ export default defineConfig({
},
plugins: [dsv()]
}))
on("task", {
async verbrauchsausweisWohnen(query) {
return await prisma.verbrauchsausweisWohnen.findFirst(query)
}
})
},
},
component: {

View File

@@ -23,6 +23,7 @@
"@astrojs/svelte": "^2.2.0",
"@astrojs/tailwind": "^3.1.3",
"@aws-sdk/client-s3": "^3.758.0",
"@highlight-run/node": "^3.12.0",
"@ibcornelsen/ui": "^0.0.2",
"@mollie/api-client": "^4.1.0",
"@pdfme/common": "^5.2.16",
@@ -39,6 +40,7 @@
"express": "^4.21.2",
"flag-icons": "^6.15.0",
"fontkit": "^2.0.4",
"highlight.run": "^9.14.0",
"is-base64": "^1.1.0",
"js-cookie": "^3.0.5",
"js-interpolate": "^1.3.2",

View File

@@ -0,0 +1,573 @@
/*
Warnings:
- The primary key for the `Anteilshaber` table will be changed. If it partially fails, the table could be left without primary key constraint.
- You are about to drop the column `uid` on the `Anteilshaber` table. All the data in the column will be lost.
- You are about to alter the column `id` on the `Anteilshaber` table. The data in that column could be lost. The data in that column will be cast from `Integer` to `VarChar(8)`.
- The primary key for the `ApiRequests` table will be changed. If it partially fails, the table could be left without primary key constraint.
- You are about to alter the column `id` on the `ApiRequests` table. The data in that column could be lost. The data in that column will be cast from `Integer` to `VarChar(8)`.
- The primary key for the `Aufnahme` table will be changed. If it partially fails, the table could be left without primary key constraint.
- You are about to drop the column `uid` on the `Aufnahme` table. All the data in the column will be lost.
- You are about to alter the column `id` on the `Aufnahme` table. The data in that column could be lost. The data in that column will be cast from `Integer` to `VarChar(8)`.
- The primary key for the `BedarfsausweisGewerbe` table will be changed. If it partially fails, the table could be left without primary key constraint.
- You are about to drop the column `uid` on the `BedarfsausweisGewerbe` table. All the data in the column will be lost.
- You are about to alter the column `id` on the `BedarfsausweisGewerbe` table. The data in that column could be lost. The data in that column will be cast from `Integer` to `VarChar(8)`.
- The primary key for the `BedarfsausweisWohnen` table will be changed. If it partially fails, the table could be left without primary key constraint.
- You are about to drop the column `uid` on the `BedarfsausweisWohnen` table. All the data in the column will be lost.
- You are about to alter the column `id` on the `BedarfsausweisWohnen` table. The data in that column could be lost. The data in that column will be cast from `Integer` to `VarChar(8)`.
- The primary key for the `Bild` table will be changed. If it partially fails, the table could be left without primary key constraint.
- You are about to alter the column `id` on the `Bild` table. The data in that column could be lost. The data in that column will be cast from `Integer` to `VarChar(8)`.
- The primary key for the `Event` table will be changed. If it partially fails, the table could be left without primary key constraint.
- You are about to drop the column `uid` on the `Event` table. All the data in the column will be lost.
- You are about to alter the column `id` on the `Event` table. The data in that column could be lost. The data in that column will be cast from `Integer` to `VarChar(8)`.
- The primary key for the `GEGEinpreisung` table will be changed. If it partially fails, the table could be left without primary key constraint.
- You are about to drop the column `uid` on the `GEGEinpreisung` table. All the data in the column will be lost.
- You are about to alter the column `id` on the `GEGEinpreisung` table. The data in that column could be lost. The data in that column will be cast from `Integer` to `VarChar(8)`.
- The primary key for the `GEGNachweisGewerbe` table will be changed. If it partially fails, the table could be left without primary key constraint.
- You are about to drop the column `uid` on the `GEGNachweisGewerbe` table. All the data in the column will be lost.
- You are about to alter the column `id` on the `GEGNachweisGewerbe` table. The data in that column could be lost. The data in that column will be cast from `Integer` to `VarChar(8)`.
- The primary key for the `GEGNachweisWohnen` table will be changed. If it partially fails, the table could be left without primary key constraint.
- You are about to drop the column `uid` on the `GEGNachweisWohnen` table. All the data in the column will be lost.
- You are about to alter the column `id` on the `GEGNachweisWohnen` table. The data in that column could be lost. The data in that column will be cast from `Integer` to `VarChar(8)`.
- The primary key for the `Objekt` table will be changed. If it partially fails, the table could be left without primary key constraint.
- You are about to drop the column `uid` on the `Objekt` table. All the data in the column will be lost.
- You are about to alter the column `id` on the `Objekt` table. The data in that column could be lost. The data in that column will be cast from `Integer` to `VarChar(8)`.
- The primary key for the `Rechnung` table will be changed. If it partially fails, the table could be left without primary key constraint.
- You are about to drop the column `uid` on the `Rechnung` table. All the data in the column will be lost.
- You are about to alter the column `id` on the `Rechnung` table. The data in that column could be lost. The data in that column will be cast from `Integer` to `VarChar(8)`.
- The primary key for the `Tickets` table will be changed. If it partially fails, the table could be left without primary key constraint.
- You are about to drop the column `uid` on the `Tickets` table. All the data in the column will be lost.
- You are about to alter the column `id` on the `Tickets` table. The data in that column could be lost. The data in that column will be cast from `Integer` to `VarChar(8)`.
- The primary key for the `Unterlage` table will be changed. If it partially fails, the table could be left without primary key constraint.
- You are about to drop the column `uid` on the `Unterlage` table. All the data in the column will be lost.
- You are about to alter the column `id` on the `Unterlage` table. The data in that column could be lost. The data in that column will be cast from `Integer` to `VarChar(8)`.
- The primary key for the `VerbrauchsausweisGewerbe` table will be changed. If it partially fails, the table could be left without primary key constraint.
- You are about to drop the column `uid` on the `VerbrauchsausweisGewerbe` table. All the data in the column will be lost.
- You are about to alter the column `id` on the `VerbrauchsausweisGewerbe` table. The data in that column could be lost. The data in that column will be cast from `Integer` to `VarChar(8)`.
- The primary key for the `VerbrauchsausweisWohnen` table will be changed. If it partially fails, the table could be left without primary key constraint.
- You are about to drop the column `uid` on the `VerbrauchsausweisWohnen` table. All the data in the column will be lost.
- You are about to alter the column `id` on the `VerbrauchsausweisWohnen` table. The data in that column could be lost. The data in that column will be cast from `Integer` to `VarChar(8)`.
- The primary key for the `benutzer` table will be changed. If it partially fails, the table could be left without primary key constraint.
- You are about to drop the column `uid` on the `benutzer` table. All the data in the column will be lost.
- You are about to alter the column `id` on the `benutzer` table. The data in that column could be lost. The data in that column will be cast from `Integer` to `VarChar(8)`.
- A unique constraint covering the columns `[id]` on the table `Anteilshaber` will be added. If there are existing duplicate values, this will fail.
- A unique constraint covering the columns `[id]` on the table `ApiRequests` will be added. If there are existing duplicate values, this will fail.
- A unique constraint covering the columns `[id]` on the table `Aufnahme` will be added. If there are existing duplicate values, this will fail.
- A unique constraint covering the columns `[id]` on the table `BedarfsausweisGewerbe` will be added. If there are existing duplicate values, this will fail.
- A unique constraint covering the columns `[id]` on the table `BedarfsausweisWohnen` will be added. If there are existing duplicate values, this will fail.
- A unique constraint covering the columns `[id]` on the table `Bild` will be added. If there are existing duplicate values, this will fail.
- A unique constraint covering the columns `[id]` on the table `Event` will be added. If there are existing duplicate values, this will fail.
- A unique constraint covering the columns `[id]` on the table `GEGEinpreisung` will be added. If there are existing duplicate values, this will fail.
- A unique constraint covering the columns `[id]` on the table `GEGNachweisGewerbe` will be added. If there are existing duplicate values, this will fail.
- A unique constraint covering the columns `[id]` on the table `GEGNachweisWohnen` will be added. If there are existing duplicate values, this will fail.
- A unique constraint covering the columns `[id]` on the table `Objekt` will be added. If there are existing duplicate values, this will fail.
- A unique constraint covering the columns `[id]` on the table `Rechnung` will be added. If there are existing duplicate values, this will fail.
- A unique constraint covering the columns `[id]` on the table `Tickets` will be added. If there are existing duplicate values, this will fail.
- A unique constraint covering the columns `[id]` on the table `Unterlage` will be added. If there are existing duplicate values, this will fail.
- A unique constraint covering the columns `[id]` on the table `VerbrauchsausweisGewerbe` will be added. If there are existing duplicate values, this will fail.
- A unique constraint covering the columns `[id]` on the table `VerbrauchsausweisWohnen` will be added. If there are existing duplicate values, this will fail.
- A unique constraint covering the columns `[id]` on the table `benutzer` will be added. If there are existing duplicate values, this will fail.
*/
-- DropForeignKey
ALTER TABLE "Anteilshaber" DROP CONSTRAINT "Anteilshaber_benutzer_id_fkey";
-- DropForeignKey
ALTER TABLE "Anteilshaber" DROP CONSTRAINT "Anteilshaber_objekt_id_fkey";
-- DropForeignKey
ALTER TABLE "ApiRequests" DROP CONSTRAINT "ApiRequests_user_id_fkey";
-- DropForeignKey
ALTER TABLE "Aufnahme" DROP CONSTRAINT "Aufnahme_benutzer_id_fkey";
-- DropForeignKey
ALTER TABLE "Aufnahme" DROP CONSTRAINT "Aufnahme_objekt_id_fkey";
-- DropForeignKey
ALTER TABLE "BedarfsausweisGewerbe" DROP CONSTRAINT "BedarfsausweisGewerbe_aufnahme_id_fkey";
-- DropForeignKey
ALTER TABLE "BedarfsausweisGewerbe" DROP CONSTRAINT "BedarfsausweisGewerbe_benutzer_id_fkey";
-- DropForeignKey
ALTER TABLE "BedarfsausweisGewerbe" DROP CONSTRAINT "BedarfsausweisGewerbe_geg_einpreisung_id_fkey";
-- DropForeignKey
ALTER TABLE "BedarfsausweisGewerbe" DROP CONSTRAINT "BedarfsausweisGewerbe_rechnung_id_fkey";
-- DropForeignKey
ALTER TABLE "BedarfsausweisWohnen" DROP CONSTRAINT "BedarfsausweisWohnen_aufnahme_id_fkey";
-- DropForeignKey
ALTER TABLE "BedarfsausweisWohnen" DROP CONSTRAINT "BedarfsausweisWohnen_benutzer_id_fkey";
-- DropForeignKey
ALTER TABLE "BedarfsausweisWohnen" DROP CONSTRAINT "BedarfsausweisWohnen_rechnung_id_fkey";
-- DropForeignKey
ALTER TABLE "Bild" DROP CONSTRAINT "Bild_aufnahme_id_fkey";
-- DropForeignKey
ALTER TABLE "Event" DROP CONSTRAINT "Event_aufnahme_id_fkey";
-- DropForeignKey
ALTER TABLE "Event" DROP CONSTRAINT "Event_benutzer_id_fkey";
-- DropForeignKey
ALTER TABLE "GEGEinpreisung" DROP CONSTRAINT "GEGEinpreisung_benutzer_id_fkey";
-- DropForeignKey
ALTER TABLE "GEGNachweisGewerbe" DROP CONSTRAINT "GEGNachweisGewerbe_aufnahme_id_fkey";
-- DropForeignKey
ALTER TABLE "GEGNachweisGewerbe" DROP CONSTRAINT "GEGNachweisGewerbe_benutzer_id_fkey";
-- DropForeignKey
ALTER TABLE "GEGNachweisGewerbe" DROP CONSTRAINT "GEGNachweisGewerbe_geg_einpreisung_id_fkey";
-- DropForeignKey
ALTER TABLE "GEGNachweisGewerbe" DROP CONSTRAINT "GEGNachweisGewerbe_rechnung_id_fkey";
-- DropForeignKey
ALTER TABLE "GEGNachweisWohnen" DROP CONSTRAINT "GEGNachweisWohnen_aufnahme_id_fkey";
-- DropForeignKey
ALTER TABLE "GEGNachweisWohnen" DROP CONSTRAINT "GEGNachweisWohnen_benutzer_id_fkey";
-- DropForeignKey
ALTER TABLE "GEGNachweisWohnen" DROP CONSTRAINT "GEGNachweisWohnen_geg_einpreisung_id_fkey";
-- DropForeignKey
ALTER TABLE "GEGNachweisWohnen" DROP CONSTRAINT "GEGNachweisWohnen_rechnung_id_fkey";
-- DropForeignKey
ALTER TABLE "Objekt" DROP CONSTRAINT "Objekt_benutzer_id_fkey";
-- DropForeignKey
ALTER TABLE "Rechnung" DROP CONSTRAINT "Rechnung_benutzer_id_fkey";
-- DropForeignKey
ALTER TABLE "RefreshTokens" DROP CONSTRAINT "RefreshTokens_benutzer_id_fkey";
-- DropForeignKey
ALTER TABLE "Tickets" DROP CONSTRAINT "Tickets_bearbeiter_id_fkey";
-- DropForeignKey
ALTER TABLE "Tickets" DROP CONSTRAINT "Tickets_benutzer_id_fkey";
-- DropForeignKey
ALTER TABLE "Unterlage" DROP CONSTRAINT "Unterlage_aufnahme_id_fkey";
-- DropForeignKey
ALTER TABLE "VerbrauchsausweisGewerbe" DROP CONSTRAINT "VerbrauchsausweisGewerbe_aufnahme_id_fkey";
-- DropForeignKey
ALTER TABLE "VerbrauchsausweisGewerbe" DROP CONSTRAINT "VerbrauchsausweisGewerbe_benutzer_id_fkey";
-- DropForeignKey
ALTER TABLE "VerbrauchsausweisGewerbe" DROP CONSTRAINT "VerbrauchsausweisGewerbe_rechnung_id_fkey";
-- DropForeignKey
ALTER TABLE "VerbrauchsausweisWohnen" DROP CONSTRAINT "VerbrauchsausweisWohnen_aufnahme_id_fkey";
-- DropForeignKey
ALTER TABLE "VerbrauchsausweisWohnen" DROP CONSTRAINT "VerbrauchsausweisWohnen_benutzer_id_fkey";
-- DropForeignKey
ALTER TABLE "VerbrauchsausweisWohnen" DROP CONSTRAINT "VerbrauchsausweisWohnen_rechnung_id_fkey";
-- DropForeignKey
ALTER TABLE "documenttemplates" DROP CONSTRAINT "benutzer_fk";
-- DropForeignKey
ALTER TABLE "tokens" DROP CONSTRAINT "fk_benutzer_tokens_user_id";
-- DropIndex
DROP INDEX "Anteilshaber_uid_key";
-- DropIndex
DROP INDEX "Aufnahme_uid_key";
-- DropIndex
DROP INDEX "BedarfsausweisGewerbe_uid_key";
-- DropIndex
DROP INDEX "BedarfsausweisWohnen_uid_key";
-- DropIndex
DROP INDEX "Event_uid_key";
-- DropIndex
DROP INDEX "GEGEinpreisung_uid_key";
-- DropIndex
DROP INDEX "GEGNachweisGewerbe_uid_key";
-- DropIndex
DROP INDEX "GEGNachweisWohnen_uid_key";
-- DropIndex
DROP INDEX "Objekt_uid_key";
-- DropIndex
DROP INDEX "Rechnung_uid_key";
-- DropIndex
DROP INDEX "Tickets_uid_key";
-- DropIndex
DROP INDEX "Unterlage_uid_key";
-- DropIndex
DROP INDEX "VerbrauchsausweisGewerbe_uid_key";
-- DropIndex
DROP INDEX "VerbrauchsausweisWohnen_uid_key";
-- DropIndex
DROP INDEX "benutzer_uid_key";
-- AlterTable
ALTER TABLE "Anteilshaber" DROP CONSTRAINT "Anteilshaber_pkey",
DROP COLUMN "uid",
ALTER COLUMN "id" DROP DEFAULT,
ALTER COLUMN "id" SET DATA TYPE VARCHAR(8),
ALTER COLUMN "benutzer_id" SET DATA TYPE TEXT,
ALTER COLUMN "objekt_id" SET DATA TYPE TEXT,
ADD CONSTRAINT "Anteilshaber_pkey" PRIMARY KEY ("id");
DROP SEQUENCE "Anteilshaber_id_seq";
-- AlterTable
ALTER TABLE "ApiRequests" DROP CONSTRAINT "ApiRequests_pkey",
ALTER COLUMN "id" DROP DEFAULT,
ALTER COLUMN "id" SET DATA TYPE VARCHAR(8),
ALTER COLUMN "user_id" SET DATA TYPE TEXT,
ADD CONSTRAINT "ApiRequests_pkey" PRIMARY KEY ("id");
DROP SEQUENCE "ApiRequests_id_seq";
-- AlterTable
ALTER TABLE "Aufnahme" DROP CONSTRAINT "Aufnahme_pkey",
DROP COLUMN "uid",
ALTER COLUMN "id" DROP DEFAULT,
ALTER COLUMN "id" SET DATA TYPE VARCHAR(8),
ALTER COLUMN "benutzer_id" SET DATA TYPE TEXT,
ALTER COLUMN "objekt_id" SET DATA TYPE TEXT,
ADD CONSTRAINT "Aufnahme_pkey" PRIMARY KEY ("id");
DROP SEQUENCE "Aufnahme_id_seq";
-- AlterTable
ALTER TABLE "BedarfsausweisGewerbe" DROP CONSTRAINT "BedarfsausweisGewerbe_pkey",
DROP COLUMN "uid",
ALTER COLUMN "id" DROP DEFAULT,
ALTER COLUMN "id" SET DATA TYPE VARCHAR(8),
ALTER COLUMN "benutzer_id" SET DATA TYPE TEXT,
ALTER COLUMN "aufnahme_id" SET DATA TYPE TEXT,
ALTER COLUMN "rechnung_id" SET DATA TYPE TEXT,
ALTER COLUMN "geg_einpreisung_id" SET DATA TYPE TEXT,
ADD CONSTRAINT "BedarfsausweisGewerbe_pkey" PRIMARY KEY ("id");
DROP SEQUENCE "BedarfsausweisGewerbe_id_seq";
-- AlterTable
ALTER TABLE "BedarfsausweisWohnen" DROP CONSTRAINT "BedarfsausweisWohnen_pkey",
DROP COLUMN "uid",
ALTER COLUMN "id" DROP DEFAULT,
ALTER COLUMN "id" SET DATA TYPE VARCHAR(8),
ALTER COLUMN "benutzer_id" SET DATA TYPE TEXT,
ALTER COLUMN "rechnung_id" SET DATA TYPE TEXT,
ALTER COLUMN "aufnahme_id" SET DATA TYPE TEXT,
ADD CONSTRAINT "BedarfsausweisWohnen_pkey" PRIMARY KEY ("id");
DROP SEQUENCE "BedarfsausweisWohnen_id_seq";
-- AlterTable
ALTER TABLE "Bild" DROP CONSTRAINT "Bild_pkey",
ALTER COLUMN "id" DROP DEFAULT,
ALTER COLUMN "id" SET DATA TYPE VARCHAR(8),
ALTER COLUMN "uid" SET DEFAULT 'img-' || gen_random_uuid(),
ALTER COLUMN "aufnahme_id" SET DATA TYPE TEXT,
ADD CONSTRAINT "Bild_pkey" PRIMARY KEY ("id");
DROP SEQUENCE "Bild_id_seq";
-- AlterTable
ALTER TABLE "Event" DROP CONSTRAINT "Event_pkey",
DROP COLUMN "uid",
ALTER COLUMN "id" DROP DEFAULT,
ALTER COLUMN "id" SET DATA TYPE VARCHAR(8),
ALTER COLUMN "aufnahme_id" SET DATA TYPE TEXT,
ALTER COLUMN "benutzer_id" SET DATA TYPE TEXT,
ADD CONSTRAINT "Event_pkey" PRIMARY KEY ("id");
DROP SEQUENCE "Event_id_seq";
-- AlterTable
ALTER TABLE "GEGEinpreisung" DROP CONSTRAINT "GEGEinpreisung_pkey",
DROP COLUMN "uid",
ALTER COLUMN "id" DROP DEFAULT,
ALTER COLUMN "id" SET DATA TYPE VARCHAR(8),
ALTER COLUMN "benutzer_id" SET DATA TYPE TEXT,
ADD CONSTRAINT "GEGEinpreisung_pkey" PRIMARY KEY ("id");
DROP SEQUENCE "GEGEinpreisung_id_seq";
-- AlterTable
ALTER TABLE "GEGNachweisGewerbe" DROP CONSTRAINT "GEGNachweisGewerbe_pkey",
DROP COLUMN "uid",
ALTER COLUMN "id" DROP DEFAULT,
ALTER COLUMN "id" SET DATA TYPE VARCHAR(8),
ALTER COLUMN "benutzer_id" SET DATA TYPE TEXT,
ALTER COLUMN "aufnahme_id" SET DATA TYPE TEXT,
ALTER COLUMN "rechnung_id" SET DATA TYPE TEXT,
ALTER COLUMN "geg_einpreisung_id" SET DATA TYPE TEXT,
ADD CONSTRAINT "GEGNachweisGewerbe_pkey" PRIMARY KEY ("id");
DROP SEQUENCE "GEGNachweisGewerbe_id_seq";
-- AlterTable
ALTER TABLE "GEGNachweisWohnen" DROP CONSTRAINT "GEGNachweisWohnen_pkey",
DROP COLUMN "uid",
ALTER COLUMN "id" DROP DEFAULT,
ALTER COLUMN "id" SET DATA TYPE VARCHAR(8),
ALTER COLUMN "benutzer_id" SET DATA TYPE TEXT,
ALTER COLUMN "aufnahme_id" SET DATA TYPE TEXT,
ALTER COLUMN "rechnung_id" SET DATA TYPE TEXT,
ALTER COLUMN "geg_einpreisung_id" SET DATA TYPE TEXT,
ADD CONSTRAINT "GEGNachweisWohnen_pkey" PRIMARY KEY ("id");
DROP SEQUENCE "GEGNachweisWohnen_id_seq";
-- AlterTable
ALTER TABLE "Objekt" DROP CONSTRAINT "Objekt_pkey",
DROP COLUMN "uid",
ALTER COLUMN "id" DROP DEFAULT,
ALTER COLUMN "id" SET DATA TYPE VARCHAR(8),
ALTER COLUMN "benutzer_id" SET DATA TYPE TEXT,
ADD CONSTRAINT "Objekt_pkey" PRIMARY KEY ("id");
DROP SEQUENCE "Objekt_id_seq";
-- AlterTable
ALTER TABLE "Rechnung" DROP CONSTRAINT "Rechnung_pkey",
DROP COLUMN "uid",
ALTER COLUMN "id" DROP DEFAULT,
ALTER COLUMN "id" SET DATA TYPE VARCHAR(8),
ALTER COLUMN "benutzer_id" SET DATA TYPE TEXT,
ADD CONSTRAINT "Rechnung_pkey" PRIMARY KEY ("id");
DROP SEQUENCE "Rechnung_id_seq";
-- AlterTable
ALTER TABLE "RefreshTokens" ALTER COLUMN "benutzer_id" SET DATA TYPE TEXT;
-- AlterTable
ALTER TABLE "Tickets" DROP CONSTRAINT "Tickets_pkey",
DROP COLUMN "uid",
ALTER COLUMN "id" DROP DEFAULT,
ALTER COLUMN "id" SET DATA TYPE VARCHAR(8),
ALTER COLUMN "benutzer_id" SET DATA TYPE TEXT,
ALTER COLUMN "bearbeiter_id" SET DATA TYPE TEXT,
ADD CONSTRAINT "Tickets_pkey" PRIMARY KEY ("id");
DROP SEQUENCE "Tickets_id_seq";
-- AlterTable
ALTER TABLE "Unterlage" DROP CONSTRAINT "Unterlage_pkey",
DROP COLUMN "uid",
ALTER COLUMN "id" DROP DEFAULT,
ALTER COLUMN "id" SET DATA TYPE VARCHAR(8),
ALTER COLUMN "aufnahme_id" SET DATA TYPE TEXT,
ADD CONSTRAINT "Unterlage_pkey" PRIMARY KEY ("id");
DROP SEQUENCE "Unterlage_id_seq";
-- AlterTable
ALTER TABLE "VerbrauchsausweisGewerbe" DROP CONSTRAINT "VerbrauchsausweisGewerbe_pkey",
DROP COLUMN "uid",
ALTER COLUMN "id" DROP DEFAULT,
ALTER COLUMN "id" SET DATA TYPE VARCHAR(8),
ALTER COLUMN "benutzer_id" SET DATA TYPE TEXT,
ALTER COLUMN "rechnung_id" SET DATA TYPE TEXT,
ALTER COLUMN "aufnahme_id" SET DATA TYPE TEXT,
ADD CONSTRAINT "VerbrauchsausweisGewerbe_pkey" PRIMARY KEY ("id");
DROP SEQUENCE "VerbrauchsausweisGewerbe_id_seq";
-- AlterTable
ALTER TABLE "VerbrauchsausweisWohnen" DROP CONSTRAINT "VerbrauchsausweisWohnen_pkey",
DROP COLUMN "uid",
ALTER COLUMN "id" DROP DEFAULT,
ALTER COLUMN "id" SET DATA TYPE VARCHAR(8),
ALTER COLUMN "benutzer_id" SET DATA TYPE TEXT,
ALTER COLUMN "rechnung_id" SET DATA TYPE TEXT,
ALTER COLUMN "aufnahme_id" SET DATA TYPE TEXT,
ADD CONSTRAINT "VerbrauchsausweisWohnen_pkey" PRIMARY KEY ("id");
DROP SEQUENCE "VerbrauchsausweisWohnen_id_seq";
-- AlterTable
ALTER TABLE "benutzer" DROP CONSTRAINT "benutzer_pkey",
DROP COLUMN "uid",
ALTER COLUMN "id" DROP DEFAULT,
ALTER COLUMN "id" SET DATA TYPE VARCHAR(8),
ADD CONSTRAINT "benutzer_pkey" PRIMARY KEY ("id");
DROP SEQUENCE "benutzer_id_seq";
-- AlterTable
ALTER TABLE "documenttemplates" ALTER COLUMN "user_id" SET DATA TYPE TEXT;
-- AlterTable
ALTER TABLE "tokens" ALTER COLUMN "user_id" SET DATA TYPE TEXT;
-- CreateIndex
CREATE UNIQUE INDEX "Anteilshaber_id_key" ON "Anteilshaber"("id");
-- CreateIndex
CREATE UNIQUE INDEX "ApiRequests_id_key" ON "ApiRequests"("id");
-- CreateIndex
CREATE UNIQUE INDEX "Aufnahme_id_key" ON "Aufnahme"("id");
-- CreateIndex
CREATE UNIQUE INDEX "BedarfsausweisGewerbe_id_key" ON "BedarfsausweisGewerbe"("id");
-- CreateIndex
CREATE UNIQUE INDEX "BedarfsausweisWohnen_id_key" ON "BedarfsausweisWohnen"("id");
-- CreateIndex
CREATE UNIQUE INDEX "Bild_id_key" ON "Bild"("id");
-- CreateIndex
CREATE UNIQUE INDEX "Event_id_key" ON "Event"("id");
-- CreateIndex
CREATE UNIQUE INDEX "GEGEinpreisung_id_key" ON "GEGEinpreisung"("id");
-- CreateIndex
CREATE UNIQUE INDEX "GEGNachweisGewerbe_id_key" ON "GEGNachweisGewerbe"("id");
-- CreateIndex
CREATE UNIQUE INDEX "GEGNachweisWohnen_id_key" ON "GEGNachweisWohnen"("id");
-- CreateIndex
CREATE UNIQUE INDEX "Objekt_id_key" ON "Objekt"("id");
-- CreateIndex
CREATE UNIQUE INDEX "Rechnung_id_key" ON "Rechnung"("id");
-- CreateIndex
CREATE UNIQUE INDEX "Tickets_id_key" ON "Tickets"("id");
-- CreateIndex
CREATE UNIQUE INDEX "Unterlage_id_key" ON "Unterlage"("id");
-- CreateIndex
CREATE UNIQUE INDEX "VerbrauchsausweisGewerbe_id_key" ON "VerbrauchsausweisGewerbe"("id");
-- CreateIndex
CREATE UNIQUE INDEX "VerbrauchsausweisWohnen_id_key" ON "VerbrauchsausweisWohnen"("id");
-- CreateIndex
CREATE UNIQUE INDEX "benutzer_id_key" ON "benutzer"("id");
-- AddForeignKey
ALTER TABLE "Anteilshaber" ADD CONSTRAINT "Anteilshaber_benutzer_id_fkey" FOREIGN KEY ("benutzer_id") REFERENCES "benutzer"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "Anteilshaber" ADD CONSTRAINT "Anteilshaber_objekt_id_fkey" FOREIGN KEY ("objekt_id") REFERENCES "Objekt"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "ApiRequests" ADD CONSTRAINT "ApiRequests_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "benutzer"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "Aufnahme" ADD CONSTRAINT "Aufnahme_benutzer_id_fkey" FOREIGN KEY ("benutzer_id") REFERENCES "benutzer"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "Aufnahme" ADD CONSTRAINT "Aufnahme_objekt_id_fkey" FOREIGN KEY ("objekt_id") REFERENCES "Objekt"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "BedarfsausweisGewerbe" ADD CONSTRAINT "BedarfsausweisGewerbe_benutzer_id_fkey" FOREIGN KEY ("benutzer_id") REFERENCES "benutzer"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "BedarfsausweisGewerbe" ADD CONSTRAINT "BedarfsausweisGewerbe_aufnahme_id_fkey" FOREIGN KEY ("aufnahme_id") REFERENCES "Aufnahme"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "BedarfsausweisGewerbe" ADD CONSTRAINT "BedarfsausweisGewerbe_rechnung_id_fkey" FOREIGN KEY ("rechnung_id") REFERENCES "Rechnung"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "BedarfsausweisGewerbe" ADD CONSTRAINT "BedarfsausweisGewerbe_geg_einpreisung_id_fkey" FOREIGN KEY ("geg_einpreisung_id") REFERENCES "GEGEinpreisung"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "BedarfsausweisWohnen" ADD CONSTRAINT "BedarfsausweisWohnen_benutzer_id_fkey" FOREIGN KEY ("benutzer_id") REFERENCES "benutzer"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "BedarfsausweisWohnen" ADD CONSTRAINT "BedarfsausweisWohnen_rechnung_id_fkey" FOREIGN KEY ("rechnung_id") REFERENCES "Rechnung"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "BedarfsausweisWohnen" ADD CONSTRAINT "BedarfsausweisWohnen_aufnahme_id_fkey" FOREIGN KEY ("aufnahme_id") REFERENCES "Aufnahme"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "Bild" ADD CONSTRAINT "Bild_aufnahme_id_fkey" FOREIGN KEY ("aufnahme_id") REFERENCES "Aufnahme"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "Event" ADD CONSTRAINT "Event_aufnahme_id_fkey" FOREIGN KEY ("aufnahme_id") REFERENCES "Aufnahme"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "Event" ADD CONSTRAINT "Event_benutzer_id_fkey" FOREIGN KEY ("benutzer_id") REFERENCES "benutzer"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "GEGEinpreisung" ADD CONSTRAINT "GEGEinpreisung_benutzer_id_fkey" FOREIGN KEY ("benutzer_id") REFERENCES "benutzer"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "GEGNachweisGewerbe" ADD CONSTRAINT "GEGNachweisGewerbe_benutzer_id_fkey" FOREIGN KEY ("benutzer_id") REFERENCES "benutzer"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "GEGNachweisGewerbe" ADD CONSTRAINT "GEGNachweisGewerbe_aufnahme_id_fkey" FOREIGN KEY ("aufnahme_id") REFERENCES "Aufnahme"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "GEGNachweisGewerbe" ADD CONSTRAINT "GEGNachweisGewerbe_rechnung_id_fkey" FOREIGN KEY ("rechnung_id") REFERENCES "Rechnung"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "GEGNachweisGewerbe" ADD CONSTRAINT "GEGNachweisGewerbe_geg_einpreisung_id_fkey" FOREIGN KEY ("geg_einpreisung_id") REFERENCES "GEGEinpreisung"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "GEGNachweisWohnen" ADD CONSTRAINT "GEGNachweisWohnen_benutzer_id_fkey" FOREIGN KEY ("benutzer_id") REFERENCES "benutzer"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "GEGNachweisWohnen" ADD CONSTRAINT "GEGNachweisWohnen_aufnahme_id_fkey" FOREIGN KEY ("aufnahme_id") REFERENCES "Aufnahme"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "GEGNachweisWohnen" ADD CONSTRAINT "GEGNachweisWohnen_rechnung_id_fkey" FOREIGN KEY ("rechnung_id") REFERENCES "Rechnung"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "GEGNachweisWohnen" ADD CONSTRAINT "GEGNachweisWohnen_geg_einpreisung_id_fkey" FOREIGN KEY ("geg_einpreisung_id") REFERENCES "GEGEinpreisung"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "Objekt" ADD CONSTRAINT "Objekt_benutzer_id_fkey" FOREIGN KEY ("benutzer_id") REFERENCES "benutzer"("id") ON DELETE SET NULL ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "Rechnung" ADD CONSTRAINT "Rechnung_benutzer_id_fkey" FOREIGN KEY ("benutzer_id") REFERENCES "benutzer"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "RefreshTokens" ADD CONSTRAINT "RefreshTokens_benutzer_id_fkey" FOREIGN KEY ("benutzer_id") REFERENCES "benutzer"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "Tickets" ADD CONSTRAINT "Tickets_benutzer_id_fkey" FOREIGN KEY ("benutzer_id") REFERENCES "benutzer"("id") ON DELETE SET NULL ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "Tickets" ADD CONSTRAINT "Tickets_bearbeiter_id_fkey" FOREIGN KEY ("bearbeiter_id") REFERENCES "benutzer"("id") ON DELETE SET NULL ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "Unterlage" ADD CONSTRAINT "Unterlage_aufnahme_id_fkey" FOREIGN KEY ("aufnahme_id") REFERENCES "Aufnahme"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "VerbrauchsausweisGewerbe" ADD CONSTRAINT "VerbrauchsausweisGewerbe_benutzer_id_fkey" FOREIGN KEY ("benutzer_id") REFERENCES "benutzer"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "VerbrauchsausweisGewerbe" ADD CONSTRAINT "VerbrauchsausweisGewerbe_rechnung_id_fkey" FOREIGN KEY ("rechnung_id") REFERENCES "Rechnung"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "VerbrauchsausweisGewerbe" ADD CONSTRAINT "VerbrauchsausweisGewerbe_aufnahme_id_fkey" FOREIGN KEY ("aufnahme_id") REFERENCES "Aufnahme"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "VerbrauchsausweisWohnen" ADD CONSTRAINT "VerbrauchsausweisWohnen_benutzer_id_fkey" FOREIGN KEY ("benutzer_id") REFERENCES "benutzer"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "VerbrauchsausweisWohnen" ADD CONSTRAINT "VerbrauchsausweisWohnen_rechnung_id_fkey" FOREIGN KEY ("rechnung_id") REFERENCES "Rechnung"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "VerbrauchsausweisWohnen" ADD CONSTRAINT "VerbrauchsausweisWohnen_aufnahme_id_fkey" FOREIGN KEY ("aufnahme_id") REFERENCES "Aufnahme"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE "documenttemplates" ADD CONSTRAINT "benutzer_fk" FOREIGN KEY ("user_id") REFERENCES "benutzer"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "tokens" ADD CONSTRAINT "fk_benutzer_tokens_user_id" FOREIGN KEY ("user_id") REFERENCES "benutzer"("id") ON DELETE NO ACTION ON UPDATE NO ACTION;

View File

@@ -1,11 +1,11 @@
model Anteilshaber {
id Int @id @default(autoincrement())
benutzer_id Int
id String @id @unique @db.VarChar(8)
rolle String? @db.VarChar
privilegien BigInt?
uid String @unique @default(dbgenerated("'ant-' || gen_random_uuid()"))
benutzer_id String
benutzer Benutzer @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
objekt_id Int
objekt_id String
objekt Objekt @relation(fields: [objekt_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
}

View File

@@ -1,6 +1,6 @@
model ApiRequests {
id Int @id @default(autoincrement())
id String @id @unique @db.VarChar(8)
date DateTime @default(now()) @db.Timestamp(6)
ip String @db.VarChar(50)
method String @db.VarChar(10)
@@ -9,6 +9,6 @@ model ApiRequests {
responseTime Float
responseSize Int
userAgent String @db.VarChar(500)
user_id Int?
user_id String?
user Benutzer? @relation(fields: [user_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
}

View File

@@ -13,10 +13,8 @@ enum Lueftungskonzept {
}
model Aufnahme {
id Int @id @default(autoincrement())
/// @zod.describe("UID der Gebäude Aufnahme")
uid String @unique @default(dbgenerated("'auf-' || gen_random_uuid()"))
benutzer_id Int?
id String @id @unique @db.VarChar(8)
benutzer_id String?
benutzer Benutzer? @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
/// @zod.describe("Art des korrespondierenden Ausweises, wie z.B. VerbrauchsausweisWohnen")
ausweisart Ausweisart?
@@ -142,7 +140,7 @@ model Aufnahme {
geg_nachweise_gewerbe GEGNachweisGewerbe[]
bedarfsausweise_gewerbe BedarfsausweisGewerbe[]
objekt_id Int
objekt_id String
objekt Objekt @relation(fields: [objekt_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
}

View File

@@ -1,6 +1,5 @@
model BedarfsausweisGewerbe {
id Int @id @default(autoincrement())
uid String @unique @default(dbgenerated("'bag-' || gen_random_uuid()"))
id String @id @unique @db.VarChar(8)
/// @zod.describe("Ausstellgrund wie z.B. Vermietung oder Verkauf")
ausstellgrund Ausstellgrund?
@@ -27,13 +26,13 @@ model BedarfsausweisGewerbe {
klimatisierung Boolean? @default(false)
/// @zod.describe("Die ID des Benutzers, welchem dieser Ausweis gehört")
benutzer_id Int?
benutzer_id String?
benutzer Benutzer? @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
aufnahme_id Int @unique
aufnahme_id String @unique
aufnahme Aufnahme @relation(fields: [aufnahme_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
rechnung_id Int? @unique
rechnung_id String? @unique
rechnung Rechnung? @relation(fields: [rechnung_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
geg_einpreisung_id Int? @unique
geg_einpreisung_id String? @unique
geg_einpreisung GEGEinpreisung? @relation(fields: [geg_einpreisung_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
}

View File

@@ -1,9 +1,8 @@
model BedarfsausweisWohnen {
id Int @id @default(autoincrement())
id String @id @unique @db.VarChar(8)
alte_ausweis_id Int?
uid String @unique @default(dbgenerated("'baw-' || gen_random_uuid()"))
benutzer_id Int?
benutzer_id String?
ausstellgrund Ausstellgrund?
registriernummer String? @db.VarChar
@@ -83,10 +82,10 @@ model BedarfsausweisWohnen {
benutzer Benutzer? @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
rechnung_id Int? @unique
rechnung_id String? @unique
rechnung Rechnung? @relation(fields: [rechnung_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
/// @zod.describe("ID der korrespondierenden Gebäudeaufnahme")
aufnahme_id Int @unique
aufnahme_id String @unique
aufnahme Aufnahme @relation(fields: [aufnahme_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
}

View File

@@ -5,8 +5,7 @@ enum BenutzerRolle {
}
model Benutzer {
id Int @id @default(autoincrement())
uid String @unique @default(dbgenerated("'usr-' || gen_random_uuid()"))
id String @id @unique @db.VarChar(8)
name String? @db.VarChar(50)
vorname String? @db.VarChar(50)
email String @unique(map: "benutzer_email_idx") @db.VarChar(255)

View File

@@ -8,11 +8,10 @@ enum BilderKategorie {
}
model Bild {
id Int @id @default(autoincrement())
id String @id @unique @db.VarChar(8)
kategorie BilderKategorie
uid String @unique @default(dbgenerated("'img-' || gen_random_uuid()"))
name String
aufnahme_id Int?
aufnahme_id String?
aufnahme Aufnahme? @relation(fields: [aufnahme_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
}

View File

@@ -3,8 +3,7 @@
// Hier werden beispielsweise Events wie "Nachricht Verschickt" gespeichert.
// Diese Events werden dann in der Admin-Oberfläche angezeigt.
model Event {
id Int @id @default(autoincrement())
uid String @unique @default(dbgenerated("'evt-' || gen_random_uuid()"))
id String @id @unique @db.VarChar(8)
date DateTime @default(now()) @db.Timestamp(6)
title String @db.VarChar(255)
@@ -12,9 +11,9 @@ model Event {
// Verlinkung des Gebäudes
aufnahme_id Int
aufnahme_id String
aufnahme Aufnahme @relation(fields: [aufnahme_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
// Verlinkung des Benutzers
benutzer_id Int?
benutzer_id String?
benutzer Benutzer? @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
}

View File

@@ -6,8 +6,7 @@ enum Einpreisungsstatus {
}
model GEGEinpreisung {
id Int @id @default(autoincrement())
uid String @unique @default(dbgenerated("'gge-' || gen_random_uuid()"))
id String @id @unique @db.VarChar(8)
empfaenger String? @db.VarChar
strasse String? @db.VarChar
@@ -31,6 +30,6 @@ model GEGEinpreisung {
bedarfsausweis_gewerbe BedarfsausweisGewerbe?
/// @zod.describe("Die ID des Benutzers, der diese Einpreisung bekommt.")
benutzer_id Int?
benutzer_id String?
benutzer Benutzer? @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
}

View File

@@ -1,6 +1,5 @@
model GEGNachweisGewerbe {
id Int @id @default(autoincrement())
uid String @unique @default(dbgenerated("'gng-' || gen_random_uuid()"))
id String @id @unique @db.VarChar(8)
/// @zod.describe("Ausstellgrund wie z.B. Vermietung oder Verkauf")
ausstellgrund Ausstellgrund?
@@ -18,13 +17,13 @@ model GEGNachweisGewerbe {
beschreibung String? @db.Text
/// @zod.describe("Die ID des Benutzers, welchem dieser Ausweis gehört")
benutzer_id Int?
benutzer_id String?
benutzer Benutzer? @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
aufnahme_id Int @unique
aufnahme_id String @unique
aufnahme Aufnahme @relation(fields: [aufnahme_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
rechnung_id Int? @unique
rechnung_id String? @unique
rechnung Rechnung? @relation(fields: [rechnung_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
geg_einpreisung_id Int? @unique
geg_einpreisung_id String? @unique
geg_einpreisung GEGEinpreisung? @relation(fields: [geg_einpreisung_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
}

View File

@@ -1,6 +1,5 @@
model GEGNachweisWohnen {
id Int @id @default(autoincrement())
uid String @unique @default(dbgenerated("'gnw-' || gen_random_uuid()"))
id String @id @unique @db.VarChar(8)
/// @zod.describe("Ausstellgrund wie z.B. Vermietung oder Verkauf")
ausstellgrund Ausstellgrund?
@@ -18,13 +17,13 @@ model GEGNachweisWohnen {
beschreibung String? @db.Text
/// @zod.describe("Die ID des Benutzers, welchem dieser Ausweis gehört")
benutzer_id Int?
benutzer_id String?
benutzer Benutzer? @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
aufnahme_id Int @unique
aufnahme_id String @unique
aufnahme Aufnahme @relation(fields: [aufnahme_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
rechnung_id Int? @unique
rechnung_id String? @unique
rechnung Rechnung? @relation(fields: [rechnung_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
geg_einpreisung_id Int? @unique
geg_einpreisung_id String? @unique
geg_einpreisung GEGEinpreisung? @relation(fields: [geg_einpreisung_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
}

View File

@@ -1,7 +1,5 @@
model Objekt {
id Int @id @default(autoincrement())
uid String @unique @default(dbgenerated("'obj-' || gen_random_uuid()"))
benutzer_id Int?
id String @id @unique @db.VarChar(8)
latitude Float?
longitude Float?
@@ -15,6 +13,7 @@ model Objekt {
erstellungsdatum DateTime? @default(now())
benutzer_id String?
benutzer Benutzer? @relation(fields: [benutzer_id], references: [id])
aufnahmen Aufnahme[]
anteilshaber Anteilshaber[]

View File

@@ -24,10 +24,8 @@ enum AusweisTyp {
}
model Rechnung {
id Int @id @default(autoincrement())
uid String @unique @default(dbgenerated("'inv-' || gen_random_uuid()"))
id String @id @unique @db.VarChar(8)
benutzer_id Int
empfaenger String? @db.VarChar
strasse String? @db.VarChar
plz String? @db.VarChar
@@ -52,6 +50,7 @@ model Rechnung {
storniert_am DateTime?
transaktions_referenz String? @unique @db.VarChar
benutzer_id String
benutzer Benutzer @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
verbrauchsausweis_wohnen VerbrauchsausweisWohnen?

View File

@@ -1,7 +1,6 @@
model RefreshTokens {
id Int @id @default(autoincrement())
benutzer_id Int
token String @unique
// Wir nehmen die IP Adresse des Clients mit auf.
// Falls sich die IP Adresse eines Refresh Token Owners ändert, können wir diesen einfach invalidieren.
@@ -9,5 +8,6 @@ model RefreshTokens {
expiry DateTime
// Relationen
benutzer_id String
user Benutzer @relation(fields: [benutzer_id], references: [id], onDelete: Cascade)
}

View File

@@ -8,9 +8,7 @@ enum TicketStatus {
}
model Tickets {
id Int @id @default(autoincrement())
uid String @unique @default(dbgenerated("'tkt-' || gen_random_uuid()"))
benutzer_id Int?
id String @id @unique @db.VarChar(8)
created_at DateTime @default(now())
updated_at DateTime? @updatedAt
deleted_at DateTime?
@@ -21,10 +19,11 @@ model Tickets {
metadata Json?
email String
bearbeiter_id Int?
bearbeiter_id String?
prioritaet Int? @default(0)
// Relationen
benutzer_id String?
benutzer Benutzer? @relation(fields: [benutzer_id], references: [id], name: "ErstellteTickets")
bearbeiter Benutzer? @relation(fields: [bearbeiter_id], references: [id], name: "BearbeiteteTickets")
}

View File

@@ -5,12 +5,11 @@ enum UnterlagenKategorie {
}
model Unterlage {
id Int @id @default(autoincrement())
uid String @unique @default(dbgenerated("'pln-' || gen_random_uuid()"))
id String @id @unique @db.VarChar(8)
name String?
kategorie String?
mime String?
aufnahme_id Int?
aufnahme_id String?
aufnahme Aufnahme? @relation(fields: [aufnahme_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
}

View File

@@ -1,9 +1,7 @@
model VerbrauchsausweisGewerbe {
id Int @id @default(autoincrement())
id String @id @unique @db.VarChar(8)
alte_ausweis_id Int?
uid String @unique @default(dbgenerated("'vag-' || gen_random_uuid()"))
benutzer_id Int?
ausstellgrund Ausstellgrund?
registriernummer String? @db.VarChar
zusaetzliche_heizquelle Boolean?
@@ -68,12 +66,13 @@ model VerbrauchsausweisGewerbe {
ausweistyp AusweisTyp @default(Standard)
benutzer_id String?
benutzer Benutzer? @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
rechnung_id Int? @unique
rechnung_id String? @unique
rechnung Rechnung? @relation(fields: [rechnung_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
/// @zod.describe("ID der korrespondierenden Gebäudeaufnahme")
aufnahme_id Int @unique
aufnahme_id String @unique
aufnahme Aufnahme @relation(fields: [aufnahme_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
}

View File

@@ -1,11 +1,8 @@
model VerbrauchsausweisWohnen {
id Int @id @default(autoincrement())
/// @zod.describe("ID des Ausweises")
id String @id @unique @db.VarChar(8)
alte_ausweis_id Int?
/// @zod.describe("UID des Ausweises")
uid String @unique @default(dbgenerated("'vaw-' || gen_random_uuid()"))
/// @zod.describe("Die ID des Benutzers, welchem dieser Ausweis gehört")
benutzer_id Int?
/// @zod.describe("Ausstellgrund wie z.B. Vermietung oder Verkauf")
ausstellgrund Ausstellgrund?
/// @zod.describe("Die Registriernummer des Ausweises")
@@ -72,12 +69,14 @@ model VerbrauchsausweisWohnen {
created_at DateTime @default(now())
updated_at DateTime @updatedAt
/// @zod.describe("Die ID des Benutzers, welchem dieser Ausweis gehört")
benutzer_id String?
benutzer Benutzer? @relation(fields: [benutzer_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
rechnung_id Int? @unique
rechnung_id String? @unique
rechnung Rechnung? @relation(fields: [rechnung_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
/// @zod.describe("ID der korrespondierenden Gebäudeaufnahme")
aufnahme_id Int @unique
aufnahme_id String @unique
aufnahme Aufnahme @relation(fields: [aufnahme_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
}

View File

@@ -4,7 +4,7 @@ model documenttemplates {
name String @db.VarChar(100)
shortdescription String @db.VarChar(100)
longdescription String @db.VarChar(5000)
user_id Int
user_id String
is_private Boolean @default(true)
documenttype Int
filename String @db.VarChar(100)

View File

@@ -2,7 +2,7 @@
model tokens {
id Int @id(map: "PK_TOKENS") @default(autoincrement())
token String @db.VarChar(36)
user_id Int
user_id String
date_created DateTime @default(now()) @db.Timestamp(6)
last_used DateTime @default(now()) @db.Timestamp(6)
times_used Int @default(0)

View File

@@ -93,6 +93,7 @@ await prisma.benutzer.create({
vorname: "Admin",
adresse: "Adminstraße 1",
plz: "12345",
id: "USADMIN1"
},
});
@@ -106,6 +107,7 @@ await prisma.benutzer.create({
vorname: "User",
adresse: "Userstraße 1",
plz: "12345",
id: "USUSER01"
},
});

View File

@@ -1,7 +1,21 @@
import express from 'express';
import { H, Handlers } from '@highlight-run/node'
// @ts-ignore
import { handler as ssrHandler } from './dist/server/entry.mjs';
const highlightConfig = {
projectID: '1jdkoe52',
serviceName: "online-energieausweis",
serviceVersion: "git-sha",
environment: "production",
backendUrl: "http://212.227.61.149:3000/public",
networkRecording: {
enabled: true,
recordHeadersAndBody: true,
},
}
H.init(highlightConfig)
const app = express();
const base = '/';
@@ -9,6 +23,8 @@ app.use(base, express.static('dist/client/'));
app.use(ssrHandler);
app.use(express.json({ limit: "50mb" }))
app.use(express.urlencoded({ limit: "50mb" }))
app.use(Handlers.middleware(highlightConfig))
app.use(Handlers.errorHandler(highlightConfig))
app.listen(3000, function() {
console.log('Server started on http://localhost:3000');

View File

@@ -12,34 +12,34 @@ export const createCaller = createCallerFactory({
"admin/post-ausstellen": await import("../src/pages/api/admin/post-ausstellen.ts"),
"admin/registriernummer": await import("../src/pages/api/admin/registriernummer.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"),
"bedarfsausweis-gewerbe/[uid]": await import("../src/pages/api/bedarfsausweis-gewerbe/[uid].ts"),
"bedarfsausweis-gewerbe": await import("../src/pages/api/bedarfsausweis-gewerbe/index.ts"),
"auth/access-token": await import("../src/pages/api/auth/access-token.ts"),
"auth/passwort-vergessen": await import("../src/pages/api/auth/passwort-vergessen.ts"),
"auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"),
"bedarfsausweis-gewerbe/[uid]": await import("../src/pages/api/bedarfsausweis-gewerbe/[uid].ts"),
"bedarfsausweis-gewerbe": await import("../src/pages/api/bedarfsausweis-gewerbe/index.ts"),
"bedarfsausweis-wohnen/[uid]": await import("../src/pages/api/bedarfsausweis-wohnen/[uid].ts"),
"ausweise": await import("../src/pages/api/ausweise/index.ts"),
"aufnahme": await import("../src/pages/api/aufnahme/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/[uid]": await import("../src/pages/api/bilder/[uid].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": 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": await import("../src/pages/api/geg-nachweis-wohnen/index.ts"),
"objekt": await import("../src/pages/api/objekt/index.ts"),
"rechnung/[uid]": await import("../src/pages/api/rechnung/[uid].ts"),
"rechnung/[id]": await import("../src/pages/api/rechnung/[id].ts"),
"rechnung/anfordern": await import("../src/pages/api/rechnung/anfordern.ts"),
"rechnung": await import("../src/pages/api/rechnung/index.ts"),
"ticket": await import("../src/pages/api/ticket/index.ts"),
"user": await import("../src/pages/api/user/index.ts"),
"user/self": await import("../src/pages/api/user/self.ts"),
"verbrauchsausweis-wohnen/[uid]": await import("../src/pages/api/verbrauchsausweis-wohnen/[uid].ts"),
"verbrauchsausweis-wohnen": await import("../src/pages/api/verbrauchsausweis-wohnen/index.ts"),
"verbrauchsausweis-gewerbe/[uid]": await import("../src/pages/api/verbrauchsausweis-gewerbe/[uid].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-wohnen/[id]": await import("../src/pages/api/verbrauchsausweis-wohnen/[id].ts"),
"verbrauchsausweis-wohnen": await import("../src/pages/api/verbrauchsausweis-wohnen/index.ts"),
"webhooks/mollie": await import("../src/pages/api/webhooks/mollie.ts"),
"aufnahme/[uid]/bilder": await import("../src/pages/api/aufnahme/[uid]/bilder.ts"),
"aufnahme/[uid]": await import("../src/pages/api/aufnahme/[uid]/index.ts"),
"aufnahme/[uid]/unterlagen": await import("../src/pages/api/aufnahme/[uid]/unterlagen.ts"),
"objekt/[uid]": await import("../src/pages/api/objekt/[uid]/index.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]/unterlagen": await import("../src/pages/api/aufnahme/[id]/unterlagen.ts"),
"objekt/[id]": await import("../src/pages/api/objekt/[id]/index.ts"),
})

View File

@@ -13,8 +13,8 @@ export async function ausweisSpeichern(
bilder: BildClient[],
ausweisart: Enums.Ausweisart
) {
if (objekt.uid) {
await api.objekt._uid.PATCH.fetch({
if (objekt.id) {
await api.objekt._id.PATCH.fetch({
adresse: objekt.adresse,
latitude: 0,
longitude: 0,
@@ -22,14 +22,14 @@ export async function ausweisSpeichern(
plz: objekt.plz
}, {
params: {
uid: objekt.uid
id: objekt.id
},
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
} else {
const { uid } = await api.objekt.PUT.fetch({
const { id } = await api.objekt.PUT.fetch({
adresse: objekt.adresse,
latitude: 0,
longitude: 0,
@@ -41,16 +41,16 @@ export async function ausweisSpeichern(
}
})
objekt.uid = uid;
objekt.id = id;
}
if (aufnahme.uid) {
await api.aufnahme._uid.PATCH.fetch({
if (aufnahme.id) {
await api.aufnahme._id.PATCH.fetch({
baujahr_gebaeude: aufnahme.baujahr_gebaeude,
baujahr_heizung: aufnahme.baujahr_heizung,
baujahr_klima: aufnahme.baujahr_klima,
baujahr_klima: aufnahme.baujahr_klima || [],
alternative_heizung: aufnahme.alternative_heizung,
alternative_kuehlung: aufnahme.alternative_kuehlung,
alternative_lueftung: aufnahme.alternative_lueftung,
@@ -102,14 +102,14 @@ export async function ausweisSpeichern(
zirkulation: aufnahme.zirkulation
}, {
params: {
uid: aufnahme.uid
id: aufnahme.id
},
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
} else {
const { uid } = await api.aufnahme.PUT.fetch({
const { id } = await api.aufnahme.PUT.fetch({
aufnahme: {
baujahr_gebaeude: aufnahme.baujahr_gebaeude,
baujahr_heizung: aufnahme.baujahr_heizung,
@@ -165,56 +165,56 @@ export async function ausweisSpeichern(
zentralheizung: aufnahme.zentralheizung,
zirkulation: aufnahme.zirkulation
},
uid_objekt: objekt.uid
objekt_id: objekt.id
}, {
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
aufnahme.uid = uid
aufnahme.id = id
}
let patchRoute: any;
let putRoute: any;
if (ausweisart == Enums.Ausweisart.VerbrauchsausweisWohnen) {
patchRoute = api["verbrauchsausweis-wohnen"]._uid.PATCH
patchRoute = api["verbrauchsausweis-wohnen"]._id.PATCH
putRoute = api["verbrauchsausweis-wohnen"].PUT
} else if (ausweisart == Enums.Ausweisart.VerbrauchsausweisGewerbe) {
patchRoute = api["verbrauchsausweis-gewerbe"]._uid.PATCH
patchRoute = api["verbrauchsausweis-gewerbe"]._id.PATCH
putRoute = api["verbrauchsausweis-gewerbe"].PUT
} else if (ausweisart == Enums.Ausweisart.BedarfsausweisWohnen) {
patchRoute = api["bedarfsausweis-wohnen"]._uid.PATCH
patchRoute = api["bedarfsausweis-wohnen"]._id.PATCH
putRoute = api["bedarfsausweis-wohnen"].PUT
}
if (ausweis.uid) {
if (ausweis.id) {
await patchRoute.fetch({
...exclude(ausweis, ["uid"])
...exclude(ausweis, ["id"])
}, {
params: {
uid: ausweis.uid
id: ausweis.id
},
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
} else {
const { uid } = await putRoute.fetch({
const { id } = await putRoute.fetch({
ausweis,
uid_aufnahme: aufnahme.uid
aufnahme_id: aufnahme.id
}, {
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
ausweis.uid = uid;
ausweis.id = id;
}
await api.aufnahme._uid.bilder.PUT.fetch(bilder.map(bild => bild.uid), {
await api.aufnahme._id.bilder.PUT.fetch(bilder.map(bild => bild.id), {
params: {
uid: aufnahme.uid
id: aufnahme.id
},
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
@@ -222,29 +222,8 @@ export async function ausweisSpeichern(
})
return {
uid_ausweis: ausweis.uid,
uid_aufnahme: aufnahme.uid,
uid_objekt: objekt.uid
ausweis_id: ausweis.id,
aufnahme_id: aufnahme.id,
objekt_id: objekt.id
}
// await client.v1.tickets.erstellen.mutate({
// titel: "Ausweis konnte nicht gespeichert werden",
// beschreibung: e.stack,
// email: user.email ?? "",
// metadata: JSON.stringify({
// ausweis,
// }),
// });
// addNotification({
// dismissable: false,
// message:
// "Ausweis konnte nicht gespeichert werden, bitte versuchen sie es erneut.",
// subtext:
// "Sollte das Problem weiterhin bestehen, kontaktieren sie bitte den Support.",
// timeout: 6000,
// type: "error",
// });
return null;
}

View File

@@ -48,7 +48,7 @@
openWindowWithPost("/kundendaten", {
ausweis,
ausweis: { ...ausweis, ausweistyp },
objekt,
aufnahme,
bilder,
@@ -80,11 +80,11 @@
window.history.pushState(
{},
"",
`${location.pathname}?uid=${ausweis.uid}`
`${location.pathname}?uid=${ausweis.id}`
);
localStorage.clear()
window.location.href = `/speichern-erfolgreich?uid=${ausweis.uid}`
window.location.href = `/speichern-erfolgreich?uid=${ausweis.id}`
}
}

View File

@@ -31,13 +31,8 @@ export type UploadedGebaeudeBild = OmitKeys<Bild, "id" | "aufnahme_id"> & {
* @export
* @typedef {VerbrauchsausweisWohnenClient}
*/
export type VerbrauchsausweisWohnenClient = OmitKeys<
VerbrauchsausweisWohnen,
"id" | "aufnahme_id" | "benutzer_id"
> & {
uid_objekt: string,
uid_aufnahme: string,
uid_benutzer?: string
export type VerbrauchsausweisWohnenClient = VerbrauchsausweisWohnen & {
objekt_id: string
};
/**
@@ -50,13 +45,8 @@ export type VerbrauchsausweisWohnenClient = OmitKeys<
* @export
* @typedef {VerbrauchsausweisWohnenClient}
*/
export type VerbrauchsausweisGewerbeClient = OmitKeys<
VerbrauchsausweisGewerbe,
"id" | "aufnahme_id" | "benutzer_id"
> & {
uid_objekt: string,
uid_aufnahme: string,
uid_benutzer?: string
export type VerbrauchsausweisGewerbeClient = VerbrauchsausweisGewerbe & {
objekt_id: string
};
/**
@@ -69,13 +59,8 @@ export type VerbrauchsausweisGewerbeClient = OmitKeys<
* @export
* @typedef {VerbrauchsausweisWohnenClient}
*/
export type BedarfsausweisWohnenClient = OmitKeys<
BedarfsausweisWohnen,
"id" | "aufnahme_id" | "benutzer_id"
> & {
uid_objekt: string,
uid_aufnahme: string,
uid_benutzer?: string
export type BedarfsausweisWohnenClient = BedarfsausweisWohnen & {
objekt_id: string
};
/**
@@ -88,20 +73,15 @@ export type BedarfsausweisWohnenClient = OmitKeys<
* @export
* @typedef {ObjektClient}
*/
export type ObjektClient = OmitKeys<Objekt, "benutzer_id" | "id">;
export type ObjektClient = Objekt;
export type AufnahmeClient = OmitKeys<
Aufnahme,
"id" | "objekt_id" | "benutzer_id"
> & {
uid_objekt: string
};
export type AufnahmeClient = Aufnahme
export type TicketClient = OmitKeys<Tickets, "bearbeiter_id" | "benutzer_id" | "id">
export type BenutzerClient = OmitKeys<Benutzer, "id" | "passwort">;
export type BenutzerClient = OmitKeys<Benutzer, "passwort">;
export type RechnungClient = OmitKeys<Rechnung, "id">
export type RechnungClient = Rechnung
export function ZodOverlap<T, S = z.ZodType<T, z.ZodTypeDef, T>>(arg: S): S {
return arg;
@@ -122,34 +102,34 @@ export type OptionalNullable<T> = T extends object ? {
} : T;
export const UUidWithPrefix = z.string().refine((value) => {
const prefixedUUidRegex = /^([0-9a-z]+)-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i
const prefixedUUidRegex = /^([A-Z]{2})[0-9A-Z]{6}$/i
const match = value.match(prefixedUUidRegex)
if (match && match[1] in VALID_UUID_PREFIXES) {
if (match && Object.values(VALID_UUID_PREFIXES).indexOf(match[1] as VALID_UUID_PREFIXES) > -1) {
return true;
}
return false;
})
export function getAusweisartFromUUID(uid: string): Enums.Ausweisart | null {
if (!UUidWithPrefix.safeParse(uid).success) {
export function getAusweisartFromUUID(id: string): Enums.Ausweisart | null {
if (!UUidWithPrefix.safeParse(id).success) {
return null
}
switch(uid.split("-")[0]) {
case "vaw":
switch(id.slice(0, 2) as VALID_UUID_PREFIXES) {
case VALID_UUID_PREFIXES.VerbrauchsausweisWohnen:
return Enums.Ausweisart.VerbrauchsausweisWohnen
case "vag":
case VALID_UUID_PREFIXES.VerbrauchsausweisGewerbe:
return Enums.Ausweisart.VerbrauchsausweisGewerbe
case "baw":
case VALID_UUID_PREFIXES.BedarfsausweisWohnen:
return Enums.Ausweisart.BedarfsausweisWohnen
case "bag":
case VALID_UUID_PREFIXES.BedarfsausweisGewerbe:
return Enums.Ausweisart.BedarfsausweisGewerbe
case "gnw":
case VALID_UUID_PREFIXES.GEGNachweisWohnen:
return Enums.Ausweisart.GEGNachweisWohnen
case "gng":
case VALID_UUID_PREFIXES.GEGNachweisGewerbe:
return Enums.Ausweisart.GEGNachweisGewerbe
default:
return null

View File

@@ -1,6 +1,6 @@
<script lang="ts">
import { PRICES } from "#lib/constants.js";
import { Enums } from "#lib/client/prisma";
import { Enums } from "#lib/client/prisma.js";
export let bullets;
export let title;
export let ref = "";
@@ -56,9 +56,9 @@ bullets = [
<div class="zeile grid grid-cols-subgrid col-span-4 py-4 border-b-[0px] justify-items-center items-center">
<div class="justify-self-start pl-2"></div>
<a href="{ref}/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/" ><button class="bestellbutton" type="button">sofort<br>bestellen</button></a>
<a href="{ref}/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/" ><button class="bestellbutton" type="button">sofort<br>bestellen</button></a>
<a href="{ref}/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/" ><button class="bestellbutton" type="button">sofort<br>bestellen</button></a>
<a href="{ref}/energieausweis-erstellen/verbrauchsausweis-wohngebaeude?ausweistyp={Enums.AusweisTyp.Standard}" ><button class="bestellbutton" type="button">sofort<br>bestellen</button></a>
<a href="{ref}/energieausweis-erstellen/verbrauchsausweis-wohngebaeude?ausweistyp={Enums.AusweisTyp.Beratung}" ><button class="bestellbutton" type="button">sofort<br>bestellen</button></a>
<a href="{ref}/energieausweis-erstellen/verbrauchsausweis-wohngebaeude?ausweistyp={Enums.AusweisTyp.Offline}" ><button class="bestellbutton" type="button">sofort<br>bestellen</button></a>
</div>
</div>

View File

@@ -1,6 +1,6 @@
import fuelList from "#components/Ausweis/brennstoffListe.js";
import { faker } from "@faker-js/faker";
import { type Enums } from "#lib/client/prisma";
import { type Enums } from "#lib/client/prisma.js";
import "cypress-file-upload"
import moment from "moment";
@@ -17,8 +17,8 @@ describe("Verbrauchsausweis erstellen Schritt 1", () => {
cy.get("select[data-cy='ausstellgrund']")
.select(
faker.number.int({
min: 0,
max: (["Modernisierung", "Neubau", "Sonstiges", "Verkauf", "Vermietung"] as Enums.Ausstellgrund[]).length - 1,
min: 1,
max: (["Modernisierung", "Neubau", "Sonstiges", "Verkauf", "Vermietung"] as Enums.Ausstellgrund[]).length,
})
)
@@ -40,10 +40,10 @@ describe("Verbrauchsausweis erstellen Schritt 1", () => {
{ delay: 50 }
);
// Anzahl Einheiten
cy.get("input[name='einheiten']")
.should("have.attr", "type", "number")
.type(faker.number.int({ min: 1, max: 5 }).toString());
// // 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(
@@ -61,11 +61,12 @@ describe("Verbrauchsausweis erstellen Schritt 1", () => {
);
// 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
cy.get("input[name='flaeche']")
.should("have.attr", "type", "number")
.type(faker.number.int({ min: 50, max: 1000 }).toString());
// // Flaeche
// cy.get("input[name='flaeche']")
// .should("have.attr", "type", "number")
// .type(faker.number.int({ min: 50, max: 1000 }).toString());
// Nutzlaeche
cy.get("input[name='nutzflaeche']")
@@ -90,7 +91,7 @@ describe("Verbrauchsausweis erstellen Schritt 1", () => {
cy.get("select[name='brennstoff_1']").select(brennstoffKombo[0]);
cy.get("select[name='einheit_1']").select(brennstoffKombo[1]);
let availableDates = [];
let availableDates = [];
const startDate = moment()
.subtract(4, "years")
.subtract(6, "months");
@@ -104,8 +105,8 @@ let availableDates = [];
}
// Verbrauchszeitraum
cy.get("select[name='energieverbrauch_zeitraum_monat']").select(availableDates[0].month.toString());
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());
@@ -261,59 +262,47 @@ let availableDates = [];
// Gebäude Bild
cy.get("input[name='gebaeude_image']").should("have.attr", "type", "file").attachFile("images/gebaeude/1.jpeg", { subjectType: "input" });
// Jetzt können wir den Verbrauchsausweis erstellen.
cy.get("form[name='ausweis'] button[data-cy='weiter']").click({ force: true });
cy.get("form[data-cy='ausweis'] button[data-cy='weiter']").click({ force: true });
// Wir sind nicht eingeloggt also sollte jetzt ein Login Screen erscheinen.
// Wir klicken auf registrieren und erstellen einen neuen Benutzer, danach loggen wir uns mit diesem ein.
cy.get("[data-cy='registrieren']").click();
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()
cy.get("form[name='signup'] input[name='email']").should("be.visible").should("have.attr", "type", "email").type(email);
cy.get("form[name='signup'] input[name='passwort']").should("be.visible").should("have.attr", "type", "password").type(passwort);
cy.get("form[name='signup'] input[name='vorname']").should("be.visible").should("have.attr", "type", "text").type(vorname);
cy.get("form[name='signup'] input[name='nachname']").should("be.visible").should("have.attr", "type", "text").type(nachname);
const strasse = faker.location.streetAddress({ useFullAddress: true })
const plz = faker.location.zipCode("#####")
cy.get("form[name='signup'] button[type='submit']").click();
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("[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='login'] input[name='email']").should("be.visible").should("have.attr", "type", "email").should("contain.value", email);
cy.get("form[name='login'] input[name='passwort']").should("be.visible").should("have.attr", "type", "password").type(passwort);
cy.get("form[name='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();
// Der Ausweis sollte jetzt schon erstellt worden sein und wir sollten auf die kundendaten seite weitergeleitet worden sein.
cy.url().should("contain", "/kundendaten");
cy.wait(1000)
// Wir füllen jetzt die Kundendaten aus.
// cy.get("select[name='anrede']").select(Math.random() > 0.5 ? "Herr" : "Frau");
cy.get("input[name='vorname']").should("contain.value", vorname);
cy.get("input[name='name']").should("contain.value", nachname);
// cy.get("input[name='email']").should("contain.value", email);
// cy.get("input[name='telefon']").type(faker.phone.number());
cy.get("input[name='rechnung_empfaenger']").type(`${vorname} ${nachname}`);
cy.get("input[name='rechnung_strasse']").type(faker.location.streetAddress());
// TODO: Random Plz generieren, allerdings muss die auch in der Datenbank vorhanden sein...
cy.get("input[name='rechnung_plz']").type("2103");
// Jetzt sollte der PLZ Container erscheinen, dort klicken wir einfach das erste Element an.
cy.get("div[data-test='plz-container']").children().first().click();
// cy.get("input[name='rechnung_telefon']").type(faker.phone.number());
cy.get("input[name='rechnung_email']").should("contain.value", email);
cy.get("input[data-cy='paypal']").click();
// Datenschutz und AGB akzeptieren, dann schicken wir das Formular ab.
// cy.get("input[name='agb-akzeptieren']").check()
// cy.get("input[name='datenschutz-akzeptieren']").check()
cy.get("button[data-cy='bestellen']").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();

View File

@@ -0,0 +1,282 @@
import fuelList from "#components/Ausweis/brennstoffListe.js";
import { faker } from "@faker-js/faker";
import "cypress-file-upload"
import moment from "moment";
import { Aufnahme, Enums, Objekt, VerbrauchsausweisWohnen } from "#lib/client/prisma.js";
describe("Verbrauchsausweis für Wohngebäude bearbeiten", async () => {
it("bearbeitet einen bereits existierenden Verbrauchsausweis für Wohngebäude", () => {
cy.task("verbrauchsausweisWohnen", {
where: {
ausgestellt: false,
bestellt: false
},
include: {
aufnahme: {
include: {
objekt: true
}
},
benutzer: true
}
}).then((ausweis: VerbrauchsausweisWohnen & { aufnahme: Aufnahme & { objekt: Objekt } }) => {
cy.visit(`/energieausweis-erstellen/verbrauchsausweis-wohngebaeude?id=${ausweis.id}`);
cy.wait(2000);
// Wir überprüfen, ob alle Ausstelgründe vorhanden sind, diese sollten genau so viele sein wie in der Datenbank vorhanden sind.
cy.get("select[data-cy='ausstellgrund']")
.find("option:selected").should("have.value", ausweis.ausstellgrund)
// Jetzt Füllen wir das Baujahr vom Gebäude aus.
cy.get("input[name='baujahr_gebaeude']")
.should("have.value", ausweis.aufnahme.baujahr_gebaeude[0])
// Jetzt Füllen wir das Baujahr der Heizung aus.
cy.get("input[name='baujahr_heizung']")
.should("have.value", ausweis.aufnahme.baujahr_heizung[0])
// Anzahl Einheiten
cy.get("input[name='einheiten']")
.should("have.value", ausweis.aufnahme.einheiten)
// Sanierungsstatus
cy.get("select[name='saniert']").find("option:selected").should("have.value", ausweis.aufnahme.saniert)
// Adresse
cy.get("input[name='adresse']").should("have.value", ausweis.aufnahme.objekt.adresse);
// 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()
// Flaeche
cy.get("input[name='flaeche']")
.should("have.attr", "type", "number")
.type(faker.number.int({ min: 50, max: 1000 }).toString());
// Nutzflaeche
cy.get("input[name='nutzflaeche']")
.should("have.attr", "type", "number")
.type(faker.number.int({ min: 50, max: 1000 }).toString());
// Keller
cy.get("select[name='keller']").find("option:not([disabled])").should("have.length", (["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 });
const zusaetzlicheHeizquelle = Math.random() > 0.5;
if (zusaetzlicheHeizquelle) {
cy.get("[data-cy='zusaetzliche_heizquelle']").check();
// 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
cy.get("input[name='verbrauch_4']").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_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
if (Math.random() > 0.5) cy.get("input[name='alternative_heizung']").check();
if (Math.random() > 0.5) cy.get("input[name='alternative_warmwasser']").check();
if (Math.random() > 0.5) cy.get("input[name='alternative_lueftung']").check();
if (Math.random() > 0.5) cy.get("input[name='alternative_kuehlung']").check();
// Gebäudetyp
cy.get("select[name='gebaeudetyp']").then(($dropdown) => {
const options = $dropdown.find('option');
// Select the option at the random index
cy.get("select[name='gebaeudetyp']").select(options.eq(faker.number.int({ min: 1, max: options.length - 1 })).val() as string);
});
// Gebäudeteil
cy.get("select[name='gebaeudeteil']").then(($dropdown) => {
const options = $dropdown.find('option');
// Select the option at the random index
cy.get("select[name='gebaeudeteil']").select(options.eq(faker.number.int({ min: 1, max: options.length - 1 })).val() as string);
});
// Lüftung
cy.get("select[name='lueftung']").then(($dropdown) => {
const options = $dropdown.find('option');
// Select the option at the random index
cy.get("select[name='lueftung']").select(options.eq(faker.number.int({ min: 1, max: options.length - 1 })).val() as string);
});
// Kühlung
cy.get("select[name='kuehlung']").then(($dropdown) => {
const options = $dropdown.find('option');
// Select the option at the random index
cy.get("select[name='kuehlung']").select(options.eq(faker.number.int({ min: 1, max: options.length - 1 })).val() as string, { 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");
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("[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

@@ -273,7 +273,9 @@ describe("Verbrauchsausweis erstellen Schritt 1", () => {
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', () => {

View File

@@ -1,10 +1,9 @@
import * as z from "zod"
export const AnteilshaberSchema = z.object({
id: z.number().int(),
benutzer_id: z.number().int(),
id: z.string(),
rolle: z.string().nullish(),
privilegien: z.bigint().nullish(),
uid: z.string(),
objekt_id: z.number().int(),
benutzer_id: z.string(),
objekt_id: z.string(),
})

View File

@@ -1,7 +1,7 @@
import * as z from "zod"
export const ApiRequestsSchema = z.object({
id: z.number().int(),
id: z.string(),
date: z.date(),
ip: z.string(),
method: z.string(),
@@ -10,5 +10,5 @@ export const ApiRequestsSchema = z.object({
responseTime: z.number(),
responseSize: z.number().int(),
userAgent: z.string(),
user_id: z.number().int().nullish(),
user_id: z.string().nullish(),
})

View File

@@ -2,9 +2,8 @@ import * as z from "zod"
import { Ausweisart, Heizungsstatus, Heizungsstatus, Lueftungskonzept } from "@prisma/client"
export const AufnahmeSchema = z.object({
id: z.number().int(),
uid: z.string().describe("UID der Gebäude Aufnahme"),
benutzer_id: z.number().int().nullish(),
id: z.string(),
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(),
gebaeudeteil: z.string().describe("Betrachteter Teil des Gebäudes, z.B. Gesamtgebäude, Wohnteil, Gewerbeteil").nullish(),
@@ -60,5 +59,5 @@ export const AufnahmeSchema = z.object({
aussenwand_min_12cm_gedaemmt: z.boolean().describe("Falls die Außenwände des Gebäudes mindestens 12cm gedämmt sind, sollte dieser Wert auf true stehen").nullish(),
dachgeschoss_min_12cm_gedaemmt: z.boolean().describe("Falls das Dachgeschoss des Gebäudes mindestens 12cm gedämmt ist, sollte dieser Wert auf true stehen").nullish(),
oberste_geschossdecke_min_12cm_gedaemmt: z.boolean().describe("Falls die oberste Geschossdecke des Gebäudes mindestens 12cm gedämmt ist, sollte dieser Wert auf true stehen").nullish(),
objekt_id: z.number().int(),
objekt_id: z.string(),
})

View File

@@ -2,8 +2,7 @@ import * as z from "zod"
import { Ausstellgrund } from "@prisma/client"
export const BedarfsausweisGewerbeSchema = z.object({
id: z.number().int(),
uid: z.string(),
id: z.string(),
ausstellgrund: z.nativeEnum(Ausstellgrund).describe("Ausstellgrund wie z.B. Vermietung oder Verkauf").nullish(),
keller_beheizt: z.boolean().describe("Falls der Keller des Gebäudes beheizt wird, sollte dieser Wert auf true stehen").nullish(),
storniert: z.boolean().describe("Falls die Nachweisanfrage storniert wurde, sollte dieser Wert auf true stehen").nullish(),
@@ -20,8 +19,8 @@ export const BedarfsausweisGewerbeSchema = z.object({
fussbodenheizung: z.boolean().nullish(),
bauteilaktivierung: z.boolean().nullish(),
klimatisierung: z.boolean().nullish(),
benutzer_id: z.number().int().describe("Die ID des Benutzers, welchem dieser Ausweis gehört").nullish(),
aufnahme_id: z.number().int(),
rechnung_id: z.number().int().nullish(),
geg_einpreisung_id: z.number().int().nullish(),
benutzer_id: z.string().describe("Die ID des Benutzers, welchem dieser Ausweis gehört").nullish(),
aufnahme_id: z.string(),
rechnung_id: z.string().nullish(),
geg_einpreisung_id: z.string().nullish(),
})

View File

@@ -2,10 +2,9 @@ import * as z from "zod"
import { Ausstellgrund, AusweisTyp } from "@prisma/client"
export const BedarfsausweisWohnenSchema = z.object({
id: z.number().int(),
id: z.string(),
alte_ausweis_id: z.number().int().nullish(),
uid: z.string(),
benutzer_id: z.number().int().nullish(),
benutzer_id: z.string().nullish(),
ausstellgrund: z.nativeEnum(Ausstellgrund).nullish(),
registriernummer: z.string().nullish(),
alternative_heizung: z.boolean().nullish(),
@@ -70,6 +69,6 @@ export const BedarfsausweisWohnenSchema = z.object({
created_at: z.date(),
updated_at: z.date(),
ausweistyp: z.nativeEnum(AusweisTyp),
rechnung_id: z.number().int().nullish(),
aufnahme_id: z.number().int().describe("ID der korrespondierenden Gebäudeaufnahme"),
rechnung_id: z.string().nullish(),
aufnahme_id: z.string().describe("ID der korrespondierenden Gebäudeaufnahme"),
})

View File

@@ -2,8 +2,7 @@ import * as z from "zod"
import { BenutzerRolle } from "@prisma/client"
export const BenutzerSchema = z.object({
id: z.number().int(),
uid: z.string(),
id: z.string(),
name: z.string().nullish(),
vorname: z.string().nullish(),
email: z.string(),

View File

@@ -2,9 +2,8 @@ import * as z from "zod"
import { BilderKategorie } from "@prisma/client"
export const BildSchema = z.object({
id: z.number().int(),
id: z.string(),
kategorie: z.nativeEnum(BilderKategorie),
uid: z.string(),
name: z.string(),
aufnahme_id: z.number().int().nullish(),
aufnahme_id: z.string().nullish(),
})

View File

@@ -5,7 +5,7 @@ export const documenttemplatesSchema = z.object({
name: z.string(),
shortdescription: z.string(),
longdescription: z.string(),
user_id: z.number().int(),
user_id: z.string(),
is_private: z.boolean(),
documenttype: z.number().int(),
filename: z.string(),

View File

@@ -1,11 +1,10 @@
import * as z from "zod"
export const EventSchema = z.object({
id: z.number().int(),
uid: z.string(),
id: z.string(),
date: z.date(),
title: z.string(),
description: z.string().nullish(),
aufnahme_id: z.number().int(),
benutzer_id: z.number().int().nullish(),
aufnahme_id: z.string(),
benutzer_id: z.string().nullish(),
})

View File

@@ -2,8 +2,7 @@ import * as z from "zod"
import { Einpreisungsstatus } from "@prisma/client"
export const GEGEinpreisungSchema = z.object({
id: z.number().int(),
uid: z.string(),
id: z.string(),
empfaenger: z.string().nullish(),
strasse: z.string().nullish(),
plz: z.string().nullish(),
@@ -18,5 +17,5 @@ export const GEGEinpreisungSchema = z.object({
versand_ort: z.string().nullish(),
versand_zusatzzeile: z.string().nullish(),
status: z.nativeEnum(Einpreisungsstatus),
benutzer_id: z.number().int().describe("Die ID des Benutzers, der diese Einpreisung bekommt.").nullish(),
benutzer_id: z.string().describe("Die ID des Benutzers, der diese Einpreisung bekommt.").nullish(),
})

View File

@@ -2,16 +2,15 @@ import * as z from "zod"
import { Ausstellgrund } from "@prisma/client"
export const GEGNachweisGewerbeSchema = z.object({
id: z.number().int(),
uid: z.string(),
id: z.string(),
ausstellgrund: z.nativeEnum(Ausstellgrund).describe("Ausstellgrund wie z.B. Vermietung oder Verkauf").nullish(),
keller_beheizt: z.boolean().describe("Falls der Keller des Gebäudes beheizt wird, sollte dieser Wert auf true stehen").nullish(),
storniert: z.boolean().describe("Falls die Nachweisanfrage storniert wurde, sollte dieser Wert auf true stehen").nullish(),
bestellt: z.boolean().describe("Falls der Nachweis bestellt wurde, sollte dieser Wert auf true stehen").nullish(),
zurueckgestellt: z.boolean().describe("Falls der Nachweis vom Aussteller zurückgestellt wurde, sollte dieser Wert auf true stehen").nullish(),
beschreibung: z.string().describe("Beschreibung des Bauvorhabens").nullish(),
benutzer_id: z.number().int().describe("Die ID des Benutzers, welchem dieser Ausweis gehört").nullish(),
aufnahme_id: z.number().int(),
rechnung_id: z.number().int().nullish(),
geg_einpreisung_id: z.number().int().nullish(),
benutzer_id: z.string().describe("Die ID des Benutzers, welchem dieser Ausweis gehört").nullish(),
aufnahme_id: z.string(),
rechnung_id: z.string().nullish(),
geg_einpreisung_id: z.string().nullish(),
})

View File

@@ -2,16 +2,15 @@ import * as z from "zod"
import { Ausstellgrund } from "@prisma/client"
export const GEGNachweisWohnenSchema = z.object({
id: z.number().int(),
uid: z.string(),
id: z.string(),
ausstellgrund: z.nativeEnum(Ausstellgrund).describe("Ausstellgrund wie z.B. Vermietung oder Verkauf").nullish(),
keller_beheizt: z.boolean().describe("Falls der Keller des Gebäudes beheizt wird, sollte dieser Wert auf true stehen").nullish(),
storniert: z.boolean().describe("Falls die Nachweisanfrage storniert wurde, sollte dieser Wert auf true stehen").nullish(),
bestellt: z.boolean().describe("Falls der Nachweis bestellt wurde, sollte dieser Wert auf true stehen").nullish(),
zurueckgestellt: z.boolean().describe("Falls der Nachweis vom Aussteller zurückgestellt wurde, sollte dieser Wert auf true stehen").nullish(),
beschreibung: z.string().describe("Beschreibung des Bauvorhabens").nullish(),
benutzer_id: z.number().int().describe("Die ID des Benutzers, welchem dieser Ausweis gehört").nullish(),
aufnahme_id: z.number().int(),
rechnung_id: z.number().int().nullish(),
geg_einpreisung_id: z.number().int().nullish(),
benutzer_id: z.string().describe("Die ID des Benutzers, welchem dieser Ausweis gehört").nullish(),
aufnahme_id: z.string(),
rechnung_id: z.string().nullish(),
geg_einpreisung_id: z.string().nullish(),
})

View File

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

View File

@@ -1,13 +1,12 @@
import * as z from "zod"
export const ObjektSchema = z.object({
id: z.number().int(),
uid: z.string(),
benutzer_id: z.number().int().nullish(),
id: z.string(),
latitude: z.number().nullish(),
longitude: z.number().nullish(),
plz: z.string().describe("Postleitzahl des Gebäudes").nullish(),
ort: z.string().describe("Ort des Gebäudes").nullish(),
adresse: z.string().describe("Adresse (Straße und Hausnummer) des Gebäudes").nullish(),
erstellungsdatum: z.date().nullish(),
benutzer_id: z.string().nullish(),
})

View File

@@ -2,9 +2,7 @@ import * as z from "zod"
import { Bezahlmethoden, Rechnungsstatus, Service } from "@prisma/client"
export const RechnungSchema = z.object({
id: z.number().int(),
uid: z.string(),
benutzer_id: z.number().int(),
id: z.string(),
empfaenger: z.string().nullish(),
strasse: z.string().nullish(),
plz: z.string().nullish(),
@@ -26,4 +24,5 @@ export const RechnungSchema = z.object({
bezahlt_am: z.date().nullish(),
storniert_am: z.date().nullish(),
transaktions_referenz: z.string().nullish(),
benutzer_id: z.string(),
})

View File

@@ -2,8 +2,8 @@ import * as z from "zod"
export const RefreshTokensSchema = z.object({
id: z.number().int(),
benutzer_id: z.number().int(),
token: z.string(),
ip: z.string(),
expiry: z.date(),
benutzer_id: z.string(),
})

View File

@@ -8,9 +8,7 @@ const literalSchema = z.union([z.string(), z.number(), z.boolean()])
const jsonSchema: z.ZodSchema<Json> = z.lazy(() => z.union([literalSchema, z.array(jsonSchema), z.record(jsonSchema)]))
export const TicketsSchema = z.object({
id: z.number().int(),
uid: z.string(),
benutzer_id: z.number().int().nullish(),
id: z.string(),
created_at: z.date(),
updated_at: z.date().nullish(),
deleted_at: z.date().nullish(),
@@ -19,6 +17,7 @@ export const TicketsSchema = z.object({
beschreibung: z.string(),
metadata: jsonSchema,
email: z.string(),
bearbeiter_id: z.number().int().nullish(),
bearbeiter_id: z.string().nullish(),
prioritaet: z.number().int().nullish(),
benutzer_id: z.string().nullish(),
})

View File

@@ -3,7 +3,7 @@ import * as z from "zod"
export const tokensSchema = z.object({
id: z.number().int(),
token: z.string(),
user_id: z.number().int(),
user_id: z.string(),
date_created: z.date(),
last_used: z.date(),
times_used: z.number().int(),

View File

@@ -1,10 +1,9 @@
import * as z from "zod"
export const UnterlageSchema = z.object({
id: z.number().int(),
uid: z.string(),
id: z.string(),
name: z.string().nullish(),
kategorie: z.string().nullish(),
mime: z.string().nullish(),
aufnahme_id: z.number().int().nullish(),
aufnahme_id: z.string().nullish(),
})

View File

@@ -2,10 +2,8 @@ import * as z from "zod"
import { Ausstellgrund, AusweisTyp } from "@prisma/client"
export const VerbrauchsausweisGewerbeSchema = z.object({
id: z.number().int(),
id: z.string(),
alte_ausweis_id: z.number().int().nullish(),
uid: z.string(),
benutzer_id: z.number().int().nullish(),
ausstellgrund: z.nativeEnum(Ausstellgrund).nullish(),
registriernummer: z.string().nullish(),
zusaetzliche_heizquelle: z.boolean().nullish(),
@@ -51,6 +49,7 @@ export const VerbrauchsausweisGewerbeSchema = z.object({
created_at: z.date(),
updated_at: z.date(),
ausweistyp: z.nativeEnum(AusweisTyp),
rechnung_id: z.number().int().nullish(),
aufnahme_id: z.number().int().describe("ID der korrespondierenden Gebäudeaufnahme"),
benutzer_id: z.string().nullish(),
rechnung_id: z.string().nullish(),
aufnahme_id: z.string().describe("ID der korrespondierenden Gebäudeaufnahme"),
})

View File

@@ -2,10 +2,8 @@ import * as z from "zod"
import { Ausstellgrund, AusweisTyp } from "@prisma/client"
export const VerbrauchsausweisWohnenSchema = z.object({
id: z.number().int(),
id: z.string().describe("ID des Ausweises"),
alte_ausweis_id: z.number().int().nullish(),
uid: z.string().describe("UID des Ausweises"),
benutzer_id: z.number().int().describe("Die ID des Benutzers, welchem dieser Ausweis gehört").nullish(),
ausstellgrund: z.nativeEnum(Ausstellgrund).describe("Ausstellgrund wie z.B. Vermietung oder Verkauf").nullish(),
registriernummer: z.string().describe("Die Registriernummer des Ausweises").nullish(),
zusaetzliche_heizquelle: z.boolean().describe("Falls eine sekundäre Heizquelle existiert, sollte dieser Wert auf true stehen").nullish(),
@@ -38,6 +36,7 @@ export const VerbrauchsausweisWohnenSchema = z.object({
ausweistyp: z.nativeEnum(AusweisTyp),
created_at: z.date(),
updated_at: z.date(),
rechnung_id: z.number().int().nullish(),
aufnahme_id: z.number().int().describe("ID der korrespondierenden Gebäudeaufnahme"),
benutzer_id: z.string().describe("Die ID des Benutzers, welchem dieser Ausweis gehört").nullish(),
rechnung_id: z.string().nullish(),
aufnahme_id: z.string().describe("ID der korrespondierenden Gebäudeaufnahme"),
})

View File

@@ -18,6 +18,17 @@ const { title } = Astro.props;
---
<script>
import { H } from "highlight.run";
H.init("1jdkoe52", {
serviceName: "online-energieausweis",
tracingOrigins: true,
networkRecording: {
enabled: true,
recordHeadersAndBody: true
}
})
window.addEventListener("scroll", (event) => {
const skala = document.getElementById("skala");

View File

@@ -17,6 +17,19 @@ export interface Props {
const { title } = Astro.props;
---
<script>
import { H } from "highlight.run";
H.init("1jdkoe52", {
serviceName: "online-energieausweis",
tracingOrigins: true,
networkRecording: {
enabled: true,
recordHeadersAndBody: true
}
})
</script>
<!DOCTYPE html>
<html lang="de">

View File

@@ -34,6 +34,19 @@ const schema = JSON.stringify({
});
---
<script>
import { H } from "highlight.run";
H.init("1jdkoe52", {
serviceName: "online-energieausweis",
tracingOrigins: true,
networkRecording: {
enabled: true,
recordHeadersAndBody: true
}
})
</script>
<!DOCTYPE html>
<html lang="de">
<head>

View File

@@ -71,6 +71,19 @@ const schema = JSON.stringify({
let lightTheme = Astro.cookies.get("theme")?.value === "light";
---
<script>
import { H } from "highlight.run";
H.init("1jdkoe52", {
serviceName: "online-energieausweis",
tracingOrigins: true,
networkRecording: {
enabled: true,
recordHeadersAndBody: true
}
})
</script>
<!DOCTYPE html>
<html lang="de">
<head>

View File

@@ -19,6 +19,17 @@ const { title } = Astro.props;
---
<script>
import { H } from "highlight.run";
H.init("1jdkoe52", {
serviceName: "online-energieausweis",
tracingOrigins: true,
networkRecording: {
enabled: true,
recordHeadersAndBody: true
}
})
/*
window.addEventListener("scroll", (event) => {
let scroll = window.scrollY;

View File

@@ -5,4 +5,4 @@ export enum TokenType {
Verify
}
export type TokenData = { uid: string, typ: TokenType, exp: number }
export type TokenData = { id: string, typ: TokenType, exp: number }

View File

@@ -6,22 +6,23 @@ export const API_REFRESH_TOKEN_COOKIE_NAME = "refreshToken";
export const API_UID_COOKIE_NAME = "uid";
export enum VALID_UUID_PREFIXES {
"auf" = "Aufnahme",
"obj" = "Objekt",
"vaw" = "Verbrauchsausweis Wohnen",
"vag" = "Verbrauchsausweis Gewerbe",
"baw" = "Bedarfsausweis Wohnen",
"bag" = "Bedarfsausweis Gewerbe",
"usr" = "User",
"ant" = "Anteilshaber",
"evt" = "Event",
"img" = "Bild",
"inv" = "Rechnung",
"tkt" = "Ticket",
"pln" = "Gebäude Plan",
"gnw" = "GEG Nachweis Wohnen",
"gng" = "GEG Nachweis Gewerbe",
"gge" = "GEG Einpreisung",
Aufnahme = "AU",
Objekt = "OB",
VerbrauchsausweisWohnen = "VW",
VerbrauchsausweisGewerbe = "VG",
BedarfsausweisWohnen = "BW",
BedarfsausweisGewerbe = "BG",
User = "US",
Anteilshaber = "AN",
Event = "EV",
Bild = "BI",
Rechnung = "RE",
Ticket = "TK",
GebaeudePlan = "PN",
GEGNachweisWohnen = "GW",
GEGNachweisGewerbe = "GG",
GEGEinpreisung = "GE",
Unterlage = "UN"
}
/**

37
src/lib/db.ts Normal file
View File

@@ -0,0 +1,37 @@
import * as crypto from "crypto";
/**
* Generiert eine ID bestimmter Länge für die Datenbank, Implementierung kopiert von https://www.npmjs.com/package/crypto-random-string
* @param length Die Länge der generierten ID
* @param prefix Ein Optionales Präfix, welches vor die ID geschrieben wird, damit diese identifizierbar bleibt.
* @returns Die generierte ID
*/
export function generatePrefixedId(length: number, prefix: string = ""): string {
// Generating entropy is faster than complex math operations, so we use the simplest way
const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789"
const characterCount = characters.length;
const maxValidSelector = (Math.floor(0x1_00_00 / characterCount) * characterCount) - 1; // Using values above this will ruin distribution when using modular division
const entropyLength = 2 * Math.ceil(1.1 * length); // Generating a bit more than required so chances we need more than one pass will be really low
let string = '';
let stringLength = 0;
while (stringLength < length) { // In case we had many bad values, which may happen for character sets of size above 0x8000 but close to it
const entropy = crypto.randomBytes(entropyLength);
let entropyPosition = 0;
while (entropyPosition < entropyLength && stringLength < length) {
const entropyValue = readUInt16LE(entropy, entropyPosition);
entropyPosition += 2;
if (entropyValue > maxValidSelector) { // Skip values which will ruin distribution when using modular division
continue;
}
string += characters[entropyValue % characterCount];
stringLength++;
}
}
return prefix + string;
}
const readUInt16LE = (uInt8Array: Buffer<ArrayBufferLike>, offset: number) => uInt8Array[offset] + (uInt8Array[offset + 1] << 8);

View File

@@ -67,7 +67,7 @@ export async function checkAuthorizationHeader(authorization: string) {
const user = await prisma.benutzer.findUnique({
where: {
uid: payload.uid
id: payload.id
}
})

View File

@@ -7,10 +7,10 @@ import { Enums, prisma } from "#lib/server/prisma.js";
/**
* Gibt den richtigen Prisma Adapter für die Ausweisart basierend auf der UID zurück, oder null bei einer falschen UID.
* @param uid Die Ausweis UID
* @param id Die Ausweis UID
*/
export function getPrismaAusweisAdapter(uid: string) {
const ausweisart = getAusweisartFromUUID(uid);
export function getPrismaAusweisAdapter(id: string) {
const ausweisart = getAusweisartFromUUID(id);
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
return prisma.verbrauchsausweisWohnen

View File

@@ -128,17 +128,17 @@
const zurueck = {
[Enums.Ausweisart.VerbrauchsausweisWohnen]:
`/energieausweis-erstellen/verbrauchsausweis-wohngebaeude?uid=${ausweis.uid}`,
`/energieausweis-erstellen/verbrauchsausweis-wohngebaeude?uid=${ausweis.id}`,
[Enums.Ausweisart.VerbrauchsausweisGewerbe]:
`/energieausweis-erstellen/verbrauchsausweis-gewerbe?uid=${ausweis.uid}`,
`/energieausweis-erstellen/verbrauchsausweis-gewerbe?uid=${ausweis.id}`,
[Enums.Ausweisart.BedarfsausweisWohnen]:
`/energieausweis-erstellen/bedarfsausweis-wohnen?uid=${ausweis.uid}`,
`/energieausweis-erstellen/bedarfsausweis-wohnen?uid=${ausweis.id}`,
[Enums.Ausweisart.GEGNachweisWohnen]:
`/angebot-anfragen/geg-nachweis-wohnen-anfragen?uid=${ausweis.uid}`,
`/angebot-anfragen/geg-nachweis-wohnen-anfragen?uid=${ausweis.id}`,
[Enums.Ausweisart.GEGNachweisGewerbe]:
`/angebot-anfragen/geg-nachweis-gewerbe-anfragen?uid=${ausweis.uid}`,
`/angebot-anfragen/geg-nachweis-gewerbe-anfragen?uid=${ausweis.id}`,
[Enums.Ausweisart.BedarfsausweisGewerbe]:
`/angebot-anfragen/bedarfsausweis-gewerbe-anfragen?uid=${ausweis.uid}`,
`/angebot-anfragen/bedarfsausweis-gewerbe-anfragen?uid=${ausweis.id}`,
}[ausweisart];
async function anfordern() {
@@ -237,11 +237,11 @@
window.history.pushState(
{},
"",
`${location.pathname}?uid=${ausweis.uid}`
`${location.pathname}?uid=${ausweis.id}`
);
localStorage.clear();
window.location.href = `/speichern-erfolgreich?uid=${ausweis.uid}`
window.location.href = `/speichern-erfolgreich?uid=${ausweis.id}`
}
}
@@ -294,10 +294,10 @@
}
try {
let uid: string, checkout_url: string | undefined;
let id: string, checkout_url: string | undefined;
if (rechnung) {
const result = await api.rechnung._uid.PATCH.fetch({
const result = await api.rechnung._id.PATCH.fetch({
bezahlmethode: aktiveBezahlmethode,
abweichende_versand_adresse: abweichende_versand_adresse,
empfaenger: empfaenger,
@@ -312,14 +312,14 @@
versand_zusatzzeile: versand_zusatzzeile
}, {
params: {
uid: rechnung.uid
id: rechnung.id
},
headers: {
Authorization: `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`,
},
})
uid = result.uid
id = result.id
checkout_url = result.checkout_url
} else {
const result = await api.rechnung.PUT.fetch(
@@ -339,7 +339,7 @@
versand_plz: versand_plz,
versand_ort: versand_ort,
telefon: telefon,
ausweis_uid: ausweis.uid
ausweis_id: ausweis.id
},
{
headers: {
@@ -348,7 +348,7 @@
}
);
uid = result.uid;
id = result.id;
checkout_url = result.checkout_url;
}
@@ -356,7 +356,7 @@
localStorage.clear();
if (aktiveBezahlmethode === Enums.Bezahlmethoden.rechnung) {
window.location.href = `/payment/success?r=${uid}&a=${ausweis.uid}`;
window.location.href = `/payment/success?r=${id}&a=${ausweis.id}`;
} else {
window.location.href = checkout_url as string;
}

View File

@@ -12,7 +12,7 @@ export const PUT = defineApiRoute({
async fetch(input, ctx, user) {
const aufnahme = await prisma.aufnahme.findUnique({
where: {
uid: ctx.params.uid
id: ctx.params.id
}
})
@@ -24,10 +24,10 @@ export const PUT = defineApiRoute({
}
prisma.$transaction(async tx => {
for (const uid of input) {
for (const id of input) {
const img = await tx.bild.findUnique({
where: {
uid
id
}
})
@@ -39,14 +39,14 @@ export const PUT = defineApiRoute({
await tx.bild.update({
where: {
uid,
id,
aufnahme_id: null
},
data: {
aufnahme_id: aufnahme.id
},
select: {
uid: true
id: true
}
})
}
@@ -58,22 +58,22 @@ export const GET = defineApiRoute({
middleware: authorizationMiddleware,
output: z.array(BildSchema.pick({
kategorie: true,
uid: true
id: true
})),
async fetch(input, ctx, user) {
const { uid } = ctx.params;
const { id } = ctx.params;
const aufnahme = await prisma.aufnahme.findUnique({
where: user.rolle === Enums.BenutzerRolle.USER ? {
uid,
id,
benutzer_id: user.id
} : { uid },
} : { id },
select: {
benutzer_id: true,
bilder: {
select: {
kategorie: true,
uid: true
id: true
}
}
}

View File

@@ -9,7 +9,6 @@ import { z } from "zod";
export const PATCH = defineApiRoute({
input: AufnahmeSchema.omit({
id: true,
uid: true,
benutzer_id: true,
objekt_id: true,
erstellungsdatum: true
@@ -17,11 +16,11 @@ export const PATCH = defineApiRoute({
output: z.void(),
middleware: authorizationMiddleware,
async fetch(input, ctx, user) {
const { uid } = ctx.params
const { id } = ctx.params
const aufnahme = await prisma.aufnahme.findUnique({
where: {
uid,
id,
benutzer_id: user.id
}
});
@@ -35,7 +34,7 @@ export const PATCH = defineApiRoute({
await prisma.aufnahme.update({
where: {
uid
id
},
data: input
})
@@ -59,26 +58,20 @@ export const GET = defineApiRoute({
}
}
},
output: ZodOverlap<OptionalNullable<AufnahmeClient>>(AufnahmeSchema.omit({
id: true,
objekt_id: true,
benutzer_id: true
}).merge(z.object({
uid_objekt: UUidWithPrefix
}))),
output: ZodOverlap<OptionalNullable<AufnahmeClient>>(AufnahmeSchema),
middleware: authorizationMiddleware,
async fetch(input, context, user) {
const { uid } = context.params;
const { id } = context.params;
const aufnahme = await prisma.aufnahme.findUnique({
where: user.rolle === Enums.BenutzerRolle.USER ? {
uid,
id,
benutzer_id: user.id
} : { uid },
} : { id },
include: {
objekt: {
select: {
uid: true
id: true
}
}
}
@@ -92,8 +85,7 @@ export const GET = defineApiRoute({
}
return exclude({
uid_objekt: aufnahme.objekt.uid,
...aufnahme
}, ["id", "objekt_id", "benutzer_id", "objekt"])
}, ["objekt"])
},
});

View File

@@ -1,8 +1,9 @@
import { authorizationMiddleware } from "#lib/middleware/authorization.js";
import { prisma, UnterlageSchema } from "#lib/server/prisma";
import { prisma } from "#lib/server/prisma.js";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import { z } from "zod";
import { UUidWithPrefix } from "#components/Ausweis/types.js";
import { UnterlageSchema } from "src/generated/zod/unterlage.js";
export const PUT = defineApiRoute({
input: z.array(UUidWithPrefix),
@@ -11,7 +12,7 @@ export const PUT = defineApiRoute({
async fetch(input, ctx, user) {
const aufnahme = await prisma.aufnahme.findUnique({
where: {
uid: ctx.params.uid
id: ctx.params.id
}
})
@@ -23,17 +24,17 @@ export const PUT = defineApiRoute({
}
prisma.$transaction(async tx => {
for (const uid of input) {
for (const id of input) {
const img = await tx.unterlage.update({
where: {
uid,
id,
aufnahme_id: null
},
data: {
aufnahme_id: aufnahme.id
},
select: {
uid: true
id: true
}
})
@@ -52,14 +53,14 @@ export const GET = defineApiRoute({
middleware: authorizationMiddleware,
output: z.array(UnterlageSchema.pick({
kategorie: true,
uid: true
id: true
})),
async fetch(input, ctx, user) {
const { uid } = ctx.params;
const { id } = ctx.params;
const aufnahme = await prisma.aufnahme.findUnique({
where: {
uid,
id,
benutzer_id: user.id
},
select: {
@@ -67,7 +68,7 @@ export const GET = defineApiRoute({
unterlagen: {
select: {
kategorie: true,
uid: true,
id: true,
mime: true,
name: true
}

View File

@@ -1,4 +1,6 @@
import { UUidWithPrefix } from "#components/Ausweis/types.js"
import { VALID_UUID_PREFIXES } from "#lib/constants.js"
import { generatePrefixedId } from "#lib/db.js"
import { authorizationMiddleware } from "#lib/middleware/authorization.js"
import { prisma } from "#lib/server/prisma.js"
import { APIError, defineApiRoute } from "astro-typesafe-api/server"
@@ -9,22 +11,21 @@ export const PUT = defineApiRoute({
input: z.object({
aufnahme: AufnahmeSchema.omit({
id: true,
uid: true,
benutzer_id: true,
objekt_id: true,
}).merge(z.object({
baujahr_klima: z.array(z.number().int().positive()).optional()
})),
uid_objekt: UUidWithPrefix
objekt_id: UUidWithPrefix
}),
output: z.object({
uid: UUidWithPrefix
id: UUidWithPrefix
}),
middleware: authorizationMiddleware,
async fetch(input, context, user) {
const objekt = await prisma.objekt.findUnique({
where: {
uid: input.uid_objekt,
id: input.objekt_id,
benutzer: {
id: user.id
}
@@ -38,8 +39,11 @@ export const PUT = defineApiRoute({
})
}
const id = generatePrefixedId(6, VALID_UUID_PREFIXES.Aufnahme)
const aufnahme = await prisma.aufnahme.create({
data: {
id,
...input.aufnahme,
benutzer: {
connect: {
@@ -48,14 +52,14 @@ export const PUT = defineApiRoute({
},
objekt: {
connect: {
uid: input.uid_objekt
id: input.objekt_id
}
}
},
})
return {
uid: aufnahme.uid
id: aufnahme.id
}
},
})

View File

@@ -92,7 +92,7 @@ export const GET = defineApiRoute({
const refreshTokenExpiry = moment().add(30, "days");
const refreshToken = encodeToken({
uid: user.uid,
id: user.id,
typ: TokenType.Refresh,
exp: refreshTokenExpiry.valueOf(),
});
@@ -109,7 +109,7 @@ export const GET = defineApiRoute({
const accessTokenExpiry = moment().add(2, "days").valueOf();
const accessToken = encodeToken({
uid: user.uid,
id: user.id,
typ: TokenType.Access,
exp: accessTokenExpiry,
});

View File

@@ -19,7 +19,7 @@ export const GET = defineApiRoute({
passwort: z.string().min(8).max(100),
}),
output: z.object({
uid: UUidWithPrefix,
id: UUidWithPrefix,
accessToken: z.string(),
refreshToken: z.string(),
refreshTokenBase64: z.string(),
@@ -51,12 +51,12 @@ export const GET = defineApiRoute({
const refreshTokenExpiry = moment().add(30, "days");
const accessToken = encodeToken({
uid: user.uid,
id: user.id,
typ: TokenType.Access,
exp: moment().add(30, "minutes").valueOf(),
});
const refreshToken = encodeToken({
uid: user.uid,
id: user.id,
typ: TokenType.Refresh,
exp: refreshTokenExpiry.valueOf(),
});
@@ -71,7 +71,7 @@ export const GET = defineApiRoute({
});
return {
uid: user.uid,
id: user.id,
accessToken,
refreshToken,
refreshTokenBase64: Buffer.from(refreshToken).toString("base64"),

View File

@@ -1,16 +1,15 @@
import { authorizationMiddleware, maybeAuthorizationMiddleware } from "#lib/middleware/authorization.js";
import { maybeAuthorizationMiddleware } from "#lib/middleware/authorization.js";
import { prisma } from "#lib/server/prisma.js";
import { defineApiRoute, APIError } from "astro-typesafe-api/server";
import { z } from "astro:content";
import { fileURLToPath } from "url";
import isBase64 from "is-base64";
import { writeFileSync } from "fs"
import { UUidWithPrefix } from "#components/Ausweis/types.js";
import { BildSchema } from "src/generated/zod/bild.js";
import sharp from "sharp"
import { PERSISTENT_DIR } from "#lib/server/constants.js";
import { PutObjectCommand, S3Client } from "@aws-sdk/client-s3";
import { PutObjectCommand } from "@aws-sdk/client-s3";
import { s3Client } from "#lib/s3.js";
import { generatePrefixedId } from "#lib/db.js";
import { VALID_UUID_PREFIXES } from "#lib/constants.js";
export const PUT = defineApiRoute({
input: BildSchema.pick({
@@ -20,7 +19,7 @@ export const PUT = defineApiRoute({
data: z.string()
})),
output: z.object({
uid: z.string({ description: "Die UID des Bildes." })
id: z.string({ description: "Die id des Bildes." })
}),
async fetch(input) {
const data = input.data;
@@ -38,14 +37,14 @@ export const PUT = defineApiRoute({
);
const buffer = Buffer.from(dataWithoutPrefix, "base64");
const id = generatePrefixedId(6, VALID_UUID_PREFIXES.Bild)
const bild = await prisma.bild.create({
data: {
id,
kategorie: input.kategorie,
name: input.name
},
select: {
uid: true,
},
}
});
@@ -57,7 +56,7 @@ export const PUT = defineApiRoute({
const command = new PutObjectCommand({
Bucket: "ibc-images",
Key: `${bild.uid}.jpg`,
Key: `${id}.jpg`,
Body: optimizedBuffer,
ACL: "private"
})
@@ -67,7 +66,7 @@ export const PUT = defineApiRoute({
// Bild wurde nicht gespeichert, wir löschen den Eintrag wieder
await prisma.bild.delete({
where: {
uid: bild.uid
id
}
})
// Und geben einen Fehler zurück
@@ -78,14 +77,14 @@ export const PUT = defineApiRoute({
}
return {
uid: bild.uid
id
};
},
})
export const DELETE = defineApiRoute({
input: z.object({
uid: UUidWithPrefix
id: UUidWithPrefix
}),
middleware: maybeAuthorizationMiddleware,
async fetch(input, context, user) {
@@ -93,7 +92,7 @@ export const DELETE = defineApiRoute({
if (user) {
await prisma.bild.delete({
where: {
uid: input.uid,
id: input.id,
aufnahme: {
benutzer: {
id: user.id
@@ -104,7 +103,7 @@ export const DELETE = defineApiRoute({
} else {
await prisma.bild.delete({
where: {
uid: input.uid,
id: input.id,
aufnahme_id: null
}
})

View File

@@ -28,7 +28,7 @@ export const PATCH = defineApiRoute({
const image = await prisma.bild.findUnique({
where: {
uid: ctx.params.uid,
id: ctx.params.id,
aufnahme: {
benutzer_id: user.id
}
@@ -68,7 +68,7 @@ export const PATCH = defineApiRoute({
});
}
const filePath = fileURLToPath(new URL(`${PERSISTENT_DIR}/images/${image.uid}.jpg`, import.meta.url));
const filePath = fileURLToPath(new URL(`${PERSISTENT_DIR}/images/${image.id}.jpg`, import.meta.url));
try {
// Wir optimieren das Bild und konvertieren es in WebP

View File

@@ -1,13 +1,13 @@
import { ObjektClient, OptionalNullable, ZodOverlap } from "#components/Ausweis/types.js";
import { exclude } from "#lib/exclude.js";
import { authorizationMiddleware } from "#lib/middleware/authorization.js";
import { Enums, ObjektSchema, prisma } from "#lib/server/prisma.js";
import { Enums, prisma } from "#lib/server/prisma.js";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import { ObjektSchema } from "src/generated/zod/objekt.js";
import { z } from "zod";
export const PATCH = defineApiRoute({
input: ObjektSchema.omit({
uid: true,
id: true,
benutzer_id: true,
erstellungsdatum: true
@@ -20,7 +20,7 @@ export const PATCH = defineApiRoute({
async fetch(input, ctx, user) {
const objekt = await prisma.objekt.findUnique({
where: {
uid: ctx.params.uid,
id: ctx.params.id,
benutzer: {
id: user.id
}
@@ -36,7 +36,7 @@ export const PATCH = defineApiRoute({
await prisma.objekt.update({
where: {
uid: ctx.params.uid
id: ctx.params.id
},
data: input
})
@@ -66,13 +66,13 @@ export const GET = defineApiRoute({
}),
middleware: authorizationMiddleware,
async fetch(input, ctx, user) {
const { uid } = ctx.params;
const { id } = ctx.params;
const objekt = await prisma.objekt.findUnique({
where: user.rolle === Enums.BenutzerRolle.USER ? {
uid,
id,
benutzer_id: user.id
} : { uid },
} : { id },
});
if (!objekt) {

View File

@@ -1,24 +1,30 @@
import { UUidWithPrefix } from "#components/Ausweis/types.js";
import { generatePrefixedId } from "#lib/db.js";
import { authorizationMiddleware } from "#lib/middleware/authorization.js";
import { prisma } from "#lib/server/prisma.js";
import { defineApiRoute } from "astro-typesafe-api/server";
import { ObjektSchema } from "src/generated/zod/index.js";
import { ObjektSchema } from "src/generated/zod/objekt.js";
import { z } from "zod";
export const PUT = defineApiRoute({
input: ObjektSchema.omit({
id: true,
uid: true,
benutzer_id: true,
erstellungsdatum: true
}),
output: z.object({
uid: UUidWithPrefix
id: UUidWithPrefix
}),
middleware: authorizationMiddleware,
async fetch(input, context, user) {
const id = generatePrefixedId(6, "OB")
console.log(id);
const objekt = await prisma.objekt.create({
data: {
id,
...input,
benutzer: {
connect: {
@@ -29,7 +35,7 @@ export const PUT = defineApiRoute({
})
return {
uid: objekt.uid
id
}
},
})

View File

@@ -25,7 +25,7 @@ export const PATCH = defineApiRoute({
}),
output: z.object({
checkout_url: z.string().optional(),
uid: UUidWithPrefix,
id: UUidWithPrefix,
}),
middleware: authorizationMiddleware,
headers: authorizationHeaders,
@@ -33,7 +33,7 @@ export const PATCH = defineApiRoute({
// Wir holen uns die Rechnung
const rechnung = await prisma.rechnung.findUnique({
where: {
uid: context.params.uid,
id: context.params.id,
benutzer: {
id: user.id
}
@@ -76,7 +76,7 @@ export const PATCH = defineApiRoute({
})
if (input.bezahlmethode === Enums.Bezahlmethoden.rechnung) {
return { uid: rechnung.uid }
return { id: rechnung.id }
}
const ausweis = rechnung.verbrauchsausweis_gewerbe || rechnung.verbrauchsausweis_wohnen || rechnung.bedarfsausweis_gewerbe || rechnung.bedarfsausweis_wohnen || rechnung.geg_nachweis_gewerbe || rechnung.geg_nachweis_wohnen;
@@ -88,7 +88,7 @@ export const PATCH = defineApiRoute({
})
}
const ausweisart = getAusweisartFromUUID(ausweis.uid)
const ausweisart = getAusweisartFromUUID(ausweis.id)
if (!ausweisart) {
throw new APIError({
@@ -106,12 +106,12 @@ export const PATCH = defineApiRoute({
currency: "EUR",
},
metadata: {
rechnung_uid: rechnung.uid,
rechnung_id: rechnung.id,
},
method: input.bezahlmethode as PaymentMethod,
description,
redirectUrl: `https://ibcornelsen.de/payment/success?a=${ausweis.uid}&r=${rechnung.uid}`,
webhookUrl: `http://ibcornelsen.de/api/webhooks/mollie?uid=${rechnung.uid}`,
redirectUrl: `https://ibcornelsen.de/payment/success?a=${ausweis.id}&r=${rechnung.id}`,
webhookUrl: `http://ibcornelsen.de/api/webhooks/mollie?uid=${rechnung.id}`,
});
const checkoutUrl = payment.getCheckoutUrl();
@@ -124,7 +124,7 @@ export const PATCH = defineApiRoute({
}
return {
uid: rechnung.uid,
id: rechnung.id,
checkout_url: checkoutUrl,
};
},

View File

@@ -9,9 +9,10 @@ import {
} from "#lib/middleware/authorization.js";
import { UUidWithPrefix } from "#components/Ausweis/types.js";
import { getPrismaAusweisAdapter } from "#lib/server/ausweis.js";
import { PRICES, SERVICES } from "#lib/constants.js";
import { PRICES, SERVICES, VALID_UUID_PREFIXES } from "#lib/constants.js";
import { Rechnung } from "#lib/client/prisma.js";
import { RechnungSchema } from "src/generated/zod/rechnung.js";
import { generatePrefixedId } from "#lib/db.js";
export const PUT = defineApiRoute({
meta: {
@@ -24,7 +25,7 @@ export const PUT = defineApiRoute({
input: z
.object({
ausweisart: z.nativeEnum(Enums.Ausweisart),
ausweis_uid: UUidWithPrefix,
ausweis_id: UUidWithPrefix,
})
.merge(
RechnungSchema.omit({
@@ -33,7 +34,6 @@ export const PUT = defineApiRoute({
erstellt_am: true,
id: true,
status: true,
uid: true,
betrag: true,
storniert_am: true,
transaktions_referenz: true,
@@ -41,7 +41,7 @@ export const PUT = defineApiRoute({
),
output: z.object({
checkout_url: z.string().optional(),
uid: UUidWithPrefix,
id: UUidWithPrefix,
}),
headers: authorizationHeaders,
middleware: authorizationMiddleware,
@@ -49,9 +49,9 @@ export const PUT = defineApiRoute({
// Wir erstellen eine Mollie Payment Referenz und eine neue Rechnung in unserer Datenbank, daraufhin geben
// wir eine Checkout URL zurück auf die der Nutzer weitergeleitet werden kann.
const { ausweis_uid, ausweisart, bezahlmethode, services } = input;
const { ausweis_id, ausweisart, bezahlmethode, services } = input;
const adapter = getPrismaAusweisAdapter(ausweis_uid);
const adapter = getPrismaAusweisAdapter(ausweis_id);
if (!adapter) {
throw new APIError({
@@ -62,7 +62,7 @@ export const PUT = defineApiRoute({
const ausweis = await adapter.findUnique({
where: {
uid: ausweis_uid
id: ausweis_id
}
})
@@ -87,18 +87,21 @@ export const PUT = defineApiRoute({
betrag += servicePriceList[service]
}
const id = generatePrefixedId(6, VALID_UUID_PREFIXES.Rechnung);
// Wir erstellen eine neue Rechnung in unserer Datenbank.
let rechnung: Rechnung | null = null;
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
rechnung = await prisma.rechnung.create({
data: {
id,
benutzer_id: user.id,
betrag,
bezahlmethode: bezahlmethode,
status: Enums.Rechnungsstatus.open,
verbrauchsausweis_wohnen: {
connect: {
uid: ausweis_uid
id: ausweis_id
}
},
services,
@@ -107,13 +110,14 @@ export const PUT = defineApiRoute({
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
rechnung = await prisma.rechnung.create({
data: {
id,
benutzer_id: user.id,
betrag,
bezahlmethode: bezahlmethode,
status: Enums.Rechnungsstatus.open,
verbrauchsausweis_gewerbe: {
connect: {
uid: ausweis_uid
id: ausweis_id
}
},
services,
@@ -122,13 +126,14 @@ export const PUT = defineApiRoute({
} else if (ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) {
rechnung = await prisma.rechnung.create({
data: {
id,
benutzer_id: user.id,
betrag,
bezahlmethode: bezahlmethode,
status: Enums.Rechnungsstatus.open,
bedarfsausweis_wohnen: {
connect: {
uid: ausweis_uid
id: ausweis_id
}
},
services,
@@ -145,7 +150,7 @@ export const PUT = defineApiRoute({
await adapter.update({
where: {
uid: ausweis_uid
id: ausweis_id
},
data: {
bestellt: true
@@ -153,7 +158,7 @@ export const PUT = defineApiRoute({
})
if (bezahlmethode === Enums.Bezahlmethoden.rechnung) {
return { uid: rechnung.uid }
return { id }
}
// Wir erstellen eine Mollie Payment Referenz.
@@ -163,12 +168,12 @@ export const PUT = defineApiRoute({
currency: "EUR",
},
metadata: {
rechnung_uid: rechnung.uid,
rechnung_id: rechnung.id,
},
method: input.bezahlmethode as PaymentMethod,
description: "Verbrauchsausweis Wohnen 2016",
redirectUrl: `https://ibcornelsen.de/payment/success?a=${ausweis.uid}&r=${rechnung.uid}`,
webhookUrl: `http://ibcornelsen.de/api/webhooks/mollie?uid=${rechnung.uid}`,
redirectUrl: `https://ibcornelsen.de/payment/success?a=${ausweis.id}&r=${rechnung.id}`,
webhookUrl: `http://ibcornelsen.de/api/webhooks/mollie?uid=${rechnung.id}`,
});
const checkoutUrl = payment.getCheckoutUrl();
@@ -181,7 +186,7 @@ export const PUT = defineApiRoute({
}
return {
uid: rechnung.uid,
id,
checkout_url: checkoutUrl,
};
},

View File

@@ -6,17 +6,19 @@ import { fileURLToPath } from "url";
import { writeFileSync } from "fs";
import { PERSISTENT_DIR } from "#lib/server/constants.js";
import { UnterlageSchema } from "src/generated/zod/unterlage.js";
import { generatePrefixedId } from "#lib/db.js";
import { VALID_UUID_PREFIXES } from "#lib/constants.js";
import { UUidWithPrefix } from "#components/Ausweis/types.js";
export const PUT = defineApiRoute({
input: UnterlageSchema.omit({
aufnahme_id: true,
id: true,
uid: true
}).merge(z.object({
data: z.string(),
})),
output: z.object({
uid: z.string({ description: "Die UID der Unterlage." })
id: UUidWithPrefix
}),
async fetch({ data, name, kategorie, mime }, ctx, user) {
if (mime !== "application/pdf" && mime !== "image/png" && mime !== "image/jpeg") {
@@ -28,18 +30,18 @@ export const PUT = defineApiRoute({
const buffer = Buffer.from(data, "base64");
const unterlage = await prisma.unterlage.create({
const id = generatePrefixedId(6, VALID_UUID_PREFIXES.Unterlage)
await prisma.unterlage.create({
data: {
id,
kategorie: kategorie,
mime,
name
},
select: {
uid: true,
},
}
});
const filePath = fileURLToPath(new URL(`${PERSISTENT_DIR}/unterlagen/${unterlage.uid}`, import.meta.url));
const filePath = fileURLToPath(new URL(`${PERSISTENT_DIR}/unterlagen/${id}`, import.meta.url));
try {
writeFileSync(filePath, buffer)
@@ -47,7 +49,7 @@ export const PUT = defineApiRoute({
// Unterlage wurde nicht gespeichert, wir löschen den Eintrag wieder
await prisma.unterlage.delete({
where: {
uid: unterlage.uid
id
}
})
// Und geben einen Fehler zurück
@@ -58,7 +60,7 @@ export const PUT = defineApiRoute({
}
return {
uid: unterlage.uid
id
};
},
})
@@ -67,14 +69,14 @@ export const GET = defineApiRoute({
middleware: authorizationMiddleware,
output: z.array(UnterlageSchema.pick({
kategorie: true,
uid: true
id: true
})),
async fetch(input, ctx, user) {
const { uid } = ctx.params;
const { id } = ctx.params;
const objekt = await prisma.aufnahme.findUnique({
where: {
uid,
id,
benutzer_id: user.id
},
select: {
@@ -82,7 +84,7 @@ export const GET = defineApiRoute({
unterlagen: {
select: {
kategorie: true,
uid: true
id: true
}
}
}

View File

@@ -1,4 +1,6 @@
import { UUidWithPrefix } from "#components/Ausweis/types.js";
import { VALID_UUID_PREFIXES } from "#lib/constants.js";
import { generatePrefixedId } from "#lib/db.js";
import { adminMiddleware, authorizationMiddleware } from "#lib/middleware/authorization.js";
import { hashPassword } from "#lib/password.js";
import { sendRegisterMail } from "#lib/server/mail/registrierung.js";
@@ -11,7 +13,6 @@ export const POST = defineApiRoute({
input: BenutzerSchema.omit({
id: true,
lex_office_id: true,
uid: true,
rolle: true
}),
middleware: authorizationMiddleware,
@@ -43,7 +44,7 @@ export const POST = defineApiRoute({
export const GET = defineApiRoute({
input: z.object({
uid: UUidWithPrefix
id: UUidWithPrefix
}).or(z.object({
take: z.number(),
email: z.string()
@@ -51,13 +52,17 @@ export const GET = defineApiRoute({
output: z.array(BenutzerSchema),
middleware: adminMiddleware,
async fetch(input, context, admin) {
if ("uid" in input) {
if ("id" in input) {
const user = await prisma.benutzer.findUnique({
where: {
uid: input.uid
id: input.id
}
})
if (!user) {
return [];
}
return [user];
} else {
const users = await prisma.benutzer.findMany({
@@ -82,7 +87,7 @@ export const PUT = defineApiRoute({
name: z.string()
}),
output: z.object({
uid: UUidWithPrefix
id: UUidWithPrefix
}),
async fetch(input) {
const existingUser = await prisma.benutzer.findUnique({
@@ -98,17 +103,20 @@ export const PUT = defineApiRoute({
})
}
const id = generatePrefixedId(6, VALID_UUID_PREFIXES.User);
const user = await prisma.benutzer.create({
data: {
email: input.email,
passwort: hashPassword(input.passwort),
vorname: input.vorname,
name: input.name
name: input.name,
id
}
})
await sendRegisterMail(user)
return { uid: user.uid }
return { id }
},
})

View File

@@ -1,4 +1,6 @@
import { OptionalNullable, UUidWithPrefix, VerbrauchsausweisGewerbeClient, ZodOverlap } from "#components/Ausweis/types.js";
import { VALID_UUID_PREFIXES } from "#lib/constants.js";
import { generatePrefixedId } from "#lib/db.js";
import { exclude } from "#lib/exclude.js";
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
import { Enums, prisma } from "#lib/server/prisma.js";
@@ -8,7 +10,6 @@ import { z } from "zod";
export const PATCH = defineApiRoute({
input: VerbrauchsausweisGewerbeSchema.omit({
uid: true,
id: true,
benutzer_id: true,
aufnahme_id: true,
@@ -25,7 +26,7 @@ export const PATCH = defineApiRoute({
async fetch(input, ctx, user) {
const objekt = await prisma.verbrauchsausweisGewerbe.findUnique({
where: {
uid: ctx.params.uid,
id: ctx.params.id,
benutzer: {
id: user.id
}
@@ -41,7 +42,7 @@ export const PATCH = defineApiRoute({
await prisma.verbrauchsausweisGewerbe.update({
where: {
uid: ctx.params.uid
id: ctx.params.id
},
data: input
})
@@ -55,12 +56,12 @@ export const DELETE = defineApiRoute({
headers: authorizationHeaders,
middleware: authorizationMiddleware,
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({
code: "BAD_REQUEST",
message: "UID konnte nicht verifiziert werden."
message: "id konnte nicht verifiziert werden."
})
}
@@ -68,7 +69,7 @@ export const DELETE = defineApiRoute({
// Dieser MUSS mit dem Nutzer verknüpft sein.
const ausweis = await prisma.verbrauchsausweisGewerbe.findUnique({
where: {
uid,
id,
}
});
@@ -108,7 +109,7 @@ export const DELETE = defineApiRoute({
await prisma.verbrauchsausweisGewerbe.update({
where: {
uid
id
},
data: {
storniert: true
@@ -119,6 +120,7 @@ export const DELETE = defineApiRoute({
// Dann können wir das in der Historie anzeigen
await prisma.event.create({
data: {
id: generatePrefixedId(6, VALID_UUID_PREFIXES.Event),
title: "Ausweis storniert",
description: ((user.rolle === "ADMIN") && (ausweis.benutzer_id !== user.id)) ? "Ausweis wurde von einem Administrator storniert." : "Ausweis wurde vom Besitzer storniert.",
benutzer: {
@@ -154,42 +156,36 @@ export const GET = defineApiRoute({
}
},
output: ZodOverlap<OptionalNullable<VerbrauchsausweisGewerbeClient>>(VerbrauchsausweisGewerbeSchema.merge(z.object({
uid_aufnahme: UUidWithPrefix,
uid_objekt: UUidWithPrefix,
uid_benutzer: UUidWithPrefix.optional()
})).omit({
id: true,
aufnahme_id: true,
benutzer_id: true
})),
objekt_id: UUidWithPrefix,
}))),
middleware: authorizationMiddleware,
async fetch(input, context, user) {
const { uid } = context.params;
const { id } = context.params;
if (!uid) {
if (!id) {
throw new APIError({
code: "BAD_REQUEST",
message: "Missing uid in request params"
message: "Missing id in request params"
})
}
const ausweis = await prisma.verbrauchsausweisGewerbe.findUnique({
where: user.rolle === Enums.BenutzerRolle.USER ? {
uid,
id,
benutzer_id: user.id
} : { uid },
} : { id },
include: {
benutzer: {
select: {
uid: true
id: true
}
},
aufnahme: {
select: {
uid: true,
id: true,
objekt: {
select: {
uid: true
id: true
}
}
}
@@ -206,10 +202,8 @@ export const GET = defineApiRoute({
}
return {
uid_aufnahme: ausweis.aufnahme.uid,
uid_objekt: ausweis.aufnahme.objekt.uid,
uid_benutzer: ausweis.benutzer?.uid,
...exclude(ausweis, ["id", "aufnahme_id", "benutzer_id", "aufnahme"])
objekt_id: ausweis.aufnahme.objekt.id,
...exclude(ausweis, ["aufnahme"])
}
},
});

View File

@@ -1,4 +1,6 @@
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 { prisma } from "#lib/server/prisma.js";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
@@ -16,7 +18,6 @@ export const PUT = defineApiRoute({
ausweis: VerbrauchsausweisGewerbeSchema.omit({
id: true,
benutzer_id: true,
uid: true,
aufnahme_id: true,
rechnung_id: true,
updated_at: true,
@@ -24,19 +25,19 @@ export const PUT = defineApiRoute({
}).merge(z.object({
startdatum: z.coerce.date()
})),
uid_aufnahme: UUidWithPrefix
aufnahme_id: UUidWithPrefix
}),
output: z.object({
uid: UUidWithPrefix,
objekt_uid: UUidWithPrefix,
aufnahme_uid: UUidWithPrefix,
id: UUidWithPrefix,
objekt_id: UUidWithPrefix,
aufnahme_id: UUidWithPrefix,
}),
headers: authorizationHeaders,
middleware: authorizationMiddleware,
async fetch(input, ctx, user) {
const aufnahme = await prisma.aufnahme.findUnique({
where: {
uid: input.uid_aufnahme
id: input.aufnahme_id
}
})
@@ -47,8 +48,11 @@ export const PUT = defineApiRoute({
})
}
const id = generatePrefixedId(6, VALID_UUID_PREFIXES.VerbrauchsausweisGewerbe)
const createdAusweis = await prisma.verbrauchsausweisGewerbe.create({
data: {
id,
...input.ausweis,
benutzer: {
connect: {
@@ -57,18 +61,18 @@ export const PUT = defineApiRoute({
},
aufnahme: {
connect: {
uid: aufnahme.uid,
id: aufnahme.id,
},
},
},
select: {
uid: true,
id: true,
aufnahme: {
select: {
uid: true,
id: true,
objekt: {
select: {
uid: true,
id: true,
},
},
},
@@ -77,9 +81,9 @@ export const PUT = defineApiRoute({
});
return {
uid: createdAusweis.uid,
objekt_uid: createdAusweis.aufnahme.objekt.uid,
aufnahme_uid: createdAusweis.aufnahme.uid,
id: id,
objekt_id: createdAusweis.aufnahme.objekt.id,
aufnahme_id: createdAusweis.aufnahme.id,
};
},
});
@@ -103,11 +107,11 @@ export const GET = defineApiRoute({
},
middleware: authorizationMiddleware,
async fetch(input, context, user) {
const { uid } = context.params;
const { id } = context.params;
const ausweis = await prisma.verbrauchsausweisGewerbe.findUnique({
where: {
uid,
id,
},
include: {
benutzer: true,
@@ -118,7 +122,7 @@ export const GET = defineApiRoute({
include: {
benutzer: {
select: {
uid: true,
id: true,
},
},
},

View File

@@ -1,4 +1,6 @@
import { OptionalNullable, UUidWithPrefix, VerbrauchsausweisWohnenClient, ZodOverlap } from "#components/Ausweis/types.js";
import { VALID_UUID_PREFIXES } from "#lib/constants.js";
import { generatePrefixedId } from "#lib/db.js";
import { exclude } from "#lib/exclude.js";
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
import { Enums, prisma } from "#lib/server/prisma.js";
@@ -8,7 +10,6 @@ import { z } from "zod";
export const PATCH = defineApiRoute({
input: VerbrauchsausweisWohnenSchema.omit({
uid: true,
id: true,
benutzer_id: true,
aufnahme_id: true,
@@ -26,7 +27,7 @@ export const PATCH = defineApiRoute({
async fetch(input, ctx, user) {
const objekt = await prisma.verbrauchsausweisWohnen.findUnique({
where: {
uid: ctx.params.uid,
id: ctx.params.id,
benutzer: {
id: user.id
}
@@ -42,7 +43,7 @@ export const PATCH = defineApiRoute({
await prisma.verbrauchsausweisWohnen.update({
where: {
uid: ctx.params.uid
id: ctx.params.id
},
data: input
})
@@ -56,9 +57,9 @@ export const DELETE = defineApiRoute({
headers: authorizationHeaders,
middleware: authorizationMiddleware,
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({
code: "BAD_REQUEST",
message: "UID konnte nicht verifiziert werden."
@@ -69,7 +70,7 @@ export const DELETE = defineApiRoute({
// Dieser MUSS mit dem Nutzer verknüpft sein.
const ausweis = await prisma.verbrauchsausweisWohnen.findUnique({
where: {
uid,
id,
}
});
@@ -109,7 +110,7 @@ export const DELETE = defineApiRoute({
await prisma.verbrauchsausweisWohnen.update({
where: {
uid
id
},
data: {
storniert: true
@@ -120,6 +121,7 @@ export const DELETE = defineApiRoute({
// Dann können wir das in der Historie anzeigen
await prisma.event.create({
data: {
id: generatePrefixedId(6, VALID_UUID_PREFIXES.Event),
title: "Ausweis storniert",
description: ((user.rolle === "ADMIN") && (ausweis.benutzer_id !== user.id)) ? "Ausweis wurde von einem Administrator storniert." : "Ausweis wurde vom Besitzer storniert.",
benutzer: {
@@ -155,42 +157,36 @@ export const GET = defineApiRoute({
}
},
output: ZodOverlap<OptionalNullable<VerbrauchsausweisWohnenClient>>(VerbrauchsausweisWohnenSchema.merge(z.object({
uid_aufnahme: UUidWithPrefix,
uid_objekt: UUidWithPrefix,
uid_benutzer: UUidWithPrefix.optional()
})).omit({
id: true,
aufnahme_id: true,
benutzer_id: true
})),
objekt_id: UUidWithPrefix
}))),
middleware: authorizationMiddleware,
async fetch(input, context, user) {
const { uid } = context.params;
const { id } = context.params;
if (!uid) {
if (!id) {
throw new APIError({
code: "BAD_REQUEST",
message: "Missing uid in request params"
message: "Missing id in request params"
})
}
const ausweis = await prisma.verbrauchsausweisWohnen.findUnique({
where: user.rolle === Enums.BenutzerRolle.USER ? {
uid,
id,
benutzer_id: user.id
} : { uid },
} : { id },
include: {
benutzer: {
select: {
uid: true
id: true
}
},
aufnahme: {
select: {
uid: true,
id: true,
objekt: {
select: {
uid: true
id: true
}
}
}
@@ -207,10 +203,8 @@ export const GET = defineApiRoute({
}
return {
uid_aufnahme: ausweis.aufnahme.uid,
uid_objekt: ausweis.aufnahme.objekt.uid,
uid_benutzer: ausweis.benutzer?.uid,
...exclude(ausweis, ["id", "aufnahme_id", "benutzer_id", "aufnahme"])
objekt_id: ausweis.aufnahme.objekt.id,
...exclude(ausweis, ["aufnahme"])
}
},
});

View File

@@ -1,4 +1,5 @@
import { UUidWithPrefix } from "#components/Ausweis/types.js";
import { generatePrefixedId } from "#lib/db.js";
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
import { prisma } from "#lib/server/prisma.js";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
@@ -22,25 +23,24 @@ export const PUT = defineApiRoute({
})).omit({
id: true,
benutzer_id: true,
uid: true,
aufnahme_id: true,
rechnung_id: true,
created_at: true,
updated_at: true
}),
uid_aufnahme: UUidWithPrefix
aufnahme_id: UUidWithPrefix
}),
output: z.object({
uid: UUidWithPrefix,
objekt_uid: UUidWithPrefix,
aufnahme_uid: UUidWithPrefix,
id: UUidWithPrefix,
objekt_id: UUidWithPrefix,
aufnahme_id: UUidWithPrefix,
}),
headers: authorizationHeaders,
middleware: authorizationMiddleware,
async fetch(input, ctx, user) {
const aufnahme = await prisma.aufnahme.findUnique({
where: {
uid: input.uid_aufnahme
id: input.aufnahme_id
}
})
@@ -51,8 +51,11 @@ export const PUT = defineApiRoute({
})
}
const id = generatePrefixedId(6, "VW");
const createdAusweis = await prisma.verbrauchsausweisWohnen.create({
data: {
id,
...input.ausweis,
benutzer: {
connect: {
@@ -61,18 +64,18 @@ export const PUT = defineApiRoute({
},
aufnahme: {
connect: {
uid: aufnahme.uid,
id: aufnahme.id,
},
},
},
select: {
uid: true,
id: true,
aufnahme: {
select: {
uid: true,
id: true,
objekt: {
select: {
uid: true,
id: true,
},
},
},
@@ -81,9 +84,9 @@ export const PUT = defineApiRoute({
});
return {
uid: createdAusweis.uid,
objekt_uid: createdAusweis.aufnahme.objekt.uid,
aufnahme_uid: createdAusweis.aufnahme.uid,
id: createdAusweis.id,
objekt_id: createdAusweis.aufnahme.objekt.id,
aufnahme_id: createdAusweis.aufnahme.id,
};
},
});
@@ -107,11 +110,11 @@ export const GET = defineApiRoute({
},
middleware: authorizationMiddleware,
async fetch(input, context, user) {
const { uid } = context.params;
const { id } = context.params;
const ausweis = await prisma.verbrauchsausweisWohnen.findUnique({
where: {
uid,
id,
},
include: {
benutzer: true,
@@ -122,7 +125,7 @@ export const GET = defineApiRoute({
include: {
benutzer: {
select: {
uid: true,
id: true,
},
},
},

View File

@@ -3,11 +3,11 @@ import { APIRoute } from "astro";
import { getS3File } from "#lib/s3.js";
export const GET: APIRoute = async (Astro) => {
const { uid } = Astro.params;
const { id } = Astro.params;
const image = await prisma.bild.findUnique({
where: {
uid,
id,
},
});
@@ -17,7 +17,7 @@ export const GET: APIRoute = async (Astro) => {
});
}
const file = await getS3File("ibc-images", `${image.uid}.jpg`);
const file = await getS3File("ibc-images", `${image.id}.jpg`);
if (!file) {
const file = await getS3File("ibc-images", `${image.name}.jpg`)

View File

@@ -0,0 +1,113 @@
---
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants";
import { prisma, Enums } from "#lib/server/prisma";
import { createCaller } from "src/astro-typesafe-api-caller";
const caller = createCaller(Astro)
const id = Astro.url.searchParams.get("id");
if (!id) {
return Astro.redirect("/dashboard/objekte")
}
const user = await caller.user.self.GET.fetch(undefined, {
headers: {
"Authorization": `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
}
});
if (!user) {
return Astro.redirect("/auth/login")
}
const objekte = await prisma.objekt.findFirst({
where: user.rolle === Enums.BenutzerRolle.USER ? {
benutzer: {
id: user.id
},
} : {
...(id ? {OR: [
{
aufnahmen: {
every: {
verbrauchsausweise_gewerbe: {
some: {
alte_ausweis_id: parseInt(id)
}
},
}
}
},
{
aufnahmen: {
every: {
verbrauchsausweise_wohnen: {
some: {
alte_ausweis_id: parseInt(id)
}
},
}
}
},
{
aufnahmen: {
every: {
bedarfsausweise_wohnen: {
some: {
alte_ausweis_id: parseInt(id)
}
},
}
}
},
{
aufnahmen: {
every: {
verbrauchsausweise_gewerbe: {
some: {
id: `VG${id}`
}
},
}
}
},
{
aufnahmen: {
every: {
verbrauchsausweise_wohnen: {
some: {
id: `VW${id}`
}
},
}
}
},
{
aufnahmen: {
every: {
bedarfsausweise_wohnen: {
some: {
id: `BW${id}`
}
},
}
}
},]} : {})
},
orderBy: {
erstellungsdatum: "desc"
},
include: {
aufnahmen: {
include: {
bilder: true,
unterlagen: true,
bedarfsausweise_wohnen: true,
verbrauchsausweise_gewerbe: true,
verbrauchsausweise_wohnen: true
}
}
}
})
---

View File

@@ -40,7 +40,7 @@ const objekte = await prisma.objekt.findMany({
...(id ? {OR: [
{
aufnahmen: {
some: {
every: {
verbrauchsausweise_gewerbe: {
some: {
alte_ausweis_id: parseInt(id)
@@ -51,7 +51,7 @@ const objekte = await prisma.objekt.findMany({
},
{
aufnahmen: {
some: {
every: {
verbrauchsausweise_wohnen: {
some: {
alte_ausweis_id: parseInt(id)
@@ -62,7 +62,7 @@ const objekte = await prisma.objekt.findMany({
},
{
aufnahmen: {
some: {
every: {
bedarfsausweise_wohnen: {
some: {
alte_ausweis_id: parseInt(id)
@@ -73,7 +73,7 @@ const objekte = await prisma.objekt.findMany({
},
{
aufnahmen: {
some: {
every: {
verbrauchsausweise_gewerbe: {
some: {
uid: {
@@ -86,7 +86,7 @@ const objekte = await prisma.objekt.findMany({
},
{
aufnahmen: {
some: {
every: {
verbrauchsausweise_wohnen: {
some: {
uid: {
@@ -99,7 +99,7 @@ const objekte = await prisma.objekt.findMany({
},
{
aufnahmen: {
some: {
every: {
bedarfsausweise_wohnen: {
some: {
uid: {

View File

@@ -7,8 +7,8 @@ import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants";
import { validateAccessTokenServer } from "#server/lib/validateAccessToken";
import { Enums } from "#lib/server/prisma";
const uid = Astro.url.searchParams.get("uid");
const uid_aufnahme = Astro.url.searchParams.get("aufnahme")
const id = Astro.url.searchParams.get("id");
const aufnahme_id = Astro.url.searchParams.get("aufnahme")
let ausweistyp = Astro.url.searchParams.get("ausweistyp") || Enums.AusweisTyp.Standard;
let ausweis: VerbrauchsausweisWohnenClient = {} as VerbrauchsausweisWohnenClient;
@@ -20,7 +20,7 @@ const valid = validateAccessTokenServer(Astro);
const caller = createCaller(Astro);
if (uid) {
if (id) {
if (!valid) {
return Astro.redirect(
`/auth/login?redirect=${Astro.url.toString()}`
@@ -28,41 +28,41 @@ if (uid) {
}
try {
ausweis = await caller["verbrauchsausweis-wohnen"]._uid.GET.fetch(null, {
ausweis = await caller["verbrauchsausweis-wohnen"]._id.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid
id
}
});
ausweistyp = ausweis.ausweistyp
aufnahme = await caller.aufnahme._uid.GET.fetch(null, {
aufnahme = await caller.aufnahme._id.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid: ausweis.uid_aufnahme
id: ausweis.aufnahme_id
}
})
objekt = await caller.objekt._uid.GET.fetch(null, {
objekt = await caller.objekt._id.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid: ausweis.uid_objekt
id: ausweis.objekt_id
}
})
bilder = await caller.aufnahme._uid.bilder.GET.fetch(null, {
bilder = await caller.aufnahme._id.bilder.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid: ausweis.uid_aufnahme
id: ausweis.aufnahme_id
}
})
@@ -78,35 +78,35 @@ if (uid) {
"/energieausweis-erstellen/verbrauchsausweis-wohngebaeude"
);
}
} else if (uid_aufnahme) {
} else if (aufnahme_id) {
if (!valid) {
return Astro.redirect(
`/auth/login?redirect=${Astro.url.toString()}`
);
}
let { uid_objekt, ...result} = await caller.aufnahme._uid.GET.fetch(null, {
let { objekt_id, ...result} = await caller.aufnahme._id.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid: uid_aufnahme
id: aufnahme_id
}
})
aufnahme = result;
objekt = await caller.objekt._uid.GET.fetch(null, {
objekt = await caller.objekt._id.GET.fetch(null, {
headers: {
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
},
params: {
uid: uid_objekt
id: objekt_id
}
})
}
---
<AusweisLayout title="Verbrauchsausweis erstellen">
<VerbrauchsausweisWohnenModule client:only {ausweis} {objekt} {aufnahme} {bilder} {uid} {ausweistyp} />
<VerbrauchsausweisWohnenModule client:only {ausweis} {objekt} {aufnahme} {bilder} {id} {ausweistyp} />
</AusweisLayout>