Compare commits
87 Commits
revert-507
...
surrealdb
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
39b02f4de4 | ||
|
|
92817b6b8e | ||
|
|
079d913451 | ||
|
|
6388669d66 | ||
|
|
b475e4dd79 | ||
|
|
f5373fc7b1 | ||
|
|
265e58d80d | ||
|
|
d2fac65a6d | ||
|
|
b0df7fc4cf | ||
|
|
e21a829cb6 | ||
|
|
f9555c7a1e | ||
|
|
6aa8816dd1 | ||
|
|
70427e8a45 | ||
|
|
51ea0ec007 | ||
|
|
1381f5787a | ||
|
|
722db2d2ec | ||
|
|
72458f4631 | ||
|
|
bde6b3e102 | ||
|
|
936ca5abaa | ||
|
|
1f03bf5570 | ||
|
|
e7e2390bcd | ||
|
|
3ac6164c82 | ||
|
|
3bb6778e67 | ||
|
|
fa797c00c2 | ||
|
|
7be766d2c7 | ||
|
|
15651fc803 | ||
|
|
330841f8ee | ||
|
|
0708c6ce43 | ||
|
|
2c1945584d | ||
|
|
183178f943 | ||
|
|
b1b95159fa | ||
|
|
b0828592c5 | ||
|
|
935fbfba78 | ||
|
|
bf6d8f47e7 | ||
|
|
02761610d1 | ||
|
|
bf3107d3b7 | ||
|
|
66e596bb57 | ||
|
|
cdfdb6c001 | ||
|
|
c583229cc8 | ||
|
|
417009fd6e | ||
|
|
7130b6ba65 | ||
|
|
5081f70570 | ||
|
|
f4e6b7baf8 | ||
|
|
e55388e4b7 | ||
|
|
2bb2bd74db | ||
|
|
9d9fdebf3a | ||
|
|
0d9675fb35 | ||
|
|
7b5b272c17 | ||
|
|
a7427c3462 | ||
|
|
2b8ebcf182 | ||
|
|
eb72b600b4 | ||
|
|
606b851661 | ||
|
|
15f94c7752 | ||
|
|
04dbd4adcd | ||
|
|
853fe54e3b | ||
|
|
e2490f2296 | ||
|
|
cbddcf0968 | ||
|
|
8b1e5df851 | ||
|
|
29d8e5e7b3 | ||
|
|
e86328b0c2 | ||
|
|
b8d37d4e38 | ||
|
|
83727ac71d | ||
|
|
f31d710b20 | ||
|
|
6da7c0e501 | ||
|
|
f7b6a50482 | ||
|
|
48f72a2f0f | ||
|
|
aa84dd967e | ||
|
|
c413f76fe2 | ||
|
|
7762310bf3 | ||
|
|
7dd3a6c60d | ||
|
|
80a6992f5b | ||
|
|
4b651b733b | ||
|
|
c269306d9d | ||
|
|
cf0f0bdee0 | ||
|
|
d4e2d50e00 | ||
|
|
e303c44822 | ||
|
|
3eb30d2248 | ||
|
|
9b6b30ae30 | ||
|
|
9d9e6f7786 | ||
|
|
98f32ca279 | ||
|
|
ab7e5bc6d6 | ||
|
|
636c5463b2 | ||
|
|
85c0216e9d | ||
|
|
5e2861546f | ||
|
|
c1fc08ecba | ||
|
|
458a6ab254 | ||
|
|
1259f642e1 |
18
.env
18
.env
@@ -1,16 +1,2 @@
|
|||||||
# Environment variables declared in this file are automatically made available to Prisma.
|
DB_USER=main
|
||||||
# See the documentation for more detail: https://pris.ly/d/prisma-schema#accessing-environment-variables-from-the-schema
|
DB_PASSWORD=hHMP8cd^N3SnzGRR
|
||||||
|
|
||||||
# Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB and CockroachDB.
|
|
||||||
# See the documentation for all the connection string options: https://pris.ly/d/connection-strings
|
|
||||||
|
|
||||||
POSTGRES_DB=main
|
|
||||||
POSTGRES_HOST=localhost
|
|
||||||
POSTGRES_PORT=5432
|
|
||||||
POSTGRES_USER=main
|
|
||||||
POSTGRES_PASSWORD=hHMP8cd^N3SnzGRR
|
|
||||||
|
|
||||||
DB_CONTAINER_NAME=database
|
|
||||||
|
|
||||||
POSTGRES_DATABASE_URL="postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}"
|
|
||||||
POSTGRES_DATABASE_URL_EXTERNAL="postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${DB_CONTAINER_NAME}:${POSTGRES_PORT}/${POSTGRES_DB}"
|
|
||||||
2
.github/workflows/prod-pipeline.yml
vendored
2
.github/workflows/prod-pipeline.yml
vendored
@@ -1,8 +1,6 @@
|
|||||||
name: Production Pipeline
|
name: Production Pipeline
|
||||||
|
|
||||||
on:
|
on:
|
||||||
pull_request:
|
|
||||||
branches: [main]
|
|
||||||
push:
|
push:
|
||||||
branches: [main]
|
branches: [main]
|
||||||
|
|
||||||
|
|||||||
16
Dockerfile
16
Dockerfile
@@ -1,16 +0,0 @@
|
|||||||
FROM postgres:latest
|
|
||||||
ENV POSTGRES_USER ${POSTGRES_USER}
|
|
||||||
ENV POSTGRES_PASSWORD ${POSTGRES_PASSWORD}
|
|
||||||
ENV POSTGRES_DB ${POSTGRES_DB}
|
|
||||||
|
|
||||||
COPY ./prisma/migrations/ /docker-entrypoint-initdb.d/
|
|
||||||
|
|
||||||
EXPOSE 5432
|
|
||||||
|
|
||||||
# Use a loop to copy migration.sql from each folder to the corresponding directory in the build context
|
|
||||||
RUN for folder in /docker-entrypoint-initdb.d/*; do \
|
|
||||||
if [ -d "$folder" ]; then \
|
|
||||||
cp "$folder/migration.sql" "$folder.sql"; \
|
|
||||||
rm -rf "$folder"; \
|
|
||||||
fi \
|
|
||||||
done
|
|
||||||
4
Makefile
4
Makefile
@@ -41,7 +41,7 @@ stop-database:
|
|||||||
- docker stop $(DB_CONTAINER_NAME)
|
- docker stop $(DB_CONTAINER_NAME)
|
||||||
- docker rm $(DB_CONTAINER_NAME)
|
- docker rm $(DB_CONTAINER_NAME)
|
||||||
|
|
||||||
wait-fordatabase:
|
wait-for-database:
|
||||||
@while ! docker exec $(DB_CONTAINER_NAME) pg_isready -U $(DB_USER) -h localhost -p $(DB_PORT) > /dev/null 2>&1; do \
|
@while ! docker exec $(DB_CONTAINER_NAME) pg_isready -U $(DB_USER) -h localhost -p $(DB_PORT) > /dev/null 2>&1; do \
|
||||||
sleep 1; \
|
sleep 1; \
|
||||||
done
|
done
|
||||||
@@ -68,4 +68,4 @@ prod: install-dependencies prisma-studio backup-database-cronjob
|
|||||||
|
|
||||||
backup-database-cronjob:
|
backup-database-cronjob:
|
||||||
- pm2 delete daily-db-backup
|
- pm2 delete daily-db-backup
|
||||||
pm2 start backup-database.bash --name "daily-db-backup" --cron "0 0 * * *"
|
pm2 start bash --name "daily-db-backup" --cron "0 0 * * *" -- backup-database.bash
|
||||||
41
bun.lock
41
bun.lock
@@ -18,7 +18,7 @@
|
|||||||
"@trpc/client": "^10.45.2",
|
"@trpc/client": "^10.45.2",
|
||||||
"@trpc/server": "^10.45.2",
|
"@trpc/server": "^10.45.2",
|
||||||
"astro": "^4.16.17",
|
"astro": "^4.16.17",
|
||||||
"astro-typesafe-api": "^0.2.2",
|
"astro-typesafe-api": "^0.2.4",
|
||||||
"body-scroll-lock": "^4.0.0-beta.0",
|
"body-scroll-lock": "^4.0.0-beta.0",
|
||||||
"buffer": "^6.0.3",
|
"buffer": "^6.0.3",
|
||||||
"bun": "^1.2.5",
|
"bun": "^1.2.5",
|
||||||
@@ -44,6 +44,8 @@
|
|||||||
"siema": "^1.5.1",
|
"siema": "^1.5.1",
|
||||||
"soap": "^1.1.8",
|
"soap": "^1.1.8",
|
||||||
"sqids": "^0.3.0",
|
"sqids": "^0.3.0",
|
||||||
|
"ssh2-sftp-client": "^12.0.0",
|
||||||
|
"surrealdb": "^1.3.2",
|
||||||
"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",
|
||||||
@@ -67,6 +69,7 @@
|
|||||||
"@types/nodemailer": "^6.4.17",
|
"@types/nodemailer": "^6.4.17",
|
||||||
"@types/papaparse": "^5.3.15",
|
"@types/papaparse": "^5.3.15",
|
||||||
"@types/siema": "^1.4.11",
|
"@types/siema": "^1.4.11",
|
||||||
|
"@types/ssh2-sftp-client": "^9.0.4",
|
||||||
"@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",
|
||||||
@@ -82,11 +85,11 @@
|
|||||||
"postcss-import": "^16.1.0",
|
"postcss-import": "^16.1.0",
|
||||||
"postcss-nesting": "^13.0.1",
|
"postcss-nesting": "^13.0.1",
|
||||||
"prettier": "^2.8.8",
|
"prettier": "^2.8.8",
|
||||||
"prisma": "^6.4.1",
|
"prisma": "6.4.1",
|
||||||
"prisma-dbml-generator": "^0.12.0",
|
"prisma-dbml-generator": "^0.12.0",
|
||||||
"prisma-generator-fake-data": "^0.14.3",
|
"prisma-generator-fake-data": "^0.14.3",
|
||||||
"tsx": "^4.19.3",
|
"tsx": "^4.19.3",
|
||||||
"typescript": "^5",
|
"typescript": "^5.8.3",
|
||||||
"zod-prisma": "^0.5.4",
|
"zod-prisma": "^0.5.4",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -807,6 +810,10 @@
|
|||||||
|
|
||||||
"@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=="],
|
||||||
|
|
||||||
|
"@types/ssh2": ["@types/ssh2@1.15.5", "", { "dependencies": { "@types/node": "^18.11.18" } }, "sha512-N1ASjp/nXH3ovBHddRJpli4ozpk6UdDYIX4RJWFa9L1YKnzdhTlVmiGHm4DZnj/jLbqZpes4aeR30EFGQtvhQQ=="],
|
||||||
|
|
||||||
|
"@types/ssh2-sftp-client": ["@types/ssh2-sftp-client@9.0.4", "", { "dependencies": { "@types/ssh2": "^1.0.0" } }, "sha512-gnIn56MTB9W3A3hPL/1sHI23t8YwcE3eVYa1O2XjT9vaqimFdtNHxyQiy5Y78+ociQTKazMSD8YyMEO4QjNMrg=="],
|
||||||
|
|
||||||
"@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="],
|
"@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="],
|
||||||
|
|
||||||
"@types/uuid": ["@types/uuid@9.0.8", "", {}, "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA=="],
|
"@types/uuid": ["@types/uuid@9.0.8", "", {}, "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA=="],
|
||||||
@@ -909,7 +916,7 @@
|
|||||||
|
|
||||||
"astro": ["astro@4.16.18", "", { "dependencies": { "@astrojs/compiler": "^2.10.3", "@astrojs/internal-helpers": "0.4.1", "@astrojs/markdown-remark": "5.3.0", "@astrojs/telemetry": "3.1.0", "@babel/core": "^7.26.0", "@babel/plugin-transform-react-jsx": "^7.25.9", "@babel/types": "^7.26.0", "@oslojs/encoding": "^1.1.0", "@rollup/pluginutils": "^5.1.3", "@types/babel__core": "^7.20.5", "@types/cookie": "^0.6.0", "acorn": "^8.14.0", "aria-query": "^5.3.2", "axobject-query": "^4.1.0", "boxen": "8.0.1", "ci-info": "^4.1.0", "clsx": "^2.1.1", "common-ancestor-path": "^1.0.1", "cookie": "^0.7.2", "cssesc": "^3.0.0", "debug": "^4.3.7", "deterministic-object-hash": "^2.0.2", "devalue": "^5.1.1", "diff": "^5.2.0", "dlv": "^1.1.3", "dset": "^3.1.4", "es-module-lexer": "^1.5.4", "esbuild": "^0.21.5", "estree-walker": "^3.0.3", "fast-glob": "^3.3.2", "flattie": "^1.1.1", "github-slugger": "^2.0.0", "gray-matter": "^4.0.3", "html-escaper": "^3.0.3", "http-cache-semantics": "^4.1.1", "js-yaml": "^4.1.0", "kleur": "^4.1.5", "magic-string": "^0.30.14", "magicast": "^0.3.5", "micromatch": "^4.0.8", "mrmime": "^2.0.0", "neotraverse": "^0.6.18", "ora": "^8.1.1", "p-limit": "^6.1.0", "p-queue": "^8.0.1", "preferred-pm": "^4.0.0", "prompts": "^2.4.2", "rehype": "^13.0.2", "semver": "^7.6.3", "shiki": "^1.23.1", "tinyexec": "^0.3.1", "tsconfck": "^3.1.4", "unist-util-visit": "^5.0.0", "vfile": "^6.0.3", "vite": "^5.4.11", "vitefu": "^1.0.4", "which-pm": "^3.0.0", "xxhash-wasm": "^1.1.0", "yargs-parser": "^21.1.1", "zod": "^3.23.8", "zod-to-json-schema": "^3.23.5", "zod-to-ts": "^1.2.0" }, "optionalDependencies": { "sharp": "^0.33.3" }, "bin": { "astro": "astro.js" } }, "sha512-G7zfwJt9BDHEZwlaLNvjbInIw2hPryyD654314KV/XT34pJU6SfN1S+mWa8RAkALcZNJnJXCJmT3JXLQStD3Lw=="],
|
"astro": ["astro@4.16.18", "", { "dependencies": { "@astrojs/compiler": "^2.10.3", "@astrojs/internal-helpers": "0.4.1", "@astrojs/markdown-remark": "5.3.0", "@astrojs/telemetry": "3.1.0", "@babel/core": "^7.26.0", "@babel/plugin-transform-react-jsx": "^7.25.9", "@babel/types": "^7.26.0", "@oslojs/encoding": "^1.1.0", "@rollup/pluginutils": "^5.1.3", "@types/babel__core": "^7.20.5", "@types/cookie": "^0.6.0", "acorn": "^8.14.0", "aria-query": "^5.3.2", "axobject-query": "^4.1.0", "boxen": "8.0.1", "ci-info": "^4.1.0", "clsx": "^2.1.1", "common-ancestor-path": "^1.0.1", "cookie": "^0.7.2", "cssesc": "^3.0.0", "debug": "^4.3.7", "deterministic-object-hash": "^2.0.2", "devalue": "^5.1.1", "diff": "^5.2.0", "dlv": "^1.1.3", "dset": "^3.1.4", "es-module-lexer": "^1.5.4", "esbuild": "^0.21.5", "estree-walker": "^3.0.3", "fast-glob": "^3.3.2", "flattie": "^1.1.1", "github-slugger": "^2.0.0", "gray-matter": "^4.0.3", "html-escaper": "^3.0.3", "http-cache-semantics": "^4.1.1", "js-yaml": "^4.1.0", "kleur": "^4.1.5", "magic-string": "^0.30.14", "magicast": "^0.3.5", "micromatch": "^4.0.8", "mrmime": "^2.0.0", "neotraverse": "^0.6.18", "ora": "^8.1.1", "p-limit": "^6.1.0", "p-queue": "^8.0.1", "preferred-pm": "^4.0.0", "prompts": "^2.4.2", "rehype": "^13.0.2", "semver": "^7.6.3", "shiki": "^1.23.1", "tinyexec": "^0.3.1", "tsconfck": "^3.1.4", "unist-util-visit": "^5.0.0", "vfile": "^6.0.3", "vite": "^5.4.11", "vitefu": "^1.0.4", "which-pm": "^3.0.0", "xxhash-wasm": "^1.1.0", "yargs-parser": "^21.1.1", "zod": "^3.23.8", "zod-to-json-schema": "^3.23.5", "zod-to-ts": "^1.2.0" }, "optionalDependencies": { "sharp": "^0.33.3" }, "bin": { "astro": "astro.js" } }, "sha512-G7zfwJt9BDHEZwlaLNvjbInIw2hPryyD654314KV/XT34pJU6SfN1S+mWa8RAkALcZNJnJXCJmT3JXLQStD3Lw=="],
|
||||||
|
|
||||||
"astro-typesafe-api": ["astro-typesafe-api@0.2.2", "", { "dependencies": { "es-codec": "^0.5.0", "globby": "^14.0.2" }, "peerDependencies": { "astro": "^4.16.17", "typescript": "^5.0.0", "zod": "^3.24.1" }, "bin": { "astro-typesafe-api": "src/cli.ts" } }, "sha512-SEHV2iPyIrdpYdYb0mIN1WmcvC61bvsCQqb/X+R4EOcFjuozJ9fJhSiFGxJMvNoxJ9S3P3GKLyDnxXvFlKq0mw=="],
|
"astro-typesafe-api": ["astro-typesafe-api@0.2.4", "", { "dependencies": { "es-codec": "^0.5.0", "globby": "^14.0.2" }, "peerDependencies": { "astro": "^4.16.17", "typescript": "^5.0.0", "zod": "^3.24.1" }, "bin": { "astro-typesafe-api": "src/cli.ts" } }, "sha512-KiAw7+QJyuzz606GSkeaTdav8vttDUEYVaFAdVRlDuSvUdhcYsJB14zHkMe6ZSMfRNBQRxaMZBgPgEtWb1mf1w=="],
|
||||||
|
|
||||||
"async": ["async@3.2.6", "", {}, "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="],
|
"async": ["async@3.2.6", "", {}, "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="],
|
||||||
|
|
||||||
@@ -975,6 +982,10 @@
|
|||||||
|
|
||||||
"buffer-equal-constant-time": ["buffer-equal-constant-time@1.0.1", "", {}, "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="],
|
"buffer-equal-constant-time": ["buffer-equal-constant-time@1.0.1", "", {}, "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="],
|
||||||
|
|
||||||
|
"buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="],
|
||||||
|
|
||||||
|
"buildcheck": ["buildcheck@0.0.6", "", {}, "sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A=="],
|
||||||
|
|
||||||
"bun": ["bun@1.2.5", "", { "optionalDependencies": { "@oven/bun-darwin-aarch64": "1.2.5", "@oven/bun-darwin-x64": "1.2.5", "@oven/bun-darwin-x64-baseline": "1.2.5", "@oven/bun-linux-aarch64": "1.2.5", "@oven/bun-linux-aarch64-musl": "1.2.5", "@oven/bun-linux-x64": "1.2.5", "@oven/bun-linux-x64-baseline": "1.2.5", "@oven/bun-linux-x64-musl": "1.2.5", "@oven/bun-linux-x64-musl-baseline": "1.2.5", "@oven/bun-windows-x64": "1.2.5", "@oven/bun-windows-x64-baseline": "1.2.5" }, "os": [ "linux", "win32", "darwin", ], "cpu": [ "x64", "arm64", ], "bin": { "bun": "bin/bun.exe", "bunx": "bin/bun.exe" } }, "sha512-fbQLt+DPiGUrPKdmsHRRT7cQAlfjdxPVFvLZrsUPmKiTdv+pU50ypdx9yRJluknSbyaZchFVV7Lx2KXikXKX2Q=="],
|
"bun": ["bun@1.2.5", "", { "optionalDependencies": { "@oven/bun-darwin-aarch64": "1.2.5", "@oven/bun-darwin-x64": "1.2.5", "@oven/bun-darwin-x64-baseline": "1.2.5", "@oven/bun-linux-aarch64": "1.2.5", "@oven/bun-linux-aarch64-musl": "1.2.5", "@oven/bun-linux-x64": "1.2.5", "@oven/bun-linux-x64-baseline": "1.2.5", "@oven/bun-linux-x64-musl": "1.2.5", "@oven/bun-linux-x64-musl-baseline": "1.2.5", "@oven/bun-windows-x64": "1.2.5", "@oven/bun-windows-x64-baseline": "1.2.5" }, "os": [ "linux", "win32", "darwin", ], "cpu": [ "x64", "arm64", ], "bin": { "bun": "bin/bun.exe", "bunx": "bin/bun.exe" } }, "sha512-fbQLt+DPiGUrPKdmsHRRT7cQAlfjdxPVFvLZrsUPmKiTdv+pU50ypdx9yRJluknSbyaZchFVV7Lx2KXikXKX2Q=="],
|
||||||
|
|
||||||
"bun-types": ["bun-types@1.2.2", "", { "dependencies": { "@types/node": "*", "@types/ws": "~8.5.10" } }, "sha512-RCbMH5elr9gjgDGDhkTTugA21XtJAy/9jkKe/G3WR2q17VPGhcquf9Sir6uay9iW+7P/BV0CAHA1XlHXMAVKHg=="],
|
"bun-types": ["bun-types@1.2.2", "", { "dependencies": { "@types/node": "*", "@types/ws": "~8.5.10" } }, "sha512-RCbMH5elr9gjgDGDhkTTugA21XtJAy/9jkKe/G3WR2q17VPGhcquf9Sir6uay9iW+7P/BV0CAHA1XlHXMAVKHg=="],
|
||||||
@@ -1083,6 +1094,8 @@
|
|||||||
|
|
||||||
"concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="],
|
"concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="],
|
||||||
|
|
||||||
|
"concat-stream": ["concat-stream@2.0.0", "", { "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.0.2", "typedarray": "^0.0.6" } }, "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A=="],
|
||||||
|
|
||||||
"consola": ["consola@3.4.0", "", {}, "sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA=="],
|
"consola": ["consola@3.4.0", "", {}, "sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA=="],
|
||||||
|
|
||||||
"console-control-strings": ["console-control-strings@1.1.0", "", {}, "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ=="],
|
"console-control-strings": ["console-control-strings@1.1.0", "", {}, "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ=="],
|
||||||
@@ -1107,6 +1120,8 @@
|
|||||||
|
|
||||||
"core-util-is": ["core-util-is@1.0.2", "", {}, "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="],
|
"core-util-is": ["core-util-is@1.0.2", "", {}, "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="],
|
||||||
|
|
||||||
|
"cpu-features": ["cpu-features@0.0.10", "", { "dependencies": { "buildcheck": "~0.0.6", "nan": "^2.19.0" } }, "sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA=="],
|
||||||
|
|
||||||
"crc-32": ["crc-32@1.2.2", "", { "bin": { "crc32": "bin/crc32.njs" } }, "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ=="],
|
"crc-32": ["crc-32@1.2.2", "", { "bin": { "crc32": "bin/crc32.njs" } }, "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ=="],
|
||||||
|
|
||||||
"crc32-stream": ["crc32-stream@4.0.3", "", { "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^3.4.0" } }, "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw=="],
|
"crc32-stream": ["crc32-stream@4.0.3", "", { "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^3.4.0" } }, "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw=="],
|
||||||
@@ -1601,6 +1616,8 @@
|
|||||||
|
|
||||||
"isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
|
"isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
|
||||||
|
|
||||||
|
"isows": ["isows@1.0.6", "", { "peerDependencies": { "ws": "*" } }, "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw=="],
|
||||||
|
|
||||||
"isstream": ["isstream@0.1.2", "", {}, "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="],
|
"isstream": ["isstream@0.1.2", "", {}, "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="],
|
||||||
|
|
||||||
"jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="],
|
"jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="],
|
||||||
@@ -2395,6 +2412,10 @@
|
|||||||
|
|
||||||
"sqids": ["sqids@0.3.0", "", {}, "sha512-lOQK1ucVg+W6n3FhRwwSeUijxe93b51Bfz5PMRMihVf1iVkl82ePQG7V5vwrhzB11v0NtsR25PSZRGiSomJaJw=="],
|
"sqids": ["sqids@0.3.0", "", {}, "sha512-lOQK1ucVg+W6n3FhRwwSeUijxe93b51Bfz5PMRMihVf1iVkl82ePQG7V5vwrhzB11v0NtsR25PSZRGiSomJaJw=="],
|
||||||
|
|
||||||
|
"ssh2": ["ssh2@1.16.0", "", { "dependencies": { "asn1": "^0.2.6", "bcrypt-pbkdf": "^1.0.2" }, "optionalDependencies": { "cpu-features": "~0.0.10", "nan": "^2.20.0" } }, "sha512-r1X4KsBGedJqo7h8F5c4Ybpcr5RjyP+aWIG007uBPRjmdQWfEiVLzSK71Zji1B9sKxwaCvD8y8cwSkYrlLiRRg=="],
|
||||||
|
|
||||||
|
"ssh2-sftp-client": ["ssh2-sftp-client@12.0.0", "", { "dependencies": { "concat-stream": "^2.0.0", "ssh2": "^1.16.0" } }, "sha512-k+ocDsx6N2eDwQlIRwJFa0I1bkQpFPhIc+cv1iplaQaIPXFt9YM1ZnXCJOW4OILS5dzE+12OlhYIF5g0AzgVfg=="],
|
||||||
|
|
||||||
"sshpk": ["sshpk@1.18.0", "", { "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", "bcrypt-pbkdf": "^1.0.0", "dashdash": "^1.12.0", "ecc-jsbn": "~0.1.1", "getpass": "^0.1.1", "jsbn": "~0.1.0", "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" }, "bin": { "sshpk-conv": "bin/sshpk-conv", "sshpk-sign": "bin/sshpk-sign", "sshpk-verify": "bin/sshpk-verify" } }, "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ=="],
|
"sshpk": ["sshpk@1.18.0", "", { "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", "bcrypt-pbkdf": "^1.0.0", "dashdash": "^1.12.0", "ecc-jsbn": "~0.1.1", "getpass": "^0.1.1", "jsbn": "~0.1.0", "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" }, "bin": { "sshpk-conv": "bin/sshpk-conv", "sshpk-sign": "bin/sshpk-sign", "sshpk-verify": "bin/sshpk-verify" } }, "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ=="],
|
||||||
|
|
||||||
"statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="],
|
"statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="],
|
||||||
@@ -2439,6 +2460,8 @@
|
|||||||
|
|
||||||
"supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="],
|
"supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="],
|
||||||
|
|
||||||
|
"surrealdb": ["surrealdb@1.3.2", "", { "dependencies": { "isows": "^1.0.6", "uuidv7": "^1.0.1" }, "peerDependencies": { "tslib": "^2.6.3", "typescript": "^5.0.0" } }, "sha512-mL7nij33iuon3IQP72F46fgX3p2LAxFCWCBDbZB7IohZ13RTEwJVNq7nZeP1eMSceQUpKzS6OHIWOuF9LYAkNw=="],
|
||||||
|
|
||||||
"svelte": ["svelte@3.59.2", "", {}, "sha512-vzSyuGr3eEoAtT/A6bmajosJZIUWySzY2CzB3w2pgPvnkUjGqlDnsNnA0PMO+mMAhuyMul6C2uuZzY6ELSkzyA=="],
|
"svelte": ["svelte@3.59.2", "", {}, "sha512-vzSyuGr3eEoAtT/A6bmajosJZIUWySzY2CzB3w2pgPvnkUjGqlDnsNnA0PMO+mMAhuyMul6C2uuZzY6ELSkzyA=="],
|
||||||
|
|
||||||
"svelte-dialogs": ["svelte-dialogs@1.2.2", "", { "peerDependencies": { "svelte": "^3.5.0" } }, "sha512-Pf25Xua2nDIIR4v45PNbn+yFrFLNc0ns9+sO8Ms77Hm/CdxFuXm01XO8Qkw8Ej66BvboX+kIJ3TCm8uwP/XmyQ=="],
|
"svelte-dialogs": ["svelte-dialogs@1.2.2", "", { "peerDependencies": { "svelte": "^3.5.0" } }, "sha512-Pf25Xua2nDIIR4v45PNbn+yFrFLNc0ns9+sO8Ms77Hm/CdxFuXm01XO8Qkw8Ej66BvboX+kIJ3TCm8uwP/XmyQ=="],
|
||||||
@@ -2539,6 +2562,8 @@
|
|||||||
|
|
||||||
"type-is": ["type-is@1.6.18", "", { "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" } }, "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="],
|
"type-is": ["type-is@1.6.18", "", { "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" } }, "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="],
|
||||||
|
|
||||||
|
"typedarray": ["typedarray@0.0.6", "", {}, "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="],
|
||||||
|
|
||||||
"typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="],
|
"typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="],
|
||||||
|
|
||||||
"ufo": ["ufo@1.5.4", "", {}, "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ=="],
|
"ufo": ["ufo@1.5.4", "", {}, "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ=="],
|
||||||
@@ -2597,6 +2622,8 @@
|
|||||||
|
|
||||||
"uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="],
|
"uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="],
|
||||||
|
|
||||||
|
"uuidv7": ["uuidv7@1.0.2", "", { "bin": { "uuidv7": "cli.js" } }, "sha512-8JQkH4ooXnm1JCIhqTMbtmdnYEn6oKukBxHn1Ic9878jMkL7daTI7anTExfY18VRCX7tcdn5quzvCb6EWrR8PA=="],
|
||||||
|
|
||||||
"v8-compile-cache": ["v8-compile-cache@2.4.0", "", {}, "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw=="],
|
"v8-compile-cache": ["v8-compile-cache@2.4.0", "", {}, "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw=="],
|
||||||
|
|
||||||
"validate-npm-package-license": ["validate-npm-package-license@3.0.4", "", { "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew=="],
|
"validate-npm-package-license": ["validate-npm-package-license@3.0.4", "", { "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew=="],
|
||||||
@@ -2643,6 +2670,8 @@
|
|||||||
|
|
||||||
"wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="],
|
"wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="],
|
||||||
|
|
||||||
|
"ws": ["ws@8.18.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w=="],
|
||||||
|
|
||||||
"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=="],
|
"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=="],
|
"xpath": ["xpath@0.0.33", "", {}, "sha512-NNXnzrkDrAzalLhIUc01jO2mOzXGXh1JwPgkihcLLzw98c0WgYDmmjSh1Kl3wzaxSVWMuA+fe0WTWOBDWCBmNA=="],
|
||||||
@@ -2741,6 +2770,8 @@
|
|||||||
|
|
||||||
"@sveltejs/vite-plugin-svelte/vitefu": ["vitefu@0.2.5", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" }, "optionalPeers": ["vite"] }, "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q=="],
|
"@sveltejs/vite-plugin-svelte/vitefu": ["vitefu@0.2.5", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" }, "optionalPeers": ["vite"] }, "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q=="],
|
||||||
|
|
||||||
|
"@types/ssh2/@types/node": ["@types/node@18.19.86", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-fifKayi175wLyKyc5qUfyENhQ1dCNI1UNjp653d8kuYcPQN5JhX3dGuP/XmvPTg/xRBn1VTLpbmi+H/Mr7tLfQ=="],
|
||||||
|
|
||||||
"@typescript-eslint/typescript-estree/globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="],
|
"@typescript-eslint/typescript-estree/globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="],
|
||||||
|
|
||||||
"@typescript-eslint/utils/eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="],
|
"@typescript-eslint/utils/eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="],
|
||||||
@@ -3001,6 +3032,8 @@
|
|||||||
|
|
||||||
"@prisma/internals/globby/slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="],
|
"@prisma/internals/globby/slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="],
|
||||||
|
|
||||||
|
"@types/ssh2/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="],
|
||||||
|
|
||||||
"@typescript-eslint/typescript-estree/globby/slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="],
|
"@typescript-eslint/typescript-estree/globby/slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="],
|
||||||
|
|
||||||
"@typescript-eslint/utils/eslint-scope/estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="],
|
"@typescript-eslint/utils/eslint-scope/estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="],
|
||||||
|
|||||||
@@ -1,8 +1,16 @@
|
|||||||
version: '3'
|
version: '3'
|
||||||
|
|
||||||
services:
|
services:
|
||||||
database:
|
surrealdb:
|
||||||
build: ./
|
|
||||||
env_file:
|
env_file:
|
||||||
- .env
|
- .env
|
||||||
|
entrypoint:
|
||||||
|
- /surreal
|
||||||
|
- start
|
||||||
|
- --user
|
||||||
|
- $DB_USER
|
||||||
|
- --pass
|
||||||
|
- $DB_PASSWORD
|
||||||
|
image: surrealdb/surrealdb:latest
|
||||||
ports:
|
ports:
|
||||||
- 5432:5432
|
- 8000:8000
|
||||||
|
|||||||
@@ -32,7 +32,7 @@
|
|||||||
"@trpc/client": "^10.45.2",
|
"@trpc/client": "^10.45.2",
|
||||||
"@trpc/server": "^10.45.2",
|
"@trpc/server": "^10.45.2",
|
||||||
"astro": "^4.16.17",
|
"astro": "^4.16.17",
|
||||||
"astro-typesafe-api": "^0.2.2",
|
"astro-typesafe-api": "^0.2.4",
|
||||||
"body-scroll-lock": "^4.0.0-beta.0",
|
"body-scroll-lock": "^4.0.0-beta.0",
|
||||||
"buffer": "^6.0.3",
|
"buffer": "^6.0.3",
|
||||||
"bun": "^1.2.5",
|
"bun": "^1.2.5",
|
||||||
@@ -58,6 +58,8 @@
|
|||||||
"siema": "^1.5.1",
|
"siema": "^1.5.1",
|
||||||
"soap": "^1.1.8",
|
"soap": "^1.1.8",
|
||||||
"sqids": "^0.3.0",
|
"sqids": "^0.3.0",
|
||||||
|
"ssh2-sftp-client": "^12.0.0",
|
||||||
|
"surrealdb": "^1.3.2",
|
||||||
"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",
|
||||||
@@ -81,6 +83,7 @@
|
|||||||
"@types/nodemailer": "^6.4.17",
|
"@types/nodemailer": "^6.4.17",
|
||||||
"@types/papaparse": "^5.3.15",
|
"@types/papaparse": "^5.3.15",
|
||||||
"@types/siema": "^1.4.11",
|
"@types/siema": "^1.4.11",
|
||||||
|
"@types/ssh2-sftp-client": "^9.0.4",
|
||||||
"@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",
|
||||||
|
|||||||
Binary file not shown.
44
src/astro-typesafe-api-caller.ts
Normal file
44
src/astro-typesafe-api-caller.ts
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
import { createCallerFactory } from "astro-typesafe-api/server";
|
||||||
|
|
||||||
|
export const createCaller = createCallerFactory({
|
||||||
|
"bild": await import("../src/pages/api/bild.ts"),
|
||||||
|
"klimafaktoren": await import("../src/pages/api/klimafaktoren.ts"),
|
||||||
|
"postleitzahlen": await import("../src/pages/api/postleitzahlen.ts"),
|
||||||
|
"unterlage": await import("../src/pages/api/unterlage.ts"),
|
||||||
|
"auth/access-token": await import("../src/pages/api/auth/access-token.ts"),
|
||||||
|
"auth/passwort-vergessen": await import("../src/pages/api/auth/passwort-vergessen.ts"),
|
||||||
|
"auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"),
|
||||||
|
"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/registriernummer": await import("../src/pages/api/admin/registriernummer.ts"),
|
||||||
|
"admin/stornieren": await import("../src/pages/api/admin/stornieren.ts"),
|
||||||
|
"aufnahme": await import("../src/pages/api/aufnahme/index.ts"),
|
||||||
|
"ausweise": await import("../src/pages/api/ausweise/index.ts"),
|
||||||
|
"bedarfsausweis-gewerbe/[id]": await import("../src/pages/api/bedarfsausweis-gewerbe/[id].ts"),
|
||||||
|
"bedarfsausweis-gewerbe": await import("../src/pages/api/bedarfsausweis-gewerbe/index.ts"),
|
||||||
|
"bedarfsausweis-wohnen/[id]": await import("../src/pages/api/bedarfsausweis-wohnen/[id].ts"),
|
||||||
|
"bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"),
|
||||||
|
"bilder/[id]": await import("../src/pages/api/bilder/[id].ts"),
|
||||||
|
"geg-nachweis-gewerbe/[id]": await import("../src/pages/api/geg-nachweis-gewerbe/[id].ts"),
|
||||||
|
"geg-nachweis-gewerbe": await import("../src/pages/api/geg-nachweis-gewerbe/index.ts"),
|
||||||
|
"geg-nachweis-wohnen/[id]": await import("../src/pages/api/geg-nachweis-wohnen/[id].ts"),
|
||||||
|
"geg-nachweis-wohnen": await import("../src/pages/api/geg-nachweis-wohnen/index.ts"),
|
||||||
|
"objekt": await import("../src/pages/api/objekt/index.ts"),
|
||||||
|
"rechnung/[id]": await import("../src/pages/api/rechnung/[id].ts"),
|
||||||
|
"rechnung/anfordern": await import("../src/pages/api/rechnung/anfordern.ts"),
|
||||||
|
"rechnung": await import("../src/pages/api/rechnung/index.ts"),
|
||||||
|
"ticket": await import("../src/pages/api/ticket/index.ts"),
|
||||||
|
"user": await import("../src/pages/api/user/index.ts"),
|
||||||
|
"user/self": await import("../src/pages/api/user/self.ts"),
|
||||||
|
"verbrauchsausweis-gewerbe/[id]": await import("../src/pages/api/verbrauchsausweis-gewerbe/[id].ts"),
|
||||||
|
"verbrauchsausweis-gewerbe": await import("../src/pages/api/verbrauchsausweis-gewerbe/index.ts"),
|
||||||
|
"verbrauchsausweis-wohnen/[id]": await import("../src/pages/api/verbrauchsausweis-wohnen/[id].ts"),
|
||||||
|
"verbrauchsausweis-wohnen": await import("../src/pages/api/verbrauchsausweis-wohnen/index.ts"),
|
||||||
|
"webhooks/mollie": await import("../src/pages/api/webhooks/mollie.ts"),
|
||||||
|
"aufnahme/[id]/bilder": await import("../src/pages/api/aufnahme/[id]/bilder.ts"),
|
||||||
|
"aufnahme/[id]": await import("../src/pages/api/aufnahme/[id]/index.ts"),
|
||||||
|
"aufnahme/[id]/unterlagen": await import("../src/pages/api/aufnahme/[id]/unterlagen.ts"),
|
||||||
|
"objekt/[id]": await import("../src/pages/api/objekt/[id]/index.ts"),
|
||||||
|
})
|
||||||
@@ -63,8 +63,15 @@
|
|||||||
fuelMap[fuel[0]].push(fuel[1]);
|
fuelMap[fuel[0]].push(fuel[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
let month = moment(ausweis.startdatum).month();
|
// Falls der Ausweis bereits einmal gespeichert wurde mit einem Startdatum sollten wir dieses benutzen.
|
||||||
let year = moment(ausweis.startdatum).year();
|
let month: number, year: number;
|
||||||
|
if (ausweis.startdatum) {
|
||||||
|
month = moment(ausweis.startdatum).get("month")
|
||||||
|
year = moment(ausweis.startdatum).get("year")
|
||||||
|
} else {
|
||||||
|
month = availableDates[availableDates.length - 1].month;
|
||||||
|
year = availableDates[availableDates.length - 1].year;
|
||||||
|
}
|
||||||
|
|
||||||
$: {
|
$: {
|
||||||
if (typeof month === "number" && typeof year === "number") {
|
if (typeof month === "number" && typeof year === "number") {
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ $: {
|
|||||||
<!-- % Anteil Warmwasser -->
|
<!-- % Anteil Warmwasser -->
|
||||||
|
|
||||||
<div class="input-standard order-2 md:order-2 xl:order-2">
|
<div class="input-standard order-2 md:order-2 xl:order-2">
|
||||||
<Inputlabel title="% Anteil Warmwasser"></Inputlabel>
|
<Inputlabel title="% Anteil Kühlung"></Inputlabel>
|
||||||
|
|
||||||
<input
|
<input
|
||||||
name="anteil_kuehlung_1"
|
name="anteil_kuehlung_1"
|
||||||
|
|||||||
@@ -40,15 +40,15 @@
|
|||||||
"Dezember",
|
"Dezember",
|
||||||
];
|
];
|
||||||
|
|
||||||
const startDate = moment(aufnahme.erstellungsdatum || Date.now())
|
const earlistPossibleStartDate = moment(aufnahme.erstellungsdatum || Date.now())
|
||||||
.subtract(4, "years")
|
.subtract(4, "years")
|
||||||
.subtract(6, "months");
|
.subtract(6, "months");
|
||||||
const endDate = moment(aufnahme.erstellungsdatum || Date.now()).subtract(
|
const lastPossibleEndDate = moment(aufnahme.erstellungsdatum || Date.now()).subtract(
|
||||||
3,
|
3,
|
||||||
"years"
|
"years"
|
||||||
);
|
);
|
||||||
|
|
||||||
for (let m = moment(startDate); m.isBefore(endDate); m.add(1, "month")) {
|
for (let m = moment(earlistPossibleStartDate); m.isBefore(lastPossibleEndDate); m.add(1, "month")) {
|
||||||
availableDates.push({
|
availableDates.push({
|
||||||
year: m.year(),
|
year: m.year(),
|
||||||
month: m.month(),
|
month: m.month(),
|
||||||
@@ -62,8 +62,15 @@
|
|||||||
fuelMap[fuel[0]].push(fuel[1]);
|
fuelMap[fuel[0]].push(fuel[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
let month = availableDates[availableDates.length - 1].month;
|
// Falls der Ausweis bereits einmal gespeichert wurde mit einem Startdatum sollten wir dieses benutzen.
|
||||||
let year = availableDates[availableDates.length - 1].year;
|
let month: number, year: number;
|
||||||
|
if (ausweis.startdatum) {
|
||||||
|
month = moment(ausweis.startdatum).get("month")
|
||||||
|
year = moment(ausweis.startdatum).get("year")
|
||||||
|
} else {
|
||||||
|
month = availableDates[availableDates.length - 1].month;
|
||||||
|
year = availableDates[availableDates.length - 1].year;
|
||||||
|
}
|
||||||
|
|
||||||
$: {
|
$: {
|
||||||
if (typeof month === "number" && typeof year === "number") {
|
if (typeof month === "number" && typeof year === "number") {
|
||||||
|
|||||||
@@ -116,7 +116,7 @@
|
|||||||
async function stornieren() {
|
async function stornieren() {
|
||||||
try {
|
try {
|
||||||
const response = await api.admin.stornieren.PUT.fetch({
|
const response = await api.admin.stornieren.PUT.fetch({
|
||||||
uid_ausweis: ausweis.id
|
ausweis_id: ausweis.id
|
||||||
}, {
|
}, {
|
||||||
headers: {
|
headers: {
|
||||||
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
|
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
|
||||||
@@ -143,7 +143,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function ausstellen() {
|
async function ausstellen(post = false) {
|
||||||
const notification = addNotification({
|
const notification = addNotification({
|
||||||
message: "Ausweis wird ausgestellt.",
|
message: "Ausweis wird ausgestellt.",
|
||||||
subtext: "Der Ausweis wird nun ausgestellt, bitte habe einen Augenblick geduld..",
|
subtext: "Der Ausweis wird nun ausgestellt, bitte habe einen Augenblick geduld..",
|
||||||
@@ -152,7 +152,8 @@
|
|||||||
})
|
})
|
||||||
try {
|
try {
|
||||||
await api.admin.ausstellen.GET.fetch({
|
await api.admin.ausstellen.GET.fetch({
|
||||||
id_ausweis: ausweis.id
|
id_ausweis: ausweis.id,
|
||||||
|
post
|
||||||
}, {
|
}, {
|
||||||
headers: {
|
headers: {
|
||||||
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
|
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
|
||||||
@@ -364,37 +365,6 @@
|
|||||||
href="/angebot-anfragen/bedarfsausweis-gewerbe-anfragen?id={ausweis.id}"
|
href="/angebot-anfragen/bedarfsausweis-gewerbe-anfragen?id={ausweis.id}"
|
||||||
>Bearbeiten</a>
|
>Bearbeiten</a>
|
||||||
{/if}
|
{/if}
|
||||||
{#if ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen}
|
|
||||||
<a
|
|
||||||
class="button text-sm"
|
|
||||||
href="/energieausweis-erstellen/verbrauchsausweis-wohngebaeude?id={ausweis.id}"
|
|
||||||
>Bearbeiten</a>
|
|
||||||
{:else if ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe}
|
|
||||||
<a
|
|
||||||
class="button text-sm"
|
|
||||||
href="/energieausweis-erstellen/verbrauchsausweis-gewerbe?id={ausweis.id}"
|
|
||||||
>Bearbeiten</a>
|
|
||||||
{:else if ausweisart === Enums.Ausweisart.BedarfsausweisWohnen}
|
|
||||||
<a
|
|
||||||
class="button text-sm"
|
|
||||||
href="/energieausweis-erstellen/bedarfsausweis-wohngebaeude?id={ausweis.id}"
|
|
||||||
>Bearbeiten</a>
|
|
||||||
{:else if ausweisart === Enums.Ausweisart.GEGNachweisWohnen}
|
|
||||||
<a
|
|
||||||
class="button text-sm"
|
|
||||||
href="/angebot-anfragen/geg-nachweis-wohnen-anfragen?id={ausweis.id}"
|
|
||||||
>Bearbeiten</a>
|
|
||||||
{:else if ausweisart === Enums.Ausweisart.GEGNachweisGewerbe}
|
|
||||||
<a
|
|
||||||
class="button text-sm"
|
|
||||||
href="/angebot-anfragen/geg-nachweis-gewerbe-anfragen?id={ausweis.id}"
|
|
||||||
>Bearbeiten</a>
|
|
||||||
{:else if ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe}
|
|
||||||
<a
|
|
||||||
class="button text-sm"
|
|
||||||
href="/angebot-anfragen/bedarfsausweis-gewerbe-anfragen?id={ausweis.id}"
|
|
||||||
>Bearbeiten</a>
|
|
||||||
{/if}
|
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
{#if benutzer.rolle === Enums.BenutzerRolle.ADMIN}
|
{#if benutzer.rolle === Enums.BenutzerRolle.ADMIN}
|
||||||
@@ -417,9 +387,10 @@
|
|||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
{#if benutzer.rolle === Enums.BenutzerRolle.ADMIN}
|
{#if benutzer.rolle === Enums.BenutzerRolle.ADMIN}
|
||||||
<button class="button text-sm" on:click={ausstellen}>A</button>
|
<button class="button text-sm" title="Ausstellen" on:click={() => ausstellen(false)}>A</button>
|
||||||
<button class="button text-sm" on:click={stornieren}>S</button>
|
<button class="button text-sm" title="Ausstellen mit Postversand" on:click={() => ausstellen(true)}>P</button>
|
||||||
<button class="button text-sm" on:click={registriernummer}>R</button>
|
<button class="button text-sm" title="Stornieren" on:click={stornieren}>S</button>
|
||||||
|
<button class="button text-sm" title="Registriernummer anfordern" on:click={registriernummer}>R</button>
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
<a
|
<a
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
// import "svelte-ripple-action/ripple.css";
|
// import "svelte-ripple-action/ripple.css";
|
||||||
import "../style/global.css";
|
import "../style/global.css";
|
||||||
import "../../svelte-dialogs.config.js";
|
import "../../svelte-dialogs.config.js";
|
||||||
import DashboardSidebar from "../components/Dashboard/DashboardSidebar.svelte";
|
import DashboardSidebar from "../components/Dashboard/DashboardSidebar.svelte";
|
||||||
@@ -124,7 +124,7 @@ let lightTheme = Astro.cookies.get("theme")?.value === "light";
|
|||||||
client:load
|
client:load
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<article class="box px-6 py-5 h-screen">
|
<article class="box px-6 py-5 h-full">
|
||||||
<slot />
|
<slot />
|
||||||
</article>
|
</article>
|
||||||
</main>
|
</main>
|
||||||
|
|||||||
@@ -85,13 +85,13 @@ export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis:
|
|||||||
let energieVerbrauchWarmwasser_1 = 0;
|
let energieVerbrauchWarmwasser_1 = 0;
|
||||||
let energieVerbrauchWarmwasser_2 = 0;
|
let energieVerbrauchWarmwasser_2 = 0;
|
||||||
|
|
||||||
if (ausweis.warmwasser_enthalten && ausweis.anteil_warmwasser_1 != 0) {
|
if (ausweis.warmwasser_enthalten && ausweis.anteil_warmwasser_1 != 0 && ausweis.anteil_warmwasser_1 !== null) {
|
||||||
|
|
||||||
// Wenn Warmwasser enthalten und Anteil bekannt
|
// Wenn Warmwasser enthalten und Anteil bekannt
|
||||||
energieVerbrauchWarmwasser_1 = energieVerbrauchGesamt_1 * ((ausweis.anteil_warmwasser_1 || 0) / 100);
|
energieVerbrauchWarmwasser_1 = energieVerbrauchGesamt_1 * ((ausweis.anteil_warmwasser_1 || 0) / 100);
|
||||||
energieVerbrauchWarmwasser_2 = energieVerbrauchGesamt_2 * ((ausweis.anteil_warmwasser_2 || 0) / 100);
|
energieVerbrauchWarmwasser_2 = energieVerbrauchGesamt_2 * ((ausweis.anteil_warmwasser_2 || 0) / 100);
|
||||||
|
|
||||||
} else if (ausweis.warmwasser_enthalten && ausweis.anteil_warmwasser_1 == 0){
|
} else if (ausweis.warmwasser_enthalten && (ausweis.anteil_warmwasser_1 == 0 || ausweis.anteil_warmwasser_1 === null)) {
|
||||||
if (aufnahme.gebaeudetyp == "Krankenhäuser (ohne Forschung und Lehre)" || aufnahme.gebaeudetyp == "Krankenhäuser (ohne Forschung und Lehre) & teilstationäre Versorgung" || aufnahme.gebaeudetyp == "Schwimmhallen") {
|
if (aufnahme.gebaeudetyp == "Krankenhäuser (ohne Forschung und Lehre)" || aufnahme.gebaeudetyp == "Krankenhäuser (ohne Forschung und Lehre) & teilstationäre Versorgung" || aufnahme.gebaeudetyp == "Schwimmhallen") {
|
||||||
energieVerbrauchWarmwasser_1 = energieVerbrauchGesamt_1 * 0.5;
|
energieVerbrauchWarmwasser_1 = energieVerbrauchGesamt_1 * 0.5;
|
||||||
energieVerbrauchWarmwasser_2 = energieVerbrauchGesamt_2 * ((ausweis.anteil_warmwasser_2 || 0) / 100);
|
energieVerbrauchWarmwasser_2 = energieVerbrauchGesamt_2 * ((ausweis.anteil_warmwasser_2 || 0) / 100);
|
||||||
@@ -107,8 +107,14 @@ export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis:
|
|||||||
energieVerbrauchWarmwasser_2 = 0;
|
energieVerbrauchWarmwasser_2 = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
let kuehlungsZuschlag_1: number = 0, kuehlungsZuschlag_2: number = 0;
|
let kuehlungsZuschlag_1: number = 0, kuehlungsZuschlag_2: number = 0; let kuehlungsZuschlag = 0;
|
||||||
if (aufnahme.kuehlung) {
|
if (aufnahme.kuehlung === "1" && aufnahme.kuehlung !== null && ausweis.stromverbrauch_enthaelt_kuehlung === false) {
|
||||||
|
|
||||||
|
kuehlungsZuschlag = 6 * nutzflaeche * 3;
|
||||||
|
}
|
||||||
|
if (ausweis.kuehlung_enthalten && ausweis.kuehlung_enthalten !== null)
|
||||||
|
{
|
||||||
|
|
||||||
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);
|
||||||
}
|
}
|
||||||
@@ -145,7 +151,7 @@ export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis:
|
|||||||
let energieVerbrauchStrom = (ausweis.strom_1 || 0) + (ausweis.strom_2 || 0) + (ausweis.strom_3 || 0);
|
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 + (kuehlungsZuschlag || 0)) / (3 * nutzflaeche);
|
||||||
let primaerEnergieVerbrauchStrom = endEnergieVerbrauchStrom * 1.8;
|
let primaerEnergieVerbrauchStrom = endEnergieVerbrauchStrom * 1.8;
|
||||||
|
|
||||||
let co2EmissionenStrom = endEnergieVerbrauchStrom * 0.560;
|
let co2EmissionenStrom = endEnergieVerbrauchStrom * 0.560;
|
||||||
@@ -168,7 +174,7 @@ export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis:
|
|||||||
let co2EmissionenKuehlungsZuschlag_1 = endEnergieVerbrauchKuehlungsZuschlag_1 * brennstoff_1.coe;
|
let co2EmissionenKuehlungsZuschlag_1 = endEnergieVerbrauchKuehlungsZuschlag_1 * brennstoff_1.coe;
|
||||||
let co2EmissionenKuehlungsZuschlag_2 = endEnergieVerbrauchKuehlungsZuschlag_2 * brennstoff_2.coe;
|
let co2EmissionenKuehlungsZuschlag_2 = endEnergieVerbrauchKuehlungsZuschlag_2 * brennstoff_2.coe;
|
||||||
|
|
||||||
let endEnergieVerbrauchGesamt = endEnergieVerbrauch_1 + endEnergieVerbrauch_2 + endEnergieVerbrauchLeerstandsZuschlag;
|
let endEnergieVerbrauchGesamt = endEnergieVerbrauch_1 + endEnergieVerbrauch_2 + endEnergieVerbrauchLeerstandsZuschlag + (kuehlungsZuschlag / (3 * nutzflaeche));
|
||||||
let primaerEnergieVerbrauchGesamt = primaerEnergieVerbrauch_1 + primaerEnergieVerbrauch_2 + primaerEnergieVerbrauchLeerstandsZuschlag + primaerEnergieVerbrauchStrom;
|
let primaerEnergieVerbrauchGesamt = primaerEnergieVerbrauch_1 + primaerEnergieVerbrauch_2 + primaerEnergieVerbrauchLeerstandsZuschlag + primaerEnergieVerbrauchStrom;
|
||||||
let co2EmissionenGesamt = co2Emissionen_1 + co2Emissionen_2 + co2EmissionenLeerstandsZuschlag + co2EmissionenStrom;
|
let co2EmissionenGesamt = co2Emissionen_1 + co2Emissionen_2 + co2EmissionenLeerstandsZuschlag + co2EmissionenStrom;
|
||||||
|
|
||||||
@@ -180,6 +186,7 @@ export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis:
|
|||||||
brennstoff_2,
|
brennstoff_2,
|
||||||
kuehlungsZuschlag_1 : Math.round(kuehlungsZuschlag_1),
|
kuehlungsZuschlag_1 : Math.round(kuehlungsZuschlag_1),
|
||||||
kuehlungsZuschlag_2: Math.round(kuehlungsZuschlag_2),
|
kuehlungsZuschlag_2: Math.round(kuehlungsZuschlag_2),
|
||||||
|
kuehlungsZuschlag: Math.round(kuehlungsZuschlag),
|
||||||
durchschnittsKlimafaktor : Math.round(durchschnittsKlimafaktor * 100) / 100,
|
durchschnittsKlimafaktor : Math.round(durchschnittsKlimafaktor * 100) / 100,
|
||||||
Klimafaktor_1 : klimafaktoren[0],
|
Klimafaktor_1 : klimafaktoren[0],
|
||||||
Klimafaktor_2 : klimafaktoren[1],
|
Klimafaktor_2 : klimafaktoren[1],
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ export async function endEnergieVerbrauchVerbrauchsausweis_2016(
|
|||||||
energieVerbrauchHeizung_2 * durchschnittsKlimafaktor;
|
energieVerbrauchHeizung_2 * durchschnittsKlimafaktor;
|
||||||
|
|
||||||
let kuehlungsZuschlag = 0;
|
let kuehlungsZuschlag = 0;
|
||||||
if (aufnahme.kuehlung) {
|
if (aufnahme.kuehlung === "1") {
|
||||||
kuehlungsZuschlag = 6 * 3 * energetischeNutzflaeche;
|
kuehlungsZuschlag = 6 * 3 * energetischeNutzflaeche;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,13 +3,13 @@ import * as fs from "fs"
|
|||||||
import { PDFDocument, StandardFonts } from "pdf-lib";
|
import { PDFDocument, StandardFonts } from "pdf-lib";
|
||||||
import { xml2pdf } from "./elements/xml2pdf.js";
|
import { xml2pdf } from "./elements/xml2pdf.js";
|
||||||
import moment from "moment";
|
import moment from "moment";
|
||||||
import { Enums, Heizungsstatus } from "#lib/server/prisma.js";
|
import { Enums, Heizungsstatus, Rechnung } from "#lib/server/prisma.js";
|
||||||
import { copyPage } from "./utils/copyPage.js";
|
import { copyPage } from "./utils/copyPage.js";
|
||||||
import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Server } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Server.js";
|
import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Server } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Server.js";
|
||||||
|
|
||||||
/* -------------------------------- Pdf Tools ------------------------------- */
|
/* -------------------------------- Pdf Tools ------------------------------- */
|
||||||
|
|
||||||
export async function pdfDatenblattVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient, objekt: ObjektClient, benutzer: BenutzerClient, bilder: BildClient[]) {
|
export async function pdfDatenblattVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient, objekt: ObjektClient, rechnung: Rechnung | null, bilder: BildClient[]) {
|
||||||
const VerbrauchsausweisWohnenGEG2024PDF = fs.readFileSync(new URL("../../../public/pdf/templates/Leerseite_Datenblatt.pdf", import.meta.url), "base64");
|
const VerbrauchsausweisWohnenGEG2024PDF = fs.readFileSync(new URL("../../../public/pdf/templates/Leerseite_Datenblatt.pdf", import.meta.url), "base64");
|
||||||
const pdf = await PDFDocument.load(VerbrauchsausweisWohnenGEG2024PDF)
|
const pdf = await PDFDocument.load(VerbrauchsausweisWohnenGEG2024PDF)
|
||||||
const page3 = copyPage(pdf.getPages()[0]);
|
const page3 = copyPage(pdf.getPages()[0]);
|
||||||
@@ -32,14 +32,6 @@ export async function pdfDatenblattVerbrauchsausweisGewerbe(ausweis: Verbrauchsa
|
|||||||
const marginX = 60;
|
const marginX = 60;
|
||||||
const marginY = 150;
|
const marginY = 150;
|
||||||
|
|
||||||
benutzer = benutzer || {
|
|
||||||
vorname: "Max",
|
|
||||||
name: "Mustermann",
|
|
||||||
adresse: "Musterstraße 123",
|
|
||||||
plz: "12345",
|
|
||||||
ort: "Beispielhausen"
|
|
||||||
};
|
|
||||||
|
|
||||||
const translateHeizungsstatus: Record<Heizungsstatus, string> = {
|
const translateHeizungsstatus: Record<Heizungsstatus, string> = {
|
||||||
BEHEIZT: "beheizt",
|
BEHEIZT: "beheizt",
|
||||||
NICHT_VORHANDEN: "nicht vorhanden",
|
NICHT_VORHANDEN: "nicht vorhanden",
|
||||||
@@ -70,9 +62,10 @@ export async function pdfDatenblattVerbrauchsausweisGewerbe(ausweis: Verbrauchsa
|
|||||||
}
|
}
|
||||||
|
|
||||||
const layout = xml2pdf(`<layout height="${pages[0].getHeight()}" width="${pages[0].getWidth()}" marginTop="150" marginLeft="${marginX}" marginRight="${marginX}">
|
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">${rechnung?.versand_empfaenger || ""}</text>
|
||||||
<text size="12" lineHeight="14">${benutzer.adresse}</text>
|
<text size="12" lineHeight="14">${rechnung?.versand_zusatzzeile || ""}</text>
|
||||||
<text size="12" lineHeight="14">${benutzer.plz} ${benutzer.ort}</text>
|
<text size="12" lineHeight="14">${rechnung?.versand_strasse || ""}</text>
|
||||||
|
<text size="12" lineHeight="14">${rechnung?.versand_plz || ""} ${rechnung?.versand_ort || ""}</text>
|
||||||
<flex direction="row" justify="space-between" marginTop="55" width="${innerWidth}">
|
<flex direction="row" justify="space-between" marginTop="55" width="${innerWidth}">
|
||||||
<text size="12" font="bold">Datenblatt Energieausweis</text>
|
<text size="12" font="bold">Datenblatt Energieausweis</text>
|
||||||
<text size="12">Ausweis ID: ${ausweis.id}</text>
|
<text size="12">Ausweis ID: ${ausweis.id}</text>
|
||||||
|
|||||||
@@ -1,16 +1,15 @@
|
|||||||
import { AufnahmeClient, BenutzerClient, BildClient, ObjektClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
|
import { AufnahmeClient, BildClient, ObjektClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
|
||||||
import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js";
|
|
||||||
import * as fs from "fs"
|
import * as fs from "fs"
|
||||||
import { PDFDocument, StandardFonts } from "pdf-lib";
|
import { PDFDocument, StandardFonts } from "pdf-lib";
|
||||||
import { xml2pdf } from "./elements/xml2pdf.js";
|
import { xml2pdf } from "./elements/xml2pdf.js";
|
||||||
import moment from "moment";
|
import moment from "moment";
|
||||||
import { Enums, Heizungsstatus } from "#lib/server/prisma.js";
|
import { Enums, Heizungsstatus, Rechnung } from "#lib/server/prisma.js";
|
||||||
import { copyPage } from "./utils/copyPage.js";
|
import { copyPage } from "./utils/copyPage.js";
|
||||||
import { endEnergieVerbrauchVerbrauchsausweis_2016_Server } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Server.js";
|
import { endEnergieVerbrauchVerbrauchsausweis_2016_Server } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Server.js";
|
||||||
|
|
||||||
/* -------------------------------- Pdf Tools ------------------------------- */
|
/* -------------------------------- Pdf Tools ------------------------------- */
|
||||||
|
|
||||||
export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient, benutzer: BenutzerClient, bilder: BildClient[]) {
|
export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient, rechnung: Rechnung | null, bilder: BildClient[]) {
|
||||||
const VerbrauchsausweisWohnenGEG2024PDF = fs.readFileSync(new URL("../../../public/pdf/templates/Leerseite_Datenblatt.pdf", import.meta.url), "base64");
|
const VerbrauchsausweisWohnenGEG2024PDF = fs.readFileSync(new URL("../../../public/pdf/templates/Leerseite_Datenblatt.pdf", import.meta.url), "base64");
|
||||||
const pdf = await PDFDocument.load(VerbrauchsausweisWohnenGEG2024PDF)
|
const pdf = await PDFDocument.load(VerbrauchsausweisWohnenGEG2024PDF)
|
||||||
const page3 = copyPage(pdf.getPages()[0]);
|
const page3 = copyPage(pdf.getPages()[0]);
|
||||||
@@ -34,14 +33,6 @@ export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: Verbrauchsau
|
|||||||
const marginX = 60;
|
const marginX = 60;
|
||||||
const marginY = 150;
|
const marginY = 150;
|
||||||
|
|
||||||
benutzer = benutzer || {
|
|
||||||
vorname: "Max",
|
|
||||||
name: "Mustermann",
|
|
||||||
adresse: "Musterstraße 123",
|
|
||||||
plz: "12345",
|
|
||||||
ort: "Beispielhausen"
|
|
||||||
};
|
|
||||||
|
|
||||||
const translateHeizungsstatus: Record<Heizungsstatus, string> = {
|
const translateHeizungsstatus: Record<Heizungsstatus, string> = {
|
||||||
BEHEIZT: "beheizt",
|
BEHEIZT: "beheizt",
|
||||||
NICHT_VORHANDEN: "nicht vorhanden",
|
NICHT_VORHANDEN: "nicht vorhanden",
|
||||||
@@ -53,9 +44,10 @@ export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: Verbrauchsau
|
|||||||
const id = ausweis.id;
|
const id = ausweis.id;
|
||||||
|
|
||||||
const layout = xml2pdf(`<layout height="${pages[0].getHeight()}" width="${pages[0].getWidth()}" marginTop="150" marginLeft="${marginX}" marginRight="${marginX}">
|
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">${rechnung?.versand_empfaenger || ""}</text>
|
||||||
<text size="12" lineHeight="14">${benutzer.adresse}</text>
|
<text size="12" lineHeight="14">${rechnung?.versand_zusatzzeile || ""}</text>
|
||||||
<text size="12" lineHeight="14">${benutzer.plz} ${benutzer.ort}</text>
|
<text size="12" lineHeight="14">${rechnung?.versand_strasse || ""}</text>
|
||||||
|
<text size="12" lineHeight="14">${rechnung?.versand_plz || ""} ${rechnung?.versand_ort || ""}</text>
|
||||||
<flex direction="row" justify="space-between" marginTop="55" width="${innerWidth}">
|
<flex direction="row" justify="space-between" marginTop="55" width="${innerWidth}">
|
||||||
<text size="12" font="bold">Datenblatt Energieausweis</text>
|
<text size="12" font="bold">Datenblatt Energieausweis</text>
|
||||||
<text size="12">Ausweis ID: ${id}</text>
|
<text size="12">Ausweis ID: ${id}</text>
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import { Enums } from "#lib/server/prisma.js";
|
|||||||
import * as fs from "fs"
|
import * as fs from "fs"
|
||||||
import moment from "moment";
|
import moment from "moment";
|
||||||
import { PDFDocument, PDFFont, PDFImage, PDFPage, StandardFonts } from "pdf-lib";
|
import { PDFDocument, PDFFont, PDFImage, PDFPage, StandardFonts } from "pdf-lib";
|
||||||
import { addCheckMark } from "./utils/checkbox.js";
|
|
||||||
import { addText } from "./utils/text.js";
|
import { addText } from "./utils/text.js";
|
||||||
import { addAnsichtsausweisLabel, addDatumGEG, addRegistriernummer } from "./utils/helpers.js";
|
import { addAnsichtsausweisLabel, addDatumGEG, addRegistriernummer } from "./utils/helpers.js";
|
||||||
import { getS3File } from "#lib/s3.js";
|
import { getS3File } from "#lib/s3.js";
|
||||||
@@ -103,7 +102,7 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
|
|||||||
})
|
})
|
||||||
|
|
||||||
if (ausweis.warmwasser_enthalten) {
|
if (ausweis.warmwasser_enthalten) {
|
||||||
pages[0].drawText(`${ausweis.brennstoff_1}, ${ausweis.brennstoff_2 || ""}`, {
|
pages[3].drawText(`${ausweis.brennstoff_1}, ${ausweis.brennstoff_2 || ""}`, {
|
||||||
x: 211,
|
x: 211,
|
||||||
y: height - 299,
|
y: height - 299,
|
||||||
size: 10
|
size: 10
|
||||||
@@ -112,30 +111,82 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
|
|||||||
|
|
||||||
|
|
||||||
if (aufnahme.lueftung === Enums.Lueftungskonzept.Fensterlueftung) {
|
if (aufnahme.lueftung === Enums.Lueftungskonzept.Fensterlueftung) {
|
||||||
addCheckMark(pages[0], 213, height - 334)
|
pages[0].drawText("x", {
|
||||||
|
x: 214,
|
||||||
|
y: height - 342,
|
||||||
|
size: 10,
|
||||||
|
font: bold
|
||||||
|
})
|
||||||
} else if (aufnahme.lueftung === Enums.Lueftungskonzept.Schachtlueftung) {
|
} else if (aufnahme.lueftung === Enums.Lueftungskonzept.Schachtlueftung) {
|
||||||
addCheckMark(pages[0], 213, height - 345)
|
pages[0].drawText("x", {
|
||||||
|
x: 214,
|
||||||
|
y: height - 353,
|
||||||
|
size: 10,
|
||||||
|
font: bold
|
||||||
|
})
|
||||||
} else if (aufnahme.lueftung === Enums.Lueftungskonzept.LueftungsanlageMitWaermerueckgewinnung) {
|
} else if (aufnahme.lueftung === Enums.Lueftungskonzept.LueftungsanlageMitWaermerueckgewinnung) {
|
||||||
addCheckMark(pages[0], 355, height - 334)
|
pages[0].drawText("x", {
|
||||||
|
x: 356,
|
||||||
|
y: height - 342,
|
||||||
|
size: 10,
|
||||||
|
font: bold
|
||||||
|
})
|
||||||
} else if (aufnahme.lueftung === Enums.Lueftungskonzept.LueftungsanlageOhneWaermerueckgewinnung) {
|
} else if (aufnahme.lueftung === Enums.Lueftungskonzept.LueftungsanlageOhneWaermerueckgewinnung) {
|
||||||
addCheckMark(pages[0], 355, height - 345)
|
pages[0].drawText("x", {
|
||||||
|
x: 356,
|
||||||
|
y: height - 353,
|
||||||
|
size: 10,
|
||||||
|
font: bold
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// Kühlung
|
// Kühlung
|
||||||
if (aufnahme.kuehlung) {
|
if (aufnahme.kuehlung === "1" && aufnahme.kuehlung !== null) {
|
||||||
addCheckMark(pages[0], 213, height - 362.5)
|
pages[0].drawText("x", {
|
||||||
} else {
|
x: 356,
|
||||||
addCheckMark(pages[0], 355, height - 373.5)
|
y: height - 370.5,
|
||||||
|
size: 10,
|
||||||
|
font: bold
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ausweis.kuehlung_enthalten === true && ausweis.kuehlung_enthalten !== null) {
|
||||||
|
pages[0].drawText("x", {
|
||||||
|
x: 356,
|
||||||
|
y: height - 381.5,
|
||||||
|
size: 10,
|
||||||
|
font: bold
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ausweis.ausstellgrund === Enums.Ausstellgrund.Neubau) {
|
if (ausweis.ausstellgrund === Enums.Ausstellgrund.Neubau) {
|
||||||
addCheckMark(pages[0], 213, height - 406)
|
pages[0].drawText("x", {
|
||||||
} else if (ausweis.ausstellgrund === Enums.Ausstellgrund.Vermietung) {
|
x: 214,
|
||||||
addCheckMark(pages[0], 213, height - 417)
|
y: height - 414,
|
||||||
|
size: 10,
|
||||||
|
font: bold
|
||||||
|
})
|
||||||
|
} else if (ausweis.ausstellgrund === Enums.Ausstellgrund.Vermietung || ausweis.ausstellgrund === Enums.Ausstellgrund.Verkauf) {
|
||||||
|
pages[0].drawText("x", {
|
||||||
|
x: 214,
|
||||||
|
y: height - 425,
|
||||||
|
size: 10,
|
||||||
|
font: bold
|
||||||
|
})
|
||||||
} else if (ausweis.ausstellgrund === Enums.Ausstellgrund.Modernisierung) {
|
} else if (ausweis.ausstellgrund === Enums.Ausstellgrund.Modernisierung) {
|
||||||
addCheckMark(pages[0], 344.5, height - 406)
|
pages[0].drawText("x", {
|
||||||
|
x: 345.5,
|
||||||
|
y: height - 414,
|
||||||
|
size: 10,
|
||||||
|
font: bold
|
||||||
|
})
|
||||||
} else if (ausweis.ausstellgrund === Enums.Ausstellgrund.Sonstiges) {
|
} else if (ausweis.ausstellgrund === Enums.Ausstellgrund.Sonstiges) {
|
||||||
addCheckMark(pages[0], 463, height - 417)
|
pages[0].drawText("x", {
|
||||||
|
x: 464,
|
||||||
|
y: height - 425,
|
||||||
|
size: 10,
|
||||||
|
font: bold
|
||||||
|
})
|
||||||
}
|
}
|
||||||
// Aushangpflicht
|
// Aushangpflicht
|
||||||
// addCheckMark(pages[0], 463, height - 406)
|
// addCheckMark(pages[0], 463, height - 406)
|
||||||
@@ -161,11 +212,21 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Checkmark Angabe energetische Qualität des Gebäudes.
|
// Checkmark Verbrauchsausweis.
|
||||||
addCheckMark(pages[0], 40, height - 550)
|
pages[0].drawText("x", {
|
||||||
|
x: 41,
|
||||||
|
y: height - 558,
|
||||||
|
size: 10,
|
||||||
|
font: bold
|
||||||
|
})
|
||||||
|
|
||||||
// Datenerhebung durch Eigentümer
|
// Datenerhebung durch Eigentümer
|
||||||
addCheckMark(pages[0], 295, height - 580)
|
pages[0].drawText("x", {
|
||||||
|
x: 296.5,
|
||||||
|
y: height - 587.5,
|
||||||
|
size: 10,
|
||||||
|
font: bold
|
||||||
|
})
|
||||||
|
|
||||||
// Ausstellungsdatum
|
// Ausstellungsdatum
|
||||||
pages[0].drawText(moment().format("DD.MM.YYYY"), {
|
pages[0].drawText(moment().format("DD.MM.YYYY"), {
|
||||||
@@ -184,9 +245,9 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
|
|||||||
})
|
})
|
||||||
|
|
||||||
// Stempel und Unterschrift
|
// Stempel und Unterschrift
|
||||||
if (ausweis.ausgestellt) {
|
if (ausweis.ausgestellt || !vorschau) {
|
||||||
const stempel = await pdf.embedPng(fs.readFileSync(new URL("../../../public/pdf/images/stempel-unterschrift.png", import.meta.url), "base64"));
|
const stempel = await pdf.embedPng(fs.readFileSync(new URL("../../../public/pdf/images/stempel-unterschrift.png", import.meta.url), "base64"));
|
||||||
const stempelHeight = 60
|
const stempelHeight = 65
|
||||||
|
|
||||||
pages[0].drawImage(stempel, {
|
pages[0].drawImage(stempel, {
|
||||||
x: 450,
|
x: 450,
|
||||||
@@ -200,10 +261,10 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
|
|||||||
// Aussteller
|
// Aussteller
|
||||||
const aussteller = await pdf.embedPng(fs.readFileSync(new URL("../../../public/pdf/images/aussteller.png", import.meta.url), "base64"));
|
const aussteller = await pdf.embedPng(fs.readFileSync(new URL("../../../public/pdf/images/aussteller.png", import.meta.url), "base64"));
|
||||||
pages[0].drawImage(aussteller, {
|
pages[0].drawImage(aussteller, {
|
||||||
x: 40,
|
x: 260,
|
||||||
y: height - 750,
|
y: height - 755,
|
||||||
width: 100,
|
width: 130,
|
||||||
height: 50
|
height: 65
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
@@ -216,10 +277,10 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
|
|||||||
const pfeilNachOben = await pdf.embedPng(fs.readFileSync(new URL("../../../public/images/pfeil-nach-oben.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((berechnungen?.vergleichsWertWaerme * 2), Math.max(0, berechnungen?.endEnergieVerbrauchGesamt || 0)) / (berechnungen?.vergleichsWertWaerme * 2)
|
||||||
const stromVerbrauchTranslationPercentage = Math.min(1000, Math.max(0, berechnungen?.endEnergieVerbrauchStrom || 0)) / 1000
|
const stromVerbrauchTranslationPercentage = Math.min((berechnungen?.vergleichsWertStrom * 2), Math.max(0, berechnungen?.endEnergieVerbrauchStrom || 0)) / (berechnungen?.vergleichsWertStrom * 2)
|
||||||
const vergleichsWertWaermeTranslationPercentage = Math.min(1000, Math.max(0, berechnungen?.vergleichsWertWaerme || 0)) / 1000
|
const vergleichsWertWaermeTranslationPercentage = Math.min((berechnungen?.vergleichsWertWaerme * 2), Math.max(0, berechnungen?.vergleichsWertWaerme || 0)) / (berechnungen?.vergleichsWertWaerme * 2)
|
||||||
const vergleichsWertStromTranslationPercentage = Math.min(1000, Math.max(0, berechnungen?.vergleichsWertStrom || 0)) / 1000
|
const vergleichsWertStromTranslationPercentage = Math.min((berechnungen?.vergleichsWertStrom * 2), Math.max(0, berechnungen?.vergleichsWertStrom || 0)) / (berechnungen?.vergleichsWertStrom * 2)
|
||||||
|
|
||||||
const minTranslation = 78
|
const minTranslation = 78
|
||||||
const maxTranslation = 512
|
const maxTranslation = 512
|
||||||
@@ -245,14 +306,61 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
|
|||||||
height: 30
|
height: 30
|
||||||
})
|
})
|
||||||
|
|
||||||
const endEnergieVerbrauchGesamtText = `${berechnungen?.endEnergieVerbrauchGesamt.toString()}kWh/(m²a)`;
|
page.drawText("0", {
|
||||||
const stromVerbrauchGesamtText = `${berechnungen?.endEnergieVerbrauchStrom.toString()}kWh/(m²a)`;
|
x: 85,
|
||||||
const vergleichswertWaermeText = `${berechnungen?.vergleichsWertWaerme.toString()}kWh/(m²a)`
|
y: height - 241,
|
||||||
const vergleichswertStromText = `${berechnungen?.vergleichsWertStrom.toString()}kWh/(m²a)`
|
size: 13,
|
||||||
|
font: bold
|
||||||
|
})
|
||||||
|
|
||||||
|
const vergleichswertWaermeText2 = `${Math.round(berechnungen?.vergleichsWertWaerme).toString()}`
|
||||||
|
|
||||||
|
page.drawText(vergleichswertWaermeText2, {
|
||||||
|
x: 295,
|
||||||
|
y: height - 241,
|
||||||
|
size: 13,
|
||||||
|
font: bold
|
||||||
|
})
|
||||||
|
|
||||||
|
const maxVergleichswertWaermeText = `> ${Math.round(berechnungen?.vergleichsWertWaerme * 2).toString()}`;
|
||||||
|
|
||||||
|
page.drawText(maxVergleichswertWaermeText, {
|
||||||
|
x: vergleichsWertWaermeTranslationX * 2 - 78,
|
||||||
|
y: height - 241,
|
||||||
|
size: 13,
|
||||||
|
font: bold
|
||||||
|
})
|
||||||
|
|
||||||
|
page.drawText("0", {
|
||||||
|
x: 85,
|
||||||
|
y: height - 385,
|
||||||
|
size: 13,
|
||||||
|
font: bold
|
||||||
|
})
|
||||||
|
|
||||||
|
const vergleichswertStromText2 = `${Math.round(berechnungen?.vergleichsWertStrom).toString()}`
|
||||||
|
|
||||||
|
page.drawText(vergleichswertStromText2, {
|
||||||
|
x: 295,
|
||||||
|
y: height - 385,
|
||||||
|
size: 13,
|
||||||
|
font: bold
|
||||||
|
})
|
||||||
|
|
||||||
|
const maxVergleichswertStromText = `> ${Math.round(berechnungen?.vergleichsWertStrom * 2).toString()}`;
|
||||||
|
|
||||||
|
page.drawText(maxVergleichswertStromText, {
|
||||||
|
x: vergleichsWertStromTranslationX * 2 - 78,
|
||||||
|
y: height - 385,
|
||||||
|
size: 13,
|
||||||
|
font: bold
|
||||||
|
})
|
||||||
|
|
||||||
|
const endEnergieVerbrauchGesamtText = `${Math.round(berechnungen?.endEnergieVerbrauchGesamt ?? 0).toString()}kWh/(m²a)`;
|
||||||
|
|
||||||
if (endenergieverbrauchTranslationPercentage > 0.5) {
|
if (endenergieverbrauchTranslationPercentage > 0.5) {
|
||||||
page.drawText("Endenergieverbrauch Wärme", {
|
page.drawText("Endenergieverbrauch Wärme", {
|
||||||
x: endenergieverbrauchTranslationX - margin - font.widthOfTextAtSize("Endenergieverbrauch", 10),
|
x: endenergieverbrauchTranslationX - margin - font.widthOfTextAtSize("Endenergieverbrauch Wärme", 10),
|
||||||
y: height - 191,
|
y: height - 191,
|
||||||
size: 10
|
size: 10
|
||||||
})
|
})
|
||||||
@@ -277,9 +385,11 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const vergleichswertWaermeText = `${Math.round(berechnungen?.vergleichsWertWaerme).toString()}kWh/(m²a)`
|
||||||
|
|
||||||
if (vergleichsWertWaermeTranslationPercentage > 0.5) {
|
if (vergleichsWertWaermeTranslationPercentage > 0.5) {
|
||||||
page.drawText("Vergleichswert Wärme", {
|
page.drawText("Vergleichswert Wärme", {
|
||||||
x: vergleichsWertWaermeTranslationX - margin - font.widthOfTextAtSize("Vergleichswert", 10),
|
x: vergleichsWertWaermeTranslationX - margin - font.widthOfTextAtSize("Vergleichswert Wärme", 10),
|
||||||
y: height - 275,
|
y: height - 275,
|
||||||
size: 10
|
size: 10
|
||||||
})
|
})
|
||||||
@@ -318,9 +428,11 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
|
|||||||
height: 30
|
height: 30
|
||||||
})
|
})
|
||||||
|
|
||||||
if (endenergieverbrauchTranslationPercentage > 0.5) {
|
const stromVerbrauchGesamtText = `${Math.round(berechnungen?.endEnergieVerbrauchStrom ?? 0).toString()}kWh/(m²a)`;
|
||||||
|
|
||||||
|
if (stromVerbrauchTranslationPercentage > 0.5) {
|
||||||
page.drawText("Endenergieverbrauch Strom", {
|
page.drawText("Endenergieverbrauch Strom", {
|
||||||
x: stromVerbrauchTranslationX - margin - font.widthOfTextAtSize("Primärenergieverbrauch", 10),
|
x: stromVerbrauchTranslationX - margin - font.widthOfTextAtSize("Endenergieverbrauch Strom", 10),
|
||||||
y: height - 335,
|
y: height - 335,
|
||||||
size: 10
|
size: 10
|
||||||
})
|
})
|
||||||
@@ -345,9 +457,12 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const vergleichswertStromText = `${Math.round(berechnungen?.vergleichsWertStrom).toString()}kWh/(m²a)`
|
||||||
|
|
||||||
|
|
||||||
if (vergleichsWertWaermeTranslationPercentage > 0.5) {
|
if (vergleichsWertWaermeTranslationPercentage > 0.5) {
|
||||||
page.drawText("Vergleichswert Strom", {
|
page.drawText("Vergleichswert Strom", {
|
||||||
x: vergleichsWertStromTranslationX - margin - font.widthOfTextAtSize("Vergleichswert", 10),
|
x: vergleichsWertStromTranslationX - margin - font.widthOfTextAtSize("Vergleichswert Strom", 10),
|
||||||
y: height - 420,
|
y: height - 420,
|
||||||
size: 10
|
size: 10
|
||||||
})
|
})
|
||||||
@@ -376,35 +491,75 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
|
|||||||
addEnergieverbrauchSkalaPfeile(pages[2])
|
addEnergieverbrauchSkalaPfeile(pages[2])
|
||||||
|
|
||||||
if (ausweis.warmwasser_enthalten) {
|
if (ausweis.warmwasser_enthalten) {
|
||||||
addCheckMark(pages[2], 41, height - 293)
|
pages[2].drawText("x", {
|
||||||
|
x: 42,
|
||||||
|
y: height - 301,
|
||||||
|
size: 10,
|
||||||
|
font: bold
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ausweis.kuehlung_enthalten) {
|
if (ausweis.kuehlung_enthalten) {
|
||||||
addCheckMark(pages[2], 41, height - 305)
|
pages[2].drawText("x", {
|
||||||
|
x: 42,
|
||||||
|
y: height - 313,
|
||||||
|
size: 10,
|
||||||
|
font: bold
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ausweis.stromverbrauch_enthaelt_heizung) {
|
if (ausweis.stromverbrauch_enthaelt_heizung) {
|
||||||
addCheckMark(pages[2], 41, height - 456)
|
pages[2].drawText("x", {
|
||||||
|
x: 42,
|
||||||
|
y: height - 464,
|
||||||
|
size: 10,
|
||||||
|
font: bold
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ausweis.stromverbrauch_enthaelt_warmwasser) {
|
if (ausweis.stromverbrauch_enthaelt_warmwasser) {
|
||||||
addCheckMark(pages[2], 131, height - 456)
|
pages[2].drawText("x", {
|
||||||
|
x: 132,
|
||||||
|
y: height - 464,
|
||||||
|
size: 10,
|
||||||
|
font: bold
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ausweis.stromverbrauch_enthaelt_lueftung) {
|
if (ausweis.stromverbrauch_enthaelt_lueftung) {
|
||||||
addCheckMark(pages[2], 218, height - 456)
|
pages[2].drawText("x", {
|
||||||
|
x: 219,
|
||||||
|
y: height - 464,
|
||||||
|
size: 10,
|
||||||
|
font: bold
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ausweis.stromverbrauch_enthaelt_beleuchtung) {
|
if (ausweis.stromverbrauch_enthaelt_beleuchtung) {
|
||||||
addCheckMark(pages[2], 281, height - 456)
|
pages[2].drawText("x", {
|
||||||
|
x: 282,
|
||||||
|
y: height - 464,
|
||||||
|
size: 10,
|
||||||
|
font: bold
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ausweis.stromverbrauch_enthaelt_kuehlung) {
|
if (ausweis.stromverbrauch_enthaelt_kuehlung) {
|
||||||
addCheckMark(pages[2], 422, height - 456)
|
pages[2].drawText("x", {
|
||||||
|
x: 423,
|
||||||
|
y: height - 464,
|
||||||
|
size: 10,
|
||||||
|
font: bold
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ausweis.stromverbrauch_enthaelt_sonstige) {
|
if (ausweis.stromverbrauch_enthaelt_sonstige) {
|
||||||
addCheckMark(pages[2], 492, height - 456)
|
pages[2].drawText("x", {
|
||||||
|
x: 493,
|
||||||
|
y: height - 464,
|
||||||
|
size: 10,
|
||||||
|
font: bold
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
addText(pages[2], berechnungen?.primaerEnergieVerbrauchGesamt.toString() || "", 475, height - 637, 10, font)
|
addText(pages[2], berechnungen?.primaerEnergieVerbrauchGesamt.toString() || "", 475, height - 637, 10, font)
|
||||||
@@ -498,22 +653,7 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
|
|||||||
|
|
||||||
const addVerbrauch = addVerbrauchGenerator();
|
const addVerbrauch = addVerbrauchGenerator();
|
||||||
|
|
||||||
if (!ausweis.warmwasser_enthalten) {
|
// Primäre Heizquelle
|
||||||
// Mit Warmwasserzuschlag
|
|
||||||
addVerbrauch(
|
|
||||||
moment(ausweis.startdatum).format("MM.YYYY"),
|
|
||||||
moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
|
|
||||||
ausweis.brennstoff_1 || "",
|
|
||||||
berechnungen?.brennstoff_1.primaerenergiefaktor.toString(),
|
|
||||||
Math.round(berechnungen?.energieVerbrauchGesamt_1 || 0).toString(),
|
|
||||||
"0",
|
|
||||||
berechnungen?.endEnergieVerbrauchKuehlungsZuschlag_1,
|
|
||||||
Math.round(berechnungen?.energieVerbrauchHeizung_1 || 0).toString(),
|
|
||||||
berechnungen?.durchschnittsKlimafaktor.toString(),
|
|
||||||
berechnungen?.energieVerbrauchStrom
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
// Ohne Warmwasserzuschlag
|
|
||||||
addVerbrauch(
|
addVerbrauch(
|
||||||
moment(ausweis.startdatum).format("MM.YYYY"),
|
moment(ausweis.startdatum).format("MM.YYYY"),
|
||||||
moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
|
moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
|
||||||
@@ -521,12 +661,12 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
|
|||||||
berechnungen?.brennstoff_1.primaerenergiefaktor.toString(),
|
berechnungen?.brennstoff_1.primaerenergiefaktor.toString(),
|
||||||
Math.round(berechnungen?.energieVerbrauchGesamt_1 || 0).toString(),
|
Math.round(berechnungen?.energieVerbrauchGesamt_1 || 0).toString(),
|
||||||
Math.round(berechnungen?.energieVerbrauchWarmwasser_1 || 0).toString(),
|
Math.round(berechnungen?.energieVerbrauchWarmwasser_1 || 0).toString(),
|
||||||
berechnungen?.endEnergieVerbrauchKuehlungsZuschlag_1,
|
berechnungen?.kuehlungsZuschlag_1,
|
||||||
Math.round(berechnungen?.energieVerbrauchHeizung_1 || 0).toString(),
|
Math.round(berechnungen?.energieVerbrauchHeizung_1 || 0).toString(),
|
||||||
berechnungen?.durchschnittsKlimafaktor.toString(),
|
berechnungen?.durchschnittsKlimafaktor.toString(),
|
||||||
berechnungen?.energieVerbrauchStrom
|
berechnungen?.energieVerbrauchStrom
|
||||||
);
|
);
|
||||||
}
|
|
||||||
|
|
||||||
if (ausweis.zusaetzliche_heizquelle) {
|
if (ausweis.zusaetzliche_heizquelle) {
|
||||||
addVerbrauch(
|
addVerbrauch(
|
||||||
@@ -536,31 +676,12 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
|
|||||||
berechnungen?.brennstoff_2.primaerenergiefaktor.toString(),
|
berechnungen?.brennstoff_2.primaerenergiefaktor.toString(),
|
||||||
Math.round(berechnungen?.energieVerbrauchGesamt_2 || 0).toString(),
|
Math.round(berechnungen?.energieVerbrauchGesamt_2 || 0).toString(),
|
||||||
Math.round(berechnungen?.energieVerbrauchWarmwasser_2 || 0).toString(),
|
Math.round(berechnungen?.energieVerbrauchWarmwasser_2 || 0).toString(),
|
||||||
berechnungen?.endEnergieVerbrauchKuehlungsZuschlag_2,
|
berechnungen?.kuehlungsZuschlag_2,
|
||||||
Math.round(berechnungen?.energieVerbrauchHeizung_2 || 0).toString(),
|
Math.round(berechnungen?.energieVerbrauchHeizung_2 || 0).toString(),
|
||||||
berechnungen?.durchschnittsKlimafaktor.toString(),
|
berechnungen?.durchschnittsKlimafaktor.toString(),
|
||||||
0
|
0
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// TODO
|
|
||||||
if (!ausweis.warmwasser_enthalten) {
|
|
||||||
/**
|
|
||||||
* Dezentrale Warmwasserversorgung - Pauschale Erhöhung um 20kWh/m²
|
|
||||||
* @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"),
|
|
||||||
"Warmwasserzuschlag",
|
|
||||||
berechnungen?.brennstoff_1.primaerenergiefaktor.toString(),
|
|
||||||
Math.round(berechnungen?.energieVerbrauchWarmwasser_1 || 0).toString(),
|
|
||||||
Math.round(berechnungen?.energieVerbrauchWarmwasser_1 || 0).toString(),
|
|
||||||
0,
|
|
||||||
"0"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (aufnahme.leerstand && aufnahme.leerstand > 0) {
|
if (aufnahme.leerstand && aufnahme.leerstand > 0) {
|
||||||
/**
|
/**
|
||||||
@@ -573,10 +694,12 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
|
|||||||
moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
|
moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
|
||||||
"Leerstandszuschlag",
|
"Leerstandszuschlag",
|
||||||
berechnungen?.brennstoff_1.primaerenergiefaktor.toString(),
|
berechnungen?.brennstoff_1.primaerenergiefaktor.toString(),
|
||||||
Math.round((berechnungen?.leerstandsZuschlagHeizung || 0) + (berechnungen?.leerstandsZuschlagWarmwasser || 0)).toString(),
|
Math.round((berechnungen?.leerstandsZuschlagHeizung || 0) + (berechnungen?.leerstandsZuschlagWarmwasser || 0) + (berechnungen?.leerstandsZuschlagKuehlung || 0)).toString(),
|
||||||
Math.round((berechnungen?.leerstandsZuschlagWarmwasser || 0)).toString(),
|
Math.round((berechnungen?.leerstandsZuschlagWarmwasser || 0)).toString(),
|
||||||
Math.round((berechnungen?.leerstandsZuschlagHeizung || 0)),
|
Math.round((berechnungen?.leerstandsZuschlagKuehlung || 0)),
|
||||||
berechnungen?.durchschnittsKlimafaktor.toString()
|
Math.round((berechnungen?.leerstandsZuschlagHeizung || 0)).toString(),
|
||||||
|
berechnungen?.durchschnittsKlimafaktor.toString(),
|
||||||
|
Math.round((berechnungen?.leerstandsZuschlagStrom || 0))
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
addVerbrauch(
|
addVerbrauch(
|
||||||
@@ -584,33 +707,36 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
|
|||||||
moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
|
moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
|
||||||
"Leerstandszuschlag",
|
"Leerstandszuschlag",
|
||||||
berechnungen?.brennstoff_1.primaerenergiefaktor.toString(),
|
berechnungen?.brennstoff_1.primaerenergiefaktor.toString(),
|
||||||
Math.round((berechnungen?.leerstandsZuschlagHeizung || 0) + (berechnungen?.leerstandsZuschlagWarmwasser || 0)).toString(),
|
Math.round((berechnungen?.leerstandsZuschlagHeizung || 0) + (berechnungen?.leerstandsZuschlagWarmwasser || 0) + (berechnungen?.leerstandsZuschlagKuehlung || 0)).toString(),
|
||||||
"0",
|
Math.round((berechnungen?.leerstandsZuschlagWarmwasser || 0)).toString(),
|
||||||
0,
|
Math.round((berechnungen?.leerstandsZuschlagKuehlung || 0)),
|
||||||
berechnungen?.durchschnittsKlimafaktor.toString()
|
Math.round((berechnungen?.leerstandsZuschlagHeizung || 0)).toString(),
|
||||||
|
berechnungen?.durchschnittsKlimafaktor.toString(),
|
||||||
|
Math.round((berechnungen?.leerstandsZuschlagStrom || 0))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (aufnahme.kuehlung) {
|
if (aufnahme.kuehlung === "1" && (ausweis.stromverbrauch_enthaelt_kuehlung === false || ausweis.stromverbrauch_enthaelt_kuehlung === null)) {
|
||||||
/**
|
/**
|
||||||
* Kühlungszuschlag - Pauschale Erhöhung um 6kWh/m²
|
* Kühlungszuschlag - Pauschale Erhöhung um 6kWh/m²
|
||||||
* Primärenergiefaktor Strom
|
* Primärenergiefaktor Strom
|
||||||
* @link https://www.bundesanzeiger.de/pub/publication/MRYM4nI84Sdlr0EIvvW?2
|
* @link https://www.bundesanzeiger.de/pub/publication/MRYM4nI84Sdlr0EIvvW?2
|
||||||
*/
|
*/
|
||||||
addVerbrauch(
|
addVerbrauch(
|
||||||
moment(ausweis.startdatum).format("MM.YYYY"),
|
moment(ausweis.startdatum).format("MM.YYYY"),
|
||||||
moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
|
moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
|
||||||
"Kühlungszuschlag",
|
"Kühlungszuschlag",
|
||||||
"",
|
"1.8",
|
||||||
// TODO
|
"",
|
||||||
// berechnungen?.primaerfaktorww.toString(),
|
"",
|
||||||
Math.round(berechnungen?.kuehlungsZuschlag_1 || 0).toString(),
|
0,
|
||||||
"0",
|
"",
|
||||||
0,
|
"",
|
||||||
""
|
Math.round(berechnungen?.kuehlungsZuschlag || 0)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* -------------------------------- Seite 4 -------------------------------- */
|
/* -------------------------------- Seite 4 -------------------------------- */
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import { Enums } from "#lib/server/prisma.js";
|
|||||||
import * as fs from "fs"
|
import * as fs from "fs"
|
||||||
import moment from "moment";
|
import moment from "moment";
|
||||||
import { PDFDocument, PDFFont, PDFImage, PDFPage, StandardFonts } from "pdf-lib";
|
import { PDFDocument, PDFFont, PDFImage, PDFPage, StandardFonts } from "pdf-lib";
|
||||||
import { addCheckMark } from "./utils/checkbox.js";
|
|
||||||
import { addText } from "./utils/text.js";
|
import { addText } from "./utils/text.js";
|
||||||
import { addAnsichtsausweisLabel, addDatumGEG, addRegistriernummer } from "./utils/helpers.js";
|
import { addAnsichtsausweisLabel, addDatumGEG, addRegistriernummer } from "./utils/helpers.js";
|
||||||
import { getS3File } from "#lib/s3.js";
|
import { getS3File } from "#lib/s3.js";
|
||||||
@@ -12,6 +11,7 @@ import { endEnergieVerbrauchVerbrauchsausweis_2016_Server } from "#lib/Berechnun
|
|||||||
|
|
||||||
/* -------------------------------- Pdf Tools ------------------------------- */
|
/* -------------------------------- Pdf Tools ------------------------------- */
|
||||||
|
|
||||||
|
|
||||||
export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: BildClient[], user: BenutzerClient, vorschau = true) {
|
export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: BildClient[], user: BenutzerClient, vorschau = true) {
|
||||||
const VerbrauchsausweisWohnenGEG2024PDF = fs.readFileSync(new URL("../../../public/pdf/templates/GEG24_Wohngebaeude_ohne_pfeile.pdf", import.meta.url), "base64");
|
const VerbrauchsausweisWohnenGEG2024PDF = fs.readFileSync(new URL("../../../public/pdf/templates/GEG24_Wohngebaeude_ohne_pfeile.pdf", import.meta.url), "base64");
|
||||||
const pdf = await PDFDocument.load(VerbrauchsausweisWohnenGEG2024PDF)
|
const pdf = await PDFDocument.load(VerbrauchsausweisWohnenGEG2024PDF)
|
||||||
@@ -28,6 +28,18 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
|
|||||||
const font = await pdf.embedFont(StandardFonts.Helvetica)
|
const font = await pdf.embedFont(StandardFonts.Helvetica)
|
||||||
const bold = await pdf.embedFont(StandardFonts.HelveticaBold)
|
const bold = await pdf.embedFont(StandardFonts.HelveticaBold)
|
||||||
|
|
||||||
|
|
||||||
|
for (let i = 0; i < pages.length; i++) {
|
||||||
|
const page = pages[i];
|
||||||
|
if (vorschau) {
|
||||||
|
addAnsichtsausweisLabel(page, font)
|
||||||
|
}
|
||||||
|
addDatumGEG(page, font)
|
||||||
|
if (i !== pages.length - 1) {
|
||||||
|
addRegistriernummer(page, font, ausweis.registriernummer || "")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pages[0].drawText(`ID: ${ausweis.id || ""}`, {
|
pages[0].drawText(`ID: ${ausweis.id || ""}`, {
|
||||||
x: 211,
|
x: 211,
|
||||||
y: height - 112.5,
|
y: height - 112.5,
|
||||||
@@ -40,9 +52,34 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
|
|||||||
size: 10
|
size: 10
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const bild = bilder && bilder.find(image => image.kategorie === Enums.BilderKategorie.Gebaeude);
|
||||||
|
|
||||||
|
if (bild) {
|
||||||
|
const file = await getS3File("ibc-images", `${bild.id}.jpg`);
|
||||||
|
|
||||||
|
if (file) {
|
||||||
|
let image: PDFImage;
|
||||||
|
image = await pdf.embedJpg(file)
|
||||||
|
pages[0].drawImage(image, {
|
||||||
|
x: 460.5,
|
||||||
|
y: height - 289,
|
||||||
|
width: 111,
|
||||||
|
height: 138
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pages[0].drawText(objekt.adresse || "", {
|
pages[0].drawText(objekt.adresse || "", {
|
||||||
x: 211,
|
x: 211,
|
||||||
y: height - 194,
|
y: height - 188.5,
|
||||||
|
size: 10
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
const plzOrt = `${objekt.plz || ""} ${objekt.ort || ""}`
|
||||||
|
pages[0].drawText(plzOrt || "", {
|
||||||
|
x: 211,
|
||||||
|
y: height - 200,
|
||||||
size: 10
|
size: 10
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -70,18 +107,36 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
|
|||||||
size: 10
|
size: 10
|
||||||
})
|
})
|
||||||
|
|
||||||
pages[0].drawText(aufnahme.nutzflaeche?.toString() || "", {
|
pages[0].drawText(Math.round(berechnungen?.energetischeNutzflaeche || 0).toString() || "", {
|
||||||
x: 211,
|
x: 211,
|
||||||
y: height - 285,
|
y: height - 285,
|
||||||
size: 10
|
size: 10
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// Nach 82 aus Wohnfläche ermittelt
|
||||||
|
if (aufnahme.nutzflaeche == 0) {
|
||||||
|
pages[0].drawText("x", {
|
||||||
|
x: 275,
|
||||||
|
y: height - 285,
|
||||||
|
size: 10,
|
||||||
|
font: bold
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
pages[0].drawText(`${ausweis.brennstoff_1}, ${ausweis.brennstoff_2 || ""}`, {
|
pages[0].drawText(`${ausweis.brennstoff_1}, ${ausweis.brennstoff_2 || ""}`, {
|
||||||
x: 211,
|
x: 211,
|
||||||
y: height - 298.5,
|
y: height - 298.5,
|
||||||
size: 10
|
size: 10
|
||||||
})
|
})
|
||||||
|
|
||||||
|
if (ausweis.warmwasser_enthalten) {
|
||||||
|
pages[0].drawText(`${ausweis.brennstoff_1}, ${ausweis.brennstoff_2 || ""}`, {
|
||||||
|
x: 211,
|
||||||
|
y: height - 299,
|
||||||
|
size: 10
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
if (ausweis.warmwasser_enthalten) {
|
if (ausweis.warmwasser_enthalten) {
|
||||||
pages[0].drawText(`${ausweis.brennstoff_1}, ${ausweis.brennstoff_2 || ""}`, {
|
pages[0].drawText(`${ausweis.brennstoff_1}, ${ausweis.brennstoff_2 || ""}`, {
|
||||||
x: 211,
|
x: 211,
|
||||||
@@ -91,6 +146,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const erneuerbareEnergienVerwendung = []
|
const erneuerbareEnergienVerwendung = []
|
||||||
|
|
||||||
if (ausweis.alternative_heizung) {
|
if (ausweis.alternative_heizung) {
|
||||||
@@ -115,69 +171,91 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
|
|||||||
size: 8
|
size: 8
|
||||||
})
|
})
|
||||||
|
|
||||||
if (ausweis.warmwasser_enthalten) {
|
if (aufnahme.lueftung === Enums.Lueftungskonzept.Fensterlueftung) {
|
||||||
pages[0].drawText(`${ausweis.brennstoff_1}, ${ausweis.brennstoff_2 || ""}`, {
|
pages[0].drawText("x", {
|
||||||
x: 211,
|
x: 214,
|
||||||
y: height - 299,
|
y: height - 355,
|
||||||
size: 10
|
size: 10,
|
||||||
|
font: bold
|
||||||
|
})
|
||||||
|
} else if (aufnahme.lueftung === Enums.Lueftungskonzept.Schachtlueftung) {
|
||||||
|
pages[0].drawText("x", {
|
||||||
|
x: 214,
|
||||||
|
y: height - 366,
|
||||||
|
size: 10,
|
||||||
|
font: bold
|
||||||
|
})
|
||||||
|
} else if (aufnahme.lueftung === Enums.Lueftungskonzept.LueftungsanlageMitWaermerueckgewinnung) {
|
||||||
|
pages[0].drawText("x", {
|
||||||
|
x: 356,
|
||||||
|
y: height - 355,
|
||||||
|
size: 10,
|
||||||
|
font: bold
|
||||||
|
})
|
||||||
|
} else if (aufnahme.lueftung === Enums.Lueftungskonzept.LueftungsanlageOhneWaermerueckgewinnung) {
|
||||||
|
pages[0].drawText("x", {
|
||||||
|
x: 356,
|
||||||
|
y: height - 366,
|
||||||
|
size: 10,
|
||||||
|
font: bold
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (aufnahme.lueftung === Enums.Lueftungskonzept.Fensterlueftung) {
|
|
||||||
addCheckMark(pages[0], 213, height - 347)
|
|
||||||
} else if (aufnahme.lueftung === Enums.Lueftungskonzept.Schachtlueftung) {
|
|
||||||
addCheckMark(pages[0], 213, height - 358)
|
|
||||||
} else if (aufnahme.lueftung === Enums.Lueftungskonzept.LueftungsanlageMitWaermerueckgewinnung) {
|
|
||||||
addCheckMark(pages[0], 355, height - 347)
|
|
||||||
} else if (aufnahme.lueftung === Enums.Lueftungskonzept.LueftungsanlageOhneWaermerueckgewinnung) {
|
|
||||||
addCheckMark(pages[0], 355, height - 358)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Kühlung
|
// Kühlung
|
||||||
if (aufnahme.kuehlung) {
|
if (aufnahme.kuehlung === "1") {
|
||||||
addCheckMark(pages[0], 213, height - 375.5)
|
pages[0].drawText("x", {
|
||||||
} else {
|
x: 213,
|
||||||
addCheckMark(pages[0], 355, height - 386.5)
|
y: height - 383.5,
|
||||||
|
size: 10,
|
||||||
|
font: bold
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ausweis.ausstellgrund === Enums.Ausstellgrund.Neubau) {
|
if (ausweis.ausstellgrund === Enums.Ausstellgrund.Neubau) {
|
||||||
addCheckMark(pages[0], 213, height - 419)
|
pages[0].drawText("x", {
|
||||||
|
x: 214,
|
||||||
|
y: height - 427,
|
||||||
|
size: 10,
|
||||||
|
font: bold
|
||||||
|
})
|
||||||
} else if (ausweis.ausstellgrund === Enums.Ausstellgrund.Vermietung || ausweis.ausstellgrund === Enums.Ausstellgrund.Verkauf) {
|
} else if (ausweis.ausstellgrund === Enums.Ausstellgrund.Vermietung || ausweis.ausstellgrund === Enums.Ausstellgrund.Verkauf) {
|
||||||
addCheckMark(pages[0], 213, height - 430)
|
pages[0].drawText("x", {
|
||||||
|
x: 214,
|
||||||
|
y: height - 438,
|
||||||
|
size: 10,
|
||||||
|
font: bold
|
||||||
|
})
|
||||||
} else if (ausweis.ausstellgrund === Enums.Ausstellgrund.Modernisierung) {
|
} else if (ausweis.ausstellgrund === Enums.Ausstellgrund.Modernisierung) {
|
||||||
addCheckMark(pages[0], 344.5, height - 419)
|
pages[0].drawText("x", {
|
||||||
|
x: 345.5,
|
||||||
|
y: height - 427,
|
||||||
|
size: 10,
|
||||||
|
font: bold
|
||||||
|
})
|
||||||
} else if (ausweis.ausstellgrund === Enums.Ausstellgrund.Sonstiges) {
|
} else if (ausweis.ausstellgrund === Enums.Ausstellgrund.Sonstiges) {
|
||||||
addCheckMark(pages[0], 463, height - 419)
|
pages[0].drawText("x", {
|
||||||
|
x: 464,
|
||||||
|
y: height - 427,
|
||||||
|
size: 10,
|
||||||
|
font: bold
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const bild = bilder && bilder.find(image => image.kategorie === Enums.BilderKategorie.Gebaeude);
|
// Checkmark Angabe Verbrauchsausweis
|
||||||
|
pages[0].drawText("x", {
|
||||||
if (bild) {
|
x: 44,
|
||||||
const file = await getS3File("ibc-images", `${bild.id}.jpg`);
|
y: height - 568,
|
||||||
|
size: 10,
|
||||||
if (file) {
|
font: bold
|
||||||
let image: PDFImage;
|
})
|
||||||
image = await pdf.embedJpg(file)
|
|
||||||
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
|
// Datenerhebung durch Eigentümer
|
||||||
addCheckMark(pages[0], 298, height - 590)
|
pages[0].drawText("x", {
|
||||||
|
x: 299,
|
||||||
|
y: height - 598,
|
||||||
|
size: 10,
|
||||||
|
font: bold
|
||||||
|
})
|
||||||
|
|
||||||
// Ausstellungsdatum
|
// Ausstellungsdatum
|
||||||
pages[0].drawText(moment().format("DD.MM.YYYY"), {
|
pages[0].drawText(moment().format("DD.MM.YYYY"), {
|
||||||
@@ -196,9 +274,9 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
|
|||||||
})
|
})
|
||||||
|
|
||||||
// Stempel und Unterschrift
|
// Stempel und Unterschrift
|
||||||
if (ausweis.ausgestellt) {
|
if (!vorschau) {
|
||||||
const stempel = await pdf.embedPng(fs.readFileSync(new URL("../../../public/pdf/images/stempel-unterschrift.png", import.meta.url), "base64"));
|
const stempel = await pdf.embedPng(fs.readFileSync(new URL("../../../public/pdf/images/stempel-unterschrift.png", import.meta.url), "base64"));
|
||||||
const stempelHeight = 60
|
const stempelHeight = 65
|
||||||
|
|
||||||
pages[0].drawImage(stempel, {
|
pages[0].drawImage(stempel, {
|
||||||
x: 450,
|
x: 450,
|
||||||
@@ -210,11 +288,12 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
|
|||||||
|
|
||||||
// Aussteller
|
// Aussteller
|
||||||
const aussteller = await pdf.embedPng(fs.readFileSync(new URL("../../../public/pdf/images/aussteller.png", import.meta.url), "base64"));
|
const aussteller = await pdf.embedPng(fs.readFileSync(new URL("../../../public/pdf/images/aussteller.png", import.meta.url), "base64"));
|
||||||
|
|
||||||
pages[0].drawImage(aussteller, {
|
pages[0].drawImage(aussteller, {
|
||||||
x: 40,
|
x: 260,
|
||||||
y: height - 770,
|
y: height - 775,
|
||||||
width: 100,
|
width: 130,
|
||||||
height: 50
|
height: 65
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
@@ -325,7 +404,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
addEnergieverbrauchSkalaPfeile(pages[2])
|
|
||||||
|
|
||||||
// CO2 Emissionen
|
// CO2 Emissionen
|
||||||
pages[2].drawText(berechnungen?.co2EmissionenGesamt.toString() || "", {
|
pages[2].drawText(berechnungen?.co2EmissionenGesamt.toString() || "", {
|
||||||
@@ -335,6 +414,8 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
|
|||||||
size: 10
|
size: 10
|
||||||
})
|
})
|
||||||
|
|
||||||
|
addEnergieverbrauchSkalaPfeile(pages[2])
|
||||||
|
|
||||||
// Endenergieverbrauch
|
// Endenergieverbrauch
|
||||||
pages[2].drawText(berechnungen?.endEnergieVerbrauchGesamt.toString() || "", {
|
pages[2].drawText(berechnungen?.endEnergieVerbrauchGesamt.toString() || "", {
|
||||||
x: 455,
|
x: 455,
|
||||||
@@ -500,7 +581,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (aufnahme.kuehlung) {
|
if (aufnahme.kuehlung === "1") {
|
||||||
/**
|
/**
|
||||||
* Kühlungszuschlag - Pauschale Erhöhung um 6kWh/m²
|
* Kühlungszuschlag - Pauschale Erhöhung um 6kWh/m²
|
||||||
* Primärenergiefaktor Strom
|
* Primärenergiefaktor Strom
|
||||||
@@ -592,16 +673,5 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
|
|||||||
addEmpfehlung(empfehlung.anlagenteil, empfehlung.description, true, empfehlung.amortisationszeit, empfehlung.kosten)
|
addEmpfehlung(empfehlung.anlagenteil, empfehlung.description, true, empfehlung.amortisationszeit, empfehlung.kosten)
|
||||||
}
|
}
|
||||||
|
|
||||||
for (let i = 0; i < pages.length; i++) {
|
|
||||||
const page = pages[i];
|
|
||||||
if (vorschau) {
|
|
||||||
addAnsichtsausweisLabel(page, font)
|
|
||||||
}
|
|
||||||
addDatumGEG(page, font)
|
|
||||||
if (i !== pages.length - 1) {
|
|
||||||
addRegistriernummer(page, font, ausweis.registriernummer || "")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return pdf.save();
|
return pdf.save();
|
||||||
}
|
}
|
||||||
@@ -3,7 +3,7 @@ import { pdfDatenblattVerbrauchsausweisGewerbe } from "#lib/pdf/pdfDatenblattVer
|
|||||||
import { pdfDatenblattVerbrauchsausweisWohnen } from "#lib/pdf/pdfDatenblattVerbrauchsausweisWohnen.js";
|
import { pdfDatenblattVerbrauchsausweisWohnen } from "#lib/pdf/pdfDatenblattVerbrauchsausweisWohnen.js";
|
||||||
import { pdfVerbrauchsausweisGewerbe } from "#lib/pdf/pdfVerbrauchsausweisGewerbe.js";
|
import { pdfVerbrauchsausweisGewerbe } from "#lib/pdf/pdfVerbrauchsausweisGewerbe.js";
|
||||||
import { pdfVerbrauchsausweisWohnen } from "#lib/pdf/pdfVerbrauchsausweisWohnen.js";
|
import { pdfVerbrauchsausweisWohnen } from "#lib/pdf/pdfVerbrauchsausweisWohnen.js";
|
||||||
import { Enums, prisma } from "#lib/server/prisma.js";
|
import { Enums, prisma, Rechnung } from "#lib/server/prisma.js";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gibt den richtigen Prisma Adapter für die Ausweisart basierend auf der UID zurück, oder null bei einer falschen UID.
|
* Gibt den richtigen Prisma Adapter für die Ausweisart basierend auf der UID zurück, oder null bei einer falschen UID.
|
||||||
@@ -49,15 +49,15 @@ export async function getAnsichtsausweis(ausweis: VerbrauchsausweisWohnenClient
|
|||||||
* Gibt das richtige Datenblatt basierend auf der Ausweisart zurück.
|
* Gibt das richtige Datenblatt basierend auf der Ausweisart zurück.
|
||||||
* @param ausweis
|
* @param ausweis
|
||||||
*/
|
*/
|
||||||
export async function getDatenblatt(ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: BildClient[], user: BenutzerClient, ausweisart = getAusweisartFromId(ausweis.id)) {
|
export async function getDatenblatt(ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: BildClient[], user: BenutzerClient, rechnung: Rechnung, ausweisart = getAusweisartFromId(ausweis.id)) {
|
||||||
if (!ausweisart) {
|
if (!ausweisart) {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
|
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
|
||||||
return await pdfDatenblattVerbrauchsausweisWohnen(ausweis as VerbrauchsausweisWohnenClient, aufnahme, objekt, user, bilder)
|
return await pdfDatenblattVerbrauchsausweisWohnen(ausweis as VerbrauchsausweisWohnenClient, aufnahme, objekt, rechnung, bilder)
|
||||||
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
|
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
|
||||||
return await pdfDatenblattVerbrauchsausweisGewerbe(ausweis as VerbrauchsausweisGewerbeClient, aufnahme, objekt, user, bilder)
|
return await pdfDatenblattVerbrauchsausweisGewerbe(ausweis as VerbrauchsausweisGewerbeClient, aufnahme, objekt, rechnung, bilder)
|
||||||
}
|
}
|
||||||
|
|
||||||
return null
|
return null
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { Aufnahme, BedarfsausweisGewerbe, BedarfsausweisWohnen, Bild, GEGNachweisGewerbe, GEGNachweisWohnen, Objekt, prisma, Unterlage, VerbrauchsausweisGewerbe, VerbrauchsausweisWohnen } from "./prisma.js";
|
import { Aufnahme, BedarfsausweisGewerbe, BedarfsausweisWohnen, Bild, GEGNachweisGewerbe, GEGNachweisWohnen, Objekt, prisma, Rechnung, Unterlage, VerbrauchsausweisGewerbe, VerbrauchsausweisWohnen } from "./prisma.js";
|
||||||
|
|
||||||
export async function getVerbrauchsausweisWohnen(id: string): Promise<VerbrauchsausweisWohnen | null> {
|
export async function getVerbrauchsausweisWohnen(id: string): Promise<VerbrauchsausweisWohnen | null> {
|
||||||
return await prisma.verbrauchsausweisWohnen.findUnique({
|
return await prisma.verbrauchsausweisWohnen.findUnique({
|
||||||
@@ -24,6 +24,7 @@ export async function getVerbrauchsausweisWohnenKomplett(id: string) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
rechnung: true
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -54,6 +55,7 @@ export async function getVerbrauchsausweisGewerbeKomplett(id: string) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
rechnung: true
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -82,6 +84,7 @@ export async function getBedarfsausweisWohnenKomplett(id: string) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
rechnung: true
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -140,4 +143,42 @@ export async function getUnterlagen(aufnahme_id: string): Promise<Unterlage[]> {
|
|||||||
aufnahme_id
|
aufnahme_id
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getRechnung(rechnung_id: string) {
|
||||||
|
return await prisma.rechnung.findUnique({
|
||||||
|
where: {
|
||||||
|
id: rechnung_id
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
import Surreal from "surrealdb"
|
||||||
|
|
||||||
|
// Define the database configuration interface
|
||||||
|
interface DbConfig {
|
||||||
|
url: string;
|
||||||
|
namespace: string;
|
||||||
|
database: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Define the default database configuration
|
||||||
|
const DEFAULT_CONFIG: DbConfig = {
|
||||||
|
url: "http://127.0.0.1:8000/rpc",
|
||||||
|
namespace: "main",
|
||||||
|
database: "main",
|
||||||
|
};
|
||||||
|
|
||||||
|
export async function db(config: DbConfig = DEFAULT_CONFIG): Promise<Surreal> {
|
||||||
|
const db = new Surreal();
|
||||||
|
|
||||||
|
try {
|
||||||
|
await db.connect(config.url);
|
||||||
|
await db.use({ namespace: config.namespace, database: config.database });
|
||||||
|
return db;
|
||||||
|
} catch (err) {
|
||||||
|
console.error("Failed to connect to SurrealDB:", err instanceof Error ? err.message : String(err));
|
||||||
|
await db.close();
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -122,7 +122,7 @@ export async function createInvoice(
|
|||||||
},
|
},
|
||||||
title: "Rechnung",
|
title: "Rechnung",
|
||||||
introduction:
|
introduction:
|
||||||
"Ihren Energieausweis (Ausweis ID {ausweis.id}) stellen wir Ihnen hiermit in Rechnung",
|
`Ihren Energieausweis (Ausweis ID ${ausweis.id}) stellen wir Ihnen hiermit in Rechnung`,
|
||||||
remark: "Vielen Dank für Ihren Einkauf.",
|
remark: "Vielen Dank für Ihren Einkauf.",
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -280,3 +280,51 @@ export async function createInvoice(
|
|||||||
voucherNumber: abfrage_response["voucherNumber"],
|
voucherNumber: abfrage_response["voucherNumber"],
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ládt das Reechnungs PDF von LexOffice runter.
|
||||||
|
*
|
||||||
|
* @export
|
||||||
|
* @async
|
||||||
|
* @param {Rechnung} rechnung
|
||||||
|
* @returns {ArrayBuffer}
|
||||||
|
* @throws Falls eine der requests fehlschlägt.
|
||||||
|
*/
|
||||||
|
export async function getLexOfficeRechnung(rechnung: Rechnung) {
|
||||||
|
|
||||||
|
const response = await fetch(`https://api.lexoffice.io/v1/invoices/${rechnung.lex_office_id}/document`, {
|
||||||
|
method: "GET",
|
||||||
|
headers: {
|
||||||
|
"Accept": `application/json`,
|
||||||
|
"Authorization": `Bearer ${LEX_OFFICE_API_KEY}`,
|
||||||
|
"Content-Type": `application/json`
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const body = await response.json()
|
||||||
|
|
||||||
|
if(!("documentFileId" in body)){
|
||||||
|
throw new Error("documentFileId nicht in request.")
|
||||||
|
}
|
||||||
|
|
||||||
|
const file_id = body["documentFileId"];
|
||||||
|
|
||||||
|
|
||||||
|
const fileRequest = await fetch(`https://api.lexoffice.io/v1/files/${file_id}`, {
|
||||||
|
method: "GET",
|
||||||
|
headers: {
|
||||||
|
"Accept": `application/pdf`,
|
||||||
|
"Authorization": `Bearer ${LEX_OFFICE_API_KEY}`,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
if (fileRequest.status !== 200) {
|
||||||
|
throw new Error("File request hat nicht funktioniert.")
|
||||||
|
}
|
||||||
|
|
||||||
|
const file = await fileRequest.arrayBuffer()
|
||||||
|
|
||||||
|
return file;
|
||||||
|
}
|
||||||
@@ -190,7 +190,7 @@
|
|||||||
>
|
>
|
||||||
|
|
||||||
<!-- F Angaben zur Heizungsanlage -->
|
<!-- F Angaben zur Heizungsanlage -->
|
||||||
<!-- <Bereich bereich="F" title="Angaben zur Heizunganlage"
|
<Bereich bereich="D" title="Angaben zur Heizunganlage"
|
||||||
><SanierungszustandHeizungsanlage
|
><SanierungszustandHeizungsanlage
|
||||||
bind:images={bilder}
|
bind:images={bilder}
|
||||||
bind:objekt
|
bind:objekt
|
||||||
@@ -198,9 +198,9 @@
|
|||||||
bind:ausweis
|
bind:ausweis
|
||||||
{ausweisart}
|
{ausweisart}
|
||||||
/></Bereich
|
/></Bereich
|
||||||
> -->
|
>
|
||||||
|
|
||||||
<Bereich bereich="D" title="Gebäudepläne & Unterlagen">
|
<Bereich bereich="E" title="Gebäudepläne & Unterlagen">
|
||||||
<div
|
<div
|
||||||
class="bereich-box grid grid-cols-1 lg:grid-cols-2 gap-x-6 mt-6"
|
class="bereich-box grid grid-cols-1 lg:grid-cols-2 gap-x-6 mt-6"
|
||||||
>
|
>
|
||||||
@@ -239,7 +239,7 @@
|
|||||||
|
|
||||||
<!-- G Angaben zur Fenster, Dachfenster und Türen -->
|
<!-- G Angaben zur Fenster, Dachfenster und Türen -->
|
||||||
|
|
||||||
<Bereich bereich="E" title="Angaben zu Fenster, Dachfenster und Türen"
|
<Bereich bereich="F" title="Angaben zu Fenster, Dachfenster und Türen"
|
||||||
><SanierungszustandFensterTueren
|
><SanierungszustandFensterTueren
|
||||||
bind:images={bilder}
|
bind:images={bilder}
|
||||||
bind:objekt
|
bind:objekt
|
||||||
@@ -249,7 +249,7 @@
|
|||||||
>
|
>
|
||||||
<!-- H Angaben zur Wärmedammung -->
|
<!-- H Angaben zur Wärmedammung -->
|
||||||
|
|
||||||
<Bereich bereich="F" title="Angaben zur Wärmedämmung"
|
<Bereich bereich="G" title="Angaben zur Wärmedämmung"
|
||||||
><SanierungszustandWaermedammung
|
><SanierungszustandWaermedammung
|
||||||
bind:images={bilder}
|
bind:images={bilder}
|
||||||
bind:objekt
|
bind:objekt
|
||||||
@@ -260,7 +260,7 @@
|
|||||||
|
|
||||||
<!-- I Gebäudebild und Energieausweis PDF Vorschau -->
|
<!-- I Gebäudebild und Energieausweis PDF Vorschau -->
|
||||||
|
|
||||||
<Bereich bereich="G" title="Gebäudebild und Energieausweis PDF Vorschau"
|
<Bereich bereich="H" title="Gebäudebild und Energieausweis PDF Vorschau"
|
||||||
><AusweisPreviewContainer
|
><AusweisPreviewContainer
|
||||||
bind:images={bilder}
|
bind:images={bilder}
|
||||||
bind:ausweis
|
bind:ausweis
|
||||||
|
|||||||
@@ -94,15 +94,10 @@
|
|||||||
|
|
||||||
<hr />
|
<hr />
|
||||||
|
|
||||||
{#if user.rolle === Enums.BenutzerRolle.ADMIN}
|
|
||||||
<!-- <div class="flex flex-col mb-4">
|
|
||||||
<AusweisePruefenFilter bind:filters={filters}></AusweisePruefenFilter>
|
|
||||||
</div> -->
|
|
||||||
<form action="" class="flex flex-row gap-2 my-2">
|
<form action="" class="flex flex-row gap-2 my-2">
|
||||||
<input type="text" bind:value={id} name="id" placeholder="ID">
|
<input type="text" bind:value={id} name="id" placeholder="ID">
|
||||||
<button class="button text-sm">Suchen</button>
|
<button class="button text-sm">Suchen</button>
|
||||||
</form>
|
</form>
|
||||||
{/if}
|
|
||||||
|
|
||||||
<!-- <div class="relative mb-6">
|
<!-- <div class="relative mb-6">
|
||||||
<button class="button" on:click={() => {
|
<button class="button" on:click={() => {
|
||||||
|
|||||||
@@ -30,8 +30,6 @@
|
|||||||
import InputLabel from "#components/labels/InputLabel.svelte";
|
import InputLabel from "#components/labels/InputLabel.svelte";
|
||||||
import PlzSuche from "#components/PlzSuche.svelte";
|
import PlzSuche from "#components/PlzSuche.svelte";
|
||||||
import { getMaximumDevitationInPercent } from "#client/lib/helpers.js";
|
import { getMaximumDevitationInPercent } from "#client/lib/helpers.js";
|
||||||
import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js";
|
|
||||||
import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.js";
|
|
||||||
import { endEnergieVerbrauchVerbrauchsausweis_2016_Client } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Client.js";
|
import { endEnergieVerbrauchVerbrauchsausweis_2016_Client } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Client.js";
|
||||||
import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Client } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Client.js";
|
import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Client } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Client.js";
|
||||||
|
|
||||||
@@ -1016,7 +1014,8 @@ grid-cols-3 sm:grid-cols-5 justify-around justify-items-center items-center"
|
|||||||
|
|
||||||
{#if ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen}
|
{#if ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen}
|
||||||
<!-- Verbrauchsausweis Wohnen [altes System: $ausweis->anteil_warmwasser_1 < 6 OR $ausweis->anteil_warmwasser_1 > 40] -->
|
<!-- Verbrauchsausweis Wohnen [altes System: $ausweis->anteil_warmwasser_1 < 6 OR $ausweis->anteil_warmwasser_1 > 40] -->
|
||||||
{#if (ausweis.anteil_warmwasser_1 < 6) || (ausweis.anteil_warmwasser_1 > 40)}
|
{#if (ausweis.anteil_warmwasser_1 !== null)}
|
||||||
|
{#if ((ausweis.anteil_warmwasser_1 < 6) && (ausweis.anteil_warmwasser_1 != 0)) || (ausweis.anteil_warmwasser_1 > 40)}
|
||||||
<div class="pruefpunkt">
|
<div class="pruefpunkt">
|
||||||
<input type="checkbox" name="pruefpunkt_anteil_warmwasser" bind:checked={ausweis.pruefpunkt_anteil_warmwasser} required/>
|
<input type="checkbox" name="pruefpunkt_anteil_warmwasser" bind:checked={ausweis.pruefpunkt_anteil_warmwasser} required/>
|
||||||
<div class="text-left">
|
<div class="text-left">
|
||||||
@@ -1024,6 +1023,7 @@ grid-cols-3 sm:grid-cols-5 justify-around justify-items-center items-center"
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
|
{/if}
|
||||||
{/if}
|
{/if}
|
||||||
{#if ausweisart === Enums.Ausweisart.BedarfsausweisWohnen}
|
{#if ausweisart === Enums.Ausweisart.BedarfsausweisWohnen}
|
||||||
<!-- Zusätzlich beim Bedarfsausweis [altes System: $ausweis->wohnflaeche < $ausweis->energetische_nutzfläche] -->
|
<!-- Zusätzlich beim Bedarfsausweis [altes System: $ausweis->wohnflaeche < $ausweis->energetische_nutzfläche] -->
|
||||||
|
|||||||
@@ -8,9 +8,11 @@ import {
|
|||||||
Enums,
|
Enums,
|
||||||
Objekt,
|
Objekt,
|
||||||
prisma,
|
prisma,
|
||||||
|
Rechnung,
|
||||||
VerbrauchsausweisGewerbe,
|
VerbrauchsausweisGewerbe,
|
||||||
VerbrauchsausweisWohnen,
|
VerbrauchsausweisWohnen,
|
||||||
} from "#lib/server/prisma.js";
|
} from "#lib/server/prisma.js";
|
||||||
|
import { join } from "path"
|
||||||
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
||||||
import { z } from "astro:content";
|
import { z } from "astro:content";
|
||||||
import { transport } from "#lib/mail.js";
|
import { transport } from "#lib/mail.js";
|
||||||
@@ -18,21 +20,24 @@ import { BASE_URI } from "#lib/constants.js";
|
|||||||
import { getAnsichtsausweis, getDatenblatt } from "#lib/server/ausweis.js";
|
import { getAnsichtsausweis, getDatenblatt } from "#lib/server/ausweis.js";
|
||||||
import { PutObjectCommand } from "@aws-sdk/client-s3";
|
import { PutObjectCommand } from "@aws-sdk/client-s3";
|
||||||
import { s3Client } from "#lib/s3.js";
|
import { s3Client } from "#lib/s3.js";
|
||||||
import { createInvoice } from "#lib/server/invoice.js";
|
import { createInvoice, getLexOfficeRechnung } from "#lib/server/invoice.js";
|
||||||
import { tryCatch } from "#lib/tryCatch.js";
|
import { tryCatch } from "#lib/tryCatch.js";
|
||||||
|
import SFTPClient from 'ssh2-sftp-client';
|
||||||
import {
|
import {
|
||||||
getBedarfsausweisWohnenKomplett,
|
getBedarfsausweisWohnenKomplett,
|
||||||
getVerbrauchsausweisGewerbeKomplett,
|
getVerbrauchsausweisGewerbeKomplett,
|
||||||
getVerbrauchsausweisWohnenKomplett,
|
getVerbrauchsausweisWohnenKomplett,
|
||||||
} from "#lib/server/db.js";
|
} from "#lib/server/db.js";
|
||||||
|
import { PDFDocument } from "pdf-lib";
|
||||||
|
|
||||||
export const GET = defineApiRoute({
|
export const GET = defineApiRoute({
|
||||||
input: z.object({
|
input: z.object({
|
||||||
id_ausweis: z.string(),
|
id_ausweis: z.string(),
|
||||||
|
post: z.boolean().describe("Ob der Ausweis auch per Post ausgestellt werden soll.").optional().default(false)
|
||||||
}),
|
}),
|
||||||
output: z.void(),
|
output: z.void(),
|
||||||
middleware: adminMiddleware,
|
middleware: adminMiddleware,
|
||||||
async fetch({ id_ausweis }, context, user) {
|
async fetch({ id_ausweis, post }, context) {
|
||||||
const ausweisart = getAusweisartFromId(id_ausweis);
|
const ausweisart = getAusweisartFromId(id_ausweis);
|
||||||
|
|
||||||
let ausweis:
|
let ausweis:
|
||||||
@@ -46,7 +51,8 @@ export const GET = defineApiRoute({
|
|||||||
objekt: Objekt & {
|
objekt: Objekt & {
|
||||||
benutzer: Benutzer | null;
|
benutzer: Benutzer | null;
|
||||||
};
|
};
|
||||||
};
|
},
|
||||||
|
rechnung: Rechnung
|
||||||
})
|
})
|
||||||
| null = null;
|
| null = null;
|
||||||
|
|
||||||
@@ -67,13 +73,18 @@ export const GET = defineApiRoute({
|
|||||||
|
|
||||||
const rechnung = await prisma.rechnung.findFirst({
|
const rechnung = await prisma.rechnung.findFirst({
|
||||||
where: {
|
where: {
|
||||||
verbrauchsausweis_wohnen: {
|
OR: [
|
||||||
id: id_ausweis,
|
{ bedarfsausweis_wohnen: { id: id_ausweis } },
|
||||||
},
|
{ verbrauchsausweis_wohnen: { id: id_ausweis } },
|
||||||
|
{ verbrauchsausweis_gewerbe: { id: id_ausweis } }
|
||||||
|
]
|
||||||
},
|
},
|
||||||
orderBy: {
|
orderBy: {
|
||||||
erstellt_am: "desc",
|
erstellt_am: "desc",
|
||||||
},
|
},
|
||||||
|
include: {
|
||||||
|
benutzer: true
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!rechnung) {
|
if (!rechnung) {
|
||||||
@@ -90,7 +101,11 @@ export const GET = defineApiRoute({
|
|||||||
);
|
);
|
||||||
|
|
||||||
if (error) {
|
if (error) {
|
||||||
return;
|
throw new APIError({
|
||||||
|
code: "BAD_REQUEST",
|
||||||
|
message:
|
||||||
|
"Die Rechnung konnte bei LexOffice nicht angelegt werden..",
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const { id, voucherNumber } = result;
|
const { id, voucherNumber } = result;
|
||||||
@@ -118,148 +133,239 @@ export const GET = defineApiRoute({
|
|||||||
ausweis.aufnahme,
|
ausweis.aufnahme,
|
||||||
ausweis.aufnahme.objekt,
|
ausweis.aufnahme.objekt,
|
||||||
ausweis.aufnahme.bilder,
|
ausweis.aufnahme.bilder,
|
||||||
ausweis.aufnahme.objekt.benutzer
|
ausweis.aufnahme.objekt.benutzer,
|
||||||
|
ausweis.rechnung
|
||||||
);
|
);
|
||||||
|
|
||||||
if (pdfAusweis) {
|
// TODO: Das ist immer noch scheiße, LexOffice ist doof
|
||||||
const command = new PutObjectCommand({
|
// Hier müssen wir warten, damit wir sichergehen können, dass die Rechnung bei LexOffice existiert.
|
||||||
|
setTimeout(async () => {
|
||||||
|
const [pdfRechnung, pdfRechnungError] = await tryCatch(getLexOfficeRechnung(rechnung));
|
||||||
|
|
||||||
|
if (pdfRechnungError) {
|
||||||
|
throw new APIError({
|
||||||
|
code: "INTERNAL_SERVER_ERROR",
|
||||||
|
message: "Rechnungs PDF konnte nicht generiert werden."
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!pdfAusweis) {
|
||||||
|
throw new APIError({
|
||||||
|
code: "INTERNAL_SERVER_ERROR",
|
||||||
|
message: "Ausweis PDF konnte nicht generiert werden."
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!pdfDatenblatt) {
|
||||||
|
throw new APIError({
|
||||||
|
code: "INTERNAL_SERVER_ERROR",
|
||||||
|
message: "Datenblatt PDF konnte nicht generiert werden."
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const ausweisCommand = new PutObjectCommand({
|
||||||
Bucket: "ibc-pdfs",
|
Bucket: "ibc-pdfs",
|
||||||
Key: `ID_${ausweis.id}_Energieausweis.pdf`,
|
Key: `ID_${ausweis.id}_Energieausweis.pdf`,
|
||||||
Body: pdfAusweis,
|
Body: pdfAusweis,
|
||||||
ACL: "private",
|
ACL: "private",
|
||||||
});
|
});
|
||||||
|
|
||||||
await s3Client.send(command);
|
await s3Client.send(ausweisCommand);
|
||||||
}
|
|
||||||
|
const datenblattCommand = new PutObjectCommand({
|
||||||
if (pdfDatenblatt) {
|
|
||||||
const command = new PutObjectCommand({
|
|
||||||
Bucket: "ibc-pdfs",
|
Bucket: "ibc-pdfs",
|
||||||
Key: `ID_${ausweis.id}_Datenblatt.pdf`,
|
Key: `ID_${ausweis.id}_Datenblatt.pdf`,
|
||||||
Body: pdfDatenblatt,
|
Body: pdfDatenblatt,
|
||||||
ACL: "private",
|
ACL: "private",
|
||||||
});
|
});
|
||||||
|
|
||||||
await s3Client.send(command);
|
await s3Client.send(datenblattCommand);
|
||||||
}
|
|
||||||
|
const rechnungsCommand = new PutObjectCommand({
|
||||||
let text: string;
|
Bucket: "ibc-pdfs",
|
||||||
|
Key: `ID_${ausweis.id}_Rechnung.pdf`,
|
||||||
if (rechnung.status === Enums.Rechnungsstatus.paid) {
|
Body: pdfDatenblatt,
|
||||||
text = `
|
ACL: "private",
|
||||||
<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.id}</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.id}&p=SEPA'>jetzt per ELV bezahlen</a></td></tr>
|
|
||||||
<tr><td>Per Sofortüberweisung zahlen</td> <td>:</td> <td><a href='${BASE_URI}/energieausweis-erstellen/kaufabschluss-fortsetzen?uid=${ausweis.id}&p=Sofort'>jetzt per Sofortüberweisung bezahlen</a></td></tr>
|
|
||||||
<tr><td>Über PayPal zahlen</td> <td>:</td> <td><a href='${BASE_URI}/energieausweis-erstellen/kaufabschluss-fortsetzen?uid=${ausweis.id}&p=PayPal'>jetzt per Paypal bezahlen</a></td></tr>
|
|
||||||
<tr><td>Per Giropay zahlen</td> <td>:</td> <td><a href='${BASE_URI}/energieausweis-erstellen/kaufabschluss-fortsetzen?uid=${ausweis.id}&p=Giropay'>jetzt per Giropay bezahlen</a></td></tr>
|
|
||||||
<tr><td>Per Visa oder MasterCard zahlen</td> <td>:</td> <td><a href='${BASE_URI}/energieausweis-erstellen/kaufabschluss-fortsetzen?uid=${ausweis.id}&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.id})`,
|
|
||||||
text,
|
|
||||||
});
|
|
||||||
|
|
||||||
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
|
|
||||||
await prisma.verbrauchsausweisWohnen.update({
|
|
||||||
where: {
|
|
||||||
id: ausweis.id,
|
|
||||||
},
|
|
||||||
data: {
|
|
||||||
ausgestellt: true,
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
|
|
||||||
await prisma.verbrauchsausweisGewerbe.update({
|
await s3Client.send(rechnungsCommand);
|
||||||
where: {
|
|
||||||
id: ausweis.id,
|
// Falls Postversand angefragt wurde müssen wir die Dateien auf den Postserver hochladen
|
||||||
},
|
if (post) {
|
||||||
data: {
|
const dateiNameDruck = `1011000000000-AW_ID_${ausweis.id}.pdf`;
|
||||||
ausgestellt: true,
|
|
||||||
},
|
const outputPdf = await PDFDocument.create();
|
||||||
|
|
||||||
|
async function appendPdf(buffer: Uint8Array<ArrayBufferLike>) {
|
||||||
|
const doc = await PDFDocument.load(buffer);
|
||||||
|
const copiedPages = await outputPdf.copyPages(doc, doc.getPageIndices());
|
||||||
|
for (const page of copiedPages) {
|
||||||
|
outputPdf.addPage(page);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await appendPdf(pdfDatenblatt);
|
||||||
|
await appendPdf(pdfAusweis);
|
||||||
|
|
||||||
|
const pdfBytes = await outputPdf.save();
|
||||||
|
|
||||||
|
const pdfCommand = new PutObjectCommand({
|
||||||
|
Bucket: "ibc-pdfs",
|
||||||
|
Key: dateiNameDruck,
|
||||||
|
Body: pdfBytes,
|
||||||
|
ACL: "private",
|
||||||
|
});
|
||||||
|
|
||||||
|
await s3Client.send(pdfCommand);
|
||||||
|
|
||||||
|
const sftp = new SFTPClient();
|
||||||
|
|
||||||
|
try {
|
||||||
|
await sftp.connect({
|
||||||
|
host: 'api.ppost.de',
|
||||||
|
username: 'jens.cornelsen@ib-cornelsen.de',
|
||||||
|
password: 'ANTQesWYjd',
|
||||||
|
});
|
||||||
|
|
||||||
|
const cwd = await sftp.cwd();
|
||||||
|
await sftp.put(Buffer.from(pdfBytes), join(cwd, "upload/api", dateiNameDruck));
|
||||||
|
} catch (err) {
|
||||||
|
console.error('SFTP Upload failed:', err);
|
||||||
|
throw new APIError({
|
||||||
|
code: "INTERNAL_SERVER_ERROR",
|
||||||
|
message: "Login zum Postversand Server war nicht erfolgreich."
|
||||||
|
});
|
||||||
|
} finally {
|
||||||
|
sftp.end();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let html: string;
|
||||||
|
|
||||||
|
if (rechnung.status === Enums.Rechnungsstatus.paid) {
|
||||||
|
html = `
|
||||||
|
<p>Sehr geehrte*r ${rechnung.empfaenger},</p>
|
||||||
|
|
||||||
|
<p>im Anhang finden Sie Ihren geprüften Energieusweis inkl. Rechnung als PDF-Datei. ${post ? "Zusätzlich haben wir Ihren Ausweis per Post verschickt" : ""} 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 {
|
||||||
|
html = `
|
||||||
|
<p>Sehr geehrte*r ${rechnung.empfaenger},</p>
|
||||||
|
|
||||||
|
<p>im Anhang finden Sie Ihren geprüften Energieusweis inkl. Rechnung als PDF-Datei. ${post ? "Zusätzlich haben wir Ihren Ausweis per Post verschickt" : ""} 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.lex_office_id}</b></td>
|
||||||
|
</table>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<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: rechnung.email || rechnung.benutzer.email,
|
||||||
|
bcc: "info@online-energieausweis.org",
|
||||||
|
subject: `Ihr Originalausweis vom Ingenieurbüro Cornelsen (ID: ${ausweis.id})`,
|
||||||
|
html,
|
||||||
|
attachments: [{
|
||||||
|
filename: `ID_${ausweis.id}_Energieausweis.pdf`,
|
||||||
|
encoding: "binary",
|
||||||
|
content: Buffer.from(pdfAusweis),
|
||||||
|
contentType: "application/pdf",
|
||||||
|
contentDisposition: "attachment",
|
||||||
|
}, {
|
||||||
|
filename: `ID_${ausweis.id}_Datenblatt.pdf`,
|
||||||
|
encoding: "binary",
|
||||||
|
content: Buffer.from(pdfDatenblatt),
|
||||||
|
contentType: "application/pdf",
|
||||||
|
contentDisposition: "attachment",
|
||||||
|
}, {
|
||||||
|
filename: `ID_${ausweis.id}_Rechnung.pdf`,
|
||||||
|
encoding: "binary",
|
||||||
|
content: Buffer.from(pdfRechnung),
|
||||||
|
contentType: "application/pdf",
|
||||||
|
contentDisposition: "attachment",
|
||||||
|
}]
|
||||||
});
|
});
|
||||||
} else if (ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) {
|
|
||||||
await prisma.bedarfsausweisWohnen.update({
|
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
|
||||||
where: {
|
await prisma.verbrauchsausweisWohnen.update({
|
||||||
id: ausweis.id,
|
where: {
|
||||||
},
|
id: ausweis.id,
|
||||||
data: {
|
},
|
||||||
ausgestellt: true,
|
data: {
|
||||||
},
|
ausgestellt: true,
|
||||||
});
|
},
|
||||||
}
|
});
|
||||||
|
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
|
||||||
|
await prisma.verbrauchsausweisGewerbe.update({
|
||||||
|
where: {
|
||||||
|
id: ausweis.id,
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
ausgestellt: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
} else if (ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) {
|
||||||
|
await prisma.bedarfsausweisWohnen.update({
|
||||||
|
where: {
|
||||||
|
id: ausweis.id,
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
ausgestellt: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, 3000)
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -194,9 +194,7 @@ export const GET = defineApiRoute({
|
|||||||
.Registriernummer,
|
.Registriernummer,
|
||||||
kontrolldatei_angefragt: result
|
kontrolldatei_angefragt: result
|
||||||
.DatenregistraturResult
|
.DatenregistraturResult
|
||||||
.WEB_Service_Antwort.Datendatei
|
.WEB_Service_Antwort.Datendatei == 0 ? false : true,
|
||||||
? true
|
|
||||||
: false,
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -3,16 +3,17 @@ import { adminMiddleware } from "#lib/middleware/authorization.js";
|
|||||||
import { mollieClient } from "#lib/mollie.js";
|
import { mollieClient } from "#lib/mollie.js";
|
||||||
import { getPrismaAusweisAdapter } from "#lib/server/ausweis.js";
|
import { getPrismaAusweisAdapter } from "#lib/server/ausweis.js";
|
||||||
import { Prisma, prisma } from "#lib/server/prisma.js";
|
import { Prisma, prisma } from "#lib/server/prisma.js";
|
||||||
|
import { RefundStatus } from "@mollie/api-client";
|
||||||
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 PUT = defineApiRoute({
|
export const PUT = defineApiRoute({
|
||||||
input: z.object({
|
input: z.object({
|
||||||
uid_ausweis: UUidWithPrefix
|
ausweis_id: UUidWithPrefix
|
||||||
}),
|
}),
|
||||||
middleware: adminMiddleware,
|
middleware: adminMiddleware,
|
||||||
async fetch(input, context, transfer) {
|
async fetch(input, context, transfer) {
|
||||||
const adapter = getPrismaAusweisAdapter(input.uid_ausweis) as Prisma.VerbrauchsausweisWohnenDelegate;
|
const adapter = getPrismaAusweisAdapter(input.ausweis_id) as Prisma.VerbrauchsausweisWohnenDelegate;
|
||||||
|
|
||||||
if (!adapter) {
|
if (!adapter) {
|
||||||
throw new APIError({
|
throw new APIError({
|
||||||
@@ -23,7 +24,7 @@ export const PUT = defineApiRoute({
|
|||||||
|
|
||||||
const ausweis = await adapter.findUnique({
|
const ausweis = await adapter.findUnique({
|
||||||
where: {
|
where: {
|
||||||
uid: input.uid_ausweis
|
id: input.ausweis_id
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -36,7 +37,7 @@ export const PUT = defineApiRoute({
|
|||||||
|
|
||||||
const response = await adapter.findUnique({
|
const response = await adapter.findUnique({
|
||||||
where: {
|
where: {
|
||||||
uid: input.uid_ausweis
|
id: input.ausweis_id
|
||||||
},
|
},
|
||||||
select: {
|
select: {
|
||||||
rechnung: true
|
rechnung: true
|
||||||
@@ -46,7 +47,7 @@ export const PUT = defineApiRoute({
|
|||||||
if (!response || !response.rechnung) {
|
if (!response || !response.rechnung) {
|
||||||
await adapter.update({
|
await adapter.update({
|
||||||
where: {
|
where: {
|
||||||
uid: input.uid_ausweis
|
id: input.ausweis_id
|
||||||
},
|
},
|
||||||
data: {
|
data: {
|
||||||
storniert: true
|
storniert: true
|
||||||
@@ -63,7 +64,7 @@ export const PUT = defineApiRoute({
|
|||||||
|
|
||||||
await adapter.update({
|
await adapter.update({
|
||||||
where: {
|
where: {
|
||||||
uid: input.uid_ausweis
|
id: input.ausweis_id
|
||||||
},
|
},
|
||||||
data: {
|
data: {
|
||||||
storniert: true,
|
storniert: true,
|
||||||
@@ -94,10 +95,17 @@ export const PUT = defineApiRoute({
|
|||||||
value: rechnung.betrag.toFixed(2)
|
value: rechnung.betrag.toFixed(2)
|
||||||
},
|
},
|
||||||
metadata: {
|
metadata: {
|
||||||
rechnung_uid: rechnung.uid
|
rechnung_id: rechnung.id
|
||||||
},
|
},
|
||||||
testmode: true
|
testmode: true
|
||||||
})
|
})
|
||||||
|
|
||||||
|
if (refund.status === RefundStatus.failed) {
|
||||||
|
throw new APIError({
|
||||||
|
code: "INTERNAL_SERVER_ERROR",
|
||||||
|
message: "Rückerstattung konnte nicht durchgeführt werden, Mollie hat die Rückerstattung abgelehnt."
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
@@ -30,7 +30,7 @@ export const GET = defineApiRoute({
|
|||||||
// Falls der Nutzer nicht existiert, wird eine Fehlermeldung zurückgegeben.
|
// Falls der Nutzer nicht existiert, wird eine Fehlermeldung zurückgegeben.
|
||||||
const user = await prisma.benutzer.findUnique({
|
const user = await prisma.benutzer.findUnique({
|
||||||
where: {
|
where: {
|
||||||
email: input.email,
|
email: input.email.toLowerCase(),
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
import { prisma } from "#lib/server/prisma";
|
import { prisma } from "#lib/server/prisma.js";
|
||||||
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
||||||
|
|
||||||
export const GET = defineApiRoute({
|
export const GET = defineApiRoute({
|
||||||
|
|||||||
@@ -65,6 +65,9 @@ export const PUT = defineApiRoute({
|
|||||||
const ausweis = await adapter.findUnique({
|
const ausweis = await adapter.findUnique({
|
||||||
where: {
|
where: {
|
||||||
id: ausweis_id
|
id: ausweis_id
|
||||||
|
},
|
||||||
|
include: {
|
||||||
|
rechnung: true
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -75,6 +78,13 @@ export const PUT = defineApiRoute({
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ausweis.rechnung) {
|
||||||
|
throw new APIError({
|
||||||
|
code: "BAD_REQUEST",
|
||||||
|
message: "Eine Rechnung für diesen Ausweis existiert bereits.",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
if (ausweis.benutzer_id !== user.id) {
|
if (ausweis.benutzer_id !== user.id) {
|
||||||
throw new APIError({
|
throw new APIError({
|
||||||
code: "UNAUTHORIZED",
|
code: "UNAUTHORIZED",
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { UUidWithPrefix } from "#components/Ausweis/types.js";
|
import { UUidWithPrefix } from "#components/Ausweis/types.js";
|
||||||
|
import { VALID_UUID_PREFIXES } from "#lib/constants.js";
|
||||||
import { generatePrefixedId } from "#lib/db.js";
|
import { generatePrefixedId } from "#lib/db.js";
|
||||||
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
|
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
|
||||||
import { prisma } from "#lib/server/prisma.js";
|
import { prisma } from "#lib/server/prisma.js";
|
||||||
@@ -52,7 +53,7 @@ export const PUT = defineApiRoute({
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const id = generatePrefixedId(9, "VW");
|
const id = generatePrefixedId(9, VALID_UUID_PREFIXES.VerbrauchsausweisWohnen);
|
||||||
|
|
||||||
const createdAusweis = await prisma.verbrauchsausweisWohnen.create({
|
const createdAusweis = await prisma.verbrauchsausweisWohnen.create({
|
||||||
data: {
|
data: {
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ export const GET: APIRoute = async (Astro) => {
|
|||||||
const file = await getS3File("ibc-images", `${image.id}.jpg`);
|
const file = await getS3File("ibc-images", `${image.id}.jpg`);
|
||||||
|
|
||||||
if (!file) {
|
if (!file) {
|
||||||
const file = await getS3File("ibc-images", `${image.name}.jpg`)
|
const file = await getS3File("ibc-images", image.name)
|
||||||
|
|
||||||
if (!file) {
|
if (!file) {
|
||||||
return new Response(null, { status: 404 })
|
return new Response(null, { status: 404 })
|
||||||
|
|||||||
@@ -23,70 +23,144 @@ const totalPages = await prisma.objekt.count({
|
|||||||
} : {}
|
} : {}
|
||||||
})
|
})
|
||||||
|
|
||||||
const objekte = await prisma.objekt.findMany({
|
let objekte = []
|
||||||
where: user.rolle === Enums.BenutzerRolle.USER ? {
|
if (id) {
|
||||||
benutzer: {
|
objekte = await prisma.objekt.findMany({
|
||||||
id: user.id
|
where: user.rolle === Enums.BenutzerRolle.USER ? {
|
||||||
|
benutzer: {
|
||||||
|
id: user.id
|
||||||
|
},
|
||||||
|
} : {
|
||||||
|
...(id ? {
|
||||||
|
OR: [
|
||||||
|
{
|
||||||
|
aufnahmen: {
|
||||||
|
every: {
|
||||||
|
verbrauchsausweise_gewerbe: {
|
||||||
|
some: {
|
||||||
|
id: {
|
||||||
|
contains: id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
aufnahmen: {
|
||||||
|
every: {
|
||||||
|
verbrauchsausweise_wohnen: {
|
||||||
|
some: {
|
||||||
|
id: {
|
||||||
|
contains: id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
aufnahmen: {
|
||||||
|
every: {
|
||||||
|
bedarfsausweise_wohnen: {
|
||||||
|
some: {
|
||||||
|
id: {
|
||||||
|
contains: id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},]} : {})
|
||||||
},
|
},
|
||||||
} : {
|
orderBy: {
|
||||||
...(id ? {OR: [
|
erstellungsdatum: "desc"
|
||||||
{
|
},
|
||||||
aufnahmen: {
|
include: {
|
||||||
every: {
|
aufnahmen: {
|
||||||
verbrauchsausweise_gewerbe: {
|
include: {
|
||||||
some: {
|
bilder: true,
|
||||||
id: {
|
unterlagen: true,
|
||||||
contains: id
|
bedarfsausweise_wohnen: true,
|
||||||
}
|
verbrauchsausweise_gewerbe: true,
|
||||||
}
|
verbrauchsausweise_wohnen: true,
|
||||||
},
|
bedarfsausweise_gewerbe: true,
|
||||||
}
|
geg_nachweise_gewerbe: true,
|
||||||
|
geg_nachweise_wohnen: true
|
||||||
}
|
}
|
||||||
},
|
|
||||||
{
|
|
||||||
aufnahmen: {
|
|
||||||
every: {
|
|
||||||
verbrauchsausweise_wohnen: {
|
|
||||||
some: {
|
|
||||||
id: {
|
|
||||||
contains: id
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
aufnahmen: {
|
|
||||||
every: {
|
|
||||||
bedarfsausweise_wohnen: {
|
|
||||||
some: {
|
|
||||||
id: {
|
|
||||||
contains: id
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},]} : {})
|
|
||||||
},
|
|
||||||
orderBy: {
|
|
||||||
erstellungsdatum: "desc"
|
|
||||||
},
|
|
||||||
include: {
|
|
||||||
aufnahmen: {
|
|
||||||
include: {
|
|
||||||
bilder: true,
|
|
||||||
unterlagen: true,
|
|
||||||
bedarfsausweise_wohnen: true,
|
|
||||||
verbrauchsausweise_gewerbe: true,
|
|
||||||
verbrauchsausweise_wohnen: true
|
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
},
|
take: 25,
|
||||||
take: 25,
|
skip: (page - 1) * 25
|
||||||
skip: (page - 1) * 25
|
})
|
||||||
})
|
} else {
|
||||||
|
objekte = await prisma.objekt.findMany({
|
||||||
|
where: user.rolle === Enums.BenutzerRolle.USER ? {
|
||||||
|
benutzer: {
|
||||||
|
id: user.id
|
||||||
|
},
|
||||||
|
} : {
|
||||||
|
OR: [
|
||||||
|
{
|
||||||
|
aufnahmen: {
|
||||||
|
every: {
|
||||||
|
verbrauchsausweise_gewerbe: {
|
||||||
|
some: {
|
||||||
|
ausgestellt: false,
|
||||||
|
bestellt: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
aufnahmen: {
|
||||||
|
every: {
|
||||||
|
verbrauchsausweise_wohnen: {
|
||||||
|
some: {
|
||||||
|
ausgestellt: false,
|
||||||
|
bestellt: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
aufnahmen: {
|
||||||
|
every: {
|
||||||
|
bedarfsausweise_wohnen: {
|
||||||
|
some: {
|
||||||
|
ausgestellt: false,
|
||||||
|
bestellt: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
orderBy: {
|
||||||
|
erstellungsdatum: "desc"
|
||||||
|
},
|
||||||
|
include: {
|
||||||
|
aufnahmen: {
|
||||||
|
include: {
|
||||||
|
bilder: true,
|
||||||
|
unterlagen: true,
|
||||||
|
bedarfsausweise_wohnen: true,
|
||||||
|
verbrauchsausweise_gewerbe: true,
|
||||||
|
verbrauchsausweise_wohnen: true,
|
||||||
|
bedarfsausweise_gewerbe: true,
|
||||||
|
geg_nachweise_gewerbe: true,
|
||||||
|
geg_nachweise_wohnen: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
take: 25,
|
||||||
|
skip: (page - 1) * 25
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<UserLayout title="Objekte" {user}>
|
<UserLayout title="Objekte" {user}>
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import AusweisLayout from "#layouts/AusweisLayoutPruefung.astro";
|
|||||||
import { Enums } from "#lib/client/prisma";
|
import { Enums } from "#lib/client/prisma";
|
||||||
import { getCurrentUser } from "#lib/server/user";
|
import { getCurrentUser } from "#lib/server/user";
|
||||||
import { getAusweisartFromId } from "#components/Ausweis/types";
|
import { getAusweisartFromId } from "#components/Ausweis/types";
|
||||||
import { getAufnahme, getBedarfsausweisWohnen, getBilder, getObjekt, getUnterlagen, getVerbrauchsausweisGewerbe, getVerbrauchsausweisWohnen } from "#lib/server/db";
|
import { getAufnahme, getBedarfsausweisWohnen, getBilder, getObjekt, getRechnung, getUnterlagen, getVerbrauchsausweisGewerbe, getVerbrauchsausweisWohnen } from "#lib/server/db";
|
||||||
|
|
||||||
// Man sollte nur auf diese Seite kommen, wenn ein Ausweis bereits vorliegt und in der Datenbank abgespeichert wurde.
|
// Man sollte nur auf diese Seite kommen, wenn ein Ausweis bereits vorliegt und in der Datenbank abgespeichert wurde.
|
||||||
|
|
||||||
@@ -15,7 +15,7 @@ const user = await getCurrentUser(Astro) || {}
|
|||||||
const params = new URLSearchParams(await Astro.request.text());
|
const params = new URLSearchParams(await Astro.request.text());
|
||||||
const searchParams = Astro.url.searchParams;
|
const searchParams = Astro.url.searchParams;
|
||||||
|
|
||||||
let ausweis, aufnahme, objekt, ausweisart, bilder, unterlagen, partner_code;
|
let ausweis, aufnahme, objekt, ausweisart, bilder, unterlagen, partner_code, rechnung = null;
|
||||||
|
|
||||||
if (!params.has("ausweis") || !params.has("aufnahme") || !params.has("objekt") || !params.has("bilder") || !params.has("ausweisart")) {
|
if (!params.has("ausweis") || !params.has("aufnahme") || !params.has("objekt") || !params.has("bilder") || !params.has("ausweisart")) {
|
||||||
// Rechnung und Ausweis als GET parameter
|
// Rechnung und Ausweis als GET parameter
|
||||||
@@ -40,6 +40,9 @@ if (!params.has("ausweis") || !params.has("aufnahme") || !params.has("objekt") |
|
|||||||
objekt = await getObjekt(aufnahme?.objekt_id)
|
objekt = await getObjekt(aufnahme?.objekt_id)
|
||||||
bilder = await getBilder(ausweis.aufnahme_id)
|
bilder = await getBilder(ausweis.aufnahme_id)
|
||||||
unterlagen = await getUnterlagen(ausweis.aufnahme_id)
|
unterlagen = await getUnterlagen(ausweis.aufnahme_id)
|
||||||
|
if (ausweis.rechnung_id) {
|
||||||
|
rechnung = await getRechnung(ausweis.rechnung_id)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// Nichts ist vorhanden
|
// Nichts ist vorhanden
|
||||||
return Astro.redirect("/404")
|
return Astro.redirect("/404")
|
||||||
@@ -65,6 +68,6 @@ if (!params.has("ausweis") || !params.has("aufnahme") || !params.has("objekt") |
|
|||||||
---
|
---
|
||||||
|
|
||||||
<AusweisLayout title="Kundendaten Aufnehmen - IBCornelsen">
|
<AusweisLayout title="Kundendaten Aufnehmen - IBCornelsen">
|
||||||
<KundendatenModule {user} {ausweis} {objekt} {aufnahme} {bilder} {ausweisart} {unterlagen} {partner_code} aktiveBezahlmethode={Enums.Bezahlmethoden.paypal} client:only ></KundendatenModule>
|
<KundendatenModule {user} {ausweis} {objekt} {aufnahme} {bilder} {rechnung} {ausweisart} {unterlagen} {partner_code} aktiveBezahlmethode={Enums.Bezahlmethoden.paypal} client:only ></KundendatenModule>
|
||||||
</AusweisLayout>
|
</AusweisLayout>
|
||||||
|
|
||||||
|
|||||||
@@ -50,9 +50,9 @@ export const GET: APIRoute = async (Astro) => {
|
|||||||
// Dieser Ausweis wurde mit der alten Version erstellt, das PDF sollte bereits existieren.
|
// Dieser Ausweis wurde mit der alten Version erstellt, das PDF sollte bereits existieren.
|
||||||
pdf = await getS3File("ibc-pdfs", `ID_${id[1]}_Energieausweis.pdf`)
|
pdf = await getS3File("ibc-pdfs", `ID_${id[1]}_Energieausweis.pdf`)
|
||||||
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
|
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
|
||||||
pdf = await pdfVerbrauchsausweisWohnen(ausweis as VerbrauchsausweisWohnenClient, aufnahme, objekt, bilder, user);
|
pdf = await pdfVerbrauchsausweisWohnen(ausweis as VerbrauchsausweisWohnenClient, aufnahme, objekt, bilder, user, !ausweis.ausgestellt);
|
||||||
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
|
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
|
||||||
pdf = await pdfVerbrauchsausweisGewerbe(ausweis as VerbrauchsausweisGewerbeClient, aufnahme, objekt, bilder, user);
|
pdf = await pdfVerbrauchsausweisGewerbe(ausweis as VerbrauchsausweisGewerbeClient, aufnahme, objekt, bilder, user, !ausweis.ausgestellt);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new Response(pdf, {
|
return new Response(pdf, {
|
||||||
|
|||||||
@@ -2,11 +2,11 @@ import { BenutzerClient, getAusweisartFromId, VerbrauchsausweisGewerbeClient, Ve
|
|||||||
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
|
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
|
||||||
import { pdfDatenblattVerbrauchsausweisGewerbe } from "#lib/pdf/pdfDatenblattVerbrauchsausweisGewerbe.js";
|
import { pdfDatenblattVerbrauchsausweisGewerbe } from "#lib/pdf/pdfDatenblattVerbrauchsausweisGewerbe.js";
|
||||||
import { pdfDatenblattVerbrauchsausweisWohnen } from "#lib/pdf/pdfDatenblattVerbrauchsausweisWohnen.js";
|
import { pdfDatenblattVerbrauchsausweisWohnen } from "#lib/pdf/pdfDatenblattVerbrauchsausweisWohnen.js";
|
||||||
import { Aufnahme, Benutzer, Bild, Enums, Objekt, VerbrauchsausweisGewerbe, VerbrauchsausweisWohnen } from "#lib/client/prisma.js";
|
import { Aufnahme, Benutzer, Bild, Enums, Objekt, Rechnung, VerbrauchsausweisGewerbe, VerbrauchsausweisWohnen } from "#lib/client/prisma.js";
|
||||||
import { APIRoute } from "astro";
|
import { APIRoute } from "astro";
|
||||||
import { createCaller } from "src/astro-typesafe-api-caller.js";
|
import { createCaller } from "src/astro-typesafe-api-caller.js";
|
||||||
import { getS3File } from "#lib/s3.js";
|
import { getS3File } from "#lib/s3.js";
|
||||||
import { getAufnahme, getBilder, getObjekt, getVerbrauchsausweisGewerbe, getVerbrauchsausweisWohnen } from "#lib/server/db.js";
|
import { getAufnahme, getBilder, getObjekt, getRechnung, getVerbrauchsausweisGewerbe, getVerbrauchsausweisWohnen } from "#lib/server/db.js";
|
||||||
import { getCurrentUser } from "#lib/server/user.js";
|
import { getCurrentUser } from "#lib/server/user.js";
|
||||||
|
|
||||||
export const GET: APIRoute = async (Astro) => {
|
export const GET: APIRoute = async (Astro) => {
|
||||||
@@ -21,8 +21,8 @@ export const GET: APIRoute = async (Astro) => {
|
|||||||
let ausweis: VerbrauchsausweisWohnen | VerbrauchsausweisGewerbe | null = null;
|
let ausweis: VerbrauchsausweisWohnen | VerbrauchsausweisGewerbe | null = null;
|
||||||
let aufnahme: Aufnahme = {} as Aufnahme;
|
let aufnahme: Aufnahme = {} as Aufnahme;
|
||||||
let objekt: Objekt = {} as Objekt;
|
let objekt: Objekt = {} as Objekt;
|
||||||
let user: Benutzer = {} as Benutzer;
|
|
||||||
let bilder: Bild[] = []
|
let bilder: Bild[] = []
|
||||||
|
let rechnung: Rechnung | null = null;
|
||||||
|
|
||||||
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
|
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
|
||||||
ausweis = await getVerbrauchsausweisWohnen(ausweis_id)
|
ausweis = await getVerbrauchsausweisWohnen(ausweis_id)
|
||||||
@@ -41,7 +41,9 @@ export const GET: APIRoute = async (Astro) => {
|
|||||||
|
|
||||||
bilder = await getBilder(ausweis.aufnahme_id)
|
bilder = await getBilder(ausweis.aufnahme_id)
|
||||||
|
|
||||||
user = await getCurrentUser(Astro)
|
if (ausweis.rechnung_id) {
|
||||||
|
rechnung = await getRechnung(ausweis.rechnung_id)
|
||||||
|
}
|
||||||
|
|
||||||
let pdf: Uint8Array<ArrayBufferLike> | null = null;
|
let pdf: Uint8Array<ArrayBufferLike> | null = null;
|
||||||
if (/[A-Z]{2}[0-9]{8}/.test(ausweis.id)) {
|
if (/[A-Z]{2}[0-9]{8}/.test(ausweis.id)) {
|
||||||
@@ -49,9 +51,9 @@ export const GET: APIRoute = async (Astro) => {
|
|||||||
// Dieser Ausweis wurde mit der alten Version erstellt, das PDF sollte bereits existieren.
|
// Dieser Ausweis wurde mit der alten Version erstellt, das PDF sollte bereits existieren.
|
||||||
pdf = await getS3File("ibc-pdfs", `ID_${id[1]}_Datenblatt.pdf`)
|
pdf = await getS3File("ibc-pdfs", `ID_${id[1]}_Datenblatt.pdf`)
|
||||||
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
|
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
|
||||||
pdf = await pdfDatenblattVerbrauchsausweisWohnen(ausweis as VerbrauchsausweisWohnenClient, aufnahme, objekt, user, bilder);
|
pdf = await pdfDatenblattVerbrauchsausweisWohnen(ausweis as VerbrauchsausweisWohnenClient, aufnahme, objekt, rechnung, bilder);
|
||||||
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
|
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
|
||||||
pdf = await pdfDatenblattVerbrauchsausweisGewerbe(ausweis as VerbrauchsausweisGewerbeClient, aufnahme, objekt, user, bilder);
|
pdf = await pdfDatenblattVerbrauchsausweisGewerbe(ausweis as VerbrauchsausweisGewerbeClient, aufnahme, objekt, rechnung, bilder);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new Response(pdf, {
|
return new Response(pdf, {
|
||||||
@@ -65,31 +67,17 @@ export const POST: APIRoute = async (Astro) => {
|
|||||||
const body = await Astro.request.text();
|
const body = await Astro.request.text();
|
||||||
const params = new URLSearchParams(body);
|
const params = new URLSearchParams(body);
|
||||||
|
|
||||||
const caller = createCaller(Astro);
|
|
||||||
|
|
||||||
const ausweis = JSON.parse(params.get("ausweis") || "{}");
|
const ausweis = JSON.parse(params.get("ausweis") || "{}");
|
||||||
const aufnahme = JSON.parse(params.get("aufnahme") || "{}");
|
const aufnahme = JSON.parse(params.get("aufnahme") || "{}");
|
||||||
const objekt = JSON.parse(params.get("objekt") || "{}");
|
const objekt = JSON.parse(params.get("objekt") || "{}");
|
||||||
const bilder = JSON.parse(params.get("bilder") || "{}");
|
const bilder = JSON.parse(params.get("bilder") || "{}");
|
||||||
const ausweisart: Enums.Ausweisart = JSON.parse(params.get("ausweisart") || "")
|
const ausweisart: Enums.Ausweisart = JSON.parse(params.get("ausweisart") || "")
|
||||||
|
|
||||||
let user: BenutzerClient = {};
|
|
||||||
|
|
||||||
try {
|
|
||||||
user = await caller.user.self.GET.fetch(undefined, {
|
|
||||||
headers: {
|
|
||||||
Authorization: `Bearer ${Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value}`
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} catch (e) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
let pdf: Uint8Array<ArrayBufferLike> | null = null;
|
let pdf: Uint8Array<ArrayBufferLike> | null = null;
|
||||||
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
|
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
|
||||||
pdf = await pdfDatenblattVerbrauchsausweisWohnen(ausweis, aufnahme, objekt, user, bilder);
|
pdf = await pdfDatenblattVerbrauchsausweisWohnen(ausweis, aufnahme, objekt, null, bilder);
|
||||||
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
|
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
|
||||||
pdf = await pdfDatenblattVerbrauchsausweisGewerbe(ausweis, aufnahme, objekt, user, bilder);
|
pdf = await pdfDatenblattVerbrauchsausweisGewerbe(ausweis, aufnahme, objekt, null, bilder);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new Response(pdf, {
|
return new Response(pdf, {
|
||||||
|
|||||||
37
src/testing/ausweise-bw-fix-ausgestellt.ts
Normal file
37
src/testing/ausweise-bw-fix-ausgestellt.ts
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
import { Enums, prisma } from "#lib/server/prisma.js";
|
||||||
|
|
||||||
|
let start = 1;
|
||||||
|
let limit = 10;
|
||||||
|
|
||||||
|
const existing_bedarfsausweiswohnen_list = await prisma.bedarfsausweisWohnen.findMany({
|
||||||
|
where: {
|
||||||
|
rechnung_id: null
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
for (const ausweis of existing_bedarfsausweiswohnen_list) {
|
||||||
|
if (ausweis.bestellt == true && ausweis.benutzer_id != "USCTJ2VV"){
|
||||||
|
console.log(
|
||||||
|
'ID:' + ausweis.id +
|
||||||
|
' Reg.Nr:' + ausweis.registriernummer +
|
||||||
|
' Rechnung_id: ' + ausweis.rechnung_id +
|
||||||
|
' Bestellt: ' + ausweis.bestellt +
|
||||||
|
' Ausgestellt: ' + ausweis.ausgestellt +
|
||||||
|
' Ausgestellt am: ' + ausweis.ausstellungsdatum
|
||||||
|
);
|
||||||
|
|
||||||
|
await prisma.bedarfsausweisWohnen.update({
|
||||||
|
where: {
|
||||||
|
id: ausweis.id
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
bestellt: false,
|
||||||
|
ausgestellt: false,
|
||||||
|
ausstellungsdatum: null
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// if (start >= limit) break;
|
||||||
|
start++;
|
||||||
|
}
|
||||||
|
}
|
||||||
52
src/testing/ausweise-fix-rechnungsid.ts
Normal file
52
src/testing/ausweise-fix-rechnungsid.ts
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
import { Enums, prisma } from "#lib/server/prisma.js";
|
||||||
|
import Papa from "papaparse"
|
||||||
|
import * as fs from "fs";
|
||||||
|
import { fileURLToPath } from "url";
|
||||||
|
import { generatePrefixedId } from "#lib/db.js";
|
||||||
|
import { VALID_UUID_PREFIXES } from "#lib/constants.js";
|
||||||
|
|
||||||
|
const path = fileURLToPath(new URL("./rechnungen.csv", import.meta.url));
|
||||||
|
|
||||||
|
if (!fs.existsSync(path)) {
|
||||||
|
throw new Error(`${path} existiert nicht.`)
|
||||||
|
}
|
||||||
|
|
||||||
|
const file = fs.createReadStream(path, "utf8");
|
||||||
|
Papa.parse(file, {
|
||||||
|
header: true,
|
||||||
|
async complete(results, file) {
|
||||||
|
let i = 0;
|
||||||
|
for (const rechnung of results.data as any) {
|
||||||
|
i++
|
||||||
|
if (i % 1000 === 0) {
|
||||||
|
console.log(`Processed ${i} of ${results.data.length}, ${Math.round(i / results.data.length * 100)}%`)
|
||||||
|
}
|
||||||
|
const existing_rechnung = await prisma.rechnung.findFirst({
|
||||||
|
where: {
|
||||||
|
alte_id: parseInt(rechnung.id)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
if (existing_rechnung) {
|
||||||
|
const existing_bedarfsausweiswohnen = await prisma.bedarfsausweisWohnen.findFirst({
|
||||||
|
where: {
|
||||||
|
alte_ausweis_id: parseInt(rechnung.ausweis_id)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
if (existing_bedarfsausweiswohnen){
|
||||||
|
if (existing_bedarfsausweiswohnen.rechnung_id != existing_rechnung.id){
|
||||||
|
console.log('Rechnungsnummer weicht ab. Alte Ausweis Id:'+ rechnung.ausweis_id + ': ' + existing_bedarfsausweiswohnen.rechnung_id + ' vs ' + existing_rechnung.id);
|
||||||
|
//Todo: Rechnungsid updaten
|
||||||
|
} else {
|
||||||
|
//console.log('Rechnungsnummer Abgleich ok. Alte Ausweis Id:'+ rechnung.ausweis_id + ': ' + existing_bedarfsausweiswohnen.rechnung_id + ' vs ' + existing_rechnung.id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
console.log('Rechnung existiert nicht: '+ parseInt(rechnung.id));
|
||||||
|
}
|
||||||
|
|
||||||
|
//if (i > 10000) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
37
src/testing/ausweise-vg-fix-ausgestellt.ts
Normal file
37
src/testing/ausweise-vg-fix-ausgestellt.ts
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
import { Enums, prisma } from "#lib/server/prisma.js";
|
||||||
|
|
||||||
|
let start = 1;
|
||||||
|
let limit = 10;
|
||||||
|
|
||||||
|
const existing_verbauchsauweisgewerbe_list = await prisma.verbrauchsausweisGewerbe.findMany({
|
||||||
|
where: {
|
||||||
|
rechnung_id: null
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
for (const ausweis of existing_verbauchsauweisgewerbe_list) {
|
||||||
|
if (ausweis.bestellt == true && ausweis.benutzer_id != "USCTJ2VV"){
|
||||||
|
console.log(
|
||||||
|
'ID:' + ausweis.id +
|
||||||
|
' Reg.Nr:' + ausweis.registriernummer +
|
||||||
|
' Rechnung_id: ' + ausweis.rechnung_id +
|
||||||
|
' Bestellt: ' + ausweis.bestellt +
|
||||||
|
' Ausgestellt: ' + ausweis.ausgestellt +
|
||||||
|
' Ausgestellt am: ' + ausweis.ausstellungsdatum
|
||||||
|
);
|
||||||
|
|
||||||
|
await prisma.verbrauchsausweisGewerbe.update({
|
||||||
|
where: {
|
||||||
|
id: ausweis.id
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
bestellt: false,
|
||||||
|
ausgestellt: false,
|
||||||
|
ausstellungsdatum: null
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// if (start >= limit) break;
|
||||||
|
start++;
|
||||||
|
}
|
||||||
|
}
|
||||||
37
src/testing/ausweise-vw-fix-ausgestellt.ts
Normal file
37
src/testing/ausweise-vw-fix-ausgestellt.ts
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
import { Enums, prisma } from "#lib/server/prisma.js";
|
||||||
|
|
||||||
|
let start = 1;
|
||||||
|
let limit = 10;
|
||||||
|
|
||||||
|
const existing_verbauchsausweiswohnen_list = await prisma.verbrauchsausweisWohnen.findMany({
|
||||||
|
where: {
|
||||||
|
rechnung_id: null
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
for (const ausweis of existing_verbauchsausweiswohnen_list) {
|
||||||
|
if (ausweis.bestellt == true && ausweis.benutzer_id != "USCTJ2VV"){
|
||||||
|
console.log(
|
||||||
|
'ID:' + ausweis.id +
|
||||||
|
' Reg.Nr:' + ausweis.registriernummer +
|
||||||
|
' Rechnung_id: ' + ausweis.rechnung_id +
|
||||||
|
' Bestellt: ' + ausweis.bestellt +
|
||||||
|
' Ausgestellt: ' + ausweis.ausgestellt +
|
||||||
|
' Ausgestellt am: ' + ausweis.ausstellungsdatum
|
||||||
|
);
|
||||||
|
|
||||||
|
await prisma.verbrauchsausweisWohnen.update({
|
||||||
|
where: {
|
||||||
|
id: ausweis.id
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
bestellt: false,
|
||||||
|
ausgestellt: false,
|
||||||
|
ausstellungsdatum: null
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// if (start >= limit) break;
|
||||||
|
start++;
|
||||||
|
}
|
||||||
|
}
|
||||||
46
src/testing/nutzer-fix-alteid.ts
Normal file
46
src/testing/nutzer-fix-alteid.ts
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
import { Enums, prisma } from "#lib/server/prisma.js";
|
||||||
|
import Papa from "papaparse"
|
||||||
|
import * as fs from "fs";
|
||||||
|
import { fileURLToPath } from "url";
|
||||||
|
import { generatePrefixedId } from "#lib/db.js";
|
||||||
|
import { VALID_UUID_PREFIXES } from "#lib/constants.js";
|
||||||
|
|
||||||
|
const path = fileURLToPath(new URL("./users.csv", import.meta.url));
|
||||||
|
|
||||||
|
if (!fs.existsSync(path)) {
|
||||||
|
throw new Error(`${path} existiert nicht.`)
|
||||||
|
}
|
||||||
|
|
||||||
|
const file = fs.createReadStream(path, "utf8");
|
||||||
|
Papa.parse(file, {
|
||||||
|
header: true,
|
||||||
|
async complete(results, file) {
|
||||||
|
let i = 0;
|
||||||
|
for (const user of results.data as any) {
|
||||||
|
i++
|
||||||
|
if (i % 100 === 0) {
|
||||||
|
//console.log(`Processed ${i} of ${results.data.length}, ${Math.round(i / results.data.length * 100)}%`)
|
||||||
|
}
|
||||||
|
const existing = await prisma.benutzer.findFirst({
|
||||||
|
where: {
|
||||||
|
email: user.email
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
if (existing) {
|
||||||
|
if (existing.alte_id == null){
|
||||||
|
console.log('User: ' + user.email + ' fehlt alte id ('+user.id+')');
|
||||||
|
await prisma.benutzer.update({
|
||||||
|
where: {
|
||||||
|
email: user.email
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
alte_id: parseInt(user.id)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
@@ -19,7 +19,7 @@ Papa.parse(file, {
|
|||||||
let i = 0;
|
let i = 0;
|
||||||
for (const rechnung of results.data as any) {
|
for (const rechnung of results.data as any) {
|
||||||
i++
|
i++
|
||||||
if (i % 50 === 0) {
|
if (i % 500 === 0) {
|
||||||
console.log(`Processed ${i} of ${results.data.length}, ${Math.round(i / results.data.length * 100)}%`)
|
console.log(`Processed ${i} of ${results.data.length}, ${Math.round(i / results.data.length * 100)}%`)
|
||||||
}
|
}
|
||||||
const existing = await prisma.rechnung.findFirst({
|
const existing = await prisma.rechnung.findFirst({
|
||||||
@@ -29,7 +29,7 @@ Papa.parse(file, {
|
|||||||
})
|
})
|
||||||
|
|
||||||
if (existing) {
|
if (existing) {
|
||||||
console.log(`Rechnung für ${rechnung.id} existiert bereits.`);
|
//console.log(`Rechnung für ${rechnung.id} existiert bereits.`);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -166,6 +166,7 @@ Papa.parse(file, {
|
|||||||
await prisma.rechnung.create({
|
await prisma.rechnung.create({
|
||||||
data
|
data
|
||||||
});
|
});
|
||||||
|
console.log('User: ' + rechnung.user_id + ' Rechnung:' + rechnung.id);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.log(e);
|
console.log(e);
|
||||||
continue;
|
continue;
|
||||||
|
|||||||
4
surreal/Anteilshaber.sql
Normal file
4
surreal/Anteilshaber.sql
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
DEFINE TABLE Anteilshaber TYPE RELATION IN Benutzer OUT VerbrauchsausweisWohnen | VerbrauchsausweisGewerbe | BedarfsausweisWohnen | BedarfsausweisGewerbe | GEGNachweisWohnen | GEGNachweisGewerbe SCHEMAFULL PERMISSIONS NONE;
|
||||||
|
|
||||||
|
DEFINE FIELD rolle ON TABLE Anteilshaber
|
||||||
|
TYPE 'Besteller' | 'Aussteller' | 'Zuarbeiter' | 'Interessierter';
|
||||||
109
surreal/Aufnahme.sql
Normal file
109
surreal/Aufnahme.sql
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
DEFINE TABLE Aufnahme SCHEMAFULL;
|
||||||
|
|
||||||
|
DEFINE FIELD benutzer ON TABLE Aufnahme TYPE record<Benutzer>;
|
||||||
|
-- @zod.describe("Art des Gebäudes und seiner primären Nutzungsart")
|
||||||
|
DEFINE FIELD gebaeudetyp ON TABLE Aufnahme TYPE string;
|
||||||
|
-- @zod.describe("Betrachteter Teil des Gebäudes, z.B. Gesamtgebäude, Wohnteil, Gewerbeteil")
|
||||||
|
DEFINE FIELD gebaeudeteil ON TABLE Aufnahme TYPE string;
|
||||||
|
-- @zod.describe("Alle Jahre in denen das Gebäude konstruiert oder grundlegend verändert wurde")
|
||||||
|
DEFINE FIELD baujahr_gebaeude ON TABLE Aufnahme TYPE array<int>;
|
||||||
|
-- @zod.describe("Alle Jahre in denen die Heizung eingebaut oder grundlegend verändert wurde")
|
||||||
|
DEFINE FIELD baujahr_heizung ON TABLE Aufnahme TYPE array<int>;
|
||||||
|
-- @zod.describe("Alle Jahre in denen die Klimaanlage eingebaut oder grundlegend verändert wurde")
|
||||||
|
DEFINE FIELD baujahr_klima ON TABLE Aufnahme TYPE array<int>;
|
||||||
|
-- @zod.describe("Anzahl der (Wohn)Einheiten im Gebäude")
|
||||||
|
DEFINE FIELD einheiten ON TABLE Aufnahme TYPE option<int>;
|
||||||
|
-- @zod.describe("Wohnfläche bei Wohngebäuden, Nutzfläche bei Gewerbegebäuden")
|
||||||
|
DEFINE FIELD flaeche ON TABLE Aufnahme TYPE option<int>;
|
||||||
|
-- @zod.describe("(energetische) Nutzfläche des Gebäudes. Bei Gewerbegebäuden entspricht Sie der Nutzfläche")
|
||||||
|
DEFINE FIELD nutzflaeche ON TABLE Aufnahme TYPE option<int>;
|
||||||
|
-- @zod.describe("Falls das Gebäude energetisch saniert ist, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD saniert ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Ob ein Keller vorhanden, beheizt oder unbeheizt ist")
|
||||||
|
DEFINE FIELD keller ON TABLE Aufnahme TYPE "BEHEIZT" | "UNBEHEIZT" | "NICHT_VORHANDEN";
|
||||||
|
-- @zod.describe("Ob ein Dachgeschoss vorhanden, beheizt oder unbeheizt ist")
|
||||||
|
DEFINE FIELD dachgeschoss ON TABLE Aufnahme TYPE "BEHEIZT" | "UNBEHEIZT" | "NICHT_VORHANDEN";
|
||||||
|
-- @zod.describe("Art der Gebäudelüftung")
|
||||||
|
DEFINE FIELD lueftung ON TABLE Aufnahme TYPE "Fensterlueftung" | "Schachtlueftung" | "LueftungsanlageMitWaermerueckgewinnung" | "LueftungsanlageOhneWaermerueckgewinnung";
|
||||||
|
-- @zod.describe("Art der Gebäudekühlung")
|
||||||
|
DEFINE FIELD kuehlung ON TABLE Aufnahme TYPE option<string>;
|
||||||
|
-- @zod.describe("Prozentualer Leerstand des Gebäudes in einem durchschnittlichen Jahr")
|
||||||
|
DEFINE FIELD leerstand ON TABLE Aufnahme TYPE option<int>;
|
||||||
|
|
||||||
|
-- @zod.describe("Falls der Heizungsverbrauch alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD alternative_heizung ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls der Warmwasserverbrauch alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD alternative_warmwasser ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls die Lüftung alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD alternative_lueftung ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls die Kühlung alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD alternative_kuehlung ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
|
||||||
|
-- @zod.describe("Datum an dem der Kunde die Aufnahme erstellt hat")
|
||||||
|
DEFINE FIELD erstellungsdatum ON TABLE Aufnahme TYPE datetime DEFAULT time::now();
|
||||||
|
|
||||||
|
-- @zod.describe("Falls das Gebäude über eine Zentralbeheizung verfügt, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD zentralheizung ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls das Gebäude über ein Solarsystem für Warmwasser verfügt, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD solarsystem_warmwasser ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls die Warmwasserrohre des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD warmwasser_rohre_gedaemmt ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls das Gebäude über einen Niedertemperaturkessel verfügt, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD niedertemperatur_kessel ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls das Gebäude über einen Brennwertkessel verfügt, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD brennwert_kessel ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls die Heizungsrohre des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD heizungsrohre_gedaemmt ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
DEFINE FIELD standard_kessel ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls das Gebäude über eine Wärmepumpe verfügt, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD waermepumpe ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls das Gebäude über einen Raumtemperaturregler verfügt, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD raum_temperatur_regler ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls das Gebäude über eine Photovoltaikanlage verfügt, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD photovoltaik ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls das Gebäude über einen Durchlauferhitzer verfügt, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD durchlauf_erhitzer ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
DEFINE FIELD einzelofen ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls das Gebäude über eine Zirkulationspumpe verfügt, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD zirkulation ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls die Fenster des Gebäudes einfach gedämmt sind, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD einfach_verglasung ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls die Fenster des Gebäudes dreifach gedämmt sind, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD dreifach_verglasung ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls die Fenster des Gebäudes teilweise undicht sind, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD fenster_teilweise_undicht ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls die Fenster des Gebäudes doppelt gedämmt sind, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD doppel_verglasung ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls die Fenster des Gebäudes dicht sind, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD fenster_dicht ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls das Gebäude über gedämmte Rolllädenkästen verfügt, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD rolllaeden_kaesten_gedaemmt ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls die Fenster des Gebäudes isolier Verglasung haben, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD isolier_verglasung ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls die Türen des Gebäudes undicht sind, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD tueren_undicht ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls die Türen des Gebäudes dicht sind, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD tueren_dicht ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls das Dachgeschoss des Gebäudes gedämmt ist, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD dachgeschoss_gedaemmt ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls die Kellerdecke des Gebäudes gedämmt ist, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD keller_decke_gedaemmt ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls die Kellerwände des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD keller_wand_gedaemmt ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls die Außenwände des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD aussenwand_gedaemmt ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls die oberste Geschossdecke des Gebäudes gedämmt ist, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD oberste_geschossdecke_gedaemmt ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls die Außenwände des Gebäudes mindestens 12cm gedämmt sind, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD aussenwand_min_12cm_gedaemmt ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls das Dachgeschoss des Gebäudes mindestens 12cm gedämmt ist, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD dachgeschoss_min_12cm_gedaemmt ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
-- @zod.describe("Falls die oberste Geschossdecke des Gebäudes mindestens 12cm gedämmt ist, sollte dieser Wert auf true stehen")
|
||||||
|
DEFINE FIELD oberste_geschossdecke_min_12cm_gedaemmt ON TABLE Aufnahme TYPE option<bool>;
|
||||||
|
|
||||||
|
DEFINE FIELD events ON TABLE Aufnahme TYPE array<record<Event>>;
|
||||||
|
DEFINE FIELD bilder ON TABLE Aufnahme TYPE array<record<Bild>>;
|
||||||
|
DEFINE FIELD unterlagen ON TABLE Aufnahme TYPE array<record<Unterlage>>;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
22
surreal/Benutzer.sql
Normal file
22
surreal/Benutzer.sql
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
DEFINE TABLE Benutzer SCHEMAFULL;
|
||||||
|
|
||||||
|
DEFINE FIELD id ON TABLE Benutzer TYPE string;
|
||||||
|
DEFINE FIELD alte_id ON TABLE Benutzer TYPE int;
|
||||||
|
DEFINE FIELD name ON TABLE Benutzer TYPE option<string>;
|
||||||
|
DEFINE FIELD vorname ON TABLE Benutzer TYPE option<string>;
|
||||||
|
DEFINE FIELD email ON TABLE Benutzer TYPE string;
|
||||||
|
DEFINE FIELD passwort ON TABLE Benutzer TYPE string;
|
||||||
|
DEFINE FIELD profilbild ON TABLE Benutzer TYPE option<string>;
|
||||||
|
DEFINE FIELD plz ON TABLE Benutzer TYPE option<string>;
|
||||||
|
DEFINE FIELD ort ON TABLE Benutzer TYPE option<string>;
|
||||||
|
DEFINE FIELD adresse ON TABLE Benutzer TYPE option<string>;
|
||||||
|
DEFINE FIELD telefon ON TABLE Benutzer TYPE option<string>;
|
||||||
|
DEFINE FIELD anrede ON TABLE Benutzer TYPE option<string>;
|
||||||
|
|
||||||
|
DEFINE FIELD rolle ON TABLE Benutzer TYPE "USER" | "ADMIN";
|
||||||
|
|
||||||
|
DEFINE FIELD firma ON TABLE Benutzer TYPE option<string>;
|
||||||
|
DEFINE FIELD lex_office_id ON TABLE Benutzer TYPE option<string>;
|
||||||
|
DEFINE FIELD verified ON TABLE Benutzer TYPE bool DEFAULT false;
|
||||||
|
DEFINE FIELD created_at ON TABLE Benutzer TYPE datetime DEFAULT time::now();
|
||||||
|
DEFINE FIELD updated_at ON TABLE Benutzer TYPE datetime DEFAULT time::now();
|
||||||
10
surreal/Bild.sql
Normal file
10
surreal/Bild.sql
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
DEFINE TABLE Bild SCHEMAFULL;
|
||||||
|
|
||||||
|
DEFINE FIELD name ON TABLE Bild TYPE string;
|
||||||
|
DEFINE FIELD mime ON TABLE Bild TYPE string;
|
||||||
|
DEFINE FIELD kategorie ON TABLE Bild TYPE "Heizung" | "Fenster" | "Gebaeude" | "Daemmung" | "AnlagenTechnik";
|
||||||
|
|
||||||
|
DEFINE FIELD created_at ON TABLE Bild TYPE datetime DEFAULT time::now();
|
||||||
|
DEFINE FIELD updated_at ON TABLE Bild TYPE datetime VALUE time::now();
|
||||||
|
|
||||||
|
DEFINE FIELD aufnahme ON TABLE Bild TYPE option<record<Aufnahme>>;
|
||||||
10
surreal/Event.sql
Normal file
10
surreal/Event.sql
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
DEFINE TABLE Event SCHEMAFULL;
|
||||||
|
DEFINE FIELD erstellungsdatum ON TABLE Event TYPE datetime DEFAULT time::now();
|
||||||
|
|
||||||
|
DEFINE FIELD title ON TABLE Event TYPE string;
|
||||||
|
DEFINE FIELD description ON TABLE Event TYPE option<string>;
|
||||||
|
|
||||||
|
-- Verlinkung des Gebäudes
|
||||||
|
DEFINE FIELD aufnahme ON TABLE Event TYPE record<Aufnahme>;
|
||||||
|
-- Verlinkung des Benutzers
|
||||||
|
DEFINE FIELD benutzer ON TABLE Event TYPE record<Benutzer>;
|
||||||
16
surreal/Objekt.sql
Normal file
16
surreal/Objekt.sql
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
DEFINE TABLE Objekt SCHEMAFULL;
|
||||||
|
|
||||||
|
DEFINE FIELD id ON TABLE Objekt TYPE string;
|
||||||
|
DEFINE FIELD latitude ON TABLE Objekt TYPE option<float>;
|
||||||
|
DEFINE FIELD longitude ON TABLE Objekt TYPE option<float>;
|
||||||
|
|
||||||
|
-- @zod.describe("Postleitzahl des Gebäudes")
|
||||||
|
DEFINE FIELD plz ON TABLE Objekt TYPE option<string>;
|
||||||
|
-- @zod.describe("Ort des Gebäudes")
|
||||||
|
DEFINE FIELD ort ON TABLE Objekt TYPE option<string>;
|
||||||
|
-- @zod.describe("Adresse (Straße und Hausnummer) des Gebäudes")
|
||||||
|
DEFINE FIELD adresse ON TABLE Objekt TYPE option<string>;
|
||||||
|
|
||||||
|
DEFINE FIELD erstellungsdatum ON TABLE Objekt TYPE datetime DEFAULT time::now();
|
||||||
|
|
||||||
|
DEFINE FIELD aufnahmen ON TABLE Objekt TYPE array<record<Aufnahme>>;
|
||||||
10
surreal/Unterlage.sql
Normal file
10
surreal/Unterlage.sql
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
DEFINE TABLE Unterlage SCHEMAFULL;
|
||||||
|
|
||||||
|
DEFINE FIELD name ON TABLE Unterlage TYPE string;
|
||||||
|
DEFINE FIELD mime ON TABLE Unterlage TYPE string;
|
||||||
|
DEFINE FIELD kategorie ON TABLE Unterlage TYPE "Grundriss" | "Sonstiges";
|
||||||
|
|
||||||
|
DEFINE FIELD created_at ON TABLE Unterlage TYPE datetime DEFAULT time::now();
|
||||||
|
DEFINE FIELD updated_at ON TABLE Unterlage TYPE datetime VALUE time::now();
|
||||||
|
|
||||||
|
DEFINE FIELD aufnahme ON TABLE Unterlage TYPE option<record<Aufnahme>>;
|
||||||
67
surreal/VerbrauchsausweisWohnen.sql
Normal file
67
surreal/VerbrauchsausweisWohnen.sql
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
DEFINE TABLE VerbrauchsausweisWohnen SCHEMAFULL;
|
||||||
|
|
||||||
|
DEFINE FIELD ausstellgrund ON VerbrauchsausweisWohnen TYPE "Neubau" | "Vermietung" | "Verkauf" | "Modernisierung" | "Sonstiges" DEFAULT "Sonstiges";
|
||||||
|
DEFINE FIELD registriernummer ON VerbrauchsausweisWohnen TYPE option<string>;
|
||||||
|
DEFINE FIELD zusaetzliche_heizquelle ON VerbrauchsausweisWohnen TYPE option<bool>;
|
||||||
|
DEFINE FIELD einheit_1 ON VerbrauchsausweisWohnen TYPE option<string>;
|
||||||
|
DEFINE FIELD einheit_2 ON VerbrauchsausweisWohnen TYPE option<string>;
|
||||||
|
DEFINE FIELD brennstoff_1 ON VerbrauchsausweisWohnen TYPE option<string>;
|
||||||
|
DEFINE FIELD brennstoff_2 ON VerbrauchsausweisWohnen TYPE option<string>;
|
||||||
|
DEFINE FIELD energieeffizienzklasse ON VerbrauchsausweisWohnen TYPE option<string>;
|
||||||
|
DEFINE FIELD ausstellungsdatum ON VerbrauchsausweisWohnen TYPE datetime;
|
||||||
|
DEFINE FIELD boxpruefung ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
DEFINE FIELD startdatum ON VerbrauchsausweisWohnen TYPE datetime;
|
||||||
|
|
||||||
|
DEFINE FIELD verbrauch_1 ON VerbrauchsausweisWohnen TYPE option<int>;
|
||||||
|
DEFINE FIELD verbrauch_2 ON VerbrauchsausweisWohnen TYPE option<int>;
|
||||||
|
DEFINE FIELD verbrauch_3 ON VerbrauchsausweisWohnen TYPE option<int>;
|
||||||
|
DEFINE FIELD verbrauch_4 ON VerbrauchsausweisWohnen TYPE option<int>;
|
||||||
|
DEFINE FIELD verbrauch_5 ON VerbrauchsausweisWohnen TYPE option<int>;
|
||||||
|
DEFINE FIELD verbrauch_6 ON VerbrauchsausweisWohnen TYPE option<int>;
|
||||||
|
|
||||||
|
DEFINE FIELD warmwasser_enthalten ON VerbrauchsausweisWohnen TYPE option<bool>;
|
||||||
|
DEFINE FIELD warmwasser_anteil_bekannt ON VerbrauchsausweisWohnen TYPE option<bool>;
|
||||||
|
DEFINE FIELD faktorKeller ON VerbrauchsausweisWohnen TYPE option<float>;
|
||||||
|
|
||||||
|
DEFINE FIELD alternative_heizung ON VerbrauchsausweisWohnen TYPE option<bool>;
|
||||||
|
DEFINE FIELD alternative_warmwasser ON VerbrauchsausweisWohnen TYPE option<bool>;
|
||||||
|
DEFINE FIELD alternative_lueftung ON VerbrauchsausweisWohnen TYPE option<bool>;
|
||||||
|
DEFINE FIELD alternative_kuehlung ON VerbrauchsausweisWohnen TYPE option<bool>;
|
||||||
|
|
||||||
|
DEFINE FIELD anteil_warmwasser_1 ON VerbrauchsausweisWohnen TYPE option<float>;
|
||||||
|
DEFINE FIELD anteil_warmwasser_2 ON VerbrauchsausweisWohnen TYPE option<float>;
|
||||||
|
|
||||||
|
DEFINE FIELD ausgestellt ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
DEFINE FIELD storniert ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
DEFINE FIELD bestellt ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
DEFINE FIELD zurueckgestellt ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
DEFINE FIELD prueftext ON VerbrauchsausweisWohnen TYPE option<string>;
|
||||||
|
DEFINE FIELD beschreibung ON VerbrauchsausweisWohnen TYPE option<string>;
|
||||||
|
|
||||||
|
DEFINE FIELD kontrolldatei_angefragt ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
|
||||||
|
DEFINE FIELD ausweistyp ON VerbrauchsausweisWohnen TYPE "Standard" | "StandardXL" | "Beratung" | "BeratungXL" | "Offline" | "OfflineXL" DEFAULT "Standard";
|
||||||
|
DEFINE FIELD ausweisart ON VerbrauchsausweisWohnen TYPE "VerbrauchsausweisWohnen" | "VerbrauchsausweisGewerbe" | "BedarfsausweisWohnen" | "BedarfsausweisGewerbe" | "GEGNachweisWohnen" | "GEGNachweisGewerbe" DEFAULT "VerbrauchsausweisWohnen";
|
||||||
|
|
||||||
|
DEFINE FIELD created_at ON VerbrauchsausweisWohnen TYPE datetime DEFAULT time::now();
|
||||||
|
DEFINE FIELD updated_at ON VerbrauchsausweisWohnen TYPE datetime VALUE time::now();
|
||||||
|
|
||||||
|
-- Prüfpunkte
|
||||||
|
DEFINE FIELD pruefpunkt_heizungsalter ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
DEFINE FIELD pruefpunkt_verbrauch_niedrig ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
DEFINE FIELD pruefpunkt_verbrauch_hoch ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
DEFINE FIELD pruefpunkt_verbrauch_null ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
DEFINE FIELD pruefpunkt_verbrauch_abweichung ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
DEFINE FIELD pruefpunkt_wohnflaeche_einheiten ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
DEFINE FIELD pruefpunkt_strom_null ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
DEFINE FIELD pruefpunkt_strom_abweichung ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
DEFINE FIELD pruefpunkt_plz ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
DEFINE FIELD pruefpunkt_heizungsanlage ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
DEFINE FIELD pruefpunkt_anteil_warmwasser ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
DEFINE FIELD pruefpunkt_wohnflaeche ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
DEFINE FIELD pruefpunkt_geometrie ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
DEFINE FIELD pruefpunkt_fenster ON VerbrauchsausweisWohnen TYPE option<bool> DEFAULT false;
|
||||||
|
|
||||||
|
DEFINE FIELD benutzer ON VerbrauchsausweisWohnen TYPE option<record<Benutzer>>;
|
||||||
|
DEFINE FIELD rechnung ON VerbrauchsausweisWohnen TYPE option<record<Rechnung>>;
|
||||||
|
DEFINE FIELD aufnahme ON VerbrauchsausweisWohnen TYPE record<Aufnahme>;
|
||||||
52
wipe-database.bash
Normal file
52
wipe-database.bash
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Config
|
||||||
|
CONTAINER_NAME="online-energieausweis-database-1"
|
||||||
|
DB_USER="main"
|
||||||
|
DB_NAME="main"
|
||||||
|
TIMESTAMP=$(date +"%Y-%m-%d_%H-%M-%S")
|
||||||
|
FILE_NAME="backup-$TIMESTAMP.sql.br"
|
||||||
|
|
||||||
|
REQUIRED_CONFIRMATION='Ja, ich möchte alle Daten unwiderruflich löschen.'
|
||||||
|
|
||||||
|
echo "⚠️ WARNUNG: Diese Aktion wird alle Tabellen und Einträge in der Datenbank vollständig löschen!"
|
||||||
|
echo "Um fortzufahren, tippe exakt: \"$REQUIRED_CONFIRMATION\""
|
||||||
|
echo
|
||||||
|
read -p "> " USER_CONFIRMATION
|
||||||
|
|
||||||
|
if [[ "$USER_CONFIRMATION" != "$REQUIRED_CONFIRMATION" ]]; then
|
||||||
|
echo "❌ Falsche Eingabe. Abbruch."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "📦 Backup wird erstellt..."
|
||||||
|
docker exec -t "$CONTAINER_NAME" pg_dumpall -c -U "$DB_USER" | brotli > "$FILE_NAME"
|
||||||
|
echo "✅ Backup abgeschlossen: $FILE_NAME"
|
||||||
|
|
||||||
|
echo "🧨 Alle Daten aus allen Tabellen werden gelöscht..."
|
||||||
|
|
||||||
|
# Generate and run TRUNCATE statements for all tables in the public schema
|
||||||
|
docker exec -i "$CONTAINER_NAME" psql -U "$DB_USER" "$DB_NAME" <<'EOSQL'
|
||||||
|
DO $$
|
||||||
|
DECLARE
|
||||||
|
r RECORD;
|
||||||
|
sql TEXT := '';
|
||||||
|
BEGIN
|
||||||
|
FOR r IN
|
||||||
|
SELECT tablename
|
||||||
|
FROM pg_tables
|
||||||
|
WHERE schemaname = 'public'
|
||||||
|
LOOP
|
||||||
|
sql := sql || FORMAT('TRUNCATE TABLE public.%I CASCADE;', r.tablename);
|
||||||
|
END LOOP;
|
||||||
|
|
||||||
|
EXECUTE sql;
|
||||||
|
END
|
||||||
|
$$;
|
||||||
|
EOSQL
|
||||||
|
|
||||||
|
echo "✅ Alle Tabellen gelöscht und Schema zurückgesetzt."
|
||||||
|
|
||||||
|
echo "🚀 Datenbankbereinigung abgeschlossen."
|
||||||
Reference in New Issue
Block a user