diff --git a/api/methods.py b/api/methods.py index c41c699..75ada88 100644 --- a/api/methods.py +++ b/api/methods.py @@ -813,6 +813,7 @@ SELECT id ,description ,premise + ,area FROM commercial_premise_t ORDER BY premise @@ -827,21 +828,25 @@ def insert_commercial_premise(user, token_info, **args): body = args["body"] v_description = body["description"] v_premise = body["premise"] + v_area = body["area"] return dbInsert(user, token_info, { "statement": """ INSERT INTO commercial_premise_t ( description ,premise + ,area ) VALUES ( %s ,%s + ,%s ) RETURNING * """, "params": [ v_description ,v_premise + ,v_area ] }) except KeyError as e: @@ -856,6 +861,7 @@ SELECT id ,description ,premise + ,area FROM commercial_premise_t WHERE id = %s """, @@ -868,18 +874,21 @@ def update_commercial_premise(user, token_info, commercial_premiseId=None, **arg body = args["body"] v_description = body["description"] v_premise = body["premise"] + v_area = body["area"] return dbUpdate(user, token_info, { "statement": """ UPDATE commercial_premise_t SET description = %s ,premise = %s + ,area = %s WHERE id = %s RETURNING * """, "params": [ v_description, v_premise, + v_area, commercial_premiseId ] }) @@ -895,6 +904,7 @@ SELECT id ,description ,premise + ,area FROM commercial_premise_t WHERE premise = %s ORDER BY diff --git a/api/openapi.yaml b/api/openapi.yaml index 34fa233..a203e1e 100644 --- a/api/openapi.yaml +++ b/api/openapi.yaml @@ -1714,6 +1714,9 @@ components: premise: type: integer nullable: true + area: + type: number + nullable: true tenancy: description: tenancy type: object diff --git a/cli/OverheadAccounts.py b/cli/OverheadAccounts.py index 63b1684..b815466 100644 --- a/cli/OverheadAccounts.py +++ b/cli/OverheadAccounts.py @@ -1,6 +1,7 @@ -from db import dbGetMany +from db import dbGetMany, dbGetOne import datetime from loguru import logger +from decimal import * def perform(dbh, params): try: @@ -12,42 +13,6 @@ def perform(dbh, params): premises = (1, 2) - # get flat tenants by object and timespan with paid overhead and due overhead - tenants = dbGetMany( - dbh, - { - "statement": - """ - select t.id as tenant_id, - t.firstname as tenant_firstname, - t.lastname as tenant_lastname, - f.id as flat_id, - f.description as flat, - p.id as house_id, - p.description as house, - ty.startdate as startdate, - ty.enddate as enddate - from tenant_t t, - premise_t p, - flat_t f, - tenancy_t ty - where ty.tenant = t.id and - ty.flat = f.id and - ty.startdate >= %(startDate)s and - (ty.enddate <= %(endDate)s or ty.enddate is null) and - f.premise = p.id and - p.id in %(premises)s - order by house_id, tenant_id - """, - "params": { - "startDate": startDate, - "endDate": endDate, - "premises": premises - } - } - ) - logger.info(f"{tenants=}") - # get overhead sums by object, category and timespan overheadSums = dbGetMany( @@ -86,6 +51,13 @@ def perform(dbh, params): created_at between %(startDate)s and %(endDate)s and p.id in %(premises)s group by house_id, house, category + union + select 120 as sum, + 'Waschmaschine' as category, + id as house_id, + description as house + from premise_t + where id in %(premises)s order by house_id, category """, "params": { @@ -95,7 +67,106 @@ def perform(dbh, params): } } ) - logger.info(f"{overheadSums=}") + # logger.info(f"{overheadSums=}") + for overheadSum in overheadSums: + logger.info(f"house: {overheadSum['house']}, category: {overheadSum['category']}, sum: {overheadSum['sum']}") + + subtotal = {} + for premise in premises: + v = [ x['sum'] for x in overheadSums if x['house_id'] == premise ] + logger.info(f"{v=}") + subtotal[premise] = sum(v) + logger.info(f"{subtotal=}") + + + + + # get flat tenants by object and timespan with paid overhead and due overhead + tenants = dbGetMany( + dbh, + { + "statement": + """ + select t.id as tenant_id, + t.firstname as tenant_firstname, + t.lastname as tenant_lastname, + f.id as flat_id, + f.description as flat, + p.id as house_id, + p.description as house, + ty.startdate as startdate, + ty.enddate as enddate, + t.account as tenant_account + from tenant_t t, + premise_t p, + flat_t f, + tenancy_t ty + where ty.tenant = t.id and + ty.flat = f.id and + ty.startdate <= %(startDate)s and + (ty.enddate >= %(endDate)s or ty.enddate is null) and + f.premise = p.id and + p.id in %(premises)s + order by house_id, tenant_id + """, + "params": { + "startDate": startDate, + "endDate": endDate, + "premises": premises + } + } + ) + + for tenant in tenants: + logger.info(f"firstname: {tenant['tenant_firstname']}, lastname: {tenant['tenant_lastname']}, house: {tenant['house']}, account: {tenant['tenant_account']}") + + paidTotal = dbGetOne( + dbh, + { + "statement": + """ + SELECT sum(amount) AS sum, + count(id) AS cnt + FROM account_entry_t + WHERE account = %(account)s AND + account_entry_category = 2 AND + due_at BETWEEN %(startDate)s AND %(endDate)s + """, + "params": { + "account": tenant['tenant_account'], + "startDate": startDate, + "endDate": endDate + } + } + ) + receivableFee = dbGetOne( + dbh, + { + "statement": + """ + SELECT sum(amount) * -1 AS sum , + count(id) AS cnt + FROM account_entry_t + WHERE account = %(account)s AND + account_entry_category = 3 AND + due_at BETWEEN %(startDate)s AND %(endDate)s + """, + "params": { + "account": tenant['tenant_account'], + "startDate": startDate, + "endDate": endDate + } + } + ) + + logger.info(f"Payments: cnt: {paidTotal['cnt']}, sum: {paidTotal['sum']}") + logger.info(f"Receivable fees: cnt: {receivableFee['cnt']}, sum: {receivableFee['sum']}") + + paidOverheadAdvance = paidTotal['sum'] - receivableFee['sum'] + logger.info(f"Paid overhead: {paidOverheadAdvance} (by month: {paidOverheadAdvance / Decimal(12)})") + + + diff --git a/cli/db.py b/cli/db.py index 7a0234a..b9fe284 100644 --- a/cli/db.py +++ b/cli/db.py @@ -21,7 +21,7 @@ def execDatabaseOperation(dbh, func, params): def _opGetMany(cursor, params): - logger.warning(f"{params=}") + #logger.warning(f"{params=}") items = [] cursor.execute(params["statement"], params["params"]) for itemObj in cursor: diff --git a/schema.json b/schema.json index 5da984a..36bd926 100644 --- a/schema.json +++ b/schema.json @@ -79,7 +79,8 @@ "name": "commercial_premise", "columns": [ { "name": "description", "sqltype": "varchar(128)", "selector": 1 }, - { "name": "premise", "sqltype": "integer", "foreignkey": true, "selector": 0 } + { "name": "premise", "sqltype": "integer", "foreignkey": true, "selector": 0 }, + { "name": "area", "sqltype": "numeric(10,2)", "notnull": false } ], "tableConstraints": [ "unique(description, premise)" diff --git a/schema/create.sql b/schema/create.sql index 288dc4b..2f0f708 100644 --- a/schema/create.sql +++ b/schema/create.sql @@ -91,6 +91,7 @@ CREATE TABLE commercial_premise_t ( id serial not null primary key ,description varchar(128) ,premise integer references premise_t (id) + ,area numeric(10,2) ,unique(description, premise) ); diff --git a/ui/hv2-ui/src/app/commercial-unit-details/commercial-unit-details.component.html b/ui/hv2-ui/src/app/commercial-unit-details/commercial-unit-details.component.html index 78a04c6..3d9efe7 100644 --- a/ui/hv2-ui/src/app/commercial-unit-details/commercial-unit-details.component.html +++ b/ui/hv2-ui/src/app/commercial-unit-details/commercial-unit-details.component.html @@ -22,6 +22,10 @@ {{p.description}} + + Fläche + + diff --git a/ui/hv2-ui/src/app/data-objects.ts b/ui/hv2-ui/src/app/data-objects.ts index d27caa2..a7946a3 100644 --- a/ui/hv2-ui/src/app/data-objects.ts +++ b/ui/hv2-ui/src/app/data-objects.ts @@ -119,11 +119,13 @@ export interface CommercialPremise { id: number description: string premise: number + area: number } export const NULL_CommercialPremise: CommercialPremise = { id: 0 ,description: '' ,premise: undefined + ,area: undefined } export interface Tenancy { diff --git a/ui/hv2-ui/src/app/my-commercial-units/my-commercial-units.component.html b/ui/hv2-ui/src/app/my-commercial-units/my-commercial-units.component.html index f061f1b..6a8cd3a 100644 --- a/ui/hv2-ui/src/app/my-commercial-units/my-commercial-units.component.html +++ b/ui/hv2-ui/src/app/my-commercial-units/my-commercial-units.component.html @@ -19,8 +19,13 @@ Haus {{element.premise.description}} + + Fläche + {{element.commercialPremise.area | number:'1.2-2'}} + + diff --git a/ui/hv2-ui/src/app/my-commercial-units/my-commercial-units.component.ts b/ui/hv2-ui/src/app/my-commercial-units/my-commercial-units.component.ts index 3cf6ecf..d29e989 100644 --- a/ui/hv2-ui/src/app/my-commercial-units/my-commercial-units.component.ts +++ b/ui/hv2-ui/src/app/my-commercial-units/my-commercial-units.component.ts @@ -21,7 +21,7 @@ export class MyCommercialUnitsComponent implements OnInit { dnCommercialPremises: DN_CommercialPremise[] = [] dataSource: MatTableDataSource - displayedColumns: string[] = ["description", "premise"] + displayedColumns: string[] = ["description", "premise", "area"] constructor( private commercialPremiseService: CommercialPremiseService,