Datenbank Umstellung
This commit is contained in:
20
.github/workflows/build-and-test.yml
vendored
Normal file
20
.github/workflows/build-and-test.yml
vendored
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
name: Build and Test
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ dev ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Build the application
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- uses: oven-sh/setup-bun@v1
|
||||||
|
with:
|
||||||
|
bun-version: "latest"
|
||||||
|
- run: bun install
|
||||||
|
- run: bun run build
|
||||||
|
- run: bun run test:unit
|
||||||
|
- run: bun run test:e2e
|
||||||
@@ -1,15 +1,15 @@
|
|||||||
name: Node.js CD
|
name: Dev Pipeline
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [ main ]
|
branches: [ dev ]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Deploy using ssh
|
- name: Deploy dev changes.
|
||||||
uses: appleboy/ssh-action@master
|
uses: appleboy/ssh-action@master
|
||||||
with:
|
with:
|
||||||
host: "212.227.155.91"
|
host: "212.227.155.91"
|
||||||
27
.github/workflows/prod-pipeline.yml
vendored
Normal file
27
.github/workflows/prod-pipeline.yml
vendored
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
name: Production Deployment
|
||||||
|
|
||||||
|
on:
|
||||||
|
release:
|
||||||
|
types: [ created ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Deploy to production.
|
||||||
|
uses: appleboy/ssh-action@master
|
||||||
|
with:
|
||||||
|
host: "212.227.155.91"
|
||||||
|
username: "root"
|
||||||
|
password: "!2Zc727cI1"
|
||||||
|
port: 22
|
||||||
|
script: |
|
||||||
|
cd ~/apps/online-energieausweis
|
||||||
|
git reset --hard HEAD
|
||||||
|
git clean -f -d
|
||||||
|
git pull origin main
|
||||||
|
git status
|
||||||
|
npm install -g bun
|
||||||
|
bun install
|
||||||
|
bash build.sh
|
||||||
17
README.md
17
README.md
@@ -28,7 +28,6 @@
|
|||||||
- [License](#license)
|
- [License](#license)
|
||||||
- [Kontakt](#kontakt)
|
- [Kontakt](#kontakt)
|
||||||
|
|
||||||
|
|
||||||
## Beschreibung
|
## Beschreibung
|
||||||
|
|
||||||
Dies ist das Repository für das Online-Energieausweis Projekt des IBCornelsen. Eine Demo kann direkt über GitHub heruntergeladen und mit **Docker** gestartet werden.
|
Dies ist das Repository für das Online-Energieausweis Projekt des IBCornelsen. Eine Demo kann direkt über GitHub heruntergeladen und mit **Docker** gestartet werden.
|
||||||
@@ -41,10 +40,10 @@ Die meisten unserer Systeme sind für Ubuntu gedacht und darauf getestet worden.
|
|||||||
|
|
||||||
Für dieses Projekt benötigst du:
|
Für dieses Projekt benötigst du:
|
||||||
|
|
||||||
* docker
|
- docker
|
||||||
* Installationsanleitungen für **docker** kannst du [hier](https://docs.docker.com/engine/install/) finden.
|
- Installationsanleitungen für **docker** kannst du [hier](https://docs.docker.com/engine/install/) finden.
|
||||||
* Einen Package Manger deiner Wahl, du kannst **NPM**, **pNPM** oder auch **Yarn** verwenden. Wir empfehlen allerdings **bun** aufgrund der verbesserten Geschwindigkeit und dem gelieferten Feature Set, da **bun** sowohl einen Package Manager als auch einen Task Runner beinhaltet.
|
- Einen Package Manger deiner Wahl, du kannst **NPM**, **pNPM** oder auch **Yarn** verwenden. Wir empfehlen allerdings **bun** aufgrund der verbesserten Geschwindigkeit und dem gelieferten Feature Set, da **bun** sowohl einen Package Manager als auch einen Task Runner beinhaltet.
|
||||||
* Installationsanleitungen für **bun** kannst du [hier](https://bun.sh/) finden.
|
- Installationsanleitungen für **bun** kannst du [hier](https://bun.sh/) finden.
|
||||||
|
|
||||||
### Installation
|
### Installation
|
||||||
|
|
||||||
@@ -64,10 +63,10 @@ Für dieses Projekt benötigst du:
|
|||||||
|
|
||||||
## Nächste Schritte
|
## Nächste Schritte
|
||||||
|
|
||||||
* [ ] Funktionierender Checkout Flow
|
- [ ] Funktionierender Checkout Flow
|
||||||
* [ ] Performance Optimierungen
|
- [ ] Performance Optimierungen
|
||||||
* [ ] Automatische Tests
|
- [ ] Automatische Tests
|
||||||
* [ ] Dokumentation
|
- [ ] Dokumentation
|
||||||
|
|
||||||
Siehe alle [offenen issues](https://github.com/IBCornelsen/online-energieausweis/issues) für eine Liste der vorgeschlagenen Features (und bekannten Probleme).
|
Siehe alle [offenen issues](https://github.com/IBCornelsen/online-energieausweis/issues) für eine Liste der vorgeschlagenen Features (und bekannten Probleme).
|
||||||
|
|
||||||
|
|||||||
8
cypress.config.ts
Normal file
8
cypress.config.ts
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
import { defineConfig } from 'cypress'
|
||||||
|
|
||||||
|
export default defineConfig({
|
||||||
|
e2e: {
|
||||||
|
baseUrl: 'http://localhost:3000',
|
||||||
|
supportFile: false
|
||||||
|
},
|
||||||
|
})
|
||||||
5
cypress/e2e/Verbrauchsausweis/index.cy.ts
Normal file
5
cypress/e2e/Verbrauchsausweis/index.cy.ts
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
describe('The Home page.', () => {
|
||||||
|
it("successfully loads", () => {
|
||||||
|
cy.visit("/")
|
||||||
|
})
|
||||||
|
})
|
||||||
@@ -8,18 +8,21 @@ services:
|
|||||||
- database
|
- database
|
||||||
environment:
|
environment:
|
||||||
PORT: 3000
|
PORT: 3000
|
||||||
DB_CONNECTION: "postgresql://main:hHMP8cd^N3SnzGRR@database:5432/main"
|
DB_CONNECTION: ${DATABASE_URL}
|
||||||
NODE_ENV: "development"
|
NODE_ENV: "development"
|
||||||
ports:
|
ports:
|
||||||
- 3000:3000
|
- 3000:3000
|
||||||
volumes:
|
volumes:
|
||||||
- ./:/online-energieausweis
|
- ./:/online-energieausweis
|
||||||
- ./node_modules/@ibcornelsen/ui:/online-energieausweis/node_modules/@ibcornelsen/ui
|
- ./node_modules/@ibcornelsen/ui:/online-energieausweis/node_modules/@ibcornelsen/ui
|
||||||
|
- ./node_modules/@ibcornelsen/database:/online-energieausweis/node_modules/@ibcornelsen/database
|
||||||
- ./persistent:/persistent
|
- ./persistent:/persistent
|
||||||
networks:
|
networks:
|
||||||
- postgres
|
- postgres
|
||||||
database:
|
database:
|
||||||
build: ../database
|
build: ../database
|
||||||
|
env_file:
|
||||||
|
- ../database/.env
|
||||||
ports:
|
ports:
|
||||||
- "5436:5432"
|
- "5436:5432"
|
||||||
networks:
|
networks:
|
||||||
|
|||||||
@@ -12,7 +12,8 @@
|
|||||||
"test:unit": "bun test",
|
"test:unit": "bun test",
|
||||||
"format": "prettier --write .",
|
"format": "prettier --write .",
|
||||||
"build:production": "astro build && bun --bun server.js",
|
"build:production": "astro build && bun --bun server.js",
|
||||||
"i18n:generate": "bunx astro-i18next generate"
|
"i18n:generate": "bunx astro-i18next generate",
|
||||||
|
"prisma:studio": "bunx prisma studio --schema=./node_modules/@ibcornelsen/database/prisma/schema.prisma"
|
||||||
},
|
},
|
||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -20,6 +21,7 @@
|
|||||||
"@astrojs/node": "^5.1.4",
|
"@astrojs/node": "^5.1.4",
|
||||||
"@astrojs/svelte": "^2.2.0",
|
"@astrojs/svelte": "^2.2.0",
|
||||||
"@astrojs/tailwind": "^3.1.3",
|
"@astrojs/tailwind": "^3.1.3",
|
||||||
|
"@ibcornelsen/database": "link:@ibcornelsen/database",
|
||||||
"@ibcornelsen/ui": "^0.0.2",
|
"@ibcornelsen/ui": "^0.0.2",
|
||||||
"@mollie/api-client": "^3.7.0",
|
"@mollie/api-client": "^3.7.0",
|
||||||
"astro": "^2.5.1",
|
"astro": "^2.5.1",
|
||||||
@@ -50,6 +52,7 @@
|
|||||||
"@types/uuid": "^9.0.1",
|
"@types/uuid": "^9.0.1",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.59.6",
|
"@typescript-eslint/eslint-plugin": "^5.59.6",
|
||||||
"@typescript-eslint/parser": "^5.59.6",
|
"@typescript-eslint/parser": "^5.59.6",
|
||||||
|
"cypress": "^13.6.1",
|
||||||
"eslint": "~8.15.0",
|
"eslint": "~8.15.0",
|
||||||
"eslint-config-prettier": "8.1.0",
|
"eslint-config-prettier": "8.1.0",
|
||||||
"prettier": "^2.8.8",
|
"prettier": "^2.8.8",
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
---
|
---
|
||||||
import i18next from "i18next";
|
import i18next from "i18next";
|
||||||
import { HeadHrefLangs } from "astro-i18next/components";
|
|
||||||
|
|
||||||
import "../style/global.scss";
|
import "../style/global.scss";
|
||||||
import Footer from "../components/Footer.astro";
|
import Footer from "../components/Footer.astro";
|
||||||
@@ -108,6 +107,11 @@ const schema = JSON.stringify({
|
|||||||
</html>
|
</html>
|
||||||
|
|
||||||
<style is:global>
|
<style is:global>
|
||||||
|
|
||||||
|
article {
|
||||||
|
@apply rounded-lg w-full shadow-md border;
|
||||||
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
import { db } from "../shared";
|
import { db, prisma } from "../shared";
|
||||||
import { UserRegisterValidator, UserType, UserTypeValidator } from "./type";
|
import { UserRegisterValidator, UserType, UserTypeValidator } from "./type";
|
||||||
import { v4 as uuid } from "uuid";
|
import { v4 as uuid } from "uuid";
|
||||||
import { hashPassword } from "../Password";
|
import { hashPassword } from "../Password";
|
||||||
|
import type { Benutzer } from "@ibcornelsen/database";
|
||||||
|
|
||||||
|
|
||||||
export class User {
|
export class User {
|
||||||
@@ -10,12 +11,16 @@ export class User {
|
|||||||
* @param uid Die unique/public id des gesuchten Benutzers.
|
* @param uid Die unique/public id des gesuchten Benutzers.
|
||||||
* @returns {UserType | null} Die Daten des Nutzers oder null falls dieser nicht gefunden werden kann.
|
* @returns {UserType | null} Die Daten des Nutzers oder null falls dieser nicht gefunden werden kann.
|
||||||
*/
|
*/
|
||||||
public static async fromUID(uid: string): Promise<UserType | null> {
|
public static async fromUID(uid: string): Promise<Benutzer | null> {
|
||||||
if (!uid || typeof uid !== "string") {
|
if (!uid || typeof uid !== "string") {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const user = await db<UserType>("benutzer").select("*").where("uid", uid).first();
|
const user = await prisma.benutzer.findUnique({
|
||||||
|
where: {
|
||||||
|
uid
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
if (!user) {
|
if (!user) {
|
||||||
return null;
|
return null;
|
||||||
@@ -24,12 +29,16 @@ export class User {
|
|||||||
return user;
|
return user;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async fromEmail(email: string): Promise<UserType | null> {
|
public static async fromEmail(email: string): Promise<Benutzer | null> {
|
||||||
if (!email || typeof email !== "string") {
|
if (!email || typeof email !== "string") {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const user = await db<UserType>("benutzer").select("*").where("email", email).first();
|
const user = await prisma.benutzer.findUnique({
|
||||||
|
where: {
|
||||||
|
email
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
if (!user) {
|
if (!user) {
|
||||||
return null;
|
return null;
|
||||||
@@ -43,12 +52,16 @@ export class User {
|
|||||||
* @param uid Die private id des gesuchten Benutzers.
|
* @param uid Die private id des gesuchten Benutzers.
|
||||||
* @returns {UserType | null} Die Daten des Nutzers oder null falls dieser nicht gefunden werden kann.
|
* @returns {UserType | null} Die Daten des Nutzers oder null falls dieser nicht gefunden werden kann.
|
||||||
*/
|
*/
|
||||||
public static async fromPrivateId(id: number): Promise<UserType | null> {
|
public static async fromPrivateId(id: number): Promise<Benutzer | null> {
|
||||||
if (!id || typeof id !== "number") {
|
if (!id || typeof id !== "number") {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const user = await db<UserType>("benutzer").select("*").where("id", id).first();
|
const user = await prisma.benutzer.findUnique({
|
||||||
|
where: {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
if (!user) {
|
if (!user) {
|
||||||
return null;
|
return null;
|
||||||
@@ -65,11 +78,16 @@ export class User {
|
|||||||
const uid = uuid();
|
const uid = uuid();
|
||||||
const hashedPassword = hashPassword(user.passwort);
|
const hashedPassword = hashPassword(user.passwort);
|
||||||
|
|
||||||
const result = await db<UserType>("benutzer").insert({
|
const result = await prisma.benutzer.create({
|
||||||
|
data: {
|
||||||
email: user.email,
|
email: user.email,
|
||||||
passwort: hashedPassword,
|
passwort: hashedPassword,
|
||||||
uid: uid
|
uid: uid
|
||||||
}, ["id"])
|
},
|
||||||
|
select: {
|
||||||
|
id: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
if (!result) {
|
if (!result) {
|
||||||
return null;
|
return null;
|
||||||
@@ -77,7 +95,7 @@ export class User {
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
uid,
|
uid,
|
||||||
id: result[0].id
|
id: result.id
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,18 +1,34 @@
|
|||||||
import { Ausstellgrund, Ausweisart } from "src/lib/Ausweis/types";
|
import { Benutzer, Rechnungen, VerbrauchsausweisWohnen } from "@ibcornelsen/database";
|
||||||
import { Energiekennwerte } from "src/lib/Energiekennwerte";
|
|
||||||
import { Gebaeude } from "src/lib/Gebaeude";
|
import { Gebaeude } from "src/lib/Gebaeude";
|
||||||
import { getKlimafaktorenClient } from "src/lib/Klimafaktoren";
|
import { getKlimafaktorenClient } from "src/lib/Klimafaktoren";
|
||||||
import { getHeizwertfaktorClient } from "src/lib/server/Heizwertfaktor";
|
import { getHeizwertfaktorClient } from "src/lib/server/Heizwertfaktor";
|
||||||
|
|
||||||
|
|
||||||
export default class Verbrauchsausweis {
|
export class Verbrauchsausweis implements Partial<VerbrauchsausweisWohnen & { benutzer: Benutzer, rechnung: Rechnungen }> {
|
||||||
public ausweisart: Ausweisart = "VA";
|
rechnungen_id: number | null = null;
|
||||||
public ausstellgrund: Ausstellgrund = "Vermietung";
|
erstellungsdatum: Date | null = null;
|
||||||
public warmwasser_enthalten: boolean = true;
|
ausstellgrund: string | null = null;
|
||||||
public uid?: string;
|
registriernummer: string | null = null;
|
||||||
public baujahr_anlage: number[] = [];
|
erledigt: boolean | null = null;
|
||||||
|
baujahr_heizung: number[] = [];
|
||||||
|
zusaetzliche_heizquelle: boolean | null = null;
|
||||||
|
brennstoff_1: string | null = null;
|
||||||
|
einheit_1: string | null = null;
|
||||||
|
brennstoff_2: string | null = null;
|
||||||
|
einheit_2: string | null = null;
|
||||||
|
startdatum: Date | null = null;
|
||||||
|
enddatum: Date | null = null;
|
||||||
|
verbrauch_1: number | null = null;
|
||||||
|
verbrauch_2: number | null = null;
|
||||||
|
verbrauch_3: number | null = null;
|
||||||
|
verbrauch_4: number | null = null;
|
||||||
|
verbrauch_5: number | null = null;
|
||||||
|
verbrauch_6: number | null = null;
|
||||||
|
warmwasser_enthalten: boolean | null = null;
|
||||||
|
anteil_warmwasser_1: number | null = null;
|
||||||
|
anteil_warmwasser_2: number | null = null;
|
||||||
|
|
||||||
public get energetische_nutzfläche(): number {
|
public get energetischeNutzflaeche(): number {
|
||||||
return (
|
return (
|
||||||
this.gebaeude.wohnflaeche *
|
this.gebaeude.wohnflaeche *
|
||||||
(this.gebaeude.keller_beheizt ? 1.35 : 1.2)
|
(this.gebaeude.keller_beheizt ? 1.35 : 1.2)
|
||||||
@@ -21,32 +37,30 @@ export default class Verbrauchsausweis {
|
|||||||
|
|
||||||
public regnummer?: string;
|
public regnummer?: string;
|
||||||
|
|
||||||
public kennwerte: Energiekennwerte = new Energiekennwerte();
|
|
||||||
public gebaeude: Gebaeude = new Gebaeude();
|
public gebaeude: Gebaeude = new Gebaeude();
|
||||||
|
|
||||||
public constructor(initializer?: Verbrauchsausweis) {
|
public constructor(initializer?: VerbrauchsausweisWohnen) {
|
||||||
if (initializer) {
|
if (initializer) {
|
||||||
this.ausweisart = initializer.ausweisart;
|
Object.assign(this, initializer)
|
||||||
this.kennwerte = initializer.kennwerte;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public get primaer_energie_verbrauch(): Promise<number> {
|
public get primaerEnergieVerbrauch(): Promise<number> {
|
||||||
return (async () => {
|
return (async () => {
|
||||||
const Endenergieverbrauch = await this.end_energie_verbrauch;
|
const Endenergieverbrauch = await this.endEnergieVerbrauch;
|
||||||
|
|
||||||
const brennstoff_1 = getHeizwertfaktorClient(
|
const brennstoff_1 = getHeizwertfaktorClient(
|
||||||
this.kennwerte.energietraeger_1,
|
this.brennstoff_1,
|
||||||
this.kennwerte.einheit_1
|
this.einheit_1
|
||||||
);
|
);
|
||||||
|
|
||||||
return Endenergieverbrauch * brennstoff_1.primärenergiefaktor;
|
return Endenergieverbrauch * brennstoff_1.primärenergiefaktor;
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
|
|
||||||
public get end_energie_verbrauch(): Promise<number> {
|
public get endEnergieVerbrauch(): Promise<number> {
|
||||||
return (async () => {
|
return (async () => {
|
||||||
const date = this.kennwerte.zeitraum;
|
const date = this.startdatum;
|
||||||
const klimafaktoren = await getKlimafaktorenClient(
|
const klimafaktoren = await getKlimafaktorenClient(
|
||||||
date,
|
date,
|
||||||
this.gebaeude.plz
|
this.gebaeude.plz
|
||||||
@@ -55,32 +69,32 @@ export default class Verbrauchsausweis {
|
|||||||
// Endenergieverbrauch
|
// Endenergieverbrauch
|
||||||
// Um den EEV auszurechnen, müssen die Verbräuche zu kWh konvertiert werden.
|
// Um den EEV auszurechnen, müssen die Verbräuche zu kWh konvertiert werden.
|
||||||
let brennstoff_1 = getHeizwertfaktorClient(
|
let brennstoff_1 = getHeizwertfaktorClient(
|
||||||
this.kennwerte.energietraeger_1,
|
this.brennstoff_1,
|
||||||
this.kennwerte.einheit_1
|
this.einheit_1
|
||||||
);
|
);
|
||||||
let brennstoff_2 = getHeizwertfaktorClient(
|
let brennstoff_2 = getHeizwertfaktorClient(
|
||||||
this.kennwerte.energietraeger_2,
|
this.brennstoff_2,
|
||||||
this.kennwerte.einheit_2
|
this.einheit_2
|
||||||
);
|
);
|
||||||
|
|
||||||
let verbrauch_1_kwh =
|
let verbrauch_1_kwh =
|
||||||
this.kennwerte.verbrauch_1 * brennstoff_1.umrechnungsfaktor;
|
this.verbrauch_1 * brennstoff_1.umrechnungsfaktor;
|
||||||
let verbrauch_2_kwh =
|
let verbrauch_2_kwh =
|
||||||
this.kennwerte.verbrauch_2 * brennstoff_1.umrechnungsfaktor;
|
this.verbrauch_2 * brennstoff_1.umrechnungsfaktor;
|
||||||
let verbrauch_3_kwh =
|
let verbrauch_3_kwh =
|
||||||
this.kennwerte.verbrauch_3 * brennstoff_1.umrechnungsfaktor;
|
this.verbrauch_3 * brennstoff_1.umrechnungsfaktor;
|
||||||
let verbrauch_4_kwh =
|
let verbrauch_4_kwh =
|
||||||
this.kennwerte.verbrauch_4 * brennstoff_2.umrechnungsfaktor;
|
this.verbrauch_4 * brennstoff_2.umrechnungsfaktor;
|
||||||
let verbrauch_5_kwh =
|
let verbrauch_5_kwh =
|
||||||
this.kennwerte.verbrauch_5 * brennstoff_2.umrechnungsfaktor;
|
this.verbrauch_5 * brennstoff_2.umrechnungsfaktor;
|
||||||
let verbrauch_6_kwh =
|
let verbrauch_6_kwh =
|
||||||
this.kennwerte.verbrauch_6 * brennstoff_2.umrechnungsfaktor;
|
this.verbrauch_6 * brennstoff_2.umrechnungsfaktor;
|
||||||
|
|
||||||
let warmwasserZuschlag = 0;
|
let warmwasserZuschlag = 0;
|
||||||
let leerstandsZuschlag = 0;
|
let leerstandsZuschlag = 0;
|
||||||
let kuehlungsZuschlag = 0;
|
let kuehlungsZuschlag = 0;
|
||||||
if (this.kennwerte.anteil_warmwasser_1 == 0) {
|
if (this.anteil_warmwasser_1 == 0) {
|
||||||
warmwasserZuschlag = 20 * this.energetische_nutzfläche * 3;
|
warmwasserZuschlag = 20 * this.energetischeNutzflaeche * 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.gebaeude.leerstand > 0) {
|
if (this.gebaeude.leerstand > 0) {
|
||||||
@@ -99,11 +113,11 @@ export default class Verbrauchsausweis {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (this.gebaeude.energiequelle_2_nutzung[3]) {
|
if (this.gebaeude.energiequelle_2_nutzung[3]) {
|
||||||
kuehlungsZuschlag = 6 * this.energetische_nutzfläche * 3;
|
kuehlungsZuschlag = 6 * this.energetischeNutzflaeche * 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
let anteil_heizung = 1 - this.kennwerte.anteil_warmwasser_1 / 100;
|
let anteil_heizung = 1 - this.anteil_warmwasser_1 / 100;
|
||||||
let anteil_warmwasser = this.kennwerte.anteil_warmwasser_1 / 100;
|
let anteil_warmwasser = this.anteil_warmwasser_1 / 100;
|
||||||
|
|
||||||
let Energieverbrauchskennwert =
|
let Energieverbrauchskennwert =
|
||||||
(anteil_heizung *
|
(anteil_heizung *
|
||||||
@@ -122,9 +136,10 @@ export default class Verbrauchsausweis {
|
|||||||
leerstandsZuschlag +
|
leerstandsZuschlag +
|
||||||
kuehlungsZuschlag) /
|
kuehlungsZuschlag) /
|
||||||
3 /
|
3 /
|
||||||
this.energetische_nutzfläche;
|
this.energetischeNutzflaeche;
|
||||||
|
|
||||||
return Energieverbrauchskennwert;
|
return Energieverbrauchskennwert;
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
import knex, { Knex } from "knex";
|
import knex, { Knex } from "knex";
|
||||||
|
export { prisma } from "@ibcornelsen/database"
|
||||||
|
|
||||||
export function dbOpen(): Knex {
|
export function dbOpen(): Knex {
|
||||||
const db = knex({
|
const db = knex({
|
||||||
@@ -9,5 +10,4 @@ export function dbOpen(): Knex {
|
|||||||
return db;
|
return db;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export const db = dbOpen();
|
export const db = dbOpen();
|
||||||
@@ -4,22 +4,36 @@ import {
|
|||||||
error,
|
error,
|
||||||
success,
|
success,
|
||||||
} from "src/lib/APIResponse";
|
} from "src/lib/APIResponse";
|
||||||
import { db } from "src/lib/shared";
|
import { db, prisma } from "src/lib/shared";
|
||||||
|
|
||||||
export const get: APIRoute = async ({ request }) => {
|
export const get: APIRoute = async ({ url }) => {
|
||||||
const body = Object.fromEntries(new URLSearchParams(request.url.split("?")[1]))
|
const body = url.searchParams
|
||||||
|
const uid = body.get("uid")
|
||||||
|
|
||||||
if (!body.uid) {
|
if (!body.has("uid") || !uid) {
|
||||||
return error(["Missing 'uid' in request body."])
|
return error(["Missing 'uid' in request body."])
|
||||||
}
|
}
|
||||||
|
|
||||||
const gebaeude = await db("gebaeude").where({ uid: body.uid }).first();
|
|
||||||
|
const gebaeude = await prisma.gebaeudeStammdaten.findUnique({
|
||||||
|
where: {
|
||||||
|
uid: uid
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
if (!gebaeude) {
|
if (!gebaeude) {
|
||||||
return MissingEntityError("gebaeude")
|
return MissingEntityError("gebaeude")
|
||||||
}
|
}
|
||||||
|
|
||||||
const images = await db("gebaeude_bilder").where({ gebaeude_id: gebaeude.id }).select("uid", "kategorie");
|
const images = await prisma.gebaeudeBilder.findMany({
|
||||||
|
where: {
|
||||||
|
gebaeude_stammdaten_id: gebaeude.id
|
||||||
|
},
|
||||||
|
select: {
|
||||||
|
uid: true,
|
||||||
|
kategorie: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
return success(images);
|
return success(images);
|
||||||
};
|
};
|
||||||
@@ -3,26 +3,27 @@ import {
|
|||||||
MissingEntityError,
|
MissingEntityError,
|
||||||
error,
|
error,
|
||||||
} from "src/lib/APIResponse";
|
} from "src/lib/APIResponse";
|
||||||
import { z } from "zod";
|
|
||||||
import * as path from "path";
|
import * as path from "path";
|
||||||
import * as fs from "fs";
|
import * as fs from "fs";
|
||||||
import { db } from "src/lib/shared";
|
import { prisma } from "src/lib/shared";
|
||||||
|
|
||||||
const ImageUploadChecker = z.object({
|
export const get: APIRoute = async ({ url }) => {
|
||||||
data: z.string(),
|
const body = url.searchParams
|
||||||
name: z.string(),
|
const uid = body.get("uid")
|
||||||
gebaeude_uid: z.string().optional(),
|
|
||||||
kategorie: z.string(),
|
|
||||||
});
|
|
||||||
|
|
||||||
export const get: APIRoute = async ({ request }) => {
|
if (!body.has("uid") || !uid) {
|
||||||
const body = Object.fromEntries(new URLSearchParams(request.url.split("?")[1]))
|
|
||||||
|
|
||||||
if (!body.uid) {
|
|
||||||
return error(["Missing 'uid' in request body."])
|
return error(["Missing 'uid' in request body."])
|
||||||
}
|
}
|
||||||
|
|
||||||
const image = await db("gebaeude_bilder").where({ uid: body.uid }).select("uid", "kategorie").first();
|
const image = await prisma.gebaeudeBilder.findUnique({
|
||||||
|
where: {
|
||||||
|
uid
|
||||||
|
},
|
||||||
|
select: {
|
||||||
|
uid: true,
|
||||||
|
kategorie: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
if (!image) {
|
if (!image) {
|
||||||
return MissingEntityError("image")
|
return MissingEntityError("image")
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import * as jimp from "jimp";
|
|||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
import * as path from "path";
|
import * as path from "path";
|
||||||
import * as fs from "fs";
|
import * as fs from "fs";
|
||||||
import { db } from "src/lib/shared";
|
import { db, prisma } from "src/lib/shared";
|
||||||
|
|
||||||
const ImageUploadChecker = z.object({
|
const ImageUploadChecker = z.object({
|
||||||
data: z.string(),
|
data: z.string(),
|
||||||
@@ -18,14 +18,23 @@ const ImageUploadChecker = z.object({
|
|||||||
kategorie: z.string(),
|
kategorie: z.string(),
|
||||||
});
|
});
|
||||||
|
|
||||||
export const get: APIRoute = async ({ request }) => {
|
export const get: APIRoute = async ({ url }) => {
|
||||||
const body = Object.fromEntries(new URLSearchParams(request.url.split("?")[1]))
|
const body = url.searchParams
|
||||||
|
const uid = body.get("uid")
|
||||||
|
|
||||||
if (!body.uid) {
|
if (!body.has("uid") || !uid) {
|
||||||
return error(["Missing 'uid' in request body."])
|
return error(["Missing 'uid' in request body."])
|
||||||
}
|
}
|
||||||
|
|
||||||
const image = await db("gebaeude_bilder").where({ uid: body.uid }).select("uid", "kategorie").first();
|
const image = await prisma.gebaeudeBilder.findUnique({
|
||||||
|
where: {
|
||||||
|
uid
|
||||||
|
},
|
||||||
|
select: {
|
||||||
|
uid: true,
|
||||||
|
kategorie: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
if (!image) {
|
if (!image) {
|
||||||
return MissingEntityError("image")
|
return MissingEntityError("image")
|
||||||
@@ -68,30 +77,44 @@ export const put: APIRoute = async ({ request }) => {
|
|||||||
|
|
||||||
let gebaeude;
|
let gebaeude;
|
||||||
if (!body.gebaeude_uid) {
|
if (!body.gebaeude_uid) {
|
||||||
gebaeude = await db("gebaeude").insert({}).returning(["uid", "id"]);
|
gebaeude = await prisma.gebaeudeStammdaten.create({
|
||||||
|
data: {},
|
||||||
|
select: {
|
||||||
|
uid: true,
|
||||||
|
id: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
if (!gebaeude) {
|
if (!gebaeude) {
|
||||||
return ActionFailedError();
|
return ActionFailedError();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
gebaeude = await db("gebaeude")
|
gebaeude = await prisma.gebaeudeStammdaten.findUnique({
|
||||||
.select("*")
|
where: {
|
||||||
.where("uid", body.gebaeude_uid);
|
uid: body.gebaeude_uid
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
if (!gebaeude) {
|
if (!gebaeude) {
|
||||||
return MissingEntityError("gebaeude");
|
return MissingEntityError("gebaeude");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const result = await db("gebaeude_bilder")
|
const result = await prisma.gebaeudeBilder.create({
|
||||||
.insert({ gebaeude_id: gebaeude[0].id, kategorie: body.kategorie })
|
data: {
|
||||||
.returning(["uid"]);
|
gebaeude_stammdaten_id: gebaeude.id,
|
||||||
|
kategorie: body.kategorie
|
||||||
|
},
|
||||||
|
select: {
|
||||||
|
uid: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
if (!result) {
|
if (!result) {
|
||||||
return ActionFailedError();
|
return ActionFailedError();
|
||||||
}
|
}
|
||||||
|
|
||||||
const location = path.join("/persistent/uploads", `${result[0].uid}.jpg`);
|
const location = path.join("/persistent/uploads", `${result.uid}.jpg`);
|
||||||
|
|
||||||
const buffer = await jimpResult.getBufferAsync(jimp.MIME_JPEG)
|
const buffer = await jimpResult.getBufferAsync(jimp.MIME_JPEG)
|
||||||
|
|
||||||
@@ -102,7 +125,7 @@ export const put: APIRoute = async ({ request }) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return success({
|
return success({
|
||||||
uid: result[0].uid,
|
uid: result.uid,
|
||||||
gebaeude_uid: gebaeude[0].uid,
|
gebaeude_uid: gebaeude.uid,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -51,8 +51,7 @@ changeLanguage("de");
|
|||||||
src="images/Bedarfsausweis-Wohngebaeude-Beispiel.jpg"
|
src="images/Bedarfsausweis-Wohngebaeude-Beispiel.jpg"
|
||||||
alt="Energieausweis online erstellen"
|
alt="Energieausweis online erstellen"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>Sie möchten Ihren <strong>Energieausweis online erstellen</strong>?
|
||||||
<hr />Sie möchten Ihren <strong>Energieausweis online erstellen</strong>?
|
|
||||||
Auf dieser Seite finden Sie alle nötigen Informationen hierzu. Sollten Sie
|
Auf dieser Seite finden Sie alle nötigen Informationen hierzu. Sollten Sie
|
||||||
sich nicht sicher sein <a href="/energieausweis-welcher-energieausweis.php"
|
sich nicht sicher sein <a href="/energieausweis-welcher-energieausweis.php"
|
||||||
>welchen Energieausweis</a
|
>welchen Energieausweis</a
|
||||||
|
|||||||
@@ -1153,6 +1153,7 @@ content>*:nth-child(3) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.rpt_foot {
|
.rpt_foot {
|
||||||
|
@apply transition-colors transition-all;
|
||||||
/*width: calc(100% - 60px);*/
|
/*width: calc(100% - 60px);*/
|
||||||
display: block;
|
display: block;
|
||||||
padding: 10px 30px;
|
padding: 10px 30px;
|
||||||
@@ -1204,8 +1205,7 @@ content>*:nth-child(3) {
|
|||||||
.rpt_plan {
|
.rpt_plan {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
min-width: 152px;
|
min-width: 152px;
|
||||||
-webkit-box-shadow: rgb(162, 162, 162) 1px 1px 3px 1px;
|
@apply border shadow-md;
|
||||||
box-shadow: rgb(162, 162, 162) 1px 1px 3px 1px;
|
|
||||||
border-radius: .4em;
|
border-radius: .4em;
|
||||||
background: #f5f5f5;
|
background: #f5f5f5;
|
||||||
display: -webkit-box;
|
display: -webkit-box;
|
||||||
@@ -1516,8 +1516,6 @@ body .objekt_card:first-of-type {
|
|||||||
display: -webkit-box;
|
display: -webkit-box;
|
||||||
display: -ms-flexbox;
|
display: -ms-flexbox;
|
||||||
display: flex;
|
display: flex;
|
||||||
-webkit-box-pack: end;
|
|
||||||
-ms-flex-pack: end;
|
|
||||||
justify-content: flex-end;
|
justify-content: flex-end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ article hr {
|
|||||||
|
|
||||||
article {
|
article {
|
||||||
@apply px-8 py-6 w-full relative bg-white;
|
@apply px-8 py-6 w-full relative bg-white;
|
||||||
box-shadow: rgb(162, 162, 162) 1px 1px 3px 1px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
article h1 {
|
article h1 {
|
||||||
|
|||||||
Reference in New Issue
Block a user