diff --git a/api/methods.py b/api/methods.py index a3556bc..c41c699 100644 --- a/api/methods.py +++ b/api/methods.py @@ -269,6 +269,9 @@ SELECT ,account FROM tenant_t WHERE account = %s + ORDER BY + lastname + ,firstname """, "params": (accountId, ) } @@ -391,6 +394,8 @@ SELECT ,account FROM premise_t WHERE account = %s + ORDER BY + description """, "params": (accountId, ) } @@ -507,6 +512,9 @@ SELECT ,flat_no FROM flat_t WHERE premise = %s + ORDER BY + premise + ,description """, "params": (premiseId, ) } @@ -674,6 +682,9 @@ SELECT ,flat FROM overhead_advance_flat_mapping_t WHERE overhead_advance = %s + ORDER BY + overhead_advance + ,flat """, "params": (overhead_advanceId, ) } @@ -688,6 +699,9 @@ SELECT ,flat FROM overhead_advance_flat_mapping_t WHERE flat = %s + ORDER BY + overhead_advance + ,flat """, "params": (flatId, ) } @@ -784,6 +798,9 @@ SELECT ,premise FROM parking_t WHERE premise = %s + ORDER BY + premise + ,description """, "params": (premiseId, ) } @@ -880,6 +897,9 @@ SELECT ,premise FROM commercial_premise_t WHERE premise = %s + ORDER BY + premise + ,description """, "params": (premiseId, ) } @@ -1011,6 +1031,9 @@ SELECT ,enddate FROM tenancy_t WHERE tenant = %s + ORDER BY + description + ,startdate """, "params": (tenantId, ) } @@ -1030,6 +1053,9 @@ SELECT ,enddate FROM tenancy_t WHERE flat = %s + ORDER BY + description + ,startdate """, "params": (flatId, ) } @@ -1049,6 +1075,9 @@ SELECT ,enddate FROM tenancy_t WHERE parking = %s + ORDER BY + description + ,startdate """, "params": (parkingId, ) } @@ -1068,6 +1097,9 @@ SELECT ,enddate FROM tenancy_t WHERE commercial_premise = %s + ORDER BY + description + ,startdate """, "params": (commercial_premiseId, ) } @@ -1323,12 +1355,13 @@ SELECT ,description ,account ,created_at + ,due_at ,amount ,document_no ,account_entry_category FROM account_entry_t ORDER BY - amount + created_at """, "params": () } @@ -1340,6 +1373,7 @@ def insert_account_entry(user, token_info, **args): v_description = body["description"] v_account = body["account"] v_created_at = body["created_at"] + v_due_at = body["due_at"] v_amount = body["amount"] v_document_no = body["document_no"] v_account_entry_category = body["account_entry_category"] @@ -1350,6 +1384,7 @@ INSERT INTO account_entry_t description ,account ,created_at + ,due_at ,amount ,document_no ,account_entry_category @@ -1360,6 +1395,7 @@ INSERT INTO account_entry_t ,%s ,%s ,%s + ,%s ) RETURNING * """, @@ -1367,6 +1403,7 @@ INSERT INTO account_entry_t v_description ,v_account ,v_created_at + ,v_due_at ,v_amount ,v_document_no ,v_account_entry_category @@ -1385,6 +1422,7 @@ SELECT ,description ,account ,created_at + ,due_at ,amount ,document_no ,account_entry_category @@ -1405,11 +1443,14 @@ SELECT ,description ,account ,created_at + ,due_at ,amount ,document_no ,account_entry_category FROM account_entry_t WHERE account = %s + ORDER BY + created_at """, "params": (accountId, ) } @@ -1423,11 +1464,14 @@ SELECT ,description ,account ,created_at + ,due_at ,amount ,document_no ,account_entry_category FROM account_entry_t WHERE account_entry_category = %s + ORDER BY + created_at """, "params": (account_entry_categoryId, ) } @@ -1442,6 +1486,8 @@ SELECT ,tenant ,note FROM note_t + ORDER BY + created_at """, "params": () } @@ -1505,6 +1551,8 @@ SELECT ,note FROM note_t WHERE tenant = %s + ORDER BY + created_at """, "params": (tenantId, ) } diff --git a/api/methods.py.tmpl b/api/methods.py.tmpl index 6784c28..82c53d7 100644 --- a/api/methods.py.tmpl +++ b/api/methods.py.tmpl @@ -129,6 +129,14 @@ SELECT #end for FROM ${table.name}_t WHERE ${column.name} = %s +#if $table.selectors + ORDER BY +#set $sep = "" +#for $selector in $table.selectors + $sep$selector +#set $sep = "," +#end for +#end if """, "params": (${column.name}Id, ) } diff --git a/api/openapi.yaml b/api/openapi.yaml index 44ffc46..34fa233 100644 --- a/api/openapi.yaml +++ b/api/openapi.yaml @@ -1790,6 +1790,9 @@ components: type: integer created_at: type: string + due_at: + type: string + nullable: true amount: type: number document_no: diff --git a/cli/OverheadAccounts.py b/cli/OverheadAccounts.py index 0525372..63b1684 100644 --- a/cli/OverheadAccounts.py +++ b/cli/OverheadAccounts.py @@ -1,4 +1,3 @@ -import typing_extensions from db import dbGetMany import datetime from loguru import logger @@ -14,71 +13,87 @@ def perform(dbh, params): # get flat tenants by object and timespan with paid overhead and due overhead -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 - f.premise = p.id - order by house_id, tenant_id; - - - - # get overhead sums by object, category and timespan - overheadSums = dbGetMany( + tenants = dbGetMany( dbh, - { - "statement": - """ - select sum(ae.amount) as sum, - aec.description as category, - p.id as house_id, - p.description as house - from account_t a, - premise_t p, - account_entry_t ae, - account_entry_category_t aec - where p.account = a.id and - ae.account = a.id and - aec.overhead_relevant = 't' and - ae.account_entry_category = aec.id and - created_at between %(startDate)s and %(endDate)s and + { + "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 - group by house_id, house, category - union - select 0 as sum, - aec.description as category, - p.id as house_id, - p.description as house - from account_t a, - premise_t p, - account_entry_t ae, - account_entry_category_t aec - where p.account = a.id and - ae.account = a.id and - aec.overhead_relevant = 't' and - aec.id not in (select distinct account_entry_category from account_entry_t) and - created_at between %(startDate)s and %(endDate)s and - p.id in %(premises)s - group by house_id, house, category - order by house_id, category - """, + 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( + dbh, + { + "statement": + """ + select sum(ae.amount) as sum, + aec.description as category, + p.id as house_id, + p.description as house + from account_t a, + premise_t p, + account_entry_t ae, + account_entry_category_t aec + where p.account = a.id and + ae.account = a.id and + aec.overhead_relevant = 't' and + ae.account_entry_category = aec.id and + created_at between %(startDate)s and %(endDate)s and + p.id in %(premises)s + group by house_id, house, category + union + select 0 as sum, + aec.description as category, + p.id as house_id, + p.description as house + from account_t a, + premise_t p, + account_entry_t ae, + account_entry_category_t aec + where p.account = a.id and + ae.account = a.id and + aec.overhead_relevant = 't' and + aec.id not in (select distinct account_entry_category from account_entry_t) and + created_at between %(startDate)s and %(endDate)s and + p.id in %(premises)s + group by house_id, house, category + order by house_id, category + """, + "params": { + "startDate": startDate, + "endDate": endDate, + "premises": premises + } + } ) logger.info(f"{overheadSums=}") diff --git a/cli/fixDueDate.py b/cli/fixDueDate.py new file mode 100644 index 0000000..f942c70 --- /dev/null +++ b/cli/fixDueDate.py @@ -0,0 +1,38 @@ +from loguru import logger +from db import dbGetMany, dbGetOne + +def perform(dbh, params): + accountEntries = dbGetMany( + dbh, + { + "statement": + """ + select id, due_at from account_entry_t where due_at is not null + """, + "params": {} + } + ) + + for accountEntry in accountEntries: + id = accountEntry['id'] + oldDueAt = accountEntry['due_at'] + newDueAt = oldDueAt.replace(day=1) + logger.info(f"id: {id}, due_at: {oldDueAt} -> {newDueAt}") + + fixedEntry = dbGetOne( + dbh, + { + "statement": + """ + UPDATE account_entry_t + SET due_at = %(dueAt)s + WHERE id = %(id)s + RETURNING * + """, + "params": { + "id": id, + "dueAt": newDueAt + } + } + ) + logger.info("fixed") \ No newline at end of file diff --git a/schema.json b/schema.json index 3dd0032..5da984a 100644 --- a/schema.json +++ b/schema.json @@ -136,8 +136,9 @@ "columns": [ { "name": "description", "sqltype": "varchar(1024)", "notnull": true }, { "name": "account", "sqltype": "integer", "notnull": true, "foreignkey": true }, - { "name": "created_at", "sqltype": "timestamp", "notnull": true, "default": "now()" }, - { "name": "amount", "sqltype": "numeric(10,2)", "notnull": true, "selector": 0 }, + { "name": "created_at", "sqltype": "timestamp", "notnull": true, "default": "now()", "selector": 0 }, + { "name": "due_at", "sqltype": "timestamp", "notnull": false }, + { "name": "amount", "sqltype": "numeric(10,2)", "notnull": true }, { "name": "document_no", "sqltype": "integer", "unique": true }, { "name": "account_entry_category", "sqltype": "integer", "notnull": true, "foreignkey": true } ], @@ -149,7 +150,7 @@ "name": "note", "immutable": true, "columns": [ - { "name": "created_at", "sqltype": "timestamp", "notnull": true, "default": "now()" }, + { "name": "created_at", "sqltype": "timestamp", "notnull": true, "default": "now()", "selector": 0 }, { "name": "tenant", "sqltype": "integer", "notnull": true, "foreignkey": true }, { "name": "note", "sqltype": "varchar(4096)", "notnull": true } ] diff --git a/schema/create.sql b/schema/create.sql index 4520315..288dc4b 100644 --- a/schema/create.sql +++ b/schema/create.sql @@ -149,6 +149,7 @@ CREATE TABLE account_entry_t ( ,description varchar(1024) not null ,account integer not null references account_t (id) ,created_at timestamp not null default now() + ,due_at timestamp ,amount numeric(10,2) not null ,document_no integer unique ,account_entry_category integer not null references account_entry_category_t (id) diff --git a/ui/hv2-ui/src/app/account/account.component.html b/ui/hv2-ui/src/app/account/account.component.html index 57f018f..05d5ba2 100644 --- a/ui/hv2-ui/src/app/account/account.component.html +++ b/ui/hv2-ui/src/app/account/account.component.html @@ -6,6 +6,12 @@ + + Fälligkeit + + + + Kategorie @@ -32,6 +38,10 @@ Saldo: {{saldo?.saldo | number:'1.2-2'}} € Datum {{element.rawAccountEntry.created_at | date}} + + Fälligkeit + {{element.rawAccountEntry.due_at | date}} + Beschreibung {{element.rawAccountEntry.description}} diff --git a/ui/hv2-ui/src/app/account/account.component.ts b/ui/hv2-ui/src/app/account/account.component.ts index 266ab1a..a035155 100644 --- a/ui/hv2-ui/src/app/account/account.component.ts +++ b/ui/hv2-ui/src/app/account/account.component.ts @@ -33,7 +33,7 @@ export class AccountComponent implements OnInit { account: Account accountEntries: DN_AccountEntry[] accountEntriesDataSource: MatTableDataSource - accountEntriesDisplayedColumns: string[] = [ "description", "document_no", "amount", "createdAt", "category", "overhead_relevant" ] + accountEntriesDisplayedColumns: string[] = [ "description", "document_no", "amount", "createdAt", "dueAt", "category", "overhead_relevant" ] saldo: Saldo accountEntryCategories: AccountEntryCategory[] @@ -98,6 +98,7 @@ export class AccountComponent implements OnInit { description: formData.value.description, account: this.account.id, created_at: formData.value.createdAt, + due_at: formData.value.dueAt, amount: formData.value.amount, id: 0, document_no: uniquenumber.number, diff --git a/ui/hv2-ui/src/app/data-objects.ts b/ui/hv2-ui/src/app/data-objects.ts index f36c617..d27caa2 100644 --- a/ui/hv2-ui/src/app/data-objects.ts +++ b/ui/hv2-ui/src/app/data-objects.ts @@ -191,6 +191,7 @@ export interface AccountEntry { description: string account: number created_at: string + due_at: string amount: number document_no: number account_entry_category: number @@ -200,6 +201,7 @@ export const NULL_AccountEntry: AccountEntry = { ,description: '' ,account: undefined ,created_at: '' + ,due_at: '' ,amount: undefined ,document_no: undefined ,account_entry_category: undefined