Merge branch 'main' into UMBE
This commit is contained in:
66
bun.lock
66
bun.lock
@@ -30,6 +30,7 @@
|
|||||||
"js-interpolate": "^1.3.2",
|
"js-interpolate": "^1.3.2",
|
||||||
"jsonwebtoken": "^9.0.2",
|
"jsonwebtoken": "^9.0.2",
|
||||||
"jwt-decode": "^4.0.0",
|
"jwt-decode": "^4.0.0",
|
||||||
|
"mime-types": "^2.1.35",
|
||||||
"moment": "^2.30.1",
|
"moment": "^2.30.1",
|
||||||
"moment-timezone": "^0.5.46",
|
"moment-timezone": "^0.5.46",
|
||||||
"nodemailer": "^6.10.0",
|
"nodemailer": "^6.10.0",
|
||||||
@@ -37,6 +38,8 @@
|
|||||||
"postcss-nested": "^7.0.2",
|
"postcss-nested": "^7.0.2",
|
||||||
"radix-svelte-icons": "^1.0.0",
|
"radix-svelte-icons": "^1.0.0",
|
||||||
"sass": "^1.83.4",
|
"sass": "^1.83.4",
|
||||||
|
"siema": "^1.5.1",
|
||||||
|
"soap": "^1.1.8",
|
||||||
"svelte": "^3.59.2",
|
"svelte": "^3.59.2",
|
||||||
"svelte-dialogs": "^1.2.2",
|
"svelte-dialogs": "^1.2.2",
|
||||||
"svelte-preprocess": "^5.1.4",
|
"svelte-preprocess": "^5.1.4",
|
||||||
@@ -56,7 +59,9 @@
|
|||||||
"@types/is-base64": "^1.1.3",
|
"@types/is-base64": "^1.1.3",
|
||||||
"@types/js-cookie": "^3.0.6",
|
"@types/js-cookie": "^3.0.6",
|
||||||
"@types/jsonwebtoken": "^9.0.7",
|
"@types/jsonwebtoken": "^9.0.7",
|
||||||
|
"@types/mime-types": "^2.1.4",
|
||||||
"@types/nodemailer": "^6.4.17",
|
"@types/nodemailer": "^6.4.17",
|
||||||
|
"@types/siema": "^1.4.11",
|
||||||
"@types/uuid": "^9.0.8",
|
"@types/uuid": "^9.0.8",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.62.0",
|
"@typescript-eslint/eslint-plugin": "^5.62.0",
|
||||||
"@typescript-eslint/parser": "^5.62.0",
|
"@typescript-eslint/parser": "^5.62.0",
|
||||||
@@ -65,7 +70,6 @@
|
|||||||
"cypress": "^13.17.0",
|
"cypress": "^13.17.0",
|
||||||
"cypress-file-upload": "^5.0.8",
|
"cypress-file-upload": "^5.0.8",
|
||||||
"cypress-vite": "^1.6.0",
|
"cypress-vite": "^1.6.0",
|
||||||
"daisyui": "^4.12.23",
|
|
||||||
"eslint": "~8.15.0",
|
"eslint": "~8.15.0",
|
||||||
"eslint-config-prettier": "8.1.0",
|
"eslint-config-prettier": "8.1.0",
|
||||||
"postcss": "^8.5.1",
|
"postcss": "^8.5.1",
|
||||||
@@ -540,6 +544,8 @@
|
|||||||
|
|
||||||
"@types/mime": ["@types/mime@1.3.5", "", {}, "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w=="],
|
"@types/mime": ["@types/mime@1.3.5", "", {}, "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w=="],
|
||||||
|
|
||||||
|
"@types/mime-types": ["@types/mime-types@2.1.4", "", {}, "sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w=="],
|
||||||
|
|
||||||
"@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="],
|
"@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="],
|
||||||
|
|
||||||
"@types/nlcst": ["@types/nlcst@2.0.3", "", { "dependencies": { "@types/unist": "*" } }, "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA=="],
|
"@types/nlcst": ["@types/nlcst@2.0.3", "", { "dependencies": { "@types/unist": "*" } }, "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA=="],
|
||||||
@@ -562,6 +568,8 @@
|
|||||||
|
|
||||||
"@types/serve-static": ["@types/serve-static@1.15.7", "", { "dependencies": { "@types/http-errors": "*", "@types/node": "*", "@types/send": "*" } }, "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw=="],
|
"@types/serve-static": ["@types/serve-static@1.15.7", "", { "dependencies": { "@types/http-errors": "*", "@types/node": "*", "@types/send": "*" } }, "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw=="],
|
||||||
|
|
||||||
|
"@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=="],
|
"@types/sinonjs__fake-timers": ["@types/sinonjs__fake-timers@8.1.1", "", {}, "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g=="],
|
||||||
|
|
||||||
"@types/sizzle": ["@types/sizzle@2.3.9", "", {}, "sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w=="],
|
"@types/sizzle": ["@types/sizzle@2.3.9", "", {}, "sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w=="],
|
||||||
@@ -592,6 +600,10 @@
|
|||||||
|
|
||||||
"@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="],
|
"@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="],
|
||||||
|
|
||||||
|
"@xmldom/is-dom-node": ["@xmldom/is-dom-node@1.0.1", "", {}, "sha512-CJDxIgE5I0FH+ttq/Fxy6nRpxP70+e2O048EPe85J2use3XKdatVM7dDVvFNjQudd9B49NPoZ+8PG49zj4Er8Q=="],
|
||||||
|
|
||||||
|
"@xmldom/xmldom": ["@xmldom/xmldom@0.8.10", "", {}, "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw=="],
|
||||||
|
|
||||||
"abbrev": ["abbrev@1.1.1", "", {}, "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="],
|
"abbrev": ["abbrev@1.1.1", "", {}, "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="],
|
||||||
|
|
||||||
"accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="],
|
"accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="],
|
||||||
@@ -646,6 +658,8 @@
|
|||||||
|
|
||||||
"array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="],
|
"array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="],
|
||||||
|
|
||||||
|
"asap": ["asap@2.0.6", "", {}, "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="],
|
||||||
|
|
||||||
"asn1": ["asn1@0.2.6", "", { "dependencies": { "safer-buffer": "~2.1.0" } }, "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ=="],
|
"asn1": ["asn1@0.2.6", "", { "dependencies": { "safer-buffer": "~2.1.0" } }, "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ=="],
|
||||||
|
|
||||||
"assert-plus": ["assert-plus@1.0.0", "", {}, "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw=="],
|
"assert-plus": ["assert-plus@1.0.0", "", {}, "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw=="],
|
||||||
@@ -674,6 +688,10 @@
|
|||||||
|
|
||||||
"aws4": ["aws4@1.13.2", "", {}, "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw=="],
|
"aws4": ["aws4@1.13.2", "", {}, "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw=="],
|
||||||
|
|
||||||
|
"axios": ["axios@1.7.9", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw=="],
|
||||||
|
|
||||||
|
"axios-ntlm": ["axios-ntlm@1.4.3", "", { "dependencies": { "axios": "^1.7.9", "des.js": "^1.1.0", "dev-null": "^0.1.1", "js-md4": "^0.3.2" } }, "sha512-CS6WE8chZpEDKxv4IFwr5zcG7InMC6Ek0aj2n2tHauBh+8KiYVC4qMn3N2arjR5tnyILQuTGlI0mc83hgWxS4Q=="],
|
||||||
|
|
||||||
"axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="],
|
"axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="],
|
||||||
|
|
||||||
"babel-runtime": ["babel-runtime@6.26.0", "", { "dependencies": { "core-js": "^2.4.0", "regenerator-runtime": "^0.11.0" } }, "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g=="],
|
"babel-runtime": ["babel-runtime@6.26.0", "", { "dependencies": { "core-js": "^2.4.0", "regenerator-runtime": "^0.11.0" } }, "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g=="],
|
||||||
@@ -844,8 +862,6 @@
|
|||||||
|
|
||||||
"css-animation": ["css-animation@1.6.1", "", { "dependencies": { "babel-runtime": "6.x", "component-classes": "^1.2.5" } }, "sha512-/48+/BaEaHRY6kNQ2OIPzKf9A6g8WjZYjhiNDNuIVbsm5tXCGIAsHDjB4Xu1C4vXJtUWZo26O68OQkDpNBaPog=="],
|
"css-animation": ["css-animation@1.6.1", "", { "dependencies": { "babel-runtime": "6.x", "component-classes": "^1.2.5" } }, "sha512-/48+/BaEaHRY6kNQ2OIPzKf9A6g8WjZYjhiNDNuIVbsm5tXCGIAsHDjB4Xu1C4vXJtUWZo26O68OQkDpNBaPog=="],
|
||||||
|
|
||||||
"css-selector-tokenizer": ["css-selector-tokenizer@0.8.0", "", { "dependencies": { "cssesc": "^3.0.0", "fastparse": "^1.1.2" } }, "sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg=="],
|
|
||||||
|
|
||||||
"css-styled": ["css-styled@1.0.8", "", { "dependencies": { "@daybrush/utils": "^1.13.0" } }, "sha512-tCpP7kLRI8dI95rCh3Syl7I+v7PP+2JYOzWkl0bUEoSbJM+u8ITbutjlQVf0NC2/g4ULROJPi16sfwDIO8/84g=="],
|
"css-styled": ["css-styled@1.0.8", "", { "dependencies": { "@daybrush/utils": "^1.13.0" } }, "sha512-tCpP7kLRI8dI95rCh3Syl7I+v7PP+2JYOzWkl0bUEoSbJM+u8ITbutjlQVf0NC2/g4ULROJPi16sfwDIO8/84g=="],
|
||||||
|
|
||||||
"css-to-mat": ["css-to-mat@1.1.1", "", { "dependencies": { "@daybrush/utils": "^1.13.0", "@scena/matrix": "^1.0.0" } }, "sha512-kvpxFYZb27jRd2vium35G7q5XZ2WJ9rWjDUMNT36M3Hc41qCrLXFM5iEKMGXcrPsKfXEN+8l/riB4QzwwwiEyQ=="],
|
"css-to-mat": ["css-to-mat@1.1.1", "", { "dependencies": { "@daybrush/utils": "^1.13.0", "@scena/matrix": "^1.0.0" } }, "sha512-kvpxFYZb27jRd2vium35G7q5XZ2WJ9rWjDUMNT36M3Hc41qCrLXFM5iEKMGXcrPsKfXEN+8l/riB4QzwwwiEyQ=="],
|
||||||
@@ -856,8 +872,6 @@
|
|||||||
|
|
||||||
"csvtojson": ["csvtojson@2.0.10", "", { "dependencies": { "bluebird": "^3.5.1", "lodash": "^4.17.3", "strip-bom": "^2.0.0" }, "bin": { "csvtojson": "./bin/csvtojson" } }, "sha512-lUWFxGKyhraKCW8Qghz6Z0f2l/PqB1W3AO0HKJzGIQ5JRSlR651ekJDiGJbBT4sRNNv5ddnSGVEnsxP9XRCVpQ=="],
|
"csvtojson": ["csvtojson@2.0.10", "", { "dependencies": { "bluebird": "^3.5.1", "lodash": "^4.17.3", "strip-bom": "^2.0.0" }, "bin": { "csvtojson": "./bin/csvtojson" } }, "sha512-lUWFxGKyhraKCW8Qghz6Z0f2l/PqB1W3AO0HKJzGIQ5JRSlR651ekJDiGJbBT4sRNNv5ddnSGVEnsxP9XRCVpQ=="],
|
||||||
|
|
||||||
"culori": ["culori@3.3.0", "", {}, "sha512-pHJg+jbuFsCjz9iclQBqyL3B2HLCBF71BwVNujUYEvCeQMvV97R59MNK3R2+jgJ3a1fcZgI9B3vYgz8lzr/BFQ=="],
|
|
||||||
|
|
||||||
"cypress": ["cypress@13.17.0", "", { "dependencies": { "@cypress/request": "^3.0.6", "@cypress/xvfb": "^1.2.4", "@types/sinonjs__fake-timers": "8.1.1", "@types/sizzle": "^2.3.2", "arch": "^2.2.0", "blob-util": "^2.0.2", "bluebird": "^3.7.2", "buffer": "^5.7.1", "cachedir": "^2.3.0", "chalk": "^4.1.0", "check-more-types": "^2.24.0", "ci-info": "^4.0.0", "cli-cursor": "^3.1.0", "cli-table3": "~0.6.1", "commander": "^6.2.1", "common-tags": "^1.8.0", "dayjs": "^1.10.4", "debug": "^4.3.4", "enquirer": "^2.3.6", "eventemitter2": "6.4.7", "execa": "4.1.0", "executable": "^4.1.1", "extract-zip": "2.0.1", "figures": "^3.2.0", "fs-extra": "^9.1.0", "getos": "^3.2.1", "is-installed-globally": "~0.4.0", "lazy-ass": "^1.6.0", "listr2": "^3.8.3", "lodash": "^4.17.21", "log-symbols": "^4.0.0", "minimist": "^1.2.8", "ospath": "^1.2.2", "pretty-bytes": "^5.6.0", "process": "^0.11.10", "proxy-from-env": "1.0.0", "request-progress": "^3.0.0", "semver": "^7.5.3", "supports-color": "^8.1.1", "tmp": "~0.2.3", "tree-kill": "1.2.2", "untildify": "^4.0.0", "yauzl": "^2.10.0" }, "bin": { "cypress": "bin/cypress" } }, "sha512-5xWkaPurwkIljojFidhw8lFScyxhtiFHl/i/3zov+1Z5CmY4t9tjIdvSXfu82Y3w7wt0uR9KkucbhkVvJZLQSA=="],
|
"cypress": ["cypress@13.17.0", "", { "dependencies": { "@cypress/request": "^3.0.6", "@cypress/xvfb": "^1.2.4", "@types/sinonjs__fake-timers": "8.1.1", "@types/sizzle": "^2.3.2", "arch": "^2.2.0", "blob-util": "^2.0.2", "bluebird": "^3.7.2", "buffer": "^5.7.1", "cachedir": "^2.3.0", "chalk": "^4.1.0", "check-more-types": "^2.24.0", "ci-info": "^4.0.0", "cli-cursor": "^3.1.0", "cli-table3": "~0.6.1", "commander": "^6.2.1", "common-tags": "^1.8.0", "dayjs": "^1.10.4", "debug": "^4.3.4", "enquirer": "^2.3.6", "eventemitter2": "6.4.7", "execa": "4.1.0", "executable": "^4.1.1", "extract-zip": "2.0.1", "figures": "^3.2.0", "fs-extra": "^9.1.0", "getos": "^3.2.1", "is-installed-globally": "~0.4.0", "lazy-ass": "^1.6.0", "listr2": "^3.8.3", "lodash": "^4.17.21", "log-symbols": "^4.0.0", "minimist": "^1.2.8", "ospath": "^1.2.2", "pretty-bytes": "^5.6.0", "process": "^0.11.10", "proxy-from-env": "1.0.0", "request-progress": "^3.0.0", "semver": "^7.5.3", "supports-color": "^8.1.1", "tmp": "~0.2.3", "tree-kill": "1.2.2", "untildify": "^4.0.0", "yauzl": "^2.10.0" }, "bin": { "cypress": "bin/cypress" } }, "sha512-5xWkaPurwkIljojFidhw8lFScyxhtiFHl/i/3zov+1Z5CmY4t9tjIdvSXfu82Y3w7wt0uR9KkucbhkVvJZLQSA=="],
|
||||||
|
|
||||||
"cypress-file-upload": ["cypress-file-upload@5.0.8", "", { "peerDependencies": { "cypress": ">3.0.0" } }, "sha512-+8VzNabRk3zG6x8f8BWArF/xA/W0VK4IZNx3MV0jFWrJS/qKn8eHfa5nU73P9fOQAgwHFJx7zjg4lwOnljMO8g=="],
|
"cypress-file-upload": ["cypress-file-upload@5.0.8", "", { "peerDependencies": { "cypress": ">3.0.0" } }, "sha512-+8VzNabRk3zG6x8f8BWArF/xA/W0VK4IZNx3MV0jFWrJS/qKn8eHfa5nU73P9fOQAgwHFJx7zjg4lwOnljMO8g=="],
|
||||||
@@ -866,8 +880,6 @@
|
|||||||
|
|
||||||
"d3-dsv": ["d3-dsv@2.0.0", "", { "dependencies": { "commander": "2", "iconv-lite": "0.4", "rw": "1" }, "bin": { "csv2json": "bin/dsv2json", "csv2tsv": "bin/dsv2dsv", "dsv2dsv": "bin/dsv2dsv", "dsv2json": "bin/dsv2json", "json2csv": "bin/json2dsv", "json2dsv": "bin/json2dsv", "json2tsv": "bin/json2dsv", "tsv2csv": "bin/dsv2dsv", "tsv2json": "bin/dsv2json" } }, "sha512-E+Pn8UJYx9mViuIUkoc93gJGGYut6mSDKy2+XaPwccwkRGlR+LO97L2VCCRjQivTwLHkSnAJG7yo00BWY6QM+w=="],
|
"d3-dsv": ["d3-dsv@2.0.0", "", { "dependencies": { "commander": "2", "iconv-lite": "0.4", "rw": "1" }, "bin": { "csv2json": "bin/dsv2json", "csv2tsv": "bin/dsv2dsv", "dsv2dsv": "bin/dsv2dsv", "dsv2json": "bin/dsv2json", "json2csv": "bin/json2dsv", "json2dsv": "bin/json2dsv", "json2tsv": "bin/json2dsv", "tsv2csv": "bin/dsv2dsv", "tsv2json": "bin/dsv2json" } }, "sha512-E+Pn8UJYx9mViuIUkoc93gJGGYut6mSDKy2+XaPwccwkRGlR+LO97L2VCCRjQivTwLHkSnAJG7yo00BWY6QM+w=="],
|
||||||
|
|
||||||
"daisyui": ["daisyui@4.12.23", "", { "dependencies": { "css-selector-tokenizer": "^0.8", "culori": "^3", "picocolors": "^1", "postcss-js": "^4" } }, "sha512-EM38duvxutJ5PD65lO/AFMpcw+9qEy6XAZrTpzp7WyaPeO/l+F/Qiq0ECHHmFNcFXh5aVoALY4MGrrxtCiaQCQ=="],
|
|
||||||
|
|
||||||
"dashdash": ["dashdash@1.14.1", "", { "dependencies": { "assert-plus": "^1.0.0" } }, "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g=="],
|
"dashdash": ["dashdash@1.14.1", "", { "dependencies": { "assert-plus": "^1.0.0" } }, "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g=="],
|
||||||
|
|
||||||
"date-fns": ["date-fns@4.1.0", "", {}, "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg=="],
|
"date-fns": ["date-fns@4.1.0", "", {}, "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg=="],
|
||||||
@@ -896,6 +908,8 @@
|
|||||||
|
|
||||||
"dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="],
|
"dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="],
|
||||||
|
|
||||||
|
"des.js": ["des.js@1.1.0", "", { "dependencies": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" } }, "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg=="],
|
||||||
|
|
||||||
"destr": ["destr@2.0.3", "", {}, "sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ=="],
|
"destr": ["destr@2.0.3", "", {}, "sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ=="],
|
||||||
|
|
||||||
"destroy": ["destroy@1.2.0", "", {}, "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="],
|
"destroy": ["destroy@1.2.0", "", {}, "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="],
|
||||||
@@ -906,10 +920,14 @@
|
|||||||
|
|
||||||
"deterministic-object-hash": ["deterministic-object-hash@2.0.2", "", { "dependencies": { "base-64": "^1.0.0" } }, "sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ=="],
|
"deterministic-object-hash": ["deterministic-object-hash@2.0.2", "", { "dependencies": { "base-64": "^1.0.0" } }, "sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ=="],
|
||||||
|
|
||||||
|
"dev-null": ["dev-null@0.1.1", "", {}, "sha512-nMNZG0zfMgmdv8S5O0TM5cpwNbGKRGPCxVsr0SmA3NZZy9CYBbuNLL0PD3Acx9e5LIUgwONXtM9kM6RlawPxEQ=="],
|
||||||
|
|
||||||
"devalue": ["devalue@5.1.1", "", {}, "sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw=="],
|
"devalue": ["devalue@5.1.1", "", {}, "sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw=="],
|
||||||
|
|
||||||
"devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="],
|
"devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="],
|
||||||
|
|
||||||
|
"dezalgo": ["dezalgo@1.0.4", "", { "dependencies": { "asap": "^2.0.0", "wrappy": "1" } }, "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig=="],
|
||||||
|
|
||||||
"dfa": ["dfa@1.2.0", "", {}, "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q=="],
|
"dfa": ["dfa@1.2.0", "", {}, "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q=="],
|
||||||
|
|
||||||
"didyoumean": ["didyoumean@1.2.2", "", {}, "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="],
|
"didyoumean": ["didyoumean@1.2.2", "", {}, "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="],
|
||||||
@@ -1042,8 +1060,6 @@
|
|||||||
|
|
||||||
"fast-xml-parser": ["fast-xml-parser@4.5.1", "", { "dependencies": { "strnum": "^1.0.5" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-y655CeyUQ+jj7KBbYMc4FG01V8ZQqjN+gDYGJ50RtfsUB8iG9AmwmwoAgeKLJdmueKKMrH1RJ7yXHTSoczdv5w=="],
|
"fast-xml-parser": ["fast-xml-parser@4.5.1", "", { "dependencies": { "strnum": "^1.0.5" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-y655CeyUQ+jj7KBbYMc4FG01V8ZQqjN+gDYGJ50RtfsUB8iG9AmwmwoAgeKLJdmueKKMrH1RJ7yXHTSoczdv5w=="],
|
||||||
|
|
||||||
"fastparse": ["fastparse@1.1.2", "", {}, "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ=="],
|
|
||||||
|
|
||||||
"fastq": ["fastq@1.19.0", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA=="],
|
"fastq": ["fastq@1.19.0", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA=="],
|
||||||
|
|
||||||
"fd-slicer": ["fd-slicer@1.1.0", "", { "dependencies": { "pend": "~1.2.0" } }, "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g=="],
|
"fd-slicer": ["fd-slicer@1.1.0", "", { "dependencies": { "pend": "~1.2.0" } }, "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g=="],
|
||||||
@@ -1070,6 +1086,8 @@
|
|||||||
|
|
||||||
"flattie": ["flattie@1.1.1", "", {}, "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ=="],
|
"flattie": ["flattie@1.1.1", "", {}, "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ=="],
|
||||||
|
|
||||||
|
"follow-redirects": ["follow-redirects@1.15.9", "", {}, "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="],
|
||||||
|
|
||||||
"fontkit": ["fontkit@2.0.4", "", { "dependencies": { "@swc/helpers": "^0.5.12", "brotli": "^1.3.2", "clone": "^2.1.2", "dfa": "^1.2.0", "fast-deep-equal": "^3.1.3", "restructure": "^3.0.0", "tiny-inflate": "^1.0.3", "unicode-properties": "^1.4.0", "unicode-trie": "^2.0.0" } }, "sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g=="],
|
"fontkit": ["fontkit@2.0.4", "", { "dependencies": { "@swc/helpers": "^0.5.12", "brotli": "^1.3.2", "clone": "^2.1.2", "dfa": "^1.2.0", "fast-deep-equal": "^3.1.3", "restructure": "^3.0.0", "tiny-inflate": "^1.0.3", "unicode-properties": "^1.4.0", "unicode-trie": "^2.0.0" } }, "sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g=="],
|
||||||
|
|
||||||
"foreground-child": ["foreground-child@3.3.0", "", { "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" } }, "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg=="],
|
"foreground-child": ["foreground-child@3.3.0", "", { "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" } }, "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg=="],
|
||||||
@@ -1080,6 +1098,8 @@
|
|||||||
|
|
||||||
"form-render": ["form-render@2.5.2", "", { "dependencies": { "@ant-design/icons": "^4.0.2", "ahooks": "^3.7.5", "async-validator": "^3.5.1", "classnames": "^2.3.1", "color": "^3.1.2", "dayjs": "^1.11.7", "lodash-es": "^4.17.21", "rc-color-picker": "^1.2.6", "virtualizedtableforantd4": "^1.1.2", "zustand": "^4.1.5" }, "peerDependencies": { "antd": "4.x || 5.x", "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-pkDNK+n2CZt4Mz05Poq5+N9XpS9vmctTCPVHeadhypCbn7g+uTBYLWy7DWR02PyRVwP2YtKxSMj1wMn0SbnjNQ=="],
|
"form-render": ["form-render@2.5.2", "", { "dependencies": { "@ant-design/icons": "^4.0.2", "ahooks": "^3.7.5", "async-validator": "^3.5.1", "classnames": "^2.3.1", "color": "^3.1.2", "dayjs": "^1.11.7", "lodash-es": "^4.17.21", "rc-color-picker": "^1.2.6", "virtualizedtableforantd4": "^1.1.2", "zustand": "^4.1.5" }, "peerDependencies": { "antd": "4.x || 5.x", "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-pkDNK+n2CZt4Mz05Poq5+N9XpS9vmctTCPVHeadhypCbn7g+uTBYLWy7DWR02PyRVwP2YtKxSMj1wMn0SbnjNQ=="],
|
||||||
|
|
||||||
|
"formidable": ["formidable@3.5.2", "", { "dependencies": { "dezalgo": "^1.0.4", "hexoid": "^2.0.0", "once": "^1.4.0" } }, "sha512-Jqc1btCy3QzRbJaICGwKcBfGWuLADRerLzDqi2NwSt/UkXLsHJw2TVResiaoBufHVHy9aSgClOHCeJsSsFLTbg=="],
|
||||||
|
|
||||||
"forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="],
|
"forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="],
|
||||||
|
|
||||||
"fraction.js": ["fraction.js@4.3.7", "", {}, "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew=="],
|
"fraction.js": ["fraction.js@4.3.7", "", {}, "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew=="],
|
||||||
@@ -1114,7 +1134,7 @@
|
|||||||
|
|
||||||
"get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="],
|
"get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="],
|
||||||
|
|
||||||
"get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="],
|
"get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="],
|
||||||
|
|
||||||
"getopts": ["getopts@2.3.0", "", {}, "sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA=="],
|
"getopts": ["getopts@2.3.0", "", {}, "sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA=="],
|
||||||
|
|
||||||
@@ -1176,6 +1196,8 @@
|
|||||||
|
|
||||||
"hastscript": ["hastscript@9.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^6.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw=="],
|
"hastscript": ["hastscript@9.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^6.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw=="],
|
||||||
|
|
||||||
|
"hexoid": ["hexoid@2.0.0", "", {}, "sha512-qlspKUK7IlSQv2o+5I7yhUd7TxlOG2Vr5LTa3ve2XSNVKAL/n/u/7KLvKmFNimomDIKvZFXWHv0T12mv7rT8Aw=="],
|
||||||
|
|
||||||
"hotkeys-js": ["hotkeys-js@3.13.9", "", {}, "sha512-3TRCj9u9KUH6cKo25w4KIdBfdBfNRjfUwrljCLDC2XhmPDG0SjAZFcFZekpUZFmXzfYoGhFDcdx2gX/vUVtztQ=="],
|
"hotkeys-js": ["hotkeys-js@3.13.9", "", {}, "sha512-3TRCj9u9KUH6cKo25w4KIdBfdBfNRjfUwrljCLDC2XhmPDG0SjAZFcFZekpUZFmXzfYoGhFDcdx2gX/vUVtztQ=="],
|
||||||
|
|
||||||
"html-entities": ["html-entities@2.5.2", "", {}, "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA=="],
|
"html-entities": ["html-entities@2.5.2", "", {}, "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA=="],
|
||||||
@@ -1288,6 +1310,8 @@
|
|||||||
|
|
||||||
"js-interpolate": ["js-interpolate@1.3.2", "", { "peerDependencies": { "typescript": "^5.0.0" } }, "sha512-fIwAAEPJ1co7gUTZOozfONT130xVK3prHdghR57lbZvD+pLIEJ7vPlySSEMuhdu0iHqp45GcymWQ48vWAZ7haA=="],
|
"js-interpolate": ["js-interpolate@1.3.2", "", { "peerDependencies": { "typescript": "^5.0.0" } }, "sha512-fIwAAEPJ1co7gUTZOozfONT130xVK3prHdghR57lbZvD+pLIEJ7vPlySSEMuhdu0iHqp45GcymWQ48vWAZ7haA=="],
|
||||||
|
|
||||||
|
"js-md4": ["js-md4@0.3.2", "", {}, "sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA=="],
|
||||||
|
|
||||||
"js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],
|
"js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],
|
||||||
|
|
||||||
"js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="],
|
"js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="],
|
||||||
@@ -1530,6 +1554,8 @@
|
|||||||
|
|
||||||
"min-indent": ["min-indent@1.0.1", "", {}, "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg=="],
|
"min-indent": ["min-indent@1.0.1", "", {}, "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg=="],
|
||||||
|
|
||||||
|
"minimalistic-assert": ["minimalistic-assert@1.0.1", "", {}, "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="],
|
||||||
|
|
||||||
"minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="],
|
"minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="],
|
||||||
|
|
||||||
"minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="],
|
"minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="],
|
||||||
@@ -1924,6 +1950,8 @@
|
|||||||
|
|
||||||
"sass": ["sass@1.83.4", "", { "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", "source-map-js": ">=0.6.2 <2.0.0" }, "optionalDependencies": { "@parcel/watcher": "^2.4.1" }, "bin": { "sass": "sass.js" } }, "sha512-B1bozCeNQiOgDcLd33e2Cs2U60wZwjUUXzh900ZyQF5qUasvMdDZYbQ566LJu7cqR+sAHlAfO6RMkaID5s6qpA=="],
|
"sass": ["sass@1.83.4", "", { "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", "source-map-js": ">=0.6.2 <2.0.0" }, "optionalDependencies": { "@parcel/watcher": "^2.4.1" }, "bin": { "sass": "sass.js" } }, "sha512-B1bozCeNQiOgDcLd33e2Cs2U60wZwjUUXzh900ZyQF5qUasvMdDZYbQ566LJu7cqR+sAHlAfO6RMkaID5s6qpA=="],
|
||||||
|
|
||||||
|
"sax": ["sax@1.4.1", "", {}, "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg=="],
|
||||||
|
|
||||||
"scheduler": ["scheduler@0.19.1", "", { "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" } }, "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA=="],
|
"scheduler": ["scheduler@0.19.1", "", { "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" } }, "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA=="],
|
||||||
|
|
||||||
"screenfull": ["screenfull@5.2.0", "", {}, "sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA=="],
|
"screenfull": ["screenfull@5.2.0", "", {}, "sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA=="],
|
||||||
@@ -1964,6 +1992,8 @@
|
|||||||
|
|
||||||
"side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="],
|
"side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="],
|
||||||
|
|
||||||
|
"siema": ["siema@1.5.1", "", {}, "sha512-BUNFdTSbC9/2gA6r6teBY9B8O/XZOUz8kVyttpsbq4gbHF9PidUDzs6aPtiObhV4KoEuPQdhRvK5hPPi9lgSTg=="],
|
||||||
|
|
||||||
"signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="],
|
"signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="],
|
||||||
|
|
||||||
"simple-concat": ["simple-concat@1.0.1", "", {}, "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="],
|
"simple-concat": ["simple-concat@1.0.1", "", {}, "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="],
|
||||||
@@ -1978,6 +2008,8 @@
|
|||||||
|
|
||||||
"slice-ansi": ["slice-ansi@3.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" } }, "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ=="],
|
"slice-ansi": ["slice-ansi@3.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" } }, "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ=="],
|
||||||
|
|
||||||
|
"soap": ["soap@1.1.8", "", { "dependencies": { "axios": "^1.7.9", "axios-ntlm": "^1.4.2", "debug": "^4.4.0", "formidable": "^3.5.2", "get-stream": "^6.0.1", "lodash": "^4.17.21", "sax": "^1.4.1", "strip-bom": "^3.0.0", "whatwg-mimetype": "4.0.0", "xml-crypto": "^6.0.0" } }, "sha512-fDNGyGsPkQP3bZX/366Ud5Kpjo9mCMh7ZKYIc3uipBEPPM2ZqCNkv1Z2/w0qpzpYFLL7do8WWwVUAjAwuUe1AQ=="],
|
||||||
|
|
||||||
"sorcery": ["sorcery@0.11.1", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.14", "buffer-crc32": "^1.0.0", "minimist": "^1.2.0", "sander": "^0.5.0" }, "bin": { "sorcery": "bin/sorcery" } }, "sha512-o7npfeJE6wi6J9l0/5LKshFzZ2rMatRiCDwYeDQaOzqdzRJwALhX7mk/A/ecg6wjMu7wdZbmXfD2S/vpOg0bdQ=="],
|
"sorcery": ["sorcery@0.11.1", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.14", "buffer-crc32": "^1.0.0", "minimist": "^1.2.0", "sander": "^0.5.0" }, "bin": { "sorcery": "bin/sorcery" } }, "sha512-o7npfeJE6wi6J9l0/5LKshFzZ2rMatRiCDwYeDQaOzqdzRJwALhX7mk/A/ecg6wjMu7wdZbmXfD2S/vpOg0bdQ=="],
|
||||||
|
|
||||||
"source-map": ["source-map@0.7.4", "", {}, "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA=="],
|
"source-map": ["source-map@0.7.4", "", {}, "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA=="],
|
||||||
@@ -2190,6 +2222,8 @@
|
|||||||
|
|
||||||
"webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="],
|
"webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="],
|
||||||
|
|
||||||
|
"whatwg-mimetype": ["whatwg-mimetype@4.0.0", "", {}, "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg=="],
|
||||||
|
|
||||||
"whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="],
|
"whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="],
|
||||||
|
|
||||||
"which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
|
"which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
|
||||||
@@ -2210,6 +2244,10 @@
|
|||||||
|
|
||||||
"wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="],
|
"wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="],
|
||||||
|
|
||||||
|
"xml-crypto": ["xml-crypto@6.0.0", "", { "dependencies": { "@xmldom/is-dom-node": "^1.0.1", "@xmldom/xmldom": "^0.8.10", "xpath": "^0.0.33" } }, "sha512-L3RgnkaDrHaYcCnoENv4Idzt1ZRj5U1z1BDH98QdDTQfssScx8adgxhd9qwyYo+E3fXbQZjEQH7aiXHLVgxGvw=="],
|
||||||
|
|
||||||
|
"xpath": ["xpath@0.0.33", "", {}, "sha512-NNXnzrkDrAzalLhIUc01jO2mOzXGXh1JwPgkihcLLzw98c0WgYDmmjSh1Kl3wzaxSVWMuA+fe0WTWOBDWCBmNA=="],
|
||||||
|
|
||||||
"xxhash-wasm": ["xxhash-wasm@1.1.0", "", {}, "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA=="],
|
"xxhash-wasm": ["xxhash-wasm@1.1.0", "", {}, "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA=="],
|
||||||
|
|
||||||
"yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="],
|
"yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="],
|
||||||
@@ -2284,6 +2322,8 @@
|
|||||||
|
|
||||||
"anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
|
"anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
|
||||||
|
|
||||||
|
"axios/proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="],
|
||||||
|
|
||||||
"babel-runtime/regenerator-runtime": ["regenerator-runtime@0.11.1", "", {}, "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="],
|
"babel-runtime/regenerator-runtime": ["regenerator-runtime@0.11.1", "", {}, "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="],
|
||||||
|
|
||||||
"body-parser/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
|
"body-parser/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
|
||||||
@@ -2314,12 +2354,16 @@
|
|||||||
|
|
||||||
"eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@2.1.0", "", {}, "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw=="],
|
"eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@2.1.0", "", {}, "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw=="],
|
||||||
|
|
||||||
|
"execa/get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="],
|
||||||
|
|
||||||
"express/cookie": ["cookie@0.7.1", "", {}, "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w=="],
|
"express/cookie": ["cookie@0.7.1", "", {}, "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w=="],
|
||||||
|
|
||||||
"express/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
|
"express/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
|
||||||
|
|
||||||
"express/send": ["send@0.19.0", "", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "2.4.1", "range-parser": "~1.2.1", "statuses": "2.0.1" } }, "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw=="],
|
"express/send": ["send@0.19.0", "", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "2.4.1", "range-parser": "~1.2.1", "statuses": "2.0.1" } }, "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw=="],
|
||||||
|
|
||||||
|
"extract-zip/get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="],
|
||||||
|
|
||||||
"fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
|
"fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
|
||||||
|
|
||||||
"figures/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="],
|
"figures/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="],
|
||||||
@@ -2420,6 +2464,8 @@
|
|||||||
|
|
||||||
"sharp/color": ["color@4.2.3", "", { "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" } }, "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A=="],
|
"sharp/color": ["color@4.2.3", "", { "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" } }, "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A=="],
|
||||||
|
|
||||||
|
"soap/strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="],
|
||||||
|
|
||||||
"sorcery/buffer-crc32": ["buffer-crc32@1.0.0", "", {}, "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w=="],
|
"sorcery/buffer-crc32": ["buffer-crc32@1.0.0", "", {}, "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w=="],
|
||||||
|
|
||||||
"sucrase/commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="],
|
"sucrase/commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="],
|
||||||
|
|||||||
@@ -44,6 +44,7 @@
|
|||||||
"js-interpolate": "^1.3.2",
|
"js-interpolate": "^1.3.2",
|
||||||
"jsonwebtoken": "^9.0.2",
|
"jsonwebtoken": "^9.0.2",
|
||||||
"jwt-decode": "^4.0.0",
|
"jwt-decode": "^4.0.0",
|
||||||
|
"mime-types": "^2.1.35",
|
||||||
"moment": "^2.30.1",
|
"moment": "^2.30.1",
|
||||||
"moment-timezone": "^0.5.46",
|
"moment-timezone": "^0.5.46",
|
||||||
"nodemailer": "^6.10.0",
|
"nodemailer": "^6.10.0",
|
||||||
@@ -51,6 +52,8 @@
|
|||||||
"postcss-nested": "^7.0.2",
|
"postcss-nested": "^7.0.2",
|
||||||
"radix-svelte-icons": "^1.0.0",
|
"radix-svelte-icons": "^1.0.0",
|
||||||
"sass": "^1.83.4",
|
"sass": "^1.83.4",
|
||||||
|
"siema": "^1.5.1",
|
||||||
|
"soap": "^1.1.8",
|
||||||
"svelte": "^3.59.2",
|
"svelte": "^3.59.2",
|
||||||
"svelte-dialogs": "^1.2.2",
|
"svelte-dialogs": "^1.2.2",
|
||||||
"svelte-preprocess": "^5.1.4",
|
"svelte-preprocess": "^5.1.4",
|
||||||
@@ -70,7 +73,9 @@
|
|||||||
"@types/is-base64": "^1.1.3",
|
"@types/is-base64": "^1.1.3",
|
||||||
"@types/js-cookie": "^3.0.6",
|
"@types/js-cookie": "^3.0.6",
|
||||||
"@types/jsonwebtoken": "^9.0.7",
|
"@types/jsonwebtoken": "^9.0.7",
|
||||||
|
"@types/mime-types": "^2.1.4",
|
||||||
"@types/nodemailer": "^6.4.17",
|
"@types/nodemailer": "^6.4.17",
|
||||||
|
"@types/siema": "^1.4.11",
|
||||||
"@types/uuid": "^9.0.8",
|
"@types/uuid": "^9.0.8",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.62.0",
|
"@typescript-eslint/eslint-plugin": "^5.62.0",
|
||||||
"@typescript-eslint/parser": "^5.62.0",
|
"@typescript-eslint/parser": "^5.62.0",
|
||||||
@@ -79,7 +84,6 @@
|
|||||||
"cypress": "^13.17.0",
|
"cypress": "^13.17.0",
|
||||||
"cypress-file-upload": "^5.0.8",
|
"cypress-file-upload": "^5.0.8",
|
||||||
"cypress-vite": "^1.6.0",
|
"cypress-vite": "^1.6.0",
|
||||||
"daisyui": "^4.12.23",
|
|
||||||
"eslint": "~8.15.0",
|
"eslint": "~8.15.0",
|
||||||
"eslint-config-prettier": "8.1.0",
|
"eslint-config-prettier": "8.1.0",
|
||||||
"postcss": "^8.5.1",
|
"postcss": "^8.5.1",
|
||||||
|
|||||||
BIN
persistent/images/img-00114710-09d3-4a60-a7e1-44e651b1e4df.webp
Normal file
BIN
persistent/images/img-00114710-09d3-4a60-a7e1-44e651b1e4df.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 55 KiB |
BIN
persistent/images/img-bc4f9c3e-b74c-450b-9109-6de7d6023521.webp
Normal file
BIN
persistent/images/img-bc4f9c3e-b74c-450b-9109-6de7d6023521.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 64 KiB |
@@ -3,14 +3,21 @@ import { createCallerFactory } from "astro-typesafe-api/server";
|
|||||||
export const createCaller = createCallerFactory({
|
export const createCaller = createCallerFactory({
|
||||||
"klimafaktoren": await import("../src/pages/api/klimafaktoren.ts"),
|
"klimafaktoren": await import("../src/pages/api/klimafaktoren.ts"),
|
||||||
"postleitzahlen": await import("../src/pages/api/postleitzahlen.ts"),
|
"postleitzahlen": await import("../src/pages/api/postleitzahlen.ts"),
|
||||||
"aufnahme/[uid]": await import("../src/pages/api/aufnahme/[uid].ts"),
|
"admin/ausstellen": await import("../src/pages/api/admin/ausstellen.ts"),
|
||||||
|
"admin/bestellbestaetigung": await import("../src/pages/api/admin/bestellbestaetigung.ts"),
|
||||||
|
"admin/erinnern": await import("../src/pages/api/admin/erinnern.ts"),
|
||||||
|
"admin/nicht-ausstellen": await import("../src/pages/api/admin/nicht-ausstellen.ts"),
|
||||||
|
"admin/post-ausstellen": await import("../src/pages/api/admin/post-ausstellen.ts"),
|
||||||
|
"admin/registriernummer": await import("../src/pages/api/admin/registriernummer.ts"),
|
||||||
"aufnahme": await import("../src/pages/api/aufnahme/index.ts"),
|
"aufnahme": await import("../src/pages/api/aufnahme/index.ts"),
|
||||||
"auth/access-token": await import("../src/pages/api/auth/access-token.ts"),
|
"auth/access-token": await import("../src/pages/api/auth/access-token.ts"),
|
||||||
"auth/forgot-password": await import("../src/pages/api/auth/forgot-password.ts"),
|
"auth/forgot-password": await import("../src/pages/api/auth/forgot-password.ts"),
|
||||||
"auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"),
|
"auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"),
|
||||||
"bilder/[uid]": await import("../src/pages/api/bilder/[uid].ts"),
|
|
||||||
"bedarfsausweis-wohnen/[uid]": await import("../src/pages/api/bedarfsausweis-wohnen/[uid].ts"),
|
"bedarfsausweis-wohnen/[uid]": await import("../src/pages/api/bedarfsausweis-wohnen/[uid].ts"),
|
||||||
"bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"),
|
"bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"),
|
||||||
|
"bilder/[uid]": await import("../src/pages/api/bilder/[uid].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"),
|
"objekt": await import("../src/pages/api/objekt/index.ts"),
|
||||||
"rechnung": await import("../src/pages/api/rechnung/index.ts"),
|
"rechnung": await import("../src/pages/api/rechnung/index.ts"),
|
||||||
"ticket": await import("../src/pages/api/ticket/index.ts"),
|
"ticket": await import("../src/pages/api/ticket/index.ts"),
|
||||||
@@ -21,6 +28,8 @@ export const createCaller = createCallerFactory({
|
|||||||
"verbrauchsausweis-wohnen/[uid]": await import("../src/pages/api/verbrauchsausweis-wohnen/[uid].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-wohnen": await import("../src/pages/api/verbrauchsausweis-wohnen/index.ts"),
|
||||||
"webhooks/mollie": await import("../src/pages/api/webhooks/mollie.ts"),
|
"webhooks/mollie": await import("../src/pages/api/webhooks/mollie.ts"),
|
||||||
"objekt/[uid]/bilder": await import("../src/pages/api/objekt/[uid]/bilder.ts"),
|
"aufnahme/[uid]/bilder": await import("../src/pages/api/aufnahme/[uid]/bilder.ts"),
|
||||||
|
"aufnahme/[uid]": await import("../src/pages/api/aufnahme/[uid]/index.ts"),
|
||||||
"objekt/[uid]": await import("../src/pages/api/objekt/[uid]/index.ts"),
|
"objekt/[uid]": await import("../src/pages/api/objekt/[uid]/index.ts"),
|
||||||
|
"objekt/[uid]/unterlagen": await import("../src/pages/api/objekt/[uid]/unterlagen.ts"),
|
||||||
})
|
})
|
||||||
@@ -104,12 +104,12 @@ export async function ausweisSpeichern(
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
const response = await api.objekt._uid.bilder.PUT.fetch({
|
const response = await api.aufnahme._uid.bilder.PUT.fetch({
|
||||||
base64: bild.base64,
|
base64: bild.base64,
|
||||||
kategorie: bild.kategorie
|
kategorie: bild.kategorie
|
||||||
}, {
|
}, {
|
||||||
params: {
|
params: {
|
||||||
uid: objekt.uid
|
uid: aufnahme.uid
|
||||||
},
|
},
|
||||||
headers: {
|
headers: {
|
||||||
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
|
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import Cookies from "js-cookie";
|
|||||||
|
|
||||||
export async function bilderHochladen(
|
export async function bilderHochladen(
|
||||||
images: (UploadedGebaeudeBild & { base64?: string, update?: boolean })[],
|
images: (UploadedGebaeudeBild & { base64?: string, update?: boolean })[],
|
||||||
gebaeude_uid: string
|
aufnahme_uid: string
|
||||||
) {
|
) {
|
||||||
if (images.length == 0) {
|
if (images.length == 0) {
|
||||||
return images;
|
return images;
|
||||||
@@ -57,12 +57,12 @@ export async function bilderHochladen(
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
const response = await api.objekt._uid.bilder.PUT.fetch({
|
const response = await api.aufnahme._uid.bilder.PUT.fetch({
|
||||||
base64: image.base64,
|
base64: image.base64,
|
||||||
kategorie: image.kategorie as Enums.BilderKategorie
|
kategorie: image.kategorie as Enums.BilderKategorie
|
||||||
}, {
|
}, {
|
||||||
params: {
|
params: {
|
||||||
uid: gebaeude_uid
|
uid: aufnahme_uid
|
||||||
},
|
},
|
||||||
headers: {
|
headers: {
|
||||||
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
|
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
|
||||||
|
|||||||
@@ -2,31 +2,13 @@
|
|||||||
import { Buffer } from "buffer";
|
import { Buffer } from "buffer";
|
||||||
import { AufnahmeClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "./Ausweis/types.js";
|
import { AufnahmeClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "./Ausweis/types.js";
|
||||||
import { Enums } from "@ibcornelsen/database/client";
|
import { Enums } from "@ibcornelsen/database/client";
|
||||||
|
import { openWindowWithPost } from "#lib/helpers/window.js";
|
||||||
|
|
||||||
export let ausweis: VerbrauchsausweisWohnenClient;
|
export let ausweis: VerbrauchsausweisWohnenClient;
|
||||||
export let objekt: ObjektClient;
|
export let objekt: ObjektClient;
|
||||||
export let aufnahme: AufnahmeClient;
|
export let aufnahme: AufnahmeClient;
|
||||||
export let bilder: UploadedGebaeudeBild[];
|
export let bilder: UploadedGebaeudeBild[];
|
||||||
export let ausweisart: Enums.Ausweisart
|
export let ausweisart: Enums.Ausweisart
|
||||||
|
|
||||||
function openWindowWithPost(url: string, data: Record<string, any>) {
|
|
||||||
var form = document.createElement("form");
|
|
||||||
form.target = "_blank";
|
|
||||||
form.method = "POST";
|
|
||||||
form.action = url;
|
|
||||||
form.style.display = "none";
|
|
||||||
|
|
||||||
for (var key in data) {
|
|
||||||
var input = document.createElement("input");
|
|
||||||
input.type = "hidden";
|
|
||||||
input.name = key;
|
|
||||||
input.value = data[key];
|
|
||||||
form.appendChild(input);
|
|
||||||
}
|
|
||||||
document.body.appendChild(form);
|
|
||||||
form.submit();
|
|
||||||
document.body.removeChild(form);
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<button class="border-2 rounded-lg bg-white text-center hover:shadow-md no-underline p-3 cursor-pointer" on:click={() => {
|
<button class="border-2 rounded-lg bg-white text-center hover:shadow-md no-underline p-3 cursor-pointer" on:click={() => {
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
|
|||||||
>
|
>
|
||||||
<option disabled selected>Bitte auswählen</option>
|
<option disabled selected>Bitte auswählen</option>
|
||||||
|
|
||||||
{#if ausweisart=="VerbrauchsausweisWohnen"}
|
{#if ausweisart==Enums.Ausweisart.VerbrauchsausweisWohnen || ausweisart === Enums.Ausweisart.GEGNachweisVerbrauchsausweisWohnen}
|
||||||
<option value="Einfamilienhaus">Einfamilienhaus</option>
|
<option value="Einfamilienhaus">Einfamilienhaus</option>
|
||||||
<option value="Freistehendes Einfamilienhaus">Freistehendes Einfamilienhaus</option>
|
<option value="Freistehendes Einfamilienhaus">Freistehendes Einfamilienhaus</option>
|
||||||
<option value="Freistehendes Zweifamilienhaus">Freistehendes Zweifamilienhaus</option>
|
<option value="Freistehendes Zweifamilienhaus">Freistehendes Zweifamilienhaus</option>
|
||||||
@@ -84,7 +84,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
|
|||||||
<option value="Atrium-Bungalow">Atrium-Bungalow</option>
|
<option value="Atrium-Bungalow">Atrium-Bungalow</option>
|
||||||
<option value="Winkelbungalow">Winkelbungalow</option>
|
<option value="Winkelbungalow">Winkelbungalow</option>
|
||||||
|
|
||||||
{:else if ausweisart=="VerbrauchsausweisGewerbe"}
|
{:else if ausweisart==Enums.Ausweisart.VerbrauchsausweisGewerbe}
|
||||||
<option value="Verwaltungsgebäude (allgemein)">Verwaltungsgebäude (allgemein)</option>
|
<option value="Verwaltungsgebäude (allgemein)">Verwaltungsgebäude (allgemein)</option>
|
||||||
<option value="Parlaments- und Gerichtsgebäude">Parlaments- und Gerichtsgebäude</option>
|
<option value="Parlaments- und Gerichtsgebäude">Parlaments- und Gerichtsgebäude</option>
|
||||||
<option value="Ministerien u. Ämter u. Behörden">Ministerien u. Ämter u. Behörden</option>
|
<option value="Ministerien u. Ämter u. Behörden">Ministerien u. Ämter u. Behörden</option>
|
||||||
@@ -200,7 +200,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
|
|||||||
className={auditHeizungGebaeudeBaujahr(aufnahme)
|
className={auditHeizungGebaeudeBaujahr(aufnahme)
|
||||||
? "linked"
|
? "linked"
|
||||||
: ""}
|
: ""}
|
||||||
bind:tags={aufnahme.baujahr_heizung}
|
bind:tags={aufnahme.baujahr_klima}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<div class="help-label">
|
<div class="help-label">
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
export let ausweisart: Enums.Ausweisart
|
export let ausweisart: Enums.Ausweisart
|
||||||
|
|
||||||
async function ausweisAbschicken() {
|
async function ausweisAbschicken() {
|
||||||
|
loginAction = ausweisAbschicken
|
||||||
if (!await validateAccessTokenClient()) {
|
if (!await validateAccessTokenClient()) {
|
||||||
loginOverlayHidden = false;
|
loginOverlayHidden = false;
|
||||||
return
|
return
|
||||||
@@ -35,7 +36,10 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let loginAction: () => any = ausweisAbschicken;
|
||||||
|
|
||||||
async function spaeterWeitermachen() {
|
async function spaeterWeitermachen() {
|
||||||
|
loginAction = spaeterWeitermachen;
|
||||||
if (!await validateAccessTokenClient()) {
|
if (!await validateAccessTokenClient()) {
|
||||||
loginOverlayHidden = false;
|
loginOverlayHidden = false;
|
||||||
return
|
return
|
||||||
@@ -51,6 +55,8 @@
|
|||||||
"",
|
"",
|
||||||
`${location.pathname}?uid=${ausweis.uid}`
|
`${location.pathname}?uid=${ausweis.uid}`
|
||||||
);
|
);
|
||||||
|
|
||||||
|
window.location.href = `/speichern-erfolgreich?uid=${ausweis.uid}`
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,7 +77,7 @@ sm:grid-cols-[1fr_min-content_min-content_min-content] sm:justify-self-end sm:mt
|
|||||||
<div>
|
<div>
|
||||||
<Overlay bind:hidden={loginOverlayHidden}>
|
<Overlay bind:hidden={loginOverlayHidden}>
|
||||||
<div class="bg-white w-full max-w-screen-sm py-8">
|
<div class="bg-white w-full max-w-screen-sm py-8">
|
||||||
<EmbeddedAuthFlowModule onLogin={ausweisAbschicken}></EmbeddedAuthFlowModule>
|
<EmbeddedAuthFlowModule onLogin={loginAction}></EmbeddedAuthFlowModule>
|
||||||
</div>
|
</div>
|
||||||
</Overlay>
|
</Overlay>
|
||||||
|
|
||||||
|
|||||||
@@ -1,46 +1,53 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
export let progress: number = 0;
|
export let steps: string[] = [
|
||||||
export let step1: string = '';
|
"Gebäudedaten",
|
||||||
export let step2: string = '';
|
"Kundendaten",
|
||||||
export let step3: string = '';
|
"Kaufbestätigung",
|
||||||
|
];
|
||||||
|
export let active: number;
|
||||||
|
export let progress: number = active / (steps.length - 1) * 100;
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<div class="grid grid-cols-3 self-start justify-between">
|
||||||
|
|
||||||
<div class="grid grid-cols-3 self-start">
|
|
||||||
|
|
||||||
<div class="col-span-3 relative">
|
<div class="col-span-3 relative">
|
||||||
|
<div
|
||||||
<div class="w-[calc(100%-5rem)] ml-[2.5rem] absolute mt-[0.5rem] bg-gray-200 h-3 rounded-lg">
|
class="w-[calc(100%-5rem)] ml-[2.5rem] absolute mt-[0.5rem] bg-gray-200 h-3 rounded-lg"
|
||||||
<div class="bg-green-600 left-0 h-3 absolute" style={`width: ${progress}%;`}></div>
|
>
|
||||||
|
<div
|
||||||
|
class="bg-green-600 left-0 h-3 absolute"
|
||||||
|
style={`width: ${progress}%;`}
|
||||||
|
></div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="phase justify-self-start">
|
|
||||||
<div class="{step1} point">1</div>
|
|
||||||
<div class="titel">Gebäudedaten</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="phase">
|
|
||||||
<div class="{step2} point">2</div>
|
|
||||||
<div class="titel">Kundendaten</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="phase justify-self-end">
|
|
||||||
<div class="{step3} point">3</div>
|
|
||||||
<div class="titel">Kaufbestätigung</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
{#each steps as step, i}
|
||||||
|
<div class="phase">
|
||||||
|
<div class="point" class:active={i === active}>{i + 1}</div>
|
||||||
|
<div>{step}</div>
|
||||||
|
</div>
|
||||||
|
{/each}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
<style lang="postcss">
|
.phase {
|
||||||
.phase{@apply grid grid-cols-1 items-center justify-items-center z-10;
|
@apply grid grid-cols-1 items-center justify-items-center z-10;
|
||||||
.point{@apply rounded-full w-8 h-8 text-white font-bold bg-gray-300 text-center pt-1 ring-white ring-4;}
|
.point {
|
||||||
.step{@apply bg-secondary}
|
@apply rounded-full w-8 h-8 text-white font-bold bg-gray-300 text-center pt-1 ring-white ring-4;
|
||||||
}
|
}
|
||||||
.titel{@apply [font-size:_clamp(12px,1vw,1.5rem)]}
|
.active {
|
||||||
|
@apply bg-secondary;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:nth-child(1 of .phase) {
|
||||||
|
@apply justify-self-start;
|
||||||
|
}
|
||||||
|
|
||||||
|
.phase:last-of-type {
|
||||||
|
@apply justify-self-end;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
</style>
|
|
||||||
@@ -170,7 +170,7 @@ xl:grid-cols-3 xl:gap-x-8 xl:gap-y-8
|
|||||||
{#each Array.from(availableDates.reduce((a, c) => {
|
{#each Array.from(availableDates.reduce((a, c) => {
|
||||||
a.add(c.month);
|
a.add(c.month);
|
||||||
return a;
|
return a;
|
||||||
}, new Set())) as availableMonth}
|
}, new Set())) as availableMonth}
|
||||||
<option
|
<option
|
||||||
value={availableMonth}
|
value={availableMonth}
|
||||||
selected={month === availableMonth}
|
selected={month === availableMonth}
|
||||||
|
|||||||
@@ -4,18 +4,20 @@ import {
|
|||||||
BedarfsausweisWohnen,
|
BedarfsausweisWohnen,
|
||||||
Benutzer,
|
Benutzer,
|
||||||
Enums,
|
Enums,
|
||||||
GebaeudeBilder,
|
Bild,
|
||||||
Objekt,
|
Objekt,
|
||||||
Rechnung,
|
Rechnung,
|
||||||
Tickets,
|
Tickets,
|
||||||
|
Unterlage,
|
||||||
VerbrauchsausweisGewerbe,
|
VerbrauchsausweisGewerbe,
|
||||||
VerbrauchsausweisWohnen,
|
VerbrauchsausweisWohnen,
|
||||||
|
GEGNachweisWohnen,
|
||||||
} from "@ibcornelsen/database/client";
|
} from "@ibcornelsen/database/client";
|
||||||
import { z, ZodSchema } from "zod";
|
import { z, ZodSchema } from "zod";
|
||||||
|
|
||||||
export type OmitKeys<T, K extends keyof T> = Omit<T, K>;
|
export type OmitKeys<T, K extends keyof T> = Omit<T, K>;
|
||||||
|
|
||||||
export type UploadedGebaeudeBild = OmitKeys<GebaeudeBilder, "id" | "objekt_id"> & {
|
export type UploadedGebaeudeBild = OmitKeys<Bild, "id" | "objekt_id"> & {
|
||||||
base64: string
|
base64: string
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,7 +146,30 @@ export function getAusweisartFromUUID(uid: string): Enums.Ausweisart | null {
|
|||||||
return Enums.Ausweisart.BedarfsausweisWohnen
|
return Enums.Ausweisart.BedarfsausweisWohnen
|
||||||
} else if (uid.startsWith("bag")) {
|
} else if (uid.startsWith("bag")) {
|
||||||
return Enums.Ausweisart.BedarfsausweisGewerbe
|
return Enums.Ausweisart.BedarfsausweisGewerbe
|
||||||
|
} else if (uid.startsWith("gnw")) {
|
||||||
|
return Enums.Ausweisart.GEGNachweisWohnen
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export type UnterlageClient = Omit<Unterlage, "id" | "objekt_id">
|
||||||
|
export type BildClient = Omit<Bild, "id" | "objekt_id">
|
||||||
|
|
||||||
|
export type ObjektKomplettClient = ObjektClient & {
|
||||||
|
bilder: BildClient[],
|
||||||
|
unterlagen: UnterlageClient[],
|
||||||
|
aufnahmen: (AufnahmeClient & {
|
||||||
|
bedarfsausweis_wohnen?: BedarfsausweisWohnenClient,
|
||||||
|
verbrauchsausweis_wohnen?: VerbrauchsausweisWohnenClient,
|
||||||
|
verbrauchsausweis_gewerbe?: VerbrauchsausweisGewerbeClient
|
||||||
|
})[]
|
||||||
|
}
|
||||||
|
|
||||||
|
export type AufnahmeKomplettClient = AufnahmeClient & {
|
||||||
|
bedarfsausweis_wohnen: BedarfsausweisWohnenClient[],
|
||||||
|
verbrauchsausweis_wohnen: VerbrauchsausweisWohnenClient[],
|
||||||
|
verbrauchsausweis_gewerbe: VerbrauchsausweisGewerbeClient[]
|
||||||
|
}
|
||||||
|
|
||||||
|
export type GEGNachweisWohnenClient = Omit<GEGNachweisWohnen, "id" | "aufnahme_id" | "benutzer_id">
|
||||||
@@ -13,7 +13,11 @@
|
|||||||
import { CheckCircled, CrossCircled, Image } from "radix-svelte-icons";
|
import { CheckCircled, CrossCircled, Image } from "radix-svelte-icons";
|
||||||
import ChevronDown from "radix-svelte-icons/src/lib/icons/ChevronDown.svelte";
|
import ChevronDown from "radix-svelte-icons/src/lib/icons/ChevronDown.svelte";
|
||||||
import { Event } from "@ibcornelsen/database/client";
|
import { Event } from "@ibcornelsen/database/client";
|
||||||
|
import { api } from "astro-typesafe-api/client";
|
||||||
|
import Cookies from "js-cookie";
|
||||||
|
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
|
||||||
|
import NotificationWrapper from "./Notifications/NotificationWrapper.svelte";
|
||||||
|
|
||||||
|
|
||||||
export let ausweis: VerbrauchsausweisWohnenClient;
|
export let ausweis: VerbrauchsausweisWohnenClient;
|
||||||
export let aufnahme: AufnahmeClient;
|
export let aufnahme: AufnahmeClient;
|
||||||
@@ -24,6 +28,25 @@
|
|||||||
ReturnType<typeof endEnergieVerbrauchVerbrauchsausweis_2016>
|
ReturnType<typeof endEnergieVerbrauchVerbrauchsausweis_2016>
|
||||||
>;
|
>;
|
||||||
|
|
||||||
|
async function ausweisAusstellen(uid: string) {
|
||||||
|
try {
|
||||||
|
await api.admin.ausstellen.GET.fetch({
|
||||||
|
uid
|
||||||
|
}, {
|
||||||
|
headers: {
|
||||||
|
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} catch(e) {
|
||||||
|
addNotification({
|
||||||
|
title: "Das hat nicht geklappt.",
|
||||||
|
description: e.cause.statusText,
|
||||||
|
timeout: 3000,
|
||||||
|
type: "error",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const ausweisArt = getAusweisartFromUUID(ausweis.uid) // TODO: Das ist ein Platzhalter, hier muss die Ausweisart aus dem Ausweisobjekt kommen
|
const ausweisArt = getAusweisartFromUUID(ausweis.uid) // TODO: Das ist ein Platzhalter, hier muss die Ausweisart aus dem Ausweisobjekt kommen
|
||||||
@@ -447,20 +470,31 @@
|
|||||||
|
|
||||||
let bilderModal: HTMLDialogElement;
|
let bilderModal: HTMLDialogElement;
|
||||||
let infoVisible = false;
|
let infoVisible = false;
|
||||||
|
|
||||||
|
|
||||||
|
async function registriernummerAnfordern(uid: string) {
|
||||||
|
const result = await api.admin.registriernummer.GET.fetch({
|
||||||
|
uid
|
||||||
|
}, {
|
||||||
|
headers: {
|
||||||
|
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="border rounded-box">
|
<div class="border rounded-lg bg-base-200">
|
||||||
<table class="table table-row">
|
<table class="">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td><button on:click={() => infoVisible = !infoVisible}><ChevronDown size={22} class="transition-all {infoVisible ? "" : "rotate-180"}"></ChevronDown></button></td>
|
<td><button on:click={() => infoVisible = !infoVisible}><ChevronDown size={22} class="transition-all {infoVisible ? "" : "rotate-180"}"></ChevronDown></button></td>
|
||||||
<td class="w-6 px-2"
|
<td class="w-6 px-2"
|
||||||
>
|
>
|
||||||
{#if aufnahme.erledigt}
|
{#if ausweis.ausgestellt}
|
||||||
<div class="tooltip" data-tip="Ausweis wurde ausgestellt">
|
<div class="tooltip" data-tip="Ausweis wurde ausgestellt">
|
||||||
<div class="rounded-full w-6 h-6 bg-success"></div>
|
<div class="rounded-full w-6 h-6 bg-success"></div>
|
||||||
</div>
|
</div>
|
||||||
{:else if aufnahme.bestellt}
|
{:else if ausweis.bestellt}
|
||||||
<div class="tooltip" data-tip="Ausweis wurde bestellt">
|
<div class="tooltip" data-tip="Ausweis wurde bestellt">
|
||||||
<div class="rounded-full w-6 h-6 bg-warning"></div>
|
<div class="rounded-full w-6 h-6 bg-warning"></div>
|
||||||
</div>
|
</div>
|
||||||
@@ -676,12 +710,12 @@
|
|||||||
<td title="Gebäudebilder anzeigen"
|
<td title="Gebäudebilder anzeigen"
|
||||||
><!-- Open the modal using ID.showModal() method -->
|
><!-- Open the modal using ID.showModal() method -->
|
||||||
<button class="btn btn-square" on:click={() => bilderModal.showModal()}><Image size={22}></Image></button>
|
<button class="btn btn-square" on:click={() => bilderModal.showModal()}><Image size={22}></Image></button>
|
||||||
<dialog bind:this={bilderModal} class="modal">
|
<dialog bind:this={bilderModal} class="modal p-4 rounded-lg">
|
||||||
<div class="modal-box flex flex-row gap-4 items-center justify-center">
|
<div class="modal-box flex flex-row gap-4 items-center justify-center">
|
||||||
{#if bilder.length === 0}
|
{#if bilder.length === 0}
|
||||||
<div class="flex flex-col gap-4 items-center justify-center">
|
<div class="flex flex-col gap-4 items-center justify-center">
|
||||||
<p>Für diesen Ausweis sind noch keine Bilder vorhanden.</p>
|
<p>Für diesen Ausweis sind noch keine Bilder vorhanden.</p>
|
||||||
<button class="btn btn-primary" tabindex="0">Erinnerung Verschicken</button>
|
<button class="button" tabindex="0">Erinnerung Verschicken</button>
|
||||||
</div>
|
</div>
|
||||||
{:else}
|
{:else}
|
||||||
{#each bilder as image}
|
{#each bilder as image}
|
||||||
@@ -693,7 +727,7 @@
|
|||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
<form method="dialog" class="modal-backdrop">
|
<form method="dialog" class="modal-backdrop">
|
||||||
<button>close</button>
|
<button class="button">Close</button>
|
||||||
</form>
|
</form>
|
||||||
</dialog></td
|
</dialog></td
|
||||||
>
|
>
|
||||||
@@ -794,9 +828,9 @@
|
|||||||
xmlAbschicken(aufnahme.uid)
|
xmlAbschicken(aufnahme.uid)
|
||||||
}}>X</button></td>
|
}}>X</button></td>
|
||||||
{/if}
|
{/if}
|
||||||
{#if !aufnahme.registriernummer}
|
{#if !ausweis.registriernummer}
|
||||||
<td title="Registriernummer vom DiBT anfordern." class="w-4 p-1"><button class="btn btn-xs btn-ghost" on:click={() => {
|
<td title="Registriernummer vom DiBT anfordern." class="w-4 p-1"><button class="btn btn-xs btn-ghost" on:click={() => {
|
||||||
registriernummerAnfordern(aufnahme.uid)
|
registriernummerAnfordern(ausweis.uid)
|
||||||
}}>R</button></td>
|
}}>R</button></td>
|
||||||
{/if}
|
{/if}
|
||||||
</tr>
|
</tr>
|
||||||
@@ -874,3 +908,5 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<NotificationWrapper></NotificationWrapper>
|
||||||
@@ -2,11 +2,12 @@
|
|||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="dropdown dropdown-hover dropdown-bottom">
|
<div class="relative group border-r px-2">
|
||||||
<div role="button" tabindex="0">
|
<div>
|
||||||
<slot></slot>
|
<slot></slot>
|
||||||
</div>
|
</div>
|
||||||
<div class="dropdown-content bg-gray-700 text-white z-10 menu w-max shadow rounded-lg">
|
|
||||||
<slot name="tooltip"></slot>
|
<div class="absolute right-[50%] translate-x-[50%] z-10 mt-2 p-2 w-max origin-top-right rounded-md bg-gray-700 text-white ring-1 shadow-lg ring-black/5 focus:outline-hidden bg-grey-200 hidden group-hover:block">
|
||||||
</div>
|
<slot name="tooltip"></slot>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
174
src/components/Carousel.svelte
Normal file
174
src/components/Carousel.svelte
Normal file
@@ -0,0 +1,174 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import Siema from 'siema'
|
||||||
|
import { onMount, createEventDispatcher } from 'svelte'
|
||||||
|
|
||||||
|
export let perPage = 3
|
||||||
|
export let loop = true
|
||||||
|
export let autoplay = 0
|
||||||
|
export let duration = 200
|
||||||
|
export let easing = 'ease-out'
|
||||||
|
export let startIndex = 0
|
||||||
|
export let draggable = true
|
||||||
|
export let multipleDrag = true
|
||||||
|
export let dots = true
|
||||||
|
export let controls = true
|
||||||
|
export let threshold = 20
|
||||||
|
export let rtl = false
|
||||||
|
let currentIndex = startIndex;
|
||||||
|
|
||||||
|
let siema: Siema
|
||||||
|
let controller: Siema
|
||||||
|
let timer: Timer
|
||||||
|
const dispatch = createEventDispatcher()
|
||||||
|
|
||||||
|
$: pips = controller ? controller.innerElements : []
|
||||||
|
$: currentPerPage = controller ? controller.perPage : perPage
|
||||||
|
$: totalDots = controller ? Math.ceil(controller.innerElements.length / currentPerPage) : []
|
||||||
|
|
||||||
|
onMount(() => {
|
||||||
|
controller = new Siema({
|
||||||
|
selector: siema,
|
||||||
|
perPage: typeof perPage === 'object' ? perPage : Number(perPage),
|
||||||
|
loop,
|
||||||
|
duration,
|
||||||
|
easing,
|
||||||
|
startIndex,
|
||||||
|
draggable,
|
||||||
|
multipleDrag,
|
||||||
|
threshold,
|
||||||
|
rtl,
|
||||||
|
onChange: handleChange
|
||||||
|
})
|
||||||
|
|
||||||
|
if(autoplay) {
|
||||||
|
timer = setInterval(right, autoplay);
|
||||||
|
}
|
||||||
|
return () => {
|
||||||
|
autoplay && clearInterval(timer)
|
||||||
|
controller.destroy()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
export function isDotActive (currentIndex: number, dotIndex: number) {
|
||||||
|
if (currentIndex < 0) currentIndex = pips.length + currentIndex;
|
||||||
|
return currentIndex >= dotIndex*currentPerPage && currentIndex < (dotIndex*currentPerPage)+currentPerPage
|
||||||
|
}
|
||||||
|
|
||||||
|
export function left () {
|
||||||
|
controller.prev()
|
||||||
|
}
|
||||||
|
|
||||||
|
export function right () {
|
||||||
|
controller.next()
|
||||||
|
}
|
||||||
|
|
||||||
|
export function go (index: number) {
|
||||||
|
controller.goTo(index)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function pause() {
|
||||||
|
clearInterval(timer);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function resume() {
|
||||||
|
if (autoplay) {
|
||||||
|
timer = setInterval(right, autoplay);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleChange (event: Event) {
|
||||||
|
currentIndex = controller.currentSlide
|
||||||
|
dispatch('change', {
|
||||||
|
currentSlide: controller.currentSlide,
|
||||||
|
slideCount: controller.innerElements.length
|
||||||
|
} )
|
||||||
|
}
|
||||||
|
|
||||||
|
function resetInterval(node, condition) {
|
||||||
|
function handleReset(event) {
|
||||||
|
pause();
|
||||||
|
resume();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(condition) {
|
||||||
|
node.addEventListener('click', handleReset);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
destroy() {
|
||||||
|
node.removeEventListener('click', handleReset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class="carousel">
|
||||||
|
<div class="slides" bind:this={siema}>
|
||||||
|
<slot></slot>
|
||||||
|
</div>
|
||||||
|
{#if controls}
|
||||||
|
<button class="left" on:click={left} use:resetInterval={autoplay} aria-label="left">
|
||||||
|
<slot name="left-control"></slot>
|
||||||
|
</button>
|
||||||
|
<button class="right" on:click={right} use:resetInterval={autoplay} aria-label="right">
|
||||||
|
<slot name="right-control"></slot>
|
||||||
|
</button>
|
||||||
|
{/if}
|
||||||
|
{#if dots}
|
||||||
|
<ul>
|
||||||
|
{#each {length: totalDots} as _, i}
|
||||||
|
<li on:click={() => go(i*currentPerPage)} class={isDotActive(currentIndex, i) ? "active" : ""}></li>
|
||||||
|
{/each}
|
||||||
|
</ul>
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.carousel {
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
z-index: 50;
|
||||||
|
margin-top: -20px;
|
||||||
|
}
|
||||||
|
button:focus {
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.left {
|
||||||
|
left: 2vw;
|
||||||
|
}
|
||||||
|
|
||||||
|
.right {
|
||||||
|
right: 2vw;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
list-style-type: none;
|
||||||
|
position: absolute;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
width: 100%;
|
||||||
|
margin-top: -30px;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
ul li {
|
||||||
|
margin: 6px;
|
||||||
|
border-radius: 100%;
|
||||||
|
background-color: rgba(255,255,255,0.5);
|
||||||
|
height: 8px;
|
||||||
|
width: 8px;
|
||||||
|
}
|
||||||
|
ul li:hover {
|
||||||
|
background-color: rgba(255,255,255,0.85);
|
||||||
|
}
|
||||||
|
ul li.active {
|
||||||
|
background-color: rgba(255,255,255,1);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -1,10 +1,5 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import {
|
import { AufnahmeKomplettClient, getAusweisartFromUUID, ObjektKomplettClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
|
||||||
AufnahmeClient,
|
|
||||||
ObjektClient,
|
|
||||||
UploadedGebaeudeBild,
|
|
||||||
VerbrauchsausweisWohnenClient,
|
|
||||||
} from "#components/Ausweis/types.js";
|
|
||||||
import moment from "moment";
|
import moment from "moment";
|
||||||
import { dialogs } from "svelte-dialogs";
|
import { dialogs } from "svelte-dialogs";
|
||||||
import {
|
import {
|
||||||
@@ -18,13 +13,15 @@
|
|||||||
import { api } from "astro-typesafe-api/client";
|
import { api } from "astro-typesafe-api/client";
|
||||||
import Cookies from "js-cookie";
|
import Cookies from "js-cookie";
|
||||||
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
|
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
|
||||||
|
import { Enums } from "@ibcornelsen/database/client";
|
||||||
|
|
||||||
export let ausweis: VerbrauchsausweisWohnenClient;
|
export let ausweis: VerbrauchsausweisWohnenClient;
|
||||||
export let aufnahme: AufnahmeClient;
|
export let aufnahme: AufnahmeKomplettClient;
|
||||||
export let bilder: UploadedGebaeudeBild[];
|
export let objekt: ObjektKomplettClient;
|
||||||
export let objekt: ObjektClient;
|
|
||||||
export let progress: number;
|
export let progress: number;
|
||||||
|
|
||||||
|
const ausweisart = getAusweisartFromUUID(ausweis.uid);
|
||||||
|
|
||||||
async function ausweisStornieren() {
|
async function ausweisStornieren() {
|
||||||
const result = await dialogs.confirm({
|
const result = await dialogs.confirm({
|
||||||
title: "Ausweis Stornieren",
|
title: "Ausweis Stornieren",
|
||||||
@@ -43,14 +40,14 @@
|
|||||||
if (result === true) {
|
if (result === true) {
|
||||||
await api["verbrauchsausweis-wohnen"]._uid.DELETE.fetch(undefined, {
|
await api["verbrauchsausweis-wohnen"]._uid.DELETE.fetch(undefined, {
|
||||||
params: {
|
params: {
|
||||||
uid: ausweis.uid
|
uid: ausweis.uid,
|
||||||
},
|
},
|
||||||
headers: {
|
headers: {
|
||||||
Authorization: `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
|
Authorization: `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`,
|
||||||
}
|
},
|
||||||
})
|
});
|
||||||
|
|
||||||
aufnahme.storniert = true;
|
ausweis.storniert
|
||||||
ausweis = ausweis;
|
ausweis = ausweis;
|
||||||
|
|
||||||
dialogs.alert({
|
dialogs.alert({
|
||||||
@@ -70,21 +67,30 @@
|
|||||||
let hilfeModal: HTMLDialogElement;
|
let hilfeModal: HTMLDialogElement;
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="card lg:card-side bg-base-200 card-bordered border-base-300">
|
<div class="card lg:card-side relative bg-base-200 card-bordered border-base-300">
|
||||||
{#if aufnahme.storniert}
|
{#if ausweis.storniert}
|
||||||
<div class="absolute top-0 left-0 w-full h-full bg-[rgba(0,0,0,0.7)] z-[5] rounded-lg select-none">
|
<div
|
||||||
<h1 class="absolute -rotate-[25deg] text-5xl md:text-7xl tracking-wide uppercase text-red-500 border-4 border-red-500 rounded-lg top-[50%] translate-y-[-50%] left-[50%] translate-x-[-50%]">Storniert</h1>
|
class="absolute top-0 left-0 w-full h-full bg-[rgba(0,0,0,0.7)] z-[5] rounded-lg select-none"
|
||||||
|
>
|
||||||
|
<h1
|
||||||
|
class="absolute -rotate-[25deg] text-5xl md:text-7xl tracking-wide uppercase text-red-500 border-4 border-red-500 rounded-lg top-[50%] translate-y-[-50%] left-[50%] translate-x-[-50%]"
|
||||||
|
>
|
||||||
|
Storniert
|
||||||
|
</h1>
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
<figure class="lg:w-1/2">
|
<!-- <figure class="lg:w-1/2">
|
||||||
<img
|
<img
|
||||||
src={(bilder.length > 0 && `/bilder/${bilder[0].uid}.webp`) || "/images/placeholder.jpg"}
|
src={(bilder.length > 0 && `/bilder/${bilder[0].uid}.webp`) ||
|
||||||
|
"/images/placeholder.jpg"}
|
||||||
class="object-cover w-full h-full"
|
class="object-cover w-full h-full"
|
||||||
alt="Gebäudebild"
|
alt="Gebäudebild"
|
||||||
/>
|
/>
|
||||||
</figure>
|
</figure> -->
|
||||||
<div class="card-body lg:w-1/2">
|
<div class="card-body">
|
||||||
<div class="flex justify-end mb-2 dropdown dropdown-bottom absolute top-4 right-4">
|
<div
|
||||||
|
class="flex justify-end mb-2 dropdown dropdown-bottom absolute top-4 right-4"
|
||||||
|
>
|
||||||
<button class="rounded-full p-2.5 hover:bg-base-100">
|
<button class="rounded-full p-2.5 hover:bg-base-100">
|
||||||
<DotsVertical size={15} />
|
<DotsVertical size={15} />
|
||||||
</button>
|
</button>
|
||||||
@@ -108,79 +114,92 @@
|
|||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex flex-row flex-wrap gap-2">
|
<div class="flex flex-row flex-wrap gap-2">
|
||||||
{#if aufnahme.ausweisart == "VerbrauchsausweisWohnen"}
|
{#if ausweisart == Enums.Ausweisart.VerbrauchsausweisWohnen}
|
||||||
<div class="badge badge-accent font-semibold">
|
<div class="badge badge-accent font-semibold">
|
||||||
Verbrauchsausweis Wohnen
|
Verbrauchsausweis Wohnen
|
||||||
</div>
|
</div>
|
||||||
{:else if aufnahme.ausweisart == "BedarfsausweisWohnen"}
|
{:else if ausweisart == Enums.Ausweisart.BedarfsausweisWohnen}
|
||||||
<div class="badge badge-accent font-semibold">
|
<div class="badge badge-accent font-semibold">
|
||||||
Bedarfsausweis Wohnen
|
Bedarfsausweis Wohnen
|
||||||
</div>
|
</div>
|
||||||
{:else if aufnahme.ausweisart == "VerbrauchsausweisGewerbe"}
|
{:else if ausweisart == Enums.Ausweisart.VerbrauchsausweisGewerbe}
|
||||||
<div class="badge badge-accent font-semibold">
|
<div class="badge badge-accent font-semibold">
|
||||||
Verbrauchsausweis Gewerbe
|
Verbrauchsausweis Gewerbe
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
{#if aufnahme.erledigt}
|
{#if ausweis.ausgestellt}
|
||||||
<div class="badge badge-success font-semibold">Ausgestellt</div>
|
<div class="badge badge-success font-semibold">Ausgestellt</div>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
<h2 class="card-title">{objekt.adresse}</h2>
|
<h2 class="card-title">{objekt.adresse}</h2>
|
||||||
<div class="mb-4 flex flex-row items-center gap-4">
|
<div class="mb-4 flex flex-row items-center gap-4">
|
||||||
<progress class="progress w-full" value={progress} max="100"></progress>
|
<progress class="progress w-full" value={progress} max="100"
|
||||||
|
></progress>
|
||||||
<!-- TODO: Metrics für den Fortschritt festlegen -->
|
<!-- TODO: Metrics für den Fortschritt festlegen -->
|
||||||
<span class="text-sm font-semibold text-base-content">{progress}%</span>
|
<span class="text-sm font-semibold text-base-content"
|
||||||
|
>{progress}%</span
|
||||||
|
>
|
||||||
</div>
|
</div>
|
||||||
{#await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt)}
|
{#await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt) then calculations}
|
||||||
|
<div class="flex flex-col gap-2">
|
||||||
{:then calculations}
|
<div class="flex flex-row justify-between">
|
||||||
<div class="flex flex-col gap-2">
|
<span>Energieverbrauch</span>
|
||||||
<div class="flex flex-row justify-between">
|
<span class="font-bold text-base-content"
|
||||||
<span>Energieverbrauch</span>
|
>{calculations?.endEnergieVerbrauchGesamt}kWh/A</span
|
||||||
<span class="font-bold text-base-content">{calculations?.endEnergieVerbrauchGesamt}kWh/A</span>
|
>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-row justify-between">
|
||||||
|
<span>CO2 Ausstoß</span>
|
||||||
|
<span class="font-bold text-base-content"
|
||||||
|
>{calculations?.co2EmissionenGesamt}Kg/A</span
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-row justify-between">
|
||||||
|
<span>Erstellungsdatum</span>
|
||||||
|
<span class="font-bold text-base-content"
|
||||||
|
>{moment(aufnahme.erstellungsdatum).format(
|
||||||
|
"DD.MM.YYYY"
|
||||||
|
)}</span
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-row justify-between">
|
||||||
|
<span>Baujahr</span>
|
||||||
|
<span
|
||||||
|
class="font-bold text-base-content"
|
||||||
|
title="Gebäude / Heizung"
|
||||||
|
>{aufnahme.baujahr_gebaeude[0] || "N/A"} /
|
||||||
|
{aufnahme.baujahr_heizung[0] || "N/A"}</span
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-row justify-between">
|
||||||
|
<span>Wohnfläche</span>
|
||||||
|
<span class="font-bold text-base-content"
|
||||||
|
>{aufnahme.flaeche
|
||||||
|
? `${aufnahme.flaeche}m²`
|
||||||
|
: "N/A"}</span
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-row justify-between">
|
||||||
|
<span>ID</span>
|
||||||
|
<span class="font-bold text-base-content"
|
||||||
|
>{ausweis.uid.split("-")[0]}</span
|
||||||
|
>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex flex-row justify-between">
|
|
||||||
<span>CO2 Ausstoß</span>
|
|
||||||
<span class="font-bold text-base-content">{calculations?.co2EmissionenGesamt}Kg/A</span>
|
|
||||||
</div>
|
|
||||||
<div class="flex flex-row justify-between">
|
|
||||||
<span>Erstellungsdatum</span>
|
|
||||||
<span class="font-bold text-base-content"
|
|
||||||
>{moment(aufnahme.erstellungsdatum).format(
|
|
||||||
"DD.MM.YYYY"
|
|
||||||
)}</span
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
<div class="flex flex-row justify-between">
|
|
||||||
<span>Baujahr</span>
|
|
||||||
<span
|
|
||||||
class="font-bold text-base-content"
|
|
||||||
title="Gebäude / Heizung"
|
|
||||||
>{aufnahme.baujahr_gebaeude[0] || "N/A"} /
|
|
||||||
{aufnahme.baujahr_heizung[0] ||
|
|
||||||
"N/A"}</span
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
<div class="flex flex-row justify-between">
|
|
||||||
<span>Wohnfläche</span>
|
|
||||||
<span class="font-bold text-base-content"
|
|
||||||
>{aufnahme.flaeche
|
|
||||||
? `${aufnahme.flaeche}m²`
|
|
||||||
: "N/A"}</span
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
<div class="flex flex-row justify-between">
|
|
||||||
<span>ID</span>
|
|
||||||
<span class="font-bold text-base-content"
|
|
||||||
>{ausweis.uid.split("-")[0]}</span
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{/await}
|
{/await}
|
||||||
<div class="card-actions justify-end mt-8">
|
<div class="card-actions justify-end mt-8">
|
||||||
<a class="btn btn-primary" href="/energieausweis-erstellen/verbrauchsausweis-wohnen?uid={ausweis.uid}">Bearbeiten</a>
|
<a
|
||||||
<a class="btn btn-ghost" title="PDF Herunterladen" target="_blank" href="/pdf/ansichtsausweis?uid={ausweis.uid}">
|
class="btn btn-primary"
|
||||||
|
href="/energieausweis-erstellen/verbrauchsausweis-wohnen?uid={ausweis.uid}"
|
||||||
|
>Bearbeiten</a
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
class="btn btn-ghost"
|
||||||
|
title="PDF Herunterladen"
|
||||||
|
target="_blank"
|
||||||
|
href="/pdf/ansichtsausweis?uid={ausweis.uid}"
|
||||||
|
>
|
||||||
<Download size={22} />
|
<Download size={22} />
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
28
src/components/Dashboard/DashboardObjekt.svelte
Normal file
28
src/components/Dashboard/DashboardObjekt.svelte
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import { ObjektKomplettClient } from "#components/Ausweis/types.js";
|
||||||
|
import { Enums } from "@ibcornelsen/database/server";
|
||||||
|
import moment from "moment";
|
||||||
|
import { File, OpenInNewWindow } from "radix-svelte-icons";
|
||||||
|
|
||||||
|
export let objekt: ObjektKomplettClient;
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
const objektBild = objekt.bilder.find(bild => bild.kategorie === Enums.BilderKategorie.Gebaeude);
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class="border rounded-lg border-base-300 bg-white">
|
||||||
|
{#if objektBild}
|
||||||
|
<img src="/bilder/{objektBild.uid}.webp" class="w-full max-h-72 object-cover rounded-t-lg" alt="Gebäude">
|
||||||
|
{/if}
|
||||||
|
|
||||||
|
<div class="p-4">
|
||||||
|
<div class="flex flex-row justify-between">
|
||||||
|
<h3 class="text-lg font-medium">{objekt.adresse}</h3>
|
||||||
|
<span class="text-sm opacity-70 font-medium">{moment(objekt.erstellungsdatum).format("DD.MM.YYYY")}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-row justify-end">
|
||||||
|
<a href="/dashboard/objekt/{objekt.uid}" class="rounded-lg p-2.5 hover:bg-gray-200" target="_blank"><OpenInNewWindow size={20}></OpenInNewWindow></a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { ripple } from "svelte-ripple-action";
|
import { ripple } from "svelte-ripple-action";
|
||||||
import type { RippleOptions } from "svelte-ripple-action/dist/constants.js";
|
import type { RippleOptions } from "svelte-ripple-action/dist/constants.js";
|
||||||
import { Home, Reader, EnvelopeClosed, Cube, Bell, Gear, LockClosed, HamburgerMenu } from "radix-svelte-icons"
|
import { Home, Reader, EnvelopeClosed, Cube, Bell, Gear, LockClosed, HamburgerMenu, CaretDown } from "radix-svelte-icons"
|
||||||
import NotificationProvider from "#components/NotificationProvider/NotificationProvider.svelte";
|
import NotificationProvider from "#components/NotificationProvider/NotificationProvider.svelte";
|
||||||
import DashboardNotification from "./DashboardNotification.svelte";
|
import DashboardNotification from "./DashboardNotification.svelte";
|
||||||
import { notifications } from "#components/NotificationProvider/shared.js";
|
import { notifications } from "#components/NotificationProvider/shared.js";
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
let headerOpen = false;
|
let headerOpen = false;
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<header class="fixed top-0 left-0 w-full h-16 flex items-center justify-between px-4 border-b z-20">
|
<header class="fixed top-0 left-0 w-full h-16 flex items-center justify-between px-4 border-b z-10 bg-base-200">
|
||||||
<button on:click={() => headerOpen = !headerOpen}>
|
<button on:click={() => headerOpen = !headerOpen}>
|
||||||
{#if headerOpen}
|
{#if headerOpen}
|
||||||
<Cross1 size={28}></Cross1>
|
<Cross1 size={28}></Cross1>
|
||||||
@@ -37,11 +37,11 @@
|
|||||||
>
|
>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<aside class:hidden={!headerOpen} class="fixed left-0 top-16 w-full h-[calc(100%-4rem)] flex z-30 md:relative md:h-auto md:w-auto md:top-0 md:flex bg-base-100 border-r border-r-base-300 flex-col py-8">
|
<aside class:hidden={!headerOpen} class="fixed left-0 top-16 w-full h-[calc(100%-4rem)] flex z-30 md:relative md:h-auto md:w-auto md:top-0 md:flex bg-base-200 border-r border-r-base-300 flex-col py-4">
|
||||||
<a href="/" class="px-8 hidden md:block"
|
<a href="/" class="px-8 hidden md:block"
|
||||||
><img
|
><img
|
||||||
src="/images/header/logo-big.svg"
|
src="/images/header/logo-big.svg"
|
||||||
class="w-36"
|
class="w-24"
|
||||||
alt="IBCornelsen - Logo"
|
alt="IBCornelsen - Logo"
|
||||||
/></a
|
/></a
|
||||||
>
|
>
|
||||||
@@ -59,10 +59,10 @@
|
|||||||
<EnvelopeClosed width={22} height={22} />
|
<EnvelopeClosed width={22} height={22} />
|
||||||
Kontakt
|
Kontakt
|
||||||
</button>
|
</button>
|
||||||
<li><details>
|
<li><details class="[&_.caret]:open:rotate-180">
|
||||||
<summary class="button-tab w-full outline-0 hover:outline-0">
|
<summary class="button-tab w-full outline-0 hover:outline-0">
|
||||||
<Cube width={22} height={22} />
|
<Cube width={22} height={22} />
|
||||||
Services</summary>
|
Services <CaretDown size={24} class="caret ml-auto transition-transform"></CaretDown></summary>
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<button use:ripple={rippleOptions} class="button-tab">
|
<button use:ripple={rippleOptions} class="button-tab">
|
||||||
@@ -77,10 +77,10 @@
|
|||||||
</ul>
|
</ul>
|
||||||
</details></li>
|
</details></li>
|
||||||
{#if benutzer.rolle === "ADMIN"}
|
{#if benutzer.rolle === "ADMIN"}
|
||||||
<li><details>
|
<li><details class="[&_.caret]:open:rotate-180">
|
||||||
<summary class="button-tab w-full outline-0 hover:outline-0">
|
<summary class="button-tab w-full outline-0 hover:outline-0 cursor-pointer">
|
||||||
<LockClosed width={22} height={22} />
|
<LockClosed width={22} height={22} />
|
||||||
Admin</summary>
|
Admin <CaretDown size={24} class="caret ml-auto transition-transform"></CaretDown></summary>
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<a use:ripple={rippleOptions} class="button-tab" href="/dashboard/admin/ausweise-pruefen">
|
<a use:ripple={rippleOptions} class="button-tab" href="/dashboard/admin/ausweise-pruefen">
|
||||||
@@ -109,7 +109,7 @@
|
|||||||
{#if Object.keys($notifications).length > 0}
|
{#if Object.keys($notifications).length > 0}
|
||||||
<span class="indicator-item badge badge-accent text-xs">{Object.keys($notifications).length}</span>
|
<span class="indicator-item badge badge-accent text-xs">{Object.keys($notifications).length}</span>
|
||||||
{/if}
|
{/if}
|
||||||
<button tabindex="0" class="button btn-square btn-ghost hover:bg-base-200">
|
<button tabindex="0" class="hover:bg-gray-200 p-3 rounded-lg">
|
||||||
<Bell size={24} />
|
<Bell size={24} />
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
@@ -119,7 +119,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<a href="/dashboard/einstellungen"
|
<a href="/dashboard/einstellungen"
|
||||||
class="button btn-square btn-ghost hover:bg-base-200"
|
class="hover:bg-gray-200 p-3 rounded-lg"
|
||||||
>
|
>
|
||||||
<Gear size={24} />
|
<Gear size={24} />
|
||||||
</a>
|
</a>
|
||||||
@@ -129,7 +129,7 @@
|
|||||||
<a
|
<a
|
||||||
href="/dashboard/einstellungen"
|
href="/dashboard/einstellungen"
|
||||||
use:ripple={rippleOptions}
|
use:ripple={rippleOptions}
|
||||||
class="button btn-ghost no-animation focus:shadow-none justify-start py-4 h-auto hover:bg-base-200 px-8 rounded-none w-full flex flex-row gap-4"
|
class="hover:bg-gray-200 no-animation focus:shadow-none justify-start py-4 h-auto px-8 rounded-none w-full flex flex-row gap-4"
|
||||||
>
|
>
|
||||||
<div class="avatar">
|
<div class="avatar">
|
||||||
<div class="w-12 rounded-full">
|
<div class="w-12 rounded-full">
|
||||||
@@ -138,34 +138,15 @@
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex flex-col gap-2">
|
<div class="flex flex-col">
|
||||||
<span class="text-base-content font-semibold text-left"
|
<span class="text-base-content font-semibold text-left"
|
||||||
>{benutzer.vorname} {benutzer.name}</span
|
>{benutzer.vorname} {benutzer.name}</span
|
||||||
>
|
>
|
||||||
<span class="text-base-content">{benutzer.email}</span>
|
<span class="text-base-content text-sm">{benutzer.email}</span>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
</aside>
|
</aside>
|
||||||
|
|
||||||
<!--<header class="md:hidden flex flex-row justify-between items-center px-8 sticky top-0 z-50 h-20 bg-base-100 border-b border-b-base-300">
|
|
||||||
<a href="/"
|
|
||||||
><img
|
|
||||||
src="/images/header/logo-big.png"
|
|
||||||
class="w-36"
|
|
||||||
alt="IBCornelsen - Logo"
|
|
||||||
/></a
|
|
||||||
>
|
|
||||||
<div class="dropdown dropdown-end">
|
|
||||||
<button tabindex="0" role="button">
|
|
||||||
<svg width="25" height="25" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M2 4.5C2 4.22386 2.22386 4 2.5 4H12.5C12.7761 4 13 4.22386 13 4.5C13 4.77614 12.7761 5 12.5 5H2.5C2.22386 5 2 4.77614 2 4.5ZM7 7.5C7 7.22386 7.22386 7 7.5 7H12.5C12.7761 7 13 7.22386 13 7.5C13 7.77614 12.7761 8 12.5 8H7.5C7.22386 8 7 7.77614 7 7.5ZM4 10.5C4 10.2239 4.22386 10 4.5 10H12.5C12.7761 10 13 10.2239 13 10.5C13 10.7761 12.7761 11 12.5 11H4.5C4.22386 11 4 10.7761 4 10.5Z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"></path></svg>
|
|
||||||
</button>
|
|
||||||
<ul tabindex="0" class="dropdown-content z-[1] menu p-2 shadow bg-base-100 rounded-box w-52">
|
|
||||||
<li><a class="text-base-content">Item 1</a></li>
|
|
||||||
<li><a class="text-base-content">Item 2</a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</header>-->
|
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
@import url("https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,200;0,300;0,400;0,500;0,600;0,700;1,400&display=swap");
|
@import url("https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,200;0,300;0,400;0,500;0,600;0,700;1,400&display=swap");
|
||||||
|
|
||||||
@@ -178,7 +159,15 @@
|
|||||||
} */
|
} */
|
||||||
|
|
||||||
.button-tab:hover {
|
.button-tab:hover {
|
||||||
@apply bg-base-200 outline-0;
|
@apply bg-gray-200 outline-0;
|
||||||
|
}
|
||||||
|
|
||||||
|
li {
|
||||||
|
@apply list-none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-tab {
|
||||||
|
@apply flex flex-row gap-4 py-2.5 px-4 cursor-pointer items-center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.button-tab:focus {
|
.button-tab:focus {
|
||||||
|
|||||||
@@ -1,19 +1,29 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { Buffer } from "buffer";
|
import { Buffer } from "buffer";
|
||||||
import { AufnahmeClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "./Ausweis/types.js";
|
import { AufnahmeClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "./Ausweis/types.js";
|
||||||
|
import { Enums } from "@ibcornelsen/database/client";
|
||||||
|
import { openWindowWithPost } from "#lib/helpers/window.js";
|
||||||
|
|
||||||
export let ausweis: VerbrauchsausweisWohnenClient;
|
export let ausweis: VerbrauchsausweisWohnenClient;
|
||||||
export let objekt: ObjektClient;
|
export let objekt: ObjektClient;
|
||||||
export let aufnahme: AufnahmeClient;
|
export let aufnahme: AufnahmeClient;
|
||||||
export let bilder: UploadedGebaeudeBild[];
|
export let bilder: UploadedGebaeudeBild[];
|
||||||
|
export let ausweisart: Enums.Ausweisart
|
||||||
|
|
||||||
|
|
||||||
$: base64Ausweis = Buffer.from(JSON.stringify(ausweis), "utf-8").toString("base64")
|
|
||||||
$: base64Aufnahme = Buffer.from(JSON.stringify(aufnahme), "utf-8").toString("base64")
|
|
||||||
$: base64Objekt = Buffer.from(JSON.stringify(objekt), "utf-8").toString("base64")
|
|
||||||
$: base64Bilder = Buffer.from(JSON.stringify(bilder), "utf-8").toString("base64")
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<a class="border-2 rounded-lg bg-white text-center hover:shadow-md no-underline p-3 cursor-pointer" target="_blank" href="/pdf/datenblatt?ausweis={base64Ausweis}&objekt=${base64Objekt}&aufnahme={base64Aufnahme}&bilder={base64Bilder}">
|
|
||||||
|
<button class="border-2 rounded-lg bg-white text-center hover:shadow-md no-underline p-3 cursor-pointer" on:click={() => {
|
||||||
|
openWindowWithPost("/pdf/datenblatt", {
|
||||||
|
ausweis: JSON.stringify(ausweis),
|
||||||
|
aufnahme: JSON.stringify(aufnahme),
|
||||||
|
objekt: JSON.stringify(objekt),
|
||||||
|
bilder: JSON.stringify(bilder),
|
||||||
|
ausweisart
|
||||||
|
})
|
||||||
|
}}>
|
||||||
<img class="w-full" src="/images/datenblatt.webp" alt="Datenblatt" />
|
<img class="w-full" src="/images/datenblatt.webp" alt="Datenblatt" />
|
||||||
|
|
||||||
<span class="text-black font-medium text-lg">Datenblatt</span>
|
<span class="text-black font-medium text-lg">Datenblatt</span>
|
||||||
</a>
|
</button>
|
||||||
|
|||||||
133
src/components/FileGrid.svelte
Normal file
133
src/components/FileGrid.svelte
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import { BedarfsausweisWohnenClient, ObjektClient, UnterlageClient, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "./Ausweis/types.js";
|
||||||
|
import { Trash, Upload } from "radix-svelte-icons";
|
||||||
|
import HelpLabel from "#components/labels/HelpLabel.svelte";
|
||||||
|
|
||||||
|
export let kategorie: string = "";
|
||||||
|
export let files: (UnterlageClient & { data: string | ArrayBuffer })[] = [];
|
||||||
|
export let max: number = Infinity;
|
||||||
|
export let min: number = 1;
|
||||||
|
export let name: string = "";
|
||||||
|
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
|
||||||
|
export let objekt: ObjektClient;
|
||||||
|
import mime from "mime-types";
|
||||||
|
|
||||||
|
|
||||||
|
function getAllFiles(this: HTMLInputElement) {
|
||||||
|
const fileArray = this.files || [];
|
||||||
|
|
||||||
|
if (fileArray.length == max) {
|
||||||
|
this.value = "";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let i = 0; i < fileArray.length; i++) {
|
||||||
|
const file = fileArray[i];
|
||||||
|
|
||||||
|
if (i == max) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
const reader = new FileReader();
|
||||||
|
|
||||||
|
reader.onload = () => {
|
||||||
|
if (reader.readyState != reader.DONE) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!reader.result) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const mimeType = mime.types[file.name.split(".").pop() as string]
|
||||||
|
|
||||||
|
files.push({ data: reader.result, kategorie, name: file.name, mime: mimeType });
|
||||||
|
files = files;
|
||||||
|
|
||||||
|
|
||||||
|
if (i == (Math.min(fileArray.length, max) - 1)) {
|
||||||
|
this.value = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
reader.readAsArrayBuffer(file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let fileUpload: HTMLInputElement;
|
||||||
|
|
||||||
|
export const upload = () => {
|
||||||
|
fileUpload.click()
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class="flex flex-col gap-4">
|
||||||
|
<!-- Falls die maximale Anzahl Dokumente erreicht wurde grauen wir den input aus und zeigen einen Hilfstext -->
|
||||||
|
{#if files.filter((file) => file.kategorie === kategorie).length === max}
|
||||||
|
<span class="bg-base-200 border px-4 py-2">Maximale Anzahl Dokumente wurde erreicht.</span>
|
||||||
|
{:else if max > 1}
|
||||||
|
<div class="input-standard">
|
||||||
|
<input type="file" class="file-input file-input-ghost h-[38px]" bind:this={fileUpload} {name} multiple on:change={getAllFiles} />
|
||||||
|
<div class="help-label">
|
||||||
|
<HelpLabel>
|
||||||
|
<slot />
|
||||||
|
</HelpLabel>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{:else}
|
||||||
|
<div class="input-standard">
|
||||||
|
<input type="file" class="file-input file-input-ghost h-[38px]" bind:this={fileUpload} {name} on:change={getAllFiles} />
|
||||||
|
<div class="help-label">
|
||||||
|
<HelpLabel>
|
||||||
|
<slot />
|
||||||
|
</HelpLabel>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
<div class="grid grid-cols-2 gap-2">
|
||||||
|
{#each files as file, i}
|
||||||
|
{#if file.kategorie == kategorie}
|
||||||
|
<div class="relative group">
|
||||||
|
<div
|
||||||
|
class="h-full max-h-96 w-full rounded-lg border-2 group-hover:contrast-50 object-cover transition-all text-center items-center flex p-4 text-opacity-75 text-black"
|
||||||
|
>{file.name}</div>
|
||||||
|
<div class="invisible group-hover:visible absolute left-[50%] top-[50%] translate-x-[-50%] translate-y-[-50%] flex flex-row gap-2">
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
class="rounded-full w-[30px] h-[30px] flex items-center justify-center p-0 bg-[rgba(0,0,0,0.4)]"
|
||||||
|
on:click={() => {
|
||||||
|
delete files[i];
|
||||||
|
files = files.filter((x) => x);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Trash size={20} color="#fff"></Trash>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
{/each}
|
||||||
|
|
||||||
|
<!-- Wir zeigen Platzhalter an, damit der Nutzer sieht wie viele Bilder er hochladen soll -->
|
||||||
|
{#each { length: Math.max(0, Math.min(max, 4) - files.filter(image => image.kategorie === kategorie).length) } as _, i}
|
||||||
|
<div class="relative group">
|
||||||
|
<img
|
||||||
|
src="/placeholder.png"
|
||||||
|
alt={kategorie}
|
||||||
|
class="h-full max-h-32 w-full rounded-lg border-2 group-hover:contrast-50 object-cover transition-all"
|
||||||
|
class:opacity-35={i >= min}
|
||||||
|
/>
|
||||||
|
<div class="invisible group-hover:visible absolute left-[50%] top-[50%] translate-x-[-50%] translate-y-[-50%] flex flex-row gap-2">
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
class="rounded-full w-[30px] h-[30px] flex items-center justify-center p-0 bg-[rgba(0,0,0,0.4)]"
|
||||||
|
on:click={upload}
|
||||||
|
>
|
||||||
|
<Upload size={20} color="#fff"></Upload>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/each}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
import { RotateCounterClockwise, Trash, Upload } from "radix-svelte-icons";
|
import { RotateCounterClockwise, Trash, Upload } from "radix-svelte-icons";
|
||||||
|
|
||||||
export let images: UploadedGebaeudeBild[] = [];
|
export let images: UploadedGebaeudeBild[] = [];
|
||||||
export let max: number = 4;
|
export let max: number = Infinity;
|
||||||
export let min: number = 1;
|
export let min: number = 1;
|
||||||
export let name: string = "";
|
export let name: string = "";
|
||||||
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
|
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
|
||||||
@@ -74,7 +74,7 @@
|
|||||||
{/each}
|
{/each}
|
||||||
|
|
||||||
<!-- Wir zeigen Platzhalter an, damit der Nutzer sieht wie viele Bilder er hochladen soll -->
|
<!-- Wir zeigen Platzhalter an, damit der Nutzer sieht wie viele Bilder er hochladen soll -->
|
||||||
{#each { length: max - images.filter(image => image.kategorie === kategorie).length } as _, i}
|
{#each { length: Math.max(0, Math.min(max, 4) - images.filter(image => image.kategorie === kategorie).length) } as _, i}
|
||||||
<div class="relative group">
|
<div class="relative group">
|
||||||
<img
|
<img
|
||||||
src="/placeholder.png"
|
src="/placeholder.png"
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
export let lightTheme: boolean = Cookies.get("theme") === "light" ? true : false;
|
export let lightTheme: boolean = Cookies.get("theme") === "light" ? true : false;
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<label class="swap swap-rotate btn btn-square btn-ghost hover:bg-base-200">
|
<label class="hover:bg-gray-200 rounded-lg p-3 cursor-pointer">
|
||||||
<input
|
<input
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
class="theme-controller hidden"
|
class="theme-controller hidden"
|
||||||
@@ -16,6 +16,9 @@
|
|||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<Sun class="swap-on fill-current" size={24} />
|
{#if lightTheme}
|
||||||
<Moon class="swap-off fill-current" size={24} />
|
<Sun class="fill-current" size={24} />
|
||||||
|
{:else}
|
||||||
|
<Moon class="swap-off fill-current" size={24} />
|
||||||
|
{/if}
|
||||||
</label>
|
</label>
|
||||||
@@ -183,17 +183,17 @@
|
|||||||
{/if}
|
{/if}
|
||||||
<li>
|
<li>
|
||||||
<a
|
<a
|
||||||
href="/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/"
|
href="/angebot-anfragen/bedarfsausweis-gewerbe-anfragen"
|
||||||
>Bedarfsausweis Gewerbe anfragen</a
|
>Bedarfsausweis Gewerbe anfragen</a
|
||||||
>
|
>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="/energieausweis-erstellen/bedarfsausweis-wohngebaeude/"
|
<a href="/angebot-anfragen/geg-nachweis-wohnen-anfragen"
|
||||||
>GEG Nachweis Wohnen anfragen</a
|
>GEG Nachweis Wohnen anfragen</a
|
||||||
>
|
>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="/energieausweis-erstellen/verbrauchsausweis-gewerbe/"
|
<a href="/angebot-anfragen/geg-nachweis-gewerbe-anfragen"
|
||||||
>GEG Nachweis Gewerbe anfragen</a
|
>GEG Nachweis Gewerbe anfragen</a
|
||||||
>
|
>
|
||||||
</li>
|
</li>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
import "../style/global.css";
|
import "../style/global.css";
|
||||||
import "../style/formular.css";
|
import "../style/formular.css";
|
||||||
import "../../svelte-dialogs.config"
|
import "../../svelte-dialogs.config";
|
||||||
import Header from "#components/design/header/AusweisHeader.astro";
|
import Header from "#components/design/header/AusweisHeader.astro";
|
||||||
import Footer from "#components/design/footer/Footer.astro";
|
import Footer from "#components/design/footer/Footer.astro";
|
||||||
import SidebarLeft from "#components/design/sidebars/SidebarLeft.astro";
|
import SidebarLeft from "#components/design/sidebars/SidebarLeft.astro";
|
||||||
@@ -13,52 +13,59 @@ export interface Props {
|
|||||||
|
|
||||||
const { title } = Astro.props;
|
const { title } = Astro.props;
|
||||||
---
|
---
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
window.addEventListener("scroll", (event) => {
|
const skala = document.getElementById("skala");
|
||||||
let scroll = window.scrollY;
|
|
||||||
const skala = document.getElementById("skala")
|
|
||||||
|
|
||||||
if(scroll>=400){
|
if (!skala?.classList.contains("no-scroll")) {
|
||||||
if (skala) {
|
window.addEventListener("scroll", (event) => {
|
||||||
skala.classList.add('2xl:fixed','2xl:py-4','2xl:top-0','2xl:z-20');
|
let scroll = window.scrollY;
|
||||||
skala.classList.remove('w-full');
|
if (scroll >= 400) {
|
||||||
skala.style.borderBottom = "3px solid #e6e6e6";
|
if (skala) {
|
||||||
}
|
skala.classList.add(
|
||||||
|
"2xl:fixed",
|
||||||
|
"2xl:py-4",
|
||||||
|
"2xl:top-0",
|
||||||
|
"2xl:z-20"
|
||||||
|
);
|
||||||
|
skala.classList.remove("w-full");
|
||||||
|
skala.style.borderBottom = "3px solid #e6e6e6";
|
||||||
|
}
|
||||||
|
|
||||||
|
const performanceBox =
|
||||||
|
document.getElementById("performance-box");
|
||||||
|
if (performanceBox) {
|
||||||
|
performanceBox.style.maxWidth = "688.5px";
|
||||||
|
}
|
||||||
|
const progressBox = document.getElementById("progress-box");
|
||||||
|
|
||||||
const performanceBox = document.getElementById('performance-box')
|
if (progressBox) {
|
||||||
if (performanceBox) {
|
progressBox.style.maxWidth = "688.5px";
|
||||||
performanceBox.style.maxWidth = "688.5px";
|
}
|
||||||
}
|
|
||||||
const progressBox = document.getElementById('progress-box');
|
|
||||||
|
|
||||||
if (progressBox) {
|
document
|
||||||
progressBox.style.maxWidth = "688.5px"
|
.getElementById("formInput-1")
|
||||||
}
|
?.classList.add("2xl:mt-[370px]");
|
||||||
|
} else {
|
||||||
document.getElementById('formInput-1')?.classList.add('2xl:mt-[370px]');
|
if (skala) {
|
||||||
|
skala.classList.remove(
|
||||||
|
"2xl:fixed",
|
||||||
|
"2xl:py-4",
|
||||||
|
"2xl:top-0",
|
||||||
}else{
|
"2xl:z-20"
|
||||||
if (skala) {
|
);
|
||||||
skala.classList.remove('2xl:fixed','2xl:py-4','2xl:top-0','2xl:z-20')
|
skala.classList.add("w-full");
|
||||||
skala.classList.add('w-full')
|
skala.style.borderBottom = "none";
|
||||||
skala.style.borderBottom = "none";
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
document.getElementById('formInput-1')?.classList.remove('2xl:mt-[370px]');
|
|
||||||
|
|
||||||
|
document
|
||||||
|
.getElementById("formInput-1")
|
||||||
|
?.classList.remove("2xl:mt-[370px]");
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="de">
|
<html lang="de">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
@@ -82,7 +89,10 @@ window.addEventListener("scroll", (event) => {
|
|||||||
content="✅ Jetzt Ihren Energieausweis online erstellen. Erhalten Sie Ihren online Energieausweis rechtssicher und nach aktueller GEG (vormals EnEV) vom Diplom Ingenieur geprüft."
|
content="✅ Jetzt Ihren Energieausweis online erstellen. Erhalten Sie Ihren online Energieausweis rechtssicher und nach aktueller GEG (vormals EnEV) vom Diplom Ingenieur geprüft."
|
||||||
/>
|
/>
|
||||||
<meta property="og:url" content="https://online-energieausweis.org/" />
|
<meta property="og:url" content="https://online-energieausweis.org/" />
|
||||||
<meta property="og:site_name" content="Energieausweis online erstellen" />
|
<meta
|
||||||
|
property="og:site_name"
|
||||||
|
content="Energieausweis online erstellen"
|
||||||
|
/>
|
||||||
|
|
||||||
<meta name="twitter:card" content="summary_large_image" />
|
<meta name="twitter:card" content="summary_large_image" />
|
||||||
<meta
|
<meta
|
||||||
@@ -98,14 +108,13 @@ window.addEventListener("scroll", (event) => {
|
|||||||
content="https://online-energieausweis.org/images/energieausweis-online-erstellen.jpg"
|
content="https://online-energieausweis.org/images/energieausweis-online-erstellen.jpg"
|
||||||
/>
|
/>
|
||||||
<title>
|
<title>
|
||||||
{title || 'Energieausweis online erstellen - Online Energieausweis'}
|
{title || "Energieausweis online erstellen - Online Energieausweis"}
|
||||||
</title>
|
</title>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
<Header />
|
<Header />
|
||||||
|
|
||||||
<main
|
<main
|
||||||
class="w-full p-0 grid
|
class="w-full p-0 grid
|
||||||
xs:grid-cols-[minmax(1fr,1fr)] xs:gap-1 xs:p-0
|
xs:grid-cols-[minmax(1fr,1fr)] xs:gap-1 xs:p-0
|
||||||
@@ -113,20 +122,17 @@ window.addEventListener("scroll", (event) => {
|
|||||||
md:grid-cols-[minmax(1fr,1fr)] md:gap-2 md:p-0
|
md:grid-cols-[minmax(1fr,1fr)] md:gap-2 md:p-0
|
||||||
lg:grid-cols-[minmax(250px,250px)1fr] lg:gap-3 lg:p-4
|
lg:grid-cols-[minmax(250px,250px)1fr] lg:gap-3 lg:p-4
|
||||||
xl:grid-cols-[minmax(350px,350px)1fr] xl:gap-4 xl:p-6
|
xl:grid-cols-[minmax(350px,350px)1fr] xl:gap-4 xl:p-6
|
||||||
2xl:grid-cols-[minmax(300px,300px)1fr] 2xl:gap-5 2xl:p-6
|
2xl:grid-cols-[minmax(300px,300px)1fr] 2xl:gap-5 2xl:p-6"
|
||||||
">
|
>
|
||||||
|
<SidebarLeft />
|
||||||
|
|
||||||
<SidebarLeft />
|
<article class="box rounded-tl-none p-2 lg:p-12">
|
||||||
|
<slot />
|
||||||
<article class="box rounded-tl-none p-2 lg:p-12">
|
</article>
|
||||||
<slot />
|
|
||||||
</article>
|
|
||||||
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<Footer />
|
<Footer />
|
||||||
<NotificationWrapper client:load />
|
<NotificationWrapper client:load />
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
|||||||
@@ -5,8 +5,6 @@ import "../../svelte-dialogs.config"
|
|||||||
import "svelte-ripple-action/ripple.css"
|
import "svelte-ripple-action/ripple.css"
|
||||||
import DashboardSidebar from "../components/Dashboard/DashboardSidebar.svelte"
|
import DashboardSidebar from "../components/Dashboard/DashboardSidebar.svelte"
|
||||||
import { validateAccessTokenServer } from "#server/lib/validateAccessToken";
|
import { validateAccessTokenServer } from "#server/lib/validateAccessToken";
|
||||||
import { createCaller } from "src/astro-typesafe-api-caller";
|
|
||||||
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants";
|
|
||||||
import { BenutzerClient } from "#components/Ausweis/types";
|
import { BenutzerClient } from "#components/Ausweis/types";
|
||||||
|
|
||||||
const valid = validateAccessTokenServer(Astro)
|
const valid = validateAccessTokenServer(Astro)
|
||||||
@@ -100,7 +98,7 @@ let lightTheme = Astro.cookies.get("theme")?.value === "light";
|
|||||||
|
|
||||||
<body class="min-h-screen grid md:grid-cols-[300px_1fr]">
|
<body class="min-h-screen grid md:grid-cols-[300px_1fr]">
|
||||||
<DashboardSidebar lightTheme={lightTheme} benutzer={user} client:load></DashboardSidebar>
|
<DashboardSidebar lightTheme={lightTheme} benutzer={user} client:load></DashboardSidebar>
|
||||||
<main class="p-4 md:p-8 overflow-auto h-screen bg-base-100 pt-20 md:!pt-24">
|
<main class="overflow-auto h-screen bg-base-100 pt-24 px-6 w-full">
|
||||||
<slot />
|
<slot />
|
||||||
</main>
|
</main>
|
||||||
</body>
|
</body>
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
export function funktionAufwandszahlVerteilungTrinkwarmWasserT42(RohrNetztyp: string, LagezirkulationVerteilung: string) {
|
||||||
|
|
||||||
|
type Rohrnetztyp = "I (Steigestrangtyp)" | "II (Ebenentyp)" | "III (Dezentrale Versorgung)";
|
||||||
|
type Verteiltyp = "Verteilung im unbeheizten Bereich ohne Zirkulation" | "Verteilung im unbeheizten Bereich mit Zirkulation" | "Verteilung im beheizten Bereich ohne Zirkulation" | "Verteilung im beheizten Bereich mit Zirkulation";
|
||||||
|
|
||||||
|
interface WarmwasserVerteilung {
|
||||||
|
rohrnetztyp: Rohrnetztyp;
|
||||||
|
verteiltyp: Verteiltyp;
|
||||||
|
AufwandsZahlTrinkwarmWasserVerteilung?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
const AufwandsZahlenTrinkwarmWasserVerteilung: WarmwasserVerteilung[] = [
|
||||||
|
{
|
||||||
|
rohrnetztyp: "I (Steigestrangtyp)",
|
||||||
|
verteiltyp: "Verteilung im unbeheizten Bereich ohne Zirkulation",
|
||||||
|
AufwandsZahlTrinkwarmWasserVerteilung: 1.490
|
||||||
|
},
|
||||||
|
{
|
||||||
|
rohrnetztyp: "I (Steigestrangtyp)",
|
||||||
|
verteiltyp: "Verteilung im unbeheizten Bereich mit Zirkulation",
|
||||||
|
AufwandsZahlTrinkwarmWasserVerteilung: 2.290
|
||||||
|
},
|
||||||
|
{
|
||||||
|
rohrnetztyp: "I (Steigestrangtyp)",
|
||||||
|
verteiltyp: "Verteilung im beheizten Bereich ohne Zirkulation",
|
||||||
|
AufwandsZahlTrinkwarmWasserVerteilung: 1.432
|
||||||
|
},
|
||||||
|
{
|
||||||
|
rohrnetztyp: "I (Steigestrangtyp)",
|
||||||
|
verteiltyp: "Verteilung im beheizten Bereich mit Zirkulation",
|
||||||
|
AufwandsZahlTrinkwarmWasserVerteilung: 2.252
|
||||||
|
},
|
||||||
|
{
|
||||||
|
rohrnetztyp: "II (Ebenentyp)",
|
||||||
|
verteiltyp: "Verteilung im unbeheizten Bereich ohne Zirkulation",
|
||||||
|
AufwandsZahlTrinkwarmWasserVerteilung: 1.518
|
||||||
|
},
|
||||||
|
{
|
||||||
|
rohrnetztyp: "II (Ebenentyp)",
|
||||||
|
verteiltyp: "Verteilung im unbeheizten Bereich mit Zirkulation",
|
||||||
|
AufwandsZahlTrinkwarmWasserVerteilung: 2.461
|
||||||
|
},
|
||||||
|
{
|
||||||
|
rohrnetztyp: "II (Ebenentyp)",
|
||||||
|
verteiltyp: "Verteilung im beheizten Bereich ohne Zirkulation",
|
||||||
|
AufwandsZahlTrinkwarmWasserVerteilung: 1.469
|
||||||
|
},
|
||||||
|
{
|
||||||
|
rohrnetztyp: "II (Ebenentyp)",
|
||||||
|
verteiltyp: "Verteilung im beheizten Bereich mit Zirkulation",
|
||||||
|
AufwandsZahlTrinkwarmWasserVerteilung: 2.391
|
||||||
|
},
|
||||||
|
{
|
||||||
|
rohrnetztyp: "III (Dezentrale Versorgung)",
|
||||||
|
verteiltyp: "Verteilung im beheizten Bereich ohne Zirkulation",
|
||||||
|
AufwandsZahlTrinkwarmWasserVerteilung: 1.193
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
const result = AufwandsZahlenTrinkwarmWasserVerteilung.find(
|
||||||
|
(item) => item.rohrnetztyp === RohrNetztyp && item.verteiltyp === LagezirkulationVerteilung
|
||||||
|
);
|
||||||
|
|
||||||
|
return result ? result.AufwandsZahlTrinkwarmWasserVerteilung : null;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
export function funktionEinfacheInterpolation(gegebenerWert: number, gegebeneZeile: string, dataset: any) {
|
||||||
|
|
||||||
|
function interpolate(x: number, x1: number, y1: number, x2: number, y2: number): number {
|
||||||
|
return y1 + ((x - x1) * (y2 - y1)) / (x2 - x1);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getInterpolatedValue(gegebenerWert: number, gegebeneZeile: string) {
|
||||||
|
const SuchZeile = dataset[0].DatenSpalte;
|
||||||
|
const systemValues = dataset.find(item => item.SuchSpalte.includes(gegebeneZeile))?.DatenSpalte;
|
||||||
|
|
||||||
|
if (!systemValues) {
|
||||||
|
throw new Error(`Leitungssystem ${gegebeneZeile} nicht gefunden`);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let i = 0; i < SuchZeile.length - 1; i++) {
|
||||||
|
if (gegebenerWert >= SuchZeile[i] && gegebenerWert <= SuchZeile[i + 1]) {
|
||||||
|
return interpolate(gegebenerWert, SuchZeile[i], systemValues[i], SuchZeile[i + 1], systemValues[i + 1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new Error(`LeitungsLaenge ${gegebenerWert} außerhalb des Bereichs`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const interpolierterWert = getInterpolatedValue(gegebenerWert, gegebeneZeile);
|
||||||
|
|
||||||
|
return interpolierterWert;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
import { datasetGesamtluftWechselKorrekturfaktorNettoVolumen1500T14T15 } from "#lib/Berechnungen/BedarfsausweisWohnen/datasetGesamtluftWechselKorrekturfaktorNettoVolumen1500T14T15.js";
|
import { datasetGesamtluftWechselKorrekturfaktorNettoVolumen1500T14T15 } from "#lib/Berechnungen/BedarfsausweisWohnen/datasetGesamtluftWechselKorrekturfaktorNettoVolumen1500T14T15.js";
|
||||||
import { funktionDoppelteInterpolation } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionDoppelteInterpolation.js";
|
import { funktionDoppelteInterpolation } from "#lib/Berechnungen/BedarfsausweisWohnen/funktionDoppelteInterpolation.js";
|
||||||
import { date } from "astro:schema";
|
|
||||||
|
|
||||||
|
|
||||||
export function funktionGesamtluftWechselKorrekturfaktorNettoVolumen1500T14T15(LueftungsAnlage: string, LuftDichtheit: string, LueftungBedarfsgefuehrt: string, suchSpalte: number, datenZeile: number): any | null {
|
export function funktionGesamtluftWechselKorrekturfaktorNettoVolumen1500T14T15(LueftungsAnlage: string, LuftDichtheit: string, LueftungBedarfsgefuehrt: string, suchSpalte: number, datenZeile: number): any | null {
|
||||||
@@ -59,5 +58,5 @@ return {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const result = funktionGesamtluftWechselKorrekturfaktorNettoVolumen1500T14T15("Zu-/Abluftanlage", "Kategorie I - mit geplanter Dichtheitsprüfung", "bedarfsgeführt", 0, 0.1);
|
const result = funktionGesamtluftWechselKorrekturfaktorNettoVolumen1500T14T15("Zu-/Abluftanlage", "Kategorie I - mit geplanter Dichtheitsprüfung", "bedarfsgeführt", 0, 0.000001);
|
||||||
console.log(result);
|
console.log(result);
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
import { funktionEinfacheInterpolation } from "./funktionEinfacheInterpolation.js";
|
||||||
|
export function funktionHilfsenergieDifferenzdruckKesselBWNTbis34kwT39(maximaleHeizlast: number, UebergabeSystem: string) {
|
||||||
|
|
||||||
|
if (maximaleHeizlast < 2.5) { maximaleHeizlast = 2.5; }
|
||||||
|
if (maximaleHeizlast > 34) { maximaleHeizlast = 34; }
|
||||||
|
|
||||||
|
|
||||||
|
const dataset = [
|
||||||
|
{SuchSpalte: ["maxHeizlast"], DatenSpalte: [2.5, 5, 10, 20, 30, 34]},
|
||||||
|
{SuchSpalte: ["Heizkörper 15K"], DatenSpalte: [0.4, 1.7, 6.7, 26.9, 60.5, 77.7]},
|
||||||
|
{SuchSpalte: ["Heizkörper 10K"], DatenSpalte: [0.9, 3.8, 15.1, 60.5, 136.1, 174.8]},
|
||||||
|
{SuchSpalte: ["Fußbodenheizung 7K"], DatenSpalte: [1.9, 7.7, 30.9, 123.5, 277.8, 356.8]}
|
||||||
|
];
|
||||||
|
|
||||||
|
const VolumenStrom = funktionEinfacheInterpolation(maximaleHeizlast, UebergabeSystem, dataset);
|
||||||
|
return VolumenStrom;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
import { funktionEinfacheInterpolation } from "./funktionEinfacheInterpolation.js";
|
||||||
|
|
||||||
|
|
||||||
|
export function funktionHilfsenergieDifferenzdruckLeitungsLaengenT37(LeitungsLaenge: number, LeitungsSystem: string) {
|
||||||
|
|
||||||
|
if (LeitungsLaenge < 25) { LeitungsLaenge = 25; }
|
||||||
|
|
||||||
|
const dataset = [
|
||||||
|
{SuchSpalte: ["maxLeitungslänge"], DatenSpalte: [25, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 250, 300, 350, 400, 450, 500]},
|
||||||
|
{SuchSpalte: ["Heizkörper"], DatenSpalte: [5.3, 8.5, 9.8, 11.1, 12.4, 13.7, 15, 16.3, 17.6, 18.9, 20.2, 21.5, 22.8, 24.1, 25.4, 26.7, 28, 34.5, 41, 47.5, 54, 60.5, 67]},
|
||||||
|
{SuchSpalte: ["Fußbodenheizung"], DatenSpalte: [30.3, 33.5, 34.8, 36.1, 37.4, 38.7, 40, 41.3, 42.6, 43.9, 45.2, 46.5, 47.8, 49.1, 50.4, 51.7, 53, 59.5, 66, 72.5, 79, 85.5, 92]}
|
||||||
|
];
|
||||||
|
|
||||||
|
const DifferenzDruck = funktionEinfacheInterpolation(LeitungsLaenge, LeitungsSystem, dataset);
|
||||||
|
return DifferenzDruck;
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
import { funktionEinfacheInterpolation } from "./funktionEinfacheInterpolation.js";
|
||||||
|
export function funktionHilfsenergieFaktorrAbsenkPumpeT41(Betriebstunden: number, Absenkbetrieb: string) {
|
||||||
|
|
||||||
|
if (Betriebstunden < 0.1) { Betriebstunden = 0.1; }
|
||||||
|
if (Betriebstunden > 1) { Betriebstunden = 1; }
|
||||||
|
|
||||||
|
|
||||||
|
const dataset = [
|
||||||
|
{SuchSpalte: ["Betriebstunden"], DatenSpalte: [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]},
|
||||||
|
{SuchSpalte: ["Absenkbetrieb"], DatenSpalte: [1.9, 1.4, 1.2, 1.2, 1.1, 1.1, 1.0, 1.0, 1.0, 1.0]},
|
||||||
|
];
|
||||||
|
|
||||||
|
const TermPumpe = funktionEinfacheInterpolation(Betriebstunden, Absenkbetrieb, dataset);
|
||||||
|
return TermPumpe;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
import { funktionEinfacheInterpolation } from "./funktionEinfacheInterpolation.js";
|
||||||
|
export function funktionHilfsenergieTermPumpeT40(BelastungsGrad: number, PumpenRegelung: string) {
|
||||||
|
|
||||||
|
if (BelastungsGrad < 0.1) { BelastungsGrad = 0.1; }
|
||||||
|
if (BelastungsGrad > 1) { BelastungsGrad = 1; }
|
||||||
|
|
||||||
|
|
||||||
|
const dataset = [
|
||||||
|
{SuchSpalte: ["Belastungsgrad"], DatenSpalte: [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]},
|
||||||
|
{SuchSpalte: ["variabel"], DatenSpalte: [1.9, 1.4, 1.2, 1.2, 1.1, 1.1, 1.0, 1.0, 1.0, 1.0]},
|
||||||
|
{SuchSpalte: ["konstant"], DatenSpalte: [3.3, 2.0, 1.6, 1.4, 1.3, 1.2, 1.1, 1.1, 1.0, 1.0]},
|
||||||
|
{SuchSpalte: ["ungeregelt"], DatenSpalte: [7.8, 4.0, 2.8, 2.1, 1.8, 1.5, 1.3, 1.2, 1.1, 1.0]}
|
||||||
|
];
|
||||||
|
|
||||||
|
const TermPumpe = funktionEinfacheInterpolation(BelastungsGrad, PumpenRegelung, dataset);
|
||||||
|
return TermPumpe;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
import { funktionEinfacheInterpolation } from "./funktionEinfacheInterpolation.js";
|
||||||
|
export function funktionHilfsenergieVolumenstromT38(maximaleHeizlast: number, UebergabeSystem: string) {
|
||||||
|
|
||||||
|
if (maximaleHeizlast < 2.5) { maximaleHeizlast = 2.5; }
|
||||||
|
if (maximaleHeizlast > 400) { maximaleHeizlast = 400; }
|
||||||
|
|
||||||
|
|
||||||
|
const dataset = [
|
||||||
|
{SuchSpalte: ["maxHeizlast"], DatenSpalte: [2.5, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 300, 400]},
|
||||||
|
{SuchSpalte: ["Heizkörper 15K"], DatenSpalte: [0.14, 0.29, 0.58, 1.16, 1.74, 1.97, 2.32, 2.9, 3.48, 4.06, 4.64, 5.22, 5.8, 6.38, 6.96, 7.54, 8.12, 8.7, 9.28, 9.86, 10.43, 11.01, 17.39, 23.19]},
|
||||||
|
{SuchSpalte: ["Heizkörper 10K"], DatenSpalte: [0.22, 0.43, 0.87, 1.74, 2.61, 3.48, 4.35, 5.22, 6.09, 6.96, 7.83, 8.7, 9.57, 10.43, 11.3, 12.17, 13.04, 13.91, 14.78, 15.65, 16.52, 17.39, 26.09, 34.78]},
|
||||||
|
{SuchSpalte: ["Fußbodenheizung 7K"], DatenSpalte: [0.31, 0.62, 1.24, 2.48, 3.73, 4.97, 6.21, 7.45, 8.7, 9.94, 11.18, 12.42, 13.66, 14.91, 16.15, 17.39, 18.63, 19.88, 21.12, 22.36, 23.6, 24.84, 37.27, 49.69]}
|
||||||
|
];
|
||||||
|
|
||||||
|
const VolumenStrom = funktionEinfacheInterpolation(maximaleHeizlast, UebergabeSystem, dataset);
|
||||||
|
return VolumenStrom;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
import { funktionEinfacheInterpolation } from "./funktionEinfacheInterpolation.js";
|
||||||
|
export function funktionLaengeStichleitungenDezentralTrinkwarmWasserT43(LeitungsSystem: string, AnzahlGeraete: number) {
|
||||||
|
|
||||||
|
let Zuschlag = 0;
|
||||||
|
|
||||||
|
if (LeitungsSystem === "Leitungslänge für eine Zapfstelle in einem Raum (zum Beispiel Untertischspeicher)" && AnzahlGeraete > 80) {
|
||||||
|
Zuschlag = (AnzahlGeraete - 80) * 1;
|
||||||
|
AnzahlGeraete = 80;
|
||||||
|
}
|
||||||
|
if (LeitungsSystem === "Leitungslänge für mehrere Zapfstellen in einem Raum (zum Beispiel Badezimmer)" && AnzahlGeraete > 80) {
|
||||||
|
Zuschlag = (AnzahlGeraete - 80) * 3;
|
||||||
|
AnzahlGeraete = 80;
|
||||||
|
}
|
||||||
|
if (LeitungsSystem === "Leitungslänge für mehrere Zapfstellen in angrenzenden Räumen mit gleicher Installationswand" && AnzahlGeraete > 80) {
|
||||||
|
Zuschlag = (AnzahlGeraete - 80) * 4;
|
||||||
|
AnzahlGeraete = 80;
|
||||||
|
}
|
||||||
|
if (LeitungsSystem === "Leitungslängen für wohnungszentrale Versorgung" && AnzahlGeraete > 80) {
|
||||||
|
Zuschlag = (AnzahlGeraete - 80) * 6;
|
||||||
|
AnzahlGeraete = 80;
|
||||||
|
}
|
||||||
|
|
||||||
|
const dataset = [
|
||||||
|
{SuchSpalte: ["Anzahl Geräte"], DatenSpalte: [1,2,3,4,5,10,20,30,40,50,60,70,80]},
|
||||||
|
{SuchSpalte: ["Leitungslänge für eine Zapfstelle in einem Raum (zum Beispiel Untertischspeicher)"], DatenSpalte: [1,2,3,4,5,10,20,30,40,50,60,70,80]},
|
||||||
|
{SuchSpalte: ["Leitungslänge für mehrere Zapfstellen in einem Raum (zum Beispiel Badezimmer)"], DatenSpalte: [3,6,9,12,15,30,60,90,120,150,180,210,240]},
|
||||||
|
{SuchSpalte: ["Leitungslänge für mehrere Zapfstellen in angrenzenden Räumen mit gleicher Installationswand"], DatenSpalte: [4,8,12,16,20,40,80,120,160,200,240,280,320]},
|
||||||
|
{SuchSpalte: ["Leitungslängen für wohnungszentrale Versorgung"], DatenSpalte: [6,12,18,24,30,60,120,180,240,300,360,420,480]}
|
||||||
|
];
|
||||||
|
|
||||||
|
const LeitungsLaenge = funktionEinfacheInterpolation(AnzahlGeraete, LeitungsSystem, dataset);
|
||||||
|
const LaengeStichleitungenDezentralTrinkwarmWasser = LeitungsLaenge + Zuschlag;
|
||||||
|
return LaengeStichleitungenDezentralTrinkwarmWasser;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
import { funktionEinfacheInterpolation } from "./funktionEinfacheInterpolation.js";
|
||||||
|
export function funktionWaermeabgabeLeitungenTrinkwarmWasserT44(VerteilSystem: string, NettoGrundFlaeche: number) {
|
||||||
|
|
||||||
|
if (NettoGrundFlaeche < 100) { NettoGrundFlaeche = 100; }
|
||||||
|
if (NettoGrundFlaeche > 5000) { NettoGrundFlaeche = 5000; }
|
||||||
|
|
||||||
|
const dataset = [
|
||||||
|
{SuchSpalte: ["Nettogrundfläche"], DatenSpalte: [100, 150, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 2000, 3000, 4000, 5000]},
|
||||||
|
{SuchSpalte: ["Verteilung im unbeheizten Bereich mit Zirkulation"], DatenSpalte: [42.89, 44.58, 46.09, 48.65, 50.75, 52.50, 53.99, 55.27, 56.38, 57.35, 58.21, 63.31, 65.70, 67.02, 67.90]},
|
||||||
|
{SuchSpalte: ["Verteilung im beheizten Bereich mit Zirkulation"], DatenSpalte: [37.56, 39.15, 40.55, 42.95, 44.92, 46.56, 47.95, 49.15, 50.19, 51.09, 51.90, 56.67, 58.87, 60.15, 60.97]},
|
||||||
|
{SuchSpalte: ["Verteilung im unbeheizten Bereich ohne Zirkulation"], DatenSpalte: [31.09, 31.09, 31.09, 31.09, 31.09, 31.09, 31.09, 31.09, 31.09, 31.09, 31.09, 31.09, 31.09, 31.09, 31.09]},
|
||||||
|
{SuchSpalte: ["Verteilung im beheizten Bereich ohne Zirkulation"], DatenSpalte: [23.93, 23.93, 23.93, 23.93, 23.93, 23.93, 23.93, 23.93, 23.93, 23.93, 23.93, 23.93, 23.93, 23.93, 23.93]},
|
||||||
|
{SuchSpalte: ["Strangleitung im beheizten Bereich mit Zirkulation"], DatenSpalte: [46.95, 49.04, 50.88, 54.02, 56.59, 58.74, 60.57, 62.14, 63.49, 64.69, 65.74, 71.99, 74.90, 76.55, 77.63]},
|
||||||
|
{SuchSpalte: ["Anbindeleitung im beheizten Bereich mit Zirkulation"], DatenSpalte: [26.86, 26.86, 26.86, 26.86, 26.86, 26.86, 26.86, 26.86, 26.86, 26.86, 26.86, 26.86, 26.86, 26.86, 26.86]},
|
||||||
|
{SuchSpalte: ["Strangleitung im beheizten Bereich ohne Zirkulation"], DatenSpalte: [26.86, 26.86, 26.86, 26.86, 26.86, 26.86, 26.86, 26.86, 26.86, 26.86, 26.86, 26.86, 26.86, 26.86, 26.86]},
|
||||||
|
{SuchSpalte: ["Anbindeleitung im beheizten Bereich ohne Zirkulation"], DatenSpalte: [26.86, 26.86, 26.86, 26.86, 26.86, 26.86, 26.86, 26.86, 26.86, 26.86, 26.86, 26.86, 26.86, 26.86, 26.86]}
|
||||||
|
];
|
||||||
|
|
||||||
|
const WaermeabgabeLeitungenTrinkwarmWasser = funktionEinfacheInterpolation(NettoGrundFlaeche, VerteilSystem, dataset);
|
||||||
|
return WaermeabgabeLeitungenTrinkwarmWasser;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -98,24 +98,17 @@ export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis:
|
|||||||
|
|
||||||
// Endenergieverbrauch
|
// Endenergieverbrauch
|
||||||
// Um den EEV auszurechnen, müssen die Verbräuche zu kWh konvertiert werden.
|
// Um den EEV auszurechnen, müssen die Verbräuche zu kWh konvertiert werden.
|
||||||
let umrechnungsfaktor = 1, primaerfaktor = 1, coe = 1;
|
let brennstoff_1 = { coe: 0, energietraeger: "", einheit: "", umrechnungsfaktor: 0, primaerenergiefaktor: 0 }, brennstoff_2 = { coe: 0, energietraeger: "", einheit: "", umrechnungsfaktor: 0, primaerenergiefaktor: 0 };
|
||||||
let umrechnungsfaktor_1 = 1, primaerfaktor_1 = 1, coe_1 = 1;
|
|
||||||
if (ausweis.brennstoff_1 && ausweis.einheit_1) {
|
if (ausweis.brennstoff_1 && ausweis.einheit_1) {
|
||||||
let result = getHeizwertfaktor(ausweis.brennstoff_1, ausweis.einheit_1);
|
brennstoff_1 = getHeizwertfaktor(ausweis.brennstoff_1, ausweis.einheit_1);
|
||||||
umrechnungsfaktor = result.umrechnungsfaktor
|
|
||||||
primaerfaktor = result.primaerenergiefaktor
|
|
||||||
coe = result.coe
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ausweis.brennstoff_2 && ausweis.einheit_2) {
|
if (ausweis.brennstoff_2 && ausweis.einheit_2) {
|
||||||
let result = getHeizwertfaktor(ausweis.brennstoff_2, ausweis.einheit_2);
|
brennstoff_2 = getHeizwertfaktor(ausweis.brennstoff_2, ausweis.einheit_2);
|
||||||
umrechnungsfaktor_1 = result.umrechnungsfaktor
|
|
||||||
primaerfaktor_1 = result.primaerenergiefaktor
|
|
||||||
coe_1 = result.coe
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let energieVerbrauchGesamt_1 = ((ausweis.verbrauch_1 || 0) + (ausweis.verbrauch_2 || 0) + (ausweis.verbrauch_3 || 0)) * umrechnungsfaktor;
|
let energieVerbrauchGesamt_1 = ((ausweis.verbrauch_1 || 0) + (ausweis.verbrauch_2 || 0) + (ausweis.verbrauch_3 || 0)) * brennstoff_1?.umrechnungsfaktor;
|
||||||
let energieVerbrauchGesamt_2 = ((ausweis.verbrauch_4 || 0) + (ausweis.verbrauch_5 || 0) + (ausweis.verbrauch_6 || 0)) * umrechnungsfaktor_1;
|
let energieVerbrauchGesamt_2 = ((ausweis.verbrauch_4 || 0) + (ausweis.verbrauch_5 || 0) + (ausweis.verbrauch_6 || 0)) * brennstoff_2?.umrechnungsfaktor;
|
||||||
|
|
||||||
let energieVerbrauchWarmwasser_1 = 0;
|
let energieVerbrauchWarmwasser_1 = 0;
|
||||||
let energieVerbrauchWarmwasser_2 = 0;
|
let energieVerbrauchWarmwasser_2 = 0;
|
||||||
@@ -142,13 +135,10 @@ export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis:
|
|||||||
energieVerbrauchWarmwasser_2 = 0;
|
energieVerbrauchWarmwasser_2 = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
let kuehlungsZuschlag_1: number;
|
let kuehlungsZuschlag_1: number = 0, kuehlungsZuschlag_2: number = 0;
|
||||||
let kuehlungsZuschlag_2: number;
|
|
||||||
if (ausweis.wird_gekuehlt) {
|
if (ausweis.wird_gekuehlt) {
|
||||||
kuehlungsZuschlag_1 = energieVerbrauchGesamt_1 * ((ausweis.anteil_kuehlung_1 || 0) / 100);
|
kuehlungsZuschlag_1 = energieVerbrauchGesamt_1 * ((ausweis.anteil_kuehlung_1 || 0) / 100);
|
||||||
kuehlungsZuschlag_2 = energieVerbrauchGesamt_2 * ((ausweis.anteil_kuehlung_2 || 0) / 100);
|
kuehlungsZuschlag_2 = energieVerbrauchGesamt_2 * ((ausweis.anteil_kuehlung_2 || 0) / 100);
|
||||||
} else {
|
|
||||||
kuehlungsZuschlag_1 = kuehlungsZuschlag_2 = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Leerstand wird in Prozent angegeben, muss hier aber in eine Zahl zwischen 0 und 1 umgerechnet werden.
|
// Leerstand wird in Prozent angegeben, muss hier aber in eine Zahl zwischen 0 und 1 umgerechnet werden.
|
||||||
@@ -180,7 +170,7 @@ export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis:
|
|||||||
let endEnergieVerbrauch_1 = (energieVerbrauchHeizungBereinigt_1 + energieVerbrauchWarmwasser_1 + kuehlungsZuschlag_1) / (3 * nutzflaeche);
|
let endEnergieVerbrauch_1 = (energieVerbrauchHeizungBereinigt_1 + energieVerbrauchWarmwasser_1 + kuehlungsZuschlag_1) / (3 * nutzflaeche);
|
||||||
let endEnergieVerbrauch_2 = (energieVerbrauchHeizungBereinigt_2 + energieVerbrauchWarmwasser_2 + kuehlungsZuschlag_2) / (3 * nutzflaeche);
|
let endEnergieVerbrauch_2 = (energieVerbrauchHeizungBereinigt_2 + energieVerbrauchWarmwasser_2 + kuehlungsZuschlag_2) / (3 * nutzflaeche);
|
||||||
|
|
||||||
let energieVerbrauchStrom = ausweis.strom_1 + ausweis.strom_2 + ausweis.strom_3;
|
let energieVerbrauchStrom = (ausweis.strom_1 || 0) + (ausweis.strom_2 || 0) + (ausweis.strom_3 || 0);
|
||||||
let leerstandsZuschlagStrom = leerstand * energieVerbrauchStrom;
|
let leerstandsZuschlagStrom = leerstand * energieVerbrauchStrom;
|
||||||
|
|
||||||
let endEnergieVerbrauchStrom = (energieVerbrauchStrom + leerstandsZuschlagStrom) / (3 * nutzflaeche);
|
let endEnergieVerbrauchStrom = (energieVerbrauchStrom + leerstandsZuschlagStrom) / (3 * nutzflaeche);
|
||||||
@@ -192,19 +182,19 @@ export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis:
|
|||||||
let endEnergieVerbrauchKuehlungsZuschlag_1 = kuehlungsZuschlag_1 / (3 * nutzflaeche);
|
let endEnergieVerbrauchKuehlungsZuschlag_1 = kuehlungsZuschlag_1 / (3 * nutzflaeche);
|
||||||
let endEnergieVerbrauchKuehlungsZuschlag_2 = kuehlungsZuschlag_2 / (3 * nutzflaeche);
|
let endEnergieVerbrauchKuehlungsZuschlag_2 = kuehlungsZuschlag_2 / (3 * nutzflaeche);
|
||||||
|
|
||||||
let primaerEnergieVerbrauch_1 = endEnergieVerbrauch_1 * primaerfaktor;
|
let primaerEnergieVerbrauch_1 = endEnergieVerbrauch_1 * brennstoff_1.primaerenergiefaktor;
|
||||||
let primaerEnergieVerbrauch_2 = endEnergieVerbrauch_2 * primaerfaktor_1;
|
let primaerEnergieVerbrauch_2 = endEnergieVerbrauch_2 * brennstoff_2.primaerenergiefaktor;
|
||||||
|
|
||||||
let primaerEnergieVerbrauchLeerstandsZuschlag = endEnergieVerbrauchLeerstandsZuschlag * primaerfaktor;
|
let primaerEnergieVerbrauchLeerstandsZuschlag = endEnergieVerbrauchLeerstandsZuschlag * brennstoff_1.primaerenergiefaktor;
|
||||||
let primaerEnergieVerbrauchKuehlungsZuschlag_1 = endEnergieVerbrauchKuehlungsZuschlag_1 * primaerfaktor;
|
let primaerEnergieVerbrauchKuehlungsZuschlag_1 = endEnergieVerbrauchKuehlungsZuschlag_1 * brennstoff_1.primaerenergiefaktor;
|
||||||
let primaerEnergieVerbrauchKuehlungsZuschlag_2 = endEnergieVerbrauchKuehlungsZuschlag_2 * primaerfaktor_1;
|
let primaerEnergieVerbrauchKuehlungsZuschlag_2 = endEnergieVerbrauchKuehlungsZuschlag_2 * brennstoff_2.primaerenergiefaktor;
|
||||||
|
|
||||||
let co2Emissionen_1 = endEnergieVerbrauch_1 * coe;
|
let co2Emissionen_1 = endEnergieVerbrauch_1 * brennstoff_1.coe;
|
||||||
let co2Emissionen_2 = endEnergieVerbrauch_2 * coe_1;
|
let co2Emissionen_2 = endEnergieVerbrauch_2 * brennstoff_2.coe;
|
||||||
|
|
||||||
let co2EmissionenLeerstandsZuschlag = endEnergieVerbrauchLeerstandsZuschlag * coe;
|
let co2EmissionenLeerstandsZuschlag = endEnergieVerbrauchLeerstandsZuschlag * brennstoff_1.coe;
|
||||||
let co2EmissionenKuehlungsZuschlag_1 = endEnergieVerbrauchKuehlungsZuschlag_1 * coe;
|
let co2EmissionenKuehlungsZuschlag_1 = endEnergieVerbrauchKuehlungsZuschlag_1 * brennstoff_1.coe;
|
||||||
let co2EmissionenKuehlungsZuschlag_2 = endEnergieVerbrauchKuehlungsZuschlag_2 * coe_1;
|
let co2EmissionenKuehlungsZuschlag_2 = endEnergieVerbrauchKuehlungsZuschlag_2 * brennstoff_2.coe;
|
||||||
|
|
||||||
let endEnergieVerbrauchGesamt = endEnergieVerbrauch_1 + endEnergieVerbrauch_2 + endEnergieVerbrauchLeerstandsZuschlag;
|
let endEnergieVerbrauchGesamt = endEnergieVerbrauch_1 + endEnergieVerbrauch_2 + endEnergieVerbrauchLeerstandsZuschlag;
|
||||||
let primaerEnergieVerbrauchGesamt = primaerEnergieVerbrauch_1 + primaerEnergieVerbrauch_2 + primaerEnergieVerbrauchLeerstandsZuschlag + primaerEnergieVerbrauchStrom;
|
let primaerEnergieVerbrauchGesamt = primaerEnergieVerbrauch_1 + primaerEnergieVerbrauch_2 + primaerEnergieVerbrauchLeerstandsZuschlag + primaerEnergieVerbrauchStrom;
|
||||||
@@ -214,26 +204,22 @@ export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis:
|
|||||||
|
|
||||||
// Return all the steps that this function includes for debugging as a json object
|
// Return all the steps that this function includes for debugging as a json object
|
||||||
return {
|
return {
|
||||||
umrechnungsfaktor : umrechnungsfaktor,
|
brennstoff_1,
|
||||||
primaerfaktor : primaerfaktor,
|
brennstoff_2,
|
||||||
coe : coe,
|
|
||||||
umrechnungsfaktor_1 : umrechnungsfaktor_1,
|
|
||||||
primaerfaktor_1 : primaerfaktor_1,
|
|
||||||
coe_1 : coe_1,
|
|
||||||
kuehlungsZuschlag_1 : Math.round(kuehlungsZuschlag_1),
|
kuehlungsZuschlag_1 : Math.round(kuehlungsZuschlag_1),
|
||||||
kuehlungsZuschlag_2: Math.round(kuehlungsZuschlag_2),
|
kuehlungsZuschlag_2: Math.round(kuehlungsZuschlag_2),
|
||||||
durchschnittsKlimafaktor : Math.round(durchschnittsKlimafaktor,2),
|
durchschnittsKlimafaktor : Math.round(durchschnittsKlimafaktor * 100) / 100,
|
||||||
Klimafaktor_1 : klimafaktoren[0],
|
Klimafaktor_1 : klimafaktoren[0],
|
||||||
Klimafaktor_2 : klimafaktoren[1],
|
Klimafaktor_2 : klimafaktoren[1],
|
||||||
Klimafaktor_3 : klimafaktoren[2],
|
Klimafaktor_3 : klimafaktoren[2],
|
||||||
anteil_heizung_1: 1 - ((ausweis.anteil_warmwasser_1 || 0) / 100),
|
anteil_heizung_1: 1 - ((ausweis.anteil_warmwasser_1 || 0) / 100),
|
||||||
anteil_heizung_2: 1 - ((ausweis.anteil_warmwasser_2 || 0) / 100),
|
anteil_heizung_2: 1 - ((ausweis.anteil_warmwasser_2 || 0) / 100),
|
||||||
verbrauch_1_kwh: ausweis.verbrauch_1 * umrechnungsfaktor,
|
verbrauch_1_kwh: (ausweis.verbrauch_1 || 0) * brennstoff_1.umrechnungsfaktor,
|
||||||
verbrauch_2_kwh: ausweis.verbrauch_2 * umrechnungsfaktor,
|
verbrauch_2_kwh: (ausweis.verbrauch_2 || 0) * brennstoff_1.umrechnungsfaktor,
|
||||||
verbrauch_3_kwh: ausweis.verbrauch_3 * umrechnungsfaktor,
|
verbrauch_3_kwh: (ausweis.verbrauch_3 || 0) * brennstoff_1.umrechnungsfaktor,
|
||||||
verbrauch_4_kwh: ausweis.verbrauch_4 * umrechnungsfaktor_1,
|
verbrauch_4_kwh: (ausweis.verbrauch_4 || 0) * brennstoff_2.umrechnungsfaktor,
|
||||||
verbrauch_5_kwh: ausweis.verbrauch_5 * umrechnungsfaktor_1,
|
verbrauch_5_kwh: (ausweis.verbrauch_5 || 0) * brennstoff_2.umrechnungsfaktor,
|
||||||
verbrauch_6_kwh: ausweis.verbrauch_6 * umrechnungsfaktor_1,
|
verbrauch_6_kwh: (ausweis.verbrauch_6 || 0) * brennstoff_2.umrechnungsfaktor,
|
||||||
klimafaktoren : klimafaktoren,
|
klimafaktoren : klimafaktoren,
|
||||||
nutzflaeche : Math.round(nutzflaeche),
|
nutzflaeche : Math.round(nutzflaeche),
|
||||||
leerstand : leerstand,
|
leerstand : leerstand,
|
||||||
@@ -250,12 +236,12 @@ export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis:
|
|||||||
energieVerbrauchWarmwasser_2: Math.round(energieVerbrauchWarmwasser_2),
|
energieVerbrauchWarmwasser_2: Math.round(energieVerbrauchWarmwasser_2),
|
||||||
energieVerbrauchHeizung_1: energieVerbrauchHeizung_1,
|
energieVerbrauchHeizung_1: energieVerbrauchHeizung_1,
|
||||||
energieVerbrauchHeizung_2: energieVerbrauchHeizung_2,
|
energieVerbrauchHeizung_2: energieVerbrauchHeizung_2,
|
||||||
anteil_warmwasser_1: ausweis.anteil_warmwasser_1 / 100,
|
anteil_warmwasser_1: (ausweis.anteil_warmwasser_1 || 0) / 100,
|
||||||
anteil_warmwasser_2: ausweis.anteil_warmwasser_2 / 100,
|
anteil_warmwasser_2: (ausweis.anteil_warmwasser_2 || 0) / 100,
|
||||||
energieVerbrauchHeizungBereinigt_1: Math.round(energieVerbrauchHeizungBereinigt_1),
|
energieVerbrauchHeizungBereinigt_1: Math.round(energieVerbrauchHeizungBereinigt_1),
|
||||||
energieVerbrauchHeizungBereinigt_2: Math.round(energieVerbrauchHeizungBereinigt_2),
|
energieVerbrauchHeizungBereinigt_2: Math.round(energieVerbrauchHeizungBereinigt_2),
|
||||||
durchschnittsEnergieVerbrauchHeizungBereingt: Math.round(durchschnittsEnergieVerbrauchHeizungBereingt),
|
durchschnittsEnergieVerbrauchHeizungBereingt: Math.round(durchschnittsEnergieVerbrauchHeizungBereingt),
|
||||||
faktorDurchschnittsEnergieVerbrauchHeizungBereinigt: Math.round(faktorDurchschnittsEnergieVerbrauchHeizungBereinigt,3),
|
faktorDurchschnittsEnergieVerbrauchHeizungBereinigt: Math.round(faktorDurchschnittsEnergieVerbrauchHeizungBereinigt * 1000) / 1000,
|
||||||
endEnergieVerbrauch_1: Math.round(endEnergieVerbrauch_1),
|
endEnergieVerbrauch_1: Math.round(endEnergieVerbrauch_1),
|
||||||
endEnergieVerbrauch_2: Math.round(endEnergieVerbrauch_2),
|
endEnergieVerbrauch_2: Math.round(endEnergieVerbrauch_2),
|
||||||
energieVerbrauchStrom: energieVerbrauchStrom,
|
energieVerbrauchStrom: energieVerbrauchStrom,
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import { AufnahmeClient, ObjektClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
|
import { AufnahmeClient, BedarfsausweisWohnenClient, ObjektClient, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
|
||||||
import { Enums } from "@ibcornelsen/database/client";
|
import { Enums } from "@ibcornelsen/database/client";
|
||||||
import moment from "moment";
|
import moment from "moment";
|
||||||
|
|
||||||
export function getEmpfehlungen(ausweis: VerbrauchsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient): {
|
export function getEmpfehlungen(ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient): {
|
||||||
title: string,
|
title: string,
|
||||||
description: string,
|
description: string,
|
||||||
anlagenteil: string,
|
anlagenteil: string,
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ export function verbrauchsausweisWohnenImportTranslate(ausweis: Record<string, a
|
|||||||
plz: ausweis.objekt_plz,
|
plz: ausweis.objekt_plz,
|
||||||
ort: ausweis.objekt_ort,
|
ort: ausweis.objekt_ort,
|
||||||
uid: faker.string.uuid(),
|
uid: faker.string.uuid(),
|
||||||
gebaeude_bilder: [],
|
bilder: [],
|
||||||
latitude: null,
|
latitude: null,
|
||||||
longitude: null,
|
longitude: null,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ export enum VALID_UUID_PREFIXES {
|
|||||||
"inv" = "Rechnung",
|
"inv" = "Rechnung",
|
||||||
"tkt" = "Ticket",
|
"tkt" = "Ticket",
|
||||||
"pln" = "Gebäude Plan",
|
"pln" = "Gebäude Plan",
|
||||||
|
"gnw" = "GEG Nachweis Wohnen"
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -29,6 +30,7 @@ export const PRICES: Record<Enums.Ausweisart, [number, number, number]> = {
|
|||||||
VerbrauchsausweisWohnen: [65, 95, 180],
|
VerbrauchsausweisWohnen: [65, 95, 180],
|
||||||
VerbrauchsausweisGewerbe: [95, 125, 360],
|
VerbrauchsausweisGewerbe: [95, 125, 360],
|
||||||
BedarfsausweisGewerbe: [500, 700, 1000],
|
BedarfsausweisGewerbe: [500, 700, 1000],
|
||||||
|
GEGNachweisWohnen: [500, 500, 500]
|
||||||
};
|
};
|
||||||
|
|
||||||
export const SERVICES: Record<
|
export const SERVICES: Record<
|
||||||
@@ -60,3 +62,7 @@ export const SERVICES: Record<
|
|||||||
Telefonberatung: 0,
|
Telefonberatung: 0,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const BASE_URI = process.env.NODE_ENV == "production" ? "https://online-energieausweis.org" : "http://localhost:3000";
|
||||||
|
|
||||||
|
export const LEX_OFFICE_API_KEY = process.env.NODE_ENV == "production" ? "iwQLCU_ZAq6bVV7hmR8RO8MiC8Q" : "znjmkmbA3Hbx9dC7wdKp7TnOf1pcRl_tCUwEBZys7bj-QRPG"
|
||||||
12
src/lib/helpers.ts
Normal file
12
src/lib/helpers.ts
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
export function omit<T extends Record<string, any>, K extends keyof T>(
|
||||||
|
obj: T,
|
||||||
|
keys: K[]
|
||||||
|
): Omit<T, K> {
|
||||||
|
const result: Partial<T> = {};
|
||||||
|
for (const key of Object.keys(obj) as (keyof T)[]) {
|
||||||
|
if (!keys.includes(key as K)) {
|
||||||
|
result[key] = obj[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result as Omit<T, K>;
|
||||||
|
}
|
||||||
18
src/lib/helpers/window.ts
Normal file
18
src/lib/helpers/window.ts
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
export function openWindowWithPost(url: string, data: Record<string, any>) {
|
||||||
|
var form = document.createElement("form");
|
||||||
|
form.target = "_blank";
|
||||||
|
form.method = "POST";
|
||||||
|
form.action = url;
|
||||||
|
form.style.display = "none";
|
||||||
|
|
||||||
|
for (var key in data) {
|
||||||
|
var input = document.createElement("input");
|
||||||
|
input.type = "hidden";
|
||||||
|
input.name = key;
|
||||||
|
input.value = data[key];
|
||||||
|
form.appendChild(input);
|
||||||
|
}
|
||||||
|
document.body.appendChild(form);
|
||||||
|
form.submit();
|
||||||
|
document.body.removeChild(form);
|
||||||
|
}
|
||||||
11
src/lib/mail.ts
Normal file
11
src/lib/mail.ts
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
import * as nodemailer from "nodemailer";
|
||||||
|
|
||||||
|
export const transport = nodemailer.createTransport({
|
||||||
|
host: "smtp.ionos.de",
|
||||||
|
port: 465,
|
||||||
|
secure: true,
|
||||||
|
auth: {
|
||||||
|
user: "info@online-energieausweis.org",
|
||||||
|
pass: "Katendeich5a2024!",
|
||||||
|
},
|
||||||
|
});
|
||||||
@@ -4,10 +4,16 @@ import { prisma } from "@ibcornelsen/database/server";
|
|||||||
import { APIError, TypesafeAPIContextWithRequest } from "astro-typesafe-api/server";
|
import { APIError, TypesafeAPIContextWithRequest } from "astro-typesafe-api/server";
|
||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
|
|
||||||
export async function authorizationMiddleware(input: any, context: TypesafeAPIContextWithRequest<any>) {
|
export async function checkAuthorizationHeaderNoThrow(authorization: string): Promise<ReturnType<typeof checkAuthorizationHeader> | null> {
|
||||||
const authorization: string | undefined = context.request.headers.get("Authorization");
|
try {
|
||||||
|
return await checkAuthorizationHeader(authorization)
|
||||||
|
} catch(e) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!context.request.headers.has("Authorization") || !authorization) {
|
export async function checkAuthorizationHeader(authorization: string) {
|
||||||
|
if (!authorization) {
|
||||||
throw new APIError({
|
throw new APIError({
|
||||||
code: "BAD_REQUEST",
|
code: "BAD_REQUEST",
|
||||||
message: "Request is missing an 'Authorization' header."
|
message: "Request is missing an 'Authorization' header."
|
||||||
@@ -81,6 +87,10 @@ export async function authorizationMiddleware(input: any, context: TypesafeAPICo
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function authorizationMiddleware(input: any, ctx: TypesafeAPIContextWithRequest<any>) {
|
||||||
|
return await checkAuthorizationHeader(ctx.request.headers.get("Authorization"));
|
||||||
|
}
|
||||||
|
|
||||||
export async function maybeAuthorizationMiddleware(input: any, ctx: TypesafeAPIContextWithRequest<any>) {
|
export async function maybeAuthorizationMiddleware(input: any, ctx: TypesafeAPIContextWithRequest<any>) {
|
||||||
try {
|
try {
|
||||||
return authorizationMiddleware(input, ctx)
|
return authorizationMiddleware(input, ctx)
|
||||||
@@ -91,4 +101,20 @@ export async function maybeAuthorizationMiddleware(input: any, ctx: TypesafeAPIC
|
|||||||
|
|
||||||
export const authorizationHeaders = {
|
export const authorizationHeaders = {
|
||||||
Authorization: z.string()
|
Authorization: z.string()
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function adminMiddleware(input: any, ctx: TypesafeAPIContextWithRequest<any>) {
|
||||||
|
try {
|
||||||
|
const user = await authorizationMiddleware(input, ctx)
|
||||||
|
|
||||||
|
if (user.rolle === "ADMIN") {
|
||||||
|
return user
|
||||||
|
}
|
||||||
|
} catch(e) {
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new APIError({
|
||||||
|
code: "FORBIDDEN",
|
||||||
|
"message": "Diese Route ist für Admins vorbehalten."
|
||||||
|
})
|
||||||
}
|
}
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
<div class="flex flex-row justify-between">
|
|
||||||
<h1 class="underline font-bold">Datenblatt Energieausweis</h1>
|
|
||||||
<p><span class="font-bold">Ausweis ID:</span> 1225432</p>
|
|
||||||
</div>
|
|
||||||
<h2 class="font-bold">Gebäudedaten</h2>
|
|
||||||
<p>Adresse: Beispielstraße 15, 22587 Beispielnese</p>
|
|
||||||
|
|
||||||
<div class="flex flex-row justify-between">
|
|
||||||
<div class="flex flex-row gap-2">
|
|
||||||
<input type="checkbox">
|
|
||||||
<p>Neubau</p>
|
|
||||||
</div>
|
|
||||||
<div class="flex flex-row gap-2">
|
|
||||||
<input type="checkbox">
|
|
||||||
<p>Vermietung/Verkauf</p>
|
|
||||||
</div>
|
|
||||||
<div class="flex flex-row gap-2">
|
|
||||||
<input type="checkbox">
|
|
||||||
<p>Modernisierung</p>
|
|
||||||
</div>
|
|
||||||
<div class="flex flex-row gap-2">
|
|
||||||
<input type="checkbox">
|
|
||||||
<p>Sonstiges</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<table>
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<td class="font-bold">Gebäudetyp</td>
|
|
||||||
<td class="font-bold">Wohnfläche</td>
|
|
||||||
<td class="font-bold">Leerstand</td>
|
|
||||||
<td class="font-bold">Wohnungen</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Doppelhaushälfte</td>
|
|
||||||
<td>DIN Wohnfläche innen 141m2</td>
|
|
||||||
<td>0%</td>
|
|
||||||
<td>2</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td></td>
|
|
||||||
<td></td>
|
|
||||||
<td>Dachgeschoss</td>
|
|
||||||
<td>Keller</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td></td>
|
|
||||||
<td></td>
|
|
||||||
<td>unbeheizt</td>
|
|
||||||
<td>nein</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<h2 class="font-bold">Verbrauch</h2>
|
|
||||||
|
|
||||||
<table>
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<td></td>
|
|
||||||
<td>Von: 01.01.2014</td>
|
|
||||||
<td>Von: 01.01.2015</td>
|
|
||||||
<td>Von: 01.01.2016</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td></td>
|
|
||||||
<td>Bis: 31.12.2014</td>
|
|
||||||
<td>Bis: 31.12.2015</td>
|
|
||||||
<td>Bis: 31.12.2016</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Heizöl EL</td>
|
|
||||||
<td>1947 l</td>
|
|
||||||
<td>1907 l</td>
|
|
||||||
<td>2248 l</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Brennholz</td>
|
|
||||||
<td>6 m3</td>
|
|
||||||
<td>6 m3</td>
|
|
||||||
<td>6 m3</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<p>Warmwasseranteil: 18%</p>
|
|
||||||
BIN
src/lib/pdf/images/aussteller.png
Normal file
BIN
src/lib/pdf/images/aussteller.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 144 KiB |
9
src/lib/pdf/images/aussteller.svg
Normal file
9
src/lib/pdf/images/aussteller.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 39 KiB |
BIN
src/lib/pdf/images/stempel-unterschrift.png
Normal file
BIN
src/lib/pdf/images/stempel-unterschrift.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 503 KiB |
424
src/lib/pdf/pdfDatenblattVerbrauchsausweisGewerbe.ts
Normal file
424
src/lib/pdf/pdfDatenblattVerbrauchsausweisGewerbe.ts
Normal file
@@ -0,0 +1,424 @@
|
|||||||
|
import { AufnahmeClient, BenutzerClient, ObjektClient, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
|
||||||
|
import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js";
|
||||||
|
import * as fs from "fs"
|
||||||
|
import { PDFDocument, rgb, StandardFonts, TextAlignment } from "pdf-lib";
|
||||||
|
import { xml2pdf } from "./elements/xml2pdf.js";
|
||||||
|
import moment from "moment";
|
||||||
|
import { Heizungsstatus } from "@ibcornelsen/database/server";
|
||||||
|
import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.js";
|
||||||
|
|
||||||
|
/* -------------------------------- Pdf Tools ------------------------------- */
|
||||||
|
|
||||||
|
export async function pdfDatenblattVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient, objekt: ObjektClient, benutzer: BenutzerClient) {
|
||||||
|
const VerbrauchsausweisWohnenGEG2024PDF = fs.readFileSync(new URL("./templates/Leerseite_Datenblatt.pdf", import.meta.url), "base64");
|
||||||
|
const pdf = await PDFDocument.load(VerbrauchsausweisWohnenGEG2024PDF)
|
||||||
|
const pages = pdf.getPages()
|
||||||
|
|
||||||
|
// const template = VerbrauchsausweisWohnen2016Template as Template;
|
||||||
|
|
||||||
|
const berechnungen = await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis, aufnahme, objekt);
|
||||||
|
|
||||||
|
const height = pages[0].getHeight()
|
||||||
|
const width = pages[0].getWidth()
|
||||||
|
|
||||||
|
const font = await pdf.embedFont(StandardFonts.Helvetica)
|
||||||
|
const bold = await pdf.embedFont(StandardFonts.HelveticaBold)
|
||||||
|
|
||||||
|
const form = pdf.getForm()
|
||||||
|
form.updateFieldAppearances(font)
|
||||||
|
|
||||||
|
const marginX = 60;
|
||||||
|
const marginY = 150;
|
||||||
|
|
||||||
|
benutzer = benutzer || {
|
||||||
|
vorname: "Max",
|
||||||
|
name: "Mustermann",
|
||||||
|
adresse: "Musterstraße 123",
|
||||||
|
plz: "12345",
|
||||||
|
ort: "Beispielhausen"
|
||||||
|
};
|
||||||
|
|
||||||
|
const translateHeizungsstatus: Record<Heizungsstatus, string> = {
|
||||||
|
BEHEIZT: "beheizt",
|
||||||
|
NICHT_VORHANDEN: "nicht vorhanden",
|
||||||
|
UNBEHEIZT: "unbeheizt"
|
||||||
|
}
|
||||||
|
|
||||||
|
const innerWidth = pages[0].getWidth() - marginX * 2;
|
||||||
|
|
||||||
|
const stromverbrauchEnthaelt = []
|
||||||
|
|
||||||
|
if (ausweis.stromverbrauch_enthaelt_beleuchtung) {
|
||||||
|
stromverbrauchEnthaelt.push("Beleuchtung")
|
||||||
|
}
|
||||||
|
if (ausweis.stromverbrauch_enthaelt_heizung) {
|
||||||
|
stromverbrauchEnthaelt.push("Heizung")
|
||||||
|
}
|
||||||
|
if (ausweis.stromverbrauch_enthaelt_kuehlung) {
|
||||||
|
stromverbrauchEnthaelt.push("Kühlung")
|
||||||
|
}
|
||||||
|
if (ausweis.stromverbrauch_enthaelt_lueftung) {
|
||||||
|
stromverbrauchEnthaelt.push("Lüftung")
|
||||||
|
}
|
||||||
|
if (ausweis.stromverbrauch_enthaelt_warmwasser) {
|
||||||
|
stromverbrauchEnthaelt.push("Warmwasser")
|
||||||
|
}
|
||||||
|
if (ausweis.stromverbrauch_enthaelt_sonstige) {
|
||||||
|
stromverbrauchEnthaelt.push("Sonstige")
|
||||||
|
}
|
||||||
|
|
||||||
|
const layout = xml2pdf(`<layout height="${pages[0].getHeight()}" width="${pages[0].getWidth()}" marginTop="150" marginLeft="${marginX}" marginRight="${marginX}">
|
||||||
|
<text size="12" lineHeight="14">${benutzer.vorname} ${benutzer.name}</text>
|
||||||
|
<text size="12" lineHeight="14">${benutzer.adresse}</text>
|
||||||
|
<text size="12" lineHeight="14">${benutzer.plz} ${benutzer.ort}</text>
|
||||||
|
<flex direction="row" justify="space-between" marginTop="55" width="${innerWidth}">
|
||||||
|
<text size="12" font="bold">Datenblatt Energieausweis</text>
|
||||||
|
<text size="12">Ausweis ID: ${ausweis.uid}</text>
|
||||||
|
</flex>
|
||||||
|
<text size="12" lineHeight="14" font="bold" marginTop="10">Gebäudedaten</text>
|
||||||
|
<text size="12" lineHeight="14">Adresse: ${objekt.adresse}, ${objekt.plz} ${objekt.ort}</text>
|
||||||
|
|
||||||
|
<flex direction="row" justify="space-between" width="${innerWidth}" marginTop="25">
|
||||||
|
<flex direction="row" gap="5" align="center">
|
||||||
|
<checkbox width="8" height="8" checked="${ausweis.ausstellgrund === "Neubau"}"></checkbox>
|
||||||
|
<text size="12">Neubau</text>
|
||||||
|
</flex>
|
||||||
|
<flex direction="row" gap="5" align="center">
|
||||||
|
<checkbox width="8" height="8" checked="${ausweis.ausstellgrund === "Verkauf" || ausweis.ausstellgrund === "Vermietung"}"></checkbox>
|
||||||
|
<text size="12">Vermietung/Verkauf</text>
|
||||||
|
</flex>
|
||||||
|
<flex direction="row" gap="5" align="center">
|
||||||
|
<checkbox width="8" height="8" checked="${ausweis.ausstellgrund === "Modernisierung"}"></checkbox>
|
||||||
|
<text size="12">Modernisierung</text>
|
||||||
|
</flex>
|
||||||
|
<flex direction="row" gap="5" align="center">
|
||||||
|
<checkbox width="8" height="8" checked="${ausweis.ausstellgrund === "Sonstiges"}"></checkbox>
|
||||||
|
<text size="12">Sonstiges</text>
|
||||||
|
</flex>
|
||||||
|
</flex>
|
||||||
|
|
||||||
|
<flex direction="row" marginTop="25" gap="15">
|
||||||
|
<flex direction="column" width="${(innerWidth) / 2 - 7.5}">
|
||||||
|
<flex direction="row" align="center" justify="space-between" width="${(innerWidth) / 2 - 7.5}">
|
||||||
|
<text size="12" lineHeight="14">Baujahr Gebäude:</text>
|
||||||
|
<text size="12" lineHeight="14">${aufnahme.baujahr_gebaeude.join(", ")}</text>
|
||||||
|
</flex>
|
||||||
|
<flex direction="row" align="center" justify="space-between" width="${(innerWidth) / 2 - 7.5}">
|
||||||
|
<text size="12" lineHeight="14">Baujahr Heizung:</text>
|
||||||
|
<text size="12" lineHeight="14">${aufnahme.baujahr_heizung.join(", ")}</text>
|
||||||
|
</flex>
|
||||||
|
<flex direction="row" align="center" justify="space-between" width="${(innerWidth) / 2 - 7.5}">
|
||||||
|
<text size="12" lineHeight="14">Nutzfläche:</text>
|
||||||
|
<text size="12" lineHeight="14">Beheizte Nutzfläche ${aufnahme.nutzflaeche} m²</text>
|
||||||
|
</flex>
|
||||||
|
<flex direction="row" align="center" justify="space-between" width="${(innerWidth) / 2 - 7.5}">
|
||||||
|
<text size="12" lineHeight="14">Lüftungskonzept:</text>
|
||||||
|
<text size="12" lineHeight="14">${aufnahme.lueftung}</text>
|
||||||
|
</flex>
|
||||||
|
<flex direction="row" align="center" justify="space-between" width="${(innerWidth) / 2 - 7.5}">
|
||||||
|
<text size="12" lineHeight="14">Gebäudetyp:</text>
|
||||||
|
<text size="12" lineHeight="14">${aufnahme.gebaeudetyp}</text>
|
||||||
|
</flex>
|
||||||
|
</flex>
|
||||||
|
<flex direction="column" width="${(innerWidth) / 2 - 7.5}">
|
||||||
|
<flex direction="row" align="center" justify="space-between" width="${(innerWidth) / 2 - 7.5}">
|
||||||
|
<text size="12" lineHeight="14">Dachgeschoss:</text>
|
||||||
|
<text size="12" lineHeight="14">${translateHeizungsstatus[aufnahme.dachgeschoss || "NICHT_VORHANDEN"]}</text>
|
||||||
|
</flex>
|
||||||
|
<flex direction="row" align="center" justify="space-between" width="${(innerWidth) / 2 - 7.5}">
|
||||||
|
<text size="12" lineHeight="14">Keller:</text>
|
||||||
|
<text size="12" lineHeight="14">${translateHeizungsstatus[aufnahme.keller || "NICHT_VORHANDEN"]}</text>
|
||||||
|
</flex>
|
||||||
|
<flex direction="row" align="center" justify="space-between" width="${(innerWidth) / 2 - 7.5}">
|
||||||
|
<text size="12" lineHeight="14">Baujahr Klimaanlage:</text>
|
||||||
|
<text size="12" lineHeight="14">${aufnahme.baujahr_klima.join(", ")}</text>
|
||||||
|
</flex>
|
||||||
|
<flex direction="row" align="center" justify="space-between" width="${(innerWidth) / 2 - 7.5}">
|
||||||
|
<text size="12" lineHeight="14">Anlage zur Kühlung:</text>
|
||||||
|
<text size="12" lineHeight="14">${ausweis.wird_gekuehlt ? "Ja" : "Nein"}</text>
|
||||||
|
</flex>
|
||||||
|
<flex direction="row" align="center" justify="space-between" width="${(innerWidth) / 2 - 7.5}">
|
||||||
|
<text size="12" lineHeight="14">Leerstand:</text>
|
||||||
|
<text size="12" lineHeight="14">${aufnahme.leerstand || 0}%</text>
|
||||||
|
</flex>
|
||||||
|
</flex>
|
||||||
|
</flex>
|
||||||
|
|
||||||
|
<text size="12" lineHeight="14" font="bold" marginTop="25">Verbrauch</text>
|
||||||
|
|
||||||
|
<flex direction="row" justify="space-between" align="center" width="${(innerWidth)}" marginTop="5">
|
||||||
|
<flex direction="column" gap="4">
|
||||||
|
<text></text>
|
||||||
|
<text></text>
|
||||||
|
<text size="12">Von: ${moment(ausweis.startdatum).format("DD.MM.YYYY")}</text>
|
||||||
|
<text size="12">Von: ${moment(ausweis.startdatum).add("1", "years").format("DD.MM.YYYY")}</text>
|
||||||
|
<text size="12">Von: ${moment(ausweis.startdatum).add("2", "years").format("DD.MM.YYYY")}</text>
|
||||||
|
</flex>
|
||||||
|
<flex direction="column" gap="4">
|
||||||
|
<text></text>
|
||||||
|
<text></text>
|
||||||
|
<text size="12">Bis: ${moment(ausweis.startdatum).add("1", "year").format("DD.MM.YYYY")}</text>
|
||||||
|
<text size="12">Bis: ${moment(ausweis.startdatum).add("2", "years").format("DD.MM.YYYY")}</text>
|
||||||
|
<text size="12">Bis: ${moment(ausweis.startdatum).add("3", "years").format("DD.MM.YYYY")}</text>
|
||||||
|
</flex>
|
||||||
|
<flex direction="column" gap="4">
|
||||||
|
<text></text>
|
||||||
|
<text size="12" font="bold">${aufnahme.brennstoff_1}</text>
|
||||||
|
<text size="12">${ausweis.verbrauch_1} ${ausweis.einheit_1}</text>
|
||||||
|
<text size="12">${ausweis.verbrauch_2} ${ausweis.einheit_1}</text>
|
||||||
|
<text size="12">${ausweis.verbrauch_3} ${ausweis.einheit_1}</text>
|
||||||
|
</flex>
|
||||||
|
<flex direction="column" gap="4">
|
||||||
|
<text size="12">zusätzliche Heizquelle</text>
|
||||||
|
<text size="12" font="bold">${aufnahme.brennstoff_2 || ""}</text>
|
||||||
|
<text size="12">${ausweis.verbrauch_4 || ""} ${ausweis.einheit_2 || ""}</text>
|
||||||
|
<text size="12">${ausweis.verbrauch_5 || ""} ${ausweis.einheit_2 || ""}</text>
|
||||||
|
<text size="12">${ausweis.verbrauch_6 || ""} ${ausweis.einheit_2 || ""}</text>
|
||||||
|
</flex>
|
||||||
|
</flex>
|
||||||
|
|
||||||
|
<text size="12" lineHeight="14" font="bold" marginTop="25">Stromverbrauch</text>
|
||||||
|
|
||||||
|
<flex direction="row" justify="space-between" align="center" width="${(innerWidth)}" marginTop="5">
|
||||||
|
<flex direction="column" gap="4">
|
||||||
|
<text size="12">Von: ${moment(ausweis.startdatum).format("DD.MM.YYYY")}</text>
|
||||||
|
<text size="12">Von: ${moment(ausweis.startdatum).add("1", "years").format("DD.MM.YYYY")}</text>
|
||||||
|
<text size="12">Von: ${moment(ausweis.startdatum).add("2", "years").format("DD.MM.YYYY")}</text>
|
||||||
|
</flex>
|
||||||
|
<flex direction="column" gap="4">
|
||||||
|
<text size="12">Bis: ${moment(ausweis.startdatum).add("1", "year").format("DD.MM.YYYY")}</text>
|
||||||
|
<text size="12">Bis: ${moment(ausweis.startdatum).add("2", "years").format("DD.MM.YYYY")}</text>
|
||||||
|
<text size="12">Bis: ${moment(ausweis.startdatum).add("3", "years").format("DD.MM.YYYY")}</text>
|
||||||
|
</flex>
|
||||||
|
<flex direction="column" gap="4">
|
||||||
|
<text size="12">${ausweis.strom_1}</text>
|
||||||
|
<text size="12">${ausweis.strom_2}</text>
|
||||||
|
<text size="12">${ausweis.strom_3}</text>
|
||||||
|
</flex>
|
||||||
|
</flex>
|
||||||
|
<text size="12">Im Stromverbrauch enthalten: ${stromverbrauchEnthaelt.join(", ")}</text>
|
||||||
|
|
||||||
|
<text size="12" marginTop="5">Warmwasseranteil: ${ausweis.anteil_warmwasser_1}%</text>
|
||||||
|
</layout>`, {
|
||||||
|
"default": font,
|
||||||
|
bold: bold
|
||||||
|
})
|
||||||
|
|
||||||
|
const layoutPage2 = xml2pdf(`<layout height="${pages[1].getHeight()}" width="${pages[1].getWidth()}" marginTop="150" marginLeft="60" marginRight="60">
|
||||||
|
<text size="12" font="bold">Stand der Technik:</text>
|
||||||
|
<text size="12" marginTop="15">Heizungsanlage</text>
|
||||||
|
<flex direction="row" justify="space-between" width="${pages[1].getWidth() - 120}" marginTop="15">
|
||||||
|
<flex direction="column" gap="4">
|
||||||
|
<flex direction="row" gap="4" align="center">
|
||||||
|
<checkbox width="8" height="8" checked="${aufnahme.zentralheizung || false}"></checkbox>
|
||||||
|
<text size="12">Zentralheizung</text>
|
||||||
|
</flex>
|
||||||
|
<flex direction="row" gap="4" align="center">
|
||||||
|
<checkbox width="8" height="8" checked="${aufnahme.einzelofen || false}"></checkbox>
|
||||||
|
<text size="12">Einzelöfen</text>
|
||||||
|
</flex>
|
||||||
|
<flex direction="row" gap="4" align="center">
|
||||||
|
<checkbox width="8" height="8" checked="${aufnahme.durchlauf_erhitzer || false}"></checkbox>
|
||||||
|
<text size="12">Durchlauferhitzer</text>
|
||||||
|
</flex>
|
||||||
|
<flex direction="row" gap="4" align="center">
|
||||||
|
<checkbox width="8" height="8" checked="${aufnahme.standard_kessel || false}"></checkbox>
|
||||||
|
<text size="12">Standardkessel</text>
|
||||||
|
</flex>
|
||||||
|
</flex>
|
||||||
|
<flex direction="column" gap="4">
|
||||||
|
<flex direction="row" gap="4" align="center">
|
||||||
|
<checkbox width="8" height="8" checked="${aufnahme.solarsystem_warmwasser || false}"></checkbox>
|
||||||
|
<text size="12">Solarsystem für Warmwasser</text>
|
||||||
|
</flex>
|
||||||
|
<flex direction="row" gap="4" align="center">
|
||||||
|
<checkbox width="8" height="8" checked="${aufnahme.waermepumpe || false}"></checkbox>
|
||||||
|
<text size="12">Wärmepumpe</text>
|
||||||
|
</flex>
|
||||||
|
<flex direction="row" gap="4" align="center">
|
||||||
|
<checkbox width="8" height="8" checked="${aufnahme.niedertemperatur_kessel || false}"></checkbox>
|
||||||
|
<text size="12">Niedertemperaturkessel</text>
|
||||||
|
</flex>
|
||||||
|
<flex direction="row" gap="4" align="center">
|
||||||
|
<checkbox width="8" height="8" checked="${aufnahme.brennwert_kessel || false}"></checkbox>
|
||||||
|
<text size="12">Brennwertkessel</text>
|
||||||
|
</flex>
|
||||||
|
</flex>
|
||||||
|
<flex direction="column" gap="4">
|
||||||
|
<flex direction="row" gap="4" align="center">
|
||||||
|
<checkbox width="8" height="8" checked="${aufnahme.warmwasser_rohre_gedaemmt || false}"></checkbox>
|
||||||
|
<text size="12">Warmwasserrohre gedämmt</text>
|
||||||
|
</flex>
|
||||||
|
<flex direction="row" gap="4" align="center">
|
||||||
|
<checkbox width="8" height="8" checked="${aufnahme.heizungsrohre_gedaemmt || false}"></checkbox>
|
||||||
|
<text size="12">Heizungsrohre gedämmt</text>
|
||||||
|
</flex>
|
||||||
|
<flex direction="row" gap="4" align="center">
|
||||||
|
<checkbox width="8" height="8" checked="${aufnahme.zirkulation || false}"></checkbox>
|
||||||
|
<text size="12">Zirkulation</text>
|
||||||
|
</flex>
|
||||||
|
<flex direction="row" gap="4" align="center">
|
||||||
|
<checkbox width="8" height="8" checked="${aufnahme.raum_temperatur_regler || false}"></checkbox>
|
||||||
|
<text size="12">Raumtemperaturregelung</text>
|
||||||
|
</flex>
|
||||||
|
</flex>
|
||||||
|
</flex>
|
||||||
|
<text size="12" marginTop="15">Fenster/Dachfenster/Türen</text>
|
||||||
|
<flex direction="row" justify="space-between" width="${pages[1].getWidth() - 120}" marginTop="15">
|
||||||
|
<flex direction="column" gap="4">
|
||||||
|
<flex direction="row" gap="4" align="center">
|
||||||
|
<checkbox width="8" height="8" checked="${aufnahme.einfach_verglasung || false}"></checkbox>
|
||||||
|
<text size="12">Einfachglas</text>
|
||||||
|
</flex>
|
||||||
|
<flex direction="row" gap="4" align="center">
|
||||||
|
<checkbox width="8" height="8" checked="${aufnahme.doppel_verglasung || false}"></checkbox>
|
||||||
|
<text size="12">Doppelverglasung</text>
|
||||||
|
</flex>
|
||||||
|
<flex direction="row" gap="4" align="center">
|
||||||
|
<checkbox width="8" height="8" checked="${aufnahme.isolier_verglasung || false}"></checkbox>
|
||||||
|
<text size="12">Isolierverglasung</text>
|
||||||
|
</flex>
|
||||||
|
</flex>
|
||||||
|
<flex direction="column" gap="4">
|
||||||
|
<flex direction="row" gap="4" align="center">
|
||||||
|
<checkbox width="8" height="8" checked="${false}"></checkbox>
|
||||||
|
<text size="12">Passivhausfenster</text>
|
||||||
|
</flex>
|
||||||
|
<flex direction="row" gap="4" align="center">
|
||||||
|
<checkbox width="8" height="8" checked="${aufnahme.fenster_dicht || false}"></checkbox>
|
||||||
|
<text size="12">Alle Fenster dicht</text>
|
||||||
|
</flex>
|
||||||
|
<flex direction="row" gap="4" align="center">
|
||||||
|
<checkbox width="8" height="8" checked="${aufnahme.fenster_teilweise_undicht || false}"></checkbox>
|
||||||
|
<text size="12">Fenster teilweise undicht</text>
|
||||||
|
</flex>
|
||||||
|
</flex>
|
||||||
|
<flex direction="column" gap="4">
|
||||||
|
<flex direction="row" gap="4" align="center">
|
||||||
|
<checkbox width="8" height="8" checked="${aufnahme.tueren_undicht || false}"></checkbox>
|
||||||
|
<text size="12">Türen teilweise undicht</text>
|
||||||
|
</flex>
|
||||||
|
<flex direction="row" gap="4" align="center">
|
||||||
|
<checkbox width="8" height="8" checked="${aufnahme.tueren_dicht || false}"></checkbox>
|
||||||
|
<text size="12">Alle Türen dicht</text>
|
||||||
|
</flex>
|
||||||
|
<flex direction="row" gap="4" align="center">
|
||||||
|
<checkbox width="8" height="8" checked="${aufnahme.rolllaeden_kaesten_gedaemmt || false}"></checkbox>
|
||||||
|
<text size="12">Rollladenkästen gedämmt</text>
|
||||||
|
</flex>
|
||||||
|
</flex>
|
||||||
|
</flex>
|
||||||
|
<text size="12" marginTop="15">Wärmedämmung</text>
|
||||||
|
<flex direction="row" justify="space-between" width="${pages[1].getWidth() - 120}" marginTop="15">
|
||||||
|
<flex direction="column" gap="4">
|
||||||
|
<flex direction="row" gap="4" align="center">
|
||||||
|
<checkbox width="8" height="8" checked="${aufnahme.keller_wand_gedaemmt || false}"></checkbox>
|
||||||
|
<text size="12">Kelleraußenwand gedämmt</text>
|
||||||
|
</flex>
|
||||||
|
<flex direction="row" gap="4" align="center">
|
||||||
|
<checkbox width="8" height="8" checked="${aufnahme.keller_decke_gedaemmt || false}"></checkbox>
|
||||||
|
<text size="12">Kellerdecke gedämmt</text>
|
||||||
|
</flex>
|
||||||
|
<flex direction="row" gap="4" align="center">
|
||||||
|
<checkbox width="8" height="8" checked="${aufnahme.aussenwand_gedaemmt || false}"></checkbox>
|
||||||
|
<text size="12">Außenwand gedämmt</text>
|
||||||
|
</flex>
|
||||||
|
</flex>
|
||||||
|
<flex direction="column" gap="4">
|
||||||
|
<flex direction="row" gap="4" align="center">
|
||||||
|
<checkbox width="8" height="8" checked="${aufnahme.dachgeschoss_min_12cm_gedaemmt || false}"></checkbox>
|
||||||
|
<text size="12">Dachgeschoss min. 12cm gedämmt</text>
|
||||||
|
</flex>
|
||||||
|
<flex direction="row" gap="4" align="center">
|
||||||
|
<checkbox width="8" height="8" checked="${aufnahme.dachgeschoss_gedaemmt || false}"></checkbox>
|
||||||
|
<text size="12">Dachgeschoss gedämmt</text>
|
||||||
|
</flex>
|
||||||
|
<flex direction="row" gap="4" align="center">
|
||||||
|
<checkbox width="8" height="8" checked="${aufnahme.oberste_geschossdecke_gedaemmt || false}"></checkbox>
|
||||||
|
<text size="12">Oberste Geschossdecke gedämmt</text>
|
||||||
|
</flex>
|
||||||
|
<flex direction="row" gap="4" align="center">
|
||||||
|
<checkbox width="8" height="8" checked="${aufnahme.oberste_geschossdecke_min_12cm_gedaemmt || false}"></checkbox>
|
||||||
|
<text size="12">Oberste Geschossdecke min. 12cm gedämmt</text>
|
||||||
|
</flex>
|
||||||
|
</flex>
|
||||||
|
</flex>
|
||||||
|
</layout>`, {
|
||||||
|
"default": font,
|
||||||
|
bold
|
||||||
|
})
|
||||||
|
|
||||||
|
layout.draw(pages[0], 0, pages[0].getHeight())
|
||||||
|
layoutPage2.draw(pages[1], 0, pages[1].getHeight())
|
||||||
|
|
||||||
|
// const containerWidth = width - marginX;
|
||||||
|
|
||||||
|
// const layout = flex([
|
||||||
|
// flex([
|
||||||
|
// checkbox(8, 8), text("Neubau", {
|
||||||
|
// color: rgb(0,0,0),
|
||||||
|
// font,
|
||||||
|
// fontSize: 12
|
||||||
|
// })
|
||||||
|
// ], {
|
||||||
|
// align: "center",
|
||||||
|
// justify: "center",
|
||||||
|
// gap: 5,
|
||||||
|
// height: 12,
|
||||||
|
// page: pages[0]
|
||||||
|
// }),
|
||||||
|
// flex([
|
||||||
|
// checkbox(8, 8), text("Vermietung/Verkauf", {
|
||||||
|
// color: rgb(0,0,0),
|
||||||
|
// font,
|
||||||
|
// fontSize: 12
|
||||||
|
// })
|
||||||
|
// ], {
|
||||||
|
// align: "center",
|
||||||
|
// justify: "center",
|
||||||
|
// gap: 5,
|
||||||
|
// height: 12,
|
||||||
|
// page: pages[0]
|
||||||
|
// }),
|
||||||
|
// flex([
|
||||||
|
// checkbox(8, 8), text("Modernisierung", {
|
||||||
|
// color: rgb(0,0,0),
|
||||||
|
// font,
|
||||||
|
// fontSize: 12
|
||||||
|
// })
|
||||||
|
// ], {
|
||||||
|
// align: "center",
|
||||||
|
// justify: "center",
|
||||||
|
// gap: 5,
|
||||||
|
// height: 12,
|
||||||
|
// page: pages[0]
|
||||||
|
// }),
|
||||||
|
// flex([
|
||||||
|
// checkbox(8, 8), text("Sonstiges", {
|
||||||
|
// color: rgb(0,0,0),
|
||||||
|
// font,
|
||||||
|
// fontSize: 12
|
||||||
|
// })
|
||||||
|
// ], {
|
||||||
|
// align: "center",
|
||||||
|
// justify: "center",
|
||||||
|
// gap: 5,
|
||||||
|
// height: 12,
|
||||||
|
// page: pages[0]
|
||||||
|
// })
|
||||||
|
// ], {
|
||||||
|
// align: "center",
|
||||||
|
// justify: "space-between",
|
||||||
|
// gap: 15,
|
||||||
|
// x: marginX,
|
||||||
|
// y: height - marginY - 165,
|
||||||
|
// height: 12,
|
||||||
|
// width: containerWidth
|
||||||
|
// })
|
||||||
|
|
||||||
|
// layout.draw(pages[0])
|
||||||
|
|
||||||
|
// pdf.getForm().flatten()
|
||||||
|
|
||||||
|
return pdf.save();
|
||||||
|
}
|
||||||
@@ -1,13 +1,16 @@
|
|||||||
import { AufnahmeClient, BenutzerClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
|
import { AufnahmeClient, BenutzerClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
|
||||||
import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.js";
|
import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.js";
|
||||||
import { getEmpfehlungen } from "#lib/XML/getEmpfehlungen.js";
|
import { getEmpfehlungen } from "#lib/XML/getEmpfehlungen.js";
|
||||||
import { Enums } from "@ibcornelsen/database/server";
|
import { Enums } from "@ibcornelsen/database/server";
|
||||||
import * as fs from "fs"
|
import * as fs from "fs"
|
||||||
import moment from "moment";
|
import moment from "moment";
|
||||||
import { PDFDocument, PDFFont, PDFName, PDFNumber, PDFPage, StandardFonts, TextAlignment } from "pdf-lib";
|
import { PDFDocument, PDFFont, PDFImage, PDFName, PDFNumber, PDFPage, rgb, RotationTypes, StandardFonts, TextAlignment } from "pdf-lib";
|
||||||
|
import { addCheckMark } from "./utils/checkbox.js";
|
||||||
|
import { addText } from "./utils/text.js";
|
||||||
|
import { addAnsichtsausweisLabel, addDatumGEG } from "./utils/helpers.js";
|
||||||
|
|
||||||
|
|
||||||
export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: UploadedGebaeudeBild[], user: BenutzerClient) {
|
export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: UploadedGebaeudeBild[], user: BenutzerClient) {
|
||||||
const VerbrauchsausweisWohnenGEG2024PDF = fs.readFileSync(new URL("./templates/GEG24_Nichtwohngebaeude.pdf", import.meta.url), "base64");
|
const VerbrauchsausweisWohnenGEG2024PDF = fs.readFileSync(new URL("./templates/GEG24_Nichtwohngebaeude.pdf", import.meta.url), "base64");
|
||||||
const pdf = await PDFDocument.load(VerbrauchsausweisWohnenGEG2024PDF)
|
const pdf = await PDFDocument.load(VerbrauchsausweisWohnenGEG2024PDF)
|
||||||
const pages = pdf.getPages()
|
const pages = pdf.getPages()
|
||||||
@@ -15,7 +18,6 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisWohn
|
|||||||
// const template = VerbrauchsausweisWohnen2016Template as Template;
|
// const template = VerbrauchsausweisWohnen2016Template as Template;
|
||||||
|
|
||||||
const berechnungen = await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis, aufnahme, objekt);
|
const berechnungen = await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis, aufnahme, objekt);
|
||||||
console.log(berechnungen);
|
|
||||||
|
|
||||||
const empfehlungen = getEmpfehlungen(ausweis, aufnahme, objekt)
|
const empfehlungen = getEmpfehlungen(ausweis, aufnahme, objekt)
|
||||||
|
|
||||||
@@ -44,39 +46,175 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisWohn
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// const gebaeudetyp = fillFormField("gebaeudetyp", aufnahme.gebaeudetyp || "")
|
pages[0].drawText(aufnahme.gebaeudetyp || "", {
|
||||||
|
x: 211,
|
||||||
|
y: height - 166,
|
||||||
|
size: 10
|
||||||
|
})
|
||||||
|
|
||||||
// const adresse = fillFormField("adresse", objekt.adresse)
|
pages[0].drawText(objekt.adresse || "", {
|
||||||
|
x: 211,
|
||||||
|
y: height - 194,
|
||||||
|
size: 10
|
||||||
|
})
|
||||||
|
|
||||||
|
pages[0].drawText(aufnahme.gebaeudeteil || "", {
|
||||||
|
x: 211,
|
||||||
|
y: height - 214.5,
|
||||||
|
size: 10
|
||||||
|
})
|
||||||
|
|
||||||
|
pages[0].drawText(aufnahme.baujahr_gebaeude?.toString() || "", {
|
||||||
|
x: 211,
|
||||||
|
y: height - 229.5,
|
||||||
|
size: 10
|
||||||
|
})
|
||||||
|
|
||||||
|
pages[0].drawText(aufnahme.baujahr_heizung?.toString() || "", {
|
||||||
|
x: 211,
|
||||||
|
y: height - 250,
|
||||||
|
size: 10
|
||||||
|
})
|
||||||
|
|
||||||
|
pages[0].drawText(aufnahme.nutzflaeche?.toString() || "", {
|
||||||
|
x: 211,
|
||||||
|
y: height - 271.5,
|
||||||
|
size: 10
|
||||||
|
})
|
||||||
|
|
||||||
|
pages[0].drawText(`${aufnahme.brennstoff_1}, ${aufnahme.brennstoff_2 || ""}`, {
|
||||||
|
x: 211,
|
||||||
|
y: height - 285,
|
||||||
|
size: 10
|
||||||
|
})
|
||||||
|
|
||||||
|
const erneuerbareEnergienVerwendung = []
|
||||||
|
|
||||||
|
if (ausweis.alternative_heizung) {
|
||||||
|
erneuerbareEnergienVerwendung.push("Heizung")
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ausweis.alternative_kuehlung) {
|
||||||
|
erneuerbareEnergienVerwendung.push("Kühlung")
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ausweis.alternative_lueftung) {
|
||||||
|
erneuerbareEnergienVerwendung.push("Lüftung")
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ausweis.alternative_warmwasser) {
|
||||||
|
erneuerbareEnergienVerwendung.push("Warmwasser")
|
||||||
|
}
|
||||||
|
|
||||||
|
pages[0].drawText(erneuerbareEnergienVerwendung.join(", "), {
|
||||||
|
x: 358,
|
||||||
|
y: height - 325,
|
||||||
|
size: 8
|
||||||
|
})
|
||||||
|
|
||||||
|
if (ausweis.warmwasser_enthalten) {
|
||||||
|
pages[0].drawText(`${aufnahme.brennstoff_1}, ${aufnahme.brennstoff_2 || ""}`, {
|
||||||
|
x: 211,
|
||||||
|
y: height - 299,
|
||||||
|
size: 10
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (aufnahme.lueftung === Enums.Lueftungskonzept.Fensterlueftung) {
|
||||||
|
addCheckMark(pages[0], 213, height - 334)
|
||||||
|
} else if (aufnahme.lueftung === Enums.Lueftungskonzept.Schachtlueftung) {
|
||||||
|
addCheckMark(pages[0], 213, height - 345)
|
||||||
|
} else if (aufnahme.lueftung === Enums.Lueftungskonzept.LueftungsanlageMitWaermerueckgewinnung) {
|
||||||
|
addCheckMark(pages[0], 355, height - 334)
|
||||||
|
} else if (aufnahme.lueftung === Enums.Lueftungskonzept.LueftungsanlageOhneWaermerueckgewinnung) {
|
||||||
|
addCheckMark(pages[0], 355, height - 345)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Kühlung
|
||||||
|
if (ausweis.wird_gekuehlt) {
|
||||||
|
addCheckMark(pages[0], 213, height - 362.5)
|
||||||
|
} else {
|
||||||
|
addCheckMark(pages[0], 355, height - 373.5)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ausweis.ausstellgrund === Enums.Ausstellgrund.Neubau) {
|
||||||
|
addCheckMark(pages[0], 213, height - 406)
|
||||||
|
} else if (ausweis.ausstellgrund === Enums.Ausstellgrund.Vermietung) {
|
||||||
|
addCheckMark(pages[0], 213, height - 417)
|
||||||
|
} else if (ausweis.ausstellgrund === Enums.Ausstellgrund.Modernisierung) {
|
||||||
|
addCheckMark(pages[0], 344.5, height - 406)
|
||||||
|
} else if (ausweis.ausstellgrund === Enums.Ausstellgrund.Sonstiges) {
|
||||||
|
addCheckMark(pages[0], 463, height - 417)
|
||||||
|
}
|
||||||
|
// Aushangpflicht
|
||||||
|
// addCheckMark(pages[0], 463, height - 406)
|
||||||
|
|
||||||
|
|
||||||
// const gebaeudeteil = fillFormField("gebaeudeteil", aufnahme.gebaeudeteil || "")
|
|
||||||
|
|
||||||
// const baujahr_gebaeude = fillFormField("baujahr_gebaeude", aufnahme.baujahr_gebaeude?.toString())
|
|
||||||
|
|
||||||
// const baujahr_heizung = fillFormField("baujahr_heizung", aufnahme.baujahr_heizung?.toString())
|
|
||||||
|
|
||||||
// const einheiten = fillFormField("einheiten", aufnahme.einheiten?.toString())
|
const gebaeudeBild = bilder.find(image => image.kategorie === Enums.BilderKategorie.Gebaeude);
|
||||||
|
|
||||||
// const nutzflaeche = fillFormField("nutzflaeche", `${aufnahme.nutzflaeche?.toString()}m²`)
|
|
||||||
|
|
||||||
// fillFormField("energietraeger_heizung", `${aufnahme.brennstoff_1}, ${aufnahme.brennstoff_2 || ""}`)
|
|
||||||
|
|
||||||
// if (ausweis.warmwasser_enthalten) {
|
|
||||||
// fillFormField("energietraeger_warmwasser", `${aufnahme.brennstoff_1}, ${aufnahme.brennstoff_2 || ""}`)
|
|
||||||
// }
|
|
||||||
|
|
||||||
// toggleCheck("fensterlueftung", aufnahme.lueftung == Enums.Lueftungskonzept.Fensterlueftung)
|
|
||||||
// toggleCheck("schachtlueftung", aufnahme.lueftung == Enums.Lueftungskonzept.Schachtlueftung)
|
|
||||||
// toggleCheck("lueftungsanlage_ohne_waermerueckgewinnung", aufnahme.lueftung == Enums.Lueftungskonzept.LueftungsanlageOhneWaermerueckgewinnung)
|
|
||||||
// toggleCheck("lueftungsanlage_waermerueckgewinnung", aufnahme.lueftung == Enums.Lueftungskonzept.LueftungsanlageMitWaermerueckgewinnung)
|
|
||||||
|
|
||||||
// toggleCheck("anlass_neubau", ausweis.ausstellgrund == "Neubau")
|
|
||||||
// toggleCheck("anlass_vermietung", ausweis.ausstellgrund == "Vermietung" || ausweis.ausstellgrund == "Verkauf")
|
|
||||||
// toggleCheck("anlass_modernisierung", ausweis.ausstellgrund == "Modernisierung")
|
|
||||||
// toggleCheck("anlass_sonstiges", ausweis.ausstellgrund == "Sonstiges")
|
|
||||||
|
|
||||||
|
if (gebaeudeBild) {
|
||||||
// const gebaeudeBild = bilder.find(image => image.kategorie === "Gebaeude");
|
let image: PDFImage;
|
||||||
|
try {
|
||||||
|
image = await pdf.embedJpg(gebaeudeBild?.base64)
|
||||||
|
} catch(e) {
|
||||||
|
image = await pdf.embedPng(gebaeudeBild?.base64)
|
||||||
|
}
|
||||||
|
pages[0].drawImage(image, {
|
||||||
|
x: 460.5,
|
||||||
|
y: height - 289,
|
||||||
|
width: 111,
|
||||||
|
height: 138
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Checkmark Angabe energetische Qualität des Gebäudes.
|
||||||
|
addCheckMark(pages[0], 40, height - 550)
|
||||||
|
|
||||||
|
// Datenerhebung durch Eigentümer
|
||||||
|
addCheckMark(pages[0], 295, height - 580)
|
||||||
|
|
||||||
|
// Ausstellungsdatum
|
||||||
|
pages[0].drawText(moment().format("DD.MM.YYYY"), {
|
||||||
|
font,
|
||||||
|
size: 10,
|
||||||
|
x: 508,
|
||||||
|
y: height - 752
|
||||||
|
})
|
||||||
|
|
||||||
|
// Gültig bis
|
||||||
|
pages[0].drawText(moment().add(10, "years").format("DD.MM.YYYY"), {
|
||||||
|
font: bold,
|
||||||
|
size: 10,
|
||||||
|
x: 90,
|
||||||
|
y: height - 113
|
||||||
|
})
|
||||||
|
|
||||||
|
// Stempel und Unterschrift
|
||||||
|
if (ausweis.ausgestellt) {
|
||||||
|
const stempel = await pdf.embedPng(fs.readFileSync(new URL("./images/stempel-unterschrift.png", import.meta.url), "base64"));
|
||||||
|
const stempelHeight = 60
|
||||||
|
|
||||||
|
pages[0].drawImage(stempel, {
|
||||||
|
x: 450,
|
||||||
|
y: height - 750,
|
||||||
|
height: stempelHeight,
|
||||||
|
width: stempel.width / (stempel.height / stempelHeight)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Aussteller
|
||||||
|
const aussteller = await pdf.embedPng(fs.readFileSync(new URL("./images/aussteller.png", import.meta.url), "base64"));
|
||||||
|
pages[0].drawImage(aussteller, {
|
||||||
|
x: 40,
|
||||||
|
y: height - 750,
|
||||||
|
width: 100,
|
||||||
|
height: 50
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
// /* -------------------------------- Seite 2 -------------------------------- */
|
// /* -------------------------------- Seite 2 -------------------------------- */
|
||||||
@@ -85,95 +223,128 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisWohn
|
|||||||
|
|
||||||
const addEnergieverbrauchSkalaPfeile = async (page: PDFPage) => {
|
const addEnergieverbrauchSkalaPfeile = async (page: PDFPage) => {
|
||||||
const pfeilNachUnten = await pdf.embedPng(fs.readFileSync(new URL("../../../public/images/pfeil-nach-unten.png", import.meta.url), "base64"))
|
const pfeilNachUnten = await pdf.embedPng(fs.readFileSync(new URL("../../../public/images/pfeil-nach-unten.png", import.meta.url), "base64"))
|
||||||
const pfeilNachOben = await pdf.embedPng(fs.readFileSync(new URL("../../../public/images/pfeil-nach-oben.png", import.meta.url), "base64"))
|
|
||||||
|
|
||||||
// Wir müssen den berechneten Wert zwischen 0 und 1000 als Wert zwischen 0 und 1 festlegen
|
// Wir müssen den berechneten Wert zwischen 0 und 1000 als Wert zwischen 0 und 1 festlegen
|
||||||
const endenergieverbrauchTranslationPercentage = Math.min(1000, Math.max(0, berechnungen?.endEnergieVerbrauchGesamt || 0)) / 1000
|
const endenergieverbrauchTranslationPercentage = Math.min(1000, Math.max(0, berechnungen?.endEnergieVerbrauchGesamt || 0)) / 1000
|
||||||
const primaerenergieverbrauchTranslationPercentage = Math.min(1000, Math.max(0, berechnungen?.primaerEnergieVerbrauchGesamt || 0)) / 1000
|
const stromVerbrauchTranslationPercentage = Math.min(1000, Math.max(0, berechnungen?.endEnergieVerbrauchStrom || 0)) / 1000
|
||||||
|
|
||||||
const minTranslation = 120
|
const minTranslation = 78
|
||||||
const maxTranslation = 457
|
const maxTranslation = 512
|
||||||
const endenergieverbrauchTranslationX = minTranslation + (maxTranslation - minTranslation) * endenergieverbrauchTranslationPercentage;
|
const endenergieverbrauchTranslationX = minTranslation + (maxTranslation - minTranslation) * endenergieverbrauchTranslationPercentage;
|
||||||
const primaerenergieverbrauchTranslationX = minTranslation + (maxTranslation - minTranslation) * primaerenergieverbrauchTranslationPercentage;
|
const stromVerbrauchTranslationX = minTranslation + (maxTranslation - minTranslation) * stromVerbrauchTranslationPercentage;
|
||||||
|
|
||||||
const pfeilWidth = 20
|
const pfeilWidth = 20
|
||||||
const margin = 5;
|
const margin = 5;
|
||||||
|
|
||||||
page.drawImage(pfeilNachUnten, {
|
page.drawImage(pfeilNachUnten, {
|
||||||
x: endenergieverbrauchTranslationX,
|
x: endenergieverbrauchTranslationX,
|
||||||
y: height - 215,
|
y: height - 210,
|
||||||
width: pfeilWidth,
|
width: pfeilWidth,
|
||||||
height: 30
|
height: 30
|
||||||
})
|
})
|
||||||
|
|
||||||
const endEnergieVerbrauchGesamtText = `${berechnungen?.endEnergieVerbrauchGesamt.toString()}kWh/(m²a)`;
|
const endEnergieVerbrauchGesamtText = `${berechnungen?.endEnergieVerbrauchGesamt.toString()}kWh/(m²a)`;
|
||||||
const primaerEnergieVerbrauchGesamtText = `${berechnungen?.primaerEnergieVerbrauchGesamt.toString()}kWh/(m²a)`;
|
const stromVerbrauchGesamtText = `${berechnungen?.endEnergieVerbrauchStrom.toString()}kWh/(m²a)`;
|
||||||
|
|
||||||
if (endenergieverbrauchTranslationPercentage > 0.5) {
|
if (endenergieverbrauchTranslationPercentage > 0.5) {
|
||||||
page.drawText("Endenergieverbrauch", {
|
page.drawText("Endenergieverbrauch Wärme", {
|
||||||
x: endenergieverbrauchTranslationX - margin - font.widthOfTextAtSize("Endenergieverbrauch", 10),
|
x: endenergieverbrauchTranslationX - margin - font.widthOfTextAtSize("Endenergieverbrauch", 10),
|
||||||
y: height - 193,
|
y: height - 191,
|
||||||
size: 10
|
size: 10
|
||||||
})
|
})
|
||||||
|
|
||||||
page.drawText(endEnergieVerbrauchGesamtText, {
|
page.drawText(endEnergieVerbrauchGesamtText, {
|
||||||
x: endenergieverbrauchTranslationX - margin - bold.widthOfTextAtSize(endEnergieVerbrauchGesamtText, 10),
|
x: endenergieverbrauchTranslationX - margin - bold.widthOfTextAtSize(endEnergieVerbrauchGesamtText, 10),
|
||||||
y: height - 207,
|
y: height - 205,
|
||||||
size: 10,
|
size: 10,
|
||||||
font: bold
|
font: bold
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
page.drawText("Endenergieverbrauch", {
|
page.drawText("Endenergieverbrauch Wärme", {
|
||||||
x: endenergieverbrauchTranslationX + pfeilWidth + margin,
|
x: endenergieverbrauchTranslationX + pfeilWidth + margin,
|
||||||
y: height - 193,
|
y: height - 191,
|
||||||
size: 10
|
size: 10
|
||||||
})
|
})
|
||||||
page.drawText(endEnergieVerbrauchGesamtText, {
|
page.drawText(endEnergieVerbrauchGesamtText, {
|
||||||
x: endenergieverbrauchTranslationX + pfeilWidth + margin,
|
x: endenergieverbrauchTranslationX + pfeilWidth + margin,
|
||||||
y: height - 207,
|
y: height - 205,
|
||||||
size: 10,
|
size: 10,
|
||||||
font: bold
|
font: bold
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
page.drawImage(pfeilNachOben, {
|
page.drawImage(pfeilNachUnten, {
|
||||||
x: primaerenergieverbrauchTranslationX,
|
x: stromVerbrauchTranslationX,
|
||||||
y: height - 298,
|
y: height - 354,
|
||||||
width: pfeilWidth,
|
width: pfeilWidth,
|
||||||
height: 30
|
height: 30
|
||||||
})
|
})
|
||||||
|
|
||||||
if (endenergieverbrauchTranslationPercentage > 0.5) {
|
if (endenergieverbrauchTranslationPercentage > 0.5) {
|
||||||
page.drawText("Primärenergieverbrauch", {
|
page.drawText("Endenergieverbrauch Strom", {
|
||||||
x: primaerenergieverbrauchTranslationX - margin - font.widthOfTextAtSize("Primärenergieverbrauch", 10),
|
x: stromVerbrauchTranslationX - margin - font.widthOfTextAtSize("Primärenergieverbrauch", 10),
|
||||||
y: height - 280,
|
y: height - 335,
|
||||||
size: 10
|
size: 10
|
||||||
})
|
})
|
||||||
|
|
||||||
page.drawText(primaerEnergieVerbrauchGesamtText, {
|
page.drawText(stromVerbrauchGesamtText, {
|
||||||
x: primaerenergieverbrauchTranslationX - margin - bold.widthOfTextAtSize(primaerEnergieVerbrauchGesamtText, 10),
|
x: stromVerbrauchTranslationX - margin - bold.widthOfTextAtSize(stromVerbrauchGesamtText, 10),
|
||||||
y: height - 294,
|
y: height - 349,
|
||||||
size: 10,
|
size: 10,
|
||||||
font: bold
|
font: bold
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
page.drawText("Primärenergieverbrauch", {
|
page.drawText("Endenergieverbrauch Strom", {
|
||||||
x: primaerenergieverbrauchTranslationX + pfeilWidth + margin,
|
x: stromVerbrauchTranslationX + pfeilWidth + margin,
|
||||||
y: height - 280,
|
y: height - 335,
|
||||||
size: 10
|
size: 10
|
||||||
})
|
})
|
||||||
page.drawText(primaerEnergieVerbrauchGesamtText, {
|
page.drawText(stromVerbrauchGesamtText, {
|
||||||
x: primaerenergieverbrauchTranslationX + pfeilWidth + margin,
|
x: stromVerbrauchTranslationX + pfeilWidth + margin,
|
||||||
y: height - 294,
|
y: height - 349,
|
||||||
size: 10,
|
size: 10,
|
||||||
font: bold
|
font: bold
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
addEnergieverbrauchSkalaPfeile(pages[1])
|
|
||||||
addEnergieverbrauchSkalaPfeile(pages[2])
|
addEnergieverbrauchSkalaPfeile(pages[2])
|
||||||
|
|
||||||
|
if (ausweis.warmwasser_enthalten) {
|
||||||
|
addCheckMark(pages[2], 41, height - 269)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ausweis.kuehlung_enthalten) {
|
||||||
|
addCheckMark(pages[2], 41, height - 281)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ausweis.stromverbrauch_enthaelt_heizung) {
|
||||||
|
addCheckMark(pages[2], 41, height - 456)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ausweis.stromverbrauch_enthaelt_warmwasser) {
|
||||||
|
addCheckMark(pages[2], 131, height - 456)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ausweis.stromverbrauch_enthaelt_lueftung) {
|
||||||
|
addCheckMark(pages[2], 218, height - 456)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ausweis.stromverbrauch_enthaelt_beleuchtung) {
|
||||||
|
addCheckMark(pages[2], 281, height - 456)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ausweis.stromverbrauch_enthaelt_kuehlung) {
|
||||||
|
addCheckMark(pages[2], 422, height - 456)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ausweis.stromverbrauch_enthaelt_sonstige) {
|
||||||
|
addCheckMark(pages[2], 492, height - 456)
|
||||||
|
}
|
||||||
|
|
||||||
|
addText(pages[2], berechnungen?.primaerEnergieVerbrauchGesamt.toString() || "", 475, height - 614, 10, font)
|
||||||
|
addText(pages[2], berechnungen?.co2EmissionenGesamt.toString() || "", 475, height - 633, 10, font)
|
||||||
|
|
||||||
// const primaerenergiebedarfIst = fillFormField("primaerenergiebedarf_ist", berechnungen?.primaerEnergieVerbrauchGesamt.toString())
|
// const primaerenergiebedarfIst = fillFormField("primaerenergiebedarf_ist", berechnungen?.primaerEnergieVerbrauchGesamt.toString())
|
||||||
|
|
||||||
|
|
||||||
@@ -184,9 +355,9 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisWohn
|
|||||||
const addVerbrauchGenerator = () => {
|
const addVerbrauchGenerator = () => {
|
||||||
let i = 0;
|
let i = 0;
|
||||||
let yOffset = 14.6;
|
let yOffset = 14.6;
|
||||||
const initialHeight = 435
|
const initialHeight = 297
|
||||||
const initialXOffset = 36;
|
const initialXOffset = 36;
|
||||||
return (zeitraum_von?: string, zeitraum_bis?: string, energietraeger?: string, primaerfaktor?: string, energieverbrauch?: string, anteil_warmwasser?: string, anteil_heizung?: string, klimafaktor?: string) => {
|
return (zeitraum_von?: string, zeitraum_bis?: string, energietraeger?: string, primaerfaktor?: string, energieverbrauch?: string, anteil_warmwasser?: string, anteil_kaelte?: number, anteil_heizung?: string, klimafaktor?: string, strom?: number) => {
|
||||||
pages[2].drawText(zeitraum_von || "", {
|
pages[2].drawText(zeitraum_von || "", {
|
||||||
x: initialXOffset,
|
x: initialXOffset,
|
||||||
y: initialHeight - (i * yOffset),
|
y: initialHeight - (i * yOffset),
|
||||||
@@ -209,34 +380,48 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisWohn
|
|||||||
})
|
})
|
||||||
|
|
||||||
pages[2].drawText(primaerfaktor || "", {
|
pages[2].drawText(primaerfaktor || "", {
|
||||||
x: initialXOffset + 317,
|
x: initialXOffset + 232,
|
||||||
y: initialHeight - (i * yOffset),
|
y: initialHeight - (i * yOffset),
|
||||||
size: 8,
|
size: 8,
|
||||||
font
|
font
|
||||||
})
|
})
|
||||||
|
|
||||||
pages[2].drawText(energieverbrauch || "", {
|
pages[2].drawText(energieverbrauch || "", {
|
||||||
x: initialXOffset + 351,
|
x: initialXOffset + 275,
|
||||||
y: initialHeight - (i * yOffset),
|
y: initialHeight - (i * yOffset),
|
||||||
size: 8,
|
size: 8,
|
||||||
font
|
font
|
||||||
})
|
})
|
||||||
|
|
||||||
pages[2].drawText(anteil_warmwasser || "", {
|
pages[2].drawText(anteil_warmwasser || "", {
|
||||||
x: initialXOffset + 402,
|
x: initialXOffset + 325,
|
||||||
|
y: initialHeight - (i * yOffset),
|
||||||
|
size: 8,
|
||||||
|
font
|
||||||
|
})
|
||||||
|
|
||||||
|
pages[2].drawText(anteil_kaelte?.toString() || "", {
|
||||||
|
x: initialXOffset + 378,
|
||||||
y: initialHeight - (i * yOffset),
|
y: initialHeight - (i * yOffset),
|
||||||
size: 8,
|
size: 8,
|
||||||
font
|
font
|
||||||
})
|
})
|
||||||
|
|
||||||
pages[2].drawText(anteil_heizung || "", {
|
pages[2].drawText(anteil_heizung || "", {
|
||||||
x: initialXOffset + 453,
|
x: initialXOffset + 430,
|
||||||
y: initialHeight - (i * yOffset),
|
y: initialHeight - (i * yOffset),
|
||||||
size: 8,
|
size: 8,
|
||||||
font
|
font
|
||||||
})
|
})
|
||||||
|
|
||||||
pages[2].drawText(klimafaktor || "", {
|
pages[2].drawText(klimafaktor || "", {
|
||||||
|
x: initialXOffset + 464,
|
||||||
|
y: initialHeight - (i * yOffset),
|
||||||
|
size: 8,
|
||||||
|
font
|
||||||
|
})
|
||||||
|
|
||||||
|
pages[2].drawText(strom?.toString() || "", {
|
||||||
x: initialXOffset + 504,
|
x: initialXOffset + 504,
|
||||||
y: initialHeight - (i * yOffset),
|
y: initialHeight - (i * yOffset),
|
||||||
size: 8,
|
size: 8,
|
||||||
@@ -248,50 +433,50 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisWohn
|
|||||||
|
|
||||||
const addVerbrauch = addVerbrauchGenerator();
|
const addVerbrauch = addVerbrauchGenerator();
|
||||||
|
|
||||||
addVerbrauch(
|
if (!ausweis.warmwasser_enthalten) {
|
||||||
moment(ausweis.startdatum).format("MM.YYYY"),
|
// Mit Warmwasserzuschlag
|
||||||
moment(ausweis.startdatum).add(1, "year").format("MM.YYYY"),
|
addVerbrauch(
|
||||||
aufnahme.brennstoff_1,
|
moment(ausweis.startdatum).format("MM.YYYY"),
|
||||||
berechnungen?.primaerfaktor.toString(),
|
moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
|
||||||
Math.round(berechnungen?.verbrauch_1_kwh).toString(),
|
aufnahme.brennstoff_1 || "",
|
||||||
Math.round(
|
berechnungen?.brennstoff_1.primaerenergiefaktor.toString(),
|
||||||
berechnungen?.anteil_warmwasser_1 * berechnungen?.verbrauch_1_kwh
|
Math.round(berechnungen?.energieVerbrauchGesamt_1 || 0).toString(),
|
||||||
).toString(),
|
"0",
|
||||||
Math.round(
|
berechnungen?.endEnergieVerbrauchKuehlungsZuschlag_1,
|
||||||
berechnungen?.anteil_heizung_1 * berechnungen?.verbrauch_1_kwh
|
Math.round(berechnungen?.energieVerbrauchHeizung_1 || 0).toString(),
|
||||||
).toString(),
|
berechnungen?.durchschnittsKlimafaktor.toString(),
|
||||||
berechnungen?.klimafaktoren[0].klimafaktor.toString()
|
berechnungen?.energieVerbrauchStrom
|
||||||
);
|
);
|
||||||
|
} else {
|
||||||
|
// Ohne Warmwasserzuschlag
|
||||||
|
addVerbrauch(
|
||||||
|
moment(ausweis.startdatum).format("MM.YYYY"),
|
||||||
|
moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
|
||||||
|
aufnahme.brennstoff_1 || "",
|
||||||
|
berechnungen?.brennstoff_1.primaerenergiefaktor.toString(),
|
||||||
|
Math.round(berechnungen?.energieVerbrauchGesamt_1 || 0).toString(),
|
||||||
|
Math.round(berechnungen?.energieVerbrauchWarmwasser_1 || 0).toString(),
|
||||||
|
berechnungen?.endEnergieVerbrauchKuehlungsZuschlag_1,
|
||||||
|
Math.round(berechnungen?.energieVerbrauchHeizung_1 || 0).toString(),
|
||||||
|
berechnungen?.durchschnittsKlimafaktor.toString(),
|
||||||
|
berechnungen?.energieVerbrauchStrom
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
addVerbrauch(
|
if (ausweis.zusaetzliche_heizquelle) {
|
||||||
moment(ausweis.startdatum).add(1, "year").format("MM.YYYY"),
|
addVerbrauch(
|
||||||
moment(ausweis.startdatum).add(2, "year").format("MM.YYYY"),
|
moment(ausweis.startdatum).format("MM.YYYY"),
|
||||||
aufnahme.brennstoff_1,
|
moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
|
||||||
berechnungen?.primaerfaktor.toString(),
|
aufnahme.brennstoff_2 || "",
|
||||||
Math.round(berechnungen?.verbrauch_2_kwh).toString(),
|
berechnungen?.brennstoff_2.primaerenergiefaktor.toString(),
|
||||||
Math.round(
|
Math.round(berechnungen?.energieVerbrauchGesamt_2 || 0).toString(),
|
||||||
berechnungen?.anteil_warmwasser_1 * berechnungen?.verbrauch_2_kwh
|
Math.round(berechnungen?.energieVerbrauchWarmwasser_2 || 0).toString(),
|
||||||
).toString(),
|
berechnungen?.endEnergieVerbrauchKuehlungsZuschlag_2,
|
||||||
Math.round(
|
Math.round(berechnungen?.energieVerbrauchHeizung_2 || 0).toString(),
|
||||||
berechnungen?.anteil_heizung_1 * berechnungen?.verbrauch_2_kwh
|
berechnungen?.durchschnittsKlimafaktor.toString(),
|
||||||
).toString(),
|
0
|
||||||
berechnungen?.klimafaktoren[0].klimafaktor.toString()
|
);
|
||||||
);
|
}
|
||||||
|
|
||||||
addVerbrauch(
|
|
||||||
moment(ausweis.startdatum).add(2, "year").format("MM.YYYY"),
|
|
||||||
moment(ausweis.startdatum).add(3, "year").format("MM.YYYY"),
|
|
||||||
aufnahme.brennstoff_1,
|
|
||||||
berechnungen?.primaerfaktor.toString(),
|
|
||||||
Math.round(berechnungen?.verbrauch_3_kwh).toString(),
|
|
||||||
Math.round(
|
|
||||||
berechnungen?.anteil_warmwasser_1 * berechnungen?.verbrauch_3_kwh
|
|
||||||
).toString(),
|
|
||||||
Math.round(
|
|
||||||
berechnungen?.anteil_heizung_1 * berechnungen?.verbrauch_3_kwh
|
|
||||||
).toString(),
|
|
||||||
berechnungen?.klimafaktoren[0].klimafaktor.toString()
|
|
||||||
);
|
|
||||||
|
|
||||||
/* -------------------------------- Seite 4 -------------------------------- */
|
/* -------------------------------- Seite 4 -------------------------------- */
|
||||||
|
|
||||||
@@ -316,7 +501,7 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisWohn
|
|||||||
const addEmpfehlungenGenerator = () => {
|
const addEmpfehlungenGenerator = () => {
|
||||||
let i = 0;
|
let i = 0;
|
||||||
let yOffset = 43;
|
let yOffset = 43;
|
||||||
const initialHeight = 568
|
const initialHeight = 562
|
||||||
const initialXOffset = 36;
|
const initialXOffset = 36;
|
||||||
return (bauteil?: string, beschreibung?: string, alsEinzelmassnahme?: boolean, amortisationszeit?: string, kosten?: string) => {
|
return (bauteil?: string, beschreibung?: string, alsEinzelmassnahme?: boolean, amortisationszeit?: string, kosten?: string) => {
|
||||||
pages[3].drawText((i + 1).toString(), {
|
pages[3].drawText((i + 1).toString(), {
|
||||||
@@ -368,6 +553,12 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisWohn
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for (const page of pages) {
|
||||||
|
addAnsichtsausweisLabel(page, font)
|
||||||
|
addDatumGEG(page, font)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// pdf.getForm().flatten()
|
// pdf.getForm().flatten()
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,10 @@ import { getEmpfehlungen } from "#lib/XML/getEmpfehlungen.js";
|
|||||||
import { Enums } from "@ibcornelsen/database/server";
|
import { Enums } from "@ibcornelsen/database/server";
|
||||||
import * as fs from "fs"
|
import * as fs from "fs"
|
||||||
import moment from "moment";
|
import moment from "moment";
|
||||||
import { PDFDocument, PDFFont, PDFPage, RotationTypes, StandardFonts, TextAlignment } from "pdf-lib";
|
import { PDFDocument, PDFFont, PDFImage, PDFPage, RotationTypes, StandardFonts, TextAlignment } from "pdf-lib";
|
||||||
|
import { addCheckMark } from "./utils/checkbox.js";
|
||||||
|
import { addText } from "./utils/text.js";
|
||||||
|
import { addAnsichtsausweisLabel, addDatumGEG } from "./utils/helpers.js";
|
||||||
|
|
||||||
/* -------------------------------- Pdf Tools ------------------------------- */
|
/* -------------------------------- Pdf Tools ------------------------------- */
|
||||||
|
|
||||||
@@ -45,7 +48,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
|
|||||||
|
|
||||||
const gebaeudetyp = fillFormField("gebaeudetyp", aufnahme.gebaeudetyp || "")
|
const gebaeudetyp = fillFormField("gebaeudetyp", aufnahme.gebaeudetyp || "")
|
||||||
|
|
||||||
const adresse = fillFormField("adresse", objekt.adresse)
|
const adresse = fillFormField("adresse", objekt.adresse || "")
|
||||||
|
|
||||||
|
|
||||||
const gebaeudeteil = fillFormField("gebaeudeteil", aufnahme.gebaeudeteil || "")
|
const gebaeudeteil = fillFormField("gebaeudeteil", aufnahme.gebaeudeteil || "")
|
||||||
@@ -54,7 +57,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
|
|||||||
|
|
||||||
const baujahr_heizung = fillFormField("baujahr_heizung", aufnahme.baujahr_heizung?.toString())
|
const baujahr_heizung = fillFormField("baujahr_heizung", aufnahme.baujahr_heizung?.toString())
|
||||||
|
|
||||||
const einheiten = fillFormField("einheiten", aufnahme.einheiten?.toString())
|
const einheiten = fillFormField("einheiten", (aufnahme.einheiten || 1).toString())
|
||||||
|
|
||||||
const nutzflaeche = fillFormField("nutzflaeche", `${aufnahme.nutzflaeche?.toString()}m²`)
|
const nutzflaeche = fillFormField("nutzflaeche", `${aufnahme.nutzflaeche?.toString()}m²`)
|
||||||
|
|
||||||
@@ -64,6 +67,10 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
|
|||||||
fillFormField("energietraeger_warmwasser", `${aufnahme.brennstoff_1}, ${aufnahme.brennstoff_2 || ""}`)
|
fillFormField("energietraeger_warmwasser", `${aufnahme.brennstoff_1}, ${aufnahme.brennstoff_2 || ""}`)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (aufnahme.durchlauf_erhitzer && !ausweis.warmwasser_enthalten) {
|
||||||
|
fillFormField("energietraeger_warmwasser", "Strommix");
|
||||||
|
}
|
||||||
|
|
||||||
toggleCheck("fensterlueftung", aufnahme.lueftung == Enums.Lueftungskonzept.Fensterlueftung)
|
toggleCheck("fensterlueftung", aufnahme.lueftung == Enums.Lueftungskonzept.Fensterlueftung)
|
||||||
toggleCheck("schachtlueftung", aufnahme.lueftung == Enums.Lueftungskonzept.Schachtlueftung)
|
toggleCheck("schachtlueftung", aufnahme.lueftung == Enums.Lueftungskonzept.Schachtlueftung)
|
||||||
toggleCheck("lueftungsanlage_ohne_waermerueckgewinnung", aufnahme.lueftung == Enums.Lueftungskonzept.LueftungsanlageOhneWaermerueckgewinnung)
|
toggleCheck("lueftungsanlage_ohne_waermerueckgewinnung", aufnahme.lueftung == Enums.Lueftungskonzept.LueftungsanlageOhneWaermerueckgewinnung)
|
||||||
@@ -74,11 +81,72 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
|
|||||||
toggleCheck("anlass_modernisierung", ausweis.ausstellgrund == "Modernisierung")
|
toggleCheck("anlass_modernisierung", ausweis.ausstellgrund == "Modernisierung")
|
||||||
toggleCheck("anlass_sonstiges", ausweis.ausstellgrund == "Sonstiges")
|
toggleCheck("anlass_sonstiges", ausweis.ausstellgrund == "Sonstiges")
|
||||||
|
|
||||||
console.log(bilder);
|
const gebaeudeBild = bilder.find(image => image.kategorie === Enums.BilderKategorie.Gebaeude);
|
||||||
|
|
||||||
|
|
||||||
const gebaeudeBild = bilder.find(image => image.kategorie === "Gebaeude");
|
if (gebaeudeBild) {
|
||||||
|
let image: PDFImage;
|
||||||
|
try {
|
||||||
|
image = await pdf.embedJpg(gebaeudeBild?.base64)
|
||||||
|
} catch(e) {
|
||||||
|
image = await pdf.embedPng(gebaeudeBild?.base64)
|
||||||
|
}
|
||||||
|
pages[0].drawImage(image, {
|
||||||
|
x: 460.5,
|
||||||
|
y: height - 289,
|
||||||
|
width: 111,
|
||||||
|
height: 138
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Nach 82 aus Wohnfläche ermittelt
|
||||||
|
if (aufnahme.flaeche == 0) {
|
||||||
|
addCheckMark(pages[0], 274, height - 277)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Checkmark Angabe energetische Qualität des Gebäudes.
|
||||||
|
addCheckMark(pages[0], 43, height - 560)
|
||||||
|
|
||||||
|
// Datenerhebung durch Eigentümer
|
||||||
|
addCheckMark(pages[0], 298, height - 590)
|
||||||
|
|
||||||
|
// Ausstellungsdatum
|
||||||
|
pages[0].drawText(moment().format("DD.MM.YYYY"), {
|
||||||
|
font,
|
||||||
|
size: 10,
|
||||||
|
x: 508,
|
||||||
|
y: height - 771
|
||||||
|
})
|
||||||
|
|
||||||
|
// Gültig bis
|
||||||
|
pages[0].drawText(moment().add(10, "years").format("DD.MM.YYYY"), {
|
||||||
|
font: bold,
|
||||||
|
size: 10,
|
||||||
|
x: 90,
|
||||||
|
y: height - 113
|
||||||
|
})
|
||||||
|
|
||||||
|
// Stempel und Unterschrift
|
||||||
|
if (ausweis.ausgestellt) {
|
||||||
|
const stempel = await pdf.embedPng(fs.readFileSync(new URL("./images/stempel-unterschrift.png", import.meta.url), "base64"));
|
||||||
|
const stempelHeight = 60
|
||||||
|
|
||||||
|
pages[0].drawImage(stempel, {
|
||||||
|
x: 450,
|
||||||
|
y: height - 770,
|
||||||
|
height: stempelHeight,
|
||||||
|
width: stempel.width / (stempel.height / stempelHeight)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Aussteller
|
||||||
|
const aussteller = await pdf.embedPng(fs.readFileSync(new URL("./images/aussteller.png", import.meta.url), "base64"));
|
||||||
|
pages[0].drawImage(aussteller, {
|
||||||
|
x: 40,
|
||||||
|
y: height - 770,
|
||||||
|
width: 100,
|
||||||
|
height: 50
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
/* -------------------------------- Seite 2 -------------------------------- */
|
/* -------------------------------- Seite 2 -------------------------------- */
|
||||||
|
|
||||||
@@ -99,9 +167,25 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
|
|||||||
const pfeilWidth = 20
|
const pfeilWidth = 20
|
||||||
const margin = 5;
|
const margin = 5;
|
||||||
|
|
||||||
|
// Buchstaben hinzufügen und hervorheben
|
||||||
|
const klassen: [string, number][] = [
|
||||||
|
["A+", 94],
|
||||||
|
["A", 136.5],
|
||||||
|
["B", 175],
|
||||||
|
["C", 215],
|
||||||
|
["D", 264],
|
||||||
|
["E", 320],
|
||||||
|
["F", 382],
|
||||||
|
["G", 447],
|
||||||
|
["H", 495],
|
||||||
|
]
|
||||||
|
for (const klasse of klassen) {
|
||||||
|
addText(page, klasse[0], klasse[1], height - 227, 12, berechnungen?.energieEffizienzKlasse === klasse[0] ? bold : font)
|
||||||
|
}
|
||||||
|
|
||||||
page.drawImage(pfeilNachUnten, {
|
page.drawImage(pfeilNachUnten, {
|
||||||
x: endenergieverbrauchTranslationX,
|
x: endenergieverbrauchTranslationX,
|
||||||
y: height - 215,
|
y: height - 212,
|
||||||
width: pfeilWidth,
|
width: pfeilWidth,
|
||||||
height: 30
|
height: 30
|
||||||
})
|
})
|
||||||
@@ -138,7 +222,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
|
|||||||
|
|
||||||
page.drawImage(pfeilNachOben, {
|
page.drawImage(pfeilNachOben, {
|
||||||
x: primaerenergieverbrauchTranslationX,
|
x: primaerenergieverbrauchTranslationX,
|
||||||
y: height - 298,
|
y: height - 297,
|
||||||
width: pfeilWidth,
|
width: pfeilWidth,
|
||||||
height: 30
|
height: 30
|
||||||
})
|
})
|
||||||
@@ -173,6 +257,22 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
|
|||||||
|
|
||||||
addEnergieverbrauchSkalaPfeile(pages[2])
|
addEnergieverbrauchSkalaPfeile(pages[2])
|
||||||
|
|
||||||
|
// CO2 Emissionen
|
||||||
|
pages[2].drawText(berechnungen?.co2EmissionenGesamt.toString() || "", {
|
||||||
|
x: 392,
|
||||||
|
y: height - 166.5,
|
||||||
|
font,
|
||||||
|
size: 10
|
||||||
|
})
|
||||||
|
|
||||||
|
// Endenergieverbrauch
|
||||||
|
pages[2].drawText(berechnungen?.endEnergieVerbrauchGesamt.toString() || "", {
|
||||||
|
x: 455,
|
||||||
|
y: height - 326,
|
||||||
|
font,
|
||||||
|
size: 10
|
||||||
|
})
|
||||||
|
|
||||||
/* -------------------------------- Seite 3 -------------------------------- */
|
/* -------------------------------- Seite 3 -------------------------------- */
|
||||||
|
|
||||||
// Verbräuche
|
// Verbräuche
|
||||||
@@ -244,50 +344,109 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
|
|||||||
|
|
||||||
const addVerbrauch = addVerbrauchGenerator();
|
const addVerbrauch = addVerbrauchGenerator();
|
||||||
|
|
||||||
addVerbrauch(
|
if (!ausweis.warmwasser_enthalten) {
|
||||||
moment(ausweis.startdatum).format("MM.YYYY"),
|
// Mit Warmwasserzuschlag
|
||||||
moment(ausweis.startdatum).add(1, "year").format("MM.YYYY"),
|
addVerbrauch(
|
||||||
aufnahme.brennstoff_1,
|
moment(ausweis.startdatum).format("MM.YYYY"),
|
||||||
berechnungen?.primaerfaktorww.toString(),
|
moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
|
||||||
Math.round(berechnungen?.verbrauch_1_kwh).toString(),
|
aufnahme.brennstoff_1 || "",
|
||||||
Math.round(
|
berechnungen?.brennstoff_1.primaerenergiefaktor.toString(),
|
||||||
berechnungen?.anteil_warmwasser_1 * berechnungen?.verbrauch_1_kwh
|
Math.round(berechnungen?.energieVerbrauchGesamt_1 || 0).toString(),
|
||||||
).toString(),
|
"0",
|
||||||
Math.round(
|
Math.round(berechnungen?.energieVerbrauchHeizung_1 || 0).toString(),
|
||||||
berechnungen?.anteil_heizung_1 * berechnungen?.verbrauch_1_kwh
|
berechnungen?.durchschnittsKlimafaktor.toString()
|
||||||
).toString(),
|
);
|
||||||
berechnungen?.klimafaktoren[0].klimafaktor.toString()
|
} else {
|
||||||
);
|
// Ohne Warmwasserzuschlag
|
||||||
|
addVerbrauch(
|
||||||
|
moment(ausweis.startdatum).format("MM.YYYY"),
|
||||||
|
moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
|
||||||
|
aufnahme.brennstoff_1 || "",
|
||||||
|
berechnungen?.brennstoff_1.primaerenergiefaktor.toString(),
|
||||||
|
Math.round(berechnungen?.energieVerbrauchGesamt_1 || 0).toString(),
|
||||||
|
Math.round(berechnungen?.energieVerbrauchWarmwasser_1 || 0).toString(),
|
||||||
|
Math.round(berechnungen?.energieVerbrauchHeizung_1 || 0).toString(),
|
||||||
|
berechnungen?.durchschnittsKlimafaktor.toString()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
addVerbrauch(
|
if (ausweis.zusaetzliche_heizquelle) {
|
||||||
moment(ausweis.startdatum).add(1, "year").format("MM.YYYY"),
|
addVerbrauch(
|
||||||
moment(ausweis.startdatum).add(2, "year").format("MM.YYYY"),
|
moment(ausweis.startdatum).format("MM.YYYY"),
|
||||||
aufnahme.brennstoff_1,
|
moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
|
||||||
berechnungen?.primaerfaktorww.toString(),
|
aufnahme.brennstoff_2 || "",
|
||||||
Math.round(berechnungen?.verbrauch_2_kwh).toString(),
|
berechnungen?.brennstoff_2.primaerenergiefaktor.toString(),
|
||||||
Math.round(
|
Math.round(berechnungen?.energieVerbrauchGesamt_2 || 0).toString(),
|
||||||
berechnungen?.anteil_warmwasser_1 * berechnungen?.verbrauch_2_kwh
|
Math.round(berechnungen?.energieVerbrauchWarmwasser_2 || 0).toString(),
|
||||||
).toString(),
|
Math.round(berechnungen?.energieVerbrauchHeizung_2 || 0).toString(),
|
||||||
Math.round(
|
berechnungen?.durchschnittsKlimafaktor.toString()
|
||||||
berechnungen?.anteil_heizung_1 * berechnungen?.verbrauch_2_kwh
|
);
|
||||||
).toString(),
|
}
|
||||||
berechnungen?.klimafaktoren[0].klimafaktor.toString()
|
|
||||||
);
|
|
||||||
|
|
||||||
addVerbrauch(
|
if (!ausweis.warmwasser_enthalten) {
|
||||||
moment(ausweis.startdatum).add(2, "year").format("MM.YYYY"),
|
/**
|
||||||
moment(ausweis.startdatum).add(3, "year").format("MM.YYYY"),
|
* Dezentrale Warmwasserversorgung - Pauschale Erhöhung um 20kWh/m²
|
||||||
aufnahme.brennstoff_1,
|
* @link https://www.bundesanzeiger.de/pub/publication/MRYM4nI84Sdlr0EIvvW?2
|
||||||
berechnungen?.primaerfaktorww.toString(),
|
*/
|
||||||
Math.round(berechnungen?.verbrauch_3_kwh).toString(),
|
addVerbrauch(
|
||||||
Math.round(
|
moment(ausweis.startdatum).format("MM.YYYY"),
|
||||||
berechnungen?.anteil_warmwasser_1 * berechnungen?.verbrauch_3_kwh
|
moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
|
||||||
).toString(),
|
"Warmwasserzuschlag",
|
||||||
Math.round(
|
berechnungen?.primaerfaktorww.toString(),
|
||||||
berechnungen?.anteil_heizung_1 * berechnungen?.verbrauch_3_kwh
|
Math.round(berechnungen?.energieVerbrauchWarmwasser_1 || 0).toString(),
|
||||||
).toString(),
|
Math.round(berechnungen?.energieVerbrauchWarmwasser_1 || 0).toString(),
|
||||||
berechnungen?.klimafaktoren[0].klimafaktor.toString()
|
"0",
|
||||||
);
|
"0"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (aufnahme.leerstand && aufnahme.leerstand > 0) {
|
||||||
|
/**
|
||||||
|
* Leerstandszuschlag
|
||||||
|
* @link https://www.bundesanzeiger.de/pub/publication/MRYM4nI84Sdlr0EIvvW?2
|
||||||
|
*/
|
||||||
|
if (ausweis.warmwasser_enthalten && ausweis.warmwasser_anteil_bekannt) {
|
||||||
|
addVerbrauch(
|
||||||
|
moment(ausweis.startdatum).format("MM.YYYY"),
|
||||||
|
moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
|
||||||
|
"Leerstandszuschlag",
|
||||||
|
berechnungen?.brennstoff_1.primaerenergiefaktor.toString(),
|
||||||
|
Math.round((berechnungen?.leerstandsZuschlagHeizung || 0) + (berechnungen?.leerstandsZuschlagWarmwasser || 0)).toString(),
|
||||||
|
Math.round((berechnungen?.leerstandsZuschlagWarmwasser || 0)).toString(),
|
||||||
|
Math.round((berechnungen?.leerstandsZuschlagHeizung || 0)).toString(),
|
||||||
|
berechnungen?.durchschnittsKlimafaktor.toString()
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
addVerbrauch(
|
||||||
|
moment(ausweis.startdatum).format("MM.YYYY"),
|
||||||
|
moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
|
||||||
|
"Leerstandszuschlag",
|
||||||
|
berechnungen?.brennstoff_1.primaerenergiefaktor.toString(),
|
||||||
|
Math.round((berechnungen?.leerstandsZuschlagHeizung || 0) + (berechnungen?.leerstandsZuschlagWarmwasser || 0)).toString(),
|
||||||
|
"0",
|
||||||
|
"0",
|
||||||
|
berechnungen?.durchschnittsKlimafaktor.toString()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (aufnahme.kuehlung) {
|
||||||
|
/**
|
||||||
|
* Kühlungszuschlag - Pauschale Erhöhung um 6kWh/m²
|
||||||
|
* Primärenergiefaktor Strom
|
||||||
|
* @link https://www.bundesanzeiger.de/pub/publication/MRYM4nI84Sdlr0EIvvW?2
|
||||||
|
*/
|
||||||
|
addVerbrauch(
|
||||||
|
moment(ausweis.startdatum).format("MM.YYYY"),
|
||||||
|
moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
|
||||||
|
"Leerstandszuschlag",
|
||||||
|
berechnungen?.primaerfaktorww.toString(),
|
||||||
|
Math.round(berechnungen?.kuehlungsZuschlag || 0).toString(),
|
||||||
|
"0",
|
||||||
|
"0",
|
||||||
|
"1.8"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------------------- Seite 4 -------------------------------- */
|
/* -------------------------------- Seite 4 -------------------------------- */
|
||||||
|
|
||||||
@@ -362,26 +521,13 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
|
|||||||
for (const empfehlung of empfehlungen) {
|
for (const empfehlung of empfehlungen) {
|
||||||
addEmpfehlung(empfehlung.anlagenteil, empfehlung.description, true, empfehlung.amortisationszeit, empfehlung.kosten)
|
addEmpfehlung(empfehlung.anlagenteil, empfehlung.description, true, empfehlung.amortisationszeit, empfehlung.kosten)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function addAnsichtsausweisLabel(page: PDFPage, font: PDFFont) {
|
|
||||||
page.drawText("Ansichtsausweis", {
|
|
||||||
x: page.getWidth() / 2 - font.heightAtSize(112) * 2.2, y: page.getHeight() - font.heightAtSize(112) / 2,
|
|
||||||
size: 112,
|
|
||||||
font,
|
|
||||||
rotate: {
|
|
||||||
type: RotationTypes.Degrees,
|
|
||||||
angle: -60
|
|
||||||
},
|
|
||||||
opacity: 0.3
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const page of pages) {
|
for (const page of pages) {
|
||||||
addAnsichtsausweisLabel(page, font)
|
addAnsichtsausweisLabel(page, font)
|
||||||
|
addDatumGEG(page, font)
|
||||||
}
|
}
|
||||||
|
|
||||||
// pdf.getForm().flatten()
|
pdf.getForm().flatten()
|
||||||
|
|
||||||
return pdf.save();
|
return pdf.save();
|
||||||
}
|
}
|
||||||
Binary file not shown.
13
src/lib/pdf/utils/checkbox.ts
Normal file
13
src/lib/pdf/utils/checkbox.ts
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
import { PDFPage, rgb } from "pdf-lib";
|
||||||
|
|
||||||
|
export function addCheckMark(page: PDFPage, x: number, y: number) {
|
||||||
|
page.drawSvgPath(
|
||||||
|
`<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M20.285 2l-11.285 11.567-5.286-5.011-3.714 3.716 9 8.728 15-15.285z"/></svg>`,
|
||||||
|
{
|
||||||
|
x,
|
||||||
|
y,
|
||||||
|
scale: 0.4,
|
||||||
|
color: rgb(0, 0, 0),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
24
src/lib/pdf/utils/helpers.ts
Normal file
24
src/lib/pdf/utils/helpers.ts
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
import { PDFPage, PDFFont, RotationTypes } from "pdf-lib";
|
||||||
|
|
||||||
|
export function addDatumGEG(page: PDFPage, font: PDFFont) {
|
||||||
|
page.drawText("20. Juli 2022", {
|
||||||
|
x: 308,
|
||||||
|
y: page.getHeight() - 70,
|
||||||
|
size: 10,
|
||||||
|
font,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export function addAnsichtsausweisLabel(page: PDFPage, font: PDFFont) {
|
||||||
|
page.drawText("Ansichtsausweis", {
|
||||||
|
x: page.getWidth() / 2 - font.heightAtSize(112) * 2.2,
|
||||||
|
y: page.getHeight() - font.heightAtSize(112) / 2,
|
||||||
|
size: 112,
|
||||||
|
font,
|
||||||
|
rotate: {
|
||||||
|
type: RotationTypes.Degrees,
|
||||||
|
angle: -60,
|
||||||
|
},
|
||||||
|
opacity: 0.3,
|
||||||
|
});
|
||||||
|
}
|
||||||
7
src/lib/pdf/utils/text.ts
Normal file
7
src/lib/pdf/utils/text.ts
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
import { PDFField, PDFFont, PDFPage } from "pdf-lib";
|
||||||
|
|
||||||
|
export function addText(page: PDFPage, text: string, x: number, y: number, size: number, font: PDFFont) {
|
||||||
|
page.drawText(text, {
|
||||||
|
font, x, y, size
|
||||||
|
})
|
||||||
|
}
|
||||||
18
src/lib/server/ausweis.ts
Normal file
18
src/lib/server/ausweis.ts
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
import { getAusweisartFromUUID } from "#components/Ausweis/types.js";
|
||||||
|
import { Enums, prisma } from "@ibcornelsen/database/server";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
export function getPrismaAusweisAdapter(uid: string) {
|
||||||
|
const ausweisart = getAusweisartFromUUID(uid);
|
||||||
|
|
||||||
|
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
|
||||||
|
return prisma.verbrauchsausweisWohnen
|
||||||
|
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
|
||||||
|
return prisma.verbrauchsausweisGewerbe
|
||||||
|
} else if (ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) {
|
||||||
|
return prisma.bedarfsausweisWohnen
|
||||||
|
}
|
||||||
|
}
|
||||||
294
src/lib/server/lexoffice.ts
Normal file
294
src/lib/server/lexoffice.ts
Normal file
@@ -0,0 +1,294 @@
|
|||||||
|
import { VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
|
||||||
|
import { LEX_OFFICE_API_KEY } from "#lib/constants.js";
|
||||||
|
import { Aufnahme, BedarfsausweisWohnen, Benutzer, Rechnung, VerbrauchsausweisGewerbe, VerbrauchsausweisWohnen } from "@ibcornelsen/database/client";
|
||||||
|
import { prisma } from "@ibcornelsen/database/server";
|
||||||
|
import moment from "moment";
|
||||||
|
|
||||||
|
export function lexOfficeAnfrageSenden(ausweis: VerbrauchsausweisWohnen | BedarfsausweisWohnen | VerbrauchsausweisGewerbe, options: {
|
||||||
|
bezeichnung: string,
|
||||||
|
positionstext: string,
|
||||||
|
preis: number,
|
||||||
|
anschreiben: string
|
||||||
|
}, aufnahme: Aufnahme, rechnung: Rechnung, user: Benutzer) {;
|
||||||
|
if (!user.lex_office_id) {
|
||||||
|
const lex_office_id = await createLexOfficeCustomer(user);
|
||||||
|
|
||||||
|
if (!lex_office_id) {
|
||||||
|
throw new Error("Beim erstellen der Lex Office ID ist etwas schiefgelaufen.")
|
||||||
|
}
|
||||||
|
|
||||||
|
user.lex_office_id = lex_office_id
|
||||||
|
|
||||||
|
await prisma.benutzer.update({
|
||||||
|
where: {
|
||||||
|
id: user.id
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
lex_office_id
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
let response: Response;
|
||||||
|
response = await fetch("https://api.lexoffice.io/v1/quotations?finalize=true", {
|
||||||
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
Accept: "application/json",
|
||||||
|
Authorization: `Bearer ${LEX_OFFICE_API_KEY}`,
|
||||||
|
"Content-Type": "application/json"
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
"voucherDate": moment(aufnahme.erstellungsdatum).format("YYYY-MM-DDTHH:mm:ss.SSSZ"),
|
||||||
|
"expirationDate": moment(aufnahme.erstellungsdatum).add(1, "month").format("YYYY-MM-DDTHH:mm:ss.SSSZ"),
|
||||||
|
"taxConditions": {
|
||||||
|
"taxType": "gross"
|
||||||
|
},
|
||||||
|
"shippingConditions": {
|
||||||
|
"shippingType": "none"
|
||||||
|
},
|
||||||
|
"address": {
|
||||||
|
"contactId": user.lex_office_id,
|
||||||
|
"name": `${user.vorname} ${user.name}`,
|
||||||
|
"street": rechnung.strasse,
|
||||||
|
"city": rechnung.ort,
|
||||||
|
"zip": rechnung.plz,
|
||||||
|
"countryCode": "DE",
|
||||||
|
"supplement": rechnung.zusatzzeile
|
||||||
|
},
|
||||||
|
"lineItems": [
|
||||||
|
{
|
||||||
|
"type": "custom",
|
||||||
|
"name": options.bezeichnung,
|
||||||
|
"description": options.positionstext,
|
||||||
|
"quantity": 1,
|
||||||
|
"lineItemAmount": options.preis,
|
||||||
|
"unitName": options.bezeichnung,
|
||||||
|
"unitPrice": {
|
||||||
|
"currency": "EUR",
|
||||||
|
"grossAmount": options.preis,
|
||||||
|
"taxRatePercentage": 19
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"totalPrice": {
|
||||||
|
"currency": "EUR",
|
||||||
|
"totalGrossAmount": options.preis,
|
||||||
|
},
|
||||||
|
"introduction": options.anschreiben,
|
||||||
|
"remark": "Wir freuen uns auf Ihre Auftragserteilung und sichern eine einwandfreie Ausführung zu."
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
const result = await response.json();
|
||||||
|
|
||||||
|
if (!result.id) {
|
||||||
|
throw new Error(`Ein Fehler ist aufgetreten: ${result.message}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rechnung PDF Holen
|
||||||
|
|
||||||
|
const lex_office_id = result.id;
|
||||||
|
|
||||||
|
response = await fetch(`https://api.lexoffice.io/v1/quotations/${lex_office_id}/document`, {
|
||||||
|
headers: {
|
||||||
|
Accept: "application/json",
|
||||||
|
Authorization: `Bearer ${LEX_OFFICE_API_KEY}`,
|
||||||
|
"Content-Type": "application/json"
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
const pdfResult = await response.json()
|
||||||
|
|
||||||
|
if (!pdfResult.documentFileId) {
|
||||||
|
throw new Error(`Ein Fehler ist aufgetreten: ${pdfResult.message}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
$pdf_id = $render_response["documentFileId"];
|
||||||
|
|
||||||
|
db()->execute("UPDATE Angebotsanfragen SET
|
||||||
|
Adresse_Objekt = :Adresse_Objekt,
|
||||||
|
PLZ_Objekt = :PLZ_Objekt,
|
||||||
|
Ort_Objekt = :Ort_Objekt,
|
||||||
|
Dienstleistung = :Dienstleistung,
|
||||||
|
Empfaengerrechnung = :Empfaengerrechnung,
|
||||||
|
Zusatzzeilerechnung = :Zusatzzeilerechnung,
|
||||||
|
Adresse = :Adresse,
|
||||||
|
PLZ = :PLZ,
|
||||||
|
Ort = :Ort,
|
||||||
|
Anlass = :Anlass,
|
||||||
|
Baujahrheizung = :Baujahrheizung,
|
||||||
|
Baujahrgebaeude = :Baujahrgebaeude,
|
||||||
|
Baujahrklima = :Baujahrklima,
|
||||||
|
Gebaeudetyp = :Gebaeudetyp,
|
||||||
|
Nutzflaeche = :Nutzflaeche,
|
||||||
|
Sanierungsstatus = :Sanierungsstatus,
|
||||||
|
Nachricht = :Nachricht,
|
||||||
|
Datei = :Datei,
|
||||||
|
Rolle = :Rolle,
|
||||||
|
Email = :Email,
|
||||||
|
Angebotspreis = :Angebotspreis,
|
||||||
|
Rabatt = :Rabatt,
|
||||||
|
`Status` = 'Verschickt',
|
||||||
|
lex_office_id = :lex_office_id,
|
||||||
|
Textanschreiben = :Textanschreiben,
|
||||||
|
Positionstext = :Positionstext
|
||||||
|
WHERE Auftragsnummer = :Auftragsnummer", [
|
||||||
|
"Adresse_Objekt": $_POST["gebaeude_strasse"],
|
||||||
|
"PLZ_Objekt": $_POST["gebaeude_plz"],
|
||||||
|
"Ort_Objekt": $_POST["gebaeude_ort"],
|
||||||
|
"Dienstleistung": $_POST["dienstleistung"],
|
||||||
|
"Empfaengerrechnung": $_POST["rechnung_empfaenger"],
|
||||||
|
"Zusatzzeilerechnung": $_POST["rechnung_zusatzzeile"],
|
||||||
|
"Adresse": $_POST["rechnung_strasse"],
|
||||||
|
"PLZ": $_POST["rechnung_plz"],
|
||||||
|
"Ort": $_POST["rechnung_ort"],
|
||||||
|
"Anlass": $_POST["anlass"],
|
||||||
|
"Baujahrheizung": $_POST["baujahr_heizung"],
|
||||||
|
"Baujahrgebaeude": $_POST["baujahr_gebaeude"],
|
||||||
|
"Baujahrklima": $_POST["baujahr_klimaanlage"],
|
||||||
|
"Gebaeudetyp": $_POST["gebaeudetyp"],
|
||||||
|
"Nutzflaeche": $_POST["nutzflaeche"],
|
||||||
|
"Sanierungsstatus": $_POST["sanierungsstatus"],
|
||||||
|
"Nachricht": $_POST["nachricht"],
|
||||||
|
"Datei": $dateien,
|
||||||
|
"Rolle": $_POST["rolle"],
|
||||||
|
"Email": $_POST["email"],
|
||||||
|
"Angebotspreis": $_POST["Angebotspreis"],
|
||||||
|
"Rabatt": $_POST["Rabatt"],
|
||||||
|
"lex_office_id": $lex_office_id,
|
||||||
|
"Textanschreiben": $_POST["Textanschreiben"],
|
||||||
|
"Positionstext": $_POST["Positionstext"],
|
||||||
|
"Auftragsnummer": $_POST["Auftragsnummer"]
|
||||||
|
]);
|
||||||
|
|
||||||
|
// Die Auftragsnummer abfragen
|
||||||
|
|
||||||
|
$curl_nummer = curl_init();
|
||||||
|
|
||||||
|
curl_setopt_array($curl_nummer, [
|
||||||
|
CURLOPT_URL: "https://api.lexoffice.io/v1/quotations/$lex_office_id",
|
||||||
|
CURLOPT_RETURNTRANSFER: true,
|
||||||
|
CURLOPT_ENCODING: "",
|
||||||
|
CURLOPT_MAXREDIRS: 10,
|
||||||
|
CURLOPT_TIMEOUT: 30,
|
||||||
|
CURLOPT_HTTP_VERSION: CURL_HTTP_VERSION_1_1,
|
||||||
|
CURLOPT_CUSTOMREQUEST: "GET",
|
||||||
|
CURLOPT_HTTPHEADER: [
|
||||||
|
"Accept: application/json",
|
||||||
|
"Authorization: Bearer " . LEX_OFFICE_API_KEY
|
||||||
|
]
|
||||||
|
]);
|
||||||
|
|
||||||
|
$nummer_response = curl_exec($curl_nummer);
|
||||||
|
$nummer_response = json_decode($nummer_response, true);
|
||||||
|
$err = curl_error($curl_nummer);
|
||||||
|
|
||||||
|
curl_close($curl_nummer);
|
||||||
|
|
||||||
|
// Und die Mail verschicken
|
||||||
|
|
||||||
|
$mail = new PHPMailer\PHPMailer\PHPMailer(true);
|
||||||
|
|
||||||
|
$mail->IsSMTP();
|
||||||
|
$mail->Host = "smtp.ionos.de";
|
||||||
|
$mail->SMTPAuth = true;
|
||||||
|
$mail->Username = 'info@online-energieausweis.org';
|
||||||
|
$mail->Password = 'Katendeich5a2024!';
|
||||||
|
|
||||||
|
$mail->CharSet = 'UTF-8';
|
||||||
|
$mail->Encoding = 'base64';
|
||||||
|
$mail->setFrom("info@online-energieausweis.org", "IB Cornelsen",0);
|
||||||
|
$mail->addAddress($_POST["email"], $_POST["vorname"] . " " . $_POST["name"]);
|
||||||
|
$mail->addCC("jens.cornelsen@ib-cornelsen.de", "Jens Cornelsen");
|
||||||
|
$mail->isHTML(true);
|
||||||
|
$mail->Subject = "{$nummer_response["voucherNumber"]} - {$_POST["Angebotsbezeichnung"]}";
|
||||||
|
|
||||||
|
|
||||||
|
// carriage return type (RFC)
|
||||||
|
$eol = "<br>";
|
||||||
|
$anrede = "Sehr geehrte" . ($_POST["anrede"] == "Herr" ? "r " : " ") . $_POST["anrede"];
|
||||||
|
|
||||||
|
$message = "$anrede {$_POST["name"]},{$eol}{$eol}";
|
||||||
|
$message .= "vielen Dank für Ihre Anfrage. Im Anhang finden Sie das ausgearbeitete Angebot als PDF-Dokument.{$eol}{$eol}";
|
||||||
|
$message .= "Mit freundlichen Grüßen,$eol";
|
||||||
|
$message .= "Jens Cornelsen$eol";
|
||||||
|
$message .= "--{$eol}IB Cornelsen{$eol}Katendeich 5A{$eol}21035 Hamburg{$eol}{$eol}www.ib-cornelsen.de{$eol}{$eol}Fon 040 209339858{$eol}Fax 040 209339859";
|
||||||
|
$mail->Body = $message;
|
||||||
|
|
||||||
|
$curl_pdf = curl_init();
|
||||||
|
|
||||||
|
curl_setopt_array($curl_pdf, [
|
||||||
|
CURLOPT_URL: "https://api.lexoffice.io/v1/files/$pdf_id",
|
||||||
|
CURLOPT_RETURNTRANSFER: true,
|
||||||
|
CURLOPT_ENCODING: "",
|
||||||
|
CURLOPT_MAXREDIRS: 10,
|
||||||
|
CURLOPT_TIMEOUT: 30,
|
||||||
|
CURLOPT_HTTP_VERSION: CURL_HTTP_VERSION_1_1,
|
||||||
|
CURLOPT_CUSTOMREQUEST: "GET",
|
||||||
|
CURLOPT_HTTPHEADER: [
|
||||||
|
"Accept: application/pdf",
|
||||||
|
"Authorization: Bearer " . LEX_OFFICE_API_KEY
|
||||||
|
]
|
||||||
|
]);
|
||||||
|
|
||||||
|
$response = curl_exec($curl_pdf);
|
||||||
|
$err = curl_error($curl_pdf);
|
||||||
|
|
||||||
|
$HOME = dirname($ROOT);
|
||||||
|
|
||||||
|
curl_close($curl_pdf);
|
||||||
|
$fp = fopen("$HOME/{$PERSISTENT_FOLDER}/angebote/$pdf_id.pdf", "w+");
|
||||||
|
fwrite($fp, $response);
|
||||||
|
fclose($fp);
|
||||||
|
|
||||||
|
$mail->addAttachment("$HOME/{$PERSISTENT_FOLDER}/angebote/$pdf_id.pdf", "Angebot.pdf");
|
||||||
|
|
||||||
|
$mail->send();
|
||||||
|
|
||||||
|
echo "Alles wurde abgesendet! Du kannst die Webseite nun verlassen.";
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function createLexOfficeCustomer(user: Benutzer) {
|
||||||
|
if (!user.adresse) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const response = await fetch("https://api.lexoffice.io/v1/contacts", {
|
||||||
|
body: JSON.stringify({
|
||||||
|
"version": "0",
|
||||||
|
"company": {
|
||||||
|
"name": `${user.vorname} ${user.name}`
|
||||||
|
},
|
||||||
|
"note": "",
|
||||||
|
"roles": {
|
||||||
|
"customer": {}
|
||||||
|
},
|
||||||
|
"addresses": {
|
||||||
|
"billing": [{
|
||||||
|
"street": user.adresse,
|
||||||
|
"zip": user.plz,
|
||||||
|
"city": user.ort,
|
||||||
|
"countryCode": "DE"
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
"emailAddresses": {
|
||||||
|
"business": user.email
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
Accept: "application/json",
|
||||||
|
Authorization: `Bearer ${LEX_OFFICE_API_KEY}`,
|
||||||
|
"Content-Type": "application/json"
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const result = await response.json();
|
||||||
|
|
||||||
|
if (!result.id) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return result.id;
|
||||||
|
}
|
||||||
52
src/lib/server/objekt.ts
Normal file
52
src/lib/server/objekt.ts
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
import { ObjektKomplettClient } from "#components/Ausweis/types.js";
|
||||||
|
import { omit } from "#lib/helpers.js";
|
||||||
|
import { prisma } from "@ibcornelsen/database/server";
|
||||||
|
|
||||||
|
export async function getObjektKomplettClient(uid: string): Promise<ObjektKomplettClient | null> {
|
||||||
|
const objekt = await prisma.objekt.findUnique({
|
||||||
|
where: {
|
||||||
|
uid
|
||||||
|
},
|
||||||
|
include: {
|
||||||
|
bilder: true,
|
||||||
|
aufnahmen: {
|
||||||
|
include: {
|
||||||
|
bedarfsausweis_wohnen: true,
|
||||||
|
verbrauchsausweis_gewerbe: true,
|
||||||
|
verbrauchsausweis_wohnen: true,
|
||||||
|
events: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
unterlagen: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!objekt) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
...omit(objekt, ["benutzer_id", "id", "aufnahmen", "bilder"]),
|
||||||
|
aufnahmen: objekt.aufnahmen.map(aufnahme => ({
|
||||||
|
...omit(aufnahme, ["id", "objekt_id", "benutzer_id", "bedarfsausweis_wohnen", "verbrauchsausweis_gewerbe", "verbrauchsausweis_wohnen"]),
|
||||||
|
bedarfsausweis_wohnen: (aufnahme.bedarfsausweis_wohnen && {
|
||||||
|
...omit(aufnahme.bedarfsausweis_wohnen, ["id", "aufnahme_id", "benutzer_id"]),
|
||||||
|
uid_aufnahme: aufnahme.uid,
|
||||||
|
uid_objekt: objekt.uid
|
||||||
|
}) || undefined,
|
||||||
|
verbrauchsausweis_wohnen: (aufnahme.verbrauchsausweis_wohnen && {
|
||||||
|
...omit(aufnahme.verbrauchsausweis_wohnen, ["id", "aufnahme_id", "benutzer_id"]),
|
||||||
|
uid_aufnahme: aufnahme.uid,
|
||||||
|
uid_objekt: objekt.uid
|
||||||
|
}) || undefined,
|
||||||
|
verbrauchsausweis_gewerbe: (aufnahme.verbrauchsausweis_gewerbe && {
|
||||||
|
...omit(aufnahme.verbrauchsausweis_gewerbe, ["id", "aufnahme_id", "benutzer_id"]),
|
||||||
|
uid_aufnahme: aufnahme.uid,
|
||||||
|
uid_objekt: objekt.uid
|
||||||
|
}) || undefined,
|
||||||
|
uid_objekt: objekt.uid,
|
||||||
|
})),
|
||||||
|
bilder: objekt.bilder.map(bild => omit(bild, ["id", "objekt_id"])),
|
||||||
|
unterlagen: objekt.unterlagen.map(unterlage => omit(unterlage, ["id", "objekt_id"]))
|
||||||
|
}
|
||||||
|
}
|
||||||
9
src/lib/server/user.ts
Normal file
9
src/lib/server/user.ts
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
|
||||||
|
import { checkAuthorizationHeader, checkAuthorizationHeaderNoThrow } from "#lib/middleware/authorization.js";
|
||||||
|
import { AstroGlobal } from "astro";
|
||||||
|
|
||||||
|
export function getCurrentUser(Astro: AstroGlobal) {
|
||||||
|
const accessToken = Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value;
|
||||||
|
|
||||||
|
return checkAuthorizationHeaderNoThrow(`Bearer ${accessToken}`)
|
||||||
|
}
|
||||||
@@ -2,7 +2,7 @@ import {
|
|||||||
VerbrauchsausweisWohnenSchema,
|
VerbrauchsausweisWohnenSchema,
|
||||||
AufnahmeSchema,
|
AufnahmeSchema,
|
||||||
ObjektSchema,
|
ObjektSchema,
|
||||||
GebaeudeBilderSchema,
|
BildSchema,
|
||||||
RechnungSchema,
|
RechnungSchema,
|
||||||
EventSchema,
|
EventSchema,
|
||||||
BenutzerSchema,
|
BenutzerSchema,
|
||||||
@@ -30,7 +30,7 @@ export const AnteilshaberValidator = AnteilshaberSchema.omit({
|
|||||||
objekt_id: true
|
objekt_id: true
|
||||||
})
|
})
|
||||||
|
|
||||||
export const GebaeudeBilderValidator = GebaeudeBilderSchema.omit({
|
export const BildValidator = BildSchema.omit({
|
||||||
id: true,
|
id: true,
|
||||||
objekt_id: true
|
objekt_id: true
|
||||||
})
|
})
|
||||||
@@ -79,8 +79,8 @@ export const ObjektValidator = ObjektSchema.omit({
|
|||||||
aufnahme: z.array(
|
aufnahme: z.array(
|
||||||
AufnahmeValidator
|
AufnahmeValidator
|
||||||
).nullable().optional(),
|
).nullable().optional(),
|
||||||
gebaeude_bilder: z.array(
|
bilder: z.array(
|
||||||
GebaeudeBilderValidator
|
BildValidator
|
||||||
).nullable().optional(),
|
).nullable().optional(),
|
||||||
gebaeude_plaene: z.array(
|
gebaeude_plaene: z.array(
|
||||||
GebaeudePlaeneValidator
|
GebaeudePlaeneValidator
|
||||||
@@ -112,8 +112,8 @@ export const VerbrauchsausweisWohnenValidator =
|
|||||||
id: true,
|
id: true,
|
||||||
}).merge(
|
}).merge(
|
||||||
z.object({
|
z.object({
|
||||||
gebaeude_bilder: z.array(
|
bilder: z.array(
|
||||||
GebaeudeBilderSchema.omit({
|
BildSchema.omit({
|
||||||
id: true,
|
id: true,
|
||||||
objekt_id: true,
|
objekt_id: true,
|
||||||
})
|
})
|
||||||
@@ -170,8 +170,8 @@ BedarfsausweisWohnenSchema.merge(
|
|||||||
id: true,
|
id: true,
|
||||||
}).merge(
|
}).merge(
|
||||||
z.object({
|
z.object({
|
||||||
gebaeude_bilder: z.array(
|
bilder: z.array(
|
||||||
GebaeudeBilderSchema.omit({
|
BildSchema.omit({
|
||||||
id: true,
|
id: true,
|
||||||
objekt_id: true,
|
objekt_id: true,
|
||||||
})
|
})
|
||||||
@@ -221,8 +221,8 @@ export const VerbrauchsausweisGewerbeValidator =
|
|||||||
id: true,
|
id: true,
|
||||||
}).merge(
|
}).merge(
|
||||||
z.object({
|
z.object({
|
||||||
gebaeude_bilder: z.array(
|
bilder: z.array(
|
||||||
GebaeudeBilderSchema.omit({
|
BildSchema.omit({
|
||||||
id: true,
|
id: true,
|
||||||
objekt_id: true,
|
objekt_id: true,
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -18,9 +18,6 @@
|
|||||||
bilder: UploadedGebaeudeBild[],
|
bilder: UploadedGebaeudeBild[],
|
||||||
events: Event[]
|
events: Event[]
|
||||||
}[];
|
}[];
|
||||||
|
|
||||||
console.log(ausweise);
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="gap-4 flex flex-col">
|
<div class="gap-4 flex flex-col">
|
||||||
|
|||||||
@@ -1,29 +1,20 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { BenutzerClient, ObjektClient } from "#components/Ausweis/types.js";
|
import { BenutzerClient, ObjektKomplettClient } from "#components/Ausweis/types.js";
|
||||||
|
import DashboardAusweis from "#components/Dashboard/DashboardAusweis.svelte";
|
||||||
|
import DashboardObjekt from "#components/Dashboard/DashboardObjekt.svelte";
|
||||||
|
|
||||||
export let user: BenutzerClient;
|
export let user: BenutzerClient;
|
||||||
export let objekte: ObjektClient[];
|
export let objekte: ObjektKomplettClient[];
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<h1 class="text-4xl font-medium my-8">Willkommen zurück, {user.vorname}!</h1>
|
<h1 class="text-4xl font-medium">Willkommen zurück, {user.vorname}!</h1>
|
||||||
<p class="text-lg">
|
<p class="text-lg">
|
||||||
Hier finden Sie eine Übersicht über all ihre Ausweise und Gebäude.
|
Hier finden Sie eine Übersicht über all ihre Ausweise und Gebäude.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h1 class="text-4xl font-medium my-8">Gebäude</h1>
|
<h1 class="text-4xl font-medium my-8">Gebäude</h1>
|
||||||
<div class="grid grid-cols-1 gap-4 lg:grid-cols-2">
|
<div class="grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3">
|
||||||
<!-- {#each objekte as objekt}
|
{#each objekte as objekt}
|
||||||
<div class="card lg:card-side bg-base-200 card-bordered border-base-300">
|
<DashboardObjekt {objekt}></DashboardObjekt>
|
||||||
<figure class="lg:w-1/2">
|
{/each}
|
||||||
<img
|
|
||||||
src={(objekt.gebaeude_bilder && `/bilder/${objekt.gebaeude_bilder[0]?.uid}.webp`) || "/images/placeholder.jpg"}
|
|
||||||
class="object-cover w-full h-full"
|
|
||||||
alt="Gebäudebild"
|
|
||||||
/>
|
|
||||||
</figure>
|
|
||||||
<div class="card-body lg:w-1/2 p-4">
|
|
||||||
<h4 class="text-lg font-semibold">{objekt.adresse}, {objekt.plz} {objekt.ort}</h4>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{/each} -->
|
|
||||||
</div>
|
</div>
|
||||||
33
src/modules/Dashboard/DashboardObjektModule.svelte
Normal file
33
src/modules/Dashboard/DashboardObjektModule.svelte
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import { BenutzerClient, ObjektKomplettClient } from "#components/Ausweis/types.js";
|
||||||
|
import Carousel from "#components/Carousel.svelte";
|
||||||
|
import DashboardAusweis from "#components/Dashboard/DashboardAusweis.svelte";
|
||||||
|
import { ChevronLeft, ChevronRight } from "radix-svelte-icons";
|
||||||
|
|
||||||
|
export let user: BenutzerClient;
|
||||||
|
export let objekt: ObjektKomplettClient;
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<h1 class="text-4xl font-medium mb-8">{objekt.adresse}</h1>
|
||||||
|
|
||||||
|
<div class="bg-white rounded-lg">
|
||||||
|
<Carousel perPage={1}>
|
||||||
|
{#each objekt.bilder as bild, i (i)}
|
||||||
|
<img src="/bilder/{bild.uid}.webp" alt={bild.kategorie} class="max-h-[60vh] h-full w-full object-contain">
|
||||||
|
{/each}
|
||||||
|
|
||||||
|
<span slot="left-control" class="p-2.5 bg-opacity-50 bg-white block rounded-full"><ChevronLeft size={24}></ChevronLeft></span>
|
||||||
|
<span slot="right-control" class="p-2.5 bg-opacity-50 bg-white block rounded-full"><ChevronRight size={24}></ChevronRight></span>
|
||||||
|
</Carousel>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="my-8 grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3">
|
||||||
|
{#each objekt.aufnahmen as aufnahme}
|
||||||
|
{@const ausweis = aufnahme.verbrauchsausweis_wohnen ?? aufnahme.verbrauchsausweis_gewerbe ?? aufnahme.bedarfsausweis_wohnen}
|
||||||
|
{#if !ausweis}
|
||||||
|
<p>Diese Aufnahme hat noch keinen Ausweis.</p>
|
||||||
|
{:else}
|
||||||
|
<DashboardAusweis {ausweis} {aufnahme} {objekt} progress={0}></DashboardAusweis>
|
||||||
|
{/if}
|
||||||
|
{/each}
|
||||||
|
</div>
|
||||||
@@ -71,11 +71,7 @@
|
|||||||
export let bezahlmethode: Bezahlmethoden =
|
export let bezahlmethode: Bezahlmethoden =
|
||||||
Enums.Bezahlmethoden.paypal;
|
Enums.Bezahlmethoden.paypal;
|
||||||
|
|
||||||
let prices: number[] = [];
|
let prices = PRICES[ausweisart];
|
||||||
|
|
||||||
if (aufnahme.ausweisart) {
|
|
||||||
prices = PRICES[aufnahme.ausweisart];
|
|
||||||
}
|
|
||||||
|
|
||||||
let basePrice: number = prices[0];
|
let basePrice: number = prices[0];
|
||||||
|
|
||||||
@@ -91,6 +87,7 @@
|
|||||||
[Enums.Ausweisart.VerbrauchsausweisGewerbe]: `/energieausweis-erstellen/verbrauchsausweis-gewerbe?uid=${ausweis.uid}`,
|
[Enums.Ausweisart.VerbrauchsausweisGewerbe]: `/energieausweis-erstellen/verbrauchsausweis-gewerbe?uid=${ausweis.uid}`,
|
||||||
[Enums.Ausweisart.BedarfsausweisWohnen]: `/energieausweis-erstellen/bedarfsausweis-wohnen?uid=${ausweis.uid}`,
|
[Enums.Ausweisart.BedarfsausweisWohnen]: `/energieausweis-erstellen/bedarfsausweis-wohnen?uid=${ausweis.uid}`,
|
||||||
[Enums.Ausweisart.BedarfsausweisGewerbe]: `/energieausweis-erstellen/bedarfsausweis-gewerbe?uid=${ausweis.uid}`,
|
[Enums.Ausweisart.BedarfsausweisGewerbe]: `/energieausweis-erstellen/bedarfsausweis-gewerbe?uid=${ausweis.uid}`,
|
||||||
|
[Enums.Ausweisart.GEGNachweisWohnen]: `/angebot-anfragen/geg-nachweis-wohnen-anfragen?uid=${ausweis.uid}`,
|
||||||
}[ausweisart]
|
}[ausweisart]
|
||||||
|
|
||||||
async function speichern(e: SubmitEvent) {
|
async function speichern(e: SubmitEvent) {
|
||||||
@@ -115,6 +112,10 @@
|
|||||||
window.location.href = `/kaufabschluss?uid=${ausweis.uid}`;
|
window.location.href = `/kaufabschluss?uid=${ausweis.uid}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function anfordern() {
|
||||||
|
// TODO Angebot anfordern
|
||||||
|
}
|
||||||
|
|
||||||
async function bestellen() {
|
async function bestellen() {
|
||||||
const ausweisart = getAusweisartFromUUID(ausweis.uid) as Enums.Ausweisart;
|
const ausweisart = getAusweisartFromUUID(ausweis.uid) as Enums.Ausweisart;
|
||||||
|
|
||||||
@@ -165,6 +166,7 @@
|
|||||||
bestellenNichtMoeglich = true
|
bestellenNichtMoeglich = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const gegAnfrage = (ausweisart === Enums.Ausweisart.GEGNachweisWohnen) || (ausweisart === Enums.Ausweisart.GEGNachweisBedarfsausweis) || (ausweisart === Enums.Ausweisart.GEGNachweisGewerbe)
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
@@ -174,6 +176,7 @@
|
|||||||
2xl:grid-cols-2 2xl:gap-x-8
|
2xl:grid-cols-2 2xl:gap-x-8
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
|
{#if !gegAnfrage}
|
||||||
<div id="performance-box" class="w-full box relative px-4 order-1 self-stretch grid grid-cols-1">
|
<div id="performance-box" class="w-full box relative px-4 order-1 self-stretch grid grid-cols-1">
|
||||||
<PerformanceScore
|
<PerformanceScore
|
||||||
bind:ausweis
|
bind:ausweis
|
||||||
@@ -182,6 +185,7 @@
|
|||||||
{ausweisart}
|
{ausweisart}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
{/if}
|
||||||
|
|
||||||
<div
|
<div
|
||||||
id="progress-box"
|
id="progress-box"
|
||||||
@@ -189,9 +193,13 @@
|
|||||||
>
|
>
|
||||||
<h1 class="text-secondary text-3xl m-0">Energiesausweis erstellen</h1>
|
<h1 class="text-secondary text-3xl m-0">Energiesausweis erstellen</h1>
|
||||||
<h2 class="text-primary text-xl">
|
<h2 class="text-primary text-xl">
|
||||||
Verbrauchsausweis Wohnen {PRICES.VerbrauchsausweisWohnen[0]} €
|
{ausweisart} {prices[0]} €
|
||||||
</h2>
|
</h2>
|
||||||
<Progressbar step2={'step'}/>
|
{#if gegAnfrage}
|
||||||
|
<Progressbar active={1} steps={["Gebäudedaten", "Kundendaten", "Bestätigung"]}/>
|
||||||
|
{:else}
|
||||||
|
<Progressbar active={1}/>
|
||||||
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -208,10 +216,10 @@
|
|||||||
<Rechnungsadresse bind:user bind:rechnung /></Bereich
|
<Rechnungsadresse bind:user bind:rechnung /></Bereich
|
||||||
>
|
>
|
||||||
|
|
||||||
|
{#if !gegAnfrage}
|
||||||
<Bereich bereich="3" title="Bezahlmethode">
|
<Bereich bereich="3" title="Bezahlmethode">
|
||||||
<Bezahlung bind:selectedPaymentType={bezahlmethode} /></Bereich
|
<Bezahlung bind:selectedPaymentType={bezahlmethode} /></Bereich
|
||||||
>
|
>
|
||||||
|
|
||||||
<div class="grid grid-cols-2 gap-x-6 my-6">
|
<div class="grid grid-cols-2 gap-x-6 my-6">
|
||||||
<div class="zusaetze bereich-box bg-white">
|
<div class="zusaetze bereich-box bg-white">
|
||||||
<h3>Zusatzleistungen:</h3>
|
<h3>Zusatzleistungen:</h3>
|
||||||
@@ -275,6 +283,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{/if}
|
||||||
|
|
||||||
<div
|
<div
|
||||||
class="w-full grid grid-cols-[min-content_1fr_min-content_min-content] grid-rows-[min_content_1fr] gap-x-2 self-start justify-self-end mt-8"
|
class="w-full grid grid-cols-[min-content_1fr_min-content_min-content] grid-rows-[min_content_1fr] gap-x-2 self-start justify-self-end mt-8"
|
||||||
@@ -285,7 +294,11 @@
|
|||||||
|
|
||||||
<button class="button">Speichern</button>
|
<button class="button">Speichern</button>
|
||||||
|
|
||||||
<button class="button cursor-pointer" data-cy="bestellen" on:click={bestellen} >Kostenpflichtig bestellen</button>
|
{#if gegAnfrage}
|
||||||
|
<button class="button cursor-pointer" data-cy="bestellen" on:click={anfordern} >Angebot anfordern</button>
|
||||||
|
{:else}
|
||||||
|
<button class="button cursor-pointer" data-cy="bestellen" on:click={bestellen} >Kostenpflichtig bestellen</button>
|
||||||
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -85,7 +85,7 @@
|
|||||||
|
|
||||||
<h1 class="text-secondary text-3xl m-0">Energiesausweis erstellen</h1>
|
<h1 class="text-secondary text-3xl m-0">Energiesausweis erstellen</h1>
|
||||||
<h2 class="text-primary text-xl">Verbrauchsausweis Gewerbe {PRICES.VerbrauchsausweisGewerbe[0]} €</h2>
|
<h2 class="text-primary text-xl">Verbrauchsausweis Gewerbe {PRICES.VerbrauchsausweisGewerbe[0]} €</h2>
|
||||||
<Progressbar step1={'step'} />
|
<Progressbar active={0} />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -227,9 +227,9 @@ lg:grid-cols-2 lg:gap-x-6
|
|||||||
|
|
||||||
<div id="progress-box" class="w-full box relative px-4 py-3 text-center order-2 self-stretch">
|
<div id="progress-box" class="w-full box relative px-4 py-3 text-center order-2 self-stretch">
|
||||||
|
|
||||||
<h1 class="text-secondary text-3xl m-0">Energiesausweis erstellen</h1>
|
<h1 class="text-secondary text-3xl m-0">Energieausweis erstellen</h1>
|
||||||
<h2 class="text-primary text-xl">{ausweisart} {PRICES.VerbrauchsausweisWohnen[0]} €</h2>
|
<h2 class="text-primary text-xl">{ausweisart} {PRICES.VerbrauchsausweisWohnen[0]} €</h2>
|
||||||
<Progressbar step1={'step'}/>
|
<Progressbar active={0}/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
362
src/modules/angebot-anfragen/GEGNachweisWohnenModule.svelte
Normal file
362
src/modules/angebot-anfragen/GEGNachweisWohnenModule.svelte
Normal file
@@ -0,0 +1,362 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import Ausweisart from "#components/Ausweis/Ausweisart.svelte";
|
||||||
|
import GebaeudeDaten from "#components/Ausweis/GebaeudeDaten.svelte";
|
||||||
|
import {
|
||||||
|
VerbrauchsausweisWohnenClient,
|
||||||
|
ObjektClient,
|
||||||
|
AufnahmeClient,
|
||||||
|
BenutzerClient,
|
||||||
|
UploadedGebaeudeBild,
|
||||||
|
UnterlageClient,
|
||||||
|
GEGNachweisWohnenClient,
|
||||||
|
} from "#components/Ausweis/types.js";
|
||||||
|
import Bereich from "#components/labels/Bereich.svelte";
|
||||||
|
import { Enums } from "@ibcornelsen/database/client";
|
||||||
|
import InputLabel from "#components/labels/InputLabel.svelte";
|
||||||
|
import HelpLabel from "#components/labels/HelpLabel.svelte";
|
||||||
|
import Progressbar from "#components/Ausweis/Progressbar.svelte";
|
||||||
|
import FileGrid from "#components/FileGrid.svelte";
|
||||||
|
import Hilfe from "#components/Ausweis/Hilfe.svelte";
|
||||||
|
import Overlay from "#components/Overlay.svelte";
|
||||||
|
import EmbeddedAuthFlowModule from "#modules/EmbeddedAuthFlowModule.svelte";
|
||||||
|
import { validateAccessTokenClient } from "#client/lib/validateAccessToken.js";
|
||||||
|
import { api } from "astro-typesafe-api/client";
|
||||||
|
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
|
||||||
|
import { exclude } from "#lib/exclude.js";
|
||||||
|
import Cookies from "js-cookie";
|
||||||
|
|
||||||
|
export async function nachweisSpeichern(
|
||||||
|
nachweis: GEGNachweisWohnenClient,
|
||||||
|
objekt: ObjektClient,
|
||||||
|
aufnahme: AufnahmeClient,
|
||||||
|
unterlagen: (UnterlageClient & { data?: string })[]
|
||||||
|
) {
|
||||||
|
if (objekt.uid) {
|
||||||
|
await api.objekt._uid.PATCH.fetch({
|
||||||
|
...exclude(objekt, ["uid"])
|
||||||
|
}, {
|
||||||
|
params: {
|
||||||
|
uid: objekt.uid
|
||||||
|
},
|
||||||
|
headers: {
|
||||||
|
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
const { uid } = await api.objekt.PUT.fetch({
|
||||||
|
...exclude(objekt, ["uid"])
|
||||||
|
}, {
|
||||||
|
headers: {
|
||||||
|
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
objekt.uid = uid;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if (aufnahme.uid) {
|
||||||
|
await api.aufnahme._uid.PATCH.fetch({
|
||||||
|
...exclude({...aufnahme, baujahr_klima: []}, ["uid"])
|
||||||
|
}, {
|
||||||
|
params: {
|
||||||
|
uid: aufnahme.uid
|
||||||
|
},
|
||||||
|
headers: {
|
||||||
|
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
const { uid } = await api.aufnahme.PUT.fetch({
|
||||||
|
aufnahme: {...aufnahme, baujahr_klima: []},
|
||||||
|
uid_objekt: objekt.uid
|
||||||
|
}, {
|
||||||
|
headers: {
|
||||||
|
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
aufnahme.uid = uid
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nachweis.uid) {
|
||||||
|
await api["geg-nachweis-wohnen"]._uid.PATCH.fetch({
|
||||||
|
|
||||||
|
...exclude(nachweis, ["uid"])
|
||||||
|
}, {
|
||||||
|
params: {
|
||||||
|
uid: nachweis.uid
|
||||||
|
},
|
||||||
|
headers: {
|
||||||
|
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
const { uid } = await api["geg-nachweis-wohnen"].PUT.fetch({
|
||||||
|
nachweis: nachweis,
|
||||||
|
uid_aufnahme: aufnahme.uid
|
||||||
|
}, {
|
||||||
|
headers: {
|
||||||
|
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
nachweis.uid = uid;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const unterlage of unterlagen) {
|
||||||
|
if (unterlage.uid || !unterlage.data) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const response = await api.objekt._uid.unterlagen.PUT.fetch({
|
||||||
|
data: unterlage.data,
|
||||||
|
kategorie: unterlage.kategorie,
|
||||||
|
mime: unterlage.mime,
|
||||||
|
name: unterlage.name
|
||||||
|
}, {
|
||||||
|
params: {
|
||||||
|
uid: objekt.uid
|
||||||
|
},
|
||||||
|
headers: {
|
||||||
|
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
unterlage.uid = response.uid
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
uid_ausweis: nachweis.uid,
|
||||||
|
uid_aufnahme: aufnahme.uid,
|
||||||
|
uid_objekt: objekt.uid
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async function nachweisAbschicken() {
|
||||||
|
if (!(await validateAccessTokenClient())) {
|
||||||
|
loginOverlayHidden = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = await nachweisSpeichern(nachweis, objekt, aufnahme, unterlagen)
|
||||||
|
|
||||||
|
if (result !== null) {
|
||||||
|
window.history.pushState(
|
||||||
|
{},
|
||||||
|
"",
|
||||||
|
`${location.pathname}?uid=${result.uid_ausweis}`
|
||||||
|
);
|
||||||
|
window.location.href = `/kundendaten?uid=${result.uid_ausweis}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
loginOverlayHidden = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function spaeterWeitermachen() {
|
||||||
|
if (!(await validateAccessTokenClient())) {
|
||||||
|
loginOverlayHidden = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
loginOverlayHidden = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
let loginOverlayHidden = true;
|
||||||
|
|
||||||
|
export let nachweis: GEGNachweisWohnenClient;
|
||||||
|
export let objekt: ObjektClient;
|
||||||
|
export let aufnahme: AufnahmeClient;
|
||||||
|
export let user: BenutzerClient = {} as BenutzerClient;
|
||||||
|
export let bilder: UploadedGebaeudeBild[] = [];
|
||||||
|
export let plaene: (UnterlageClient & { data: string })[] =
|
||||||
|
[];
|
||||||
|
export let unterlagen: (UnterlageClient & {
|
||||||
|
data: string;
|
||||||
|
})[] = [];
|
||||||
|
|
||||||
|
|
||||||
|
if (Object.keys(nachweis).length === 0) {
|
||||||
|
const localStorageAusweis = localStorage.getItem("ausweis");
|
||||||
|
if (localStorageAusweis) {
|
||||||
|
nachweis = JSON.parse(localStorageAusweis)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Object.keys(aufnahme).length === 0) {
|
||||||
|
const localStorageAufnahme = localStorage.getItem("aufnahme");
|
||||||
|
if (localStorageAufnahme) {
|
||||||
|
aufnahme = JSON.parse(localStorageAufnahme)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Object.keys(objekt).length === 0) {
|
||||||
|
const localStorageObjekt = localStorage.getItem("objekt");
|
||||||
|
if (localStorageObjekt) {
|
||||||
|
objekt = JSON.parse(localStorageObjekt)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$: {
|
||||||
|
if (nachweis.uid && objekt.uid && aufnahme.uid) {
|
||||||
|
localStorage.setItem(nachweis.uid, JSON.stringify(nachweis))
|
||||||
|
localStorage.setItem(objekt.uid, JSON.stringify(objekt))
|
||||||
|
localStorage.setItem(aufnahme.uid, JSON.stringify(aufnahme))
|
||||||
|
} else {
|
||||||
|
localStorage.setItem("ausweis", JSON.stringify(nachweis))
|
||||||
|
localStorage.setItem("aufnahme", JSON.stringify(aufnahme))
|
||||||
|
localStorage.setItem("objekt", JSON.stringify(objekt))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const ausweisart = Enums.Ausweisart.GEGNachweisVerbrauchsausweisWohnen;
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div
|
||||||
|
id="skala"
|
||||||
|
class="bg-white grid grid-cols-1 p-4 lg:grid-cols-2 lg:gap-x-6 no-scroll"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
id="progress-box"
|
||||||
|
class="w-full box relative px-4 py-3 text-center order-2 self-stretch"
|
||||||
|
>
|
||||||
|
<h1 class="text-secondary text-3xl m-0">GEG Nachweis Anfragen</h1>
|
||||||
|
<h2 class="text-primary text-xl">Verbrauchsausweis Wohnen</h2>
|
||||||
|
<Progressbar
|
||||||
|
active={0}
|
||||||
|
steps={["Gebäudedaten", "Kundendaten", "Bestätigung"]}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<form
|
||||||
|
id="formInput-1"
|
||||||
|
on:submit={nachweisAbschicken}
|
||||||
|
name="ausweis"
|
||||||
|
data-test="ausweis"
|
||||||
|
>
|
||||||
|
<div id="formular-box" class="formular-boxen ring-0">
|
||||||
|
<!-- A Prüfung der Ausweisart -->
|
||||||
|
|
||||||
|
<Bereich bereich="A" title="Prüfung der Ausweisart">
|
||||||
|
<Ausweisart bind:objekt bind:aufnahme bind:ausweis={nachweis} {ausweisart} />
|
||||||
|
</Bereich>
|
||||||
|
|
||||||
|
<!-- B Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgeschoss -->
|
||||||
|
|
||||||
|
<Bereich
|
||||||
|
bereich="B"
|
||||||
|
title="Eingabe der Gebäudeadresse - Angaben zu Wohnfläche, Keller und Dachgeschoss"
|
||||||
|
><GebaeudeDaten bind:aufnahme bind:objekt {ausweisart} /></Bereich
|
||||||
|
>
|
||||||
|
|
||||||
|
<Bereich bereich="C" title="Beschreibung des Bauvorhabens">
|
||||||
|
<div class="bereich-box">
|
||||||
|
<div class="input-standard order-3 md:order-5 xl:order-3">
|
||||||
|
<InputLabel
|
||||||
|
title="Angaben zur Heizung, Lüftung, Energieerezugung, Qualität und Aufbau der Gebäudehülle usw."
|
||||||
|
></InputLabel>
|
||||||
|
|
||||||
|
<textarea class="rounded-e-none" rows="10" bind:value={nachweis.beschreibung}></textarea>
|
||||||
|
|
||||||
|
<div class="help-label">
|
||||||
|
<HelpLabel>
|
||||||
|
Geben Sie kurz an: Heizung, Lüftung, regenerative
|
||||||
|
Energie (Solar, PV) und die Gebäudehülle (Qualität,
|
||||||
|
Aufbau).
|
||||||
|
</HelpLabel>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Bereich>
|
||||||
|
|
||||||
|
<Bereich bereich="D" title="Gebäudepläne & Unterlagen">
|
||||||
|
<div
|
||||||
|
class="bereich-box grid grid-cols-1 lg:grid-cols-2 gap-x-6 mt-6"
|
||||||
|
>
|
||||||
|
<div class="md:box md:card mb-0">
|
||||||
|
<div class="font-bold mb-2">Pläne</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
Hier können sie Grundrisspläne, Ansichtspläne und
|
||||||
|
Schnitte hochladen. Die Dateien können entweder im PDF
|
||||||
|
Format oder als Bild hochgeladen werden.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="md:box md:card mb-0 mt-6 md:mt-0">
|
||||||
|
<div>
|
||||||
|
<strong
|
||||||
|
>Bitte laden Sie hier mind. 1 Dokument hoch:</strong
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
<FileGrid
|
||||||
|
max={Infinity}
|
||||||
|
min={1}
|
||||||
|
name={"plaene"}
|
||||||
|
bind:files={plaene}
|
||||||
|
bind:ausweis={nachweis}
|
||||||
|
bind:objekt
|
||||||
|
></FileGrid>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="bereich-box grid grid-cols-1 lg:grid-cols-2 gap-x-6 mt-6"
|
||||||
|
>
|
||||||
|
<div class="md:box md:card mb-0">
|
||||||
|
<div class="font-bold mb-2">Unterlagen</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
Hier können sie weitere Unterlagen wie z.B.
|
||||||
|
Baugenehmigungen, U-Wert Berechnungen, Anlagentechnik
|
||||||
|
oder ihren alten Energieausweis hochladen. Die Dateien
|
||||||
|
können entweder im PDF Format oder als Bild hochgeladen
|
||||||
|
werden.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="md:box md:card mb-0 mt-6 md:mt-0">
|
||||||
|
<FileGrid
|
||||||
|
max={Infinity}
|
||||||
|
min={0}
|
||||||
|
name={"unterlagen"}
|
||||||
|
bind:files={unterlagen}
|
||||||
|
bind:ausweis={nachweis}
|
||||||
|
bind:objekt
|
||||||
|
></FileGrid>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Bereich>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
class="grid grid-cols-[1fr_min-content_min-content_min-content] grid-rows-[min_content_1fr] gap-x-2 self-start justify-self-end mt-8"
|
||||||
|
>
|
||||||
|
<div></div>
|
||||||
|
|
||||||
|
<Hilfe />
|
||||||
|
|
||||||
|
<button class="button" type="button" on:click={spaeterWeitermachen}
|
||||||
|
>Später Weitermachen
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<Overlay bind:hidden={loginOverlayHidden}>
|
||||||
|
<div class="bg-white w-full max-w-screen-sm py-8">
|
||||||
|
<EmbeddedAuthFlowModule onLogin={nachweisAbschicken}
|
||||||
|
></EmbeddedAuthFlowModule>
|
||||||
|
</div>
|
||||||
|
</Overlay>
|
||||||
|
|
||||||
|
<button
|
||||||
|
on:click={nachweisAbschicken}
|
||||||
|
type="button"
|
||||||
|
class="button"
|
||||||
|
data-cy="weiter">Weiter</button
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
---
|
||||||
|
import AusweisLayout from "#layouts/AusweisLayoutDaten.astro";
|
||||||
|
import { AufnahmeClient, GEGNachweisWohnenClient, ObjektClient, UploadedGebaeudeBild } from "#components/Ausweis/types";
|
||||||
|
import { createCaller } from "../../astro-typesafe-api-caller.js";
|
||||||
|
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
|
||||||
|
import { validateAccessTokenServer } from "#server/lib/validateAccessToken.js";
|
||||||
|
import GEGNachweisWohnenModule from "#modules/angebot-anfragen/GEGNachweisWohnenModule.svelte";
|
||||||
|
|
||||||
|
const uid = Astro.url.searchParams.get("uid");
|
||||||
|
let nachweis: GEGNachweisWohnenClient = {} as GEGNachweisWohnenClient;
|
||||||
|
let aufnahme: AufnahmeClient = {} as AufnahmeClient;
|
||||||
|
let objekt: ObjektClient = {} as ObjektClient;
|
||||||
|
let bilder: UploadedGebaeudeBild[] = []
|
||||||
|
|
||||||
|
const valid = validateAccessTokenServer(Astro);
|
||||||
|
|
||||||
|
const caller = createCaller(Astro);
|
||||||
|
|
||||||
|
if (uid) {
|
||||||
|
if (!valid) {
|
||||||
|
return Astro.redirect(
|
||||||
|
`/auth/login?redirect=${Astro.url.toString()}`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
nachweis = await caller["geg-nachweis-wohnen"]._uid.GET.fetch(null, {
|
||||||
|
headers: {
|
||||||
|
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||||
|
},
|
||||||
|
params: {
|
||||||
|
uid
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
aufnahme = await caller.aufnahme._uid.GET.fetch(null, {
|
||||||
|
headers: {
|
||||||
|
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||||
|
},
|
||||||
|
params: {
|
||||||
|
uid: nachweis.uid_aufnahme
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
objekt = await caller.objekt._uid.GET.fetch(null, {
|
||||||
|
headers: {
|
||||||
|
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||||
|
},
|
||||||
|
params: {
|
||||||
|
uid: nachweis.uid_objekt
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
bilder = await caller.aufnahme._uid.bilder.GET.fetch(null, {
|
||||||
|
headers: {
|
||||||
|
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||||
|
},
|
||||||
|
params: {
|
||||||
|
uid: nachweis.uid_aufnahme
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!nachweis) {
|
||||||
|
// Der Ausweis scheint nicht zu existieren.
|
||||||
|
// Wir leiten auf die generische Ausweisseite ohne UID weiter.
|
||||||
|
return Astro.redirect(
|
||||||
|
"/angebot-anfragen/geg-nachweis-wohnen-anfragen"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} catch(e) {
|
||||||
|
return Astro.redirect(
|
||||||
|
"/angebot-anfragen/geg-nachweis-wohnen-anfragen"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
---
|
||||||
|
|
||||||
|
<AusweisLayout title="GEG Nachweis Wohnen anfragen">
|
||||||
|
<GEGNachweisWohnenModule client:only {nachweis} {objekt} {aufnahme} {bilder} />
|
||||||
|
</AusweisLayout>
|
||||||
209
src/pages/api/admin/ausstellen.ts
Normal file
209
src/pages/api/admin/ausstellen.ts
Normal file
@@ -0,0 +1,209 @@
|
|||||||
|
import { getAusweisartFromUUID } from "#components/Ausweis/types.js";
|
||||||
|
import { adminMiddleware } from "#lib/middleware/authorization.js";
|
||||||
|
import { pdfDatenblattVerbrauchsausweisWohnen } from "#lib/pdf/pdfDatenblattVerbrauchsausweisWohnen.js";
|
||||||
|
import { pdfVerbrauchsausweisWohnen } from "#lib/pdf/pdfVerbrauchsausweisWohnen.js";
|
||||||
|
import { Enums, prisma } from "@ibcornelsen/database/server";
|
||||||
|
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
||||||
|
import { z } from "astro:content";
|
||||||
|
import { fileURLToPath } from "url";
|
||||||
|
import * as fs from "fs";
|
||||||
|
import { transport } from "#lib/mail.js";
|
||||||
|
import { BASE_URI } from "#lib/constants.js";
|
||||||
|
|
||||||
|
export const GET = defineApiRoute({
|
||||||
|
input: z.object({
|
||||||
|
uid: z.string(),
|
||||||
|
}),
|
||||||
|
output: z.void(),
|
||||||
|
middleware: adminMiddleware,
|
||||||
|
async fetch({ uid }, context, user) {
|
||||||
|
const ausweisart = getAusweisartFromUUID(uid);
|
||||||
|
|
||||||
|
if (ausweisart === "VerbrauchsausweisWohnen") {
|
||||||
|
const ausweis = await prisma.verbrauchsausweisWohnen.findUnique({
|
||||||
|
where: {
|
||||||
|
uid,
|
||||||
|
},
|
||||||
|
include: {
|
||||||
|
aufnahme: {
|
||||||
|
include: {
|
||||||
|
objekt: {
|
||||||
|
include: {
|
||||||
|
bilder: true,
|
||||||
|
benutzer: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!ausweis) {
|
||||||
|
throw new APIError({
|
||||||
|
code: "BAD_REQUEST",
|
||||||
|
message: "Ausweis existiert nicht.",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const rechnung = await prisma.rechnung.findFirst({
|
||||||
|
where: {
|
||||||
|
aufnahme_id: ausweis.aufnahme.id,
|
||||||
|
},
|
||||||
|
orderBy: {
|
||||||
|
erstellt_am: "desc",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!rechnung) {
|
||||||
|
throw new APIError({
|
||||||
|
code: "BAD_REQUEST",
|
||||||
|
message:
|
||||||
|
"Die Rechnung wurde noch nicht erstellt, wir können nicht fortfahren.",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
// SECTION: Rechnung erstellen (LexOffice)
|
||||||
|
// Wir wollen die Rechnung an lex office versenden, und uns die ID von da holen.
|
||||||
|
// Falls die Rechnung bereits existiert ist das nicht nötig.
|
||||||
|
// if (!$rechnung->lex_office_id) {
|
||||||
|
// [$lex_office_id, $renr] = createInvoice($ausweis, $rechnung);
|
||||||
|
// sleep(1); // TODO: Nach der Umstellung von LexOffice auf etwas anderes MUSS das hier unbedingt entfernt werden!
|
||||||
|
|
||||||
|
// if (!$lex_office_id || !$renr) {
|
||||||
|
// die("Bei der Erstellung der Rechnung ist etwas schiefgelaufen - Möglicherweise ist etwas mit LexOffice?");
|
||||||
|
// }
|
||||||
|
|
||||||
|
// $rechnung->lex_office_id = $lex_office_id;
|
||||||
|
// $rechnung->rechnungsnummer = $renr;
|
||||||
|
// $rechnung->save();
|
||||||
|
// }
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
// if ($ausweis->erledigt != 2) {$ausweis->erstellungsdatum = date("Y-m-d H:i:s");}
|
||||||
|
// $ausweis->erledigt = 2;
|
||||||
|
// $ausweis->save();
|
||||||
|
|
||||||
|
const pdfAusweis = await pdfVerbrauchsausweisWohnen(
|
||||||
|
ausweis,
|
||||||
|
ausweis.aufnahme,
|
||||||
|
ausweis.aufnahme.objekt,
|
||||||
|
ausweis.aufnahme.bilder,
|
||||||
|
ausweis.aufnahme.objekt.benutzer
|
||||||
|
);
|
||||||
|
const pdfDatenblatt = await pdfDatenblattVerbrauchsausweisWohnen(
|
||||||
|
ausweis,
|
||||||
|
ausweis.aufnahme,
|
||||||
|
ausweis.aufnahme.objekt,
|
||||||
|
ausweis.aufnahme.objekt.benutzer
|
||||||
|
);
|
||||||
|
|
||||||
|
const pdfAusweisPath = fileURLToPath(
|
||||||
|
new URL(
|
||||||
|
`../../../../persistent/generated/Ausweis-${ausweis.uid}.pdf`,
|
||||||
|
import.meta.url
|
||||||
|
)
|
||||||
|
);
|
||||||
|
const pdfDatenblattPath = fileURLToPath(
|
||||||
|
new URL(
|
||||||
|
`../../../../persistent/generated/Datenblatt-${ausweis.uid}.pdf`,
|
||||||
|
import.meta.url
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
fs.writeFileSync(pdfAusweisPath, pdfAusweis);
|
||||||
|
fs.writeFileSync(pdfDatenblattPath, pdfDatenblatt);
|
||||||
|
|
||||||
|
let text: string;
|
||||||
|
|
||||||
|
if (rechnung.status === Enums.Rechnungsstatus.paid) {
|
||||||
|
text = `
|
||||||
|
<p>Sehr geehrte*r ${user.vorname} ${user.name},</p>
|
||||||
|
|
||||||
|
<p>im Anhang finden Sie Ihren geprüften Energieusweis inkl. Rechnung als PDF-Datei. Den Rechnungsbetrag haben Sie bereits bezahlt. Vielen Dank.</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Mit freundlichen Grüßen,
|
||||||
|
<br>
|
||||||
|
Dipl.-Ing. Jens Cornelsen
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<strong>IB Cornelsen</strong>
|
||||||
|
<br>
|
||||||
|
Katendeich 5A
|
||||||
|
<br>
|
||||||
|
21035 Hamburg
|
||||||
|
<br>
|
||||||
|
www.online-energieausweis.org
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
fon 040 · 209339850
|
||||||
|
<br>
|
||||||
|
fax 040 · 209339859
|
||||||
|
</p>`;
|
||||||
|
} else {
|
||||||
|
text = `
|
||||||
|
<p>Sehr geehrte*r ${user.vorname} ${user.name},</p>
|
||||||
|
|
||||||
|
<p>im Anhang finden Sie Ihren geprüften Energieusweis inkl. Rechnung als PDF-Datei. Nachfolgend finden Sie unsere Bankverbindung. Bitte geben Sie als Verwendungszweck die Rechnungsnummer an (siehe unten). Vielen Dank.</p>
|
||||||
|
|
||||||
|
<br>
|
||||||
|
<table>
|
||||||
|
<tr><td>Kreditinstitut</td><td>:</td><td>\t Commerzbank AG</td>
|
||||||
|
<tr><td>Empfänger</td><td>:</td><td>\t IB Cornelsen</td>
|
||||||
|
<tr><td>IBAN</td><td>:<td>\t DE81 2004 0000 0348 6008 00</td>
|
||||||
|
<tr><td>BIC</td><td>:</td><td>\t COBADEFFXXX</td>
|
||||||
|
<tr><td>Betrag</td><td>:</td><td>\t <b>${rechnung.betrag}€</b></td>
|
||||||
|
<tr><td>Verwendungszweck</td><td>:</td><td>\t <b>${rechnung.uid}</b></td>
|
||||||
|
</table>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Alternativ können Sie auch direkt online zahlen indem Sie auf den entsprechenden Link klicken:
|
||||||
|
</p>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr><td>Per Einzuglastschrift zahlen</td> <td>:</td> <td><a href='${BASE_URI}/energieausweis-erstellen/kaufabschluss-fortsetzen?uid=${ausweis.uid}&p=SEPA'>jetzt per ELV bezahlen</a></td></tr>
|
||||||
|
<tr><td>Per Sofortüberweisung zahlen</td> <td>:</td> <td><a href='${BASE_URI}/energieausweis-erstellen/kaufabschluss-fortsetzen?uid=${ausweis.uid}&p=Sofort'>jetzt per Sofortüberweisung bezahlen</a></td></tr>
|
||||||
|
<tr><td>Über PayPal zahlen</td> <td>:</td> <td><a href='${BASE_URI}/energieausweis-erstellen/kaufabschluss-fortsetzen?uid=${ausweis.uid}&p=PayPal'>jetzt per Paypal bezahlen</a></td></tr>
|
||||||
|
<tr><td>Per Giropay zahlen</td> <td>:</td> <td><a href='${BASE_URI}/energieausweis-erstellen/kaufabschluss-fortsetzen?uid=${ausweis.uid}&p=Giropay'>jetzt per Giropay bezahlen</a></td></tr>
|
||||||
|
<tr><td>Per Visa oder MasterCard zahlen</td> <td>:</td> <td><a href='${BASE_URI}/energieausweis-erstellen/kaufabschluss-fortsetzen?uid=${ausweis.uid}&p=Kreditkarte'>jetzt per Kreditkarte bezahlen</a></td></tr>
|
||||||
|
</table>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Mit freundlichen Grüßen,
|
||||||
|
<br>
|
||||||
|
Dipl.-Ing. Jens Cornelsen
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<strong>IB Cornelsen</strong>
|
||||||
|
<br>
|
||||||
|
Katendeich 5A
|
||||||
|
<br>
|
||||||
|
21035 Hamburg
|
||||||
|
<br>
|
||||||
|
www.online-energieausweis.org
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
fon 040 · 209339850
|
||||||
|
<br>
|
||||||
|
fax 040 · 209339859
|
||||||
|
</p>`;
|
||||||
|
}
|
||||||
|
|
||||||
|
await transport.sendMail({
|
||||||
|
from: `"IBCornelsen" <info@online-energieausweis.org>`,
|
||||||
|
to: user.email,
|
||||||
|
subject: `Ihr Originalausweis vom Ingenieurbüro Cornelsen (ID: ${ausweis.uid})`,
|
||||||
|
text,
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
0
src/pages/api/admin/erinnern.ts
Normal file
0
src/pages/api/admin/erinnern.ts
Normal file
0
src/pages/api/admin/nicht-ausstellen.ts
Normal file
0
src/pages/api/admin/nicht-ausstellen.ts
Normal file
0
src/pages/api/admin/post-ausstellen.ts
Normal file
0
src/pages/api/admin/post-ausstellen.ts
Normal file
229
src/pages/api/admin/registriernummer.ts
Normal file
229
src/pages/api/admin/registriernummer.ts
Normal file
@@ -0,0 +1,229 @@
|
|||||||
|
import {
|
||||||
|
getAusweisartFromUUID,
|
||||||
|
UUidWithPrefix,
|
||||||
|
} from "#components/Ausweis/types.js";
|
||||||
|
import {
|
||||||
|
adminMiddleware,
|
||||||
|
authorizationHeaders,
|
||||||
|
} from "#lib/middleware/authorization.js";
|
||||||
|
import {
|
||||||
|
BedarfsausweisWohnen,
|
||||||
|
Enums,
|
||||||
|
VerbrauchsausweisGewerbe,
|
||||||
|
VerbrauchsausweisWohnen,
|
||||||
|
} from "@ibcornelsen/database/client";
|
||||||
|
import { prisma } from "@ibcornelsen/database/server";
|
||||||
|
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
||||||
|
import moment from "moment";
|
||||||
|
import { z } from "zod";
|
||||||
|
import soap from "soap";
|
||||||
|
import { getPrismaAusweisAdapter } from "#lib/server/ausweis.js";
|
||||||
|
|
||||||
|
export const GET = defineApiRoute({
|
||||||
|
input: z.object({
|
||||||
|
uid: UUidWithPrefix,
|
||||||
|
}),
|
||||||
|
headers: authorizationHeaders,
|
||||||
|
middleware: adminMiddleware,
|
||||||
|
async fetch({ uid }, context, user) {
|
||||||
|
const ausweisart = getAusweisartFromUUID(uid);
|
||||||
|
const adapter = getPrismaAusweisAdapter(
|
||||||
|
uid
|
||||||
|
) as typeof prisma.verbrauchsausweisWohnen;
|
||||||
|
|
||||||
|
if (!adapter) {
|
||||||
|
throw new APIError({
|
||||||
|
code: "BAD_REQUEST",
|
||||||
|
message: "UID ist ungültig.",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const ausweis = await adapter.findUnique({
|
||||||
|
where: {
|
||||||
|
uid,
|
||||||
|
},
|
||||||
|
include: {
|
||||||
|
aufnahme: {
|
||||||
|
include: {
|
||||||
|
objekt: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!ausweis) {
|
||||||
|
throw new APIError({
|
||||||
|
code: "NOT_FOUND",
|
||||||
|
message: "Ausweis existiert nicht.",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ausweis.registriernummer) {
|
||||||
|
throw new APIError({
|
||||||
|
code: "PRECONDITION_FAILED",
|
||||||
|
message: `Ausweis hat bereits eine Registriernummer: (${ausweis.registriernummer})`,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ausweis.aufnahme.objekt.plz) {
|
||||||
|
throw new APIError({
|
||||||
|
code: "PRECONDITION_FAILED",
|
||||||
|
message: "Ausweis Gebäude hat keine Postleitzahl",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const postleitzahl = await prisma.postleitzahlen.findFirst({
|
||||||
|
where: {
|
||||||
|
plz: ausweis.aufnahme.objekt.plz,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!postleitzahl) {
|
||||||
|
throw new APIError({
|
||||||
|
code: "PRECONDITION_FAILED",
|
||||||
|
message: `Bundesland konnte nicht gefunden werden für PLZ ${ausweis.aufnahme.objekt.plz}`,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Authentifizierung */
|
||||||
|
const Aussteller_ID_DIBT = "jens.cornelsen@ib-cornelsen.de";
|
||||||
|
const Aussteller_PWD_DIBT = "62465E79F6A61F31C4DCA9E2AF788DD3";
|
||||||
|
/* EnEV-Nachweis */
|
||||||
|
const Ausstellungsdatum = moment(
|
||||||
|
ausweis.aufnahme.erstellungsdatum
|
||||||
|
).format("DD.MM.YYYY");
|
||||||
|
const Gesetzesgrundlage = "GEG-2024";
|
||||||
|
|
||||||
|
/* EnergieausweisDaten */
|
||||||
|
let gebaeudeart: string = "";
|
||||||
|
if (
|
||||||
|
ausweisart == Enums.Ausweisart.VerbrauchsausweisGewerbe &&
|
||||||
|
ausweis.aufnahme.gebaeudeteil == "Gewerbe"
|
||||||
|
) {
|
||||||
|
gebaeudeart = "Nichtwohnteil gemischt genutztes Gebäude";
|
||||||
|
} else if (
|
||||||
|
(ausweisart == Enums.Ausweisart.VerbrauchsausweisWohnen ||
|
||||||
|
ausweisart == Enums.Ausweisart.BedarfsausweisWohnen) &&
|
||||||
|
ausweis.aufnahme.gebaeudeteil == "Wohnen"
|
||||||
|
) {
|
||||||
|
gebaeudeart = "Wohnteil gemischt genutztes Gebäude";
|
||||||
|
} else if (
|
||||||
|
(ausweisart == Enums.Ausweisart.VerbrauchsausweisWohnen ||
|
||||||
|
ausweisart == Enums.Ausweisart.BedarfsausweisWohnen) &&
|
||||||
|
ausweis.aufnahme.gebaeudeteil == "Gesamtgebäude"
|
||||||
|
) {
|
||||||
|
gebaeudeart = "Wohngebäude";
|
||||||
|
} else if (
|
||||||
|
ausweisart == Enums.Ausweisart.VerbrauchsausweisGewerbe &&
|
||||||
|
ausweis.aufnahme.gebaeudeteil == "Gesamtgebäude"
|
||||||
|
) {
|
||||||
|
gebaeudeart = "Nichtwohngebäude";
|
||||||
|
}
|
||||||
|
|
||||||
|
const art: string =
|
||||||
|
ausweisart == Enums.Ausweisart.BedarfsausweisWohnen
|
||||||
|
? "Energiebedarfsausweis"
|
||||||
|
: "Energieverbrauchsausweis";
|
||||||
|
|
||||||
|
const body = `<Datenregistratur xmlns="http://energieausweis.dibt.de/WebServiceEnergie/DibtEnergieAusweisService">
|
||||||
|
<doc>
|
||||||
|
<root>
|
||||||
|
<Authentifizierung>
|
||||||
|
<Aussteller_ID_DIBT>${Aussteller_ID_DIBT}</Aussteller_ID_DIBT>
|
||||||
|
<Aussteller_PWD_DIBT>${Aussteller_PWD_DIBT}</Aussteller_PWD_DIBT>
|
||||||
|
</Authentifizierung>
|
||||||
|
<EnEV-Nachweis>
|
||||||
|
<Ausstellungsdatum>${Ausstellungsdatum}</Ausstellungsdatum>
|
||||||
|
<Bundesland>${postleitzahl.bundesland}</Bundesland>
|
||||||
|
<Postleitzahl>${postleitzahl.plz}</Postleitzahl>
|
||||||
|
<Gesetzesgrundlage>${Gesetzesgrundlage}</Gesetzesgrundlage>
|
||||||
|
</EnEV-Nachweis>
|
||||||
|
<Energieausweis-Daten>
|
||||||
|
<Gebaeudeart>${gebaeudeart}</Gebaeudeart>
|
||||||
|
<Art>${art}</Art>
|
||||||
|
<Neubau>${
|
||||||
|
ausweis.ausstellgrund ===
|
||||||
|
Enums.Ausstellgrund.Neubau
|
||||||
|
? "1"
|
||||||
|
: "0"
|
||||||
|
}</Neubau>
|
||||||
|
</Energieausweis-Daten>
|
||||||
|
</root>
|
||||||
|
</doc>
|
||||||
|
</Datenregistratur>`;
|
||||||
|
|
||||||
|
return await new Promise(async (resolve, reject) => {
|
||||||
|
soap.createClient(
|
||||||
|
"https://energieausweis.dibt.de/published/WebServiceEnergieausweis/DibtEnergieAusweisServiceEx01.wsdl",
|
||||||
|
{},
|
||||||
|
function (err, client) {
|
||||||
|
if (err !== null) {
|
||||||
|
throw new APIError({
|
||||||
|
code: "INTERNAL_SERVER_ERROR",
|
||||||
|
message: err,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
client.Datenregistratur(
|
||||||
|
body,
|
||||||
|
async function (
|
||||||
|
err: any,
|
||||||
|
result: {
|
||||||
|
DatenregistraturResult: {
|
||||||
|
WEB_Service_Antwort: {
|
||||||
|
Rueckgabewert?: null;
|
||||||
|
Registriernummer: string;
|
||||||
|
Datendatei: any;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
) {
|
||||||
|
if (err !== null) {
|
||||||
|
reject({
|
||||||
|
code: "INTERNAL_SERVER_ERROR",
|
||||||
|
message: err,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
result.DatenregistraturResult
|
||||||
|
.WEB_Service_Antwort.Registriernummer
|
||||||
|
) {
|
||||||
|
await (
|
||||||
|
adapter as typeof prisma.verbrauchsausweisWohnen
|
||||||
|
).update({
|
||||||
|
where: {
|
||||||
|
uid,
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
registriernummer:
|
||||||
|
result.DatenregistraturResult
|
||||||
|
.WEB_Service_Antwort
|
||||||
|
.Registriernummer,
|
||||||
|
kontrolldatei_angefragt: result
|
||||||
|
.DatenregistraturResult
|
||||||
|
.WEB_Service_Antwort.Datendatei
|
||||||
|
? true
|
||||||
|
: false,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
resolve(
|
||||||
|
result.DatenregistraturResult
|
||||||
|
.WEB_Service_Antwort.Registriernummer
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
reject({
|
||||||
|
code: "INTERNAL_SERVER_ERROR",
|
||||||
|
message: "Unerwarteter Rückgabewert.",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}).catch((reason) => {
|
||||||
|
throw new APIError(reason);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
});
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
import { authorizationMiddleware } from "#lib/middleware/authorization.js";
|
import { authorizationMiddleware } from "#lib/middleware/authorization.js";
|
||||||
import { GebaeudeBilderSchema, prisma } from "@ibcornelsen/database/server";
|
import { BildSchema, prisma } from "@ibcornelsen/database/server";
|
||||||
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
import isBase64 from "is-base64";
|
import isBase64 from "is-base64";
|
||||||
@@ -7,7 +7,7 @@ import { fileURLToPath } from "url";
|
|||||||
import { writeFileSync } from "fs";
|
import { writeFileSync } from "fs";
|
||||||
|
|
||||||
export const PUT = defineApiRoute({
|
export const PUT = defineApiRoute({
|
||||||
input: GebaeudeBilderSchema.pick({
|
input: BildSchema.pick({
|
||||||
kategorie: true,
|
kategorie: true,
|
||||||
}).merge(z.object({
|
}).merge(z.object({
|
||||||
base64: z.string()
|
base64: z.string()
|
||||||
@@ -26,14 +26,14 @@ export const PUT = defineApiRoute({
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
let objekt = await prisma.objekt.findUnique({
|
let aufnahme = await prisma.aufnahme.findUnique({
|
||||||
where: {
|
where: {
|
||||||
uid: ctx.params.uid,
|
uid: ctx.params.uid,
|
||||||
benutzer_id: user.id
|
benutzer_id: user.id
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!objekt) {
|
if (!aufnahme) {
|
||||||
throw new APIError({
|
throw new APIError({
|
||||||
code: "NOT_FOUND",
|
code: "NOT_FOUND",
|
||||||
message: "Objekt nicht gefunden oder gehört einem anderen Benutzer.",
|
message: "Objekt nicht gefunden oder gehört einem anderen Benutzer.",
|
||||||
@@ -46,12 +46,12 @@ export const PUT = defineApiRoute({
|
|||||||
);
|
);
|
||||||
const buffer = Buffer.from(dataWithoutPrefix, "base64");
|
const buffer = Buffer.from(dataWithoutPrefix, "base64");
|
||||||
|
|
||||||
const bild = await prisma.gebaeudeBilder.create({
|
const bild = await prisma.bild.create({
|
||||||
data: {
|
data: {
|
||||||
kategorie: input.kategorie,
|
kategorie: input.kategorie,
|
||||||
objekt: {
|
aufnahme: {
|
||||||
connect: {
|
connect: {
|
||||||
id: objekt.id,
|
id: aufnahme.id,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -69,10 +69,8 @@ export const PUT = defineApiRoute({
|
|||||||
|
|
||||||
writeFileSync(filePath, buffer)
|
writeFileSync(filePath, buffer)
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
console.log(e);
|
|
||||||
|
|
||||||
// Bild wurde nicht gespeichert, wir löschen den Eintrag wieder
|
// Bild wurde nicht gespeichert, wir löschen den Eintrag wieder
|
||||||
await prisma.gebaeudeBilder.delete({
|
await prisma.bild.delete({
|
||||||
where: {
|
where: {
|
||||||
uid: bild.uid
|
uid: bild.uid
|
||||||
}
|
}
|
||||||
@@ -92,21 +90,21 @@ export const PUT = defineApiRoute({
|
|||||||
|
|
||||||
export const GET = defineApiRoute({
|
export const GET = defineApiRoute({
|
||||||
middleware: authorizationMiddleware,
|
middleware: authorizationMiddleware,
|
||||||
output: z.array(GebaeudeBilderSchema.pick({
|
output: z.array(BildSchema.pick({
|
||||||
kategorie: true,
|
kategorie: true,
|
||||||
uid: true
|
uid: true
|
||||||
})),
|
})),
|
||||||
async fetch(input, ctx, user) {
|
async fetch(input, ctx, user) {
|
||||||
const { uid } = ctx.params;
|
const { uid } = ctx.params;
|
||||||
|
|
||||||
const objekt = await prisma.objekt.findUnique({
|
const aufnahme = await prisma.aufnahme.findUnique({
|
||||||
where: {
|
where: {
|
||||||
uid,
|
uid,
|
||||||
benutzer_id: user.id
|
benutzer_id: user.id
|
||||||
},
|
},
|
||||||
select: {
|
select: {
|
||||||
benutzer_id: true,
|
benutzer_id: true,
|
||||||
gebaeude_bilder: {
|
bilder: {
|
||||||
select: {
|
select: {
|
||||||
kategorie: true,
|
kategorie: true,
|
||||||
uid: true
|
uid: true
|
||||||
@@ -115,13 +113,13 @@ export const GET = defineApiRoute({
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
if (!objekt) {
|
if (!aufnahme) {
|
||||||
throw new APIError({
|
throw new APIError({
|
||||||
code: "FORBIDDEN",
|
code: "FORBIDDEN",
|
||||||
message: "Objekt existiert nicht oder gehört einem anderen Benutzer."
|
message: "Objekt existiert nicht oder gehört einem anderen Benutzer."
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
return objekt.gebaeude_bilder
|
return aufnahme.bilder
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
@@ -5,6 +5,7 @@ import { prisma } from "@ibcornelsen/database/server";
|
|||||||
import { decodeToken, encodeToken } from "#lib/auth/token.js";
|
import { decodeToken, encodeToken } from "#lib/auth/token.js";
|
||||||
import { TokenType } from "#lib/auth/types.js";
|
import { TokenType } from "#lib/auth/types.js";
|
||||||
import { hashPassword } from "#lib/password.js";
|
import { hashPassword } from "#lib/password.js";
|
||||||
|
import { transport } from "#lib/mail.js";
|
||||||
|
|
||||||
export const GET = defineApiRoute({
|
export const GET = defineApiRoute({
|
||||||
input: z.object({
|
input: z.object({
|
||||||
@@ -33,16 +34,6 @@ export const GET = defineApiRoute({
|
|||||||
uid: user.uid
|
uid: user.uid
|
||||||
})
|
})
|
||||||
|
|
||||||
const transport = nodemailer.createTransport({
|
|
||||||
host: "smtp.ionos.de",
|
|
||||||
port: 465,
|
|
||||||
secure: true,
|
|
||||||
auth: {
|
|
||||||
user: "info@online-energieausweis.org",
|
|
||||||
pass: "Katendeich5a2024!"
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
const info = await transport.sendMail({
|
const info = await transport.sendMail({
|
||||||
from: `"IBCornelsen" <info@online-energieausweis.org>`,
|
from: `"IBCornelsen" <info@online-energieausweis.org>`,
|
||||||
to: input.email,
|
to: input.email,
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
import { BedarfsausweisWohnenClient, OptionalNullable, UUidWithPrefix, ZodOverlap } from "#components/Ausweis/types.js";
|
import { BedarfsausweisWohnenClient, OptionalNullable, UUidWithPrefix, VerbrauchsausweisWohnenClient, ZodOverlap } from "#components/Ausweis/types.js";
|
||||||
import { exclude } from "#lib/exclude.js";
|
import { exclude } from "#lib/exclude.js";
|
||||||
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
|
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
|
||||||
import { BedarfsausweisWohnenSchema, prisma } from "@ibcornelsen/database/server";
|
import { BedarfsausweisWohnenSchema, prisma, VerbrauchsausweisWohnenSchema } from "@ibcornelsen/database/server";
|
||||||
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
|
|
||||||
export const PATCH = defineApiRoute({
|
export const PATCH = defineApiRoute({
|
||||||
input: BedarfsausweisWohnenSchema.omit({
|
input: VerbrauchsausweisWohnenSchema.omit({
|
||||||
uid: true,
|
uid: true,
|
||||||
id: true,
|
id: true,
|
||||||
benutzer_id: true,
|
benutzer_id: true,
|
||||||
@@ -18,7 +18,7 @@ export const PATCH = defineApiRoute({
|
|||||||
},
|
},
|
||||||
middleware: authorizationMiddleware,
|
middleware: authorizationMiddleware,
|
||||||
async fetch(input, ctx, user) {
|
async fetch(input, ctx, user) {
|
||||||
const objekt = await prisma.bedarfsausweisWohnen.findUnique({
|
const objekt = await prisma.verbrauchsausweisWohnen.findUnique({
|
||||||
where: {
|
where: {
|
||||||
uid: ctx.params.uid,
|
uid: ctx.params.uid,
|
||||||
benutzer: {
|
benutzer: {
|
||||||
@@ -34,7 +34,7 @@ export const PATCH = defineApiRoute({
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
await prisma.bedarfsausweisWohnen.update({
|
await prisma.verbrauchsausweisWohnen.update({
|
||||||
where: {
|
where: {
|
||||||
uid: ctx.params.uid
|
uid: ctx.params.uid
|
||||||
},
|
},
|
||||||
@@ -61,7 +61,7 @@ export const DELETE = defineApiRoute({
|
|||||||
|
|
||||||
// Wir holen uns den Bedarfsausweis
|
// Wir holen uns den Bedarfsausweis
|
||||||
// Dieser MUSS mit dem Nutzer verknüpft sein.
|
// Dieser MUSS mit dem Nutzer verknüpft sein.
|
||||||
const ausweis = await prisma.bedarfsausweisWohnen.findUnique({
|
const ausweis = await prisma.verbrauchsausweisWohnen.findUnique({
|
||||||
where: {
|
where: {
|
||||||
uid,
|
uid,
|
||||||
},
|
},
|
||||||
@@ -155,7 +155,7 @@ export const GET = defineApiRoute({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
output: ZodOverlap<OptionalNullable<BedarfsausweisWohnenClient>>(BedarfsausweisWohnenSchema.merge(z.object({
|
output: ZodOverlap<OptionalNullable<VerbrauchsausweisWohnenClient>>(VerbrauchsausweisWohnenSchema.merge(z.object({
|
||||||
uid_aufnahme: UUidWithPrefix,
|
uid_aufnahme: UUidWithPrefix,
|
||||||
uid_objekt: UUidWithPrefix,
|
uid_objekt: UUidWithPrefix,
|
||||||
uid_benutzer: UUidWithPrefix.optional()
|
uid_benutzer: UUidWithPrefix.optional()
|
||||||
@@ -175,7 +175,7 @@ export const GET = defineApiRoute({
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const ausweis = await prisma.bedarfsausweisWohnen.findUnique({
|
const ausweis = await prisma.verbrauchsausweisWohnen.findUnique({
|
||||||
where: {
|
where: {
|
||||||
uid,
|
uid,
|
||||||
benutzer_id: user.id
|
benutzer_id: user.id
|
||||||
|
|||||||
@@ -109,7 +109,7 @@ export const GET = defineApiRoute({
|
|||||||
include: {
|
include: {
|
||||||
objekt: {
|
objekt: {
|
||||||
include: {
|
include: {
|
||||||
gebaeude_bilder: true,
|
bilder: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
rechnungen: true,
|
rechnungen: true,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { authorizationMiddleware } from "#lib/middleware/authorization.js";
|
import { authorizationMiddleware } from "#lib/middleware/authorization.js";
|
||||||
import { GebaeudeBilderSchema, prisma } from "@ibcornelsen/database/server";
|
import { BildSchema, prisma } from "@ibcornelsen/database/server";
|
||||||
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
import isBase64 from "is-base64";
|
import isBase64 from "is-base64";
|
||||||
@@ -8,7 +8,7 @@ import { writeFileSync } from "fs";
|
|||||||
import { UUidWithPrefix } from "#components/Ausweis/types.js";
|
import { UUidWithPrefix } from "#components/Ausweis/types.js";
|
||||||
|
|
||||||
export const PATCH = defineApiRoute({
|
export const PATCH = defineApiRoute({
|
||||||
input: GebaeudeBilderSchema.pick({
|
input: BildSchema.pick({
|
||||||
kategorie: true,
|
kategorie: true,
|
||||||
}).merge(z.object({
|
}).merge(z.object({
|
||||||
base64: z.string()
|
base64: z.string()
|
||||||
@@ -23,7 +23,7 @@ export const PATCH = defineApiRoute({
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const image = await prisma.gebaeudeBilder.findUnique({
|
const image = await prisma.Bild.findUnique({
|
||||||
where: {
|
where: {
|
||||||
uid: ctx.params.uid,
|
uid: ctx.params.uid,
|
||||||
objekt: {
|
objekt: {
|
||||||
@@ -55,7 +55,7 @@ export const PATCH = defineApiRoute({
|
|||||||
const buffer = Buffer.from(dataWithoutPrefix, "base64");
|
const buffer = Buffer.from(dataWithoutPrefix, "base64");
|
||||||
|
|
||||||
if (input.kategorie !== image.kategorie) {
|
if (input.kategorie !== image.kategorie) {
|
||||||
await prisma.gebaeudeBilder.update({
|
await prisma.Bild.update({
|
||||||
where: {
|
where: {
|
||||||
id: image.id
|
id: image.id
|
||||||
},
|
},
|
||||||
|
|||||||
210
src/pages/api/geg-nachweis-wohnen/[uid].ts
Normal file
210
src/pages/api/geg-nachweis-wohnen/[uid].ts
Normal file
@@ -0,0 +1,210 @@
|
|||||||
|
import { GEGNachweisWohnenClient, OptionalNullable, UUidWithPrefix, ZodOverlap } from "#components/Ausweis/types.js";
|
||||||
|
import { exclude } from "#lib/exclude.js";
|
||||||
|
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
|
||||||
|
import { GEGNachweisWohnenSchema, prisma } from "@ibcornelsen/database/server";
|
||||||
|
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
export const PATCH = defineApiRoute({
|
||||||
|
input: GEGNachweisWohnenSchema.omit({
|
||||||
|
uid: true,
|
||||||
|
id: true,
|
||||||
|
benutzer_id: true,
|
||||||
|
aufnahme_id: true,
|
||||||
|
}),
|
||||||
|
output: z.void(),
|
||||||
|
headers: {
|
||||||
|
"Authorization": z.string()
|
||||||
|
},
|
||||||
|
middleware: authorizationMiddleware,
|
||||||
|
async fetch(input, ctx, user) {
|
||||||
|
const objekt = await prisma.gEGNachweisWohnen.findUnique({
|
||||||
|
where: {
|
||||||
|
uid: ctx.params.uid,
|
||||||
|
benutzer: {
|
||||||
|
id: user.id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!objekt) {
|
||||||
|
throw new APIError({
|
||||||
|
code: "NOT_FOUND",
|
||||||
|
message: "Nachweis konnte nicht gefunden werden oder gehört einem anderen Benutzer."
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
await prisma.gEGNachweisWohnen.update({
|
||||||
|
where: {
|
||||||
|
uid: ctx.params.uid
|
||||||
|
},
|
||||||
|
data: input
|
||||||
|
})
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
export const DELETE = defineApiRoute({
|
||||||
|
meta: {
|
||||||
|
description: "Storniert einen Nachweis"
|
||||||
|
},
|
||||||
|
headers: authorizationHeaders,
|
||||||
|
middleware: authorizationMiddleware,
|
||||||
|
async fetch(input, ctx, user) {
|
||||||
|
const { uid } = ctx.params;
|
||||||
|
|
||||||
|
if (!UUidWithPrefix.safeParse(uid).success) {
|
||||||
|
throw new APIError({
|
||||||
|
code: "BAD_REQUEST",
|
||||||
|
message: "UID konnte nicht verifiziert werden."
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wir holen uns den BedarfsNachweis
|
||||||
|
// Dieser MUSS mit dem Nutzer verknüpft sein.
|
||||||
|
const nachweis = await prisma.gEGNachweisWohnen.findUnique({
|
||||||
|
where: {
|
||||||
|
uid,
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!nachweis) {
|
||||||
|
// Falls wir den Nachweis nicht finden können, werfen wir einen Fehler
|
||||||
|
throw new APIError({
|
||||||
|
code: "NOT_FOUND",
|
||||||
|
message: "Nachweis konnte nicht gefunden werden.",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wir dürfen den Nachweis nur stornieren, wenn er noch nicht ausgestellt wurde
|
||||||
|
// Außerdem müssen wir schauen, ob wir Admin oder der Besitzer des Nachweises sind.
|
||||||
|
if ((nachweis.benutzer_id !== user.id) && user.rolle !== "ADMIN") {
|
||||||
|
// Falls der Nachweis nicht dem Nutzer gehört, werfen wir einen Fehler
|
||||||
|
throw new APIError({
|
||||||
|
code: "FORBIDDEN",
|
||||||
|
message: "Nachweis gehört nicht dem Nutzer.",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// if (Nachweis.erledigt) {
|
||||||
|
// // Falls der Nachweis bereits ausgestellt wurde, werfen wir einen Fehler
|
||||||
|
// throw new TRPCError({
|
||||||
|
// code: "BAD_REQUEST",
|
||||||
|
// message: "Nachweis wurde bereits ausgestellt.",
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
|
||||||
|
if (nachweis.storniert) {
|
||||||
|
// Falls der Nachweis bereits storniert ist, werfen wir einen Fehler
|
||||||
|
throw new APIError({
|
||||||
|
code: "BAD_REQUEST",
|
||||||
|
message: "Nachweis wurde bereits storniert.",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
await prisma.gEGNachweisWohnen.update({
|
||||||
|
where: {
|
||||||
|
id: nachweis.id
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
storniert: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// Wir erstellen ein Event, dass der Nachweis storniert wurde
|
||||||
|
// Dann können wir das in der Historie anzeigen
|
||||||
|
await prisma.event.create({
|
||||||
|
data: {
|
||||||
|
title: "Nachweis storniert",
|
||||||
|
description: ((user.rolle === "ADMIN") && (nachweis.benutzer_id !== user.id)) ? "Nachweis wurde von einem Administrator storniert." : "Nachweis wurde vom Besitzer storniert.",
|
||||||
|
benutzer: {
|
||||||
|
connect: {
|
||||||
|
id: user.id
|
||||||
|
}
|
||||||
|
},
|
||||||
|
aufnahme: {
|
||||||
|
connect: {
|
||||||
|
id: nachweis.aufnahme_id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
export const GET = defineApiRoute({
|
||||||
|
meta: {
|
||||||
|
description: "Gibt ein spezifisches Gebäude des Benutzers zurück.",
|
||||||
|
tags: ["Gebäude"],
|
||||||
|
headers: {
|
||||||
|
"Authorization": {
|
||||||
|
description: "Ein gültiger Authentifizierungstoken",
|
||||||
|
required: true,
|
||||||
|
allowEmptyValue: false,
|
||||||
|
examples: {
|
||||||
|
Bearer: {
|
||||||
|
value: "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
output: ZodOverlap<OptionalNullable<GEGNachweisWohnenClient>>(GEGNachweisWohnenSchema.merge(z.object({
|
||||||
|
uid_aufnahme: UUidWithPrefix,
|
||||||
|
uid_objekt: UUidWithPrefix,
|
||||||
|
uid_benutzer: UUidWithPrefix.optional()
|
||||||
|
})).omit({
|
||||||
|
id: true,
|
||||||
|
aufnahme_id: true,
|
||||||
|
benutzer_id: true
|
||||||
|
})),
|
||||||
|
middleware: authorizationMiddleware,
|
||||||
|
async fetch(input, context, user) {
|
||||||
|
const { uid } = context.params;
|
||||||
|
|
||||||
|
if (!uid) {
|
||||||
|
throw new APIError({
|
||||||
|
code: "BAD_REQUEST",
|
||||||
|
message: "Missing uid in request params"
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const Nachweis = await prisma.gEGNachweisWohnen.findUnique({
|
||||||
|
where: {
|
||||||
|
uid,
|
||||||
|
benutzer_id: user.id
|
||||||
|
},
|
||||||
|
include: {
|
||||||
|
benutzer: {
|
||||||
|
select: {
|
||||||
|
uid: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
aufnahme: {
|
||||||
|
select: {
|
||||||
|
uid: true,
|
||||||
|
objekt: {
|
||||||
|
select: {
|
||||||
|
uid: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!Nachweis) {
|
||||||
|
// Falls wir den Nachweis nicht finden können, werfen wir einen Fehler
|
||||||
|
throw new APIError({
|
||||||
|
code: "NOT_FOUND",
|
||||||
|
message: "Nachweis konnte nicht gefunden werden.",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
uid_aufnahme: Nachweis.aufnahme.uid,
|
||||||
|
uid_objekt: Nachweis.aufnahme.objekt.uid,
|
||||||
|
uid_benutzer: Nachweis.benutzer?.uid,
|
||||||
|
...exclude(Nachweis, ["id", "aufnahme_id", "benutzer_id", "aufnahme"])
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
141
src/pages/api/geg-nachweis-wohnen/index.ts
Normal file
141
src/pages/api/geg-nachweis-wohnen/index.ts
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
import { UUidWithPrefix } from "#components/Ausweis/types.js";
|
||||||
|
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
|
||||||
|
import { GEGNachweisWohnenSchema, prisma } from "@ibcornelsen/database/server";
|
||||||
|
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
export const PUT = defineApiRoute({
|
||||||
|
meta: {
|
||||||
|
contentTypes: ["application/json"],
|
||||||
|
description:
|
||||||
|
"Erstellt einen neuen GEG Nachweis für Wohngebäude.",
|
||||||
|
tags: ["GEG Nachweis", "Verbrauchsausweis Wohnen"],
|
||||||
|
},
|
||||||
|
input: z.object({
|
||||||
|
nachweis: GEGNachweisWohnenSchema.omit({
|
||||||
|
id: true,
|
||||||
|
benutzer_id: true,
|
||||||
|
uid: true,
|
||||||
|
aufnahme_id: true
|
||||||
|
}),
|
||||||
|
uid_aufnahme: UUidWithPrefix
|
||||||
|
}),
|
||||||
|
output: z.object({
|
||||||
|
uid: UUidWithPrefix,
|
||||||
|
objekt_uid: UUidWithPrefix,
|
||||||
|
aufnahme_uid: UUidWithPrefix,
|
||||||
|
}),
|
||||||
|
headers: authorizationHeaders,
|
||||||
|
middleware: authorizationMiddleware,
|
||||||
|
async fetch(input, ctx, user) {
|
||||||
|
const aufnahme = await prisma.aufnahme.findUnique({
|
||||||
|
where: {
|
||||||
|
uid: input.uid_aufnahme
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!aufnahme || aufnahme.benutzer_id !== user.id) {
|
||||||
|
throw new APIError({
|
||||||
|
code: "FORBIDDEN",
|
||||||
|
message: "Aufnahme konnte nicht gefunden werden oder gehört nicht zu diesem Benutzer."
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const nachweis = await prisma.gEGNachweisWohnen.create({
|
||||||
|
data: {
|
||||||
|
...input.nachweis,
|
||||||
|
benutzer: {
|
||||||
|
connect: {
|
||||||
|
id: user.id,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
aufnahme: {
|
||||||
|
connect: {
|
||||||
|
id: aufnahme.id,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
select: {
|
||||||
|
uid: true,
|
||||||
|
aufnahme: {
|
||||||
|
select: {
|
||||||
|
uid: true,
|
||||||
|
objekt: {
|
||||||
|
select: {
|
||||||
|
uid: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
uid: nachweis.uid,
|
||||||
|
objekt_uid: nachweis.aufnahme.objekt.uid,
|
||||||
|
aufnahme_uid: nachweis.aufnahme.uid,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export const GET = defineApiRoute({
|
||||||
|
meta: {
|
||||||
|
description: "Gibt ein spezifisches Gebäude des Benutzers zurück.",
|
||||||
|
tags: ["Gebäude"],
|
||||||
|
headers: {
|
||||||
|
Authorization: {
|
||||||
|
description: "Ein gültiger Authentifizierungstoken",
|
||||||
|
required: true,
|
||||||
|
allowEmptyValue: false,
|
||||||
|
examples: {
|
||||||
|
Bearer: {
|
||||||
|
value: "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
middleware: authorizationMiddleware,
|
||||||
|
async fetch(input, context, user) {
|
||||||
|
const { uid } = context.params;
|
||||||
|
|
||||||
|
const ausweis = await prisma.verbrauchsausweisWohnen.findUnique({
|
||||||
|
where: {
|
||||||
|
uid,
|
||||||
|
},
|
||||||
|
include: {
|
||||||
|
benutzer: true,
|
||||||
|
aufnahme: {
|
||||||
|
include: {
|
||||||
|
rechnungen: true,
|
||||||
|
events: {
|
||||||
|
include: {
|
||||||
|
benutzer: {
|
||||||
|
select: {
|
||||||
|
uid: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
orderBy: {
|
||||||
|
date: "asc",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (
|
||||||
|
!ausweis ||
|
||||||
|
(ausweis.benutzer_id !== null && ausweis.benutzer_id !== user.id)
|
||||||
|
) {
|
||||||
|
// Falls wir den Ausweis nicht finden können, werfen wir einen Fehler
|
||||||
|
throw new APIError({
|
||||||
|
code: "NOT_FOUND",
|
||||||
|
message: "Ausweis konnte nicht gefunden werden.",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return ausweis;
|
||||||
|
},
|
||||||
|
});
|
||||||
116
src/pages/api/objekt/[uid]/unterlagen.ts
Normal file
116
src/pages/api/objekt/[uid]/unterlagen.ts
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
import { authorizationMiddleware } from "#lib/middleware/authorization.js";
|
||||||
|
import { prisma, UnterlageSchema } from "@ibcornelsen/database/server";
|
||||||
|
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
||||||
|
import { z } from "zod";
|
||||||
|
import { fileURLToPath } from "url";
|
||||||
|
import { writeFileSync } from "fs";
|
||||||
|
|
||||||
|
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." })
|
||||||
|
}),
|
||||||
|
middleware: authorizationMiddleware,
|
||||||
|
async fetch({ data, name, kategorie, mime }, ctx, user) {
|
||||||
|
if (mime !== "application/pdf" && mime !== "image/png" && mime !== "image/jpeg") {
|
||||||
|
throw new APIError({
|
||||||
|
code: "BAD_REQUEST",
|
||||||
|
message: "Nicht unterstützter mimetype, unterstützt werden 'image/jpeg', 'image/png', 'application/pdf'."
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
let aufnahme = await prisma.aufnahme.findUnique({
|
||||||
|
where: {
|
||||||
|
uid: ctx.params.uid,
|
||||||
|
benutzer_id: user.id
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!aufnahme) {
|
||||||
|
throw new APIError({
|
||||||
|
code: "NOT_FOUND",
|
||||||
|
message: "Objekt nicht gefunden oder gehört einem anderen Benutzer.",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const buffer = Buffer.from(data, "base64");
|
||||||
|
|
||||||
|
const unterlage = await prisma.unterlage.create({
|
||||||
|
data: {
|
||||||
|
kategorie: kategorie,
|
||||||
|
aufnahme: {
|
||||||
|
connect: {
|
||||||
|
id: aufnahme.id,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
select: {
|
||||||
|
uid: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const filePath = fileURLToPath(new URL(`../../../../../persistent/unterlagen/${unterlage.uid}`, import.meta.url));
|
||||||
|
|
||||||
|
try {
|
||||||
|
writeFileSync(filePath, buffer)
|
||||||
|
} catch(e) {
|
||||||
|
// Unterlage wurde nicht gespeichert, wir löschen den Eintrag wieder
|
||||||
|
await prisma.unterlage.delete({
|
||||||
|
where: {
|
||||||
|
uid: unterlage.uid
|
||||||
|
}
|
||||||
|
})
|
||||||
|
// Und geben einen Fehler zurück
|
||||||
|
throw new APIError({
|
||||||
|
code: "INTERNAL_SERVER_ERROR",
|
||||||
|
message: "Unterlage konnte nicht gespeichert werden.",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
uid: unterlage.uid
|
||||||
|
};
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
export const GET = defineApiRoute({
|
||||||
|
middleware: authorizationMiddleware,
|
||||||
|
output: z.array(UnterlageSchema.pick({
|
||||||
|
kategorie: true,
|
||||||
|
uid: true
|
||||||
|
})),
|
||||||
|
async fetch(input, ctx, user) {
|
||||||
|
const { uid } = ctx.params;
|
||||||
|
|
||||||
|
const objekt = await prisma.aufnahme.findUnique({
|
||||||
|
where: {
|
||||||
|
uid,
|
||||||
|
benutzer_id: user.id
|
||||||
|
},
|
||||||
|
select: {
|
||||||
|
benutzer_id: true,
|
||||||
|
unterlagen: {
|
||||||
|
select: {
|
||||||
|
kategorie: true,
|
||||||
|
uid: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!objekt) {
|
||||||
|
throw new APIError({
|
||||||
|
code: "FORBIDDEN",
|
||||||
|
message: "Objekt existiert nicht oder gehört einem anderen Benutzer."
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return objekt.unterlagen
|
||||||
|
},
|
||||||
|
})
|
||||||
@@ -113,6 +113,41 @@ export const PUT = defineApiRoute({
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) {
|
||||||
|
await prisma.bedarfsausweisWohnen.update({
|
||||||
|
where: {
|
||||||
|
uid: ausweis_uid
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
bestellt: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
|
||||||
|
await prisma.verbrauchsausweisGewerbe.update({
|
||||||
|
where: {
|
||||||
|
uid: ausweis_uid
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
bestellt: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
|
||||||
|
// Wir müssen überprüfen, ob dem Nutzer der Ausweis tatsächlich gehört.
|
||||||
|
await prisma.verbrauchsausweisWohnen.update({
|
||||||
|
where: {
|
||||||
|
uid: ausweis_uid
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
bestellt: true
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
throw new APIError({
|
||||||
|
code: "BAD_REQUEST",
|
||||||
|
message: "Ausweisart nicht unterstützt.",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
if (bezahlmethode === Enums.Bezahlmethoden.rechnung) {
|
if (bezahlmethode === Enums.Bezahlmethoden.rechnung) {
|
||||||
return { uid: rechnung.uid }
|
return { uid: rechnung.uid }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -109,7 +109,7 @@ export const GET = defineApiRoute({
|
|||||||
include: {
|
include: {
|
||||||
objekt: {
|
objekt: {
|
||||||
include: {
|
include: {
|
||||||
gebaeude_bilder: true,
|
bilder: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
rechnungen: true,
|
rechnungen: true,
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ export const GET = defineApiRoute({
|
|||||||
include: {
|
include: {
|
||||||
objekt: {
|
objekt: {
|
||||||
include: {
|
include: {
|
||||||
gebaeude_bilder: true,
|
bilder: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
rechnungen: true,
|
rechnungen: true,
|
||||||
|
|||||||
@@ -2,53 +2,48 @@
|
|||||||
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
|
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
|
||||||
import { validateAccessTokenServer } from "#server/lib/validateAccessToken.js";
|
import { validateAccessTokenServer } from "#server/lib/validateAccessToken.js";
|
||||||
import { prisma } from "@ibcornelsen/database/server";
|
import { prisma } from "@ibcornelsen/database/server";
|
||||||
|
import { APIRoute } from "astro";
|
||||||
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
||||||
import { fileURLToPath } from "bun";
|
|
||||||
import * as fs from "fs";
|
import * as fs from "fs";
|
||||||
|
import { fileURLToPath } from "url";
|
||||||
|
|
||||||
export const GET = defineApiRoute({
|
export const GET: APIRoute = async (Astro) => {
|
||||||
async fetch(input, context, transfer) {
|
const { uid } = Astro.params
|
||||||
const { uid } = context.params
|
const token = Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value;
|
||||||
const token = context.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value;
|
|
||||||
|
|
||||||
if (!token) {
|
if (!token) {
|
||||||
throw new APIError({
|
return new Response(null, {
|
||||||
code: "BAD_REQUEST",
|
status: 400
|
||||||
message: "Invalid access token"
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const valid = validateAccessTokenServer(context);
|
const valid = validateAccessTokenServer(Astro);
|
||||||
|
|
||||||
if (!valid) {
|
if (!valid) {
|
||||||
throw new APIError({
|
return new Response(null, {
|
||||||
code: "BAD_REQUEST",
|
status: 401
|
||||||
message: "Invalid access token"
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const image = await prisma.gebaeudeBilder.findUnique({
|
const image = await prisma.bild.findUnique({
|
||||||
where: {
|
where: {
|
||||||
uid
|
uid
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
if (!image) {
|
if (!image) {
|
||||||
throw new APIError({
|
return new Response(null, {
|
||||||
code: "NOT_FOUND",
|
status: 404
|
||||||
message: "Image could not be found."
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const path = fileURLToPath(new URL(`../../../../../persistent/images/${image.uid}.webp`, import.meta.url))
|
const path = fileURLToPath(new URL(`../../../persistent/images/${image.uid}.webp`, import.meta.url))
|
||||||
const base64 = fs.readFileSync(path, "base64")
|
const buffer = fs.readFileSync(path)
|
||||||
|
|
||||||
const buffer = Buffer.from(base64, "base64");
|
|
||||||
|
|
||||||
return new Response(buffer, {
|
return new Response(buffer, {
|
||||||
|
status: 200,
|
||||||
headers: {
|
headers: {
|
||||||
"Content-Type": "image/webp"
|
"Content-Type": "image/webp"
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
}
|
||||||
})
|
|
||||||
@@ -1,25 +1,59 @@
|
|||||||
---
|
---
|
||||||
import UserLayout from "../../../layouts/UserLayout.astro";
|
import { AufnahmeClient, BenutzerClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
|
||||||
import { validateAccessTokenServer } from "#server/lib/validateAccessToken";
|
import UserLayout from "#layouts/DashboardLayout.astro";
|
||||||
|
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants";
|
||||||
|
import { omit } from "#lib/helpers";
|
||||||
import DashboardAusweisePruefenModule from "#modules/Dashboard/DashboardAusweisePruefenModule.svelte";
|
import DashboardAusweisePruefenModule from "#modules/Dashboard/DashboardAusweisePruefenModule.svelte";
|
||||||
import { prisma } from "@ibcornelsen/database/server";
|
import { Enums, prisma } from "@ibcornelsen/database/server";
|
||||||
import { createCaller } from "#lib/caller";
|
import { createCaller } from "src/astro-typesafe-api-caller";
|
||||||
|
|
||||||
const accessTokenValid = await validateAccessTokenServer(Astro);
|
const caller = createCaller(Astro)
|
||||||
|
|
||||||
if (!accessTokenValid) {
|
|
||||||
|
let user: BenutzerClient;
|
||||||
|
try {
|
||||||
|
user = (await caller.user.self.GET.fetch(undefined, {
|
||||||
|
headers: {
|
||||||
|
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||||
|
}
|
||||||
|
})) || {} as BenutzerClient;
|
||||||
|
} catch(e) {
|
||||||
return Astro.redirect("/auth/login")
|
return Astro.redirect("/auth/login")
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Nutzer darf nur auf diese Seite, wenn er die Rolle "admin" hat
|
if (user.rolle !== Enums.BenutzerRolle.ADMIN) {
|
||||||
|
return Astro.redirect("/dashboard")
|
||||||
|
}
|
||||||
|
|
||||||
const caller = createCaller(Astro);
|
const ausweise = await prisma.verbrauchsausweisWohnen.findMany({
|
||||||
|
where: {
|
||||||
|
benutzer: {
|
||||||
|
uid: user.uid
|
||||||
|
}
|
||||||
|
},
|
||||||
|
include: {
|
||||||
|
aufnahme: {
|
||||||
|
include: {
|
||||||
|
objekt: {
|
||||||
|
include: {
|
||||||
|
bilder: true,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
events: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
const ausweise = await caller.v1.verbrauchsausweisWohnen.getMany({
|
const reformedAusweise = ausweise.map(ausweis => ({
|
||||||
limit: 25,
|
ausweis: omit(ausweis, ["aufnahme"]) as VerbrauchsausweisWohnenClient,
|
||||||
});
|
aufnahme: omit(omit(ausweis.aufnahme, ["events"]), ["objekt"]) as AufnahmeClient,
|
||||||
|
objekt: omit(ausweis.aufnahme.objekt, ["bilder"]) as ObjektClient,
|
||||||
|
bilder: ausweis.aufnahme.bilder as unknown as UploadedGebaeudeBild[],
|
||||||
|
events: ausweis.aufnahme.events
|
||||||
|
}))
|
||||||
---
|
---
|
||||||
|
|
||||||
<UserLayout title="Dashboard">
|
<UserLayout title="Ausweise Prüfen" {user}>
|
||||||
<DashboardAusweisePruefenModule ausweise={ausweise} client:load></DashboardAusweisePruefenModule>
|
<DashboardAusweisePruefenModule ausweise={reformedAusweise} client:load></DashboardAusweisePruefenModule>
|
||||||
</UserLayout>
|
</UserLayout>
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
import UserLayout from "../../../layouts/UserLayout.astro";
|
import UserLayout from "../../../layouts/DashboardLayout.astro";
|
||||||
import DashboardPDFDesignerModule from "../../../modules/Dashboard/DashboardPDFDesignerModule.svelte";
|
import DashboardPDFDesignerModule from "../../../modules/Dashboard/DashboardPDFDesignerModule.svelte";
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
import { createCaller } from "#lib/caller";
|
import { createCaller } from "#lib/caller";
|
||||||
import UserLayout from "../../../layouts/UserLayout.astro";
|
import UserLayout from "../../../layouts/DashboardLayout.astro";
|
||||||
import DashboardPDFViewerModule from "../../../modules/Dashboard/DashboardPDFViewerModule.svelte";
|
import DashboardPDFViewerModule from "../../../modules/Dashboard/DashboardPDFViewerModule.svelte";
|
||||||
import { prisma } from "@ibcornelsen/database/server";
|
import { prisma } from "@ibcornelsen/database/server";
|
||||||
|
|
||||||
|
|||||||
@@ -1,59 +0,0 @@
|
|||||||
---
|
|
||||||
import { AufnahmeClient, BenutzerClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
|
|
||||||
import UserLayout from "#layouts/UserLayout.astro";
|
|
||||||
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants";
|
|
||||||
import DashboardAusweisePruefenModule from "#modules/Dashboard/DashboardAusweisePruefenModule.svelte";
|
|
||||||
import { prisma } from "@ibcornelsen/database/server";
|
|
||||||
import { createCaller } from "src/astro-typesafe-api-caller";
|
|
||||||
|
|
||||||
const caller = createCaller(Astro)
|
|
||||||
|
|
||||||
|
|
||||||
let user: BenutzerClient;
|
|
||||||
try {
|
|
||||||
user = (await caller.user.self.GET.fetch(undefined, {
|
|
||||||
headers: {
|
|
||||||
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
|
||||||
}
|
|
||||||
})) || {} as BenutzerClient;
|
|
||||||
} catch(e) {
|
|
||||||
return Astro.redirect("/auth/login")
|
|
||||||
}
|
|
||||||
|
|
||||||
const ausweise = await prisma.verbrauchsausweisWohnen.findMany({
|
|
||||||
where: {
|
|
||||||
benutzer: {
|
|
||||||
uid: user.uid
|
|
||||||
}
|
|
||||||
},
|
|
||||||
include: {
|
|
||||||
aufnahme: {
|
|
||||||
include: {
|
|
||||||
objekt: {
|
|
||||||
include: {
|
|
||||||
gebaeude_bilder: true,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
events: true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
function omit(key: string, obj: Record<string, any>) {
|
|
||||||
const { [key]: omitted, ...rest } = obj;
|
|
||||||
return rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
const reformedAusweise = ausweise.map(ausweis => ({
|
|
||||||
ausweis: omit("aufnahme", ausweis) as VerbrauchsausweisWohnenClient,
|
|
||||||
aufnahme: omit("objekt", omit("events", ausweis.aufnahme)) as AufnahmeClient,
|
|
||||||
objekt: omit("gebaeude_bilder", ausweis.aufnahme.objekt) as ObjektClient,
|
|
||||||
bilder: ausweis.aufnahme.objekt.gebaeude_bilder as unknown as UploadedGebaeudeBild[],
|
|
||||||
events: ausweis.aufnahme.events
|
|
||||||
}))
|
|
||||||
---
|
|
||||||
|
|
||||||
<UserLayout title="Ausweise Prüfen" {user}>
|
|
||||||
<DashboardAusweisePruefenModule ausweise={reformedAusweise} client:load></DashboardAusweisePruefenModule>
|
|
||||||
</UserLayout>
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
import UserLayout from "../../../layouts/UserLayout.astro";
|
import UserLayout from "../../../layouts/DashboardLayout.astro";
|
||||||
import DashboardAusweiseModule from "#modules/Dashboard/DashboardAusweiseModule.svelte";
|
import DashboardAusweiseModule from "#modules/Dashboard/DashboardAusweiseModule.svelte";
|
||||||
|
|
||||||
import { validateAccessTokenServer } from "#server/lib/validateAccessToken";
|
import { validateAccessTokenServer } from "#server/lib/validateAccessToken";
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
import UserLayout from "#layouts/UserLayout.astro";
|
import UserLayout from "#layouts/DashboardLayout.astro";
|
||||||
import { createCaller } from "#lib/caller";
|
import { createCaller } from "#lib/caller";
|
||||||
import DashboardEinstellungenModule from "#modules/Dashboard/DashboardEinstellungenModule.svelte";
|
import DashboardEinstellungenModule from "#modules/Dashboard/DashboardEinstellungenModule.svelte";
|
||||||
import { validateAccessTokenServer } from "#server/lib/validateAccessToken";
|
import { validateAccessTokenServer } from "#server/lib/validateAccessToken";
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
---
|
---
|
||||||
import { createCaller } from "../../astro-typesafe-api-caller.js";
|
import { createCaller } from "../../astro-typesafe-api-caller.js";
|
||||||
import UserLayout from "../../layouts/UserLayout.astro";
|
|
||||||
import { validateAccessTokenServer } from "#server/lib/validateAccessToken";
|
import { validateAccessTokenServer } from "#server/lib/validateAccessToken";
|
||||||
import DashboardModule from "#modules/Dashboard/DashboardModule.svelte";
|
import DashboardModule from "#modules/Dashboard/DashboardModule.svelte";
|
||||||
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants";
|
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants";
|
||||||
|
import { prisma } from "@ibcornelsen/database/server";
|
||||||
|
import DashboardLayout from "#layouts/DashboardLayout.astro";
|
||||||
|
|
||||||
const accessTokenValid = await validateAccessTokenServer(Astro);
|
const accessTokenValid = await validateAccessTokenServer(Astro);
|
||||||
|
|
||||||
@@ -18,13 +19,32 @@ const user = await caller.user.self.GET.fetch(undefined, {
|
|||||||
"Authorization": `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
"Authorization": `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
const gebaeudeArray = await caller.objekt.GET.fetch({ limit: 5 }, {
|
|
||||||
headers: {
|
if (!user) {
|
||||||
"Authorization": `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
return Astro.redirect("/auth/login")
|
||||||
|
}
|
||||||
|
|
||||||
|
const objekte = await prisma.objekt.findMany({
|
||||||
|
where: {
|
||||||
|
benutzer: {
|
||||||
|
uid: user.uid
|
||||||
|
}
|
||||||
|
},
|
||||||
|
take: 10,
|
||||||
|
include: {
|
||||||
|
bilder: true,
|
||||||
|
unterlagen: true,
|
||||||
|
aufnahmen: {
|
||||||
|
include: {
|
||||||
|
bedarfsausweis_wohnen: true,
|
||||||
|
verbrauchsausweis_gewerbe: true,
|
||||||
|
verbrauchsausweis_wohnen: true
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
---
|
---
|
||||||
|
|
||||||
<UserLayout title="Dashboard" {user}>
|
<DashboardLayout title="Dashboard" {user}>
|
||||||
<DashboardModule user={user} gebaeudeArray={gebaeudeArray} />
|
<DashboardModule {user} {objekte} />
|
||||||
</UserLayout>
|
</DashboardLayout>
|
||||||
54
src/pages/dashboard/objekt/[uid].astro
Normal file
54
src/pages/dashboard/objekt/[uid].astro
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
---
|
||||||
|
import { createCaller } from "../../../astro-typesafe-api-caller.js";
|
||||||
|
import { validateAccessTokenServer } from "#server/lib/validateAccessToken";
|
||||||
|
import DashboardModule from "#modules/Dashboard/DashboardModule.svelte";
|
||||||
|
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants";
|
||||||
|
import Layout from "#layouts/Layout.astro";
|
||||||
|
import { prisma } from "@ibcornelsen/database/server";
|
||||||
|
import DashboardObjektModule from "#modules/Dashboard/DashboardObjektModule.svelte";
|
||||||
|
import UserLayout from "#layouts/DashboardLayout.astro";
|
||||||
|
|
||||||
|
const { uid } = Astro.params;
|
||||||
|
|
||||||
|
const accessTokenValid = await validateAccessTokenServer(Astro);
|
||||||
|
|
||||||
|
if (!accessTokenValid) {
|
||||||
|
return Astro.redirect("/auth/login")
|
||||||
|
}
|
||||||
|
|
||||||
|
const caller = createCaller(Astro);
|
||||||
|
|
||||||
|
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 objekt = await prisma.objekt.findUnique({
|
||||||
|
where: {
|
||||||
|
benutzer: {
|
||||||
|
uid: user.uid
|
||||||
|
},
|
||||||
|
uid
|
||||||
|
},
|
||||||
|
include: {
|
||||||
|
bilder: true,
|
||||||
|
unterlagen: true,
|
||||||
|
aufnahmen: {
|
||||||
|
include: {
|
||||||
|
bedarfsausweis_wohnen: true,
|
||||||
|
verbrauchsausweis_gewerbe: true,
|
||||||
|
verbrauchsausweis_wohnen: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
---
|
||||||
|
|
||||||
|
<UserLayout title="Dashboard" {user}>
|
||||||
|
<DashboardObjektModule {user} {objekt} client:only/>
|
||||||
|
</UserLayout>
|
||||||
@@ -52,12 +52,12 @@ if (uid) {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
bilder = await caller.objekt._uid.bilder.GET.fetch(null, {
|
bilder = await caller.aufnahme._uid.bilder.GET.fetch(null, {
|
||||||
headers: {
|
headers: {
|
||||||
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||||
},
|
},
|
||||||
params: {
|
params: {
|
||||||
uid: ausweis.uid_objekt
|
uid: ausweis.uid_aufnahme
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -54,12 +54,12 @@ if (uid) {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
bilder = await caller.objekt._uid.bilder.GET.fetch(null, {
|
bilder = await caller.aufnahme._uid.bilder.GET.fetch(null, {
|
||||||
headers: {
|
headers: {
|
||||||
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||||
},
|
},
|
||||||
params: {
|
params: {
|
||||||
uid: uid_objekt
|
uid: uid_aufnahme
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -51,12 +51,12 @@ if (uid) {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
bilder = await caller.objekt._uid.bilder.GET.fetch(null, {
|
bilder = await caller.aufnahme._uid.bilder.GET.fetch(null, {
|
||||||
headers: {
|
headers: {
|
||||||
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
||||||
},
|
},
|
||||||
params: {
|
params: {
|
||||||
uid: ausweis.uid_objekt
|
uid: ausweis.uid_aufnahme
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user