321 Commits

Author SHA1 Message Date
UMBENOMENA
cd61ccd097 Merge pull request #540 from IBCornelsen/UMBE
GTM
2025-06-01 23:47:10 +02:00
Robert Jagtiani
36bcacd8a2 Google Tag Manager 2025-06-01 23:27:07 +02:00
Robert Jagtiani
d6fc6be6d0 Merge remote-tracking branch 'origin/dev' into UMBE 2025-06-01 22:49:54 +02:00
Carl Mahnke
5869b282c4 Fixing Kundendatenmodule Datenvorbelegen bei neuem Ausweis 2025-05-28 14:15:01 +02:00
Moritz Utcke
e2f230e240 Notify Success entfernt weil es übel nervt 2025-05-20 12:50:07 -03:00
Carl Mahnke
b8bb16b0ba Merge remote-tracking branch 'origin/dev' into Dev-Carl 2025-05-20 16:57:46 +02:00
Carl Mahnke
42b2767c70 Einstellungen Passwort ändern 2025-05-20 16:55:18 +02:00
Moritz Utcke
7e047125a7 Databse Neustarten nach Server Neustart 2025-05-18 11:57:26 -03:00
Carl Mahnke
058a84025c Benutzerdaten beim Speichern/Bestellen als Admin in Tabelle Benutzer speichern 2025-05-16 13:48:15 +02:00
Carl Mahnke
d76b8b4e14 Benutzerdaten beim Speichern/Bestellen in Tabelle Benutzer speichern 2025-05-14 13:53:19 +02:00
Jens Cornelsen
58a8136479 Ausstellliste 2025-05-08 23:40:16 +02:00
Jens Cornelsen
c7f18dd7ae Pfeilposition im PDF korrigiert 2025-05-05 14:05:18 +02:00
Jens Cornelsen
235969ccda . 2025-05-05 13:55:11 +02:00
Jens Cornelsen
fe06c09336 Pfeilposition im PDF korrigiert 2025-05-05 13:17:49 +02:00
Jens Cornelsen
01d3824514 Neue Bankverbindung 2025-05-02 17:31:28 +02:00
Carl Mahnke
39e91dae7b Ausgestellte Ausweis PDFs aus der Cloud laden und nicht neu generieren 2025-05-02 11:44:24 +02:00
Carl Mahnke
8d7d59bb4e Bedarfsausweis Wohnen PDF nach Austellung im Dashboard downloaden 2025-05-02 11:16:46 +02:00
Moritz Utcke
ed33d19648 Speichern 2025-04-29 16:51:15 -03:00
Moritz Utcke
6600d8dee8 Merge branch 'staging' into dev 2025-04-29 15:19:34 -03:00
Jens Cornelsen
7fed3d0625 Anzeige der Zusatzservices 2025-04-29 18:46:22 +02:00
Jens Cornelsen
9efce15f51 . 2025-04-29 18:25:49 +02:00
Jens Cornelsen
4acca5591c Fix ausweistyp 2025-04-29 18:00:31 +02:00
Moritz Utcke
da7f91bab3 Merge branch 'main' into staging 2025-04-29 12:21:47 -03:00
Moritz Utcke
bb3caa04c4 Merge branch 'dev' into staging 2025-04-29 12:20:42 -03:00
Moritz Utcke
e18f27675d Fix 2025-04-29 11:30:29 -03:00
Moritz Utcke
1380dcb43a Partner 2025-04-29 11:15:57 -03:00
Moritz Utcke
a8be6db8aa Ausweis erstellen 2025-04-29 10:39:11 -03:00
Jens Cornelsen
cee45ffef5 Auto stash before rebase of "main" onto "origin/main" 2025-04-29 13:01:51 +02:00
Moritz Utcke
e24310bdb7 Ausweis Erstellen Button 2025-04-28 23:57:36 -03:00
Moritz Utcke
39e8527c59 Merge branch 'staging' into dev 2025-04-28 17:28:14 -03:00
Moritz Utcke
76bd0bb5dd hilfe 2025-04-28 17:18:45 -03:00
Moritz Utcke
4b9e7dda5f ahhhhh 2025-04-28 17:14:28 -03:00
Moritz Utcke
73b44d574b Update 2025-04-28 17:11:54 -03:00
Moritz Utcke
f778641be6 No Checkout 2025-04-28 17:07:26 -03:00
Moritz Utcke
75723d666e Update 2025-04-28 16:59:34 -03:00
Moritz Utcke
272b044157 Update 2025-04-28 16:52:41 -03:00
Moritz Utcke
10bc17963a Update 2025-04-28 16:48:34 -03:00
Moritz Utcke
35c24b0380 Update 2025-04-28 16:40:49 -03:00
Moritz Utcke
3e09686cf6 Update 2025-04-28 16:34:28 -03:00
Moritz Utcke
aca01b859f Auto PR 2025-04-28 16:31:33 -03:00
Moritz Utcke
344651dfc1 Update Workflow 2025-04-28 15:38:06 -03:00
Moritz Utcke
4a2eb72f0a Update workflow 2025-04-28 14:10:18 -03:00
Moritz Utcke
eb1763a6c1 Merge remote-tracking branch 'origin/staging' into staging 2025-04-28 14:06:31 -03:00
Moritz Utcke
e276c71461 Update workflow 2025-04-28 14:06:17 -03:00
Moritz Utcke
2bf4eba44d Update Workflow 2025-04-28 14:02:46 -03:00
Moritz Utcke
9e2d7ecf08 Merge branch 'main' into staging 2025-04-28 13:32:22 -03:00
Moritz Utcke
058b61908f Update Workflow 2025-04-28 13:31:50 -03:00
Moritz Utcke
5a6bfcc900 Merge branch 'staging' 2025-04-28 13:29:59 -03:00
Moritz Utcke
ec0d5ddf5a Update workflow 2025-04-28 13:23:33 -03:00
Moritz Utcke
7204957749 Update dev pipeline 2025-04-28 13:14:37 -03:00
Moritz Utcke
8c4345924f Update dev pipeline 2025-04-28 13:10:16 -03:00
Moritz Utcke
ed609a4690 Merge branch 'main' into dev 2025-04-28 13:08:08 -03:00
Moritz Utcke
b29b26ef0e Update 2025-04-28 12:58:54 -03:00
Moritz Utcke
d6f01bef98 Merge branch 'main' into staging 2025-04-28 12:53:22 -03:00
Moritz Utcke
bfb17795a6 Workflows 2025-04-28 12:52:09 -03:00
Moritz Utcke
dc5c6ac557 Workflows 2025-04-28 12:50:12 -03:00
Moritz Utcke
6416b0f749 Workflows 2025-04-28 12:45:21 -03:00
Moritz Utcke
a094036d07 Merge branch 'feature-branch' into dev 2025-04-28 11:29:11 -03:00
Moritz Utcke
8c69e6add1 Größe geändert 2025-04-28 11:26:23 -03:00
Jens Cornelsen
78decc697e . 2025-04-28 14:03:41 +02:00
Jens Cornelsen
5c846ec400 Text Dashboard Warmwasserzuschlag 2025-04-28 13:59:19 +02:00
Moritz Utcke
b13b145d16 Fix dev 2025-04-28 08:57:19 -03:00
Jens Cornelsen
c2542e7dab Kühlung vorhanden fix 2025-04-28 13:16:54 +02:00
Jens Cornelsen
422a03a2e8 Warmwasserzuschlag fix 2025-04-28 13:04:02 +02:00
Moritz Utcke
e09513d50e Zusatzartikel und Hilfe Anfordern 2025-04-27 17:15:24 -03:00
Moritz Utcke
e159e81c2d Neuausstellung + Verschlankung 2025-04-27 16:29:20 -03:00
Jens Cornelsen
a113d09775 Merge pull request #525 from IBCornelsen/dev
info popup entfernt
2025-04-26 10:03:20 +02:00
Jens Cornelsen
25aa048c4a info popup entfernt 2025-04-26 10:00:11 +02:00
Jens Cornelsen
207bf31058 Merge pull request #524 from IBCornelsen/dev
Button Ausweis erstellen
2025-04-25 19:37:26 +02:00
Jens Cornelsen
f9daeceeca Button Ausweis erstellen 2025-04-25 19:26:21 +02:00
Jens Cornelsen
b47a5fd5f6 Merge pull request #523 from IBCornelsen/dev
update main
2025-04-25 10:57:12 +02:00
Jens Cornelsen
88c35f81f7 Text verbessert 2025-04-25 10:55:08 +02:00
Jens Cornelsen
cc583080ea Preis fix Bedarfsausweis 2025-04-24 17:18:47 +02:00
Carl Mahnke
e535cdaeba Bedarfsausweis ausstellen - cleanup 2025-04-24 16:56:52 +02:00
Carl Mahnke
f17a8a6481 Bedarfsausweis Austellen - Fix Rechnung PDF Anhang 2025-04-24 16:51:12 +02:00
Carl Mahnke
d5fb937dd6 Bedarfsausweis Austellen - Fix Rechnung PDF Anhang 2025-04-24 16:47:41 +02:00
Carl Mahnke
23246fbda2 Bedarfsausweis Austellen - Fix Rechnung PDF Anhang 2025-04-24 16:35:18 +02:00
Jens Cornelsen
735344cea4 Merge pull request #522 from IBCornelsen/dev
update main
2025-04-24 15:58:03 +02:00
Jens Cornelsen
8488472ebc . 2025-04-24 15:37:01 +02:00
Jens Cornelsen
299ec89216 . 2025-04-24 15:24:43 +02:00
Jens Cornelsen
a9aaa508f5 Auto stash before rebase of "dev" onto "origin/dev" 2025-04-24 15:17:39 +02:00
Carl Mahnke
52261e8d2a Bedarfsausweis ausstellen Timeout deaktivieren 2025-04-24 14:56:43 +02:00
Carl Mahnke
4ac3999f67 Bedarfsausweis austellen Rechnung PDF Error Logging 2025-04-24 14:50:15 +02:00
Carl Mahnke
9c059eb4b6 Bedarfsausweis austellen 2025-04-24 14:48:06 +02:00
Carl Mahnke
ba5d5ac5d5 Merge remote-tracking branch 'origin/dev' into Dev-Carl 2025-04-24 14:25:18 +02:00
Jens Cornelsen
6d48cee1fa . 2025-04-24 14:22:57 +02:00
Carl Mahnke
d157ed3c0f Bedarfsausweis Ausstellen: Fixing PDF Mime Type + LexOffice Rechnung anhängen 2025-04-24 14:20:31 +02:00
Jens Cornelsen
0495d48669 . 2025-04-24 14:13:20 +02:00
Jens Cornelsen
7ba5c9de92 Dashboard 2025-04-24 13:42:52 +02:00
Carl Mahnke
b64282a7ca Disable LexOffice Rechnung for Testing 2025-04-24 12:58:50 +02:00
Carl Mahnke
bd67288887 Merge remote-tracking branch 'origin/dev' into Dev-Carl 2025-04-24 12:55:05 +02:00
Carl Mahnke
68f51d4553 Merge branch 'main' into Dev-Carl 2025-04-24 12:54:22 +02:00
Jens Cornelsen
5dbbde0856 Merge pull request #521 from IBCornelsen/main
get main
2025-04-24 12:52:04 +02:00
Carl Mahnke
a9f01a5a8e Verbrauchsausweis: Fix Attachments 2025-04-24 10:45:43 +02:00
Carl Mahnke
28a383a476 Bedarfsausweis: Revert Check, ob Rechnung PDF bereits existiert 2025-04-24 10:37:54 +02:00
Jens Cornelsen
56b6bcd1a1 Fix Attachment 2025-04-24 09:59:28 +02:00
Jens Cornelsen
14b3cdf744 Merge pull request #520 from IBCornelsen/main
get main
2025-04-23 19:42:38 +02:00
Jens Cornelsen
38f77d862d Merge branch 'dev' into main 2025-04-23 19:40:44 +02:00
Carl Mahnke
f3c2c82d8d Quickfix Tel 2 2025-04-23 18:32:36 +02:00
Carl Mahnke
87f6bf14d8 Merge remote-tracking branch 'origin/dev' into Dev-Carl 2025-04-23 18:27:59 +02:00
Carl Mahnke
72ed91ddcc Bedarfsausweis: Check, ob rechnung PDF bereits existiert 2025-04-23 18:22:29 +02:00
Jens Cornelsen
a4c3c38912 api caller 2025-04-23 18:20:46 +02:00
Jens Cornelsen
e86b44f5a0 Telefonnummer Dashboard 2025-04-23 18:18:40 +02:00
Carl Mahnke
101b1e9aab Bedarfsausweis: Check, ob Rechnung PDF bereits existiert 2025-04-23 18:00:53 +02:00
Carl Mahnke
ecd4b08119 Auto stash before merge of "Dev-Carl" and "origin/dev" 2025-04-23 17:38:05 +02:00
Moritz Utcke
f958eb07bf Bedarfsausweis 2025-04-23 10:49:58 -03:00
Carl Mahnke
611866508c Aushang PDF 2025-04-23 15:43:22 +02:00
Moritz Utcke
076c49c054 Bedarfsausweis Wohnen ausstellen 2025-04-23 10:34:30 -03:00
Jens Cornelsen
9c8b1b1913 Merge pull request #519 from IBCornelsen/dev
update main
2025-04-23 10:46:53 +02:00
Jens Cornelsen
cfad65878e . 2025-04-23 10:08:34 +02:00
Moritz Utcke
379ae672c4 Merge remote-tracking branch 'origin/dev' into dev 2025-04-22 19:42:52 -03:00
Moritz Utcke
b568f5c101 Bedarfsausweis 2025-04-22 19:41:57 -03:00
Jens Cornelsen
7c36bb8728 Merge pull request #518 from IBCornelsen/dev
Fix Bedarfsausweis
2025-04-23 00:12:45 +02:00
Jens Cornelsen
df0fa82482 Fix Bedarfsausweis 2025-04-23 00:05:32 +02:00
Jens Cornelsen
70fd424488 Textkorrekturen 2025-04-22 21:17:09 +02:00
Moritz Utcke
8470ad5915 Highlight rausgenommen 2025-04-22 15:04:43 -03:00
Moritz Utcke
a8a9553d20 Stornierungsbestätigung 2025-04-22 15:01:07 -03:00
Moritz Utcke
8d8fb96f0d Merge remote-tracking branch 'origin/dev' into dev 2025-04-22 13:06:21 -03:00
Jens Cornelsen
25280f2cd1 Merge pull request #517 from IBCornelsen/dev
Update main
2025-04-22 18:01:46 +02:00
Jens Cornelsen
3ab5992210 Adresse Angebotsanfragen 2025-04-22 17:27:00 +02:00
Moritz Utcke
de8dd9e9f1 Auto stash before merge of "dev" and "origin/dev" 2025-04-22 10:32:34 -03:00
Jens Cornelsen
3e15724c3e Navigation 2025-04-22 15:15:03 +02:00
Jens Cornelsen
dfe7856d03 Infotext hinzugefügt 2025-04-22 13:16:12 +02:00
Jens Cornelsen
b70417e9ed . 2025-04-22 13:02:13 +02:00
Jens Cornelsen
f5d6fa03e5 Navigation 2025-04-22 12:56:15 +02:00
Jens Cornelsen
e35378ced8 Auto stash before rebase of "dev" onto "origin/dev" 2025-04-22 12:45:31 +02:00
Moritz Utcke
414727fdc1 Unterlagen und Bilder 2025-04-22 00:09:08 -03:00
Moritz Utcke
e2c14dace9 Suche 2025-04-21 21:40:17 -03:00
Moritz Utcke
568f9769ee Dashboard objekte redirect 2025-04-21 21:19:49 -03:00
Moritz Utcke
6901973e5c Merge branch 'dashboard' into dev 2025-04-21 20:25:20 -03:00
Moritz Utcke
a588837605 Verwendungszweck 2025-04-21 20:24:57 -03:00
Jens Cornelsen
6e6ac36178 Merge pull request #516 from IBCornelsen/dashboard
Neues Dashboard
2025-04-22 01:10:38 +02:00
Moritz Utcke
cfc6d3c230 Rechnung Optional 2025-04-21 20:06:11 -03:00
Jens Cornelsen
b6aa1fdf6d Merge remote-tracking branch 'origin/dev' into dashboard 2025-04-22 00:59:41 +02:00
Moritz Utcke
d9f6b7e825 Speichern direkt auf Ausweis 2025-04-21 19:59:30 -03:00
Jens Cornelsen
68bffa8944 Auto stash before rebase of "dashboard" onto "origin/dashboard" 2025-04-22 00:47:02 +02:00
Moritz Utcke
f8e890e9a9 Bestätigungsmail weg 2025-04-21 19:09:57 -03:00
Moritz Utcke
64eb0d4e15 Fix 2025-04-21 18:18:31 -03:00
Moritz Utcke
d7a862e061 Fix 2025-04-21 17:56:23 -03:00
Moritz Utcke
6a2c386b5d GEGNachweise 2025-04-21 17:55:37 -03:00
Moritz Utcke
62e6dd44b9 Dashboard Template 2025-04-21 17:53:19 -03:00
Moritz Utcke
05b31a4862 Dashboard 2025-04-21 16:15:47 -03:00
Moritz Utcke
55305f31b7 Unnötige Dateien entfernt 2025-04-21 15:35:29 -03:00
Moritz Utcke
1f86a063ef Ausweis erstellen aus Dashboard 2025-04-21 15:23:59 -03:00
Moritz Utcke
217885587e Merge remote-tracking branch 'origin/dev' into dev 2025-04-21 15:18:48 -03:00
Moritz Utcke
28f8933f72 Ausweis als Admin bearbeiten 2025-04-21 15:18:41 -03:00
Moritz Utcke
5360ec3d24 Ausweis als Admin bearbeiten 2025-04-21 15:08:43 -03:00
Moritz Utcke
6339a3aeda Merge remote-tracking branch 'origin/main' into dev 2025-04-21 15:06:04 -03:00
Jens Cornelsen
974d0e28a1 Kühlungszuschlag fix 2025-04-21 19:57:15 +02:00
Jens Cornelsen
e9dab58a57 . 2025-04-21 19:23:15 +02:00
Jens Cornelsen
3aa72ea258 Warmwasserzuschlag fix 2025-04-21 19:10:14 +02:00
Moritz Utcke
0b161cf53e Bedarfsausweis Wohnen Sektion Rausgenomment 2025-04-21 13:00:04 -03:00
Jens Cornelsen
590723b297 Merge pull request #515 from IBCornelsen/dev
Datum Fetch, Rechnung, Mollie, etc
2025-04-21 16:33:14 +02:00
Jens Cornelsen
fd390238d9 Ausweis Box Design Änderung Text 2025-04-21 16:30:19 +02:00
Moritz Utcke
6388669d66 Verbrauch Datum 2025-04-21 09:34:07 -04:00
Moritz Utcke
b475e4dd79 fix GetRechung 2025-04-20 20:55:22 -04:00
Moritz Utcke
f5373fc7b1 Fix 2025-04-20 20:49:37 -04:00
Moritz Utcke
265e58d80d Fix Undefined 2025-04-20 20:37:46 -04:00
Moritz Utcke
d2fac65a6d Bugfixes 2025-04-20 20:34:29 -04:00
Moritz Utcke
b0df7fc4cf bump astro-typesafe-api 2025-04-20 19:41:42 -04:00
Moritz Utcke
e21a829cb6 Bugfixes 2025-04-20 17:21:46 -04:00
Jens Cornelsen
bef1cff348 Dashboard Verbrauchsausweis 2025-04-19 22:02:12 +02:00
Jens Cornelsen
f9555c7a1e Merge pull request #514 from IBCornelsen/main
get main
2025-04-19 02:41:59 +02:00
Jens Cornelsen
03389a04ba Zusammenfassung Verbrauchsausweis 2025-04-19 02:35:55 +02:00
Jens Cornelsen
008a6f05a5 Zusammenfassung Eingaben 2025-04-19 01:48:35 +02:00
Jens Cornelsen
6aa8816dd1 . 2025-04-18 18:12:59 +02:00
Jens Cornelsen
70427e8a45 . 2025-04-18 16:15:28 +02:00
Jens Cornelsen
51ea0ec007 . 2025-04-18 16:03:52 +02:00
Jens Cornelsen
1381f5787a Merge pull request #513 from IBCornelsen/dev
Verbrauchsausweis Gewerbe  Anzeige Zuschläge korrigiert
2025-04-18 15:37:46 +02:00
Jens Cornelsen
722db2d2ec . 2025-04-18 15:27:28 +02:00
Jens Cornelsen
72458f4631 . 2025-04-18 14:59:42 +02:00
Jens Cornelsen
bde6b3e102 . 2025-04-18 14:37:36 +02:00
Jens Cornelsen
936ca5abaa Kühlungszuschlag Strom 2025-04-18 14:27:43 +02:00
Jens Cornelsen
1f03bf5570 Leerstandszuschlag Strom 2025-04-18 13:57:22 +02:00
Jens Cornelsen
e7e2390bcd Kühlungszuschlag korrigiert 2025-04-18 13:41:48 +02:00
Jens Cornelsen
3ac6164c82 Warmwasserzuschlag raus 2025-04-18 13:26:30 +02:00
Jens Cornelsen
3bb6778e67 Leerstandszuschlag 2025-04-18 13:04:06 +02:00
Jens Cornelsen
fa797c00c2 Merge pull request #512 from IBCornelsen/main
get main
2025-04-18 12:27:28 +02:00
Jens Cornelsen
f0ae1a9205 . 2025-04-17 23:34:45 +02:00
Jens Cornelsen
af7da9c07f . 2025-04-17 23:29:36 +02:00
Jens Cornelsen
4106253b58 . 2025-04-17 23:26:43 +02:00
Jens Cornelsen
c787dce10c . 2025-04-17 23:18:04 +02:00
Jens Cornelsen
b265910b2a . 2025-04-17 23:03:17 +02:00
Jens Cornelsen
5e3f4c0f59 . 2025-04-17 22:46:02 +02:00
Jens Cornelsen
2fe07ebfad Zusammenfasssung Ausweisseite 2025-04-17 22:39:20 +02:00
Jens Cornelsen
7be766d2c7 Zahllinks erstmal entfernt 2025-04-17 20:58:37 +02:00
Jens Cornelsen
15651fc803 Fix Kühlung "nicht vorhanden" 2025-04-17 18:13:22 +02:00
Jens Cornelsen
5b3b81551e Merge remote-tracking branch 'origin/main' into dev 2025-04-17 18:03:03 +02:00
Jens Cornelsen
330841f8ee . 2025-04-17 01:46:45 +02:00
Jens Cornelsen
0708c6ce43 . 2025-04-17 01:41:23 +02:00
Jens Cornelsen
2c1945584d . 2025-04-17 01:36:49 +02:00
Jens Cornelsen
183178f943 . 2025-04-17 01:30:16 +02:00
Jens Cornelsen
b1b95159fa plz und ort in Ausweis pdf eingefügt 2025-04-17 01:20:18 +02:00
Jens Cornelsen
b0828592c5 Filter nur bestellte Ausweise und nicht ausgestellte im Dashboard für Admins 2025-04-17 01:02:58 +02:00
Jens Cornelsen
21446b3bf3 Filter nur bestellte Ausweise und nicht ausgestellte im Dashboard für Admins 2025-04-17 00:52:09 +02:00
Jens Cornelsen
935fbfba78 Firma in Adresse 2025-04-16 17:34:48 +02:00
Jens Cornelsen
fa195a79f5 Firma Benutzer in Adresse 2025-04-16 17:28:14 +02:00
Jens Cornelsen
f6a367c567 Adresse DB Rückgängig 2025-04-16 17:18:02 +02:00
Jens Cornelsen
bf6d8f47e7 Kühlung repariert VWBWTKEN9TR 2025-04-16 11:12:47 +02:00
Jens Cornelsen
02761610d1 Korrektur Kreuz 2025-04-15 20:37:14 +02:00
Jens Cornelsen
bf3107d3b7 Kühlungszuschlag 2025-04-15 18:24:28 +02:00
Jens Cornelsen
66e596bb57 Nochmal Zuschlag Kühlung 2025-04-15 18:12:22 +02:00
Jens Cornelsen
cdfdb6c001 PDF gefixt !! 2025-04-15 17:49:58 +02:00
Jens Cornelsen
c583229cc8 PDF Anzeige 2025-04-15 17:39:52 +02:00
Jens Cornelsen
417009fd6e PDF Verbrauchsausweis Anzeige gefixt 2025-04-15 17:08:34 +02:00
Jens Cornelsen
d3ffbca858 . 2025-04-15 17:01:22 +02:00
Jens Cornelsen
db4fc19c1a . 2025-04-15 16:57:40 +02:00
Jens Cornelsen
eefae0635a . 2025-04-15 16:49:55 +02:00
Jens Cornelsen
1d7c12ec60 . 2025-04-15 16:46:43 +02:00
Jens Cornelsen
4d7f94e292 . 2025-04-15 16:34:39 +02:00
Jens Cornelsen
e13810b16a . 2025-04-15 16:25:37 +02:00
Jens Cornelsen
d4be779cf1 . 2025-04-15 16:17:45 +02:00
Jens Cornelsen
3912262f4b fix pdf Verbrauchsausweis gewerbe 2025-04-15 16:05:24 +02:00
Jens Cornelsen
ed753b71c1 . 2025-04-15 15:47:37 +02:00
Jens Cornelsen
5b78e8b075 x statt haken 2025-04-15 15:41:01 +02:00
Jens Cornelsen
71dd1de503 test 2025-04-15 15:30:09 +02:00
Jens Cornelsen
2a95f7750a . 2025-04-15 15:26:13 +02:00
Jens Cornelsen
6d3dcb503a unicode 2025-04-15 15:21:38 +02:00
Jens Cornelsen
57c6bbd96c . 2025-04-15 15:18:08 +02:00
Jens Cornelsen
3f18ad9c59 . 2025-04-15 15:12:50 +02:00
Jens Cornelsen
c09cdcc788 . 2025-04-15 15:06:56 +02:00
Jens Cornelsen
473ff8d774 haken alternative 2025-04-15 14:58:17 +02:00
Jens Cornelsen
4ec3f42a8b . 2025-04-15 14:55:07 +02:00
Jens Cornelsen
36a4d7415c . 2025-04-15 14:37:26 +02:00
Jens Cornelsen
df81964b86 Elemente pdf 2025-04-15 14:24:46 +02:00
Carl Mahnke
7130b6ba65 Verbrauchsausweis Gewerbe ausstellen 2025-04-15 13:36:19 +02:00
Jens Cornelsen
bfa79fb06e Anzeige Elemente PDF - fix 2025-04-15 13:05:44 +02:00
Jens Cornelsen
52e2459d47 Bereiche wieder aktiviert 2025-04-14 17:45:57 +02:00
Jens Cornelsen
5081f70570 Höhe Dashboard full 2025-04-14 17:10:41 +02:00
Jens Cornelsen
f4e6b7baf8 dashboard layout 2025-04-14 17:07:55 +02:00
Jens Cornelsen
e55388e4b7 . 2025-04-14 17:06:50 +02:00
Jens Cornelsen
f14c376791 Pfad gefixr 2025-04-14 16:54:20 +02:00
Jens Cornelsen
071fd8c7be Höhe full 2025-04-14 16:51:00 +02:00
Jens Cornelsen
2bb2bd74db Nutzfläche gerundet 2025-04-14 11:41:36 +02:00
Jens Cornelsen
9d9fdebf3a . 2025-04-14 11:29:30 +02:00
Jens Cornelsen
0d9675fb35 . 2025-04-14 11:21:18 +02:00
Jens Cornelsen
7b5b272c17 . 2025-04-14 11:00:02 +02:00
Jens Cornelsen
a7427c3462 . 2025-04-14 10:45:58 +02:00
Jens Cornelsen
2b8ebcf182 . 2025-04-14 10:41:31 +02:00
Jens Cornelsen
eb72b600b4 . 2025-04-14 10:38:10 +02:00
Jens Cornelsen
606b851661 . 2025-04-14 10:26:23 +02:00
Jens Cornelsen
15f94c7752 Kühlungszuschlag bei Kühlung vorhanden 2025-04-14 10:21:18 +02:00
Jens Cornelsen
04dbd4adcd . 2025-04-14 00:50:08 +02:00
Jens Cornelsen
853fe54e3b Kundenprüfung Anteil WW 2025-04-14 00:37:16 +02:00
Jens Cornelsen
e2490f2296 . 2025-04-14 00:16:50 +02:00
Jens Cornelsen
cbddcf0968 Anzeige Nutzfläche gefixt 2025-04-14 00:01:42 +02:00
Jens Cornelsen
8b1e5df851 kuehlung fix 2025-04-13 23:07:36 +02:00
Jens Cornelsen
29d8e5e7b3 . 2025-04-13 21:53:59 +02:00
Jens Cornelsen
e86328b0c2 VG . 2025-04-13 20:07:50 +02:00
Jens Cornelsen
b8d37d4e38 bestellt bei BW auf false wenn keine Rechnung und user nicht 2025-04-13 19:55:32 +02:00
Jens Cornelsen
fd93f3fd54 . 2025-04-13 15:48:37 +02:00
Jens Cornelsen
9035de79ce . 2025-04-13 15:42:09 +02:00
Jens Cornelsen
2304de45b1 . 2025-04-13 13:53:22 +02:00
Jens Cornelsen
f1007d325f . 2025-04-13 13:37:29 +02:00
Jens Cornelsen
44679dbef0 . 2025-04-13 13:33:40 +02:00
Jens Cornelsen
682c97b3e7 . 2025-04-13 13:29:30 +02:00
Jens Cornelsen
b65c3eeeaa . 2025-04-13 13:24:27 +02:00
Jens Cornelsen
883c019293 . 2025-04-13 13:22:11 +02:00
Jens Cornelsen
50c2e3a6ce . 2025-04-13 13:14:35 +02:00
Jens Cornelsen
b7082e2318 Korrektur reset 2025-04-13 13:01:20 +02:00
Jens Cornelsen
f30b1cbd09 Besteller hinzugefügt 2025-04-13 11:57:45 +02:00
Jens Cornelsen
8936479c78 . 2025-04-13 02:32:15 +02:00
Jens Cornelsen
f02b30c6b5 . 2025-04-13 02:25:57 +02:00
Jens Cornelsen
fd34f6bcf7 . 2025-04-13 02:08:54 +02:00
Jens Cornelsen
e9eb113c33 . 2025-04-13 01:56:12 +02:00
Jens Cornelsen
1caee4e19e . 2025-04-13 01:22:35 +02:00
Jens Cornelsen
e18188d2a8 . 2025-04-13 01:10:50 +02:00
Jens Cornelsen
682cf056b6 . 2025-04-13 01:02:58 +02:00
Jens Cornelsen
5d11889fb2 Dashboard 2025-04-13 00:57:59 +02:00
Jens Cornelsen
566780b5e2 . 2025-04-13 00:49:12 +02:00
Jens Cornelsen
2d025b9fde . 2025-04-13 00:35:11 +02:00
Jens Cornelsen
64e97b6593 . 2025-04-13 00:23:05 +02:00
Jens Cornelsen
a05daedc54 . 2025-04-13 00:06:49 +02:00
Jens Cornelsen
e5756abb4d . 2025-04-12 23:48:20 +02:00
Jens Cornelsen
bfd30ace70 . 2025-04-12 23:37:27 +02:00
Jens Cornelsen
5858bff825 Dashboard 2025-04-12 23:26:19 +02:00
Jens Cornelsen
99c1a127b4 . 2025-04-12 23:04:09 +02:00
Jens Cornelsen
70af2e2d07 . 2025-04-12 22:35:55 +02:00
Jens Cornelsen
7db145af7c Dashboard 2025-04-12 22:24:11 +02:00
Jens Cornelsen
dfe13dd6bd . 2025-04-12 21:27:03 +02:00
Jens Cornelsen
33596e4b61 . 2025-04-12 21:21:26 +02:00
Jens Cornelsen
ca9c1b025a . 2025-04-12 21:14:22 +02:00
Jens Cornelsen
ca5102cd77 Dashboard 2025-04-12 21:01:02 +02:00
Jens Cornelsen
cfe160f34d . 2025-04-12 20:34:12 +02:00
Jens Cornelsen
d0a7033bf4 . 2025-04-12 20:29:52 +02:00
Jens Cornelsen
415291b083 . 2025-04-12 20:17:13 +02:00
Jens Cornelsen
4208c3ecc5 . 2025-04-12 20:09:32 +02:00
Jens Cornelsen
76dbe27c5d . 2025-04-12 20:00:59 +02:00
Jens Cornelsen
cfbf1dd69b . 2025-04-12 19:52:18 +02:00
Jens Cornelsen
313b6e328e . 2025-04-12 19:51:01 +02:00
Jens Cornelsen
22532f3783 . 2025-04-12 19:50:13 +02:00
Jens Cornelsen
3ced32b235 . 2025-04-12 19:46:08 +02:00
Jens Cornelsen
300b1d5ea3 . 2025-04-12 19:31:19 +02:00
Jens Cornelsen
40df8c7104 Dashboard 2025-04-12 19:22:19 +02:00
Carl Mahnke
83727ac71d Migrationsskripte Verbrauchsausweis Wohnen + Gewerbe 2025-04-12 18:13:40 +02:00
Carl Mahnke
f31d710b20 Migrationsskript Bedarfsausweis Wohnen Ohne Limit 2025-04-12 17:36:31 +02:00
Carl Mahnke
6da7c0e501 Migrationsskript Bedarfsausweis Wohnen Limit 10 2025-04-12 17:27:51 +02:00
Carl Mahnke
f7b6a50482 Migrationsskript Bedarfsausweis Wohnen Test 2025-04-12 17:14:02 +02:00
Carl Mahnke
48f72a2f0f Migrations Skripte 2025-04-12 16:40:21 +02:00
Jens Cornelsen
43d2c114f4 Merge pull request #511 from IBCornelsen/main
update dev
2025-04-12 13:40:34 +02:00
Jens Cornelsen
aa84dd967e . 2025-04-11 21:07:52 +02:00
Jens Cornelsen
c413f76fe2 . 2025-04-11 20:58:52 +02:00
Jens Cornelsen
7762310bf3 . 2025-04-11 20:48:12 +02:00
Jens Cornelsen
7dd3a6c60d . 2025-04-11 20:29:22 +02:00
Jens Cornelsen
80a6992f5b . 2025-04-11 20:03:22 +02:00
Jens Cornelsen
4b651b733b . 2025-04-11 19:37:34 +02:00
Jens Cornelsen
c269306d9d . 2025-04-11 19:31:51 +02:00
Jens Cornelsen
cf0f0bdee0 . 2025-04-11 19:19:22 +02:00
Jens Cornelsen
d4e2d50e00 Skala und Rchnung 2025-04-11 18:58:11 +02:00
Jens Cornelsen
e303c44822 PDF Name auf Energieausweis geändert 2025-04-11 17:33:40 +02:00
Jens Cornelsen
3eb30d2248 Auto stash before rebase of "main" onto "origin/main" 2025-04-11 17:10:52 +02:00
Carl Mahnke
9b6b30ae30 Kuehlung gefixt 2025-04-11 15:06:28 +02:00
Moritz Utcke
9d9e6f7786 Merge branch 'dev' 2025-04-10 00:34:03 -04:00
Moritz Utcke
98f32ca279 Ausstellen 2025-04-10 00:33:54 -04:00
Moritz Utcke
ab7e5bc6d6 Merge branch 'dev' 2025-04-09 22:17:11 -04:00
Moritz Utcke
636c5463b2 Ausstellen 2025-04-09 22:17:00 -04:00
Moritz Utcke
85c0216e9d Merge branch 'dev' 2025-04-09 21:45:33 -04:00
Moritz Utcke
5e2861546f Ausstellen Error 2025-04-09 21:45:04 -04:00
Moritz Utcke
c1fc08ecba Merge branch 'dev' 2025-04-09 21:35:43 -04:00
Moritz Utcke
458a6ab254 Ausstellen 2025-04-09 21:35:24 -04:00
Moritz Utcke
1259f642e1 Merge pull request #508 from IBCornelsen/revert-507-revert-506-dev
Revert "Revert "Bugfixes""
2025-04-09 20:16:35 -04:00
187 changed files with 86973 additions and 22765 deletions

View File

@@ -1,3 +0,0 @@
# Jeden Monat müssen wir die neuen Klimafaktoren vom DWD abholen, der Cronjob läuft immer am 28. für die höchste Wahrscheinlichkeit
# dass die Daten schon da sind, falls der DWD mal später dran ist...
0 12 28 * * bun ./src/cronjobs/update-dwd-klimafaktoren.ts

View File

@@ -0,0 +1,64 @@
name: Auto Merge Staging into Main
on:
schedule:
- cron: '0 2 * * *' # 2:00 UTC = 4:00 Europäische Zeit
workflow_dispatch:
jobs:
merge:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set Git user
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
- name: Fetch all branches
run: |
git fetch origin main
git fetch origin staging
- name: Check if main has commits not in staging
id: check
run: |
git fetch origin
if [ $(git rev-list --count origin/staging..origin/main) -gt 0 ]; then
echo "❌ Staging is behind main and requires manual merging."
exit 1
fi
- name: Create PR from staging to main
id: create_pr
run: |
PR_URL=$(gh pr create --base main --head staging --title "Auto-merge staging into main" --body "This PR was created automatically by GitHub Actions. It merges the latest \`staging\` into \`main\`.")
echo "PR_URL=$PR_URL" >> $GITHUB_OUTPUT
PR_NUMBER=$(echo $PR_URL | awk -F'/' '{print $NF}')
echo "PR_NUMBER=$PR_NUMBER" >> $GITHUB_OUTPUT
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Enable auto-merge on PR
if: steps.create_pr.outputs.PR_NUMBER != ''
run: |
gh pr merge ${{ steps.create_pr.outputs.PR_NUMBER }} --merge --auto
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
notify_failure:
needs: merge
if: failure()
runs-on: ubuntu-latest
steps:
- name: Send Discord notification on failure
run: |
curl -H "Content-Type: application/json" \
-X POST \
-d "{\"content\": \"🚨 Auto-Merge fehlgeschlagen! Bitte manuell prüfen: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}\"}" \
${{ secrets.DISCORD_WEBHOOK_URL }}

View File

@@ -1,8 +1,6 @@
name: Development Pipeline
on:
pull_request:
branches: [dev]
push:
branches: [dev]

27
.github/workflows/prevent-wrong-pr.yml vendored Normal file
View File

@@ -0,0 +1,27 @@
name: PR Rules Enforcement
on:
pull_request:
branches:
- main
- staging
jobs:
check-pr:
runs-on: ubuntu-latest
name: Validate Pull Request Sources
steps:
- name: Prevent dev merges
run: |
if [[ "${{ github.head_ref }}" == "dev" ]]; then
echo "ERROR: Merging 'dev' into '${{ github.base_ref }}' is forbidden!"
exit 1
fi
- name: Allow only staging into main
if: github.base_ref == 'main'
run: |
if [[ "${{ github.head_ref }}" != "staging" ]]; then
echo "ERROR: Only 'staging' branch is allowed to merge into 'main'. Current: '${{ github.head_ref }}'"
exit 1
fi

View File

@@ -1,8 +1,6 @@
name: Production Pipeline
on:
pull_request:
branches: [main]
push:
branches: [main]

View File

@@ -1,39 +0,0 @@
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn
NhAAAAAwEAAQAAAYEAzUGXt3GYcT3344iWGGGcgL0zDKhkrieikZ+yqzDpLuEzRwu3epuT
mvmHpT45awHyWr6pgOPpD7MGSDo13BVRAjCapYC23RL87E3ZRaH6aezVtV+tjl6vcCRtQx
4uQWOtGzV8Mi84ErBxt3xKo19ieyVoJnJig9W7oLbf46I0/3Jz31SRQokfoDc7TFHrtVE2
1UZgxNuDfKMhMsBaZcPNP+Rbpcs7s8Bd3Q1PfrbA6bTGGa4DYAR5Hgm+z/FMcu1PSrAA4f
x+YxQrgNC4TNl8T3HSsGnnthNoQMCcl3LcAiy0C1JaWqXWGjYwawnfUdgB2nhb9i5t+yvb
T/UL1+obIhJRx9EaK4CScNraa0ZWmawl/NY6Dumvly8OpeUwMaynsZEFPEZVxdXFUHVRLR
74NGx23sq6qPYZuy5bFhbPJqIXsh2Pl6gvFE6HZcm5U6jgJOaHt98MSFIkILtWeab0cSmC
Aokt8XF+/ezu37mbEvNzCNZpFYG9d6MXuK5HOG0xAAAFqMTKAD/EygA/AAAAB3NzaC1yc2
EAAAGBAM1Bl7dxmHE99+OIlhhhnIC9MwyoZK4nopGfsqsw6S7hM0cLt3qbk5r5h6U+OWsB
8lq+qYDj6Q+zBkg6NdwVUQIwmqWAtt0S/OxN2UWh+mns1bVfrY5er3AkbUMeLkFjrRs1fD
IvOBKwcbd8SqNfYnslaCZyYoPVu6C23+OiNP9yc99UkUKJH6A3O0xR67VRNtVGYMTbg3yj
ITLAWmXDzT/kW6XLO7PAXd0NT362wOm0xhmuA2AEeR4Jvs/xTHLtT0qwAOH8fmMUK4DQuE
zZfE9x0rBp57YTaEDAnJdy3AIstAtSWlql1ho2MGsJ31HYAdp4W/Yubfsr20/1C9fqGyIS
UcfRGiuAknDa2mtGVpmsJfzWOg7pr5cvDqXlMDGsp7GRBTxGVcXVxVB1US0e+DRsdt7Kuq
j2GbsuWxYWzyaiF7Idj5eoLxROh2XJuVOo4CTmh7ffDEhSJCC7Vnmm9HEpggKJLfFxfv3s
7t+5mxLzcwjWaRWBvXejF7iuRzhtMQAAAAMBAAEAAAGAOgLIWPHzlknf1kCDv2dTHrWaiI
DNV8Ve9o5upmCf/v5qCjHfDPmMibftpP/FpZ86unf5mzKO6796zo4ZK9cgeqB3DMCorinQ
Lw8/kaUai7aCngzpFfxf1C+Pa/FLPHLp+W8v51UeIXYZ5bRsuejbAhgL7BXXDxCow178Py
9YkDvuUNfraCUuOY9ypHrgxfGqsDOAZRLvghnu55Oi2PEygNTPLDgY6xA61x+McLFBK6xK
cvaSAKCzBJDXi5jUtQSpqykEpPSQHnD1PvbsLWIJoaolhaew9gv0ADu3iVIWFLeBMAuwQB
N6fWRjJBT3hD9vmQ39OOCDkbpoATugAu3EOvY9pGLzN0Xf1Epc71eHLJj79hDC4H7Brz7A
bOmkUNFtLOZR4ZoHfpm8N3taZ7IdXX/PA3VLCh9qhbFcaUp3uTpXRxTSvHBL03Gl/BQY19
23FevrBH4GobkMpRVCWFFLawC4e9GPPB2QvQAq19W4RvoKmrOZCAa+VoKZKzCsLqG7AAAA
wA9sQSy5+KfXVrkQOaF8OrEBI4g2yd8Q3RNpGMVIWfFtKIL1CCht9UxaOnJC7r/xos9Y6H
LVnMB9tozQTFf0R3S8H90AAyS6uEzuW6BWDwbQBJvmkPL8gG/AszZWJU9JBfiAHvaWM00A
QwzIv2+veCA2TcYIKhyiXg8r6fOQNLYkSYPpasycJy0nFknCC5Ma6XBgdzHm8QGSD4NfTZ
jbO+uK2z5ZzM+BUprj4Af3vOXqiDD66aZbKdcwzcTRLVy/rgAAAMEA8B/4ilNBG7Z/sYGB
zcBz52dkCG4tfsiY1dDYqEsDnLxF39giZj7Q0yLOHf52lt4GVEneCa5v8Q8jnN6zHZHt9A
C4P6DxtD/D28CGF3smMw6ai+W7fsl1OgEIYfSA9iKzh+sA3egSakiqKAk4H9soE9ZgERkx
cFuDljNGk+cekdzizpE2bmHfx4FscBcJxlZAeI35jSV5u6wzIkB2W13bq8nEI8VRu/n+PV
luxwuy6B5bUfuUDxL9W9Wr9P8t9mkHAAAAwQDa03teSRCRU/ymaua+sv3ysIDOUeSb09vf
8wX9xQpFq50CM99S3bGnwWk4A66JlK70rfWb3yoo5+Bmi22VRckQbhFhGBSWjnkKtAz5Mo
dXHOlcfPcXtxpOW4xwCsoNhnwaELt09b2BjkwWl5gdYUPHs2rIhSupK3otFN5j5GuVd6gf
bSuqavru4Xi5sySWyhKX2y+FkCDeNeOkIFeA12NNvoF4w+osLoz4GLdtydEhwSXUP9U+mr
lRqC1/Jc8qggcAAAAxbW9yaXR6QG1vcml0ei1BU1VTLVRVRi1HYW1pbmctQTE1LUZBNTA3
TlYtRkE1MDdOVgEC
-----END OPENSSH PRIVATE KEY-----

View File

@@ -1 +0,0 @@
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDNQZe3cZhxPffjiJYYYZyAvTMMqGSuJ6KRn7KrMOku4TNHC7d6m5Oa+YelPjlrAfJavqmA4+kPswZIOjXcFVECMJqlgLbdEvzsTdlFofpp7NW1X62OXq9wJG1DHi5BY60bNXwyLzgSsHG3fEqjX2J7JWgmcmKD1bugtt/jojT/cnPfVJFCiR+gNztMUeu1UTbVRmDE24N8oyEywFplw80/5FulyzuzwF3dDU9+tsDptMYZrgNgBHkeCb7P8Uxy7U9KsADh/H5jFCuA0LhM2XxPcdKwaee2E2hAwJyXctwCLLQLUlpapdYaNjBrCd9R2AHaeFv2Lm37K9tP9QvX6hsiElHH0RorgJJw2tprRlaZrCX81joO6a+XLw6l5TAxrKexkQU8RlXF1cVQdVEtHvg0bHbeyrqo9hm7LlsWFs8moheyHY+XqC8UTodlyblTqOAk5oe33wxIUiQgu1Z5pvRxKYICiS3xcX797O7fuZsS83MI1mkVgb13oxe4rkc4bTE= moritz@moritz-ASUS-TUF-Gaming-A15-FA507NV-FA507NV

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,4 @@
.PHONY: dev online-energieausweis all prod backup run-database build-database install-dependencies wait-for-database prod database prisma-studio backup-database-cronjob
.PHONY: dev online-energieausweis all prod backup run-database build-database install-dependencies wait-for-database prod database prisma-studio backup-database-cronjob update-dwd-klimafaktoren-cron
DB_CONTAINER_NAME := database
DB_NAME := main
@@ -30,6 +30,7 @@ run-database: stop-database
docker volume create $(DB_VOLUME)
docker build -t $(DB_CONTAINER_NAME) .
docker run -d --name $(DB_CONTAINER_NAME) \
--restart=always \
-e POSTGRES_USER=$(DB_USER) \
-e POSTGRES_PASSWORD=$(DB_PASSWORD) \
-p $(DB_PORT):5432 \
@@ -41,7 +42,7 @@ stop-database:
- docker stop $(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 \
sleep 1; \
done
@@ -57,7 +58,10 @@ all:
mkdir -p ~/logs
bun run dev 2>&1 | tee ~/logs/`date '+%d-%m-%Y_%H:%M:%S'`.log
prod: install-dependencies prisma-studio backup-database-cronjob
update-dwd-klimafaktoren-cron:
pm2 start bun --name "update-dwd-klimafaktoren-cron" --cron "0 12 28 * *" -- src/cronjobs/update-dwd-klimafaktoren.ts
prod: install-dependencies prisma-studio backup-database-cronjob update-dwd-klimafaktoren-cron
bun run build
mkdir -p ~/logs
mkdir -p ~/persistent/online-energieausweis
@@ -68,4 +72,4 @@ prod: install-dependencies prisma-studio backup-database-cronjob
backup-database-cronjob:
- 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

178
bun.lock
View File

@@ -18,7 +18,7 @@
"@trpc/client": "^10.45.2",
"@trpc/server": "^10.45.2",
"astro": "^4.16.17",
"astro-typesafe-api": "^0.2.2",
"astro-typesafe-api": "^0.2.4",
"body-scroll-lock": "^4.0.0-beta.0",
"buffer": "^6.0.3",
"bun": "^1.2.5",
@@ -38,12 +38,14 @@
"nodemailer": "^6.10.0",
"pdf-lib": "^1.17.1",
"postcss-nested": "^7.0.2",
"puppeteer": "^24.7.2",
"radix-svelte-icons": "^1.0.0",
"sass": "^1.83.4",
"sharp": "^0.33.5",
"siema": "^1.5.1",
"soap": "^1.1.8",
"sqids": "^0.3.0",
"ssh2-sftp-client": "^12.0.0",
"svelte": "^3.59.2",
"svelte-dialogs": "^1.2.2",
"svelte-preprocess": "^5.1.4",
@@ -51,6 +53,7 @@
"tailwindcss": "^3.4.17",
"trpc-openapi": "^1.2.0",
"uuid": "^9.0.1",
"winston": "^3.17.0",
"zod": "^3.24.1",
},
"devDependencies": {
@@ -67,6 +70,7 @@
"@types/nodemailer": "^6.4.17",
"@types/papaparse": "^5.3.15",
"@types/siema": "^1.4.11",
"@types/ssh2-sftp-client": "^9.0.4",
"@types/uuid": "^9.0.8",
"@typescript-eslint/eslint-plugin": "^5.62.0",
"@typescript-eslint/parser": "^5.62.0",
@@ -82,11 +86,11 @@
"postcss-import": "^16.1.0",
"postcss-nesting": "^13.0.1",
"prettier": "^2.8.8",
"prisma": "^6.4.1",
"prisma": "6.4.1",
"prisma-dbml-generator": "^0.12.0",
"prisma-generator-fake-data": "^0.14.3",
"tsx": "^4.19.3",
"typescript": "^5",
"typescript": "^5.8.3",
"zod-prisma": "^0.5.4",
},
},
@@ -251,7 +255,7 @@
"@cfcs/core": ["@cfcs/core@0.0.6", "", { "dependencies": { "@egjs/component": "^3.0.2" } }, "sha512-FxfJMwoLB8MEMConeXUCqtMGqxdtePQxRBOiGip9ULcYYam3WfCgoY6xdnMaSkYvRvmosp5iuG+TiPofm65+Pw=="],
"@colors/colors": ["@colors/colors@1.5.0", "", {}, "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ=="],
"@colors/colors": ["@colors/colors@1.6.0", "", {}, "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA=="],
"@csstools/selector-resolve-nested": ["@csstools/selector-resolve-nested@3.0.0", "", { "peerDependencies": { "postcss-selector-parser": "^7.0.0" } }, "sha512-ZoK24Yku6VJU1gS79a5PFmC8yn3wIapiKmPgun0hZgEI5AOqgH2kiPRsPz1qkGv4HL+wuDLH83yQyk6inMYrJQ=="],
@@ -263,6 +267,8 @@
"@cypress/xvfb": ["@cypress/xvfb@1.2.4", "", { "dependencies": { "debug": "^3.1.0", "lodash.once": "^4.1.1" } }, "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q=="],
"@dabh/diagnostics": ["@dabh/diagnostics@2.0.3", "", { "dependencies": { "colorspace": "1.1.x", "enabled": "2.0.x", "kuler": "^2.0.0" } }, "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA=="],
"@daybrush/utils": ["@daybrush/utils@1.13.0", "", {}, "sha512-ALK12C6SQNNHw1enXK+UO8bdyQ+jaWNQ1Af7Z3FNxeAwjYhQT7do+TRE4RASAJ3ObaS2+TJ7TXR3oz2Gzbw0PQ=="],
"@dnd-kit/accessibility": ["@dnd-kit/accessibility@3.1.1", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw=="],
@@ -517,6 +523,8 @@
"@proload/core": ["@proload/core@0.3.3", "", { "dependencies": { "deepmerge": "^4.2.2", "escalade": "^3.1.1" } }, "sha512-7dAFWsIK84C90AMl24+N/ProHKm4iw0akcnoKjRvbfHifJZBLhaDsDus1QJmhG12lXj4e/uB/8mB/0aduCW+NQ=="],
"@puppeteer/browsers": ["@puppeteer/browsers@2.10.2", "", { "dependencies": { "debug": "^4.4.0", "extract-zip": "^2.0.1", "progress": "^2.0.3", "proxy-agent": "^6.5.0", "semver": "^7.7.1", "tar-fs": "^3.0.8", "yargs": "^17.7.2" }, "bin": { "browsers": "lib/cjs/main-cli.js" } }, "sha512-i4Ez+s9oRWQbNjtI/3+jxr7OH508mjAKvza0ekPJem0ZtmsYHP3B5dq62+IaBHKaGCOuqJxXzvFLUhJvQ6jtsQ=="],
"@rc-component/async-validator": ["@rc-component/async-validator@5.0.4", "", { "dependencies": { "@babel/runtime": "^7.24.4" } }, "sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg=="],
"@rc-component/color-picker": ["@rc-component/color-picker@2.0.1", "", { "dependencies": { "@ant-design/fast-color": "^2.0.6", "@babel/runtime": "^7.23.6", "classnames": "^2.2.6", "rc-util": "^5.38.1" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-WcZYwAThV/b2GISQ8F+7650r5ZZJ043E57aVBFkQ+kSY4C6wdofXgB0hBx+GPGpIU0Z81eETNoDUJMr7oy/P8Q=="],
@@ -711,6 +719,8 @@
"@tailwindcss/typography": ["@tailwindcss/typography@0.5.16", "", { "dependencies": { "lodash.castarray": "^4.4.0", "lodash.isplainobject": "^4.0.6", "lodash.merge": "^4.6.2", "postcss-selector-parser": "6.0.10" }, "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" } }, "sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA=="],
"@tootallnate/quickjs-emscripten": ["@tootallnate/quickjs-emscripten@0.23.0", "", {}, "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA=="],
"@trpc/client": ["@trpc/client@10.45.2", "", { "peerDependencies": { "@trpc/server": "10.45.2" } }, "sha512-ykALM5kYWTLn1zYuUOZ2cPWlVfrXhc18HzBDyRhoPYN0jey4iQHEFSEowfnhg1RvYnrAVjNBgHNeSAXjrDbGwg=="],
"@trpc/server": ["@trpc/server@10.45.2", "", {}, "sha512-wOrSThNNE4HUnuhJG6PfDRp4L2009KDVxsd+2VYH8ro6o/7/jwYZ8Uu5j+VaW+mOmc8EHerHzGcdbGNQSAUPgg=="],
@@ -807,6 +817,12 @@
"@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/triple-beam": ["@types/triple-beam@1.3.5", "", {}, "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw=="],
"@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=="],
@@ -903,13 +919,15 @@
"assert-plus": ["assert-plus@1.0.0", "", {}, "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw=="],
"ast-types": ["ast-types@0.13.4", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w=="],
"astral-regex": ["astral-regex@2.0.0", "", {}, "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="],
"astring": ["astring@1.9.0", "", { "bin": { "astring": "bin/astring" } }, "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg=="],
"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=="],
@@ -933,16 +951,30 @@
"axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="],
"b4a": ["b4a@1.6.7", "", {}, "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg=="],
"babel-runtime": ["babel-runtime@6.26.0", "", { "dependencies": { "core-js": "^2.4.0", "regenerator-runtime": "^0.11.0" } }, "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g=="],
"bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="],
"balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
"bare-events": ["bare-events@2.5.4", "", {}, "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA=="],
"bare-fs": ["bare-fs@4.1.3", "", { "dependencies": { "bare-events": "^2.5.4", "bare-path": "^3.0.0", "bare-stream": "^2.6.4" }, "peerDependencies": { "bare-buffer": "*" }, "optionalPeers": ["bare-buffer"] }, "sha512-OeEZYIg+2qepaWLyphaOXHAHKo3xkM8y3BeGAvHdMN8GNWvEAU1Yw6rYpGzu/wDDbKxgEjVeVDpgGhDzaeMpjg=="],
"bare-os": ["bare-os@3.6.1", "", {}, "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g=="],
"bare-path": ["bare-path@3.0.0", "", { "dependencies": { "bare-os": "^3.0.1" } }, "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw=="],
"bare-stream": ["bare-stream@2.6.5", "", { "dependencies": { "streamx": "^2.21.0" }, "peerDependencies": { "bare-buffer": "*", "bare-events": "*" }, "optionalPeers": ["bare-buffer", "bare-events"] }, "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA=="],
"base-64": ["base-64@1.0.0", "", {}, "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg=="],
"base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="],
"basic-ftp": ["basic-ftp@5.0.5", "", {}, "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg=="],
"bcrypt-pbkdf": ["bcrypt-pbkdf@1.0.2", "", { "dependencies": { "tweetnacl": "^0.14.3" } }, "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w=="],
"binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="],
@@ -975,6 +1007,10 @@
"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-types": ["bun-types@1.2.2", "", { "dependencies": { "@types/node": "*", "@types/ws": "~8.5.10" } }, "sha512-RCbMH5elr9gjgDGDhkTTugA21XtJAy/9jkKe/G3WR2q17VPGhcquf9Sir6uay9iW+7P/BV0CAHA1XlHXMAVKHg=="],
@@ -1021,6 +1057,8 @@
"chownr": ["chownr@2.0.0", "", {}, "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="],
"chromium-bidi": ["chromium-bidi@4.1.1", "", { "dependencies": { "mitt": "^3.0.1", "zod": "^3.24.1" }, "peerDependencies": { "devtools-protocol": "*" } }, "sha512-biR7t4vF3YluE6RlMSk9IWk+b9U+WWyzHp+N2pL9vRTk+UXHYRTVp7jTK58ZNzMLBgoLMHY4QyJMbeuw3eKxqg=="],
"ci-info": ["ci-info@4.1.0", "", {}, "sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A=="],
"cjs-module-lexer": ["cjs-module-lexer@1.4.3", "", {}, "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q=="],
@@ -1039,6 +1077,8 @@
"cli-truncate": ["cli-truncate@2.1.0", "", { "dependencies": { "slice-ansi": "^3.0.0", "string-width": "^4.2.0" } }, "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg=="],
"cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="],
"clone": ["clone@2.1.2", "", {}, "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w=="],
"clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],
@@ -1061,6 +1101,8 @@
"colorette": ["colorette@2.0.19", "", {}, "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ=="],
"colorspace": ["colorspace@1.1.4", "", { "dependencies": { "color": "^3.1.3", "text-hex": "1.0.x" } }, "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w=="],
"combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="],
"comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="],
@@ -1083,6 +1125,8 @@
"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=="],
"console-control-strings": ["console-control-strings@1.1.0", "", {}, "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ=="],
@@ -1107,6 +1151,10 @@
"core-util-is": ["core-util-is@1.0.2", "", {}, "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="],
"cosmiconfig": ["cosmiconfig@9.0.0", "", { "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg=="],
"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=="],
"crc32-stream": ["crc32-stream@4.0.3", "", { "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^3.4.0" } }, "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw=="],
@@ -1141,6 +1189,8 @@
"dashdash": ["dashdash@1.14.1", "", { "dependencies": { "assert-plus": "^1.0.0" } }, "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g=="],
"data-uri-to-buffer": ["data-uri-to-buffer@6.0.2", "", {}, "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw=="],
"date-fns": ["date-fns@4.1.0", "", {}, "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg=="],
"dayjs": ["dayjs@1.11.13", "", {}, "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="],
@@ -1161,6 +1211,8 @@
"defu": ["defu@6.1.4", "", {}, "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="],
"degenerator": ["degenerator@5.0.1", "", { "dependencies": { "ast-types": "^0.13.4", "escodegen": "^2.1.0", "esprima": "^4.0.1" } }, "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ=="],
"del": ["del@6.1.1", "", { "dependencies": { "globby": "^11.0.1", "graceful-fs": "^4.2.4", "is-glob": "^4.0.1", "is-path-cwd": "^2.2.0", "is-path-inside": "^3.0.2", "p-map": "^4.0.0", "rimraf": "^3.0.2", "slash": "^3.0.0" } }, "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg=="],
"delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="],
@@ -1189,6 +1241,8 @@
"devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="],
"devtools-protocol": ["devtools-protocol@0.0.1425554", "", {}, "sha512-uRfxR6Nlzdzt0ihVIkV+sLztKgs7rgquY/Mhcv1YNCWDh5IZgl5mnn2aeEnW5stYTE0wwiF4RYVz8eMEpV1SEw=="],
"dezalgo": ["dezalgo@1.0.4", "", { "dependencies": { "asap": "^2.0.0", "wrappy": "1" } }, "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig=="],
"dfa": ["dfa@1.2.0", "", {}, "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q=="],
@@ -1225,6 +1279,8 @@
"emoji-regex-xs": ["emoji-regex-xs@1.0.0", "", {}, "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg=="],
"enabled": ["enabled@2.0.0", "", {}, "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ=="],
"encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="],
"end-of-stream": ["end-of-stream@1.4.4", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q=="],
@@ -1263,6 +1319,8 @@
"escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="],
"escodegen": ["escodegen@2.1.0", "", { "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", "esutils": "^2.0.2" }, "optionalDependencies": { "source-map": "~0.6.1" }, "bin": { "esgenerate": "bin/esgenerate.js", "escodegen": "bin/escodegen.js" } }, "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w=="],
"eslint": ["eslint@8.15.0", "", { "dependencies": { "@eslint/eslintrc": "^1.2.3", "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.1.1", "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.3.0", "espree": "^9.3.2", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", "glob-parent": "^6.0.1", "globals": "^13.6.0", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, "bin": { "eslint": "bin/eslint.js" } }, "sha512-GG5USZ1jhCu8HJkzGgeK8/+RGnHaNYZGrGDzUtigK3BsGESW/rs2az23XqE0WVwDxy1VRvvjSSGu5nB0Bu+6SA=="],
"eslint-config-prettier": ["eslint-config-prettier@8.1.0", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-oKMhGv3ihGbCIimCAjqkdzx2Q+jthoqnXSP+d86M9tptwugycmTFdVR4IpLgq2c4SHifbwO90z2fQ8/Aio73yw=="],
@@ -1323,6 +1381,8 @@
"fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
"fast-fifo": ["fast-fifo@1.3.2", "", {}, "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ=="],
"fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="],
"fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="],
@@ -1337,6 +1397,8 @@
"fd-slicer": ["fd-slicer@1.1.0", "", { "dependencies": { "pend": "~1.2.0" } }, "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g=="],
"fecha": ["fecha@4.2.3", "", {}, "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw=="],
"figures": ["figures@3.2.0", "", { "dependencies": { "escape-string-regexp": "^1.0.5" } }, "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg=="],
"file-entry-cache": ["file-entry-cache@6.0.1", "", { "dependencies": { "flat-cache": "^3.0.4" } }, "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg=="],
@@ -1361,6 +1423,8 @@
"flattie": ["flattie@1.1.1", "", {}, "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ=="],
"fn.name": ["fn.name@1.1.0", "", {}, "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw=="],
"follow-redirects": ["follow-redirects@1.15.9", "", {}, "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="],
"fontkit": ["fontkit@2.0.4", "", { "dependencies": { "@swc/helpers": "^0.5.12", "brotli": "^1.3.2", "clone": "^2.1.2", "dfa": "^1.2.0", "fast-deep-equal": "^3.1.3", "restructure": "^3.0.0", "tiny-inflate": "^1.0.3", "unicode-properties": "^1.4.0", "unicode-trie": "^2.0.0" } }, "sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g=="],
@@ -1407,6 +1471,8 @@
"gesto": ["gesto@1.19.4", "", { "dependencies": { "@daybrush/utils": "^1.13.0", "@scena/event-emitter": "^1.0.2" } }, "sha512-hfr/0dWwh0Bnbb88s3QVJd1ZRJeOWcgHPPwmiH6NnafDYvhTsxg+SLYu+q/oPNh9JS3V+nlr6fNs8kvPAtcRDQ=="],
"get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="],
"get-east-asian-width": ["get-east-asian-width@1.3.0", "", {}, "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ=="],
"get-intrinsic": ["get-intrinsic@1.2.7", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "function-bind": "^1.1.2", "get-proto": "^1.0.0", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA=="],
@@ -1419,6 +1485,8 @@
"get-tsconfig": ["get-tsconfig@4.10.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A=="],
"get-uri": ["get-uri@6.0.4", "", { "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", "debug": "^4.3.4" } }, "sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ=="],
"getopts": ["getopts@2.3.0", "", {}, "sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA=="],
"getos": ["getos@3.2.1", "", { "dependencies": { "async": "^3.2.0" } }, "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q=="],
@@ -1541,6 +1609,8 @@
"intersection-observer": ["intersection-observer@0.12.2", "", {}, "sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg=="],
"ip-address": ["ip-address@9.0.5", "", { "dependencies": { "jsbn": "1.1.0", "sprintf-js": "^1.1.3" } }, "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g=="],
"ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="],
"iron-webcrypto": ["iron-webcrypto@1.2.1", "", {}, "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg=="],
@@ -1549,7 +1619,7 @@
"is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="],
"is-arrayish": ["is-arrayish@0.3.2", "", {}, "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="],
"is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="],
"is-base64": ["is-base64@1.1.0", "", { "bin": { "is-base64": "bin/is-base64", "is_base64": "bin/is-base64" } }, "sha512-Nlhg7Z2dVC4/PTvIFkgVVNvPHSO2eR/Yd0XzhGiXCXEvWnptXlXa/clQ8aePPiMuxEGcWfzWbGw2Fe3d+Y3v1g=="],
@@ -1661,6 +1731,8 @@
"knex": ["knex@2.5.1", "", { "dependencies": { "colorette": "2.0.19", "commander": "^10.0.0", "debug": "4.3.4", "escalade": "^3.1.1", "esm": "^3.2.25", "get-package-type": "^0.1.0", "getopts": "2.3.0", "interpret": "^2.2.0", "lodash": "^4.17.21", "pg-connection-string": "2.6.1", "rechoir": "^0.8.0", "resolve-from": "^5.0.0", "tarn": "^3.0.2", "tildify": "2.0.0" }, "bin": { "knex": "bin/cli.js" } }, "sha512-z78DgGKUr4SE/6cm7ku+jHvFT0X97aERh/f0MUKAKgFnwCYBEW4TFBqtHWFYiJFid7fMrtpZ/gxJthvz5mEByA=="],
"kuler": ["kuler@2.0.0", "", {}, "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A=="],
"lazy-ass": ["lazy-ass@1.6.0", "", {}, "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw=="],
"lazystream": ["lazystream@1.0.1", "", { "dependencies": { "readable-stream": "^2.0.5" } }, "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw=="],
@@ -1713,6 +1785,8 @@
"log-update": ["log-update@4.0.0", "", { "dependencies": { "ansi-escapes": "^4.3.0", "cli-cursor": "^3.1.0", "slice-ansi": "^4.0.0", "wrap-ansi": "^6.2.0" } }, "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg=="],
"logform": ["logform@2.7.0", "", { "dependencies": { "@colors/colors": "1.6.0", "@types/triple-beam": "^1.3.2", "fecha": "^4.2.0", "ms": "^2.1.1", "safe-stable-stringify": "^2.3.1", "triple-beam": "^1.3.0" } }, "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ=="],
"longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="],
"loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="],
@@ -1877,6 +1951,8 @@
"minizlib": ["minizlib@2.1.2", "", { "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" } }, "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg=="],
"mitt": ["mitt@3.0.1", "", {}, "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="],
"mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="],
"module-details-from-path": ["module-details-from-path@1.0.3", "", {}, "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A=="],
@@ -1903,6 +1979,8 @@
"neotraverse": ["neotraverse@0.6.18", "", {}, "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA=="],
"netmask": ["netmask@2.0.2", "", {}, "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg=="],
"new-github-issue-url": ["new-github-issue-url@0.2.1", "", {}, "sha512-md4cGoxuT4T4d/HDOXbrUHkTKrp/vp+m3aOA7XXVYwNsUNMK49g3SQicTSeV5GIz/5QVGAeYRAOlyp9OvlgsYA=="],
"nlcst-to-string": ["nlcst-to-string@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0" } }, "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA=="],
@@ -1953,6 +2031,8 @@
"once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="],
"one-time": ["one-time@1.0.0", "", { "dependencies": { "fn.name": "1.x.x" } }, "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g=="],
"onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="],
"oniguruma-to-es": ["oniguruma-to-es@2.3.0", "", { "dependencies": { "emoji-regex-xs": "^1.0.0", "regex": "^5.1.1", "regex-recursion": "^5.1.1" } }, "sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g=="],
@@ -1985,6 +2065,10 @@
"p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="],
"pac-proxy-agent": ["pac-proxy-agent@7.2.0", "", { "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", "agent-base": "^7.1.2", "debug": "^4.3.4", "get-uri": "^6.0.1", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.6", "pac-resolver": "^7.0.1", "socks-proxy-agent": "^8.0.5" } }, "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA=="],
"pac-resolver": ["pac-resolver@7.0.1", "", { "dependencies": { "degenerator": "^5.0.0", "netmask": "^2.0.2" } }, "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg=="],
"package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="],
"pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="],
@@ -2095,12 +2179,18 @@
"proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="],
"proxy-agent": ["proxy-agent@6.5.0", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "http-proxy-agent": "^7.0.1", "https-proxy-agent": "^7.0.6", "lru-cache": "^7.14.1", "pac-proxy-agent": "^7.1.0", "proxy-from-env": "^1.1.0", "socks-proxy-agent": "^8.0.5" } }, "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A=="],
"proxy-from-env": ["proxy-from-env@1.0.0", "", {}, "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A=="],
"pump": ["pump@3.0.2", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw=="],
"punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
"puppeteer": ["puppeteer@24.7.2", "", { "dependencies": { "@puppeteer/browsers": "2.10.2", "chromium-bidi": "4.1.1", "cosmiconfig": "^9.0.0", "devtools-protocol": "0.0.1425554", "puppeteer-core": "24.7.2", "typed-query-selector": "^2.12.0" }, "bin": { "puppeteer": "lib/cjs/puppeteer/node/cli.js" } }, "sha512-ifYqoY6wGs0yZeFuFPn8BE9FhuveXkarF+eO18I2e/axdoCh4Qh1AE+qXdJBhdaeoPt6eRNTY4Dih29Jbq8wow=="],
"puppeteer-core": ["puppeteer-core@24.7.2", "", { "dependencies": { "@puppeteer/browsers": "2.10.2", "chromium-bidi": "4.1.1", "debug": "^4.4.0", "devtools-protocol": "0.0.1425554", "typed-query-selector": "^2.12.0", "ws": "^8.18.1" } }, "sha512-P9pZyTmJqKODFCnkZgemCpoFA4LbAa8+NumHVQKyP5X9IgdNS1ZnAnIh1sMAwhF8/xEUGf7jt+qmNLlKieFw1Q=="],
"qs": ["qs@6.13.0", "", { "dependencies": { "side-channel": "^1.0.6" } }, "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg=="],
"queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="],
@@ -2265,6 +2355,8 @@
"request-progress": ["request-progress@3.0.0", "", { "dependencies": { "throttleit": "^1.0.0" } }, "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg=="],
"require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="],
"require-in-the-middle": ["require-in-the-middle@7.5.2", "", { "dependencies": { "debug": "^4.3.5", "module-details-from-path": "^1.0.3", "resolve": "^1.22.8" } }, "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ=="],
"resize-observer-polyfill": ["resize-observer-polyfill@1.5.1", "", {}, "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="],
@@ -2307,6 +2399,8 @@
"safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
"safe-stable-stringify": ["safe-stable-stringify@2.5.0", "", {}, "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA=="],
"safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
"sander": ["sander@0.5.1", "", { "dependencies": { "es6-promise": "^3.1.2", "graceful-fs": "^4.1.3", "mkdirp": "^0.5.1", "rimraf": "^2.5.2" } }, "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA=="],
@@ -2373,8 +2467,14 @@
"slice-ansi": ["slice-ansi@3.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" } }, "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ=="],
"smart-buffer": ["smart-buffer@4.2.0", "", {}, "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="],
"soap": ["soap@1.1.8", "", { "dependencies": { "axios": "^1.7.9", "axios-ntlm": "^1.4.2", "debug": "^4.4.0", "formidable": "^3.5.2", "get-stream": "^6.0.1", "lodash": "^4.17.21", "sax": "^1.4.1", "strip-bom": "^3.0.0", "whatwg-mimetype": "4.0.0", "xml-crypto": "^6.0.0" } }, "sha512-fDNGyGsPkQP3bZX/366Ud5Kpjo9mCMh7ZKYIc3uipBEPPM2ZqCNkv1Z2/w0qpzpYFLL7do8WWwVUAjAwuUe1AQ=="],
"socks": ["socks@2.8.4", "", { "dependencies": { "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" } }, "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ=="],
"socks-proxy-agent": ["socks-proxy-agent@8.0.5", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "socks": "^2.8.3" } }, "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw=="],
"sorcery": ["sorcery@0.11.1", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.14", "buffer-crc32": "^1.0.0", "minimist": "^1.2.0", "sander": "^0.5.0" }, "bin": { "sorcery": "bin/sorcery" } }, "sha512-o7npfeJE6wi6J9l0/5LKshFzZ2rMatRiCDwYeDQaOzqdzRJwALhX7mk/A/ecg6wjMu7wdZbmXfD2S/vpOg0bdQ=="],
"source-map": ["source-map@0.7.4", "", {}, "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA=="],
@@ -2395,12 +2495,20 @@
"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=="],
"stack-trace": ["stack-trace@0.0.10", "", {}, "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg=="],
"statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="],
"stdin-discarder": ["stdin-discarder@0.2.2", "", {}, "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ=="],
"streamx": ["streamx@2.22.0", "", { "dependencies": { "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" }, "optionalDependencies": { "bare-events": "^2.2.0" } }, "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw=="],
"string-convert": ["string-convert@0.2.1", "", {}, "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A=="],
"string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
@@ -2455,6 +2563,8 @@
"tar": ["tar@6.2.1", "", { "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" } }, "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A=="],
"tar-fs": ["tar-fs@3.0.8", "", { "dependencies": { "pump": "^3.0.0", "tar-stream": "^3.1.5" }, "optionalDependencies": { "bare-fs": "^4.0.1", "bare-path": "^3.0.0" } }, "sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg=="],
"tar-stream": ["tar-stream@2.2.0", "", { "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" } }, "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ=="],
"tarn": ["tarn@3.0.2", "", {}, "sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ=="],
@@ -2467,6 +2577,10 @@
"terminal-link": ["terminal-link@2.1.1", "", { "dependencies": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" } }, "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ=="],
"text-decoder": ["text-decoder@1.2.3", "", { "dependencies": { "b4a": "^1.6.4" } }, "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA=="],
"text-hex": ["text-hex@1.0.0", "", {}, "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg=="],
"text-table": ["text-table@0.2.0", "", {}, "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="],
"thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="],
@@ -2511,6 +2625,8 @@
"trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="],
"triple-beam": ["triple-beam@1.4.1", "", {}, "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg=="],
"trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="],
"trpc-openapi": ["trpc-openapi@1.2.0", "", { "dependencies": { "co-body": "^6.1.0", "h3": "^1.6.4", "lodash.clonedeep": "^4.5.0", "node-mocks-http": "^1.12.2", "openapi-types": "^12.1.1", "zod-to-json-schema": "^3.21.1" }, "peerDependencies": { "@trpc/server": "^10.0.0", "zod": "^3.14.4" } }, "sha512-pfYoCd/3KYXWXvUPZBKJw455OOwngKN/6SIcj7Yit19OMLJ+8yVZkEvGEeg5wUSwfsiTdRsKuvqkRPXVSwV7ew=="],
@@ -2539,6 +2655,10 @@
"type-is": ["type-is@1.6.18", "", { "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" } }, "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="],
"typed-query-selector": ["typed-query-selector@2.12.0", "", {}, "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg=="],
"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=="],
"ufo": ["ufo@1.5.4", "", {}, "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ=="],
@@ -2635,6 +2755,10 @@
"widest-line": ["widest-line@5.0.0", "", { "dependencies": { "string-width": "^7.0.0" } }, "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA=="],
"winston": ["winston@3.17.0", "", { "dependencies": { "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.2", "async": "^3.2.3", "is-stream": "^2.0.0", "logform": "^2.7.0", "one-time": "^1.0.0", "readable-stream": "^3.4.0", "safe-stable-stringify": "^2.3.1", "stack-trace": "0.0.x", "triple-beam": "^1.3.0", "winston-transport": "^4.9.0" } }, "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw=="],
"winston-transport": ["winston-transport@4.9.0", "", { "dependencies": { "logform": "^2.7.0", "readable-stream": "^3.6.2", "triple-beam": "^1.3.0" } }, "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A=="],
"word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="],
"wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
@@ -2643,16 +2767,22 @@
"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=="],
"xpath": ["xpath@0.0.33", "", {}, "sha512-NNXnzrkDrAzalLhIUc01jO2mOzXGXh1JwPgkihcLLzw98c0WgYDmmjSh1Kl3wzaxSVWMuA+fe0WTWOBDWCBmNA=="],
"xxhash-wasm": ["xxhash-wasm@1.1.0", "", {}, "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA=="],
"y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="],
"yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="],
"yaml": ["yaml@2.7.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA=="],
"yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="],
"yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="],
"yauzl": ["yauzl@2.10.0", "", { "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } }, "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g=="],
@@ -2737,10 +2867,14 @@
"@prisma/schema-files-loader/fs-extra": ["fs-extra@11.1.1", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ=="],
"@puppeteer/browsers/semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="],
"@rollup/pluginutils/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="],
"@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/utils/eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="],
@@ -2779,8 +2913,12 @@
"chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
"cli-table3/@colors/colors": ["@colors/colors@1.5.0", "", {}, "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ=="],
"co-body/qs": ["qs@6.14.0", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w=="],
"colorspace/color": ["color@3.2.1", "", { "dependencies": { "color-convert": "^1.9.3", "color-string": "^1.6.0" } }, "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA=="],
"csvtojson/strip-bom": ["strip-bom@2.0.0", "", { "dependencies": { "is-utf8": "^0.2.0" } }, "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g=="],
"cypress/buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="],
@@ -2793,7 +2931,7 @@
"dir-glob/path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="],
"error-ex/is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="],
"escodegen/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
"eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@2.1.0", "", {}, "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw=="],
@@ -2831,6 +2969,10 @@
"ignore-walk/minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="],
"ip-address/jsbn": ["jsbn@1.1.0", "", {}, "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A=="],
"ip-address/sprintf-js": ["sprintf-js@1.1.3", "", {}, "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="],
"is-wsl/is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="],
"knex/commander": ["commander@10.0.1", "", {}, "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug=="],
@@ -2889,6 +3031,10 @@
"p-locate/p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="],
"pac-proxy-agent/http-proxy-agent": ["http-proxy-agent@7.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="],
"pac-proxy-agent/https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="],
"parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
"path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
@@ -2909,6 +3055,14 @@
"prop-types/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="],
"proxy-agent/http-proxy-agent": ["http-proxy-agent@7.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="],
"proxy-agent/https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="],
"proxy-agent/lru-cache": ["lru-cache@7.18.3", "", {}, "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="],
"proxy-agent/proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="],
"rc-align/rc-util": ["rc-util@4.21.1", "", { "dependencies": { "add-dom-event-listener": "^1.1.0", "prop-types": "^15.5.10", "react-is": "^16.12.0", "react-lifecycles-compat": "^3.0.4", "shallowequal": "^1.1.0" } }, "sha512-Z+vlkSQVc1l8O2UjR3WQ+XdWlhj5q9BMQNLk2iOBch75CqPfrJyGtcWMcnhRlNuDu0Ndtt4kLVO8JI8BrABobg=="],
"rc-animate/rc-util": ["rc-util@4.21.1", "", { "dependencies": { "add-dom-event-listener": "^1.1.0", "prop-types": "^15.5.10", "react-is": "^16.12.0", "react-lifecycles-compat": "^3.0.4", "shallowequal": "^1.1.0" } }, "sha512-Z+vlkSQVc1l8O2UjR3WQ+XdWlhj5q9BMQNLk2iOBch75CqPfrJyGtcWMcnhRlNuDu0Ndtt4kLVO8JI8BrABobg=="],
@@ -2941,6 +3095,8 @@
"serve-static/send": ["send@0.19.0", "", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "2.4.1", "range-parser": "~1.2.1", "statuses": "2.0.1" } }, "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw=="],
"simple-swizzle/is-arrayish": ["is-arrayish@0.3.2", "", {}, "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="],
"soap/strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="],
"sorcery/buffer-crc32": ["buffer-crc32@1.0.0", "", {}, "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w=="],
@@ -2959,6 +3115,8 @@
"tar/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="],
"tar-fs/tar-stream": ["tar-stream@3.1.7", "", { "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ=="],
"temp-write/temp-dir": ["temp-dir@1.0.0", "", {}, "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ=="],
"temp-write/uuid": ["uuid@3.4.0", "", { "bin": { "uuid": "./bin/uuid" } }, "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="],
@@ -3001,6 +3159,8 @@
"@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/utils/eslint-scope/estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="],
@@ -3019,6 +3179,8 @@
"boxen/wrap-ansi/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="],
"colorspace/color/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="],
"express/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="],
"express/send/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="],
@@ -3169,6 +3331,8 @@
"boxen/wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="],
"colorspace/color/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="],
"form-render/color/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="],
"npm-packlist/glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="],

View File

@@ -2,6 +2,7 @@ version: '3'
services:
database:
build: ./
restart: always
env_file:
- .env
ports:

View File

@@ -1 +0,0 @@
console.log("Hello via Bun!");

View File

@@ -32,7 +32,7 @@
"@trpc/client": "^10.45.2",
"@trpc/server": "^10.45.2",
"astro": "^4.16.17",
"astro-typesafe-api": "^0.2.2",
"astro-typesafe-api": "^0.2.4",
"body-scroll-lock": "^4.0.0-beta.0",
"buffer": "^6.0.3",
"bun": "^1.2.5",
@@ -52,12 +52,14 @@
"nodemailer": "^6.10.0",
"pdf-lib": "^1.17.1",
"postcss-nested": "^7.0.2",
"puppeteer": "^24.7.2",
"radix-svelte-icons": "^1.0.0",
"sass": "^1.83.4",
"sharp": "^0.33.5",
"siema": "^1.5.1",
"soap": "^1.1.8",
"sqids": "^0.3.0",
"ssh2-sftp-client": "^12.0.0",
"svelte": "^3.59.2",
"svelte-dialogs": "^1.2.2",
"svelte-preprocess": "^5.1.4",
@@ -65,6 +67,7 @@
"tailwindcss": "^3.4.17",
"trpc-openapi": "^1.2.0",
"uuid": "^9.0.1",
"winston": "^3.17.0",
"zod": "^3.24.1"
},
"devDependencies": {
@@ -81,6 +84,7 @@
"@types/nodemailer": "^6.4.17",
"@types/papaparse": "^5.3.15",
"@types/siema": "^1.4.11",
"@types/ssh2-sftp-client": "^9.0.4",
"@types/uuid": "^9.0.8",
"@typescript-eslint/eslint-plugin": "^5.62.0",
"@typescript-eslint/parser": "^5.62.0",

BIN
persistent/images/haken.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 256 B

View File

@@ -0,0 +1,9 @@
-- AlterTable
ALTER TABLE "BedarfsausweisWohnen" ALTER COLUMN "fenster_art_1" SET DATA TYPE TEXT,
ALTER COLUMN "fenster_art_2" SET DATA TYPE TEXT,
ALTER COLUMN "dachfenster_art" SET DATA TYPE TEXT,
ALTER COLUMN "haustuer_art" SET DATA TYPE TEXT,
ALTER COLUMN "dach_daemmung" SET DATA TYPE TEXT,
ALTER COLUMN "decke_daemmung" SET DATA TYPE TEXT,
ALTER COLUMN "aussenwand_daemmung" SET DATA TYPE TEXT,
ALTER COLUMN "boden_daemmung" SET DATA TYPE TEXT;

View File

@@ -41,19 +41,19 @@ model BedarfsausweisWohnen {
volumen Float?
dicht Boolean?
fenster_flaeche_1 Float?
fenster_art_1 Float?
fenster_art_1 String?
fenster_flaeche_2 Float?
fenster_art_2 Float?
fenster_art_2 String?
dachfenster_flaeche Float?
dachfenster_art Float?
dachfenster_art String?
haustuer_flaeche Float?
haustuer_art Float?
haustuer_art String?
dach_bauart String? @db.VarChar
decke_bauart String? @db.VarChar
dach_daemmung Float?
decke_daemmung Float?
aussenwand_daemmung Float?
boden_daemmung Float?
dach_daemmung String?
decke_daemmung String?
aussenwand_daemmung String?
boden_daemmung String?
aussenwand_bauart String? @db.VarChar
boden_bauart String? @db.VarChar
warmwasser_verteilung String? @db.VarChar

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 10 MiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 10 MiB

View File

@@ -0,0 +1,45 @@
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"),
"admin/ausstellen": await import("../src/pages/api/admin/ausstellen.ts"),
"admin/bedarfsausweis-ausstellen": await import("../src/pages/api/admin/bedarfsausweis-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"),
"auth/access-token": await import("../src/pages/api/auth/access-token.ts"),
"auth/passwort-vergessen": await import("../src/pages/api/auth/passwort-vergessen.ts"),
"auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"),
"bedarfsausweis-gewerbe/[id]": await import("../src/pages/api/bedarfsausweis-gewerbe/[id].ts"),
"bedarfsausweis-gewerbe": await import("../src/pages/api/bedarfsausweis-gewerbe/index.ts"),
"bedarfsausweis-wohnen/[id]": await import("../src/pages/api/bedarfsausweis-wohnen/[id].ts"),
"bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"),
"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"),
"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"),
"webhooks/mollie": await import("../src/pages/api/webhooks/mollie.ts"),
"objekt/[id]": await import("../src/pages/api/objekt/[id]/index.ts"),
})

View File

@@ -10,8 +10,11 @@ import {
VerbrauchsausweisWohnenClient,
} from "#components/Ausweis/types.js";
import {
Aufnahme,
BedarfsausweisWohnen,
Bild,
Enums,
Objekt,
Unterlage,
VerbrauchsausweisGewerbe,
VerbrauchsausweisWohnen,
@@ -528,12 +531,12 @@ export async function bedarfsausweisWohnenSpeichern(
export async function ausweisSpeichern(
ausweis:
| VerbrauchsausweisWohnenClient
| VerbrauchsausweisGewerbeClient
| BedarfsausweisWohnenClient,
objekt: ObjektClient,
aufnahme: AufnahmeClient,
bilder: BildClient[],
| VerbrauchsausweisWohnen
| VerbrauchsausweisGewerbe
| BedarfsausweisWohnen,
objekt: Objekt,
aufnahme: Aufnahme,
bilder: Bild[],
unterlagen: Unterlage[],
ausweisart: Enums.Ausweisart
) {

View File

@@ -1,5 +1,5 @@
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
import { Aufnahme, Objekt } from "#lib/client/prisma.js";
import { Aufnahme, Benutzer, Objekt } from "#lib/client/prisma.js";
import { api } from "astro-typesafe-api/client";
import Cookies from "js-cookie";
@@ -145,7 +145,7 @@ export async function objektSpeichern(objekt: Objekt & { id?: string }): Promise
}
})
return objekt.id;
return objekt.id;
} else {
const { id } = await api.objekt.PUT.fetch({
adresse: objekt.adresse,
@@ -161,4 +161,32 @@ export async function objektSpeichern(objekt: Objekt & { id?: string }): Promise
return id;
}
}
export async function benutzerSpeichern(benutzer: Partial<Benutzer>): Promise<string> {
const completeBenutzer: Benutzer = {
id: benutzer.id,
name: benutzer.name ?? null,
email: benutzer.email,
passwort: "",
adresse: benutzer.adresse ?? null,
anrede: benutzer.anrede ?? null,
firma: benutzer.firma ?? null,
vorname: benutzer.vorname ?? null,
ort: benutzer.ort ?? null,
plz: benutzer.plz ?? null,
profilbild: benutzer.profilbild ?? null,
telefon: benutzer.telefon ?? null,
updated_at: new Date(),
verified: benutzer.verified ?? false,
};
await api.user.POST.fetch(completeBenutzer
, {
headers: {
Authorization: `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
});
return benutzer.id;
}

View File

@@ -131,11 +131,11 @@
window.history.pushState(
{},
"",
`${location.pathname}?id=${ausweis.id}`
`${location.pathname}?ausweis_id=${ausweis.id}`
);
blockLocalStorageSync = true;
localStorage.clear()
window.location.href = `/speichern-erfolgreich?id=${ausweis.id}`
window.location.href = `/dashboard/objekte/${ausweis.id}`
}
}

View File

@@ -20,9 +20,13 @@
export let ausweisart: Enums.Ausweisart;
</script>
<!--
{#if ausweisart=="BedarfsausweisWohnen"}
<AngabenZurHeizunganlage bind:ausweis/>
{/if}
{/if}
-->
<div
id="sanierungszustand"

View File

@@ -63,8 +63,15 @@
fuelMap[fuel[0]].push(fuel[1]);
}
let month = moment(ausweis.startdatum).month();
let year = moment(ausweis.startdatum).year();
// Falls der Ausweis bereits einmal gespeichert wurde mit einem Startdatum sollten wir dieses benutzen.
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") {

View File

@@ -52,7 +52,7 @@ $: {
<!-- % Anteil Warmwasser -->
<div class="input-standard order-2 md:order-2 xl:order-2">
<Inputlabel title="% Anteil Warmwasser"></Inputlabel>
<Inputlabel title="% Anteil Kühlung"></Inputlabel>
<input
name="anteil_kuehlung_1"

View File

@@ -40,15 +40,15 @@
"Dezember",
];
const startDate = moment(aufnahme.erstellungsdatum || Date.now())
const earlistPossibleStartDate = moment(aufnahme.erstellungsdatum || Date.now())
.subtract(4, "years")
.subtract(6, "months");
const endDate = moment(aufnahme.erstellungsdatum || Date.now()).subtract(
const lastPossibleEndDate = moment(aufnahme.erstellungsdatum || Date.now()).subtract(
3,
"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({
year: m.year(),
month: m.month(),
@@ -62,8 +62,15 @@
fuelMap[fuel[0]].push(fuel[1]);
}
let month = availableDates[availableDates.length - 1].month;
let year = availableDates[availableDates.length - 1].year;
// Falls der Ausweis bereits einmal gespeichert wurde mit einem Startdatum sollten wir dieses benutzen.
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") {

View File

@@ -14,6 +14,7 @@ import {
GEGNachweisWohnen,
BedarfsausweisGewerbe,
GEGNachweisGewerbe,
GEGEinpreisung
} from "#lib/client/prisma.js";
import { z, ZodSchema } from "zod";
@@ -79,6 +80,8 @@ export type BenutzerClient = OmitKeys<Benutzer, "passwort">;
export type RechnungClient = Rechnung
export type GEGEinpreisungClient = GEGEinpreisung
export function ZodOverlap<T, S = z.ZodType<T, z.ZodTypeDef, T>>(arg: S): S {
return arg;
}
@@ -97,7 +100,7 @@ export type OptionalNullable<T> = T extends object ? {
[K in keyof PickNotNullable<T>]: OptionalNullable<T[K]>
} : T;
export const UUidWithPrefix = z.string().refine((value) => {
export const IDWithPrefix = z.string().refine((value) => {
const prefixedUUidRegex = /^([A-Z]{2})[0-9A-Z]{6,9}$/i
const match = value.match(prefixedUUidRegex)
@@ -110,7 +113,7 @@ export const UUidWithPrefix = z.string().refine((value) => {
})
export function getAusweisartFromId(id: string): Enums.Ausweisart | null {
if (!UUidWithPrefix.safeParse(id).success) {
if (!IDWithPrefix.safeParse(id).success) {
return null
}

View File

@@ -1,939 +0,0 @@
<script lang="ts">
import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js";
import moment from "moment";
import {
AufnahmeClient,
getAusweisartFromId,
ObjektClient,
BildClient,
VerbrauchsausweisWohnenClient,
} from "./Ausweis/types.js";
import AusweisPruefenTooltip from "./AusweisPruefenTooltip.svelte";
import { addNotification } from "#components/Notifications/shared.js";
import { CheckCircled, CrossCircled, Image } from "radix-svelte-icons";
import ChevronDown from "radix-svelte-icons/src/lib/icons/ChevronDown.svelte";
import { Event } from "#lib/client/prisma.js";
import { api } from "astro-typesafe-api/client";
import Cookies from "js-cookie";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
import NotificationWrapper from "./Notifications/NotificationWrapper.svelte";
export let ausweis: VerbrauchsausweisWohnenClient;
export let aufnahme: AufnahmeClient;
export let objekt: ObjektClient;
export let bilder: BildClient[]
export let events: Event[]
export let calculations: Awaited<
ReturnType<typeof endEnergieVerbrauchVerbrauchsausweis_2016>
>;
async function ausweisAusstellen(uid: string) {
try {
await api.admin.ausstellen.GET.fetch({
id_ausweis: uid
}, {
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
} catch(e) {
addNotification({
message: "Das hat nicht geklappt.",
subtext: e as string,
timeout: 3000,
type: "error",
})
}
}
const ausweisArt = getAusweisartFromId(ausweis.id)
let verbrauchWWGesamt_1 = "";
let verbrauchWWGesamt_2 = "";
var Ausweisbild,
DatenBlattBild,
warmWasser,
anteilWarmwasser,
solarsystemWarmwasser;
let zurueckGestellt: any;
let symbolPruefung: any;
let StatusIcon: any;
let tooltip3Z1: any;
let tooltip3Z2: any;
let tooltip4Z1: any;
let tooltip4Z2: any;
let tooltip5Z1: any;
let tooltip5Z2: any;
let tooltip5Z3: any;
let tooltip6Z1: any;
let tooltip6Z2: any;
let tooltip7Z1: any;
let tooltip7Z2: any;
let tooltip8Z1: any;
let tooltip8Z2: any;
let tooltip9Z1: any;
let tooltip9Z2: any;
let tooltip10Z1: any;
let tooltip10Z2: any;
let tooltip11Z1: any;
let tooltip11Z2: any;
let tooltip12Z1: any;
let tooltip12Z2: any;
let tooltip13Z1: any;
let tooltip13Z2: any;
let tooltip14Z1: any;
let tooltip14Z2: any;
let tooltip15Z1: any;
let tooltip15Z2: any;
let tooltip16Z1: any;
let tooltip16Z2: any;
let table3Z1: any;
let table3Z2: any;
let table4Z1: any;
let table4Z2: any;
let table5Z1: any;
let table5Z2: any;
let table6Z1: any;
let table6Z2: any;
let table7Z1: any;
let table7Z2: any;
let table8Z1: any;
let table8Z2: any;
let table9Z1: any;
let table9Z2: any;
let table10Z1: any;
let table10Z2: any;
let table11Z1: any;
let table11Z2: any;
let table12Z1: any;
let table12Z2: any;
let table13Z1: any;
let table13Z2: any;
let table14Z1: any;
let table14Z2: any;
let table15Z1: any;
let table15Z2: any;
let table16Z1: any;
let table16Z2: any;
let Abgeschlossen: any;
if (ausweis.ausgestellt) {
Ausweisbild = "/images/dashboard/ausweishaken.jpg";
DatenBlattBild = "/images/dashboard/datenblatthaken.jpg";
StatusIcon = "/images/dashboard/erledigt.svg";
Abgeschlossen = 0;
} else if (ausweis.bestellt) {
Ausweisbild = "/images/dashboard/ausweis.jpg";
DatenBlattBild = "/images/dashboard/datenblatt.jpg";
StatusIcon = "/images/dashboard/bestellt.svg";
Abgeschlossen = 1;
} else {
Ausweisbild = "/images/dashboard/ausweiskreuz.jpg";
DatenBlattBild = "/images/dashboard/datenblattkreuz.jpg";
StatusIcon = "/images/dashboard/gespeichert.svg";
Abgeschlossen = 2;
}
if (ausweis.boxpruefung) {
symbolPruefung = "/images/dashboard/kreishaken.png";
} else {
symbolPruefung = "/images/dashboard/kreiskreuz.png";
}
if (ausweis.zurueckgestellt) {
zurueckGestellt =
"<img src='/images/dashboard/zurueckGestellt.svg' alt='Status' width=\"25\" height=\"25\"></img>";
} else {
zurueckGestellt = "";
}
if (ausweis.warmwasser_enthalten) {
warmWasser = "Warmwasser enthalten";
} else {
warmWasser = "Warmwasser nicht enthalten";
}
if (ausweis.warmwasser_anteil_bekannt) {
anteilWarmwasser = "Anteil bekannt";
} else {
anteilWarmwasser = "Anteil unbekannt";
}
if (
ausweis.warmwasser_enthalten &&
ausweis.warmwasser_anteil_bekannt
) {
if (aufnahme.solarsystem_warmwasser) {
// Wenn Warmwasser enthalten und Anteil bekannt und Solarsystem
verbrauchWWGesamt_1 = `${calculations?.energieVerbrauchGesamt_1} kWh x ${(ausweis.anteil_warmwasser_1 || 0) / 100} x 0.6`;
verbrauchWWGesamt_2 = `${calculations?.energieVerbrauchGesamt_2} kWh x ${(ausweis.anteil_warmwasser_2 || 0) / 100} x 0.6`;
solarsystemWarmwasser = "Solarsystem Warmwasser";
} else {
// Wenn Warmwasser enthalten und Anteil bekannt und **kein** Solarsystem
verbrauchWWGesamt_1 = `${calculations?.energieVerbrauchGesamt_1} kWh x ${(ausweis.anteil_warmwasser_1 || 0) / 100} x 0.6`
verbrauchWWGesamt_2 = `${calculations?.energieVerbrauchGesamt_2} kWh x ${(ausweis.anteil_warmwasser_2 || 0) / 100} x 0.6`
solarsystemWarmwasser = "kein Solarsystem Warmwasser";
}
} else {
if (aufnahme.solarsystem_warmwasser) {
// Wenn Warmwasser Anteil unbekannt und Solarsystem
verbrauchWWGesamt_1 =
calculations?.energetischeNutzflaeche +
" m² x 12 kWh/m² x 3 Jahre";
solarsystemWarmwasser = "Solarsystem Warmwasser";
} else {
// Wenn Warmwasser Anteil unbekannt und **kein** Solarsystem
verbrauchWWGesamt_1 =
calculations?.energetischeNutzflaeche +
" m² x 20 kWh/m² x 3 Jahre";
solarsystemWarmwasser = "kein Solarsystem Warmwasser";
}
}
tooltip3Z1 = "Wohnfläche in m²";
tooltip3Z2 =
ausweis.faktorKeller +
" x " +
aufnahme.flaeche +
" m² Energetische Nutzfläche (Keller " +
aufnahme.keller +
" ) in m²";
table3Z1 = aufnahme.flaeche;
table3Z2 = calculations?.energetischeNutzflaeche;
tooltip4Z1 =
"(" +
ausweis.verbrauch_1 +
" " +
ausweis.einheit_1 +
" + " +
ausweis.verbrauch_2 +
" " +
ausweis.einheit_1 +
" + " +
ausweis.verbrauch_3 +
" " +
ausweis.einheit_1 +
") x " +
calculations?.brennstoff_1.umrechnungsfaktor +
" kWh/" +
ausweis.einheit_1 +
" >> Verbrauch 1 " +
ausweis.brennstoff_1 +
" in kWh";
tooltip4Z2 =
"(" +
ausweis.verbrauch_4 +
" " +
ausweis.einheit_2 +
" + " +
ausweis.verbrauch_5 +
" " +
ausweis.einheit_2 +
" + " +
ausweis.verbrauch_6 +
" " +
ausweis.einheit_2 +
") x " +
calculations?.brennstoff_2.umrechnungsfaktor +
" kWh/" +
ausweis.einheit_2 +
" >> Verbrauch 2 " +
ausweis.brennstoff_2 +
" in kWh";
table4Z1 = calculations?.energieVerbrauchGesamt_1;
table4Z2 = calculations?.energieVerbrauchGesamt_2;
tooltip5Z1 =
warmWasser + ", " + anteilWarmwasser + ", " + solarsystemWarmwasser;
tooltip5Z2 = verbrauchWWGesamt_1;
tooltip5Z3 = verbrauchWWGesamt_2;
table5Z1 = calculations?.energieVerbrauchWarmwasser_1;
table5Z2 = calculations?.energieVerbrauchWarmwasser_2;
tooltip6Z1 =
"(" +
calculations?.klimafaktoren[0].klimafaktor +
" + " +
calculations?.klimafaktoren[1].klimafaktor +
" + " +
calculations?.klimafaktoren[2].klimafaktor +
") / 3 >> durchschnittlicher Klimafaktor";
tooltip6Z2 = "";
table6Z1 = calculations?.durchschnittsKlimafaktor;
table6Z2 = "";
tooltip7Z1 =
calculations?.energieVerbrauchHeizung_1 +
" kWh x " +
calculations?.durchschnittsKlimafaktor +
" >> Klimabereinigter Heizverbrauch 1 in kWh";
tooltip7Z2 =
calculations?.energieVerbrauchHeizung_2 +
" kWh x " +
calculations?.durchschnittsKlimafaktor +
" >> Klimabereinigter Heizverbrauch 2 in kWh";
table7Z1 = calculations?.energieVerbrauchHeizungBereinigt_1;
table7Z2 = calculations?.energieVerbrauchHeizungBereinigt_2;
tooltip8Z1 =
calculations?.energetischeNutzflaeche +
" m² x 6 kWh/m² x 3 Jahre >> Kühlungszuschlag in kWh";
tooltip8Z2 = "";
table8Z1 = calculations?.kuehlungsZuschlag;
table8Z2 = "";
tooltip9Z1 =
"-0.0028 x " +
calculations?.durchschnittsEnergieVerbrauchHeizungBereingt +
" + 0.9147 >> Heizungsfaktor";
tooltip9Z2 =
"(" +
calculations?.energieVerbrauchHeizungBereinigt_1 +
" + " +
calculations?.energieVerbrauchHeizungBereinigt_2 +
") / (3 * " +
calculations?.energetischeNutzflaeche +
") >> Durchschnittsverbrauch Heizung in kWh";
table9Z1 =
calculations?.faktorDurchschnittsEnergieVerbrauchHeizungBereinigt;
table9Z2 = calculations?.durchschnittsEnergieVerbrauchHeizungBereingt;
tooltip10Z1 =
calculations[
"faktorDurchschnittsEnergieVerbrauchHeizungBereinigt"
] +
" x " +
calculations?.leerstand +
" x (" +
calculations.energieVerbrauchHeizungBereinigt_1 +
" + " +
calculations.energieVerbrauchHeizungBereinigt_2 +
") >> Leerstandszuschlag Heizung in kWh";
tooltip10Z2 =
calculations?.leerstand +
" x (" +
calculations?.energieVerbrauchWarmwasser_1 +
" + " +
calculations?.energieVerbrauchWarmwasser_2 +
") >> Leerstandszuschlag Warmwasser in kWh";
table10Z1 = calculations?.leerstandsZuschlagHeizung;
table10Z2 = calculations?.leerstandsZuschlagWarmwasser;
tooltip11Z2 =
"(" +
calculations?.energieVerbrauchHeizungBereinigt_2 +
" + " +
calculations?.energieVerbrauchWarmwasser_2 +
") / (3 Jahre x " +
calculations?.energetischeNutzflaeche +
") Endenergieverbrauch 2 in kWh/m²a";
table11Z1 = calculations?.endEnergieVerbrauch_1;
table11Z2 = calculations?.endEnergieVerbrauch_2;
tooltip12Z1 =
"((" +
calculations?.energieVerbrauchHeizungBereinigt_1 +
" x " +
calculations?.primaerfaktor_1 +
") + (" +
calculations?.energieVerbrauchWarmwasser_1 +
" x " +
calculations?.primaerfaktorww +
")) / (3 Jahre x " +
calculations?.energetischeNutzflaeche +
") Primärenergieverbrauch 1 in kWh/m²a";
tooltip12Z2 =
"((" +
calculations?.energieVerbrauchHeizungBereinigt_2 +
" x " +
calculations?.primaerfaktor_1 +
") + (" +
calculations?.energieVerbrauchWarmwasser_2 +
" x " +
calculations?.primaerfaktorww_1 +
")) / (3 Jahre x " +
calculations?.energetischeNutzflaeche +
") Primärenergieverbrauch 2 in kWh/m²a";
table12Z1 = calculations?.primaerEnergieVerbrauch_1;
table12Z2 = calculations?.primaerEnergieVerbrauch_2;
tooltip13Z1 =
"(" +
calculations?.leerstandsZuschlagHeizung +
" + " +
calculations?.leerstandsZuschlagWarmwasser +
") / (3 Jahre x " +
calculations?.energetischeNutzflaeche +
") Endenergieverbrauch Leerstand in kWh/m²a";
tooltip13Z2 =
"(" +
calculations?.kuehlungsZuschlag +
") / (3 Jahre x " +
calculations?.energetischeNutzflaeche +
") Endenergieverbrauch Kühlung in kWh/m²a";
table13Z1 = calculations?.endEnergieVerbrauchLeerstandsZuschlag;
table13Z2 = calculations?.endEnergieVerbrauchKuehlungsZuschlag;
tooltip14Z1 =
calculations?.endEnergieVerbrauchLeerstandsZuschlag +
" x " +
calculations?.primaerfaktor +
" Primärenergieverbrauch Leerstand in kWh/m²a";
tooltip14Z2 =
calculations?.endEnergieVerbrauchKuehlungsZuschlag +
" x 1.8 Primärenergieverbrauch Kühlung in kWh/m²a";
table14Z1 = calculations?.primaerEnergieVerbrauchLeerstandsZuschlag;
table14Z2 = calculations?.primaerEnergieVerbrauchKuehlungsZuschlag;
tooltip15Z1 =
calculations?.endEnergieVerbrauch_1 +
" + " +
calculations?.endEnergieVerbrauch_2 +
" + " +
calculations?.endEnergieVerbrauchLeerstandsZuschlag +
" + " +
calculations?.endEnergieVerbrauchKuehlungsZuschlag +
" Endenergieverbrauch in kWh/m²a";
tooltip15Z2 =
"(" +
calculations?.endEnergieVerbrauch_1 +
" x " +
calculations?.co2Emissionen_1 +
") + (" +
calculations?.endEnergieVerbrauch_2 +
" x " +
calculations?.co2Emissionen_2 +
") + (" +
calculations?.endEnergieVerbrauchLeerstandsZuschlag +
" x " +
calculations?.co2Emissionen_1 +
") + (" +
calculations?.endEnergieVerbrauchKuehlungsZuschlag +
" x " +
calculations?.co2Emissionen_1 +
") CO2-Emissionen in kg/m²a";
table15Z1 = calculations?.endEnergieVerbrauchGesamt;
table15Z2 = calculations?.co2EmissionenGesamt;
tooltip16Z1 =
calculations?.primaerEnergieVerbrauch_1 +
" + " +
calculations?.primaerEnergieVerbrauch_2 +
" + " +
calculations?.primaerEnergieVerbrauchLeerstandsZuschlag +
" x " +
calculations?.primaerEnergieVerbrauchKuehlungsZuschlag +
" Primärenergieverbrauch in kWh/m²a";
tooltip16Z2 = "Effizienzklasse";
table16Z1 = calculations?.primaerEnergieVerbrauchGesamt;
table16Z2 = aufnahme.energieeffizienzklasse;
let imagePreview = "";
// let imageJson = JSON.parse(ausweis.images);
// let imagePreview = "";
// if (typeof imageJson === "object") {
// imagePreview =
// imageJson.daemmung.toString() +
// "," +
// imageJson.general.toString() +
// "," +
// imageJson.fenster.toString() +
// "," +
// imageJson.heizung.toString();
// }
async function stornieren(ausweis: VerbrauchsausweisWohnenClient) {
try {
const response = await api.admin.stornieren.PUT.fetch({
uid_ausweis: ausweis.id
}, {
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
addNotification({
message: "Ausweis wurde storniert",
type: "success",
dismissable: true,
timeout: 3000,
})
ausweis.storniert = true;
ausweis = ausweis;
} catch(e) {
addNotification({
message: "Ausweis konnte nicht storniert werden.",
subtext: e as string,
type: "error",
dismissable: true,
timeout: 3000,
})
}
}
let bilderModal: HTMLDialogElement;
let infoVisible = false;
async function registriernummerAnfordern(uid: string) {
try {
const result = await api.admin.registriernummer.GET.fetch({
uid
}, {
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
} catch(e) {
addNotification({
message: "Registriernummer anfordern fehlgeschlagen.",
subtext: e as string,
type: "error",
dismissable: true,
timeout: 3000,
})
}
}
</script>
<div class="border rounded-lg bg-base-200">
<table class="">
<tbody>
<tr>
<td><button on:click={() => infoVisible = !infoVisible}><ChevronDown size={22} class="transition-all {infoVisible ? "" : "rotate-180"}"></ChevronDown></button></td>
<td class="w-6 px-2"
>
{#if ausweis.ausgestellt}
<div class="tooltip" data-tip="Ausweis wurde ausgestellt">
<div class="rounded-full w-6 h-6 bg-success"></div>
</div>
{:else if ausweis.bestellt}
<div class="tooltip" data-tip="Ausweis wurde bestellt">
<div class="rounded-full w-6 h-6 bg-warning"></div>
</div>
{:else}
<div class="tooltip" data-tip="Ausweis ist in Bearbeitung">
<div class="rounded-full w-6 h-6 bg-error"></div>
</div>
{/if}
</td
>
<td width="150px"
>
<AusweisPruefenTooltip>
<div slot="tooltip">
<span>{aufnahme.adresse} {aufnahme.plz} {aufnahme.ort}</span>
<br>
<span>{aufnahme.gebaeudetyp}, Einheiten: {aufnahme.einheiten}</span>
</div>
<span>{ausweisArt} - {aufnahme.id}</span>
<span>{moment(aufnahme.erstellungsdatum).format("DD.MM.YYYY")}</span>
</AusweisPruefenTooltip></td
>
<td width="35px"
>
<AusweisPruefenTooltip>
<div slot="tooltip">
<span>Baujahr Gebäude / Baujahr Heizung</span>
</div>
<span>{aufnahme.baujahr_gebaeude.join(", ")}</span>
<span>{aufnahme.baujahr_heizung.join(", ")}</span>
</AusweisPruefenTooltip>
<div class="tooltip" data-tip="">
</div></td
>
<td width="45px"
>
<AusweisPruefenTooltip>
<div slot="tooltip">
<span>Wohnfläche in m²</span>
<br>
<span>{ausweis.faktorKeller} x {aufnahme.flaeche}m² Energetische Nutzfläche (Keller {aufnahme.keller}) in m²</span>
</div>
<span>{aufnahme.flaeche}</span>
<span><strong>{calculations?.energetischeNutzflaeche}</strong></span>
</AusweisPruefenTooltip>
</td
>
<td width="90px"
>
<AusweisPruefenTooltip>
<div slot="tooltip">
<span>{tooltip4Z1}</span>
<br>
<span>{tooltip4Z2}</span>
</div>
<span>{table4Z1}</span>
<span>{table4Z2}</span>
</AusweisPruefenTooltip></td
>
<td width="70px"
>
<AusweisPruefenTooltip>
<div slot="tooltip">
<span>{tooltip5Z1}</span>
<br>
<span>{tooltip5Z2}</span>
<br>
<span>{tooltip5Z3}</span>
</div>
<span>{table5Z1}</span>
<span>{table5Z2}</span>
</AusweisPruefenTooltip>
</td
>
<td width="50px"
>
<AusweisPruefenTooltip>
<div slot="tooltip">
<span>{tooltip6Z1}</span>
<br>
<span>{tooltip6Z2}</span>
</div>
<span><strong>{table6Z1}</strong></span>
<span><strong>{table6Z2}</strong></span>
</AusweisPruefenTooltip></td
>
<td width="90px"
>
<AusweisPruefenTooltip>
<div slot="tooltip">
<span>{tooltip7Z1}</span>
<br>
<span>{tooltip7Z2}</span>
</div>
<span>{table7Z1}</span>
<span>{table7Z2}</span>
</AusweisPruefenTooltip></td
>
<td width="60px"
>
<AusweisPruefenTooltip>
<div slot="tooltip">
<span>{tooltip8Z1}</span>
<br>
<span>{tooltip8Z2}</span>
</div>
<span>{table8Z1}</span>
<span>{table8Z2}</span>
</AusweisPruefenTooltip></td
>
<td width="50px"
>
<AusweisPruefenTooltip>
<div slot="tooltip">
<span>{tooltip9Z1}</span>
<br>
<span>{tooltip9Z2}</span>
</div>
<span>{table9Z1}</span>
<span><strong>{table9Z2}</strong></span>
</AusweisPruefenTooltip></td
>
<td width="100px"
>
<AusweisPruefenTooltip>
<div slot="tooltip">
<span>{tooltip10Z1}</span>
<br>
<span>{tooltip10Z2}</span>
</div>
<span>{table10Z1}</span>
<span>{table10Z2}</span>
</AusweisPruefenTooltip></td
>
<td width="110px"
>
<AusweisPruefenTooltip>
<div slot="tooltip">
<span>({calculations?.energieVerbrauchHeizungBereinigt_1} + {calculations?.energieVerbrauchWarmwasser_1}) / (3 Jahre x {calculations?.energetischeNutzflaeche}) Endenergieverbrauch 1 in kWh/m²a</span>
<br>
<span>{tooltip11Z2}</span>
</div>
<span>{table11Z1}</span>
<span>{table11Z2}</span>
</AusweisPruefenTooltip></td
>
<td width="50px"
>
<AusweisPruefenTooltip>
<div slot="tooltip">
<span>{tooltip12Z1}</span>
<br>
<span>{tooltip12Z2}</span>
</div>
<span>{table12Z1}</span>
<span>{table12Z2}</span>
</AusweisPruefenTooltip>
</td
>
<td width="60px"
>
<AusweisPruefenTooltip>
<div slot="tooltip">
<span>{tooltip13Z1}</span>
<br>
<span>{tooltip13Z2}</span>
</div>
<span>{table13Z1}</span>
<span>{table13Z2}</span>
</AusweisPruefenTooltip>
</td
>
<td width="45px"
>
<AusweisPruefenTooltip>
<div slot="tooltip">
<span>{tooltip14Z1}</span>
<br>
<span>{tooltip14Z2}</span>
</div>
<span>{table14Z1}</span>
<span>{table14Z2}</span>
</AusweisPruefenTooltip>
</td
>
<td width="45px"
>
<AusweisPruefenTooltip>
<div slot="tooltip">
<span>{tooltip15Z1}</span>
<br>
<span>{tooltip15Z2}</span>
</div>
<span><strong>{table15Z1}</strong></span>
<span><strong>{table15Z2}</strong></span>
</AusweisPruefenTooltip>
</td
>
<td width="50px"
>
<AusweisPruefenTooltip>
<div slot="tooltip">
<span>{tooltip16Z1}</span>
<br>
<span>{tooltip16Z2}</span>
</div>
<span><strong>{table16Z1}</strong></span>
<span><strong>{table16Z2}</strong></span>
</AusweisPruefenTooltip>
</td
>
<td title="Gebäudebilder anzeigen"
><!-- Open the modal using ID.showModal() method -->
<button class="btn btn-square" on:click={() => bilderModal.showModal()}><Image size={22}></Image></button>
<dialog bind:this={bilderModal} class="modal p-4 rounded-lg">
<div class="modal-box flex flex-row gap-4 items-center justify-center">
{#if bilder.length === 0}
<div class="flex flex-col gap-4 items-center justify-center">
<p>Für diesen Ausweis sind noch keine Bilder vorhanden.</p>
<button class="button" tabindex="0">Erinnerung Verschicken</button>
</div>
{:else}
{#each bilder as image}
<div>
<h2 class="text-lg mb-4 font-bold">{image.kategorie}</h2>
<img src="/bilder/{image.id}.jpg">
</div>
{/each}
{/if}
</div>
<form method="dialog" class="modal-backdrop">
<button class="button">Close</button>
</form>
</dialog></td
>
<td class="w-[30px]"
>
<AusweisPruefenTooltip>
<div slot="tooltip">
<span>{aufnahme.prueftext}</span>
</div>
{#if ausweis.boxpruefung}
<CheckCircled size={22}></CheckCircled>
{:else}
<CrossCircled size={22}></CrossCircled>
{/if}
</AusweisPruefenTooltip></td
>
<td title="Ausweis anzeigen" class="w-[50px]"
><a
class="energieausweis-img"
href="/pdf/ansichtsausweis?uid={ausweis.id}"
target="_blank"
><img
src="/images/dashboard/ausweis.jpg"
alt="Energieausweis"
class="w-full h-8"
/></a
></td
>
<td title="Datenblatt anzeigen" width="50px"
><a
class="energieausweis-img"
href="/pdf/datenblatt?uid={ausweis.id}"
target="_blank"
><img
src="/images/dashboard/datenblatt.jpg"
alt="Datenblatt"
/></a
></td
>
<td
title="Ausweis stornieren und Zahlung wenn erforderlich automatisch zurückbuchen"
class="w-4 p-1"
><button
class="btn btn-xs btn-ghost"
on:click={() => stornieren(ausweis)}>S</button
></td
>
<td title="Ausweis ausstellen" class="w-4 p-1"
><button
class="btn btn-xs btn-ghost"
on:click={() => ausweisAusstellen(aufnahme.uid)}>A</button
></td
>
<td
title="Ausweis ausstellen und per Post verschicken"
class="w-4 p-1"
><button
class="btn btn-xs btn-ghost"
on:click={() => ausweisAusstellenPost(aufnahme.uid)}>P</button
></td
>
<td
title="E-Mail an Kunden schicken mit Erläuterungen warum der Ausweis noch nicht ausgestellt werden kann."
class="w-4 p-1"
><button
class="btn btn-xs btn-ghost"
on:click={() => ausweisnichtAusstellen(aufnahme.uid)}>N</button
></td
>
<td
title="Bestellbestätigung nochmal schicken (Zahlung nicht erfolgreich)"
class="w-4 p-1"
><button
class="btn btn-xs btn-ghost"
on:click={() => bestellBestaetigung(aufnahme.uid)}>B</button
></td
>
<td
title="E-Mail an Kunden schicken mit Erinnerung die Bestellung abzuschließen."
class="w-4 p-1"
><button
class="btn btn-xs btn-ghost"
on:click={() => erinnern(aufnahme.uid)}
>E</button
></td
>
<td
title="Zum Formular mit allen Eingabedaten."
class="w-4 p-1"
><a
class="btn btn-xs btn-ghost"
target="_blank"
href="/energieausweis-erstellen/gespeichert?id={aufnahme.uid}">F</a
></td
>
{#if aufnahme.kontrolldatei}
<td title="XML-Datei an das DiBT verschicken." class="w-4 p-1"><button class="btn btn-xs btn-ghost" on:click={() => {
xmlAbschicken(aufnahme.uid)
}}>X</button></td>
{/if}
{#if !ausweis.registriernummer}
<td title="Registriernummer vom DiBT anfordern." class="w-4 p-1"><button class="btn btn-xs btn-ghost" on:click={() => {
registriernummerAnfordern(ausweis.id)
}}>R</button></td>
{/if}
</tr>
</tbody>
</table>
<div class:hidden={!infoVisible} class:block={infoVisible} class="py-4 border-t">
<div class="grid grid-cols-[2fr_1fr] prose max-w-full">
<div class="border-r px-8">
<h3 class="mt-0">Wichtige Daten</h3>
<table>
<tbody>
<tr>
<td>Angewendete Berechnungsformel</td>
<td><strong>EnEV 2016</strong></td>
</tr>
<tr>
<td>Berechnungsergebnis</td>
<td>{calculations?.endEnergieVerbrauchGesamt}kWh/m2/A - Energieeffizienzklasse <strong>{calculations?.energieEffizienzKlasse}</strong></td>
</tr>
<tr>
<td>Informationen des Nutzers</td>
<td>{ausweis.boxpruefung}</td>
</tr>
<tr>
<td>UID</td>
<td><strong><pre>{ausweis.id}</pre></strong></td>
</tr>
</tbody>
</table>
</div>
<div class="px-8">
<h3 class="mt-0">Ereignisse</h3>
<ul class="timeline timeline-snap-icon max-md:timeline-compact timeline-vertical">
<li>
<div class="timeline-middle">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="h-5 w-5"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z" clip-rule="evenodd" /></svg>
</div>
<div class="timeline-start md:text-end mb-10">
<time class="font-mono italic">{moment(ausweis.erstellungsdatum).format("DD.MM.YYYY - HH:mm")} Uhr</time>
<div class="text-lg font-black">Ausweis erstellt</div>
</div>
<hr/>
</li>
{#each events as event, i}
<li>
<hr />
<div class="timeline-middle">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="h-5 w-5"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z" clip-rule="evenodd" /></svg>
</div>
<div class="mb-10" class:timeline-end={i % 2 == 0} class:timeline-start={i % 2 == 1}>
<time class="font-mono italic">{moment(event.date).format("DD.MM.YYYY - HH:mm")} Uhr</time>
<div class="text-lg font-black">{event.title}</div>
{event.description || ""}
</div>
<hr />
</li>
{/each}
{#if ausweis.erledigt}
<li>
<hr />
<div class="timeline-middle">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="h-5 w-5"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z" clip-rule="evenodd" /></svg>
</div>
<div class="mb-10 timeline-end">
<time class="font-mono italic">{moment(ausweis.ausstellungsdatum).format("DD.MM.YYYY - HH:mm")} Uhr</time>
<div class="text-lg font-black">Ausweis ausgestellt</div>
{ausweis.registriernummer ? `Registriernummer: ${ausweis.registriernummer}` : ""}
</div>
<hr />
</li>
{/if}
</ul>
</div>
</div>
</div>
</div>
<NotificationWrapper />

View File

@@ -1,68 +0,0 @@
<script lang="ts">
import { getZodBaseType } from "#client/lib/helpers.js";
import { filterAusweise } from "#lib/filters.js";
import { ZodTypeAny } from "astro:schema";
import { Cross1 } from "radix-svelte-icons";
import z, { ZodBoolean, ZodNativeEnum, ZodNumber } from "zod"
export let filters: { name: keyof z.infer<typeof filterAusweise>, type: ZodTypeAny, value: any }[] = []
</script>
{#each filters as filter, i}
{@const type = getZodBaseType(filter.type)}
<div class="flex flex-row bg-white gap-4 px-2 py-2 rounded-lg">
{#if i === 0}
<span class="badge">where</span>
{:else}
<span class="badge">and</span>
{/if}
<select on:change={function(e) {
delete filters[filter.name]
filter.name = e.target.value;
filter.type = filterAusweise._def.shape()[filter.name]
filters = filters.filter(Boolean);
}}>
<option value={filter.name} selected>{filter.name}</option>
{#each Object.keys(filterAusweise._def.shape()) as n}
{#if !filters.find(filter => filter.name === n)}
<option value={n}>{n}</option>
{/if}
{/each}
</select>
<span class="badge">equals</span>
{#if type instanceof ZodNumber}
<input type="number" bind:value={filter.value}>
{:else if type instanceof ZodBoolean}
<select bind:value={filter.value}>
<option value={true}>true</option>
<option value={false}>false</option>
</select>
{:else if type instanceof ZodNativeEnum}
<select bind:value={filter.value}>
{#each Object.entries(type._def.values) as [key, value]}
<option {value}>{key}</option>
{/each}
</select>
{:else}
<input type="text" bind:value={filter.value}>
{/if}
<Cross1 size={24} class="cursor-pointer"></Cross1>
</div>
{/each}
<button on:click={() => {
const entry = Object.entries(filterAusweise._def.shape())[0]
filters.push({
name: entry[0],
type: entry[1],
value: null
})
filters = filters
}}>Filter Hinzufügen</button>
<style>
.badge {
@apply rounded-lg px-2 py-1 bg-gray-500 text-white;
}
</style>

View File

@@ -1,29 +1,34 @@
<script lang="ts">
import { AufnahmeKomplettClient, BedarfsausweisWohnenClient, BenutzerClient, getAusweisartFromId, RechnungClient, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
import { AufnahmeKomplettClient, BedarfsausweisWohnenClient, BenutzerClient, getAusweisartFromId, RechnungClient, GEGEinpreisungClient, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
import moment from "moment";
import { dialogs } from "svelte-dialogs";
import {
CrossCircled,
DotsVertical,
Download,
Pencil2,
QuestionMarkCircled,
} from "radix-svelte-icons";
import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js";
import { api } from "astro-typesafe-api/client";
import Cookies from "js-cookie";
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
import { API_ACCESS_TOKEN_COOKIE_NAME, AusstellungsTyp } from "#lib/constants.js";
import { Enums, Objekt } from "#lib/client/prisma.js";
import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016 } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016.js";
import { addNotification, updateNotification } from "#components/Notifications/shared.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";
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient;
export let aufnahme: AufnahmeKomplettClient;
export let rechnung: RechnungClient;
export let rechnung: RechnungClient | null;
export let einpreisung: GEGEinpreisungClient | null;
export let objekt: Objekt;
export let benutzer: BenutzerClient;
import { FileText } from "radix-svelte-icons";
import NotificationProvider from "#components/NotificationProvider/NotificationProvider.svelte";
import DashboardNotification from "./DashboardNotification.svelte";
import { notifications } from "#components/NotificationProvider/shared.js";
import { Bell } from "radix-svelte-icons";
import mime from "mime"
const progress = ausweis.ausgestellt ? 100 : ausweis.bestellt ? 66 : 33;
const ausweisart = getAusweisartFromId(ausweis.id);
@@ -116,7 +121,7 @@
async function stornieren() {
try {
const response = await api.admin.stornieren.PUT.fetch({
uid_ausweis: ausweis.id
ausweis_id: ausweis.id
}, {
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
@@ -143,48 +148,124 @@
}
}
async function ausstellen() {
async function ausstellen(post = false) {
const notification = addNotification({
message: "Ausweis wird ausgestellt.",
subtext: "Der Ausweis wird nun ausgestellt, bitte habe einen Augenblick geduld..",
type: "info",
timeout: 0,
})
try {
await api.admin.ausstellen.GET.fetch({
id_ausweis: ausweis.id
}, {
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
if (ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) {
const results: {data: string, name: string, type: "Sonstiges" | "Ausweis"}[] = []
let i = 0
const dateien = [...(bedarfsausweisAdditionalInput.files || []), ...(bedarfsausweisFileInput.files || [])];
if (dateien.length === 0) {
addNotification({
message: "Bitte laden sie vor dem Ausstellen einen Ausweis hoch.",
timeout: 3000,
type: "error",
dismissable: true
})
return;
}
for (const datei of dateien) {
const reader = new FileReader();
reader.onload = async (ev) => {
const result = reader.result;
if (!result) {
addNotification({
message: `Die Datei ${datei.name} konnte nicht verarbeitet werden.`,
timeout: 3000,
type: "error",
dismissable: true
})
}
results.push({
data: result as string,
name: datei.name,
type: i == dateien.length - 1 ? "Ausweis" : "Sonstiges"
})
i++
if (i === dateien.length) {
try {
await api.admin["bedarfsausweis-ausstellen"].POST.fetch({
id_ausweis: ausweis.id,
post,
files: results
}, {
headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
updateNotification(notification, {
message: "Ausweis ausgestellt.",
subtext: "Der Ausweis wurde erfolgreich ausgestellt.",
timeout: 3000,
type: "success",
})
} catch(e) {
updateNotification(notification, {
message: "Das hat nicht geklappt.",
subtext: e as string,
timeout: 3000,
type: "error",
})
}
}
}
})
reader.readAsDataURL(datei)
}
} else {
try {
await api.admin.ausstellen.GET.fetch({
id_ausweis: ausweis.id,
post
}, {
headers: {
"Authorization": `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})
ausweis.ausgestellt = true;
ausweis.ausgestellt = true;
updateNotification(notification, {
message: "Ausweis ausgestellt.",
subtext: "Der Ausweis wurde erfolgreich ausgestellt.",
timeout: 3000,
type: "success",
})
} catch(e) {
updateNotification(notification, {
message: "Das hat nicht geklappt.",
subtext: e as string,
timeout: 3000,
type: "error",
})
updateNotification(notification, {
message: "Ausweis ausgestellt.",
subtext: "Der Ausweis wurde erfolgreich ausgestellt.",
timeout: 3000,
type: "success",
})
} catch(e) {
updateNotification(notification, {
message: "Das hat nicht geklappt.",
subtext: e as string,
timeout: 3000,
type: "error",
})
}
}
}
let bedarfsausweisFileInput: HTMLInputElement;
let bedarfsausweisAdditionalInput: HTMLInputElement;
</script>
<div class="relative bg-base-200 border border-base-300 rounded-lg p-4 mr-4">
<div class="relative bg-base-200 border border-base-300 rounded-lg p-4 mx-2">
{#if ausweis.storniert}
<div
class="absolute top-0 left-0 w-full h-full bg-[rgba(0,0,0,0.7)] z-[5] rounded-lg select-none"
class="absolute top-0 left-0 w-full h-full bg-[rgba(0,0,0,0.4)] z-[5] rounded-lg select-none"
>
<h1
class="absolute -rotate-[25deg] text-5xl md:text-7xl tracking-wide uppercase text-red-500 border-4 border-red-500 rounded-lg top-[50%] translate-y-[-50%] left-[50%] translate-x-[-50%]"
class="absolute -rotate-[25deg] text-xl md:text-xl tracking-wide uppercase text-red-500 border-4 border-red-500 rounded-lg top-[50%] translate-y-[-50%] left-[50%] translate-x-[-50%]"
>
Storniert
</h1>
@@ -217,6 +298,17 @@
</ul>
</div>
<div class="flex flex-row flex-wrap items-center gap-2">
{#if ausweis.ausgestellt}
<span class="bg-green-600 px-2 py-0.5 text-sm font-semibold rounded-lg text-white">Ausgestellt</span>
{:else if ausweis.bestellt}
<span class="bg-primary px-2 py-0.5 text-sm font-semibold rounded-lg text-white">Bestellt</span>
{:else}
{#if ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe || ausweisart === Enums.Ausweisart.GEGNachweisWohnen || ausweisart === Enums.Ausweisart.GEGNachweisGewerbe}
<span class="bg-red-600 px-2 py-0.5 text-sm font-semibold rounded-lg text-white">Angefordert</span>
{:else}
<span class="bg-red-600 px-2 py-0.5 text-sm font-semibold rounded-lg text-white">Gespeichert</span>
{/if}
{/if}
<div class="text-lg font-semibold">
{#if ausweisart == Enums.Ausweisart.VerbrauchsausweisWohnen}
Verbrauchsausweis Wohnen
@@ -231,27 +323,20 @@
{:else if ausweisart == Enums.Ausweisart.BedarfsausweisGewerbe}
Bedarfsausweis Gewerbe
{/if}
{#if ausweis.ausweistyp === Enums.AusweisTyp.Beratung || ausweis.ausweistyp === Enums.AusweisTyp.BeratungXL}
(Beratung)
{:else if ausweis.ausweistyp === Enums.AusweisTyp.Offline || ausweis.ausweistyp === Enums.AusweisTyp.OfflineXL}
(Offline)
{/if}
</div>
{#if ausweis.ausgestellt}
<span class="bg-green-600 px-2 py-0.5 text-sm font-semibold rounded-lg text-white">Ausgestellt</span>
{:else if ausweis.bestellt}
<span class="bg-primary px-2 py-0.5 text-sm font-semibold rounded-lg text-white">Bestellt</span>
{:else}
{#if ausweisart === Enums.Ausweisart.BedarfsausweisGewerbe || ausweisart === Enums.Ausweisart.GEGNachweisWohnen || ausweisart === Enums.Ausweisart.GEGNachweisGewerbe}
<span class="bg-red-600 px-2 py-0.5 text-sm font-semibold rounded-lg text-white">Gespeichert</span>
{:else}
<span class="bg-red-600 px-2 py-0.5 text-sm font-semibold rounded-lg text-white">Angefordert</span>
</div>
<div class="badge badge-accent font-semibold text-black text-m">
{#if ausweis.ausweistyp === Enums.AusweisTyp.Beratung || ausweis.ausweistyp === Enums.AusweisTyp.BeratungXL}
mit Beratung
{:else if ausweis.ausweistyp === Enums.AusweisTyp.Offline || ausweis.ausweistyp === Enums.AusweisTyp.OfflineXL}
Offline
{/if}
{#if (rechnung?.services ?? []).length > 0}
{#if rechnung}
<span class="text-sm italic">({rechnung.services})</span>
{/if}
{/if}
</div>
<div class="badge badge-accent font-semibold text-black text-m">{objekt.adresse}</div>
<div class="mb-4 flex flex-row items-center gap-4">
<div class="w-full border rounded-lg my-2">
<div class="bg-green-600 h-4 rounded-lg" class:bg-red-600={progress == 33} class:bg-primary={progress == 66} style="width: {progress}%;"></div>
@@ -260,17 +345,16 @@
>{progress}%</span
>
</div>
{#if ausweis.bestellt}
{#if ausweis.ausweistyp === Enums.AusweisTyp.Beratung || ausweis.ausweistyp === Enums.AusweisTyp.BeratungXL}
<p class="text-sm font-semibold">Sie haben Hilfe zu diesem Ausweis angefordert. Sie werden innerhalb der nächsten 48 Stunden über die hinterlegte Telefonnummer vom IB Cornelsen kontaktiert.</p>
{:else if ausweis.ausweistyp === Enums.AusweisTyp.Offline || ausweis.ausweistyp === Enums.AusweisTyp.OfflineXL}
<p class="text-sm font-semibold">Sie haben die offline Variant zu diesem Ausweis angefordert. Bitte übermitteln Sie uns die letzten drei Jahre der Energieabrechnungen Ihres Energieversorgers.</p>
{:else if !ausweis.ausgestellt}
<p class="text-sm font-semibold">Der Ausweis wurde von Ihnen freigegeben und befindet sich in Prüfung vom IB Cornelsen</p>
{/if}
{/if}
{#await calculations then calculations}
<div class="flex flex-col gap-2">
<div class="flex flex-col mb-4">
<div class="flex flex-row justify-between">
<span>Erstellungsdatum</span>
<span class="font-bold text-base-content"
>{moment(aufnahme.erstellungsdatum).format(
"DD.MM.YYYY"
)}</span
>
</div>
<div class="flex flex-row justify-between">
<span>Energieverbrauch</span>
<span class="font-bold text-base-content"
@@ -283,14 +367,6 @@
>{calculations?.co2EmissionenGesamt}Kg/A</span
>
</div>
<div class="flex flex-row justify-between">
<span>Erstellungsdatum</span>
<span class="font-bold text-base-content"
>{moment(aufnahme.erstellungsdatum).format(
"DD.MM.YYYY"
)}</span
>
</div>
<div class="flex flex-row justify-between">
<span>Baujahr</span>
<span
@@ -308,17 +384,92 @@
: "N/A"}</span
>
</div>
<div class="flex flex-row justify-between">
<span>ID</span>
<span class="font-bold text-base-content"
>{id}</span
>
</div>
</div>
{/await}
<div class="flex flex-row justify-end items-center gap-4 mt-4">
{#if !ausweis.storniert && !ausweis.ausgestellt}
{#if benutzer.rolle === Enums.BenutzerRolle.ADMIN && ausweisart === Enums.Ausweisart.BedarfsausweisWohnen}
<span>Laden sie hier den Ausweis hoch</span>
<input type="file" bind:this={bedarfsausweisFileInput}>
<span>Laden sie hier zusätzliche Dokumente hoch</span>
<input type="file" bind:this={bedarfsausweisAdditionalInput} multiple>
{/if}
<div class="flex flex-row justify-start items-center mb-4">
<a
class="p-1 rounded-lg hover:bg-gray-200 mr-2 border-2 border-gray-300"
title="PDF Herunterladen"
target="_blank"
href="/pdf/ansichtsausweis?id={ausweis.id}"
>
{#if ausweis.ausgestellt}
<img src="../../images/dashboard/AusweisHaken.svg" width="65" alt="Energieausweis">
{:else}
<img src="../../images/dashboard/AusweisKreuz.svg" width="65" alt="Energieausweis">
{/if}
</a>
<a
class="p-1 rounded-lg hover:bg-gray-200 border-2 border-gray-300"
title="PDF Herunterladen"
target="_blank"
href="/pdf/datenblatt?id={ausweis.id}"
>
{#if ausweis.ausgestellt}
<img src="../../images/dashboard/DatenblattHaken.svg" width="65" alt="Energieausweis">
{:else}
<img src="../../images/dashboard/DatenblattKreuz.svg" width="65" alt="Energieausweis">
{/if}
</a>
<div class="w-1/2 ml-4 text-sm">
{#if ausweis.bestellt}
{#if ausweis.ausweistyp === Enums.AusweisTyp.Beratung || ausweis.ausweistyp === Enums.AusweisTyp.BeratungXL}
Sie haben Hilfe zu diesem Ausweis angefordert. Sie werden <span class="font-bold">innerhalb der nächsten 48 Stunden</span> über die hinterlegte Telefonnummer vom IB Cornelsen kontaktiert.
{:else if ausweis.ausweistyp === Enums.AusweisTyp.Offline || ausweis.ausweistyp === Enums.AusweisTyp.OfflineXL}
Sie haben die offline Variant zu diesem Ausweis angefordert. Bitte <span class="font-bold">übermitteln Sie uns die letzten drei Jahre der Energieabrechnungen</span> Ihres Energieversorgers.
{:else if !ausweis.ausgestellt}
Der Ausweis wurde von Ihnen freigegeben und befindet sich <span class="font-bold">in Prüfung durch IB Cornelsen</span>
{/if}
{:else if ausweis.ausgestellt}
Vorgang erledigt. Ausweis ist <span class="font-bold">geprüft und ausgestellt.</span>
{:else}
Der Ausweis wurde von Ihnen gespeichert <span class="font-bold">und muss noch bestellt werden.</span>
{/if}
</div>
</div>
<div class="text-sm mb-2">
<span class="font-bold">Rechnungsadresse</span><br>
{#if ausweisart == Enums.Ausweisart.GEGNachweisWohnen || ausweisart == Enums.Ausweisart.GEGNachweisGewerbe || ausweisart == Enums.Ausweisart.BedarfsausweisGewerbe}
{einpreisung?.empfaenger},
{#if einpreisung?.zusatzzeile !== null}
{einpreisung?.zusatzzeile},
{/if}
{einpreisung?.strasse}, {einpreisung?.plz} {einpreisung?.ort}
{:else}
{rechnung?.empfaenger},
{#if rechnung?.zusatzzeile !== null}
{rechnung?.zusatzzeile},
{/if}
{rechnung?.strasse}, {rechnung?.plz} {rechnung?.ort}
{/if}
</div>
<div class="text-sm mb-2">
<span class="font-bold">Versandadresse</span><br>
{#if ausweisart == Enums.Ausweisart.GEGNachweisWohnen || ausweisart == Enums.Ausweisart.GEGNachweisGewerbe || ausweisart == Enums.Ausweisart.BedarfsausweisGewerbe}
{einpreisung?.versand_empfaenger},
{#if einpreisung?.versand_zusatzzeile !== null}
{einpreisung?.versand_zusatzzeile},
{/if}
{einpreisung?.versand_strasse}, {einpreisung?.versand_plz} {einpreisung?.versand_ort}
{:else}
{rechnung?.versand_empfaenger},
{#if rechnung?.versand_zusatzzeile !== null}
{rechnung?.versand_zusatzzeile},
{/if}
{rechnung?.versand_strasse}, {rechnung?.versand_plz} {rechnung?.versand_ort}
{/if}
</div>
<div class="flex flex-row gap-2 justify-end items-center mt-4">
{#if !ausweis.storniert && !ausweis.ausgestellt}
<!--
<a
class="button text-sm"
@@ -336,63 +487,32 @@
{#if ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen}
<a
class="button text-sm"
href="/energieausweis-erstellen/verbrauchsausweis-wohngebaeude?id={ausweis.id}"
href="/energieausweis-erstellen/verbrauchsausweis-wohngebaeude?ausweis_id={ausweis.id}&typ={AusstellungsTyp.Speichern}"
>Bearbeiten</a>
{:else if ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe}
<a
class="button text-sm"
href="/energieausweis-erstellen/verbrauchsausweis-gewerbe?id={ausweis.id}"
href="/energieausweis-erstellen/verbrauchsausweis-gewerbe?ausweis_id={ausweis.id}&typ={AusstellungsTyp.Speichern}"
>Bearbeiten</a>
{:else if ausweisart === Enums.Ausweisart.BedarfsausweisWohnen}
<a
class="button text-sm"
href="/energieausweis-erstellen/bedarfsausweis-wohngebaeude?id={ausweis.id}"
href="/energieausweis-erstellen/bedarfsausweis-wohngebaeude?ausweis_id={ausweis.id}&typ={AusstellungsTyp.Speichern}"
>Bearbeiten</a>
{:else if ausweisart === Enums.Ausweisart.GEGNachweisWohnen}
<a
class="button text-sm"
href="/angebot-anfragen/geg-nachweis-wohnen-anfragen?id={ausweis.id}"
href="/angebot-anfragen/geg-nachweis-wohnen-anfragen?ausweis_id={ausweis.id}&typ={AusstellungsTyp.Speichern}"
>Bearbeiten</a>
{:else if ausweisart === Enums.Ausweisart.GEGNachweisGewerbe}
<a
class="button text-sm"
href="/angebot-anfragen/geg-nachweis-gewerbe-anfragen?id={ausweis.id}"
href="/angebot-anfragen/geg-nachweis-gewerbe-anfragen?ausweis_id={ausweis.id}&typ={AusstellungsTyp.Speichern}"
>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 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}"
href="/angebot-anfragen/bedarfsausweis-gewerbe-anfragen?ausweis_id={ausweis.id}&typ={AusstellungsTyp.Speichern}"
>Bearbeiten</a>
{/if}
{/if}
@@ -401,44 +521,255 @@
{#if ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen}
<a
class="button text-sm"
href="/energieausweis-erstellen/verbrauchsausweis-wohngebaeude?id={ausweis.id}"
href="/energieausweis-erstellen/verbrauchsausweis-wohngebaeude?ausweis_id={ausweis.id}&typ={AusstellungsTyp.Speichern}"
>Formular</a>
{:else if ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe}
<a
class="button text-sm"
href="/energieausweis-erstellen/verbrauchsausweis-gewerbe?id={ausweis.id}"
href="/energieausweis-erstellen/verbrauchsausweis-gewerbe?ausweis_id={ausweis.id}&typ={AusstellungsTyp.Speichern}"
>Formular</a>
{:else if ausweisart === Enums.Ausweisart.BedarfsausweisWohnen}
<a
class="button text-sm"
href="/energieausweis-erstellen/bedarfsausweis-wohngebaeude?id={ausweis.id}"
href="/energieausweis-erstellen/bedarfsausweis-wohngebaeude?ausweis_id={ausweis.id}&typ={AusstellungsTyp.Speichern}"
>Formular</a>
{/if}
{/if}
{#if benutzer.rolle === Enums.BenutzerRolle.ADMIN}
<button class="button text-sm" on:click={ausstellen}>A</button>
<button class="button text-sm" on:click={stornieren}>S</button>
<button class="button text-sm" on:click={registriernummer}>R</button>
<button class="button text-sm" title="Ausstellen" on:click={() => ausstellen(false)}>A</button>
<button class="button text-sm" title="Ausstellen mit Postversand" on:click={() => ausstellen(true)}>P</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}
</div>
<a
class="p-2 rounded-lg hover:bg-gray-200"
title="PDF Herunterladen"
target="_blank"
href="/pdf/ansichtsausweis?id={ausweis.id}"
>
<img src="/images/ausweis.webp" width="32" alt="Energieausweis">
</a>
<a
class="p-2 rounded-lg hover:bg-gray-200"
title="PDF Herunterladen"
target="_blank"
href="/pdf/datenblatt?id={ausweis.id}"
>
<img src="/images/datenblatt.webp" width="32" alt="Datenblatt">
</a>
</div>
</div>
<div class="relative bg-base-200 border border-base-300 rounded-lg p-4 mx-2">
<div class="card-body">
<div class="flex flex-row flex-wrap items-center gap-2">
<div class="text-lg font-semibold">{aufnahme.gebaeudetyp}
{#if (aufnahme.einheiten > 0 && aufnahme.einheiten !== null)}
mit {aufnahme.einheiten} Wohneinheiten
{/if}
</div>
<div class="text-sm">
<span class="font-bold">Gebäude (Bj {aufnahme.baujahr_gebaeude})</span> mit
{#if aufnahme.flaeche > 0 && aufnahme.flaeche !== null}
{aufnahme.flaeche} m² Wohnfläche
{/if}
{#if aufnahme.nutzflaeche === 0}
. Die energetische Nutzfläche wurde nach §82 GEG aus der Wohnfläche ermittelt.
{:else}
sowie {aufnahme.nutzflaeche} m² energetische Nutzfläche.
{/if}
Als Ausstellgrund wurde {ausweis.ausstellgrund} angegeben.
{aufnahme.gebaeudeteil === "Wohnen"
? "Die eingegebenen Daten beziehen sich auf den Wohnteil eines gemischt genutzten Gebäudes."
: "Die eingegebenen Daten beziehen sich auf das gesamte Gebäude."}
{aufnahme.saniert ? "Das Gebäude ist in saniertem Zustand." : "Das Gebäude ist in unsaniertem Zustand."}
</div>
{#if ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe}
<div class="text-sm">
<span class="font-bold">Gebäudestrom</span> der Jahre vom
{moment(ausweis.startdatum).format("MM.YYYY")} bis {moment(ausweis.startdatum).add("3", "years").format("MM.YYYY")} beträgt
{ausweis.strom_1} kWh, {ausweis.strom_2} kWh und {ausweis.strom_3} kWh.
Im Stromverbrauch enthalten sind
{ausweis.stromverbrauch_enthealt_heizung ? "Heizung, " : ""}
{ausweis.stromverbrauch_enthaelt_warmwasser ? "Warmwasser, " : ""}
{ausweis.stromverbrauch_enthaelt_lueftung ? "Lüftung, " : ""}
{ausweis.stromverbrauch_enthaelt_beleuchtung ? "Beleuchtung, " : ""}
{ausweis.stromverbrauch_enthaelt_kuehlung ? "Kühlung, " : ""}
{#if ausweis.stromverbrauch_sonstig !== null}
sowie {ausweis.stromverbrauch_enthaelt_sonstige}.
{/if}
</div>
{/if}
<div class="text-sm">
<span class="font-bold">Heizung (Bj {aufnahme.baujahr_heizung})</span> wird mit
{ausweis.brennstoff_1} betrieben. Die Verbräuche vom
{moment(ausweis.startdatum).format("MM.YYYY")} bis {moment(ausweis.startdatum).add("3", "years").format("MM.YYYY")} betragen
{ausweis.verbrauch_1} {ausweis.einheit_1}, {ausweis.verbrauch_2} {ausweis.einheit_1} und {ausweis.verbrauch_3} {ausweis.einheit_1}.
{#if ausweis.zusaetzliche_heizquelle} -
Eine weitere Heizung wird mit {ausweis.brennstoff_2} betrieben mit den Verbräuchen {ausweis.verbrauch_4} {ausweis.einheit_2}, {ausweis.verbrauch_5}
{ausweis.einheit_2} und {ausweis.verbrauch_6} {ausweis.einheit_2}.
{/if}
</div>
<div class="text-sm">
{#if ausweis.anteil_warmwasser_1 !== null && ausweis.anteil_warmwasser_1 > 0}
{#if aufnahme.solarsystem_warmwasser}
Da ein Solarsystem für Warmwasser vorhanden ist,
wurde ein Warmwasseranteil von {ausweis.anteil_warmwasser_1 * 0.6}% berücksichtigt.
{:else}
Es wurde ein Warmwasseranteil von {ausweis.anteil_warmwasser_1}% berücksichtigt.
{/if}
{:else}
{#if aufnahme.solarsystem_warmwasser}
Da ein Solarsystem für Warmwasser vorhanden ist, wurde ein reduzierter Warmwasserzuschlag von 12 kWh/m²a angesetzt.
{:else}
Es wurde ein Warmwasserzuschlag von 20 kWh/m²a angesetzt.
{/if}
{/if}
{#if ausweis.warmwasser_enthalten}
Der Anteil wird vom Gesamtverbrauch abgezogen, um den Heizwärmebedarf zu ermitteln und diesen mit dem
über drei Jahre gemittelten Klimafaktor zu multiplizieren.
{:else}
Der Anteil wird als Zuschlag zum Gesamtverbrauch addiert, und im Ausweis in einer separaten Zeile ausgewiesen.
{/if}
{#if !ausweis.alternative_heizung && !ausweis.alternative_warmwasser && !ausweis.alternative_lueftung && !ausweis.alternative_kuehlung}
Alternative Energieversorgung wird nicht verwendet
{:else}
Alternative Energieversorgung wird verwendet für {ausweis.alternative_heizung ? "Heizung, " : ""}{ausweis.alternative_warmwasser ? "Warmwasser, " : ""}{ausweis.alternative_lueftung ? "Lüftung, " : ""}{ausweis.alternative_kuehlung ? "Kühlung, " : ""}
{/if}.
Der Leerstand beträgt {aufnahme.leerstand}%. Das Gebäude verfügt über eine
{#if aufnahme.lueftung === Enums.Lueftungskonzept.Fensterlueftung}
Fensterlüftung
{:else if aufnahme.lueftung === Enums.Lueftungskonzept.Schachtlueftung}
Schachtlüftung
{:else if aufnahme.lueftung === Enums.Lueftungskonzept.LueftungsanlageMitWaermerueckgewinnung}
Lüftungsanlage mit Wärmerückgewinnung
{:else if aufnahme.lueftung === Enums.Lueftungskonzept.LueftungsanlageOhneWaermerueckgewinnung}
Lüftungsanlage ohne Wärmerückgewinnung
{/if}
{#if ausweis.kuehlung_enthalten && ausweis.kuehlung_entahlten !== null}
und wird thermisch gekühlt.
{:else if aufnahme.kuehlung === "1" && aufnahme.kuhlung !== null}
und wird gekühlt.
{:else}
und wird nicht gekühlt.
{/if}
</div>
<div class="text-sm">
<span class="font-bold">Heizung: </span>
{aufnahme.zentralheizung ? "Zentral/Etagenheizung, " : ""}
{aufnahme.einzelofen ? "Einzelofen, " : ""}
{aufnahme.waermepumpe ? "Wärmepumpe, " : ""}
{aufnahme.niedertemperatur_kessel ? "Niedertemperaturkessel, " : ""}
{aufnahme.standard_kessel ? "Standardkessel, " : ""}
{aufnahme.durchlauf_erhitzer ? "Durchlauferhitzer, " : ""}
{aufnahme.solarsystem_warmwasser ? "Solarsystem für Warmwasser, " : ""}
{aufnahme.brennwert_kessel ? "Brennwertkessel, " : ""}
{aufnahme.standard_kessel ? "Standardkessel, " : ""}
{aufnahme.warmwasser_rohre_gedaemmt ? "Warmwasserrohre gedämmt, " : ""}
{aufnahme.heizungsrohre_gedaemmt ? "Heizungsrohre gedämmt, " : ""}
{aufnahme.photovoltaik ? "Photovoltaik, " : ""}
{aufnahme.raum_temperatur_regler ? "Raumtemperaturregler, " : ""}
{aufnahme.zirkulation ? "Zirkulation, " : ""}
</div>
<div class="text-sm">
<span class="font-bold">Fenster: </span>
{aufnahme.isolier_verglasung ? "Fenster Isolierglas, " : ""}
{aufnahme.dreifach_verglasung ? "Dreifachverglasung, " : ""}
{aufnahme.doppel_verglasung ? "Doppelverglasung, " : ""}
{aufnahme.einfach_verglasung ? "Einfachverglasung, " : ""}
{aufnahme.fenster_dicht ? "Fenster dicht, " : ""}
{aufnahme.fenster_teilweise_undicht ? "Fenster teilweise undicht, " : ""}
{aufnahme.tueren_undicht ? "Türen undicht, " : ""}
{aufnahme.tueren_dicht ? "Türen dicht, " : ""}
{aufnahme.rolllaeden_kaesten_gedaemmt ? "Rollladenkästen gedämmt" : ""}
</div>
<div class="text-sm">
<span class="font-bold">Dämmung: </span>
{aufnahme.dachgeschoss_gedaemmt ? "Dachgeschoss gedämmt, " : ""}
{aufnahme.aussenwand_gedaemmt ? "Außenwand gedämmt, " : ""}
{aufnahme.keller_decke_gedaemmt ? "Kellerdecke gedämmt, " : ""}
{aufnahme.keller_wand_gedaemmt ? "Kellerwand gedämmt, " : ""}
{aufnahme.oberste_geschossdecke_gedaemmt ? "oberste Geschossdecke gedämmt, " : ""}
{aufnahme.oberste_geschossdecke_min_12cm_gedaemmt ? "oberste Geschossdecke min. 12cm gedämmt, " : ""}
{aufnahme.dachgeschoss_min_12cm_gedaemmt ? "Dachgeschoss min. 12cm gedämmt, " : ""}
{aufnahme.aussenwand_min_12cm_gedaemmt ? "Außenwand min. 12cm gedämmt" : ""}
</div>
<div class="text-xs space-y-1 p-2">
<span class="font-semibold">Hiermit bestätige ich {benutzer.vorname} {benutzer.name} als Besteller:</span><br>
{#if ausweis.pruefpunkt_heizungsalter}
<div>Das Heizungsalter ist jünger als 3 Jahre. Es betrifft einen Heizungstausch ohne energetische Verbesserung.</div>
{/if}
{#if ausweis.pruefpunkt_verbrauch_niedrig}
<div>Ich habe die Verbrauchsangaben kontrolliert. Der niedrige Energiekennwert ist korrekt.</div>
{/if}
{#if ausweis.pruefpunkt_verbrauch_hoch}
<div>Ich habe die Verbrauchsangaben kontrolliert. Der hohe Energiekennwert ist korrekt.</div>
{/if}
{#if ausweis.pruefpunkt_verbrauch_null}
<div>Die eingegebenen Heizverbräuche sind korrekt und alle 3 Felder wurden vollständig eingegeben.</div>
{/if}
{#if ausweis.pruefpunkt_verbrauch_abweichung}
<div>Die eingegebenen Heizverbräuche sind korrekt und die Abweichung lässt sich begründen.</div>
{/if}
{#if ausweis.pruefpunkt_wohnflaeche_einheiten}
<div>Die Angabe der Wohnfläche ist korrekt und bezieht sich auf das gesamte Gebäude.</div>
{/if}
{#if ausweis.pruefpunkt_strom_null}
<div>Die eingegebenen Stromverbräuche sind korrekt. Alle 3 Felder wurden vollständig eingegeben.</div>
{/if}
{#if ausweis.pruefpunkt_strom_abweichung}
<div>Die eingegebenen Stromverbräuche sind korrekt und die Abweichung lässt sich begründen.</div>
{/if}
{#if ausweis.pruefpunkt_heizungsanlage}
<div>Das Baujahr der Heizungsanlage ist kleiner als das Baujahr des Gebäudes und begründet.</div>
{/if}
{#if ausweis.pruefpunkt_anteil_warmwasser}
<div>Ich habe den Warmwasseranteil nochmal überprüft. Dieser ist korrekt und begründet.</div>
{/if}
{#if ausweis.pruefpunkt_wohnflaeche}
<div>Ich habe die Wohnfläche nochmal überprüft und bestätige die Richtigkeit. Es handelt sich lediglich um die Wohnfläche innerhalb des Gebäudes.</div>
{/if}
<div>Ich habe die AGB und DSGVO im <a href="/impressum#agb" target="_blank" rel="noopener noreferrer">Impressum</a> gelesen und akzeptiert. Ich bestätige die Richtigkeit der Eingabe.</div>
</div>
</div>
</div>
</div>
<div class="relative bg-base-200 border border-base-300 rounded-lg p-4 mx-2">
<div class="card-body">
<div class="flex flex-col flex-wrap items-left gap-2">
<h3 class="font-semibold text-lg">Bilder</h3>
<div class="grid grid-cols-[1fr] md:grid-cols-[1fr,1fr,1fr] lg:grid-cols-[1fr,1fr,1fr] justify-start items-center gap-2">
{#each aufnahme.bilder as bild, i (i)}
<img src="/bilder/{bild.id}.jpg" alt={bild.kategorie} loading="lazy" class="max-h-[10vh] h-full w-full object-contain">
{/each}
</div>
<hr>
<h3 class="font-semibold text-lg">Unterlagen</h3>
<div class="text-sm">
{#if aufnahme.unterlagen.length > 0}
{#each aufnahme.unterlagen as unterlage}
<a href="/unterlagen/{unterlage.id}.{mime.getExtension(unterlage.mime)}" target="_blank" class="text-black flex flex-row items-center gap-2 bg-base-200 p-2 rounded-lg"><FileText size={32}></FileText> {unterlage.name}</a>
{/each}
{/if}
</div>
</div>
<div class="dropdown dropdown-top items-end absolute bottom-4 right-4 z-50">
<div class="indicator">
{#if Object.keys($notifications).length > 0}
<span class="indicator-item badge badge-accent text-xs"
>{Object.keys($notifications).length}</span
>
{/if}
<button
tabindex="0"
class="hover:bg-gray-200 p-3 rounded-lg"
>
<Bell size={24} />
</button>
</div>
<ul
class="dropdown-content mb-2 border border-base-300 z-10 menu py-4 px-0 bg-base-200 rounded-box w-80"
>
<NotificationProvider component={DashboardNotification} />
</ul>
</div>
</div>
</div>
@@ -479,3 +810,10 @@
</div>
</div>
</dialog>
<style lang="postcss">
*{@apply font-sans
}
</style>

View File

@@ -1,22 +1,23 @@
<script lang="ts">
import {
Reader,
Bell,
Gear,
LockClosed,
CaretDown,
MagnifyingGlass,
} from "radix-svelte-icons";
import NotificationProvider from "#components/NotificationProvider/NotificationProvider.svelte";
import DashboardNotification from "./DashboardNotification.svelte";
import { notifications } from "#components/NotificationProvider/shared.js";
import ThemeController from "#components/ThemeController.svelte";
import {
BenutzerClient,
ObjektKomplettClient,
} from "#components/Ausweis/types.js";
import { Benutzer } from "#lib/server/prisma.js";
export let lightTheme: boolean;
export let benutzer: BenutzerClient;
export let benutzer: Benutzer;
export let besteller: Benutzer | null;
let id: string;
let dropdownOpen = false;
function toggleDropdown() {
dropdownOpen = !dropdownOpen;
}
</script>
<aside class="rounded-lg bg-white box px-6 py-5">
@@ -41,38 +42,162 @@
</div>
</div>
<div class="flex flex-col gap-2 mt-0 md:mt-8 px-0">
<a class="button-tab" href="/dashboard">
<Reader width={22} height={22} />
Vorgänge
</a>
<a class="button-tab" href="/dashboard">
<Reader width={22} height={22} />
Inbox
</a>
<div class="flex flex-col gap-2 mt-0 md:mt-8 px-0">
<!-- <a class="button-tab" href="/dashboard">
<Reader width={22} height={22} />
Ausweise
</a> -->
<div class="flex flex-row gap-2 mb-2">
<input type="text" bind:value={id} placeholder="ID">
<button class="button" on:click={() => {
window.location.href = `/dashboard/objekte/${id}`
}}><MagnifyingGlass size={24}></MagnifyingGlass></button>
</div>
<div class="relative mb-4">
<button class="button flex flex-row rounded-lg gap-2 bg-secondary text-white text-center" on:click={toggleDropdown}>
Energieausweis erstellen +
</button>
{#if dropdownOpen}
<div class="absolute top-15 left-0 mt-2 w-50 rounded-md shadow-lg bg-white ring-1 ring-black ring-opacity-5 z-[9999]" on:click|stopPropagation on:keydown|stopPropagation on:keyup|stopPropagation>
<div class="py-1 w-full" role="menu" aria-orientation="vertical" aria-labelledby="options-menu">
<a href="/energieausweis-erstellen/verbrauchsausweis-wohngebaeude" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 w-full text-left" role="menuitem">Verbrauchsausweis<br>Wohnen Erstellen</a>
<a href="/energieausweis-erstellen/verbrauchsausweis-gewerbe" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 w-full text-left" role="menuitem">Verbrauchsausweis<br>Gewerbe Erstellen</a>
<a href="/energieausweis-erstellen/bedarfsausweis-wohngebaeude" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 w-full text-left" role="menuitem">Bedarfsausweis<br>Wohnen Erstellen</a>
</div>
</div>
{/if}
</div>
<hr class="border-gray-600" />
{#if besteller}
Besteller
<div class="flex flex-row mb-4">
<div class="item-center mr-4">
<img src="../../images/profile-placeholder.svg" alt="profile icon" width="40" height="40" />
</div>
<div>
<div>
{besteller.vorname} {besteller.name}
</div>
<div class="text-xs text-gray-500">
Eigentümer oder im Auftrag
</div>
<div class="text-xs text-gray-500">
<!-- Soll für den Aussteller sichtbar sein -->
Tel. 1: {besteller.telefon}<br>
<!-- Tel. 2: {rechnung.telefon} -->
</div>
</div>
</div>
<hr class="border-gray-600" />
{/if}
<!--
Mitwirkende
<div class="flex flex-row mb-1">
<div class="item-center mr-4">
<img src="../../images/profile-placeholder.svg" alt="profile icon" width="40" height="40" />
</div>
<div>
<div>
Ernie Energieberater
</div>
<div class="text-xs text-gray-500">
Energieberater
</div>
</div>
</div>
<div class="flex flex-row mb-1">
<div class="item-center mr-4">
<img src="../../images/profile-placeholder.svg" alt="profile icon" width="40" height="40" />
</div>
<div>
<div>
Peter Planer
</div>
<div class="text-xs text-gray-500">
Architekt
</div>
</div>
</div>
<div class="flex flex-row mb-1">
<div class="item-center mr-4">
<img src="../../images/profile-placeholder.svg" alt="profile icon" width="40" height="40" />
</div>
<div>
<div>
Hans Meier
</div>
<div class="text-xs text-gray-500">
Eigentümer
</div>
</div>
</div>
<hr class="border-gray-600" />
Experten in der Nähe
<div class="flex flex-row mb-1">
<div class="item-center mr-4">
<img src="../../images/profile-placeholder.svg" alt="profile icon" width="40" height="40" />
</div>
<div>
<div>
Thorsten Maas
</div>
<div class="text-xs text-gray-500">
Energieberater
</div>
</div>
</div>
<div class="flex flex-row mb-1">
<div class="item-center mr-4">
<img src="../../images/profile-placeholder.svg" alt="profile icon" width="40" height="40" />
</div>
<div>
<div>
Herbert Holm
</div>
<div class="text-xs text-gray-500">
Gutachter
</div>
</div>
</div>
<hr class="border-gray-600" />
<div class="flex justify-end mt-2 mb-2">
<button class="button flex flex-row rounded-lg gap-2 bg-secondary text-white text-center">
Einladen
</button>
</div>
-->
{#if benutzer.rolle === "ADMIN"}
<li>
<details class="[&_.caret]:open:rotate-180" open>
<summary
class="button-tab w-full outline-0 hover:outline-0 cursor-pointer"
>
<LockClosed width={22} height={22} />
<LockClosed size={22}/>
Admin <CaretDown
size={24}
class="caret ml-auto transition-transform"
></CaretDown></summary
>
<ul>
<li>
<a
class="button-tab"
href="/dashboard/admin/ausweise-pruefen"
>
Ausweise Prüfen
</a>
</li>
<li>
<a
class="button-tab"
@@ -86,30 +211,8 @@
</li>
{/if}
</div>
<div class="mt-10 flex flex-col gap-4 px-8">
<div class="flex flex-row justify-between items-center">
<ThemeController bind:lightTheme></ThemeController>
<div class="dropdown dropdown-top">
<div class="indicator">
{#if Object.keys($notifications).length > 0}
<span class="indicator-item badge badge-accent text-xs"
>{Object.keys($notifications).length}</span
>
{/if}
<button
tabindex="0"
class="hover:bg-gray-200 p-3 rounded-lg"
>
<Bell size={24} />
</button>
</div>
<ul
class="dropdown-content mb-2 border border-base-300 z-10 menu py-4 px-0 bg-base-200 rounded-box w-80"
>
<NotificationProvider component={DashboardNotification} />
</ul>
</div>
<div class="items-end bottom-4 right-4 z-50 mt-4">
<div class="flex flex-row justify-end items-end">
<a
href="/dashboard/einstellungen"
class="hover:bg-gray-200 p-3 rounded-lg"
@@ -118,12 +221,6 @@
</a>
</div>
</div>
<div class="divider px-8"></div>
<a
href="/dashboard/einstellungen"
class="hover:bg-gray-200 no-animation focus:shadow-none justify-start py-4 h-auto px-8 rounded-none w-full flex flex-row gap-4"
>
</a>
</aside>
<style>

View File

@@ -1,90 +1,179 @@
<script>
import { PRICES } from "#lib/constants";
export let bullets;
export let title;
export let ref = "";
import { PRICES } from "#lib/constants";
import { Enums } from "#lib/client/prisma";
bullets = [
["Prüfung durch Dipl.&nbsp;Ing.<br>Registrierung beim DiBt<br>rechtssicher nach&nbsp;GEG",true, true, true],
["Originalausweis als&nbsp;PDF per&nbsp;<span class='text-nowrap'>E-Mail</span><br>Originalausweis per&nbsp;Post (zubuchbar)",true, true, true],
["Bearbeitung innerhalb 24&nbsp;Stunden<br>Selbsteingabe",true, true, false],
["Same&nbsp;day&nbsp;service (zubuchbar)",true, true, false],
["Fotoupload",true, true, true],
["automatische Vorprüfung<br>Live&nbsp;Vorschau direkt bei&nbsp;Eingabe<br>Live&nbsp;Vorschauausweis vorab<br>Vorschauausweis per&nbsp;E-Mail<br>dynamische&nbsp;Eingabehilfe",true, true, false],
["Prüfanmerkungen per&nbsp;<span class='text-nowrap'>E-Mail</span>",true, true, false],
["persönlicher&nbsp;Support",false, true, true],
["telefonische&nbsp;Beratung<br>persönlicher&nbsp;Energieberater",false, true, true],
["Dokumentenupload (Pläne, Bauunterlagen)",false, false, true],
["Eingabe durch Dipl.&nbsp;Ing.",false, false, true],]
</script>
<h1>Produktübersicht: <span class="text-secondary">Bedarfsausweis Wohngebäude</span></h1>
<h3>Bedarfsausweis Leistungen und Preise in der Übersicht:</h3>
<hr>
<br>
<div id="ProduktUebersichtBedarfssausweisWohnen">
<div class="w-full sm:w-[90%] sm:mx-auto grid grid-cols-[1fr_max-content_max-content_max-content] sm:grid-cols-[1fr_min-content_min-content_min-content]">
<div class="zeile grid grid-cols-subgrid col-span-4 py-4 border-b-[1px] justify-items-center items-center sm:text-[1.25rem]">
<div class="justify-self-start pl-2"><b>Leistung</b></div><div><b>online</b></div><div><b>premium</b></div><div><b>offline</b></div>
</div>
{#each bullets as [bullet,online,premium,offline]}
<div class="bullet grid grid-cols-subgrid col-span-4 py-4 border-b-[1px] justify-items-center items-center">
<div class="justify-self-start pl-2">{@html bullet}</div>
<div class:check={online} class:check-no={!online}>{online ? "✔" : ""}</div>
<div class:check={premium} class:check-no={!premium}>{premium ? "✔" : ""}</div>
<div class:check={offline} class:check-no={!offline}>{offline ? "✔" : ""}</div>
</div>
{/each}
<div class="zeile grid grid-cols-subgrid col-span-4 py-4 border-b-[0px] justify-items-center items-center sm:text-[1.25rem]">
<div class="price justify-self-start pl-2">Preis inkl. MwSt.</div>
<div class="price"><b>{PRICES.BedarfsausweisWohnen[Enums.AusweisTyp.Standard]}&nbsp;</b></div>
<div class="price"><b>{PRICES.BedarfsausweisWohnen[Enums.AusweisTyp.Beratung]}&nbsp;</b></div>
<div class="price"><b>{PRICES.BedarfsausweisWohnen[Enums.AusweisTyp.Offline]}&nbsp;</b></div>
</div>
<div class="zeile grid grid-cols-subgrid col-span-4 py-4 border-b-[0px] justify-items-center items-center">
<div class="justify-self-start pl-2"></div>
<a href="{ref}/energieausweis-erstellen/bedarfsausweis-wohngebaeude?ausweistyp={Enums.AusweisTyp.Standard}"><button class="bestellbutton" type="button">sofort<br>bestellen</button></a>
<a href="{ref}/energieausweis-erstellen/bedarfsausweis-wohngebaeude?ausweistyp={Enums.AusweisTyp.Beratung}"><button class="bestellbutton" type="button">sofort<br>bestellen</button></a>
<a href="{ref}/energieausweis-erstellen/bedarfsausweis-wohngebaeude?ausweistyp={Enums.AusweisTyp.Offline}"><button class="bestellbutton" type="button">sofort<br>bestellen</button></a>
</div>
</div>
</div>
<style lang="postcss">
.bestellbutton{@apply px-[2px] sm:px-4 mx-[2px] sm:mx-2 py-2 bg-secondary ring-2 ring-secondary/25 rounded-none xs:rounded-md text-white text-nowrap font-bold
hover:bg-gradient-to-br from-secondary to-secondary-grad hover:shadow-lg transition-all hover:no-underline hover:ring-2 hover:ring-primary;}
.zeile{@apply text-[0.6rem] sm:text-[1rem] md:text-[1.5rem]}
.bullet{@apply text-[0.75rem] sm:text-[1rem] md:text-[1.25rem]}
.bullet:nth-child(even){@apply bg-blue-100/40}
.bullet:nth-child(2){@apply !border-t-[6px]}
.bullet:nth-child(12){@apply !border-b-[6px]}
.check {
@apply text-[1.25rem] sm:text-[1.5rem] font-bold text-green-700;
}
.check-no {
@apply text-[1.25rem] sm:text-[1.5rem] font-bold text-black;
}
.price{@apply text-[1.25rem] sm:text-[2rem]}
</style>
export let ref = "";
const bullets = [
[
"Prüfung durch Dipl.&nbsp;Ing.<br>Registrierung beim DiBt<br>rechtssicher nach&nbsp;GEG",
true,
true,
true,
],
[
"Originalausweis als&nbsp;PDF per&nbsp;<span class='text-nowrap'>E-Mail</span><br>Originalausweis per&nbsp;Post (zubuchbar)",
true,
true,
true,
],
[
"Bearbeitung innerhalb 24&nbsp;Stunden<br>Selbsteingabe",
true,
true,
false,
],
["Same&nbsp;day&nbsp;service (zubuchbar)", true, true, false],
["Fotoupload", true, true, true],
[
"automatische Vorprüfung<br>Live&nbsp;Vorschau direkt bei&nbsp;Eingabe<br>Live&nbsp;Vorschauausweis vorab<br>Vorschauausweis per&nbsp;E-Mail<br>dynamische&nbsp;Eingabehilfe",
true,
true,
false,
],
[
"Prüfanmerkungen per&nbsp;<span class='text-nowrap'>E-Mail</span>",
true,
true,
false,
],
["persönlicher&nbsp;Support", false, true, true],
[
"telefonische&nbsp;Beratung<br>persönlicher&nbsp;Energieberater",
false,
true,
true,
],
["Dokumentenupload (Pläne, Bauunterlagen)", false, false, true],
["Eingabe durch Dipl.&nbsp;Ing.", false, false, true],
];
</script>
<h1>
Produktübersicht: <span class="text-secondary"
>Bedarfsausweis Wohngebäude</span
>
</h1>
<h3>Bedarfsausweis Leistungen und Preise in der Übersicht:</h3>
<hr />
<br />
<div id="ProduktUebersichtBedarfssausweisWohnen">
<div
class="w-full sm:w-[90%] sm:mx-auto grid grid-cols-[1fr_max-content_max-content_max-content] sm:grid-cols-[1fr_min-content_min-content_min-content]"
>
<div
class="zeile grid grid-cols-subgrid col-span-4 py-4 border-b-[1px] justify-items-center items-center sm:text-[1.25rem]"
>
<div class="justify-self-start pl-2"><b>Leistung</b></div>
<div><b>online</b></div>
<div><b>premium</b></div>
<div><b>offline</b></div>
</div>
{#each bullets as [bullet, online, premium, offline]}
<div
class="bullet grid grid-cols-subgrid col-span-4 py-4 border-b-[1px] justify-items-center items-center"
>
<div class="justify-self-start pl-2">{@html bullet}</div>
<div class:check={online} class:check-no={!online}>
{online ? "✔" : ""}
</div>
<div class:check={premium} class:check-no={!premium}>
{premium ? "✔" : ""}
</div>
<div class:check={offline} class:check-no={!offline}>
{offline ? "✔" : ""}
</div>
</div>
{/each}
<div
class="zeile grid grid-cols-subgrid col-span-4 py-4 border-b-[0px] justify-items-center items-center sm:text-[1.25rem]"
>
<div class="price justify-self-start pl-2">Preis inkl. MwSt.</div>
<div class="price">
<b
>{PRICES.BedarfsausweisWohnen[
Enums.AusweisTyp.Standard
]}&nbsp;</b
>
</div>
<div class="price">
<b
>{PRICES.BedarfsausweisWohnen[
Enums.AusweisTyp.Beratung
]}&nbsp;</b
>
</div>
<div class="price">
<b
>{PRICES.BedarfsausweisWohnen[
Enums.AusweisTyp.Offline
]}&nbsp;</b
>
</div>
</div>
<div
class="zeile grid grid-cols-subgrid col-span-4 py-4 border-b-[0px] justify-items-center items-center"
>
<div class="justify-self-start pl-2"></div>
<a
href="{ref}/energieausweis-erstellen/bedarfsausweis-wohngebaeude?ausweistyp={Enums
.AusweisTyp.Standard}"
><button class="bestellbutton" type="button"
>sofort<br />bestellen</button
></a
>
<a
href="{ref}/energieausweis-erstellen/bedarfsausweis-wohngebaeude?ausweistyp={Enums
.AusweisTyp.Beratung}"
><button class="bestellbutton" type="button"
>sofort<br />bestellen</button
></a
>
<a
href="{ref}/energieausweis-erstellen/bedarfsausweis-wohngebaeude?ausweistyp={Enums
.AusweisTyp.Offline}"
><button class="bestellbutton" type="button"
>sofort<br />bestellen</button
></a
>
</div>
</div>
</div>
<style lang="postcss">
.bestellbutton {
@apply px-[2px] sm:px-4 mx-[2px] sm:mx-2 py-2 bg-secondary ring-2 ring-secondary/25 rounded-none xs:rounded-md text-white text-nowrap font-bold
hover:bg-gradient-to-br from-secondary to-secondary-grad hover:shadow-lg transition-all hover:no-underline hover:ring-2 hover:ring-primary;
}
.zeile {
@apply text-[0.6rem] sm:text-[1rem] md:text-[1.5rem];
}
.bullet {
@apply text-[0.75rem] sm:text-[1rem] md:text-[1.25rem];
}
.bullet:nth-child(even) {
@apply bg-blue-100/40;
}
.bullet:nth-child(2) {
@apply !border-t-[6px];
}
.bullet:nth-child(12) {
@apply !border-b-[6px];
}
.check {
@apply text-[1.25rem] sm:text-[1.5rem] font-bold text-green-700;
}
.check-no {
@apply text-[1.25rem] sm:text-[1.5rem] font-bold text-black;
}
.price {
@apply text-[1.25rem] sm:text-[2rem];
}
</style>

View File

@@ -1,89 +1,179 @@
<script>
import { PRICES } from "#lib/constants";
import { Enums } from "#lib/client/prisma";
export let ref = "";
const bullets = [
["Prüfung durch Dipl.&nbsp;Ing.<br>Registrierung beim DiBt<br>rechtssicher nach&nbsp;GEG",true, true, true],
["Originalausweis als&nbsp;PDF per&nbsp;<span class='text-nowrap'>E-Mail</span><br>Originalausweis per&nbsp;Post (zubuchbar)",true, true, true],
["Bearbeitung innerhalb 24&nbsp;Stunden<br>Selbsteingabe",true, true, false],
["Same&nbsp;day&nbsp;service (zubuchbar)",true, true, false],
["Fotoupload",true, true, true],
["automatische Vorprüfung<br>Live&nbsp;Vorschau direkt bei&nbsp;Eingabe<br>Live&nbsp;Vorschauausweis vorab<br>Vorschauausweis per&nbsp;E-Mail<br>dynamische&nbsp;Eingabehilfe",true, true, false],
["Prüfanmerkungen per&nbsp;<span class='text-nowrap'>E-Mail</span>",true, true, false],
["persönlicher&nbsp;Support",false, true, true],
["telefonische&nbsp;Beratung<br>persönlicher&nbsp;Energieberater",false, true, true],
["Dokumentenupload (Verbrauchsabrechnungen)",false, false, true],
["Eingabe durch Dipl.&nbsp;Ing.",false, false, true],
]
</script>
<h1>Produktübersicht: <span class="text-secondary">Verbrauchsausweis Gewerbegebäude</span></h1>
<h3>Verbrauchsausweis Leistungen und Preise in der Übersicht:</h3>
<hr>
<br>
<div id="ProduktUebersichtVerbrauchsausweisGewerbe">
<div class="w-full sm:w-[90%] sm:mx-auto grid grid-cols-[1fr_max-content_max-content_max-content] sm:grid-cols-[1fr_min-content_min-content_min-content]">
<div class="zeile grid grid-cols-subgrid col-span-4 py-4 border-b-[1px] justify-items-center items-center sm:text-[1.25rem]">
<div class="justify-self-start pl-2"><b>Leistung</b></div><div><b>online</b></div><div><b>premium</b></div><div><b>offline</b></div>
</div>
{#each bullets as [bullet,online,premium,offline]}
<div class="bullet grid grid-cols-subgrid col-span-4 py-4 border-b-[1px] justify-items-center items-center">
<div class="justify-self-start pl-2">{@html bullet}</div>
<div class:check={online} class:check-no={!online}>{online ? "✔" : ""}</div>
<div class:check={premium} class:check-no={!premium}>{premium ? "✔" : ""}</div>
<div class:check={offline} class:check-no={!offline}>{offline ? "✔" : ""}</div>
</div>
{/each}
<div class="zeile grid grid-cols-subgrid col-span-4 py-4 border-b-[0px] justify-items-center items-center sm:text-[1.25rem]">
<div class="price justify-self-start pl-2">Preis inkl. MwSt.</div>
<div class="price"><b>{PRICES.VerbrauchsausweisGewerbe[Enums.AusweisTyp.Standard]}&nbsp;</b></div>
<div class="price"><b>{PRICES.VerbrauchsausweisGewerbe[Enums.AusweisTyp.Beratung]}&nbsp;</b></div>
<div class="price"><b>{PRICES.VerbrauchsausweisGewerbe[Enums.AusweisTyp.Offline]}&nbsp;</b></div>
</div>
<div class="zeile grid grid-cols-subgrid col-span-4 py-4 border-b-[0px] justify-items-center items-center">
<div class="justify-self-start pl-2"></div>
<a href="{ref}/energieausweis-erstellen/verbrauchsausweis-gewerbe?ausweistyp={Enums.AusweisTyp.Standard}"><button class="bestellbutton" type="button">sofort<br>bestellen</button></a>
<a href="{ref}/energieausweis-erstellen/verbrauchsausweis-gewerbe?ausweistyp={Enums.AusweisTyp.Beratung}"><button class="bestellbutton" type="button">sofort<br>bestellen</button></a>
<a href="{ref}/energieausweis-erstellen/verbrauchsausweis-gewerbe?ausweistyp={Enums.AusweisTyp.Offline}"><button class="bestellbutton" type="button">sofort<br>bestellen</button></a>
</div>
</div>
</div>
<style lang="postcss">
.bestellbutton{@apply px-[2px] sm:px-4 mx-[2px] sm:mx-2 py-2 bg-secondary ring-2 ring-secondary/25 rounded-none xs:rounded-md text-white text-nowrap font-bold
hover:bg-gradient-to-br from-secondary to-secondary-grad hover:shadow-lg transition-all hover:no-underline hover:ring-2 hover:ring-primary;}
.zeile{@apply text-[0.6rem] sm:text-[1rem] md:text-[1.5rem]}
.bullet{@apply text-[0.75rem] sm:text-[1rem] md:text-[1.25rem]}
.bullet:nth-child(even){@apply bg-blue-100/40}
.bullet:nth-child(2){@apply !border-t-[6px]}
.bullet:nth-child(12){@apply !border-b-[6px]}
.check {
@apply text-[1.25rem] sm:text-[1.5rem] font-bold text-green-700;
}
.check-no {
@apply text-[1.25rem] sm:text-[1.5rem] font-bold text-black;
}
.price{@apply text-[1.25rem] sm:text-[2rem]}
</style>
import { PRICES } from "#lib/constants";
import { Enums } from "#lib/client/prisma";
export let ref = "";
const bullets = [
[
"Prüfung durch Dipl.&nbsp;Ing.<br>Registrierung beim DiBt<br>rechtssicher nach&nbsp;GEG",
true,
true,
true,
],
[
"Originalausweis als&nbsp;PDF per&nbsp;<span class='text-nowrap'>E-Mail</span><br>Originalausweis per&nbsp;Post (zubuchbar)",
true,
true,
true,
],
[
"Bearbeitung innerhalb 24&nbsp;Stunden<br>Selbsteingabe",
true,
true,
false,
],
["Same&nbsp;day&nbsp;service (zubuchbar)", true, true, false],
["Fotoupload", true, true, true],
[
"automatische Vorprüfung<br>Live&nbsp;Vorschau direkt bei&nbsp;Eingabe<br>Live&nbsp;Vorschauausweis vorab<br>Vorschauausweis per&nbsp;E-Mail<br>dynamische&nbsp;Eingabehilfe",
true,
true,
false,
],
[
"Prüfanmerkungen per&nbsp;<span class='text-nowrap'>E-Mail</span>",
true,
true,
false,
],
["persönlicher&nbsp;Support", false, true, true],
[
"telefonische&nbsp;Beratung<br>persönlicher&nbsp;Energieberater",
false,
true,
true,
],
["Dokumentenupload (Verbrauchsabrechnungen)", false, false, true],
["Eingabe durch Dipl.&nbsp;Ing.", false, false, true],
];
</script>
<h1>
Produktübersicht: <span class="text-secondary"
>Verbrauchsausweis Gewerbegebäude</span
>
</h1>
<h3>Verbrauchsausweis Leistungen und Preise in der Übersicht:</h3>
<hr />
<br />
<div id="ProduktUebersichtVerbrauchsausweisGewerbe">
<div
class="w-full sm:w-[90%] sm:mx-auto grid grid-cols-[1fr_max-content_max-content_max-content] sm:grid-cols-[1fr_min-content_min-content_min-content]"
>
<div
class="zeile grid grid-cols-subgrid col-span-4 py-4 border-b-[1px] justify-items-center items-center sm:text-[1.25rem]"
>
<div class="justify-self-start pl-2"><b>Leistung</b></div>
<div><b>online</b></div>
<div><b>premium</b></div>
<div><b>offline</b></div>
</div>
{#each bullets as [bullet, online, premium, offline]}
<div
class="bullet grid grid-cols-subgrid col-span-4 py-4 border-b-[1px] justify-items-center items-center"
>
<div class="justify-self-start pl-2">{@html bullet}</div>
<div class:check={online} class:check-no={!online}>
{online ? "✔" : ""}
</div>
<div class:check={premium} class:check-no={!premium}>
{premium ? "✔" : ""}
</div>
<div class:check={offline} class:check-no={!offline}>
{offline ? "✔" : ""}
</div>
</div>
{/each}
<div
class="zeile grid grid-cols-subgrid col-span-4 py-4 border-b-[0px] justify-items-center items-center sm:text-[1.25rem]"
>
<div class="price justify-self-start pl-2">Preis inkl. MwSt.</div>
<div class="price">
<b
>{PRICES.VerbrauchsausweisGewerbe[
Enums.AusweisTyp.Standard
]}&nbsp;</b
>
</div>
<div class="price">
<b
>{PRICES.VerbrauchsausweisGewerbe[
Enums.AusweisTyp.Beratung
]}&nbsp;</b
>
</div>
<div class="price">
<b
>{PRICES.VerbrauchsausweisGewerbe[
Enums.AusweisTyp.Offline
]}&nbsp;</b
>
</div>
</div>
<div
class="zeile grid grid-cols-subgrid col-span-4 py-4 border-b-[0px] justify-items-center items-center"
>
<div class="justify-self-start pl-2"></div>
<a
href="{ref}/energieausweis-erstellen/verbrauchsausweis-gewerbe?ausweistyp={Enums
.AusweisTyp.Standard}"
><button class="bestellbutton" type="button"
>sofort<br />bestellen</button
></a
>
<a
href="{ref}/energieausweis-erstellen/verbrauchsausweis-gewerbe?ausweistyp={Enums
.AusweisTyp.Beratung}"
><button class="bestellbutton" type="button"
>sofort<br />bestellen</button
></a
>
<a
href="{ref}/energieausweis-erstellen/verbrauchsausweis-gewerbe?ausweistyp={Enums
.AusweisTyp.Offline}"
><button class="bestellbutton" type="button"
>sofort<br />bestellen</button
></a
>
</div>
</div>
</div>
<style lang="postcss">
.bestellbutton {
@apply px-[2px] sm:px-4 mx-[2px] sm:mx-2 py-2 bg-secondary ring-2 ring-secondary/25 rounded-none xs:rounded-md text-white text-nowrap font-bold
hover:bg-gradient-to-br from-secondary to-secondary-grad hover:shadow-lg transition-all hover:no-underline hover:ring-2 hover:ring-primary;
}
.zeile {
@apply text-[0.6rem] sm:text-[1rem] md:text-[1.5rem];
}
.bullet {
@apply text-[0.75rem] sm:text-[1rem] md:text-[1.25rem];
}
.bullet:nth-child(even) {
@apply bg-blue-100/40;
}
.bullet:nth-child(2) {
@apply !border-t-[6px];
}
.bullet:nth-child(12) {
@apply !border-b-[6px];
}
.check {
@apply text-[1.25rem] sm:text-[1.5rem] font-bold text-green-700;
}
.check-no {
@apply text-[1.25rem] sm:text-[1.5rem] font-bold text-black;
}
.price {
@apply text-[1.25rem] sm:text-[2rem];
}
</style>

View File

@@ -1,93 +1,179 @@
<script lang="ts">
import { PRICES } from "#lib/constants.js";
import { Enums } from "#lib/client/prisma.js";
export let bullets;
export let title;
export let ref = "";
bullets = [
["Prüfung durch Dipl.&nbsp;Ing.<br>Registrierung beim DiBt<br>rechtssicher nach&nbsp;GEG",true, true, true],
["Originalausweis als&nbsp;PDF per&nbsp;<span class='text-nowrap'>E-Mail</span><br>Originalausweis per&nbsp;Post (zubuchbar)",true, true, true],
["Bearbeitung innerhalb 24&nbsp;Stunden<br>Selbsteingabe",true, true, false],
["Same&nbsp;day&nbsp;service (zubuchbar)",true, true, false],
["Fotoupload",true, true, true],
["automatische Vorprüfung<br>Live&nbsp;Vorschau direkt bei&nbsp;Eingabe<br>Live&nbsp;Vorschauausweis vorab<br>Vorschauausweis per&nbsp;E-Mail<br>dynamische&nbsp;Eingabehilfe",true, true, false],
["Prüfanmerkungen per&nbsp;<span class='text-nowrap'>E-Mail</span>",true, true, false],
["persönlicher&nbsp;Support",false, true, true],
["telefonische&nbsp;Beratung<br>persönlicher&nbsp;Energieberater",false, true, true],
["Dokumentenupload (Verbrauchsabrechnungen)",false, false, true],
["Eingabe durch Dipl.&nbsp;Ing.",false, false, true],
]
export let ref = "";
const bullets = [
[
"Prüfung durch Dipl.&nbsp;Ing.<br>Registrierung beim DiBt<br>rechtssicher nach&nbsp;GEG",
true,
true,
true,
],
[
"Originalausweis als&nbsp;PDF per&nbsp;<span class='text-nowrap'>E-Mail</span><br>Originalausweis per&nbsp;Post (zubuchbar)",
true,
true,
true,
],
[
"Bearbeitung innerhalb 24&nbsp;Stunden<br>Selbsteingabe",
true,
true,
false,
],
["Same&nbsp;day&nbsp;service (zubuchbar)", true, true, false],
["Fotoupload", true, true, true],
[
"automatische Vorprüfung<br>Live&nbsp;Vorschau direkt bei&nbsp;Eingabe<br>Live&nbsp;Vorschauausweis vorab<br>Vorschauausweis per&nbsp;E-Mail<br>dynamische&nbsp;Eingabehilfe",
true,
true,
false,
],
[
"Prüfanmerkungen per&nbsp;<span class='text-nowrap'>E-Mail</span>",
true,
true,
false,
],
["persönlicher&nbsp;Support", false, true, true],
[
"telefonische&nbsp;Beratung<br>persönlicher&nbsp;Energieberater",
false,
true,
true,
],
["Dokumentenupload (Verbrauchsabrechnungen)", false, false, true],
["Eingabe durch Dipl.&nbsp;Ing.", false, false, true],
];
</script>
<h1>Produktübersicht: <span class="text-secondary">Verbrauchsausweis Wohngebäude</span></h1>
<h1>
Produktübersicht: <span class="text-secondary"
>Verbrauchsausweis Wohngebäude</span
>
</h1>
<h3>Verbrauchsausweis Leistungen und Preise in der Übersicht:</h3>
<hr>
<br>
<hr />
<br />
<div id="ProduktUebersichtVerbrauchsausweisWohnen">
<div
class="w-full sm:w-[90%] sm:mx-auto grid grid-cols-[1fr_max-content_max-content_max-content] sm:grid-cols-[1fr_min-content_min-content_min-content]"
>
<div
class="zeile grid grid-cols-subgrid col-span-4 py-4 border-b-[1px] justify-items-center items-center sm:text-[1.25rem]"
>
<div class="justify-self-start pl-2"><b>Leistung</b></div>
<div><b>online</b></div>
<div><b>premium</b></div>
<div><b>offline</b></div>
</div>
<div class="w-full sm:w-[90%] sm:mx-auto grid grid-cols-[1fr_max-content_max-content_max-content] sm:grid-cols-[1fr_min-content_min-content_min-content]">
<div class="zeile grid grid-cols-subgrid col-span-4 py-4 border-b-[1px] justify-items-center items-center sm:text-[1.25rem]">
<div class="justify-self-start pl-2"><b>Leistung</b></div><div><b>online</b></div><div><b>premium</b></div><div><b>offline</b></div>
</div>
{#each bullets as [bullet,online,premium,offline]}
<div class="bullet grid grid-cols-subgrid col-span-4 py-4 border-b-[1px] justify-items-center items-center">
<div class="justify-self-start pl-2">{@html bullet}</div>
<div class:check={online} class:check-no={!online}>{online ? "✔" : ""}</div>
<div class:check={premium} class:check-no={!premium}>{premium ? "✔" : ""}</div>
<div class:check={offline} class:check-no={!offline}>{offline ? "✔" : ""}</div>
</div>
{/each}
<div class="zeile grid grid-cols-subgrid col-span-4 py-4 border-b-[0px] justify-items-center items-center sm:text-[1.25rem]">
<div class="price justify-self-start pl-2">Preis inkl. MwSt.</div>
<div class="price"><b>{PRICES.VerbrauchsausweisWohnen[Enums.AusweisTyp.Standard]}&nbsp;</b></div>
<div class="price"><b>{PRICES.VerbrauchsausweisWohnen[Enums.AusweisTyp.Beratung]}&nbsp;</b></div>
<div class="price"><b>{PRICES.VerbrauchsausweisWohnen[Enums.AusweisTyp.Offline]}&nbsp;</b></div>
</div>
<div class="zeile grid grid-cols-subgrid col-span-4 py-4 border-b-[0px] justify-items-center items-center">
<div class="justify-self-start pl-2"></div>
<a href="{ref}/energieausweis-erstellen/verbrauchsausweis-wohngebaeude?ausweistyp={Enums.AusweisTyp.Standard}" ><button class="bestellbutton" type="button">sofort<br>bestellen</button></a>
<a href="{ref}/energieausweis-erstellen/verbrauchsausweis-wohngebaeude?ausweistyp={Enums.AusweisTyp.Beratung}" ><button class="bestellbutton" type="button">sofort<br>bestellen</button></a>
<a href="{ref}/energieausweis-erstellen/verbrauchsausweis-wohngebaeude?ausweistyp={Enums.AusweisTyp.Offline}" ><button class="bestellbutton" type="button">sofort<br>bestellen</button></a>
</div>
</div>
{#each bullets as [bullet, online, premium, offline]}
<div
class="bullet grid grid-cols-subgrid col-span-4 py-4 border-b-[1px] justify-items-center items-center"
>
<div class="justify-self-start pl-2">{@html bullet}</div>
<div class:check={online} class:check-no={!online}>
{online ? "✔" : ""}
</div>
<div class:check={premium} class:check-no={!premium}>
{premium ? "✔" : ""}
</div>
<div class:check={offline} class:check-no={!offline}>
{offline ? "✔" : ""}
</div>
</div>
{/each}
<div
class="zeile grid grid-cols-subgrid col-span-4 py-4 border-b-[0px] justify-items-center items-center sm:text-[1.25rem]"
>
<div class="price justify-self-start pl-2">Preis inkl. MwSt.</div>
<div class="price">
<b
>{PRICES.VerbrauchsausweisWohnen[
Enums.AusweisTyp.Standard
]}&nbsp;</b
>
</div>
<div class="price">
<b
>{PRICES.VerbrauchsausweisWohnen[
Enums.AusweisTyp.Beratung
]}&nbsp;</b
>
</div>
<div class="price">
<b
>{PRICES.VerbrauchsausweisWohnen[
Enums.AusweisTyp.Offline
]}&nbsp;</b
>
</div>
</div>
<div
class="zeile grid grid-cols-subgrid col-span-4 py-4 border-b-[0px] justify-items-center items-center"
>
<div class="justify-self-start pl-2"></div>
<a
href="{ref}/energieausweis-erstellen/verbrauchsausweis-wohngebaeude?ausweistyp={Enums
.AusweisTyp.Standard}"
><button class="bestellbutton" type="button"
>sofort<br />bestellen</button
></a
>
<a
href="{ref}/energieausweis-erstellen/verbrauchsausweis-wohngebaeude?ausweistyp={Enums
.AusweisTyp.Beratung}"
><button class="bestellbutton" type="button"
>sofort<br />bestellen</button
></a
>
<a
href="{ref}/energieausweis-erstellen/verbrauchsausweis-wohngebaeude?ausweistyp={Enums
.AusweisTyp.Offline}"
><button class="bestellbutton" type="button"
>sofort<br />bestellen</button
></a
>
</div>
</div>
</div>
<style lang="postcss">
.bestellbutton {
@apply px-[2px] sm:px-4 mx-[2px] sm:mx-2 py-2 bg-secondary ring-2 ring-secondary/25 rounded-none xs:rounded-md text-white text-nowrap font-bold
hover:bg-gradient-to-br from-secondary to-secondary-grad hover:shadow-lg transition-all hover:no-underline hover:ring-2 hover:ring-primary;
}
.bestellbutton{@apply px-[2px] sm:px-4 mx-[2px] sm:mx-2 py-2 bg-secondary ring-2 ring-secondary/25 rounded-none xs:rounded-md text-white text-nowrap font-bold
hover:bg-gradient-to-br from-secondary to-secondary-grad hover:shadow-lg transition-all hover:no-underline hover:ring-2 hover:ring-primary;}
.zeile {
@apply text-[0.6rem] sm:text-[1rem] md:text-[1.5rem];
}
.bullet {
@apply text-[0.75rem] sm:text-[1rem] md:text-[1.25rem];
}
.bullet:nth-child(even) {
@apply bg-blue-100/40;
}
.bullet:nth-child(2) {
@apply !border-t-[6px];
}
.bullet:nth-child(12) {
@apply !border-b-[6px];
}
.zeile{@apply text-[0.6rem] sm:text-[1rem] md:text-[1.5rem]}
.bullet{@apply text-[0.75rem] sm:text-[1rem] md:text-[1.25rem]}
.bullet:nth-child(even){@apply bg-blue-100/40}
.bullet:nth-child(2){@apply !border-t-[6px]}
.bullet:nth-child(12){@apply !border-b-[6px]}
.check {
.check {
@apply text-[1.25rem] sm:text-[1.5rem] font-bold text-green-700;
}
.check-no {
@apply text-[1.25rem] sm:text-[1.5rem] font-bold text-black;
}
.price{@apply text-[1.25rem] sm:text-[2rem]}
</style>
.price {
@apply text-[1.25rem] sm:text-[2rem];
}
</style>

View File

@@ -0,0 +1,209 @@
---
export interface Props {
tab: number;
}
const { tab } = Astro.props;
const { params } = Astro;
const partner = params.partner;
const pathname = Astro.url.pathname;
const isVA = pathname.includes("verbrauchsausweis-wohngebaeude");
const isVAG = pathname.includes("verbrauchsausweis-gewerbe");
const isBA = pathname.includes("bedarfsausweis-wohngebaeude");
const isBAG = pathname.includes("bedarfsausweis-gewerbe-anfragen");
const isGGW = pathname.includes("geg-nachweis-wohnen-anfragen");
const isGGG = pathname.includes("geg-nachweis-gewerbe-anfragen");
const isWEA = pathname.includes("welcher-ausweis");
const isWelt = pathname.includes("immowelt");
const isNET = pathname.includes("immonet");
---
<header id="header" class="w-full bg-white h-[81px] sm:pl-8">
<div class="grid grid-cols-[min-content_1fr] items-center">
<div class="w-[150px] h-[80px]">
<div
class="w-full h-full grid grid-col-1 justify-items-center items-center"
>
<img
class={isNET
? "w-[149px]"
: isWelt
? "w-[109px]"
: "w-[109px]"}
src={`/images/partner/${partner}/${partner}.svg`}
alt={partner}
/>
</div>
</div>
<div>
<ul class="navlist">
<li>
<a
href={`/${partner}/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/`}
><button class={tab === 0 ? "glow" : ""}
>Verbrauchsausweis</button
></a>
</li>
<li>
<a
href={`/${partner}/energieausweis-erstellen/verbrauchsausweis-gewerbe/`}
><button class={tab === 1 ? "glow" : ""}
>Verbrauchsausweis Gewerbe</button
></a>
</li>
<li>
<a
href={`/${partner}/energieausweis-erstellen/bedarfsausweis-wohngebaeude/`}
><button class={tab === 2 ? "glow" : ""}
>Bedarfsausweis</button
></a>
</li>
<li>
<a
href={`/${partner}/angebot-anfragen/bedarfsausweis-gewerbe-anfragen/`}
><button class={tab === 3 ? "glow" : ""}
>Bedarfsausweis Gewerbe</button
></a>
</li>
<li>
<a
href={`/${partner}/angebot-anfragen/geg-nachweis-wohnen-anfragen/`}
><button class={tab === 4 ? "glow" : ""}
>GEG Nachweis Wohngebäude</button
></a>
</li>
<li>
<a
href={`/${partner}/angebot-anfragen/geg-nachweis-gewerbe-anfragen/`}
><button class={tab === 5 ? "glow" : ""}
>GEG Nachweis Gewerbe</button
></a>
</li>
<li>
<a href={`/${partner}/welcher-ausweis/${partner}`}
><button class={tab === 6 ? "glow" : ""}
>Welcher Ausweis</button
></a>
</li>
</ul>
</div>
</div>
</header>
<div
id="titel"
class="block w-full 2xl:h-[270px] lg:h-[148px] bg-cover px-24 py-20"
style={`background-image: url('/images/partner/${partner}/hero-energieausweis.jpg');
background-repeat:no-repeat; background-position:right;`}
>
{
isVA ? (
<div>
Hier komfortabel und einfach online den{" "}
<b>Verbrauchsausweis Wohngebäude</b> bestellen
</div>
) : (
""
)
}
{
isVAG ? (
<div>
Hier komfortabel und einfach online den{" "}
<b>Verbrauchsausweis Gewerbe</b> bestellen
</div>
) : (
""
)
}
{
isBA ? (
<div>
Hier komfortabel und einfach online den{" "}
<b>Bedarfsausweis Wohngebäude</b> bestellen
</div>
) : (
""
)
}
{
isBAG ? (
<div>
Hier komfortabel und einfach online den{" "}
<b>Bedarfsausweis Gewerbe</b> anfragen
</div>
) : (
""
)
}
{
isGGW ? (
<div>
Hier komfortabel und einfach online den{" "}
<b>GEG Nachweis Wohngebäude</b> anfragen
</div>
) : (
""
)
}
{
isGGG ? (
<div>
Hier komfortabel und einfach online den{" "}
<b>GEG Nachweis Gewerbe</b> anfragen
</div>
) : (
""
)
}
{
isWEA ? (
<div>
Hier komfortabel und einfach online den richtigen Ausweis finden
</div>
) : (
""
)
}
</div>
<style lang="postcss">
@font-face {
font-family: "immo Sans";
src: url('/fonts/Immo-Sans/immoSans-Regular.eot');
src: url('/fonts/Immo-Sans/immoSans-Regular.eot?#iefix') format('embedded-opentype'),
url('/fonts/Immo-Sans/immoSans-Regular.woff2') format('woff2'),
url('/fonts/Immo-Sans/immoSans-Regular.woff') format('woff');
font-style: normal;
font-weight: 400;
}
#titel{
font-family: "immo Sans";
font-weight:400;
div{@apply w-fit bg-white/75 py-6 px-16 rounded-lg ring-2 ring-black/15 text-[1.45rem];box-shadow:8px 8px 16px rgba(0,0,0,0.5);}
}
.header-button {
@apply px-4 py-2 text-primary-content font-medium text-lg tracking-normal hover:bg-secondary h-full;
}
.navlist {
@apply flex flex-wrap flex-col sm:flex-row pl-[1.75rem] sm:pl-[1.75rem];
}
.navlist li {
@apply pr-0 sm:pr-[6px] pb-1 sm:pb-0;
}
.navlist li button{@apply text-[0.75rem] md:text-[1rem] text-[#646464] sm:p-2 text-left
hover:rounded-[1rem] hover:bg-[rgba(50,50,50,0.1)];
font-family: "immo Sans";
font-weight:400;}
.glow{@apply rounded-[1rem] bg-[rgba(50,50,50,0.1)];}
</style>

View File

@@ -1,114 +0,0 @@
---
import HeaderLogin from "#components/design/header/HeaderLogin.svelte";
const { tabHover1 } = Astro.props;
const { tabHover2 } = Astro.props;
const { tabHover3 } = Astro.props;
const { tabHover4 } = Astro.props;
const { tabHover5 } = Astro.props;
const { tabHover6 } = Astro.props;
const { tabHover7 } = Astro.props;
const { params, url } = Astro;
const partner = params.partner;
const url1 = new URL(Astro.request.url);
const urlPath = url1.pathname;
const isVA = urlPath.includes("verbrauchsausweis-wohngebaeude");
const isVAG = urlPath.includes("verbrauchsausweis-gewerbe");
const isBA = urlPath.includes("bedarfsausweis-wohngebaeude");
const isBAG = urlPath.includes("bedarfsausweis-gewerbe-anfragen");
const isGGW = urlPath.includes("geg-nachweis-wohnen-anfragen");
const isGGG = urlPath.includes("geg-nachweis-gewerbe-anfragen");
const isWEA = urlPath.includes("welcher-ausweis");
const isWelt = urlPath.includes("immowelt");
const isNET = urlPath.includes("immonet");
---
<header id="header" class="w-full bg-white h-[81px] sm:pl-8">
<div class="grid grid-cols-[min-content_1fr] items-center">
<div class="w-[150px] h-[80px]">
<div class="w-full h-full grid grid-col-1 justify-items-center items-center">
<img class={isNET ? "w-[149px]" : isWelt ? "w-[109px]" : "w-[109px]"} src={`/images/partner/${partner}/${partner}.svg`} alt={partner} />
</div>
</div>
<div>
<ul class="navlist">
<li><a href={`/${partner}/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/`}><button class={tabHover1}>Verbrauchsausweis</button></a></li>
<li><a href={`/${partner}/energieausweis-erstellen/verbrauchsausweis-gewerbe/`}><button class={tabHover2}>Verbrauchsausweis Gewerbe</button></a></li>
<li><a href={`/${partner}/energieausweis-erstellen/bedarfsausweis-wohngebaeude/`}><button class={tabHover3}>Bedarfsausweis</button></a></li>
<li><a href={`/${partner}/angebot-anfragen/bedarfsausweis-gewerbe-anfragen/`}><button class={tabHover4}>Bedarfsausweis Gewerbe</button></a></li>
<li><a href={`/${partner}/angebot-anfragen/geg-nachweis-wohnen-anfragen/`}><button class={tabHover5}>GEG Nachweis Wohngebäude</button></a></li>
<li><a href={`/${partner}/angebot-anfragen/geg-nachweis-gewerbe-anfragen/`}><button class={tabHover6}>GEG Nachweis Gewerbe</button></a></li>
<li><a href={`/${partner}/welcher-ausweis/${partner}`}><button class={tabHover7}>Welcher Ausweis</button></a></li>
</ul>
</div>
</div>
</header>
<div id="titel" class="block w-full 2xl:h-[270px] lg:h-[148px] bg-cover px-24 py-20"
style={`background-image: url('/images/partner/${partner}/hero-energieausweis.jpg');
background-repeat:no-repeat; background-position:right;`}>
{isVA ? <div>Hier komfortabel und einfach online den <b>Verbrauchsausweis Wohngebäude</b> bestellen</div> : ""}
{isVAG ? <div>Hier komfortabel und einfach online den <b>Verbrauchsausweis Gewerbe</b> bestellen</div> : ""}
{isBA ? <div>Hier komfortabel und einfach online den <b>Bedarfsausweis Wohngebäude</b> bestellen</div> : ""}
{isBAG ? <div>Hier komfortabel und einfach online den <b>Bedarfsausweis Gewerbe</b> anfragen</div> : ""}
{isGGW ? <div>Hier komfortabel und einfach online den <b>GEG Nachweis Wohngebäude</b> anfragen</div> : ""}
{isGGG ? <div>Hier komfortabel und einfach online den <b>GEG Nachweis Gewerbe</b> anfragen</div> : ""}
{isWEA ? <div>Hier komfortabel und einfach online den richtigen Ausweis finden</div> : ""}
</div>
<style lang="postcss">
@font-face {
font-family: "immo Sans";
src: url('/fonts/Immo-Sans/immoSans-Regular.eot');
src: url('/fonts/Immo-Sans/immoSans-Regular.eot?#iefix') format('embedded-opentype'),
url('/fonts/Immo-Sans/immoSans-Regular.woff2') format('woff2'),
url('/fonts/Immo-Sans/immoSans-Regular.woff') format('woff');
font-style: normal;
font-weight: 400;
}
#titel{
font-family: "immo Sans";
font-weight:400;
div{@apply w-fit bg-white/75 py-6 px-16 rounded-lg ring-2 ring-black/15 text-[1.45rem];box-shadow:8px 8px 16px rgba(0,0,0,0.5);}
}
.header-button {
@apply px-4 py-2 text-primary-content font-medium text-lg tracking-normal hover:bg-secondary h-full;
}
.navlist {
@apply flex flex-wrap flex-col sm:flex-row pl-[1.75rem] sm:pl-[1.75rem];
}
.navlist li {
@apply pr-0 sm:pr-[6px] pb-1 sm:pb-0;
}
.navlist li button{@apply text-[0.75rem] md:text-[1rem] text-[#646464] sm:p-2 text-left
hover:rounded-[1rem] hover:bg-[rgba(50,50,50,0.1)];
font-family: "immo Sans";
font-weight:400;}
.glow{@apply rounded-[1rem] bg-[rgba(50,50,50,0.1)];}
</style>

View File

@@ -1,82 +0,0 @@
---
import HeaderLogin from "#components/design/header/HeaderLogin.svelte";
---
<header id="header">
<div id="header-grid" class="grid relative bg-white items-center gap-x-4 pt-4 px-0
grid-cols-1
sm:grid-cols-1
md:grid-cols-1
lg:grid-cols-[1fr_minmax(450px,450px)] lg:gap-x-3 lg:px-4 lg:py-4
xl:grid-cols-[1fr_minmax(450px,450px)] xl:gap-x-4 xl:px-6 xl:py-4
2xl:grid-cols-[1fr_minmax(450px,450px)] 2xl:gap-x-5 2xl:px-6 2xl:py-4">
<div class="justify-self-center xs:justify-self-start">
<div class="grid grid-cols-1 px-2 gap-2 gap-y-1
xs:grid-cols-[max-content,1fr] xs:gap-x-2 xs:px-4
md:gap-y-4
lg:px-0 lg:gap-x-4">
<div class="self-start justify-self-start">
<a href="/">
<img id="header-logo" class="w-full
xs:max-w-[64px]
sm:max-w-[64px]
md:max-w-[64px] md:ml-6
lg:max-w-[64px] lg:ml-0
xl:max-w-[94px] xl:ml-0
"
src="/images/header/logo-IBC-big.svg" alt="IBCornelsen-Logo"/>
</a>
</div>
<div class="self-center justify-self-center md:justify-self-start xs:mt-[20px] md:mt-[18px]">
<div id="header-text-1"class="text-secondary justify-self-center
xs:[font-size:_clamp(15px,5vw,36px)] xs:justify-self-start xs:leading-[36px]
lg:[font-size:_clamp(15px,3vw,26px)]
lg:leading-[2rem]
xl:[font-size:_clamp(15px,3vw,36px)]
xl:leading-[4.5rem] pt-[0px]">
Energieausweis online erstellen</div>
<div id="header-text-2"class="text-primary justify-self-center
xs:[font-size:_clamp(15px,4vw,28px)] xs:justify-self-start xs:leading-[20px]
lg:[font-size:_clamp(15px,3vw,20px)]
lg:leading-[2rem]
xl:[font-size:_clamp(15px,3vw,24px)]
xl:leading-[0.5rem]">
Energieausweise nach aktuellem GEG</div>
</div>
</div>
</div>
<div class="w-full justify-self-center">
<HeaderLogin client:load />
</div>
</div>
</div>
<div class="col-start-1 col-span-3">
<div id="header-line" class="px-2 flex flex-row w-full justify-end items-center bg-primary
lg:h-[12px] xl:h-[12px]"></div>
</div>
</header>
<style>
.header-button {
@apply px-4 py-2 text-primary-content font-medium text-lg tracking-normal hover:bg-secondary h-full;
}
</style>

View File

@@ -1,19 +1,22 @@
---
import NavigationCard from "#components/design/sidebars/cards/NavigationCard.svelte";
import CardPriceiInfo from "#components/design/sidebars/cards/cardPriceiInfo.svelte";
import CardPriceInfo from "#components/design/sidebars/cards/CardPriceInfo.svelte";
import CardProduktSidebar from "#components/design/sidebars/cards/CardProduktSidebar.svelte";
import { PRICES } from "#lib/constants";
import { Enums } from "#lib/client/prisma";
---
<div class="">
<NavigationCard client:load />
<NavigationCard client:load/>
<CardProduktSidebar art="Verbrauchsausweis Gewerbe" price={PRICES.VerbrauchsausweisGewerbe[Enums.AusweisTyp.Standard]}></CardProduktSidebar>
<CardPriceiInfo />
<CardProduktSidebar art="Bedarfsausweis Wohnen" price={PRICES.BedarfsausweisWohnen[Enums.AusweisTyp.Standard]}></CardProduktSidebar>
</div>
<CardProduktSidebar
art="Verbrauchsausweis Gewerbe"
price={PRICES.VerbrauchsausweisGewerbe[Enums.AusweisTyp.Standard]}
/>
<CardPriceInfo />
<CardProduktSidebar
art="Bedarfsausweis Wohnen"
price={PRICES.BedarfsausweisWohnen[Enums.AusweisTyp.Standard]}
/>
</div>

View File

@@ -1,6 +1,6 @@
---
import CardContact from "#components/design/sidebars/cards/ContactCard.svelte";
import CardPriceiInfo from "#components/design/sidebars/cards/cardPriceiInfo.svelte";
import CardPriceInfo from "#components/design/sidebars/cards/CardPriceInfo.svelte";
import CardProduktSidebar from "#components/design/sidebars/cards/CardProduktSidebar.svelte";
import { PRICES } from "#lib/constants";
@@ -8,16 +8,15 @@ import { Enums } from "#lib/client/prisma";
---
<div class="hidden 2xl:block">
<CardContact />
<CardContact />
<CardProduktSidebar art="Verbrauchsausweis Wohnen" price={PRICES.VerbrauchsausweisWohnen[Enums.AusweisTyp.Standard]}></CardProduktSidebar>
<CardPriceiInfo />
<CardProduktSidebar art="Bedarfsausweis Gewerbe" price={PRICES.BedarfsausweisGewerbe[Enums.AusweisTyp.Standard]}></CardProduktSidebar>
<CardProduktSidebar
art="Verbrauchsausweis Wohnen"
price={PRICES.VerbrauchsausweisWohnen[Enums.AusweisTyp.Standard]}
/>
<CardPriceInfo />
<CardProduktSidebar
art="Bedarfsausweis Gewerbe"
price={PRICES.BedarfsausweisGewerbe[Enums.AusweisTyp.Standard]}
/>
</div>
</div>

View File

@@ -0,0 +1,66 @@
<script>
import { PRICES } from "#lib/constants";
import { Enums } from "#lib/client/prisma";
</script>
<div id="cardPriceinfo" class="box card hidden lg:block">
<h2>Was wird der Energieausweis kosten?</h2>
<div>Verbrauchsausweis Wohngebäude</div>
<div>
ab&nbsp;<span class="price"
>{PRICES.VerbrauchsausweisWohnen[Enums.AusweisTyp.Standard]}€</span
>&nbsp;inkl.&nbsp;MwSt.
</div>
<hr class="trenner" />
<div>Bedarfsausweis Wohngebäude</div>
<div>
ab&nbsp;<span class="price"
>{PRICES.BedarfsausweisWohnen[Enums.AusweisTyp.Standard]}€</span
>&nbsp;inkl.&nbsp;MwSt.
</div>
<hr class="trenner" />
<div>Verbrauchsausweis Gewerbe</div>
<div>
ab&nbsp;<span class="price"
>{PRICES.VerbrauchsausweisGewerbe[Enums.AusweisTyp.Standard]}€</span
>&nbsp;inkl.&nbsp;MwSt.
</div>
<hr class="trenner" />
<div>Bedarfsausweis Gewerbe</div>
<div>
ab&nbsp;<span class="price"
>{PRICES.BedarfsausweisGewerbe[Enums.AusweisTyp.Standard]}€</span
>&nbsp;inkl.&nbsp;MwSt.
</div>
<hr class="trenner" />
<div>GEG-Nachweis Wohngebäude</div>
<div>
ab&nbsp;<span class="price"
>{PRICES.GEGNachweisWohnen[Enums.AusweisTyp.Standard]}€</span
>&nbsp;inkl.&nbsp;MwSt.
</div>
<hr class="trenner" />
<div>GEG-Nachweis Gewerbe</div>
<div>
ab&nbsp;<span class="price"
>{PRICES.GEGNachweisGewerbe[Enums.AusweisTyp.Standard]}€</span
>&nbsp;inkl.&nbsp;MwSt.
</div>
<hr class="mt-2" />
</div>
<style lang="postcss">
.trenner {
@apply my-2;
}
.price {
@apply font-bold;
}
</style>

View File

@@ -1,465 +0,0 @@
<script lang="ts">
let innerWidth: number;
function dropdown() {
if (innerWidth < 1024) {
const check_element = this.lastChild;
const rotate_list = document.querySelectorAll(".dd-symbol-clone");
const rotate_element = this.childNodes[0].children[0];
var first_check = check_element.classList.contains(
"show-dropdown-content"
);
const nodeList = document.querySelectorAll(".dropdown-content");
if (first_check == true) {
check_element.classList.remove("show-dropdown-content");
rotate_element.classList.toggle("rotate-symbol");
} else {
for (let i = 0; i < nodeList.length; i++) {
const element = nodeList[i];
element.classList.remove("show-dropdown-content");
}
for (let i = 0; i < rotate_list.length; i++) {
const element = rotate_list[i];
element.classList.remove("rotate-symbol");
}
check_element.classList.add("show-dropdown-content");
rotate_element.classList.add("rotate-symbol");
}
}
}
function hover() {
if (innerWidth > 1024) {
const check_element = this.firstChild.lastChild;
check_element.style.visibility = "visible";
}
}
function hoverout() {
if (innerWidth > 1024) {
const check_element = this.firstChild.lastChild;
check_element.style.visibility = "hidden";
}
}
function hamburger() {
const nodeList = document.querySelectorAll(".dropdown-content");
for (let i = 0; i < nodeList.length; i++) {
nodeList[i].classList.remove("show-dropdown-content");
}
var element = document.getElementById("cardNavigation");
element.classList.toggle("hidden");
const spans = this.children;
var first_check = spans[0].classList.contains("hamburger-swing-0");
if (first_check == true) {
for (let i = 0; i < spans.length; i++) {
spans[i].classList.remove("hamburger-swing-" + i);
}
const rotate_list = document.querySelectorAll(".dd-symbol");
for (let i = 0; i < rotate_list.length; i++) {
rotate_list[i].classList.remove("rotate-symbol");
}
} else {
for (let i = 0; i < spans.length; i++) {
spans[i].classList.add("hamburger-swing-" + i);
}
}
}
</script>
<svelte:window bind:innerWidth />
<div
class="hamburger_menu py-1 px-2 bg-secondary
xs:px-4
lg:hidden"
>
<div
id="hamburger"
on:click={hamburger}
on:keydown={hamburger}
class="cursor-pointer"
>
<span></span>
<span></span>
<span></span>
</div>
</div>
<nav
id="cardNavigation"
class="cardNavigation box hidden relative ring-0 md:ring-2 ring-primary/50 rounded-tr-none lg:block mb-0 lg:mb-5"
>
<div class="nav-element bg-secondary/5 py-1 pl-2 text-xs font-bold">
Jetzt bestellen
</div>
<div class="nav-element">
<a class="no-dropdown nav-element-child" href="/welcher-energieausweis/"
>Welcher Energieausweis?</a
>
</div>
<!-- svelte-ignore a11y-mouse-events-have-key-events -->
<div
class="nav-element dropdown lg:dropdown-right"
on:click={dropdown}
on:keydown={dropdown}
on:mouseover={hover}
on:mouseleave={hoverout}
>
{#if innerWidth > 1023}
<a href={undefined} class="nav-element-child"
>Energieausweis erstellen<span class="dd-symbol-clone"></span
><span class="dd-symbol"></span></a
>
{:else}
<a href={undefined} class="nav-element-child"
>Energieausweis erstellen<span class="dd-symbol-clone"></span
><span class="dd-symbol"></span></a
>
{/if}
<ul class="dropdown-content energieasusweis-erstellen">
{#if innerWidth < 1023}
<li>
<a href="/energieausweis-erstellen"
>Energieausweis erstellen</a
>
</li>
{/if}
<li>
<a
href="/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/"
>Verbrauchsausweis erstellen</a
>
</li>
<li>
<a href="/energieausweis-erstellen/bedarfsausweis-wohngebaeude/"
>Bedarfsausweis erstellen</a
>
</li>
<li>
<a href="/energieausweis-erstellen/verbrauchsausweis-gewerbe/"
>Verbrauchsausweis Gewerbe erstellen</a
>
</li>
</ul>
</div>
<!-- svelte-ignore a11y-mouse-events-have-key-events -->
<div
class="nav-element dropdown lg:dropdown-right"
on:click={dropdown}
on:keydown={dropdown}
on:mouseover={hover}
on:mouseleave={hoverout}
>
{#if innerWidth > 1023}
<a href={undefined} class="nav-element-child"
>Angebot anfragen<span class="dd-symbol-clone"></span><span
class="dd-symbol"></span
></a
>
{:else}
<a href={undefined} class="nav-element-child"
>Angebot anfragen<span class="dd-symbol-clone"></span><span
class="dd-symbol"></span
></a
>
{/if}
<ul class="dropdown-content angebot-anfragen">
{#if innerWidth < 1023}
<li>
<a href="/energieausweis-erstellen">Angebot anfragen</a>
</li>
{/if}
<li>
<a
href="/angebot-anfragen/bedarfsausweis-gewerbe-anfragen"
>Bedarfsausweis Gewerbe anfragen</a
>
</li>
<li>
<a href="/angebot-anfragen/geg-nachweis-wohnen-anfragen"
>GEG Nachweis Wohnen anfragen</a
>
</li>
<li>
<a href="/angebot-anfragen/geg-nachweis-gewerbe-anfragen"
>GEG Nachweis Gewerbe anfragen</a
>
</li>
</ul>
</div>
<div class="nav-element">
<a class="no-dropdown nav-element-child" href="/sanierungsfahrplan"
>Sanierungsfahrplan (iSFP)</a
>
</div>
<div class="nav-element bg-secondary/5 py-1 pl-2 text-xs font-bold">
Produkte & Preise
</div>
<!-- svelte-ignore a11y-mouse-events-have-key-events -->
<div
class="nav-element dropdown lg:dropdown-right"
on:click={dropdown}
on:keydown={dropdown}
on:mouseover={hover}
on:mouseleave={hoverout}
>
<a href="/verbrauchsausweis/" class="nav-element-child"
>Verbrauchsausweis<span class="dd-symbol-clone"></span><span
class="dd-symbol"></span
></a
>
<ul class="dropdown-content verbrauchsausweis">
{#if innerWidth < 1023}
<li><a href="index">Verbrauchsausweis</a></li>
{/if}
<li><a href="/verbrauchsausweis/verbrauchsausweis-wohngebaeude/">Verbrauchsausweis Wohngebäude</a></li>
<li><a href="/energieausweis-erstellen/verbrauchsausweis-wohngebaeude/">Verbrauchsausweis online erstellen</a></li>
<li><a href="/verbrauchsausweis/haeufige-fragen-zum-verbrauchsausweis/">Häufige Fragen zum Verbrauchsausweis</a></li>
<li>
<a href="/verbrauchsausweis/statistiken-zum-verbrauchsausweis/">Statistiken zum Verbrauchsausweis Wohngebäude</a
>
</li>
<li><a href="/verbrauchsausweis/verbrauchsausweis-gewerbe/">Verbrauchsausweis Gewerbe</a></li>
<li>
<a href="/energieausweis-erstellen/verbrauchsausweis-gewerbe/">Verbrauchsausweis Gewerbe online erstellen</a>
</li>
<li>
<a href="/verbrauchsausweis/haeufige-fragen-zum-verbrauchsausweis-gewerbe/">Häufige Fragen zum Verbrauchsausweis Gewerbe</a>
</li>
<li>
<a href="/verbrauchsausweis/statistiken-zum-verbrauchsausweis-gewerbe/">Statistiken zum Verbrauchsausweis Gewerbe</a>
</li>
</ul>
</div>
<!-- svelte-ignore a11y-mouse-events-have-key-events -->
<div
class="nav-element dropdown lg:dropdown-right"
on:click={dropdown}
on:keydown={dropdown}
on:mouseover={hover}
on:mouseleave={hoverout}
>
<a href="/bedarfsausweis/" class="nav-element-child"
>Bedarfsausweis<span class="dd-symbol-clone"></span><span
class="dd-symbol"></span
></a
>
<ul class="dropdown-content bedarfsausweis">
{#if innerWidth < 1023}
<li><a href="/bedarfsausweis/">Bedarfsausweis</a></li>
{/if}
<li><a href="/bedarfsausweis/bedarfsausweis-wohngebaeude/">Bedarfsausweis Wohngebäude</a></li>
<li><a href="/energieausweis-erstellen/bedarfsausweis-wohngebaeude/">Bedarfsausweis online erstellen</a></li>
<li><a href="/bedarfsausweis/haeufige-fragen-zum-bedarfsausweis/">Häufige Fragen zum Bedarfsausweis</a></li>
<li>
<a href="/bedarfsausweis/statistiken-zum-bedarfsausweis/">Statistiken zum Bedarfsausweis Wohngebäude</a>
</li>
<li><a href="/bedarfsausweis/bedarfsausweis-gewerbe/">Bedarfsausweis Gewerbe</a></li>
<li><a href="/angebot-anfragen/bedarfsausweis-gewerbe-anfragen">Bedarfsausweis Gewerbe anfragen</a></li>
<li>
<a href="/bedarfsausweis/haeufige-fragen-zum-bedarfsausweis-gewerbe/">Häufige Fragen zum Bedarfsausweis Gewerbe</a>
</ul>
</div>
<div class="nav-element">
<a class="no-dropdown nav-element-child" href="/sanierungsfahrplan"
>Sanierungsfahrplan</a
>
</div>
<!-- svelte-ignore a11y-mouse-events-have-key-events -->
<div
class="nav-element dropdown lg:dropdown-right"
on:click={dropdown}
on:keydown={dropdown}
on:mouseover={hover}
on:mouseleave={hoverout}
>
<a href="/" class="nav-element-child"
>Energieausweis<span class="dd-symbol-clone"></span><span
class="dd-symbol"></span
></a
>
<ul class="dropdown-content energieausweis">
{#if innerWidth < 1023}
<li><a href="/energieausweis/">Energieausweis</a></li>
{/if}
<li><a href="/energieausweis/energieausweis-pflicht/">Energieausweis Pflicht</a></li>
<li><a href="/energieausweis/energieausweis-kosten/">Energieausweis Kosten</a></li>
<li><a href="/energieausweis/energieausweis-haus/">Energieausweis Haus</a></li>
</ul>
</div>
<!-- <div class="nav-element">
<a
class="no-dropdown nav-element-child"
href="/energieausweis-aussteller">Energieberater finden</a
>
</div> -->
<div class="nav-element bg-secondary/5 py-1 pl-2 text-xs font-bold">
FAQ & Hilfe
</div>
<!-- svelte-ignore a11y-mouse-events-have-key-events -->
<div
class="nav-element dropdown lg:dropdown-right"
on:click={dropdown}
on:keydown={dropdown}
on:mouseover={hover}
on:mouseleave={hoverout}
>
{#if innerWidth > 1023}
<a href="/bestellprozess-energieausweis" class="nav-element-child"
>Bestellprozess Energieausweis<span class="dd-symbol-clone"
></span
><span class="dd-symbol"></span></a
>
{:else}
<a href="/bestellprozess-energieausweis" class="nav-element-child"
>Bestellprozess Energieausweis<span class="dd-symbol-clone"
></span
><span class="dd-symbol"></span></a
>
{/if}
<ul class="dropdown-content bestellprozess-energieausweis">
{#if innerWidth < 1023}
<li>
<a href="/bestellprozess-energieausweis"
>Bestellprozess Energieausweis</a
>
</li>
{/if}
<li>
<a
href="/bestellprozess-energieausweis/merkblatt-verbrauchsausweis-wohnen/"
>Merkblatt Verbrauchsausweis Wohnen</a
>
</li>
<li>
<a href="/energieausweis-erstellen/bedarfsausweis-wohngebaeude/"
>Merkblatt Bedarfsausweis Wohnen</a
>
</li>
<li>
<a href="/energieausweis-erstellen/verbrauchsausweis-gewerbe/"
>Merkblatt Verbrauchsausweis Gewerbe</a
>
</li>
</ul>
</div>
<!-- svelte-ignore a11y-mouse-events-have-key-events -->
<div
class="nav-element dropdown lg:dropdown-right"
on:click={dropdown}
on:keydown={dropdown}
on:mouseover={hover}
on:mouseleave={hoverout}
>
<a href="/geg/" class="nav-element-child"
>Gebäudeenergiegesetz (GEG)<span class="dd-symbol-clone"></span><span
class="dd-symbol"></span
></a
>
<ul class="dropdown-content geg">
{#if innerWidth < 1023}
<li><a href="/geg/">Gebäudeenergiegesetz (GEG)</a></li>
{/if}
<li><a href="/geg/geg-2024-volltext/">GEG 2024 Volltext</a></li>
<li><a href="/geg/enev-zusammenfassung">EnEV Zusammenfassung-Archiv</a></li>
</ul>
</div>
<div class="nav-element">
<a class="no-dropdown nav-element-child" href="/faq/">FAQ</a>
</div>
<div class="nav-element">
<a class="no-dropdown nav-element-child" href="/glossar/">Glossar</a>
</div>
<!--<div class="nav-element">
<a class="no-dropdown nav-element-child lg:rounded-b-xl" href="/kundenbewertungen/"
>Kundenbewertungen</a
>
</div>
<div class="nav-element">
<a
class="no-dropdown nav-element-child lg:!rounded-b-lg xl:!rounded-b-xl"
href="/fuer-entwickler/">Für Entwickler</a
>
</div> -->
</nav>
<style lang="scss">
.dd-symbol::before {
content: "";
font-size: 0.95rem;
position: absolute;
top: 0px;
left: -7px;
animation-name: flim;
animation-duration: 2s;
animation-iteration-count: infinite;
}
.dd-symbol {
visibility: hidden;
}
.dd-symbol::after {
content: "";
font-size: 0.95rem;
position: absolute;
top: 0px;
right: -7px;
animation-name: flim;
animation-duration: 2s;
animation-delay: 1s;
animation-iteration-count: infinite;
}
@keyframes flim {
0% {
opacity: 0;
}
16.66% {
opacity: 0.25;
}
33.32% {
opacity: 0.5;
}
49.98% {
opacity: 0.75;
}
66.64% {
opacity: 0.5;
}
83.33% {
opacity: 0.25;
}
100% {
opacity: 0;
}
}
</style>

View File

@@ -1,25 +0,0 @@
<script lang="ts">
import { PRICES } from "#lib/constants.js";
import { Enums } from "#lib/client/prisma";
</script>
<div id ="cardBAGpromo"
class=" box card">
<div class="grid">
<h2>Bedarfssausweis Gewerbe</h2>
<hr class="mb-4">
<img class="w-[70%] justify-self-center !min-w-[100px] mb-[1rem]" src="/images/right-sidebar/UMBE_gewerbegebaeude.svg" alt="Gewerbe Bedarfsausweis"/>
<p class="promo tracking-tighter text-[2rem] text-gray-700 pl-6">ab<span class="promo pl-[0.2rem]">{PRICES.BedarfsausweisGewerbe[Enums.AusweisTyp.Standard]}</span></p>
<a href="./angebot-anfragen/bedarfsausweis-gewerbe-anfragen id="link-BA-promo"
class=" w-[90%] justify-self-center text-center text-white font-[700] bg-secondary rounded-md px-3 py-1 mt-2 no-underline text-[1rem]
hover:bg-primary
" >jetzt Bedarfssausweis anfragen</a>
</div>
</div>
<style lang="scss">
</style>

View File

@@ -1,25 +0,0 @@
<script lang="ts">
import { PRICES } from "#lib/constants.js";
import { Enums } from "#lib/client/prisma";
</script>
<div id ="cardBApromo"
class=" box card">
<div class="grid">
<h2>Bedarfssausweis Wohngebäude</h2>
<hr class="mb-4">
<img class="w-[70%] justify-self-center !min-w-[100px] mb-[1rem]" src="/images/right-sidebar/UMBE_wohngebaeude.svg" alt="Wohnhaus Bedarfsausweis"/>
<p class="promo tracking-tighter text-[2rem] text-gray-700 pl-6">ab<span class="promo pl-[0.2rem]">{PRICES.BedarfsausweisWohnen[Enums.AusweisTyp.Standard]}</span></p>
<a href="/energieausweis-erstellen/bedarfsausweis-wohngebaeude/" id="link-BA-promo"
class=" w-[90%] justify-self-center text-center text-white font-[700] bg-secondary rounded-md px-3 py-1 mt-2 no-underline text-[1rem]
hover:bg-primary
" >jetzt Bedarfssausweis erstellen</a>
</div>
</div>
<style lang="scss">
</style>

View File

@@ -1,43 +0,0 @@
<script>
import { PRICES } from "#lib/constants";
import { Enums } from "#lib/client/prisma";
</script>
<div id ="cardPriceinfo" class="box card hidden lg:block">
<h2>Was wird der Energieausweis kosten?</h2>
<div>Verbrauchsausweis Wohngebäude</div>
<div>ab&nbsp;<span class="price">{PRICES.VerbrauchsausweisWohnen[Enums.AusweisTyp.Standard]}€</span>&nbsp;inkl.&nbsp;MwSt.</div>
<hr class="trenner">
<div>Bedarfsausweis Wohngebäude</div>
<div>ab&nbsp;<span class="price">{PRICES.BedarfsausweisWohnen[Enums.AusweisTyp.Standard]}€</span>&nbsp;inkl.&nbsp;MwSt.</div>
<hr class="trenner">
<div>Verbrauchsausweis Gewerbe</div>
<div>ab&nbsp;<span class="price">{PRICES.VerbrauchsausweisGewerbe[Enums.AusweisTyp.Standard]}€</span>&nbsp;inkl.&nbsp;MwSt.</div>
<hr class="trenner">
<div>Bedarfsausweis Gewerbe</div>
<div>ab&nbsp;<span class="price">{PRICES.BedarfsausweisGewerbe[Enums.AusweisTyp.Standard]}€</span>&nbsp;inkl.&nbsp;MwSt.</div>
<hr class="trenner">
<div>GEG-Nachweis Wohngebäude</div>
<div>ab&nbsp;<span class="price">{PRICES.GEGNachweisWohnen[Enums.AusweisTyp.Standard]}€</span>&nbsp;inkl.&nbsp;MwSt.</div>
<hr class="trenner">
<div>GEG-Nachweis Gewerbe</div>
<div>ab&nbsp;<span class="price">{PRICES.GEGNachweisGewerbe[Enums.AusweisTyp.Standard]}€</span>&nbsp;inkl.&nbsp;MwSt.</div>
<hr class="mt-2">
</div>
<style lang="postcss">
.trenner{@apply my-2}
.price{@apply font-bold}
</style>

View File

@@ -1,26 +0,0 @@
<script lang="ts">
import { PRICES } from "#lib/constants.js";
import { Enums } from "#lib/client/prisma";
</script>
<div id ="cardVAGpromo"
class=" box card">
<div class="grid">
<h2>Verbrauchsausweis Gewerbe</h2>
<hr class="mb-4">
<img class="w-[70%] justify-self-center !min-w-[100px]" src="/images/right-sidebar/UMBE_gewerbegebaeude.svg" alt="Gewerbe Verbrauchsausweis"/>
<p class="promo tracking-tighter text-[2rem] text-gray-700 pl-6">ab<span class="promo pl-2">{PRICES.VerbrauchsausweisGewerbe[Enums.AusweisTyp.Standard]}</span></p>
<a href="./energieausweis-erstellen/verbrauchsausweis-gewerbe/" id="link-VA-promo"
class=" w-[90%] justify-self-center text-center text-white font-[700] bg-gradient-to-br from-secondary to-secondary-grad rounded-md px-3 py-1 mt-2 no-underline text-[1rem]
hover:bg-primary
" >Verbrauchsausweis sofort&nbsp;erstellen</a>
</div>
</div>
<style lang="scss">
</style>

View File

@@ -1,34 +0,0 @@
<script lang="ts">
import { PRICES } from "#lib/constants.js";
import { Enums } from "#lib/client/prisma";
</script>
<div id="card-VA-promo" class="box card">
<div class="grid">
<h2>Verbrauchsausweis Wohngebäude</h2>
<hr class="mb-4" />
<img
class="w-[70%] justify-self-center !min-w-[100px] mb-[1rem]"
src="/images/right-sidebar/UMBE_wohngebaeude.svg"
alt="Wohnhaus Verbrauchsausweis"
/>
<p class="promo tracking-tighter text-[2rem] text-gray-700 pl-6">
ab<span class="promo pl-2">{PRICES.VerbrauchsausweisWohnen[Enums.AusweisTyp.Standard]}</span
>
</p>
<a
href="./energieausweis-erstellen/verbrauchsausweis-wohngebaeude/"
id="link-VA-promo"
class=" w-[90%] justify-self-center text-center text-white font-[700] bg-secondary rounded-md px-3 py-1 mt-2 no-underline text-[1rem]
hover:bg-primary
">jetzt Verbrauchsausweis erstellen</a
>
</div>
</div>
<style lang="scss">
</style>

View File

@@ -26,7 +26,7 @@ describe("Verbrauchsausweis für Wohngebäude bearbeiten", async () => {
}).then((ausweis: VerbrauchsausweisWohnen & { benutzer: Benutzer, aufnahme: Aufnahme & { objekt: Objekt }, rechnung: Rechnung | null }) => {
cy.login("user@ib-cornelsen.de", "passwort");
cy.visit(`/energieausweis-erstellen/verbrauchsausweis-wohngebaeude?id=${ausweis.id}`);
cy.visit(`/energieausweis-erstellen/verbrauchsausweis-wohngebaeude?ausweis_id=${ausweis.id}`);
cy.wait(2000);

View File

@@ -38,19 +38,19 @@ export const BedarfsausweisWohnenSchema = z.object({
volumen: z.number().nullish(),
dicht: z.boolean().nullish(),
fenster_flaeche_1: z.number().nullish(),
fenster_art_1: z.number().nullish(),
fenster_art_1: z.string().nullish(),
fenster_flaeche_2: z.number().nullish(),
fenster_art_2: z.number().nullish(),
fenster_art_2: z.string().nullish(),
dachfenster_flaeche: z.number().nullish(),
dachfenster_art: z.number().nullish(),
dachfenster_art: z.string().nullish(),
haustuer_flaeche: z.number().nullish(),
haustuer_art: z.number().nullish(),
haustuer_art: z.string().nullish(),
dach_bauart: z.string().nullish(),
decke_bauart: z.string().nullish(),
dach_daemmung: z.number().nullish(),
decke_daemmung: z.number().nullish(),
aussenwand_daemmung: z.number().nullish(),
boden_daemmung: z.number().nullish(),
dach_daemmung: z.string().nullish(),
decke_daemmung: z.string().nullish(),
aussenwand_daemmung: z.string().nullish(),
boden_daemmung: z.string().nullish(),
aussenwand_bauart: z.string().nullish(),
boden_bauart: z.string().nullish(),
warmwasser_verteilung: z.string().nullish(),

View File

@@ -18,19 +18,19 @@ const { title } = Astro.props;
---
<script>
import { H } from "highlight.run";
// import { H } from "highlight.run";
if (import.meta.env.PROD) {
H.init("1jdkoe52", {
serviceName: "online-energieausweis",
backendUrl: "https://highlight-backend.online-energieausweis.org/public",
tracingOrigins: true,
networkRecording: {
enabled: true,
recordHeadersAndBody: true
}
});
}
// if (import.meta.env.PROD) {
// H.init("1jdkoe52", {
// serviceName: "online-energieausweis",
// backendUrl: "https://highlight-backend.online-energieausweis.org/public",
// tracingOrigins: true,
// networkRecording: {
// enabled: true,
// recordHeadersAndBody: true
// }
// });
// }
window.addEventListener("scroll", () => {
const skala = document.getElementById("skala");
@@ -102,6 +102,13 @@ const { title } = Astro.props;
<html lang="de">
<head>
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-59QKHH8');</script>
<!-- End Google Tag Manager -->
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width" />
<link rel="icon" type="image/svg+xml" href="/favicon.jpg" />
@@ -147,6 +154,11 @@ const { title } = Astro.props;
</head>
<body>
<!-- Google Tag Manager (noscript) -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-59QKHH8"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->
<Header {user} />
<main

View File

@@ -1,156 +0,0 @@
---
import "../style/global.css";
import "../style/formular.css";
import "../../svelte-dialogs.config"
import Header from "#components/design/header/AusweisHeaderImmowelt.astro";
import Footer from "#components/design/footer/Footer.astro";
import { NotificationWrapper } from "@ibcornelsen/ui";
export interface Props {
title: string;
}
const { title } = Astro.props;
---
<script>
window.addEventListener("scroll", (event) => {
let scroll = window.scrollY;
console.log(scroll);
if(scroll>=400){
document.getElementById('skala')?.classList.add('2xl:fixed','2xl:py-4','2xl:top-0','2xl:z-20');
document.getElementById('skala')?.classList.remove('w-full');
document.getElementById('skala').style.borderBottom = "3px solid #e6e6e6";
document.getElementById('performance-box').style.maxWidth = "688.5px";
document.getElementById('progress-box').style.maxWidth = "688.5px";
document.getElementById('formInput-1')?.classList.add('2xl:mt-[370px]');
}else{
document.getElementById('skala')?.classList.remove('2xl:fixed','2xl:py-4','2xl:top-0','2xl:z-20');
document.getElementById('skala')?.classList.add('w-full');
document.getElementById('skala').style.borderBottom = "none";
document.getElementById('formInput-1')?.classList.remove('2xl:mt-[370px]');
}
});
</script>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width" />
<link rel="icon" type="image/svg+xml" href="/favicon.jpg" />
<meta
name="description"
content="✅ Jetzt Ihren Energieausweis online erstellen. Erhalten Sie Ihren online Energieausweis rechtssicher und nach aktueller GEG (vormals EnEV) vom Diplom Ingenieur geprüft."
/>
<link rel="canonical" href="https://online-energieausweis.org/" />
<meta property="og:locale" content="de_DE" />
<meta property="og:type" content="website" />
<meta
property="og:title"
content="Energieausweis online erstellen - Online Energieausweis"
/>
<meta
property="og:description"
content="✅ Jetzt Ihren Energieausweis online erstellen. Erhalten Sie Ihren online Energieausweis rechtssicher und nach aktueller GEG (vormals EnEV) vom Diplom Ingenieur geprüft."
/>
<meta property="og:url" content="https://online-energieausweis.org/" />
<meta property="og:site_name" content="Energieausweis online erstellen" />
<meta name="twitter:card" content="summary_large_image" />
<meta
name="twitter:description"
content="✅ Jetzt Ihren Energieausweis online erstellen. Erhalten Sie Ihren online Energieausweis rechtssicher und nach aktueller GEG (vormals EnEV) vom Diplom Ingenieur geprüft."
/>
<meta
name="twitter:title"
content="Energieausweis online erstellen - Online Energieausweis"
/>
<meta
name="twitter:image"
content="https://online-energieausweis.org/images/energieausweis-online-erstellen.jpg"
/>
<title>
{title || 'Energieausweis online erstellen - Online Energieausweis'}
</title>
</head>
<body>
<Header />
<main
class="w-full p-0 grid
xs:grid-cols-[minmax(1fr)] xs:gap-1 xs:p-0
sm:grid-cols-[minmax(1fr)] sm:gap-1 sm:p-0
md:grid-cols-[minmax(1fr)] md:gap-2 md:p-0
lg:grid-cols-[minmax(1fr)] lg:gap-3 lg:p-4
xl:grid-cols-[minmax(1fr)] xl:gap-4 xl:p-6
2xl:grid-cols-[minmax(1fr)] 2xl:gap-5 2xl:p-6
">
<article class="box rounded-tl-none p-2 lg:p-12">
<slot />
</article>
</main>
<Footer />
<NotificationWrapper client:load />
</body>
</html>
<style is:global lang="postcss">
body {
min-height: 100vh;
width:100%;
}
article {
p, h1, h2, h3, h4, h5, h6 {
@apply text-base-content;
}
}
.headline {
@apply text-lg;
}
.radio-inline {
@apply flex flex-row gap-2;
}
.checkbox-inline {
@apply flex flex-row gap-2;
}
</style>

View File

@@ -1,156 +0,0 @@
---
import "../style/global.css";
import "../style/formular.css";
import "../../svelte-dialogs.config"
import Header from "#components/design/header/AusweisHeaderImmowelt2.astro";
import Footer from "#components/design/footer/Footer.astro";
import { NotificationWrapper } from "@ibcornelsen/ui";
export interface Props {
title: string;
}
const { title } = Astro.props;
---
<script>
window.addEventListener("scroll", (event) => {
let scroll = window.scrollY;
console.log(scroll);
if(scroll>=400){
document.getElementById('skala')?.classList.add('2xl:fixed','2xl:py-4','2xl:top-0','2xl:z-20');
document.getElementById('skala')?.classList.remove('w-full');
document.getElementById('skala').style.borderBottom = "3px solid #e6e6e6";
document.getElementById('performance-box').style.maxWidth = "688.5px";
document.getElementById('progress-box').style.maxWidth = "688.5px";
document.getElementById('formInput-1')?.classList.add('2xl:mt-[370px]');
}else{
document.getElementById('skala')?.classList.remove('2xl:fixed','2xl:py-4','2xl:top-0','2xl:z-20');
document.getElementById('skala')?.classList.add('w-full');
document.getElementById('skala').style.borderBottom = "none";
document.getElementById('formInput-1')?.classList.remove('2xl:mt-[370px]');
}
});
</script>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width" />
<link rel="icon" type="image/svg+xml" href="/favicon.jpg" />
<meta
name="description"
content="✅ Jetzt Ihren Energieausweis online erstellen. Erhalten Sie Ihren online Energieausweis rechtssicher und nach aktueller GEG (vormals EnEV) vom Diplom Ingenieur geprüft."
/>
<link rel="canonical" href="https://online-energieausweis.org/" />
<meta property="og:locale" content="de_DE" />
<meta property="og:type" content="website" />
<meta
property="og:title"
content="Energieausweis online erstellen - Online Energieausweis"
/>
<meta
property="og:description"
content="✅ Jetzt Ihren Energieausweis online erstellen. Erhalten Sie Ihren online Energieausweis rechtssicher und nach aktueller GEG (vormals EnEV) vom Diplom Ingenieur geprüft."
/>
<meta property="og:url" content="https://online-energieausweis.org/" />
<meta property="og:site_name" content="Energieausweis online erstellen" />
<meta name="twitter:card" content="summary_large_image" />
<meta
name="twitter:description"
content="✅ Jetzt Ihren Energieausweis online erstellen. Erhalten Sie Ihren online Energieausweis rechtssicher und nach aktueller GEG (vormals EnEV) vom Diplom Ingenieur geprüft."
/>
<meta
name="twitter:title"
content="Energieausweis online erstellen - Online Energieausweis"
/>
<meta
name="twitter:image"
content="https://online-energieausweis.org/images/energieausweis-online-erstellen.jpg"
/>
<title>
{title || 'Energieausweis online erstellen - Online Energieausweis'}
</title>
</head>
<body>
<Header />
<main
class="w-full p-0 grid
xs:grid-cols-[minmax(1fr)] xs:gap-1 xs:p-0
sm:grid-cols-[minmax(1fr)] sm:gap-1 sm:p-0
md:grid-cols-[minmax(1fr)] md:gap-2 md:p-0
lg:grid-cols-[minmax(1fr)] lg:gap-3 lg:p-4
xl:grid-cols-[minmax(1fr)] xl:gap-4 xl:p-6
2xl:grid-cols-[minmax(1fr)] 2xl:gap-5 2xl:p-6
">
<article class="box rounded-tl-none p-2 lg:p-12">
<slot />
</article>
</main>
<Footer />
<NotificationWrapper client:load />
</body>
</html>
<style is:global lang="postcss">
body {
min-height: 100vh;
width:100%;
}
article {
p, h1, h2, h3, h4, h5, h6 {
@apply text-base-content;
}
}
.headline {
@apply text-lg;
}
.radio-inline {
@apply flex flex-row gap-2;
}
.checkbox-inline {
@apply flex flex-row gap-2;
}
</style>

View File

@@ -2,31 +2,16 @@
import "../style/global.css";
import "../style/formular.css";
import "../../svelte-dialogs.config"
import Header from "#components/design/header/AusweisHeader_partner.astro";
import AusweisHeaderPartner from "#components/design/header/AusweisHeaderPartner.astro";
import Footer from "#components/design/footer/Footer.astro";
import SidebarLeft from "#components/design/sidebars/SidebarLeft.astro";
import { NotificationWrapper } from "@ibcornelsen/ui";
export interface Props {
title: string;
tabHover1: string;
tabHover2: string;
tabHover3: string;
tabHover4: string;
tabHover5: string;
tabHover6: string;
tabHover7: string;
tab: number;
}
const { title } = Astro.props;
const { tabHover1 } = Astro.props;
const { tabHover2 } = Astro.props;
const { tabHover3 } = Astro.props;
const { tabHover4 } = Astro.props;
const { tabHover5 } = Astro.props;
const { tabHover6 } = Astro.props;
const { tabHover7 } = Astro.props;
const { title, tab } = Astro.props;
---
<script>
@@ -100,6 +85,14 @@ window.addEventListener("scroll", () => {
<!DOCTYPE html>
<html lang="de">
<head>
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-59QKHH8');</script>
<!-- End Google Tag Manager -->
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width" />
<link rel="icon" type="image/svg+xml" href="/favicon.jpg" />
@@ -142,8 +135,12 @@ window.addEventListener("scroll", () => {
</head>
<body>
<Header {tabHover1} {tabHover2} {tabHover3} {tabHover4} {tabHover5} {tabHover6} {tabHover7}/>
<!-- Google Tag Manager (noscript) -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-59QKHH8"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->
<AusweisHeaderPartner {tab}/>
<main class="w-full p-0 grid grid-cols-1 rounded-none">
@@ -151,7 +148,6 @@ window.addEventListener("scroll", () => {
<article class="p-0 lg:px-20 lg:py-12">
<slot />
<div style="height: 450px;"></div>
</article>
</main>

View File

@@ -18,25 +18,33 @@ const { title } = Astro.props;
---
<script>
import { H } from "highlight.run";
// import { H } from "highlight.run";
if (import.meta.env.PROD) {
H.init("1jdkoe52", {
serviceName: "online-energieausweis",
backendUrl: "https://highlight-backend.online-energieausweis.org/public",
tracingOrigins: true,
networkRecording: {
enabled: true,
recordHeadersAndBody: true
}
})
}
// if (import.meta.env.PROD) {
// H.init("1jdkoe52", {
// serviceName: "online-energieausweis",
// backendUrl: "https://highlight-backend.online-energieausweis.org/public",
// tracingOrigins: true,
// networkRecording: {
// enabled: true,
// recordHeadersAndBody: true
// }
// })
// }
</script>
<!DOCTYPE html>
<html lang="de">
<head>
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-59QKHH8');</script>
<!-- End Google Tag Manager -->
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width" />
<link rel="icon" type="image/svg+xml" href="/favicon.jpg" />
@@ -79,6 +87,10 @@ const { title } = Astro.props;
</head>
<body>
<!-- Google Tag Manager (noscript) -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-59QKHH8"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->
<Header {user} />

View File

@@ -35,19 +35,19 @@ const schema = JSON.stringify({
---
<script>
import { H } from "highlight.run";
// import { H } from "highlight.run";
if (import.meta.env.PROD) {
H.init("1jdkoe52", {
serviceName: "online-energieausweis",
backendUrl: "https://highlight-backend.online-energieausweis.org/public",
tracingOrigins: true,
networkRecording: {
enabled: true,
recordHeadersAndBody: true
}
})
}
// if (import.meta.env.PROD) {
// H.init("1jdkoe52", {
// serviceName: "online-energieausweis",
// backendUrl: "https://highlight-backend.online-energieausweis.org/public",
// tracingOrigins: true,
// networkRecording: {
// enabled: true,
// recordHeadersAndBody: true
// }
// })
// }
</script>
<!DOCTYPE html>

View File

@@ -1,16 +1,17 @@
---
// import "svelte-ripple-action/ripple.css";
// import "svelte-ripple-action/ripple.css";
import "../style/global.css";
import "../../svelte-dialogs.config.js";
import DashboardSidebar from "../components/Dashboard/DashboardSidebar.svelte";
import { BenutzerClient } from "#components/Ausweis/types";
import { Benutzer } from "#lib/server/prisma";
export interface Props {
title: string;
user: BenutzerClient;
user: Benutzer;
besteller: Benutzer | null;
}
const { title, user } = Astro.props;
const { title, user, besteller } = Astro.props;
if (!user) {
Astro.redirect("/auth/login", 302);
@@ -44,21 +45,29 @@ const schema = JSON.stringify({
let lightTheme = Astro.cookies.get("theme")?.value === "light";
---
<script>
import { H } from "highlight.run";
<script >
// import { H } from "highlight.run";
if (import.meta.env.PROD) {
H.init("1jdkoe52", {
serviceName: "online-energieausweis",
backendUrl:
"https://highlight-backend.online-energieausweis.org/public",
tracingOrigins: true,
networkRecording: {
enabled: true,
recordHeadersAndBody: true,
},
});
}
// const user = JSON.parse(document.body.dataset.user);
// if (import.meta.env.PROD) {
// H.init("1jdkoe52", {
// serviceName: "online-energieausweis",
// backendUrl:
// "https://highlight-backend.online-energieausweis.org/public",
// tracingOrigins: true,
// networkRecording: {
// enabled: true,
// recordHeadersAndBody: true,
// }
// });
// if (user) {
// H.identify(user.email, {
// id: user.id
// })
// }
// }
</script>
<html lang="de">
@@ -108,7 +117,7 @@ let lightTheme = Astro.cookies.get("theme")?.value === "light";
</title>
</head>
<body>
<body data-user={JSON.stringify({ id: user.id, email: user.email })}>
<main
class="p-0 grid max-w-[1920px]
xs:grid-cols-[minmax(1fr,1fr)] xs:gap-1 xs:p-0
@@ -121,10 +130,11 @@ let lightTheme = Astro.cookies.get("theme")?.value === "light";
<DashboardSidebar
lightTheme={lightTheme}
benutzer={user}
besteller={besteller}
client:load
/>
<article class="box px-6 py-5 h-screen">
<article class="box px-6 py-5 h-full">
<slot />
</article>
</main>

View File

@@ -19,19 +19,19 @@ const { title } = Astro.props;
---
<script>
import { H } from "highlight.run";
// import { H } from "highlight.run";
if (import.meta.env.PROD) {
H.init("1jdkoe52", {
serviceName: "online-energieausweis",
backendUrl: "https://highlight-backend.online-energieausweis.org/public",
tracingOrigins: true,
networkRecording: {
enabled: true,
recordHeadersAndBody: true
}
})
}
// if (import.meta.env.PROD) {
// H.init("1jdkoe52", {
// serviceName: "online-energieausweis",
// backendUrl: "https://highlight-backend.online-energieausweis.org/public",
// tracingOrigins: true,
// networkRecording: {
// enabled: true,
// recordHeadersAndBody: true
// }
// })
// }
/*
window.addEventListener("scroll", (event) => {
@@ -98,6 +98,15 @@ window.addEventListener("scroll", (event) => {
<!DOCTYPE html>
<html lang="de">
<head>
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-59QKHH8');</script>
<!-- End Google Tag Manager -->
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width" />
<link rel="icon" type="image/svg+xml" href="/favicon.jpg" />
@@ -111,6 +120,10 @@ window.addEventListener("scroll", (event) => {
</head>
<body>
<!-- Google Tag Manager (noscript) -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-59QKHH8"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->
<Header {user} />

View File

@@ -1,42 +0,0 @@
import { VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
import { z } from "zod";
import { verbrauchsausweisWohnenPDFValidator } from "./validators/verbrauchsausweis-wohnen-pdf-validator";
export function convertAusweisData(
inputs: Partial<VerbrauchsausweisWohnenClient>
): Record<string, string> {
// Wir wollen alle Werte zu einem Flachen Objekt umwandeln, sodass wir dass später benutzen können.
// Dazu kommen noch einige wichtige Eigenschaften die man im PDF brauchen könnte.
let pdfInputs: z.infer<typeof verbrauchsausweisWohnenPDFValidator> = {
...inputs,
pdf: {
"brennstoff": [inputs.aufnahme?.brennstoff_1, inputs.aufnahme?.brennstoff_2].filter(x => x).join(", ")
}
}
let result = recursiveFlatten(inputs, "");
// Außerdem müssen wir alle Werte zu strings umwandeln.
for (const key in result) {
result[key] = String(result[key]);
}
return result;
}
function recursiveFlatten(obj: any, parentKey = ""): Record<string, string> {
const result: Record<string, string> = {};
for (const key in obj) {
const value = obj[key];
const newKey = parentKey ? `${parentKey}.${key}` : key;
if (typeof value === "object") {
Object.assign(result, recursiveFlatten(value, newKey));
} else {
result[newKey] = value;
}
}
return result;
}

View File

@@ -85,13 +85,13 @@ export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis:
let energieVerbrauchWarmwasser_1 = 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
energieVerbrauchWarmwasser_1 = energieVerbrauchGesamt_1 * ((ausweis.anteil_warmwasser_1 || 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") {
energieVerbrauchWarmwasser_1 = energieVerbrauchGesamt_1 * 0.5;
energieVerbrauchWarmwasser_2 = energieVerbrauchGesamt_2 * ((ausweis.anteil_warmwasser_2 || 0) / 100);
@@ -107,8 +107,14 @@ export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis:
energieVerbrauchWarmwasser_2 = 0;
}
let kuehlungsZuschlag_1: number = 0, kuehlungsZuschlag_2: number = 0;
if (aufnahme.kuehlung) {
let kuehlungsZuschlag_1: number = 0, kuehlungsZuschlag_2: number = 0; let kuehlungsZuschlag = 0;
if (aufnahme.kuehlung === "1" && aufnahme.kuehlung !== null && (ausweis.stromverbrauch_enthaelt_kuehlung === false || ausweis.stromverbrauch_enthaelt_kuehlung === null)) {
kuehlungsZuschlag = 6 * nutzflaeche * 3;
}
if (ausweis.kuehlung_enthalten && ausweis.kuehlung_enthalten !== null)
{
kuehlungsZuschlag_1 = energieVerbrauchGesamt_1 * ((ausweis.anteil_kuehlung_1 || 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 leerstandsZuschlagStrom = leerstand * energieVerbrauchStrom;
let endEnergieVerbrauchStrom = (energieVerbrauchStrom + leerstandsZuschlagStrom) / (3 * nutzflaeche);
let endEnergieVerbrauchStrom = (energieVerbrauchStrom + leerstandsZuschlagStrom + (kuehlungsZuschlag || 0)) / (3 * nutzflaeche);
let primaerEnergieVerbrauchStrom = endEnergieVerbrauchStrom * 1.8;
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_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 co2EmissionenGesamt = co2Emissionen_1 + co2Emissionen_2 + co2EmissionenLeerstandsZuschlag + co2EmissionenStrom;
@@ -180,6 +186,7 @@ export async function endEnergieVerbrauchVerbrauchsausweisGewerbe_2016(ausweis:
brennstoff_2,
kuehlungsZuschlag_1 : Math.round(kuehlungsZuschlag_1),
kuehlungsZuschlag_2: Math.round(kuehlungsZuschlag_2),
kuehlungsZuschlag: Math.round(kuehlungsZuschlag),
durchschnittsKlimafaktor : Math.round(durchschnittsKlimafaktor * 100) / 100,
Klimafaktor_1 : klimafaktoren[0],
Klimafaktor_2 : klimafaktoren[1],

View File

@@ -60,7 +60,7 @@ export async function endEnergieVerbrauchVerbrauchsausweis_2016(
// Leerstand wird in Prozent angegeben, muss hier aber in eine Zahl zwischen 0 und 1 umgerechnet werden.
let leerstand = (aufnahme.leerstand || 0) / 100;
if (ausweis.warmwasser_enthalten && ausweis.warmwasser_anteil_bekannt) {
if (ausweis.warmwasser_enthalten && ausweis.warmwasser_anteil_bekannt && ausweis.anteil_warmwasser_1 !== 0) {
if (aufnahme.solarsystem_warmwasser) {
// Wenn Warmwasser enthalten und Anteil bekannt und Solarsystem
energieVerbrauchWarmwasser_1 =
@@ -116,7 +116,7 @@ export async function endEnergieVerbrauchVerbrauchsausweis_2016(
energieVerbrauchHeizung_2 * durchschnittsKlimafaktor;
let kuehlungsZuschlag = 0;
if (aufnahme.kuehlung) {
if (aufnahme.kuehlung === "1") {
kuehlungsZuschlag = 6 * 3 * energetischeNutzflaeche;
}

View File

@@ -112,4 +112,13 @@ export const SERVICES: Record<
};
export const BASE_URI = process.env.NODE_ENV == "production" ? "https://online-energieausweis.org" : "http://localhost:3000";
export const LEX_OFFICE_API_KEY = process.env.NODE_ENV == "production" ? "iwQLCU_ZAq6bVV7hmR8RO8MiC8Q" : "iwQLCU_ZAq6bVV7hmR8RO8MiC8Q"
export const LEX_OFFICE_API_KEY = process.env.NODE_ENV == "production" ? "iwQLCU_ZAq6bVV7hmR8RO8MiC8Q" : "iwQLCU_ZAq6bVV7hmR8RO8MiC8Q"
export enum AusstellungsTyp {
// Objekt wird behalten, Aufnahme und Ausweis werden neu angelegt.
Neuausstellung = "Neuausstellung",
// Alles wird behalten, Ausweis, Aufnahme und Objekt werden gespeichert, dafür müssen alle drei bereits existieren.
Speichern = "Speichern",
// Objekt und Aufnahme werden behalten, Ausweis wird neu angelegt.
Alternativdokument = "Alternativdokument",
}

View File

@@ -6,7 +6,7 @@ import * as crypto from "crypto";
* @param prefix Ein Optionales Präfix, welches vor die ID geschrieben wird, damit diese identifizierbar bleibt.
* @returns Die generierte ID
*/
export function generatePrefixedId(length: number, prefix: string = ""): string {
export function generateIDWithPrefix(length: number, prefix: string = ""): string {
// Generating entropy is faster than complex math operations, so we use the simplest way
const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789"
const characterCount = characters.length;

View File

@@ -1,9 +1,9 @@
import { UUidWithPrefix } from "#components/Ausweis/types.js";
import { IDWithPrefix } from "#components/Ausweis/types.js";
import { Enums } from "#lib/client/prisma";
import { z } from "zod";
export const filterAusweise = z.object({
uid: UUidWithPrefix.optional(),
uid: IDWithPrefix.optional(),
ausgestellt: z.boolean().optional(),
ausstellgrund: z.nativeEnum(Enums.Ausstellgrund).optional(),
bestellt: z.boolean().optional(),

View File

@@ -0,0 +1,834 @@
import { AufnahmeClient, BenutzerClient, BildClient, ObjektClient, VerbrauchsausweisGewerbeClient } from "#components/Ausweis/types.js";
import { getEmpfehlungen } from "#lib/XML/getEmpfehlungen.js";
import { Enums } from "#lib/server/prisma.js";
import * as fs from "fs"
import moment from "moment";
import { PDFDocument, PDFFont, PDFImage, PDFPage, StandardFonts } from "pdf-lib";
import { addText } from "./utils/text.js";
import { addAnsichtsausweisLabel, addDatumGEG, addRegistriernummer } from "./utils/helpers.js";
import { getS3File } from "#lib/s3.js";
import { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Server } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Server.js";
export async function pdfAushangVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewerbeClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: BildClient[], user: BenutzerClient, vorschau = true) {
const VerbrauchsausweisWohnenGEG2024PDF = fs.readFileSync(new URL("../../../public/pdf/templates/GEG24_AushangNWG_Energieverbrauchsausweis.pdf", import.meta.url), "base64");
const pdf = await PDFDocument.load(VerbrauchsausweisWohnenGEG2024PDF)
const pages = pdf.getPages()
// const template = VerbrauchsausweisWohnen2016Template as Template;
const berechnungen = await endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Server(ausweis, aufnahme, objekt);
const empfehlungen = getEmpfehlungen(ausweis, aufnahme, objekt)
const height = pages[0].getHeight()
const font = await pdf.embedFont(StandardFonts.Helvetica)
const bold = await pdf.embedFont(StandardFonts.HelveticaBold)
const form = pdf.getForm()
form.updateFieldAppearances(font)
pages[0].drawText(`${ausweis.registriernummer || ""}`, {
x: 393,
y: height - 112.5,
size: 10
})
pages[0].drawText(aufnahme.gebaeudetyp || "", {
x: 211,
y: height - 164,
size: 10
})
pages[0].drawText(objekt.adresse || "", {
x: 211,
y: height - 186,
size: 10
})
pages[0].drawText(aufnahme.gebaeudeteil || "", {
x: 211,
y: height - 201,
size: 10
})
pages[0].drawText(aufnahme.baujahr_gebaeude?.toString() || "", {
x: 211,
y: height - 220,
size: 10
})
// pages[0].drawText(aufnahme.baujahr_heizung?.toString() || "", {
// x: 211,
// y: height - 250,
// size: 10
// })
pages[0].drawText(aufnahme.nutzflaeche?.toString() || "", {
x: 211,
y: height - 237,
size: 10
})
pages[0].drawText(`${ausweis.brennstoff_1}, ${ausweis.brennstoff_2 || ""}`, {
x: 211,
y: height - 250,
size: 10
})
const erneuerbareEnergienVerwendung = []
if (ausweis.alternative_heizung) {
erneuerbareEnergienVerwendung.push("Heizung")
}
if (ausweis.alternative_kuehlung) {
erneuerbareEnergienVerwendung.push("Kühlung")
}
if (ausweis.alternative_lueftung) {
erneuerbareEnergienVerwendung.push("Lüftung")
}
if (ausweis.alternative_warmwasser) {
erneuerbareEnergienVerwendung.push("Warmwasser")
}
pages[0].drawText(erneuerbareEnergienVerwendung.join(", "), {
x: 430,
y: height - 326,
size: 8
})
if (ausweis.warmwasser_enthalten) {
pages[0].drawText(`${ausweis.brennstoff_1}, ${ausweis.brennstoff_2 || ""}`, {
x: 211,
y: height - 265,
size: 10
})
}
if (aufnahme.lueftung === Enums.Lueftungskonzept.Fensterlueftung) {
pages[0].drawText("x", {
x: 215,
y: height - 280,
size: 10,
font: bold
})
} else if (aufnahme.lueftung === Enums.Lueftungskonzept.Schachtlueftung) {
pages[0].drawText("x", {
x: 215,
y: height - 290,
size: 10,
font: bold
})
} else if (aufnahme.lueftung === Enums.Lueftungskonzept.LueftungsanlageMitWaermerueckgewinnung) {
pages[0].drawText("x", {
x: 380,
y: height - 280,
size: 10,
font: bold
})
} else if (aufnahme.lueftung === Enums.Lueftungskonzept.LueftungsanlageOhneWaermerueckgewinnung) {
pages[0].drawText("x", {
x: 380,
y: height - 290,
size: 10,
font: bold
})
}
// // Kühlung
if (aufnahme.kuehlung === "1" && aufnahme.kuehlung !== null) {
pages[0].drawText("x", {
x: 381,
y: height - 303,
size: 10,
font: bold
})
}
if (ausweis.kuehlung_enthalten === true && ausweis.kuehlung_enthalten !== null) {
pages[0].drawText("x", {
x: 381,
y: height - 313,
size: 10,
font: bold
})
}
// if (ausweis.ausstellgrund === Enums.Ausstellgrund.Neubau) {
// pages[0].drawText("x", {
// x: 214,
// 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) {
// pages[0].drawText("x", {
// x: 345.5,
// y: height - 414,
// size: 10,
// font: bold
// })
// } else if (ausweis.ausstellgrund === Enums.Ausstellgrund.Sonstiges) {
// pages[0].drawText("x", {
// x: 464,
// y: height - 425,
// size: 10,
// font: bold
// })
// }
// Aushangpflicht
// addCheckMark(pages[0], 463, height - 406)
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: 462,
y: height - 240,
width: 108,
height: 90
})
}
}
// // Checkmark Verbrauchsausweis.
// pages[0].drawText("x", {
// x: 41,
// y: height - 558,
// size: 10,
// font: bold
// })
// // Datenerhebung durch Eigentümer
// pages[0].drawText("x", {
// x: 296.5,
// y: height - 587.5,
// size: 10,
// font: bold
// })
// Ausstellungsdatum
pages[0].drawText(moment().format("DD.MM.YYYY"), {
font,
size: 10,
x: 508,
y: height - 790
})
// Gültig bis
pages[0].drawText(moment().add(10, "years").format("DD.MM.YYYY"), {
font: bold,
size: 10,
x: 90,
y: height - 113
})
// Stempel und Unterschrift
if (ausweis.ausgestellt || !vorschau) {
const stempel = await pdf.embedPng(fs.readFileSync(new URL("../../../public/pdf/images/stempel-unterschrift.png", import.meta.url), "base64"));
const stempelHeight = 65
pages[0].drawImage(stempel, {
x: 450,
y: height - 790,
height: stempelHeight,
width: stempel.width / (stempel.height / stempelHeight)
})
}
// Aussteller
const aussteller = await pdf.embedPng(fs.readFileSync(new URL("../../../public/pdf/images/aussteller.png", import.meta.url), "base64"));
pages[0].drawImage(aussteller, {
x: 40,
y: height - 795,
width: 130,
height: 65
})
// // /* -------------------------------- Seite 2 -------------------------------- */
// // const co2Emissionen = fillFormField("co2emissionen", berechnungen?.co2EmissionenGesamt.toString(), 8, TextAlignment.Center)
const addEnergieverbrauchSkalaPfeile = async (page: PDFPage) => {
const pfeilNachUnten = await pdf.embedPng(fs.readFileSync(new URL("../../../public/images/pfeil-nach-unten.png", import.meta.url), "base64"))
const 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
const endenergieverbrauchTranslationPercentage = Math.min((berechnungen?.vergleichsWertWaerme * 2), Math.max(0, berechnungen?.endEnergieVerbrauchGesamt || 0)) / (berechnungen?.vergleichsWertWaerme * 2)
const stromVerbrauchTranslationPercentage = Math.min((berechnungen?.vergleichsWertStrom * 2), Math.max(0, berechnungen?.endEnergieVerbrauchStrom || 0)) / (berechnungen?.vergleichsWertStrom * 2)
const vergleichsWertWaermeTranslationPercentage = Math.min((berechnungen?.vergleichsWertWaerme * 2), Math.max(0, berechnungen?.vergleichsWertWaerme || 0)) / (berechnungen?.vergleichsWertWaerme * 2)
const vergleichsWertStromTranslationPercentage = Math.min((berechnungen?.vergleichsWertStrom * 2), Math.max(0, berechnungen?.vergleichsWertStrom || 0)) / (berechnungen?.vergleichsWertStrom * 2)
const minTranslation = 78
const maxTranslation = 512
const endenergieverbrauchTranslationX = minTranslation + (maxTranslation - minTranslation) * endenergieverbrauchTranslationPercentage;
const stromVerbrauchTranslationX = minTranslation + (maxTranslation - minTranslation) * stromVerbrauchTranslationPercentage;
const vergleichsWertWaermeTranslationX = minTranslation + (maxTranslation - minTranslation) * vergleichsWertWaermeTranslationPercentage;
const vergleichsWertStromTranslationX = minTranslation + (maxTranslation - minTranslation) * vergleichsWertStromTranslationPercentage;
const pfeilWidth = 20
const margin = 5;
const adjustY = -210;
const adjustY2 = -198;
page.drawImage(pfeilNachUnten, {
x: endenergieverbrauchTranslationX,
y: height - 210 + adjustY,
width: pfeilWidth,
height: 30
})
page.drawImage(pfeilNachOben, {
x: vergleichsWertWaermeTranslationX,
y: height - 293 + adjustY,
width: pfeilWidth,
height: 30
})
page.drawText("0", {
x: 85,
y: height - 241 + adjustY,
size: 13,
font: bold
})
const vergleichswertWaermeText2 = `${Math.round(berechnungen?.vergleichsWertWaerme).toString()}`
page.drawText(vergleichswertWaermeText2, {
x: 295,
y: height - 241 + adjustY,
size: 13,
font: bold
})
const maxVergleichswertWaermeText = `> ${Math.round(berechnungen?.vergleichsWertWaerme * 2).toString()}`;
page.drawText(maxVergleichswertWaermeText, {
x: vergleichsWertWaermeTranslationX * 2 - 78,
y: height - 241 + adjustY,
size: 13,
font: bold
})
page.drawText("0", {
x: 85,
y: height - 385 + adjustY2,
size: 13,
font: bold
})
const vergleichswertStromText2 = `${Math.round(berechnungen?.vergleichsWertStrom).toString()}`
page.drawText(vergleichswertStromText2, {
x: 295,
y: height - 385 + adjustY2,
size: 13,
font: bold
})
const maxVergleichswertStromText = `> ${Math.round(berechnungen?.vergleichsWertStrom * 2).toString()}`;
page.drawText(maxVergleichswertStromText, {
x: vergleichsWertStromTranslationX * 2 - 78,
y: height - 385 + adjustY2,
size: 13,
font: bold
})
const endEnergieVerbrauchGesamtText = `${Math.round(berechnungen?.endEnergieVerbrauchGesamt ?? 0).toString()}kWh/(m²a)`;
if (endenergieverbrauchTranslationPercentage > 0.5) {
page.drawText("Endenergieverbrauch Wärme", {
x: endenergieverbrauchTranslationX - margin - font.widthOfTextAtSize("Endenergieverbrauch Wärme", 10),
y: height - 191 + adjustY,
size: 10
})
page.drawText(endEnergieVerbrauchGesamtText, {
x: endenergieverbrauchTranslationX - margin - bold.widthOfTextAtSize(endEnergieVerbrauchGesamtText, 10),
y: height - 205 + adjustY,
size: 10,
font: bold
})
} else {
page.drawText("Endenergieverbrauch Wärme", {
x: endenergieverbrauchTranslationX + pfeilWidth + margin,
y: height - 191 + adjustY,
size: 10
})
page.drawText(endEnergieVerbrauchGesamtText, {
x: endenergieverbrauchTranslationX + pfeilWidth + margin,
y: height - 205 + adjustY,
size: 10,
font: bold
})
}
const vergleichswertWaermeText = `${Math.round(berechnungen?.vergleichsWertWaerme).toString()}kWh/(m²a)`
if (vergleichsWertWaermeTranslationPercentage > 0.5) {
page.drawText("Vergleichswert Wärme", {
x: vergleichsWertWaermeTranslationX - margin - font.widthOfTextAtSize("Vergleichswert Wärme", 10),
y: height - 275 + adjustY,
size: 10
})
page.drawText(vergleichswertWaermeText, {
x: vergleichsWertWaermeTranslationX - margin - bold.widthOfTextAtSize(vergleichswertWaermeText, 10),
y: height - 289 + adjustY,
size: 10,
font: bold
})
} else {
page.drawText("Vergleichswert Wärme", {
x: vergleichsWertWaermeTranslationX + pfeilWidth + margin,
y: height - 275 + adjustY,
size: 10
})
page.drawText(vergleichswertWaermeText, {
x: vergleichsWertWaermeTranslationX + pfeilWidth + margin,
y: height - 289 + adjustY,
size: 10,
font: bold
})
}
page.drawImage(pfeilNachUnten, {
x: stromVerbrauchTranslationX,
y: height - 354 + adjustY2,
width: pfeilWidth,
height: 30
})
page.drawImage(pfeilNachOben, {
x: vergleichsWertStromTranslationX,
y: height - 437 + adjustY2,
width: pfeilWidth,
height: 30
})
const stromVerbrauchGesamtText = `${Math.round(berechnungen?.endEnergieVerbrauchStrom ?? 0).toString()}kWh/(m²a)`;
if (stromVerbrauchTranslationPercentage > 0.5) {
page.drawText("Endenergieverbrauch Strom", {
x: stromVerbrauchTranslationX - margin - font.widthOfTextAtSize("Endenergieverbrauch Strom", 10),
y: height - 335 + adjustY2,
size: 10
})
page.drawText(stromVerbrauchGesamtText, {
x: stromVerbrauchTranslationX - margin - bold.widthOfTextAtSize(stromVerbrauchGesamtText, 10),
y: height - 349 + adjustY2,
size: 10,
font: bold
})
} else {
page.drawText("Endenergieverbrauch Strom", {
x: stromVerbrauchTranslationX + pfeilWidth + margin,
y: height - 335 + adjustY2,
size: 10
})
page.drawText(stromVerbrauchGesamtText, {
x: stromVerbrauchTranslationX + pfeilWidth + margin,
y: height - 349 + adjustY2,
size: 10,
font: bold
})
}
const vergleichswertStromText = `${Math.round(berechnungen?.vergleichsWertStrom).toString()}kWh/(m²a)`
if (vergleichsWertWaermeTranslationPercentage > 0.5) {
page.drawText("Vergleichswert Strom", {
x: vergleichsWertStromTranslationX - margin - font.widthOfTextAtSize("Vergleichswert Strom", 10),
y: height - 420 + adjustY2,
size: 10
})
page.drawText(vergleichswertStromText, {
x: vergleichsWertStromTranslationX - margin - bold.widthOfTextAtSize(vergleichswertStromText, 10),
y: height - 434 + adjustY2,
size: 10,
font: bold
})
} else {
page.drawText("Vergleichswert Strom", {
x: vergleichsWertStromTranslationX + pfeilWidth + margin,
y: height - 420 + adjustY2,
size: 10
})
page.drawText(vergleichswertStromText, {
x: vergleichsWertStromTranslationX + pfeilWidth + margin,
y: height - 434 + adjustY2,
size: 10,
font: bold
})
}
}
addEnergieverbrauchSkalaPfeile(pages[0])
if (ausweis.warmwasser_enthalten) {
pages[0].drawText("x", {
x: 42,
y: height - 504,
size: 10,
font: bold
})
}
if (ausweis.kuehlung_enthalten) {
pages[0].drawText("x", {
x: 42,
y: height - 516,
size: 10,
font: bold
})
}
if (ausweis.stromverbrauch_enthaelt_heizung) {
pages[0].drawText("x", {
x: 42,
y: height - 660,
size: 10,
font: bold
})
}
if (ausweis.stromverbrauch_enthaelt_warmwasser) {
pages[0].drawText("x", {
x: 132,
y: height - 660,
size: 10,
font: bold
})
}
if (ausweis.stromverbrauch_enthaelt_lueftung) {
pages[0].drawText("x", {
x: 219,
y: height - 660,
size: 10,
font: bold
})
}
if (ausweis.stromverbrauch_enthaelt_beleuchtung) {
pages[0].drawText("x", {
x: 282,
y: height - 660,
size: 10,
font: bold
})
}
if (ausweis.stromverbrauch_enthaelt_kuehlung) {
pages[0].drawText("x", {
x: 423,
y: height - 660,
size: 10,
font: bold
})
}
if (ausweis.stromverbrauch_enthaelt_sonstige) {
pages[0].drawText("x", {
x: 493,
y: height - 660,
size: 10,
font: bold
})
}
addText(pages[0], berechnungen?.primaerEnergieVerbrauchGesamt.toString() || "", 475, height - 685, 10, font)
addText(pages[0], berechnungen?.co2EmissionenGesamt.toString() || "", 475, height - 705, 10, font)
// // const primaerenergiebedarfIst = fillFormField("primaerenergiebedarf_ist", berechnungen?.primaerEnergieVerbrauchGesamt.toString())
/* -------------------------------- Seite 3 -------------------------------- */
// Verbräuche
// const addVerbrauchGenerator = () => {
// let i = 0;
// let yOffset = 14.6;
// const initialHeight = 297
// const initialXOffset = 36;
// return (zeitraum_von?: string, zeitraum_bis?: string, energietraeger?: string, primaerfaktor?: string, energieverbrauch?: string, anteil_warmwasser?: string, anteil_kaelte?: number, anteil_heizung?: string, klimafaktor?: string, strom?: number) => {
// pages[2].drawText(zeitraum_von || "", {
// x: initialXOffset,
// y: initialHeight - (i * yOffset),
// size: 8,
// font
// })
// pages[2].drawText(zeitraum_bis || "", {
// x: initialXOffset + 47,
// y: initialHeight - (i * yOffset),
// size: 8,
// font
// })
// pages[2].drawText(energietraeger || "", {
// x: initialXOffset + 94,
// y: initialHeight - (i * yOffset),
// size: 8,
// font
// })
// pages[2].drawText(primaerfaktor || "", {
// x: initialXOffset + 232,
// y: initialHeight - (i * yOffset),
// size: 8,
// font
// })
// pages[2].drawText(energieverbrauch || "", {
// x: initialXOffset + 275,
// y: initialHeight - (i * yOffset),
// size: 8,
// font
// })
// pages[2].drawText(anteil_warmwasser || "", {
// x: initialXOffset + 325,
// y: initialHeight - (i * yOffset),
// size: 8,
// font
// })
// pages[2].drawText(anteil_kaelte?.toString() || "", {
// x: initialXOffset + 378,
// y: initialHeight - (i * yOffset),
// size: 8,
// font
// })
// pages[0].drawText(anteil_heizung || "", {
// x: initialXOffset + 430,
// y: initialHeight - (i * yOffset),
// size: 8,
// font
// })
// pages[2].drawText(klimafaktor || "", {
// x: initialXOffset + 464,
// y: initialHeight - (i * yOffset),
// size: 8,
// font
// })
// pages[2].drawText(strom?.toString() || "", {
// x: initialXOffset + 504,
// y: initialHeight - (i * yOffset),
// size: 8,
// font
// })
// i++;
// }
// }
// const addVerbrauch = addVerbrauchGenerator();
// // Primäre Heizquelle
// 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(),
// Math.round(berechnungen?.energieVerbrauchWarmwasser_1 || 0).toString(),
// berechnungen?.kuehlungsZuschlag_1,
// Math.round(berechnungen?.energieVerbrauchHeizung_1 || 0).toString(),
// berechnungen?.durchschnittsKlimafaktor.toString(),
// berechnungen?.energieVerbrauchStrom
// );
// if (ausweis.zusaetzliche_heizquelle) {
// addVerbrauch(
// moment(ausweis.startdatum).format("MM.YYYY"),
// moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
// ausweis.brennstoff_2 || "",
// berechnungen?.brennstoff_2.primaerenergiefaktor.toString(),
// Math.round(berechnungen?.energieVerbrauchGesamt_2 || 0).toString(),
// Math.round(berechnungen?.energieVerbrauchWarmwasser_2 || 0).toString(),
// berechnungen?.kuehlungsZuschlag_2,
// Math.round(berechnungen?.energieVerbrauchHeizung_2 || 0).toString(),
// berechnungen?.durchschnittsKlimafaktor.toString(),
// 0
// );
// }
// if (aufnahme.leerstand && aufnahme.leerstand > 0) {
// /**
// * Leerstandszuschlag
// * @link https://www.bundesanzeiger.de/pub/publication/MRYM4nI84Sdlr0EIvvW?2
// */
// if (ausweis.warmwasser_enthalten && ausweis.warmwasser_anteil_bekannt) {
// addVerbrauch(
// moment(ausweis.startdatum).format("MM.YYYY"),
// moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
// "Leerstandszuschlag",
// berechnungen?.brennstoff_1.primaerenergiefaktor.toString(),
// Math.round((berechnungen?.leerstandsZuschlagHeizung || 0) + (berechnungen?.leerstandsZuschlagWarmwasser || 0) + (berechnungen?.leerstandsZuschlagKuehlung || 0)).toString(),
// Math.round((berechnungen?.leerstandsZuschlagWarmwasser || 0)).toString(),
// Math.round((berechnungen?.leerstandsZuschlagKuehlung || 0)),
// Math.round((berechnungen?.leerstandsZuschlagHeizung || 0)).toString(),
// berechnungen?.durchschnittsKlimafaktor.toString(),
// Math.round((berechnungen?.leerstandsZuschlagStrom || 0))
// );
// } else {
// addVerbrauch(
// moment(ausweis.startdatum).format("MM.YYYY"),
// moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
// "Leerstandszuschlag",
// berechnungen?.brennstoff_1.primaerenergiefaktor.toString(),
// Math.round((berechnungen?.leerstandsZuschlagHeizung || 0) + (berechnungen?.leerstandsZuschlagWarmwasser || 0) + (berechnungen?.leerstandsZuschlagKuehlung || 0)).toString(),
// Math.round((berechnungen?.leerstandsZuschlagWarmwasser || 0)).toString(),
// Math.round((berechnungen?.leerstandsZuschlagKuehlung || 0)),
// Math.round((berechnungen?.leerstandsZuschlagHeizung || 0)).toString(),
// berechnungen?.durchschnittsKlimafaktor.toString(),
// Math.round((berechnungen?.leerstandsZuschlagStrom || 0))
// );
// }
// }
// if (aufnahme.kuehlung === "1" && (ausweis.stromverbrauch_enthaelt_kuehlung === false || ausweis.stromverbrauch_enthaelt_kuehlung === null)) {
// /**
// * Kühlungszuschlag - Pauschale Erhöhung um 6kWh/m²
// * Primärenergiefaktor Strom
// * @link https://www.bundesanzeiger.de/pub/publication/MRYM4nI84Sdlr0EIvvW?2
// */
// addVerbrauch(
// moment(ausweis.startdatum).format("MM.YYYY"),
// moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
// "Kühlungszuschlag",
// "1.8",
// "",
// "",
// 0,
// "",
// "",
// Math.round(berechnungen?.kuehlungsZuschlag || 0)
// );
// }
/* -------------------------------- Seite 4 -------------------------------- */
// const splitToSize = (text: string, size: number, font: PDFFont, fontSize: number) => {
// const lines = []
// let currentLine = ""
// for (const char of text) {
// if (font.widthOfTextAtSize(currentLine + char, fontSize) <= size) {
// currentLine += char;
// } else {
// lines.push(currentLine)
// currentLine = char;
// }
// }
// lines.push(currentLine)
// return lines.join("\n")
// }
// const addEmpfehlungenGenerator = () => {
// let i = 0;
// let yOffset = 43;
// const initialHeight = 562
// const initialXOffset = 36;
// return (bauteil?: string, beschreibung?: string, alsEinzelmassnahme?: boolean, amortisationszeit?: string, kosten?: string) => {
// pages[3].drawText((i + 1).toString(), {
// x: initialXOffset,
// y: initialHeight - (i * yOffset),
// size: 8,
// font
// })
// pages[3].drawText(splitToSize(bauteil || "", 70, font, 8), {
// x: initialXOffset + 25,
// y: initialHeight - (i * yOffset),
// size: 8,
// font,
// lineHeight: 10
// })
// pages[3].drawText(splitToSize(beschreibung || "", 230, font, 8), {
// x: initialXOffset + 98,
// y: initialHeight - (i * yOffset),
// size: 8,
// font,
// lineHeight: 10
// })
// pages[3].drawText(amortisationszeit || "", {
// x: initialXOffset + 403,
// y: initialHeight - (i * yOffset),
// size: 8,
// font
// })
// pages[3].drawText(kosten || "", {
// x: initialXOffset + 451,
// y: initialHeight - (i * yOffset),
// size: 8,
// font
// })
// i++;
// }
// }
// const addEmpfehlung = addEmpfehlungenGenerator()
// for (const empfehlung of empfehlungen) {
// 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 || "")
// }
}
// pdf.getForm().flatten()
return pdf.save();
}

View File

@@ -3,13 +3,13 @@ import * as fs from "fs"
import { PDFDocument, StandardFonts } from "pdf-lib";
import { xml2pdf } from "./elements/xml2pdf.js";
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 { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Server } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Server.js";
/* -------------------------------- 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 pdf = await PDFDocument.load(VerbrauchsausweisWohnenGEG2024PDF)
const page3 = copyPage(pdf.getPages()[0]);
@@ -32,14 +32,6 @@ export async function pdfDatenblattVerbrauchsausweisGewerbe(ausweis: Verbrauchsa
const marginX = 60;
const marginY = 150;
benutzer = benutzer || {
vorname: "Max",
name: "Mustermann",
adresse: "Musterstraße 123",
plz: "12345",
ort: "Beispielhausen"
};
const translateHeizungsstatus: Record<Heizungsstatus, string> = {
BEHEIZT: "beheizt",
NICHT_VORHANDEN: "nicht vorhanden",
@@ -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}">
<text size="12" lineHeight="14">${benutzer.vorname} ${benutzer.name}</text>
<text size="12" lineHeight="14">${benutzer.adresse}</text>
<text size="12" lineHeight="14">${benutzer.plz} ${benutzer.ort}</text>
<text size="12" lineHeight="14">${rechnung?.versand_empfaenger || ""}</text>
<text size="12" lineHeight="14">${rechnung?.versand_zusatzzeile || ""}</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}">
<text size="12" font="bold">Datenblatt Energieausweis</text>
<text size="12">Ausweis ID: ${ausweis.id}</text>

View File

@@ -1,16 +1,15 @@
import { AufnahmeClient, BenutzerClient, BildClient, ObjektClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js";
import { AufnahmeClient, BildClient, ObjektClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
import * as fs from "fs"
import { PDFDocument, StandardFonts } from "pdf-lib";
import { xml2pdf } from "./elements/xml2pdf.js";
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 { endEnergieVerbrauchVerbrauchsausweis_2016_Server } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016_Server.js";
/* -------------------------------- 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 pdf = await PDFDocument.load(VerbrauchsausweisWohnenGEG2024PDF)
const page3 = copyPage(pdf.getPages()[0]);
@@ -34,14 +33,6 @@ export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: Verbrauchsau
const marginX = 60;
const marginY = 150;
benutzer = benutzer || {
vorname: "Max",
name: "Mustermann",
adresse: "Musterstraße 123",
plz: "12345",
ort: "Beispielhausen"
};
const translateHeizungsstatus: Record<Heizungsstatus, string> = {
BEHEIZT: "beheizt",
NICHT_VORHANDEN: "nicht vorhanden",
@@ -53,9 +44,10 @@ export async function pdfDatenblattVerbrauchsausweisWohnen(ausweis: Verbrauchsau
const id = ausweis.id;
const layout = xml2pdf(`<layout height="${pages[0].getHeight()}" width="${pages[0].getWidth()}" marginTop="150" marginLeft="${marginX}" marginRight="${marginX}">
<text size="12" lineHeight="14">${benutzer.vorname} ${benutzer.name}</text>
<text size="12" lineHeight="14">${benutzer.adresse}</text>
<text size="12" lineHeight="14">${benutzer.plz} ${benutzer.ort}</text>
<text size="12" lineHeight="14">${rechnung?.versand_empfaenger || ""}</text>
<text size="12" lineHeight="14">${rechnung?.versand_zusatzzeile || ""}</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}">
<text size="12" font="bold">Datenblatt Energieausweis</text>
<text size="12">Ausweis ID: ${id}</text>

View File

@@ -4,7 +4,6 @@ import { Enums } from "#lib/server/prisma.js";
import * as fs from "fs"
import moment from "moment";
import { PDFDocument, PDFFont, PDFImage, PDFPage, StandardFonts } from "pdf-lib";
import { addCheckMark } from "./utils/checkbox.js";
import { addText } from "./utils/text.js";
import { addAnsichtsausweisLabel, addDatumGEG, addRegistriernummer } from "./utils/helpers.js";
import { getS3File } from "#lib/s3.js";
@@ -103,7 +102,7 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
})
if (ausweis.warmwasser_enthalten) {
pages[0].drawText(`${ausweis.brennstoff_1}, ${ausweis.brennstoff_2 || ""}`, {
pages[3].drawText(`${ausweis.brennstoff_1}, ${ausweis.brennstoff_2 || ""}`, {
x: 211,
y: height - 299,
size: 10
@@ -112,30 +111,82 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
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) {
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) {
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) {
addCheckMark(pages[0], 355, height - 345)
pages[0].drawText("x", {
x: 356,
y: height - 353,
size: 10,
font: bold
})
}
// Kühlung
if (aufnahme.kuehlung) {
addCheckMark(pages[0], 213, height - 362.5)
} else {
addCheckMark(pages[0], 355, height - 373.5)
if (aufnahme.kuehlung === "1" && aufnahme.kuehlung !== null) {
pages[0].drawText("x", {
x: 356,
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) {
addCheckMark(pages[0], 213, height - 406)
} else if (ausweis.ausstellgrund === Enums.Ausstellgrund.Vermietung) {
addCheckMark(pages[0], 213, height - 417)
pages[0].drawText("x", {
x: 214,
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) {
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) {
addCheckMark(pages[0], 463, height - 417)
pages[0].drawText("x", {
x: 464,
y: height - 425,
size: 10,
font: bold
})
}
// Aushangpflicht
// addCheckMark(pages[0], 463, height - 406)
@@ -148,24 +199,43 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
if (bild) {
const file = await getS3File("ibc-images", `${bild.id}.jpg`);
if (file) {
let image: PDFImage;
image = await pdf.embedJpg(file)
image = await pdf.embedJpg(file);
const originalWidth = image.width;
const originalHeight = image.height;
// Calculate the scaling factor to fit within the maximum dimensions while maintaining proportions
const scaleFactor = Math.min(111 / originalWidth, 138 / originalHeight);
const scaledWidth = originalWidth * scaleFactor;
const scaledHeight = originalHeight * scaleFactor;
pages[0].drawImage(image, {
x: 460.5,
y: height - 289,
width: 111,
height: 138
})
y: (height - 289 - scaledHeight) + 138, // Adjust y to align the image properly
width: scaledWidth,
height: scaledHeight
});
}
}
// Checkmark Angabe energetische Qualität des Gebäudes.
addCheckMark(pages[0], 40, height - 550)
// Checkmark Verbrauchsausweis.
pages[0].drawText("x", {
x: 41,
y: height - 558,
size: 10,
font: bold
})
// 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
pages[0].drawText(moment().format("DD.MM.YYYY"), {
@@ -184,9 +254,9 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
})
// 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 stempelHeight = 60
const stempelHeight = 65
pages[0].drawImage(stempel, {
x: 450,
@@ -200,10 +270,10 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
// Aussteller
const aussteller = await pdf.embedPng(fs.readFileSync(new URL("../../../public/pdf/images/aussteller.png", import.meta.url), "base64"));
pages[0].drawImage(aussteller, {
x: 40,
y: height - 750,
width: 100,
height: 50
x: 260,
y: height - 755,
width: 130,
height: 65
})
@@ -216,10 +286,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"))
// 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 stromVerbrauchTranslationPercentage = Math.min(1000, Math.max(0, berechnungen?.endEnergieVerbrauchStrom || 0)) / 1000
const vergleichsWertWaermeTranslationPercentage = Math.min(1000, Math.max(0, berechnungen?.vergleichsWertWaerme || 0)) / 1000
const vergleichsWertStromTranslationPercentage = Math.min(1000, Math.max(0, berechnungen?.vergleichsWertStrom || 0)) / 1000
const endenergieverbrauchTranslationPercentage = Math.min((berechnungen?.vergleichsWertWaerme * 2), Math.max(0, berechnungen?.endEnergieVerbrauchGesamt || 0)) / (berechnungen?.vergleichsWertWaerme * 2)
const stromVerbrauchTranslationPercentage = Math.min((berechnungen?.vergleichsWertStrom * 2), Math.max(0, berechnungen?.endEnergieVerbrauchStrom || 0)) / (berechnungen?.vergleichsWertStrom * 2)
const vergleichsWertWaermeTranslationPercentage = Math.min((berechnungen?.vergleichsWertWaerme * 2), Math.max(0, berechnungen?.vergleichsWertWaerme || 0)) / (berechnungen?.vergleichsWertWaerme * 2)
const vergleichsWertStromTranslationPercentage = Math.min((berechnungen?.vergleichsWertStrom * 2), Math.max(0, berechnungen?.vergleichsWertStrom || 0)) / (berechnungen?.vergleichsWertStrom * 2)
const minTranslation = 78
const maxTranslation = 512
@@ -245,47 +315,96 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
height: 30
})
const endEnergieVerbrauchGesamtText = `${berechnungen?.endEnergieVerbrauchGesamt.toString()}kWh/(m²a)`;
const stromVerbrauchGesamtText = `${berechnungen?.endEnergieVerbrauchStrom.toString()}kWh/(m²a)`;
const vergleichswertWaermeText = `${berechnungen?.vergleichsWertWaerme.toString()}kWh/(m²a)`
const vergleichswertStromText = `${berechnungen?.vergleichsWertStrom.toString()}kWh/(m²a)`
page.drawText("0", {
x: 85,
y: height - 241,
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) {
page.drawText("Endenergieverbrauch Wärme", {
x: endenergieverbrauchTranslationX - margin - font.widthOfTextAtSize("Endenergieverbrauch", 10),
x: endenergieverbrauchTranslationX - margin - font.widthOfTextAtSize("Endenergieverbrauch Wärme", 10) - (pfeilWidth / 2),
y: height - 191,
size: 10
})
page.drawText(endEnergieVerbrauchGesamtText, {
x: endenergieverbrauchTranslationX - margin - bold.widthOfTextAtSize(endEnergieVerbrauchGesamtText, 10),
x: endenergieverbrauchTranslationX - margin - bold.widthOfTextAtSize(endEnergieVerbrauchGesamtText, 10) - (pfeilWidth / 2),
y: height - 205,
size: 10,
font: bold
})
} else {
page.drawText("Endenergieverbrauch Wärme", {
x: endenergieverbrauchTranslationX + pfeilWidth + margin,
x: endenergieverbrauchTranslationX + pfeilWidth + margin + (pfeilWidth / 2),
y: height - 191,
size: 10
})
page.drawText(endEnergieVerbrauchGesamtText, {
x: endenergieverbrauchTranslationX + pfeilWidth + margin,
x: endenergieverbrauchTranslationX + pfeilWidth + margin + (pfeilWidth / 2),
y: height - 205,
size: 10,
font: bold
})
}
const vergleichswertWaermeText = `${Math.round(berechnungen?.vergleichsWertWaerme).toString()}kWh/(m²a)`
if (vergleichsWertWaermeTranslationPercentage > 0.5) {
page.drawText("Vergleichswert Wärme", {
x: vergleichsWertWaermeTranslationX - margin - font.widthOfTextAtSize("Vergleichswert", 10),
x: vergleichsWertWaermeTranslationX - margin - font.widthOfTextAtSize("Vergleichswert Wärme", 10) - (pfeilWidth / 2),
y: height - 275,
size: 10
})
page.drawText(vergleichswertWaermeText, {
x: vergleichsWertWaermeTranslationX - margin - bold.widthOfTextAtSize(vergleichswertWaermeText, 10),
x: vergleichsWertWaermeTranslationX - margin - bold.widthOfTextAtSize(vergleichswertWaermeText, 10) - (pfeilWidth / 2),
y: height - 289,
size: 10,
font: bold
@@ -312,42 +431,47 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
})
page.drawImage(pfeilNachOben, {
x: vergleichsWertStromTranslationX,
x: vergleichsWertStromTranslationX,
y: height - 437,
width: pfeilWidth,
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", {
x: stromVerbrauchTranslationX - margin - font.widthOfTextAtSize("Primärenergieverbrauch", 10),
x: stromVerbrauchTranslationX - margin - font.widthOfTextAtSize("Endenergieverbrauch Strom", 10) - (pfeilWidth / 2),
y: height - 335,
size: 10
})
page.drawText(stromVerbrauchGesamtText, {
x: stromVerbrauchTranslationX - margin - bold.widthOfTextAtSize(stromVerbrauchGesamtText, 10),
x: stromVerbrauchTranslationX - margin - bold.widthOfTextAtSize(stromVerbrauchGesamtText, 10) - (pfeilWidth / 2),
y: height - 349,
size: 10,
font: bold
})
} else {
page.drawText("Endenergieverbrauch Strom", {
x: stromVerbrauchTranslationX + pfeilWidth + margin,
x: stromVerbrauchTranslationX + pfeilWidth + margin + (pfeilWidth / 2),
y: height - 335,
size: 10
})
page.drawText(stromVerbrauchGesamtText, {
x: stromVerbrauchTranslationX + pfeilWidth + margin,
x: stromVerbrauchTranslationX + pfeilWidth + margin + (pfeilWidth / 2),
y: height - 349,
size: 10,
font: bold
})
}
const vergleichswertStromText = `${Math.round(berechnungen?.vergleichsWertStrom).toString()}kWh/(m²a)`
if (vergleichsWertWaermeTranslationPercentage > 0.5) {
page.drawText("Vergleichswert Strom", {
x: vergleichsWertStromTranslationX - margin - font.widthOfTextAtSize("Vergleichswert", 10),
x: vergleichsWertStromTranslationX - margin - font.widthOfTextAtSize("Vergleichswert Strom", 10),
y: height - 420,
size: 10
})
@@ -360,12 +484,12 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
})
} else {
page.drawText("Vergleichswert Strom", {
x: vergleichsWertStromTranslationX + pfeilWidth + margin,
x: vergleichsWertStromTranslationX + pfeilWidth + margin + (pfeilWidth / 2),
y: height - 420,
size: 10
})
page.drawText(vergleichswertStromText, {
x: vergleichsWertStromTranslationX + pfeilWidth + margin,
x: vergleichsWertStromTranslationX + pfeilWidth + margin + (pfeilWidth / 2),
y: height - 434,
size: 10,
font: bold
@@ -376,35 +500,75 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
addEnergieverbrauchSkalaPfeile(pages[2])
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) {
addCheckMark(pages[2], 41, height - 305)
pages[2].drawText("x", {
x: 42,
y: height - 313,
size: 10,
font: bold
})
}
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) {
addCheckMark(pages[2], 131, height - 456)
pages[2].drawText("x", {
x: 132,
y: height - 464,
size: 10,
font: bold
})
}
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) {
addCheckMark(pages[2], 281, height - 456)
pages[2].drawText("x", {
x: 282,
y: height - 464,
size: 10,
font: bold
})
}
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) {
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)
@@ -498,22 +662,7 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
const addVerbrauch = addVerbrauchGenerator();
if (!ausweis.warmwasser_enthalten) {
// 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
// Primäre Heizquelle
addVerbrauch(
moment(ausweis.startdatum).format("MM.YYYY"),
moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
@@ -521,12 +670,12 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
berechnungen?.brennstoff_1.primaerenergiefaktor.toString(),
Math.round(berechnungen?.energieVerbrauchGesamt_1 || 0).toString(),
Math.round(berechnungen?.energieVerbrauchWarmwasser_1 || 0).toString(),
berechnungen?.endEnergieVerbrauchKuehlungsZuschlag_1,
berechnungen?.kuehlungsZuschlag_1,
Math.round(berechnungen?.energieVerbrauchHeizung_1 || 0).toString(),
berechnungen?.durchschnittsKlimafaktor.toString(),
berechnungen?.energieVerbrauchStrom
);
}
if (ausweis.zusaetzliche_heizquelle) {
addVerbrauch(
@@ -536,31 +685,12 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
berechnungen?.brennstoff_2.primaerenergiefaktor.toString(),
Math.round(berechnungen?.energieVerbrauchGesamt_2 || 0).toString(),
Math.round(berechnungen?.energieVerbrauchWarmwasser_2 || 0).toString(),
berechnungen?.endEnergieVerbrauchKuehlungsZuschlag_2,
berechnungen?.kuehlungsZuschlag_2,
Math.round(berechnungen?.energieVerbrauchHeizung_2 || 0).toString(),
berechnungen?.durchschnittsKlimafaktor.toString(),
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) {
/**
@@ -573,10 +703,12 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
"Leerstandszuschlag",
berechnungen?.brennstoff_1.primaerenergiefaktor.toString(),
Math.round((berechnungen?.leerstandsZuschlagHeizung || 0) + (berechnungen?.leerstandsZuschlagWarmwasser || 0)).toString(),
Math.round((berechnungen?.leerstandsZuschlagHeizung || 0) + (berechnungen?.leerstandsZuschlagWarmwasser || 0) + (berechnungen?.leerstandsZuschlagKuehlung || 0)).toString(),
Math.round((berechnungen?.leerstandsZuschlagWarmwasser || 0)).toString(),
Math.round((berechnungen?.leerstandsZuschlagHeizung || 0)),
berechnungen?.durchschnittsKlimafaktor.toString()
Math.round((berechnungen?.leerstandsZuschlagKuehlung || 0)),
Math.round((berechnungen?.leerstandsZuschlagHeizung || 0)).toString(),
berechnungen?.durchschnittsKlimafaktor.toString(),
Math.round((berechnungen?.leerstandsZuschlagStrom || 0))
);
} else {
addVerbrauch(
@@ -584,33 +716,36 @@ export async function pdfVerbrauchsausweisGewerbe(ausweis: VerbrauchsausweisGewe
moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
"Leerstandszuschlag",
berechnungen?.brennstoff_1.primaerenergiefaktor.toString(),
Math.round((berechnungen?.leerstandsZuschlagHeizung || 0) + (berechnungen?.leerstandsZuschlagWarmwasser || 0)).toString(),
"0",
0,
berechnungen?.durchschnittsKlimafaktor.toString()
Math.round((berechnungen?.leerstandsZuschlagHeizung || 0) + (berechnungen?.leerstandsZuschlagWarmwasser || 0) + (berechnungen?.leerstandsZuschlagKuehlung || 0)).toString(),
Math.round((berechnungen?.leerstandsZuschlagWarmwasser || 0)).toString(),
Math.round((berechnungen?.leerstandsZuschlagKuehlung || 0)),
Math.round((berechnungen?.leerstandsZuschlagHeizung || 0)).toString(),
berechnungen?.durchschnittsKlimafaktor.toString(),
Math.round((berechnungen?.leerstandsZuschlagStrom || 0))
);
}
}
if (aufnahme.kuehlung) {
/**
* Kühlungszuschlag - Pauschale Erhöhung um 6kWh/m²
* Primärenergiefaktor Strom
* @link https://www.bundesanzeiger.de/pub/publication/MRYM4nI84Sdlr0EIvvW?2
*/
addVerbrauch(
moment(ausweis.startdatum).format("MM.YYYY"),
moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
"Kühlungszuschlag",
"",
// TODO
// berechnungen?.primaerfaktorww.toString(),
Math.round(berechnungen?.kuehlungsZuschlag_1 || 0).toString(),
"0",
0,
""
);
}
if (aufnahme.kuehlung === "1" && (ausweis.stromverbrauch_enthaelt_kuehlung === false || ausweis.stromverbrauch_enthaelt_kuehlung === null)) {
/**
* Kühlungszuschlag - Pauschale Erhöhung um 6kWh/m²
* Primärenergiefaktor Strom
* @link https://www.bundesanzeiger.de/pub/publication/MRYM4nI84Sdlr0EIvvW?2
*/
addVerbrauch(
moment(ausweis.startdatum).format("MM.YYYY"),
moment(ausweis.startdatum).add(3, "years").format("MM.YYYY"),
"Kühlungszuschlag",
"1.8",
"",
"",
0,
"",
"",
Math.round(berechnungen?.kuehlungsZuschlag || 0)
);
}
/* -------------------------------- Seite 4 -------------------------------- */

View File

@@ -4,7 +4,6 @@ import { Enums } from "#lib/server/prisma.js";
import * as fs from "fs"
import moment from "moment";
import { PDFDocument, PDFFont, PDFImage, PDFPage, StandardFonts } from "pdf-lib";
import { addCheckMark } from "./utils/checkbox.js";
import { addText } from "./utils/text.js";
import { addAnsichtsausweisLabel, addDatumGEG, addRegistriernummer } from "./utils/helpers.js";
import { getS3File } from "#lib/s3.js";
@@ -12,6 +11,7 @@ import { endEnergieVerbrauchVerbrauchsausweis_2016_Server } from "#lib/Berechnun
/* -------------------------------- Pdf Tools ------------------------------- */
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 pdf = await PDFDocument.load(VerbrauchsausweisWohnenGEG2024PDF)
@@ -28,6 +28,18 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
const font = await pdf.embedFont(StandardFonts.Helvetica)
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 || ""}`, {
x: 211,
y: height - 112.5,
@@ -40,9 +52,44 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
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);
const originalWidth = image.width;
const originalHeight = image.height;
// Calculate the scaling factor to fit within the maximum dimensions while maintaining proportions
const scaleFactor = Math.min(111 / originalWidth, 138 / originalHeight);
const scaledWidth = originalWidth * scaleFactor;
const scaledHeight = originalHeight * scaleFactor;
pages[0].drawImage(image, {
x: 460.5,
y: (height - 289 - scaledHeight) + 138, // Adjust y to align the image properly
width: scaledWidth,
height: scaledHeight
});
}
}
pages[0].drawText(objekt.adresse || "", {
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
})
@@ -70,18 +117,36 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
size: 10
})
pages[0].drawText(aufnahme.nutzflaeche?.toString() || "", {
pages[0].drawText(Math.round(berechnungen?.energetischeNutzflaeche || 0).toString() || "", {
x: 211,
y: height - 285,
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 || ""}`, {
x: 211,
y: height - 298.5,
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) {
pages[0].drawText(`${ausweis.brennstoff_1}, ${ausweis.brennstoff_2 || ""}`, {
x: 211,
@@ -91,6 +156,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
}
const erneuerbareEnergienVerwendung = []
if (ausweis.alternative_heizung) {
@@ -115,69 +181,91 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
size: 8
})
if (ausweis.warmwasser_enthalten) {
pages[0].drawText(`${ausweis.brennstoff_1}, ${ausweis.brennstoff_2 || ""}`, {
x: 211,
y: height - 299,
size: 10
if (aufnahme.lueftung === Enums.Lueftungskonzept.Fensterlueftung) {
pages[0].drawText("x", {
x: 214,
y: height - 355,
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
if (aufnahme.kuehlung) {
addCheckMark(pages[0], 213, height - 375.5)
} else {
addCheckMark(pages[0], 355, height - 386.5)
if (aufnahme.kuehlung === "1" && aufnahme.kuehlung !== null) {
pages[0].drawText("x", {
x: 356,
y: height - 383.5,
size: 10,
font: bold
})
}
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) {
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) {
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) {
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);
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
})
}
}
// 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)
// Checkmark Angabe Verbrauchsausweis
pages[0].drawText("x", {
x: 44,
y: height - 568,
size: 10,
font: bold
})
// Datenerhebung durch Eigentümer
addCheckMark(pages[0], 298, height - 590)
pages[0].drawText("x", {
x: 299,
y: height - 598,
size: 10,
font: bold
})
// Ausstellungsdatum
pages[0].drawText(moment().format("DD.MM.YYYY"), {
@@ -196,9 +284,9 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
})
// 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 stempelHeight = 60
const stempelHeight = 65
pages[0].drawImage(stempel, {
x: 450,
@@ -210,11 +298,12 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
// Aussteller
const aussteller = await pdf.embedPng(fs.readFileSync(new URL("../../../public/pdf/images/aussteller.png", import.meta.url), "base64"));
pages[0].drawImage(aussteller, {
x: 40,
y: height - 770,
width: 100,
height: 50
x: 260,
y: height - 775,
width: 130,
height: 65
})
@@ -254,7 +343,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
}
page.drawImage(pfeilNachUnten, {
x: endenergieverbrauchTranslationX,
x: endenergieverbrauchTranslationX - (pfeilWidth / 2),
y: height - 212,
width: pfeilWidth,
height: 30
@@ -291,7 +380,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
}
page.drawImage(pfeilNachOben, {
x: primaerenergieverbrauchTranslationX,
x: primaerenergieverbrauchTranslationX - (pfeilWidth / 2),
y: height - 297,
width: pfeilWidth,
height: 30
@@ -325,7 +414,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
}
}
addEnergieverbrauchSkalaPfeile(pages[2])
// CO2 Emissionen
pages[2].drawText(berechnungen?.co2EmissionenGesamt.toString() || "", {
@@ -335,6 +424,8 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
size: 10
})
addEnergieverbrauchSkalaPfeile(pages[2])
// Endenergieverbrauch
pages[2].drawText(berechnungen?.endEnergieVerbrauchGesamt.toString() || "", {
x: 455,
@@ -414,7 +505,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
const addVerbrauch = addVerbrauchGenerator();
if (!ausweis.warmwasser_enthalten) {
if (ausweis.warmwasser_enthalten !== true) {
// Mit Warmwasserzuschlag
addVerbrauch(
moment(ausweis.startdatum).format("MM.YYYY"),
@@ -453,7 +544,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
);
}
if (!ausweis.warmwasser_enthalten) {
if (!ausweis.warmwasser_enthalten && ausweis.anteil_warmwasser_1 === 0) {
/**
* Dezentrale Warmwasserversorgung - Pauschale Erhöhung um 20kWh/m²
* @link https://www.bundesanzeiger.de/pub/publication/MRYM4nI84Sdlr0EIvvW?2
@@ -464,7 +555,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
"Warmwasserzuschlag",
berechnungen?.primaerfaktorww.toString(),
Math.round(berechnungen?.energieVerbrauchWarmwasser_1 || 0).toString(),
Math.round(berechnungen?.energieVerbrauchWarmwasser_1 || 0).toString(),
Math.round(berechnungen?.energieVerbrauchWarmwasser_1 || 0).toString(),
"0",
"0"
);
@@ -500,7 +591,7 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
}
}
if (aufnahme.kuehlung) {
if (aufnahme.kuehlung === "1") {
/**
* Kühlungszuschlag - Pauschale Erhöhung um 6kWh/m²
* Primärenergiefaktor Strom
@@ -592,16 +683,5 @@ export async function pdfVerbrauchsausweisWohnen(ausweis: VerbrauchsausweisWohne
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();
}

View File

@@ -1,9 +1,11 @@
import { AufnahmeClient, BedarfsausweisWohnenClient, BenutzerClient, BildClient, getAusweisartFromId, ObjektClient, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
import { AufnahmeClient, BedarfsausweisWohnenClient, BenutzerClient, BildClient, getAusweisartFromId, ObjektClient, RechnungClient, VerbrauchsausweisGewerbeClient, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types.js";
import { pdfDatenblattVerbrauchsausweisGewerbe } from "#lib/pdf/pdfDatenblattVerbrauchsausweisGewerbe.js";
import { pdfDatenblattVerbrauchsausweisWohnen } from "#lib/pdf/pdfDatenblattVerbrauchsausweisWohnen.js";
import { pdfVerbrauchsausweisGewerbe } from "#lib/pdf/pdfVerbrauchsausweisGewerbe.js";
import { pdfVerbrauchsausweisWohnen } from "#lib/pdf/pdfVerbrauchsausweisWohnen.js";
import { Enums, prisma } from "#lib/server/prisma.js";
import { pdfAushangVerbrauchsausweisGewerbe } from "#lib/pdf/pdfAushangVerbrauchsausweisGewerbe.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.
@@ -49,15 +51,31 @@ export async function getAnsichtsausweis(ausweis: VerbrauchsausweisWohnenClient
* Gibt das richtige Datenblatt basierend auf der Ausweisart zurück.
* @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) {
return null
}
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) {
return await pdfDatenblattVerbrauchsausweisGewerbe(ausweis as VerbrauchsausweisGewerbeClient, aufnahme, objekt, user, bilder)
return await pdfDatenblattVerbrauchsausweisGewerbe(ausweis as VerbrauchsausweisGewerbeClient, aufnahme, objekt, rechnung, bilder)
}
return null
}
/**
* Gibt den richtigen Aushang basierend auf der Ausweisart zurück.
* @param ausweis
*/
export async function getAushang(ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbeClient | BedarfsausweisWohnenClient, aufnahme: AufnahmeClient, objekt: ObjektClient, bilder: BildClient[], user: BenutzerClient, vorschau: boolean = true, rechnung: Rechnung, ausweisart = getAusweisartFromId(ausweis.id)) {
if (!ausweisart || !rechnung.services.includes(Enums.Service.Aushang)) {
return null
}
if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
return await pdfAushangVerbrauchsausweisGewerbe(ausweis as VerbrauchsausweisGewerbeClient, aufnahme, objekt, bilder, user, vorschau)
}
return null

View File

@@ -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> {
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,12 @@ export async function getUnterlagen(aufnahme_id: string): Promise<Unterlage[]> {
aufnahme_id
}
})
}
export async function getRechnung(rechnung_id: string) {
return await prisma.rechnung.findUnique({
where: {
id: rechnung_id
}
})
}

View File

@@ -122,7 +122,7 @@ export async function createInvoice(
},
title: "Rechnung",
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.",
};
@@ -188,7 +188,7 @@ export async function createInvoice(
data["lineItems"].push(
createLineItem(
`Bedarfsausweis Online (ID ${ausweis.id})`,
PRICES.VerbrauchsausweisWohnen.Standard,
PRICES.BedarfsausweisWohnen.Standard,
19
)
);
@@ -196,7 +196,7 @@ export async function createInvoice(
data["lineItems"].push(
createLineItem(
`Bedarfsausweis Online (Vorprüfung negativ) (ID ${ausweis.id})`,
PRICES.VerbrauchsausweisWohnen.Beratung,
PRICES.BedarfsausweisWohnen.Beratung,
19
)
);
@@ -204,7 +204,7 @@ export async function createInvoice(
data["lineItems"].push(
createLineItem(
`Bedarfsausweis Offline (ID ${ausweis.id})`,
PRICES.VerbrauchsausweisWohnen.Offline,
PRICES.BedarfsausweisWohnen.Offline,
19
)
);
@@ -280,3 +280,69 @@ export async function createInvoice(
voucherNumber: abfrage_response["voucherNumber"],
};
}
export async function getLexOfficeVoucherNumber(rechnung: Rechnung) {
const request = await fetch(
`https://api.lexoffice.io/v1/invoices/${rechnung.lex_office_id}`,
{
method: "GET",
headers: {
Accept: `application/json`,
Authorization: `Bearer ${LEX_OFFICE_API_KEY}`,
"Content-Type": "application/json",
},
}
);
const response = await request.json();
return 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;
}

View File

@@ -0,0 +1,36 @@
import { BASE_URI } from "#lib/constants.js";
import { transport } from "#lib/mail.js";
import { Benutzer } from "../prisma.js";
export async function sendAusweisGespeichertMail(user: Benutzer, ausweis_id: string) {
await transport.sendMail({
from: `"IBCornelsen" <info@online-energieausweis.org>`,
to: user.email,
subject: `Ihr Ausweis wurde gespeichert - IBCornelsen - (ID: ${ausweis_id})`,
html: `<p>Sehr geehrte*r ${user.vorname} ${user.name},</p>
<p>Ihr Energieausweis wurde erfolgreich in Ihrem Konto gespeichert. Sie können ihn jederzeit in Ihrem Kundenbereich abrufen.<br><br>
Ihre Vorgänge und Ausweise können Sie in Ihrem Kundenkonto einsehen und bearbeiten:<br><br>
<a href="${BASE_URI}/dashboard">zum Kundenkonto</a><br></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>`
})
}

View File

@@ -1,9 +1,27 @@
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
import { checkAuthorizationHeader, checkAuthorizationHeaderNoThrow } from "#lib/middleware/authorization.js";
import { AstroGlobal } from "astro";
import { Enums } from "#lib/client/prisma.js";
import { prisma } from "#lib/server/prisma.js";
export function getCurrentUser(Astro: AstroGlobal) {
const accessToken = Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value;
return checkAuthorizationHeaderNoThrow(`Bearer ${accessToken}`)
}
export async function getOtherUser(Astro: AstroGlobal, userId : string) {
const accessToken = Astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)?.value;
let currentUser = await checkAuthorizationHeaderNoThrow(`Bearer ${accessToken}`)
if (currentUser?.rolle == Enums.BenutzerRolle.ADMIN) {
const user = await prisma.benutzer.findUnique({
where: {
id: userId
}
})
return user;
}
return null;
}

View File

@@ -1,255 +0,0 @@
import {
VerbrauchsausweisWohnenSchema,
AufnahmeSchema,
ObjektSchema,
BildSchema,
RechnungSchema,
EventSchema,
BenutzerSchema,
GebaeudePlaeneSchema,
AnteilshaberSchema,
BedarfsausweisWohnenSchema,
VerbrauchsausweisGewerbeSchema
} from "#lib/client/prisma";
import { z } from "zod";
export const RechnungValidator = RechnungSchema.omit({
aufnahme_id: true,
id: true,
benutzer_id: true
})
export const GebaeudePlaeneValidator = GebaeudePlaeneSchema.omit({
id: true,
objekt_id: true
})
export const AnteilshaberValidator = AnteilshaberSchema.omit({
benutzer_id: true,
id: true,
objekt_id: true
})
export const BildValidator = BildSchema.omit({
id: true,
objekt_id: true
})
export const AufnahmeValidator = AufnahmeSchema.omit({
id: true,
benutzer_id: true,
objekt_id: true,
}).merge(
z.object({
verbrauchsausweis_wohnen: VerbrauchsausweisWohnenSchema.omit({
id: true,
benutzer_id: true,
aufnahme_id: true,
}).nullable(),
bedarfsausweis_wohnen: VerbrauchsausweisWohnenSchema.omit({
id: true,
benutzer_id: true,
aufnahme_id: true,
}).nullable(),
verbrauchsausweis_gewerbe: VerbrauchsausweisWohnenSchema.omit({
id: true,
benutzer_id: true,
aufnahme_id: true,
}).nullable(),
rechnungen: z.array(
RechnungValidator
),
events: z.array(
EventSchema.omit({
benutzer_id: true,
id: true,
}).merge(
z.object({
benutzer: BenutzerSchema.pick({ uid: true }),
})
)
),
})
);
export const ObjektValidator = ObjektSchema.omit({
benutzer_id: true,
id: true
}).merge(z.object({
aufnahme: z.array(
AufnahmeValidator
).nullable().optional(),
bilder: z.array(
BildValidator
).nullable().optional(),
gebaeude_plaene: z.array(
GebaeudePlaeneValidator
).nullable().optional(),
Anteilshaber: z.array(
AnteilshaberValidator
).nullable().optional()
}))
/**
* Runtime überprüfung für den Verbrauchsausweis Wohnen
* Dieser Typ beinhaltet alle Daten bis auf die IDs aller Verlinkungen.
*/
export const VerbrauchsausweisWohnenValidator =
VerbrauchsausweisWohnenSchema.merge(
z.object({
benutzer: BenutzerSchema.omit({
id: true,
passwort: true
}),
aufnahme: AufnahmeSchema.omit({
benutzer_id: true,
objekt_id: true,
id: true,
}).merge(
z.object({
objekt: ObjektSchema.omit({
benutzer_id: true,
id: true,
}).merge(
z.object({
bilder: z.array(
BildSchema.omit({
id: true,
objekt_id: true,
})
)
})
),
rechnungen: RechnungSchema.omit({
aufnahme_id: true,
benutzer_id: true,
id: true,
}).array(),
events: z.array(
EventSchema.omit({
aufnahme_id: true,
id: true,
benutzer_id: true
}).merge(z.object({
benutzer: BenutzerSchema.pick({
uid: true
})
}))
)
})
)
})
).omit({
benutzer_id: true,
id: true,
aufnahme_id: true,
});
export const VerbrauchsausweisWohnenBerechnungValidator2024 = z.object({
endEnergieVerbrauchGesamt: z.number(),
primaerEnergieVerbrauchGesamt: z.number(),
energieEffizienzKlasse: z.string(),
co2EmissionenGesamt: z.number()
})
/**
* Runtime überprüfung für den Verbrauchsausweis Wohnen
* Dieser Typ beinhaltet alle Daten bis auf die IDs aller Verlinkungen.
*/
export const BedarfsausweisWohnenValidator =
BedarfsausweisWohnenSchema.merge(
z.object({
aufnahme: AufnahmeSchema.omit({
benutzer_id: true,
objekt_id: true,
id: true,
}).merge(
z.object({
objekt: ObjektSchema.omit({
benutzer_id: true,
id: true,
}).merge(
z.object({
bilder: z.array(
BildSchema.omit({
id: true,
objekt_id: true,
})
)
})
),
rechnungen: RechnungSchema.omit({
aufnahme_id: true,
benutzer_id: true,
id: true,
}).array(),
events: z.array(
EventSchema.omit({
aufnahme_id: true,
id: true,
benutzer_id: true
}).merge(z.object({
benutzer: BenutzerSchema.pick({
uid: true
})
}))
)
})
)
})
).omit({
benutzer_id: true,
id: true,
aufnahme_id: true,
});
/**
* Runtime überprüfung für den Verbrauchsausweis Wohnen
* Dieser Typ beinhaltet alle Daten bis auf die IDs aller Verlinkungen.
*/
export const VerbrauchsausweisGewerbeValidator =
VerbrauchsausweisGewerbeSchema.merge(
z.object({
aufnahme: AufnahmeSchema.omit({
benutzer_id: true,
objekt_id: true,
id: true,
}).merge(
z.object({
objekt: ObjektSchema.omit({
benutzer_id: true,
id: true,
}).merge(
z.object({
bilder: z.array(
BildSchema.omit({
id: true,
objekt_id: true,
})
)
})
),
rechnungen: RechnungSchema.omit({
aufnahme_id: true,
benutzer_id: true,
id: true,
}).array(),
events: z.array(
EventSchema.omit({
aufnahme_id: true,
id: true,
benutzer_id: true
}).merge(z.object({
benutzer: BenutzerSchema.pick({
uid: true
})
}))
)
})
)
})
).omit({
benutzer_id: true,
id: true,
aufnahme_id: true,
});

View File

@@ -57,7 +57,8 @@
"bedarfsausweis-wohnen.ausweis"
);
if (localStorageAusweis) {
ausweis = JSON.parse(localStorageAusweis);
ausweis = JSON.parse(localStorageAusweis)
ausweis.ausweistyp = ausweistyp;
}
const localStorageAufnahme = localStorage.getItem(
@@ -147,6 +148,7 @@
{ausweisart}
{partner_code}
showWeiter={false}
{ausweistyp}
{form}
{skala}
></ButtonWeiterHilfe>
@@ -167,7 +169,7 @@
><GebaeudeDaten bind:aufnahme bind:objekt {ausweisart} /></Bereich
>
<!-- C - Berechnungshilfe und Tabelle der Hüllflächen, U-Werte und Gebäudevolumen -->
<!-- C - Berechnungshilfe und Tabelle der Hüllflächen, U-Werte und Gebäudevolumen
<!-- <Bereich
bereich="C"
@@ -175,13 +177,13 @@
><GebaeudeVolumen bind:ausweis /></Bereich
> -->
<!-- D - Eingabe der Fensterflächen und Konstruktion von Dach, Wänden und Boden -->
<!-- D - Eingabe der Fensterflächen und Konstruktion von Dach, Wänden und Boden
<!-- <Bereich
bereich="D"
title="Eingabe der Fensterflächen und Konstruktion von Dach, Wänden und Boden"
><Fensterflaechen bind:ausweis /></Bereich
> -->
> -->
<!-- E - Angabe zu Lüftung und Kühlung -->
@@ -190,7 +192,7 @@
>
<!-- F Angaben zur Heizungsanlage -->
<!-- <Bereich bereich="F" title="Angaben zur Heizunganlage"
<Bereich bereich="D" title="Angaben zur Heizunganlage"
><SanierungszustandHeizungsanlage
bind:images={bilder}
bind:objekt
@@ -198,9 +200,9 @@
bind:ausweis
{ausweisart}
/></Bereich
> -->
>
<Bereich bereich="D" title="Gebäudepläne & Unterlagen">
<Bereich bereich="E" title="Gebäudepläne & Unterlagen">
<div
class="bereich-box grid grid-cols-1 lg:grid-cols-2 gap-x-6 mt-6"
>
@@ -239,7 +241,7 @@
<!-- 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
bind:images={bilder}
bind:objekt
@@ -249,7 +251,7 @@
>
<!-- H Angaben zur Wärmedammung -->
<Bereich bereich="F" title="Angaben zur Wärmedämmung"
<Bereich bereich="G" title="Angaben zur Wärmedämmung"
><SanierungszustandWaermedammung
bind:images={bilder}
bind:objekt
@@ -260,7 +262,7 @@
<!-- 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
bind:images={bilder}
bind:ausweis
@@ -282,6 +284,7 @@
{ausweisart}
{partner_code}
showWeiter={true}
{ausweistyp}
{form}
{skala}
></ButtonWeiterHilfe>

View File

@@ -1,18 +1,23 @@
<script lang="ts">
import { AufnahmeKomplettClient, BenutzerClient } from "#components/Ausweis/types.js";
import AusweisPruefenNotification from "#components/AusweisPruefenNotification.svelte";
import Carousel from "#components/Carousel.svelte";
import { BenutzerClient } from "#components/Ausweis/types.js";
import DashboardAusweis from "#components/Dashboard/DashboardAusweis.svelte";
import DashboardNachweis from "#components/Dashboard/DashboardNachweis.svelte";
import NotificationWrapper from "#components/Notifications/NotificationWrapper.svelte";
import { Objekt } from "#lib/client/prisma.js";
import mime from "mime"
import { ChevronLeft, ChevronRight, FileText } from "radix-svelte-icons";
import { Aufnahme, BedarfsausweisWohnen, Bild, Objekt, Rechnung, Unterlage, VerbrauchsausweisGewerbe, VerbrauchsausweisWohnen } from "#lib/client/prisma.js";
import { AusstellungsTyp } from "#lib/constants.js";
import { CaretRight, Plus } from "radix-svelte-icons";
import CaretLeft from "radix-svelte-icons/src/lib/icons/CaretLeft.svelte";
export let user: BenutzerClient;
export let aufnahme: AufnahmeKomplettClient;
export let objekt: Objekt;
export let ausweis: (VerbrauchsausweisWohnen | VerbrauchsausweisGewerbe | BedarfsausweisWohnen) & {
rechnung: Rechnung,
aufnahme: Aufnahme & {
bilder: Bild[],
unterlagen: Unterlage[],
objekt: Objekt
}
};
export let benutzer: BenutzerClient;
export let page: number;
export let totalPageCount: number;
let dropdownOpen = false;
@@ -22,79 +27,68 @@
}
</script>
<h1>{objekt.adresse}, {objekt.plz} {objekt.ort}</h1>
<div class="justify-between items-center flex flex-row">
<div class="text-2xl rounded-lg gap-2 bg-grey-200 text-center">
ID: {ausweis.id}
</div>
<div class="text-2xl">{ausweis.aufnahme.objekt.adresse}, {ausweis.aufnahme.objekt.plz} {ausweis.aufnahme.objekt.ort}</div>
<!-- Funkioniert noch nicht. Man kann den neuen Ausweis nicht abspeichern. -->
<div class="relative">
<button class="button flex flex-row rounded-lg gap-2 bg-secondary text-white text-center items-center" on:click={toggleDropdown}>
Neuausstellung zu {ausweis.aufnahme.objekt.adresse} <Plus size={20}></Plus>
</button>
{#if dropdownOpen}
<div class="absolute top-15 left-0 mt-2 w-50 rounded-md shadow-lg bg-white ring-1 ring-black ring-opacity-5 z-[9999]" on:click|stopPropagation on:keydown|stopPropagation on:keyup|stopPropagation>
<div class="py-1 w-full" role="menu" aria-orientation="vertical" aria-labelledby="options-menu">
<a href="/energieausweis-erstellen/verbrauchsausweis-wohngebaeude?aufnahme_id={ausweis.aufnahme.id}&ausweis_id={ausweis.id}&typ={AusstellungsTyp.Neuausstellung}" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 w-full text-left" role="menuitem">Verbrauchsausweis<br>Wohnen Erstellen</a>
<a href="/energieausweis-erstellen/verbrauchsausweis-gewerbe?aufnahme_id={ausweis.aufnahme.id}&ausweis_id={ausweis.id}&typ={AusstellungsTyp.Neuausstellung}" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 w-full text-left" role="menuitem">Verbrauchsausweis<br>Gewerbe Erstellen</a>
<a href="/energieausweis-erstellen/bedarfsausweis-wohngebaeud e?aufnahme_id={ausweis.aufnahme.id}&ausweis_id={ausweis.id}&typ={AusstellungsTyp.Neuausstellung}" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 w-full text-left" role="menuitem">Bedarfsausweis<br>Wohnen Erstellen</a>
</div>
</div>
{/if}
</div>
</div>
<hr>
<div class="relative mb-6">
<button class="button flex flex-row rounded-lg gap-2 bg-secondary text-white text-center" on:click={toggleDropdown}>
Ausweis erstellen +
</button>
{#if dropdownOpen}
<div class="absolut mt-2 w-56 rounded-md shadow-lg bg-white ring-1 ring-black ring-opacity-5" on:click|stopPropagation on:keydown|stopPropagation on:keyup|stopPropagation>
<div class="py-1" role="menu" aria-orientation="vertical" aria-labelledby="options-menu">
<a href="/energieausweis-erstellen/verbrauchsausweis-wohngebaeude?aufnahme={aufnahme.id}" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 w-full text-left" role="menuitem">Verbrauchsausweis Wohnen Erstellen</a>
<a href="/energieausweis-erstellen/verbrauchsausweis-gewerbe?aufnahme={aufnahme.id}" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 w-full text-left" role="menuitem">Verbrauchsausweis Gewerbe Erstellen</a>
<a href="/energieausweis-erstellen/bedarfsausweis-wohngebaeude?aufnahme={aufnahme.id}" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 w-full text-left" role="menuitem">Bedarfsausweis Erstellen</a>
</div>
</div>
<div class="grid grid-cols-1 md:grid-cols-1 lg:grid-cols-1 gap-2">
<div class="flex items-center justify-between mx-80">
{#if page > 1}
<a class="p-2 rounded-lg hover:bg-gray-200 cursor-pointer" href="/dashboard/objekte?p={page - 1}">
<CaretLeft size={34}></CaretLeft>
</a>
{:else}
<div></div>
{/if}
</div>
<div class="my-4 grid grid-cols-1 md:grid-cols-1 lg:grid-cols-1 gap-2">
<div class="relative bg-gray-100 rounded-md flex justify-center items-center">
{#if aufnahme.bilder.length > 0}
<Carousel perPage={3}>
{#each aufnahme.bilder as bild, i (i)}
<img src="/bilder/{bild.id}.jpg" alt={bild.kategorie} class="max-h-[25vh] h-full w-full object-contain">
{/each}
<span slot="left-control" class="p-2.5 bg-opacity-50 bg-white block rounded-full"><ChevronLeft size={24}></ChevronLeft></span>
<span slot="right-control" class="p-2.5 bg-opacity-50 bg-white block rounded-full"><ChevronRight size={24}></ChevronRight></span>
</Carousel>
<div class="text-lg">Ausweis {page} / {totalPageCount}</div>
{#if totalPageCount > page}
<a class="p-2 rounded-lg hover:bg-gray-200 cursor-pointer" href="/dashboard/objekte?p={page + 1}">
<CaretRight size={34}></CaretRight>
</a>
{:else}
<div></div>
{/if}
</div>
{#if aufnahme.unterlagen.length > 0}
<h3 class="font-semibold">Unterlagen</h3>
<div class="grid grid-flow-col gap-4">
{#each aufnahme.unterlagen as unterlage}
<a href="/unterlagen/{unterlage.id}.{mime.getExtension(unterlage.mime)}" target="_blank" class="text-black flex flex-row items-center gap-2 bg-base-200 p-2 rounded-lg"><FileText size={32}></FileText> {unterlage.name}</a>
{/each}
</div>
{/if}
</div>
<div class="mb-4 grid grid-cols-[1fr] md:grid-cols-[6fr,15fr,6fr] lg:grid-cols-[6fr,15fr,6fr] min-h-[550px]">
<DashboardAusweis {benutzer} {ausweis} aufnahme={ausweis.aufnahme} objekt={ausweis.aufnahme.objekt} rechnung={ausweis.rechnung}></DashboardAusweis>
</div>
<div class="fixed bottom-8 right-8 flex flex-col gap-4">
<NotificationWrapper></NotificationWrapper>
</div>
<style>
/* TODO: Das kann auch als Tailwind Klasse gemacht werden */
.button {
padding: 0.5rem 1rem;
font-size: 1rem;
font-weight: 500;
cursor: pointer;
}
</style>
<div class="my-4 grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3">
{#each aufnahme.verbrauchsausweise_wohnen as ausweis}
<DashboardAusweis {benutzer} {ausweis} {aufnahme} {objekt} rechnung={ausweis.rechnung}></DashboardAusweis>
{/each}
{#each aufnahme.bedarfsausweise_wohnen as ausweis}
<DashboardAusweis {benutzer} {ausweis} {aufnahme} {objekt} rechnung={ausweis.rechnung}></DashboardAusweis>
{/each}
{#each aufnahme.verbrauchsausweise_gewerbe as ausweis}
<DashboardAusweis {benutzer} {ausweis} {aufnahme} {objekt} rechnung={ausweis.rechnung}></DashboardAusweis>
{/each}
{#each aufnahme.geg_nachweise_wohnen as nachweis}
<DashboardAusweis {benutzer} ausweis={nachweis} {aufnahme} {objekt} rechnung={nachweis.rechnung}></DashboardAusweis>
{/each}
{#each aufnahme.geg_nachweise_gewerbe as nachweis}
<DashboardAusweis {benutzer} ausweis={nachweis} {aufnahme} {objekt} rechnung={nachweis.rechnung}></DashboardAusweis>
{/each}
{#each aufnahme.bedarfsausweise_gewerbe as nachweis}
<DashboardAusweis {benutzer} ausweis={nachweis} {aufnahme} {objekt} rechnung={nachweis.rechnung}></DashboardAusweis>
{/each}
</div>
<div class="fixed bottom-8 right-8 flex flex-col gap-4">
<NotificationWrapper></NotificationWrapper>
</div>
</style>

View File

@@ -1,126 +0,0 @@
<script lang="ts">
import AusweisPruefenBox from "#components/AusweisPruefenBox.svelte";
import NotificationProvider from "#components/NotificationProvider/NotificationProvider.svelte";
import { endEnergieVerbrauchVerbrauchsausweis_2016 } from "#lib/Berechnungen/VerbrauchsausweisWohnen/VerbrauchsausweisWohnen_2016.js";
import AusweisPruefenNotification from "#components/AusweisPruefenNotification.svelte";
import DashboardAusweisSkeleton from "#components/Dashboard/DashboardAusweisSkeleton.svelte"
import { Event } from "#lib/client/prisma";
import Pagination from "#components/Pagination.svelte";
import { api } from "astro-typesafe-api/client";
import Cookies from "js-cookie"
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js"
import AusweisePruefenFilter from "#components/Dashboard/AusweisePruefenFilter.svelte";
import { z, ZodTypeAny } from "zod";
import { filterAusweise } from "#lib/filters.js";
export let page: number;
export let totalPages: number;
let filters: { name: keyof z.infer<typeof filterAusweise>, type: ZodTypeAny, value: any }[] = []
</script>
<div class="flex flex-col mb-4">
<AusweisePruefenFilter bind:filters={filters}></AusweisePruefenFilter>
</div>
<div class="gap-4 flex flex-col">
{#await api.ausweise.GET.fetch({
limit: 10,
skip: (page - 1) * 10,
filters: filters.reduce((acc, filter) => {
acc[filter.name] = filter.value
return acc
}, {})
}, {
headers: {
Authorization: `Bearer ${Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME)}`
}
})}
<DashboardAusweisSkeleton></DashboardAusweisSkeleton>
{:then ausweise}
{#each ausweise as { ausweis, objekt, aufnahme, bilder, events }}
{#await endEnergieVerbrauchVerbrauchsausweis_2016(ausweis, aufnahme, objekt)}
<div class="rounded-lg border w-full h-20 p-2.5 gap-4 flex flex-row items-center">
<div class="w-1/12 h-full flex flex-col gap-2">
<div class="skeleton w-8 h-8 rounded-full"></div>
</div>
<div class="w-1/12 h-full flex flex-col gap-2">
<div class="skeleton w-full h-4"></div>
<div class="skeleton w-full h-4"></div>
</div>
<div class="w-1/12 h-full flex flex-col gap-2">
<div class="skeleton w-full h-4"></div>
<div class="skeleton w-full h-4"></div>
</div>
<div class="w-1/12 h-full flex flex-col gap-2">
<div class="skeleton w-full h-4"></div>
<div class="skeleton w-full h-4"></div>
</div>
<div class="w-1/12 h-full flex flex-col gap-2">
<div class="skeleton w-full h-4"></div>
<div class="skeleton w-full h-4"></div>
</div>
<div class="w-1/12 h-full flex flex-col gap-2">
<div class="skeleton w-full h-4"></div>
</div>
<div class="w-1/12 h-full flex flex-col gap-2">
<div class="skeleton w-full h-4"></div>
<div class="skeleton w-full h-4"></div>
</div>
<div class="w-1/12 h-full flex flex-col gap-2">
<div class="skeleton w-full h-4"></div>
</div>
<div class="w-1/12 h-full flex flex-col gap-2">
<div class="skeleton w-full h-4"></div>
<div class="skeleton w-full h-4"></div>
</div>
<div class="w-1/12 h-full flex flex-col gap-2">
<div class="skeleton w-full h-4"></div>
</div>
<div class="w-1/12 h-full flex flex-col gap-2">
<div class="skeleton w-full h-4"></div>
</div>
<div class="w-1/12 h-full flex flex-col gap-2">
<div class="skeleton w-full h-4"></div>
<div class="skeleton w-full h-4"></div>
</div>
<div class="w-1/12 h-full flex flex-col gap-2">
<div class="skeleton w-full h-4"></div>
<div class="skeleton w-full h-4"></div>
</div>
<div class="w-1/12 h-full flex flex-col gap-2">
<div class="skeleton w-full h-4"></div>
<div class="skeleton w-full h-4"></div>
</div>
<div class="w-1/12 h-full flex flex-col gap-2">
<div class="skeleton w-full h-4"></div>
<div class="skeleton w-full h-4"></div>
</div>
<div class="w-1/12 h-full flex flex-col gap-2">
<div class="skeleton w-full h-4"></div>
<div class="skeleton w-full h-4"></div>
</div>
<div class="skeleton w-4 h-4"></div>
<div class="skeleton w-4 h-4"></div>
<div class="skeleton w-4 h-4"></div>
<div class="skeleton w-4 h-4"></div>
<div class="skeleton w-4 h-4"></div>
<div class="skeleton w-4 h-4"></div>
<div class="skeleton w-4 h-4"></div>
<div class="skeleton w-4 h-4"></div>
<div class="skeleton w-4 h-4"></div>
<div class="skeleton w-4 h-4"></div>
</div>
{:then calculations}
<AusweisPruefenBox {ausweis} {aufnahme} {objekt} {bilder} {events} {calculations}></AusweisPruefenBox>
{/await}
{/each}
{/await}
</div>
<Pagination pages={totalPages} current={page} prev="/dashboard/admin/ausweise-pruefen/{page - 1}" next="/dashboard/admin/ausweise-pruefen/{page + 1}"></Pagination>
<div class="fixed bottom-8 right-8 flex flex-col gap-4">
<NotificationProvider component={AusweisPruefenNotification}></NotificationProvider>
</div>

View File

@@ -71,36 +71,6 @@
<Person size={22} />
Profil
</Tab>
<Tab>
<Reader width={22} height={22} />
Ausweise
</Tab>
<Tab>
<EnvelopeClosed width={22} height={22} />
Kontakt
</Tab>
<li>
<details>
<summary class="tab w-full outline-0 hover:outline-0">
<Cube width={22} height={22} />
Services</summary
>
<ul>
<li>
<Tab>
<EnvelopeClosed width={22} height={22} />
Kontakt
</Tab>
</li>
<li>
<Tab>
<EnvelopeClosed width={22} height={22} />
Kontakt
</Tab>
</li>
</ul>
</details>
</li>
</TabList>
<div
class="border border-base-300 w-full h-full rounded-lg bg-base-200 p-8"

View File

@@ -14,6 +14,7 @@
import { API_ACCESS_TOKEN_COOKIE_NAME } from "#lib/constants.js";
import Pagination from "#components/Pagination.svelte";
import { Enums, Objekt } from "#lib/client/prisma.js";
export let user: BenutzerClient;
export let objekte: ObjektKomplettClient[];
@@ -94,15 +95,10 @@
<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">
<input type="text" bind:value={id} name="id" placeholder="ID">
<button class="button text-sm">Suchen</button>
</form>
{/if}
<!-- <div class="relative mb-6">
<button class="button" on:click={() => {
@@ -116,7 +112,7 @@
{/each}
</div>
<Pagination pages={totalPages} current={page} prev="/dashboard/objekte/{page - 1}" next="/dashboard/objekte/{page + 1}"></Pagination>
<Pagination pages={totalPages} current={page} prev="/dashboard/objekte?p={page - 1}" next="/dashboard/objekte?p={page + 1}"></Pagination>
<Overlay bind:hidden={objektOverlayHidden}>

View File

@@ -30,12 +30,13 @@
import InputLabel from "#components/labels/InputLabel.svelte";
import PlzSuche from "#components/PlzSuche.svelte";
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 { endEnergieVerbrauchVerbrauchsausweisGewerbe_2016_Client } from "#lib/Berechnungen/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbe_2016_Client.js";
import { benutzerSpeichern } from "#client/lib/speichern.js";
import { exclude } from "#lib/exclude.js";
export let user: Partial<BenutzerClient>;
export let impersonatedUser: Partial<BenutzerClient> | null = null;
export let ausweis: VerbrauchsausweisWohnenClient | VerbrauchsausweisGewerbe | BedarfsausweisWohnen;
export let aufnahme: AufnahmeClient;
export let objekt: ObjektClient;
@@ -61,6 +62,10 @@
ort = rechnung?.ort || localStorage.getItem("kundendaten.ort") || user.ort || "";
zusatzzeile = rechnung?.zusatzzeile || localStorage.getItem("kundendaten.zusatzzeile") || ""
telefon = rechnung?.telefon || localStorage.getItem("kundendaten.telefon") || user.telefon || "";
} else if (impersonatedUser) {
vorname = impersonatedUser.vorname || "";
name = impersonatedUser.name || "";
telefon = impersonatedUser.telefon || "";
}
let abweichende_versand_adresse = JSON.parse(localStorage.getItem("kundendaten.abweichende_versand_adresse") || "false")
@@ -106,25 +111,25 @@
name: "Qualitätsdruck per Post (zusätzlich zur PDF Version)",
id: Enums.Service.Qualitaetsdruck,
price: 9,
selected: false,
selected: rechnung ? rechnung.services.indexOf(Enums.Service.Qualitaetsdruck) >= 0 : false,
},
{
name: "Aushang (für öffentliche Gebäude gesetzlich vorgeschrieben)",
id: Enums.Service.Aushang,
price: 10,
selected: false,
selected: rechnung ? rechnung.services.indexOf(Enums.Service.Aushang) >= 0 : false,
},
{
name: "Same Day Service - Bestellung Werktags vor <b>12:00&nbsp;Uhr</b><br>Ausstellung bis <b>18:00&nbsp;Uhr</b> am gleichen Tag",
id: Enums.Service.SameDay,
price: 29,
selected: false,
selected: rechnung ? rechnung.services.indexOf(Enums.Service.SameDay) >= 0 : false,
},
{
name: "Telefonische Energie-Effizienzberatung",
id: Enums.Service.Telefonberatung,
price: 75,
selected: false,
selected: rechnung ? rechnung.services.indexOf(Enums.Service.Telefonberatung) >= 0 : false,
},
];
@@ -251,6 +256,19 @@
} else {
result = await ausweisSpeichern(ausweis, objekt, aufnahme, bilder, unterlagen, ausweisart)
}
let resultUser: Awaited<ReturnType<typeof benutzerSpeichern>> | Awaited<ReturnType<typeof benutzerSpeichern>> | null = null;
const { passwort, ...baseUser } = impersonatedUser ?? user;
const benutzerObjekt = {
...baseUser,
name,
vorname,
telefon
};
resultUser = await benutzerSpeichern(benutzerObjekt);
} catch(e) {
addNotification({
dismissable: true,
@@ -267,7 +285,7 @@
);
localStorage.clear();
window.location.href = `/speichern-erfolgreich?id=${ausweis.id}`
window.location.href = `/dashboard/objekte/${ausweis.id}`
}
}
@@ -314,6 +332,18 @@
}
}
let resultUser: Awaited<ReturnType<typeof benutzerSpeichern>> | Awaited<ReturnType<typeof benutzerSpeichern>> | null = null;
const { passwort, ...baseUser } = impersonatedUser ?? user;
const benutzerObjekt = {
...baseUser,
name,
vorname,
telefon
};
resultUser = await benutzerSpeichern(benutzerObjekt);
if (rechnung && rechnung.status === "paid") {
window.location.href = "/dashboard"
return;
@@ -1016,7 +1046,8 @@ grid-cols-3 sm:grid-cols-5 justify-around justify-items-center items-center"
{#if ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen}
<!-- 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">
<input type="checkbox" name="pruefpunkt_anteil_warmwasser" bind:checked={ausweis.pruefpunkt_anteil_warmwasser} required/>
<div class="text-left">
@@ -1024,6 +1055,7 @@ grid-cols-3 sm:grid-cols-5 justify-around justify-items-center items-center"
</div>
</div>
{/if}
{/if}
{/if}
{#if ausweisart === Enums.Ausweisart.BedarfsausweisWohnen}
<!-- Zusätzlich beim Bedarfsausweis [altes System: $ausweis->wohnflaeche < $ausweis->energetische_nutzfläche] -->
@@ -1103,7 +1135,7 @@ sm:grid-cols-[min-content_min-content_min-content] sm:justify-self-end sm:mt-8"
{#if user.rolle === Enums.BenutzerRolle.ADMIN}
<button class="button text-sm" on:click={() => {
localStorage.clear()
window.location.href = "/dashboard/objekte/1"
window.location.href = "/dashboard/objekte?p=1"
}}>Zurück zum Dashboard</button>
{/if}
</div>

View File

@@ -47,7 +47,7 @@
export let ausweistyp: Enums.AusweisTyp;
export let aufnahme: AufnahmeClient;
export let bilder: BildClient[];
export let id: string | null;
export let ausweis_id: string | null;
export let partner_code: string;
export let loadFromDatabase: boolean = false;
@@ -63,6 +63,7 @@
const localStorageAusweis = localStorage.getItem("verbrauchsausweis-gewerbe.ausweis");
if (localStorageAusweis) {
ausweis = JSON.parse(localStorageAusweis)
ausweis.ausweistyp = ausweistyp;
}
const localStorageAufnahme = localStorage.getItem("verbrauchsausweis-gewerbe.aufnahme");
@@ -128,6 +129,7 @@
bind:blockLocalStorageSync
ausweisart={Enums.Ausweisart.VerbrauchsausweisGewerbe}
showWeiter={false}
{ausweistyp}
{form}
{partner_code}
{skala}
@@ -245,6 +247,7 @@
bind:blockLocalStorageSync
ausweisart={Enums.Ausweisart.VerbrauchsausweisGewerbe}
showWeiter={true}
{ausweistyp}
{form}
{partner_code}
{skala}

View File

@@ -55,7 +55,7 @@
export let user: BenutzerClient | null;
export let bilder: BildClient[];
export let ausweistyp: Enums.AusweisTyp;
export let id: string | null;
export let ausweis_id: string | null;
export let partner_code: string;
export let loadFromDatabase: boolean = false;
@@ -91,11 +91,13 @@
let speichernOverlayHidden = true;
$: {
if (!blockLocalStorageSync) {
localStorage.setItem("verbrauchsausweis-wohnen.ausweis", JSON.stringify(ausweis))
localStorage.setItem("verbrauchsausweis-wohnen.aufnahme", JSON.stringify(aufnahme))
localStorage.setItem("verbrauchsausweis-wohnen.objekt", JSON.stringify(objekt))
localStorage.setItem("verbrauchsausweis-wohnen.bilder", JSON.stringify(bilder))
localStorage.setItem("verbrauchsausweis-wohnen.updated_at", moment().toString())
}
}
$: {
@@ -113,6 +115,7 @@
const ausweisart = Enums.Ausweisart.VerbrauchsausweisWohnen
const anliegen = "Energieausweis erstellen";
let blockLocalStorageSync: boolean = false;
let form: HTMLFormElement;
let skala: HTMLDivElement;
@@ -158,8 +161,10 @@ let skala: HTMLDivElement;
bind:user
bind:objekt
bind:aufnahme
bind:blockLocalStorageSync
ausweisart={Enums.Ausweisart.VerbrauchsausweisWohnen}
showWeiter={false}
{ausweistyp}
{partner_code}
{form}
{skala}
@@ -268,6 +273,7 @@ let skala: HTMLDivElement;
bind:user
bind:objekt
bind:aufnahme
bind:blockLocalStorageSync
{form}
ausweisart={Enums.Ausweisart.VerbrauchsausweisWohnen}
{ausweistyp}

View File

@@ -1,5 +1,5 @@
---
import AusweisLayout from "#layouts/AusweisLayoutDaten_partner.astro";
import AusweisLayout from "#layouts/AusweisLayoutDatenPartner.astro";
import VerbrauchsausweisWohnenModule from "#modules/VerbrauchsausweisWohnen/VerbrauchsausweisWohnenModule.svelte";
import { AufnahmeClient, BildClient, ObjektClient, UploadedGebaeudeBild, VerbrauchsausweisWohnenClient } from "#components/Ausweis/types";
import { Aufnahme, BedarfsausweisGewerbe, Bild, Enums, Objekt, Unterlage, VerbrauchsausweisWohnen } from "#lib/server/prisma";

View File

@@ -1,5 +1,5 @@
---
import AusweisLayout from "#layouts/AusweisLayoutDaten_partner.astro";
import AusweisLayout from "#layouts/AusweisLayoutDatenPartner.astro";
import ProduktUebersichtBedarfsausweisGewerbe from "#components/design/content/ProduktUebersichtBedarfsausweisGewerbe.svelte";
---

View File

@@ -1,5 +1,5 @@
---
import AusweisLayout from "#layouts/AusweisLayoutDaten_partner.astro";
import AusweisLayout from "#layouts/AusweisLayoutDatenPartner.astro";
import { Aufnahme, Bild, Enums, GEGNachweisGewerbe, GEGNachweisWohnen, Objekt, Unterlage } from "#lib/server/prisma";
import { getAufnahme, getObjekt, getBilder, getGEGNachweisWohnen, getUnterlagen, getGEGNachweisGewerbe } from "#lib/server/db";
import { getCurrentUser } from "#lib/server/user";

View File

@@ -1,5 +1,5 @@
---
import AusweisLayout from "#layouts/AusweisLayoutDaten_partner.astro";
import AusweisLayout from "#layouts/AusweisLayoutDatenPartner.astro";
import ProduktUebersichtGEGNachweisGewerbe from "#components/design/content/ProduktUebersichtGEGNachweisGewerbe.svelte";
---

View File

@@ -1,5 +1,5 @@
---
import AusweisLayout from "#layouts/AusweisLayoutDaten_partner.astro";
import AusweisLayout from "#layouts/AusweisLayoutDatenPartner.astro";
import GEGNachweisWohnenModule from "#modules/angebot-anfragen/GEGNachweisWohnenModule.svelte";
import { Aufnahme, Bild, Enums, GEGNachweisWohnen, Objekt, Unterlage } from "#lib/server/prisma";
import { getAufnahme, getObjekt, getBilder, getGEGNachweisWohnen, getUnterlagen } from "#lib/server/db";

View File

@@ -1,5 +1,5 @@
---
import AusweisLayout from "#layouts/AusweisLayoutDaten_partner.astro";
import AusweisLayout from "#layouts/AusweisLayoutDatenPartner.astro";
import ProduktUebersichtGEGNachweisWohnen from "#components/design/content/ProduktUebersichtGEGNachweisWohnen.svelte";
---

View File

@@ -0,0 +1,265 @@
---
import AusweisLayoutDatenPartner from "#layouts/AusweisLayoutDatenPartner.astro";
import VerbrauchsausweisWohnenModule from "#modules/VerbrauchsausweisWohnen/VerbrauchsausweisWohnenModule.svelte";
import {
Aufnahme,
BedarfsausweisWohnen,
Bild,
Enums,
Objekt,
prisma,
VerbrauchsausweisGewerbe,
VerbrauchsausweisWohnen,
} from "#lib/server/prisma";
import {
getAufnahme,
getBedarfsausweisWohnen,
getBilder,
getObjekt,
getVerbrauchsausweisGewerbe,
getVerbrauchsausweisWohnen,
} from "#lib/server/db";
import { getCurrentUser } from "#lib/server/user";
import { AusstellungsTyp } from "#lib/constants";
import VerbrauchsausweisGewerbeModule from "#modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte";
import BedarfsausweisWohnenModule from "#modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte";
import { getPrismaAusweisAdapter } from "#lib/server/ausweis";
const ausweisart = Astro.params.ausweisart as string;
const partner_code = Astro.params.partner as string;
if (
ausweisart !== "verbrauchsausweis-wohngebaeude" &&
ausweisart !== "verbrauchsausweis-gewerbe" &&
ausweisart !== "bedarfsausweis-wohngebaeude"
) {
return Astro.redirect("/404");
}
const user = await getCurrentUser(Astro);
const ausweis_id = Astro.url.searchParams.get("ausweis_id");
const typ = Astro.url.searchParams.get("typ") as AusstellungsTyp;
let ausweistyp =
(Astro.url.searchParams.get("ausweistyp") as Enums.AusweisTyp) ||
Enums.AusweisTyp.Standard;
let ausweis:
| VerbrauchsausweisWohnen
| VerbrauchsausweisGewerbe
| BedarfsausweisWohnen
| null = {} as VerbrauchsausweisWohnen | VerbrauchsausweisGewerbe | BedarfsausweisWohnen;
let aufnahme: Aufnahme | null = {} as Aufnahme;
let objekt: Objekt | null = {} as Objekt;
let bilder: Bild[] = [];
let loadFromDatabase = false;
if (typ === AusstellungsTyp.Neuausstellung) {
if (!user) {
return Astro.redirect(`/auth/login?redirect=${Astro.url.toString()}`);
}
if (!ausweis_id) {
return Astro.redirect("/400");
}
const adapter = getPrismaAusweisAdapter(ausweis_id)
ausweis = await adapter?.findUnique({
where: {
id: ausweis_id
}
})
aufnahme = await prisma.aufnahme.findUnique({
where: {
id: ausweis?.aufnahme_id,
},
});
objekt = await prisma.objekt.findUnique({
where: {
id: aufnahme?.objekt_id,
},
});
if (
!ausweis ||
!aufnahme ||
!objekt ||
((ausweis.benutzer_id !== user.id ||
aufnahme.benutzer_id !== user.id ||
objekt.benutzer_id !== user.id) && user.rolle !== Enums.BenutzerRolle.ADMIN)
) {
return Astro.redirect("/405");
}
ausweis.id = null;
aufnahme.id = null;
delete aufnahme.erstellungsdatum;
ausweis.created_at = new Date()
ausweis.updated_at = new Date();
ausweis.alte_ausweis_id = null;
ausweis.ausgestellt = false;
ausweis.bestellt = false;
ausweis.kontrolldatei_angefragt = false;
ausweis.energieeffizienzklasse = null;
ausweis.ausstellungsdatum = null;
ausweis.ausweistyp = Enums.AusweisTyp.Standard;
ausweis.zurueckgestellt = false;
ausweis.storniert = false;
ausweis.rechnung_id = null;
ausweis.registriernummer = null;
// Die Daten sollen nicht aus dem localStorage genommen werden sonst kann es vorkommen, dass die ID noch besteht und der Vorgang nicht neu angelegt wird.
loadFromDatabase = true;
} else if (typ === AusstellungsTyp.Speichern) {
if (!user) {
return Astro.redirect(`/auth/login?redirect=${Astro.url.toString()}`);
}
if (!ausweis_id) {
return Astro.redirect("/400");
}
if (ausweisart === "verbrauchsausweis-wohngebaeude") {
ausweis = await getVerbrauchsausweisWohnen(ausweis_id);
} else if (ausweisart === "verbrauchsausweis-gewerbe") {
ausweis = await getVerbrauchsausweisGewerbe(ausweis_id);
} else {
ausweis = await getBedarfsausweisWohnen(ausweis_id);
}
ausweistyp = ausweis.ausweistyp;
aufnahme = (await getAufnahme(ausweis.aufnahme_id)) as Aufnahme;
objekt = (await getObjekt(aufnahme.objekt_id)) as Objekt;
if (
!ausweis ||
!aufnahme ||
!objekt ||
((ausweis.benutzer_id !== user.id ||
aufnahme.benutzer_id !== user.id ||
objekt.benutzer_id !== user.id) && user.rolle !== Enums.BenutzerRolle.ADMIN)
) {
return Astro.redirect("/405");
}
bilder = await getBilder(aufnahme.id);
loadFromDatabase = true;
} else if (typ === AusstellungsTyp.Alternativdokument) {
if (!user) {
return Astro.redirect(`/auth/login?redirect=${Astro.url.toString()}`);
}
if (!ausweis_id) {
return Astro.redirect("/400");
}
const adapter = getPrismaAusweisAdapter(ausweis_id)
ausweis = await adapter?.findUnique({
where: {
id: ausweis_id
}
})
aufnahme = await prisma.aufnahme.findUnique({
where: {
id: ausweis?.aufnahme_id,
},
});
objekt = await prisma.objekt.findUnique({
where: {
id: aufnahme?.objekt_id,
},
});
if (
!ausweis ||
!aufnahme ||
!objekt ||
((ausweis.benutzer_id !== user.id ||
aufnahme.benutzer_id !== user.id ||
objekt.benutzer_id !== user.id) && user.rolle !== Enums.BenutzerRolle.ADMIN)
) {
return Astro.redirect("/405");
}
ausweis.id = null;
delete aufnahme.erstellungsdatum;
ausweis.created_at = new Date()
ausweis.updated_at = new Date();
ausweis.alte_ausweis_id = null;
ausweis.ausgestellt = false;
ausweis.bestellt = false;
ausweis.kontrolldatei_angefragt = false;
ausweis.energieeffizienzklasse = null;
ausweis.ausstellungsdatum = null;
ausweis.ausweistyp = Enums.AusweisTyp.Standard;
ausweis.zurueckgestellt = false;
ausweis.storniert = false;
ausweis.rechnung_id = null;
ausweis.registriernummer = null;
// Die Daten sollen nicht aus dem localStorage genommen werden sonst kann es vorkommen, dass die ID noch besteht und der Vorgang nicht neu angelegt wird.
loadFromDatabase = true;
}
---
<AusweisLayoutDatenPartner title="Verbrauchsausweis erstellen" tab={
ausweisart === "verbrauchsausweis-wohngebaeude" ? 0 :
ausweisart === "verbrauchsausweis-gewerbe" ? 1 :
ausweisart === "bedarfsausweis-wohngebaeude" ? 2 : 0
}>
{
ausweisart === "verbrauchsausweis-wohngebaeude" && (
<VerbrauchsausweisWohnenModule
client:only
{ausweis}
{objekt}
{aufnahme}
{bilder}
{ausweis_id}
{ausweistyp}
{user}
{loadFromDatabase}
{partner_code}
/>
)
}
{
ausweisart === "verbrauchsausweis-gewerbe" && (
<VerbrauchsausweisGewerbeModule
client:only
{ausweis}
{objekt}
{aufnahme}
{bilder}
{ausweistyp}
{user}
{ausweis_id}
{loadFromDatabase}
{partner_code}
/>
)
}
{
ausweisart === "bedarfsausweis-wohngebaeude" && (
<BedarfsausweisWohnenModule
client:only
{ausweis}
{objekt}
{aufnahme}
{bilder}
{ausweistyp}
{ausweis_id}
{user}
{loadFromDatabase}
{partner_code}
/>
)
}
</AusweisLayoutDatenPartner>

View File

@@ -0,0 +1,24 @@
---
import Layout from "#layouts/Layout.astro";
import ProduktUebersichtBedarfsausweisWohnen from "#components/design/content/ProduktUebersichtBedarfsausweisWohnen.svelte";
import ProduktUebersichtVerbrauchsausweisGewerbe from "#components/design/content/ProduktUebersichtVerbrauchsausweisGewerbe.svelte";
import ProduktUebersichtVerbrauchsausweisWohnen from "#components/design/content/ProduktUebersichtVerbrauchsausweisWohnen.svelte";
const ausweisart = Astro.params.ausweisart;
const partner = Astro.params.partner;
if (ausweisart !== "verbrauchsausweis-wohngebaeude" && ausweisart !== "verbrauchsausweis-gewerbe" && ausweisart !== "bedarfsausweis-wohngebaeude") {
return Astro.redirect("/404")
}
let title: string = "";
if (ausweisart === "verbrauchsausweis-wohngebaeude") title = "Verbrauchsausweis Wohngebäude Produktübersicht";
if (ausweisart === "verbrauchsausweis-gewerbe") title = "Verbrauchsausweis Gewerbe Produktübersicht";
if (ausweisart === "bedarfsausweis-wohngebaeude") title = "Bedarfsausweis Wohngebäude Produktübersicht";
---
<Layout {title}>
{ausweisart === "verbrauchsausweis-wohngebaeude" && <ProduktUebersichtVerbrauchsausweisWohnen ref={`/${partner}`} />}
{ausweisart === "verbrauchsausweis-gewerbe" && <ProduktUebersichtVerbrauchsausweisGewerbe ref={`/${partner}`} />}
{ausweisart === "bedarfsausweis-wohngebaeude" && <ProduktUebersichtBedarfsausweisWohnen ref={`/${partner}`} />}
</Layout>

View File

@@ -1,91 +0,0 @@
---
import AusweisLayout from "#layouts/AusweisLayoutDaten.astro";
import BedarfsausweisWohnenModule from "#modules/BedarfsausweisWohnen/BedarfsausweisWohnenModule.svelte";
import { Aufnahme, BedarfsausweisWohnen, Bild, Enums, Objekt } from "#lib/server/prisma";
import { getAufnahme, getObjekt, getBilder, getBedarfsausweisWohnen } from "#lib/server/db";
import { getCurrentUser } from "#lib/server/user";
const id = Astro.url.searchParams.get("id");
const aufnahme_id = Astro.url.searchParams.get("aufnahme")
let ausweistyp = Astro.url.searchParams.get("ausweistyp") as Enums.AusweisTyp || Enums.AusweisTyp.Standard;
const partner_code = Astro.params.partner as string;
let ausweis: BedarfsausweisWohnen = {} as BedarfsausweisWohnen;
let aufnahme: Aufnahme = {} as Aufnahme;
let objekt: Objekt = {} as Objekt;
let bilder: Bild[] = []
const user = await getCurrentUser(Astro)
if (id) {
if (!user) {
return Astro.redirect(
`/auth/login?redirect=${Astro.url.toString()}`
);
}
ausweis = await getBedarfsausweisWohnen(id) as BedarfsausweisWohnen
ausweistyp = ausweis.ausweistyp;
if (!ausweis || (ausweis.benutzer_id !== user.id && user.rolle !== Enums.BenutzerRolle.ADMIN)) {
// Der Ausweis scheint nicht zu existieren.
// Wir leiten auf die generische Ausweisseite ohne ID weiter.
return Astro.redirect(
"/energieausweis-erstellen/bedarfsausweis-wohngebaeude"
);
}
aufnahme = await getAufnahme(ausweis.aufnahme_id) as Aufnahme
if (!aufnahme) {
// Die Aufnahme existiert nicht, das sollte eigentlich nicht passieren aber so können wir nicht fortfahren.
return Astro.redirect(
"/energieausweis-erstellen/bedarfsausweis-wohngebaeude"
);
}
objekt = await getObjekt(aufnahme.objekt_id) as Objekt
if (!objekt) {
// Das Objekt existiert nicht, das sollte eigentlich nicht passieren aber so können wir nicht fortfahren.
return Astro.redirect(
"/energieausweis-erstellen/bedarfsausweis-wohngebaeude"
);
}
bilder = await getBilder(aufnahme.id);
} else if (aufnahme_id) {
if (!user) {
return Astro.redirect(
`/auth/login?redirect=${Astro.url.toString()}`
);
}
aufnahme = await getAufnahme(ausweis.aufnahme_id) as Aufnahme
if (!aufnahme) {
// Die Aufnahme existiert wohl nicht.
return Astro.redirect(
"/energieausweis-erstellen/bedarfsausweis-wohngebaeude"
);
}
objekt = await getObjekt(aufnahme.objekt_id) as Objekt
if (!objekt) {
// Das Objekt existiert nicht.
return Astro.redirect(
"/energieausweis-erstellen/bedarfsausweis-wohngebaeude"
);
}
}
console.log(ausweistyp);
---
<AusweisLayout title="Bedarfsausweis erstellen | IBCornelsen">
<BedarfsausweisWohnenModule client:only {ausweis} {objekt} {aufnahme} {bilder} {ausweistyp} {id} {user} loadFromDatabase={id !== null} {partner_code}></BedarfsausweisWohnenModule>
</AusweisLayout>

View File

@@ -1,13 +0,0 @@
---
import AusweisLayout from "#layouts/AusweisLayoutDaten_partner.astro";
import ProduktUebersichtBedarfsausweisWohnen from "#components/design/content/ProduktUebersichtBedarfsausweisWohnen.svelte";
---
<AusweisLayout title="Bedarfsausweis Wohngebäude Produktübersicht">
<div class="mx-auto my-8" style="width:85%">
<ProduktUebersichtBedarfsausweisWohnen ref="/immowelt"></ProduktUebersichtBedarfsausweisWohnen>
</div>
</AusweisLayout>

View File

@@ -1,87 +0,0 @@
---
import AusweisLayout from "#layouts/AusweisLayoutDaten.astro";
import { AufnahmeClient, ObjektClient, BildClient, VerbrauchsausweisGewerbeClient } from "#components/Ausweis/types";
import VerbrauchsausweisGewerbeModule from "#modules/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeModule.svelte";
import { Aufnahme, Enums, Objekt, VerbrauchsausweisGewerbe } from "#lib/server/prisma";
import { getAufnahme, getObjekt, getBilder, getVerbrauchsausweisGewerbe } from "#lib/server/db";
import { getCurrentUser } from "#lib/server/user";
const id = Astro.url.searchParams.get("id");
const aufnahme_id = Astro.url.searchParams.get("aufnahme")
let ausweistyp = Astro.url.searchParams.get("ausweistyp") as Enums.AusweisTyp || Enums.AusweisTyp.Standard;
const partner_code = Astro.params.partner as string;
let ausweis: VerbrauchsausweisGewerbeClient = {} as VerbrauchsausweisGewerbeClient;
let aufnahme: AufnahmeClient = {} as AufnahmeClient;
let objekt: ObjektClient = {} as ObjektClient;
let bilder: BildClient[] = []
const user = await getCurrentUser(Astro)
if (id) {
if (!user) {
return Astro.redirect(
`/auth/login?redirect=${Astro.url.toString()}`
);
}
ausweis = await getVerbrauchsausweisGewerbe(id) as VerbrauchsausweisGewerbe
ausweistyp = ausweis.ausweistyp;
if (!ausweis || (ausweis.benutzer_id !== user.id && user.rolle !== Enums.BenutzerRolle.ADMIN)) {
// Der Ausweis scheint nicht zu existieren.
// Wir leiten auf die generische Ausweisseite ohne ID weiter.
return Astro.redirect(
"/energieausweis-erstellen/verbrauchsausweis-gewerbe"
);
}
aufnahme = await getAufnahme(ausweis.aufnahme_id) as Aufnahme
if (!aufnahme) {
// Die Aufnahme existiert nicht, das sollte eigentlich nicht passieren aber so können wir nicht fortfahren.
return Astro.redirect(
"/energieausweis-erstellen/verbrauchsausweis-gewerbe"
);
}
objekt = await getObjekt(aufnahme.objekt_id) as Objekt
if (!objekt) {
// Das Objekt existiert nicht, das sollte eigentlich nicht passieren aber so können wir nicht fortfahren.
return Astro.redirect(
"/energieausweis-erstellen/verbrauchsausweis-gewerbe"
);
}
bilder = await getBilder(aufnahme.id);
} else if (aufnahme_id) {
if (!user) {
return Astro.redirect(
`/auth/login?redirect=${Astro.url.toString()}`
);
}
aufnahme = await getAufnahme(ausweis.aufnahme_id) as Aufnahme
if (!aufnahme) {
// Die Aufnahme existiert wohl nicht.
return Astro.redirect(
"/energieausweis-erstellen/verbrauchsausweis-gewerbe"
);
}
objekt = await getObjekt(aufnahme.objekt_id) as Objekt
if (!objekt) {
// Das Objekt existiert nicht.
return Astro.redirect(
"/energieausweis-erstellen/verbrauchsausweis-gewerbe"
);
}
}
---
<AusweisLayout title="Verbrauchsausweis Gewerbe erstellen | IBCornelsen">
<VerbrauchsausweisGewerbeModule client:only {ausweis} {objekt} {aufnahme} {bilder} {ausweistyp} {user} {id} {partner_code} loadFromDatabase={id !== null}/>
</AusweisLayout>

View File

@@ -1,14 +0,0 @@
---
import AusweisLayout from "#layouts/AusweisLayoutDaten_partner.astro";
import ProduktUebersichtVerbrauchsausweisGewerbe from "#components/design/content/ProduktUebersichtVerbrauchsausweisGewerbe.svelte";
---
<AusweisLayout title="Verbrauchsausweis Gewerbe Produktübersicht">
<div class="mx-auto my-8" style="width:85%">
<ProduktUebersichtVerbrauchsausweisGewerbe ref="/immowelt">
</ProduktUebersichtVerbrauchsausweisGewerbe>
</div>
</AusweisLayout>

View File

@@ -1,87 +0,0 @@
---
import AusweisLayout from "#layouts/AusweisLayoutDaten_partner.astro";
import VerbrauchsausweisWohnenModule from "#modules/VerbrauchsausweisWohnen/VerbrauchsausweisWohnenModule.svelte";
import { Aufnahme, Bild, Enums, Objekt, VerbrauchsausweisWohnen } from "#lib/server/prisma";
import { getVerbrauchsausweisWohnen, getAufnahme, getObjekt, getBilder } from "#lib/server/db";
import { getCurrentUser } from "#lib/server/user";
const id = Astro.url.searchParams.get("id");
const aufnahme_id = Astro.url.searchParams.get("aufnahme")
let ausweistyp = Astro.url.searchParams.get("ausweistyp") as Enums.AusweisTyp || Enums.AusweisTyp.Standard;
const partner_code = Astro.params.partner as string;
let ausweis: VerbrauchsausweisWohnen = {} as VerbrauchsausweisWohnen;
let aufnahme: Aufnahme = {} as Aufnahme;
let objekt: Objekt = {} as Objekt;
let bilder: Bild[] = []
const user = await getCurrentUser(Astro)
if (id) {
if (!user) {
return Astro.redirect(
`/auth/login?redirect=${Astro.url.toString()}`
);
}
ausweis = await getVerbrauchsausweisWohnen(id) as VerbrauchsausweisWohnen
ausweistyp = ausweis.ausweistyp;
if (!ausweis || (ausweis.benutzer_id !== user.id && user.rolle !== Enums.BenutzerRolle.ADMIN)) {
// Der Ausweis scheint nicht zu existieren.
// Wir leiten auf die generische Ausweisseite ohne ID weiter.
return Astro.redirect(
"/energieausweis-erstellen/verbrauchsausweis-wohngebaeude"
);
}
aufnahme = await getAufnahme(ausweis.aufnahme_id) as Aufnahme
if (!aufnahme) {
// Die Aufnahme existiert nicht, das sollte eigentlich nicht passieren aber so können wir nicht fortfahren.
return Astro.redirect(
"/energieausweis-erstellen/verbrauchsausweis-wohngebaeude"
);
}
objekt = await getObjekt(aufnahme.objekt_id) as Objekt
if (!objekt) {
// Das Objekt existiert nicht, das sollte eigentlich nicht passieren aber so können wir nicht fortfahren.
return Astro.redirect(
"/energieausweis-erstellen/verbrauchsausweis-wohngebaeude"
);
}
bilder = await getBilder(aufnahme.id);
} else if (aufnahme_id) {
if (!user) {
return Astro.redirect(
`/auth/login?redirect=${Astro.url.toString()}`
);
}
aufnahme = await getAufnahme(ausweis.aufnahme_id) as Aufnahme
if (!aufnahme) {
// Die Aufnahme existiert wohl nicht.
return Astro.redirect(
"/energieausweis-erstellen/verbrauchsausweis-wohngebaeude"
);
}
objekt = await getObjekt(aufnahme.objekt_id) as Objekt
if (!objekt) {
// Das Objekt existiert nicht.
return Astro.redirect(
"/energieausweis-erstellen/verbrauchsausweis-wohngebaeude"
);
}
}
---
<AusweisLayout title="Verbrauchsausweis erstellen" tabHover1="glow">
<VerbrauchsausweisWohnenModule client:only {ausweis} {objekt} {aufnahme} {bilder} {id} {ausweistyp} {user} {partner_code} loadFromDatabase={id !== null} />
</AusweisLayout>

View File

@@ -1,13 +0,0 @@
---
import AusweisLayout from "#layouts/AusweisLayoutDaten_partner.astro";
import ProduktUebersichtVerbrauchsausweisWohnen from "#components/design/content/ProduktUebersichtVerbrauchsausweisWohnen.svelte";
---
<AusweisLayout title="Verbrauchsausweis Wohngebäude Produktübersicht">
<div class="mx-auto my-8" style="width:85%">
<ProduktUebersichtVerbrauchsausweisWohnen ref="/immowelt">
</ProduktUebersichtVerbrauchsausweisWohnen>
</div>
</AusweisLayout>

Some files were not shown because too many files have changed in this diff Show More