From 2da6b667bcc86340aeeca316b775551a3c48960f Mon Sep 17 00:00:00 2001 From: Wolfgang Ludger Hottgenroth Date: Fri, 10 Sep 2021 11:59:08 +0200 Subject: [PATCH] fixes --- api/methods.py | 82 ++++++++++++++++ api/openapi.yaml | 93 +++++++++++++++++++ generate.py | 3 + schema.json | 45 +++++++-- schema/create.sql | 72 ++++++++++++-- schema/create.sql.tmpl | 11 +++ .../src/app/account/account.component.css | 6 +- .../src/app/account/account.component.html | 24 ++++- .../src/app/account/account.component.ts | 77 ++++++++++++--- ui/hv2-ui/src/app/data-object-service.ts | 31 +++++++ ui/hv2-ui/src/app/data-objects.ts | 13 +++ ui/hv2-ui/src/app/data-objects.ts.tmpl | 2 + .../flat-details/flat-details.component.html | 4 +- .../flat-details/flat-details.component.ts | 18 +--- .../src/app/my-flats/my-flats.component.css | 3 - .../src/app/my-flats/my-flats.component.html | 2 +- .../app/my-parkings/my-parkings.component.css | 3 - .../app/my-premises/my-premises.component.css | 8 -- .../app/my-tenants/my-tenants.component.css | 8 -- .../app/navigation/navigation.component.css | 4 - ui/hv2-ui/src/app/note/note.component.css | 8 -- .../overhead-advance-list.component.css | 8 -- .../tenant-details.component.css | 8 -- .../tenant-details.component.html | 2 +- ui/hv2-ui/src/styles.css | 9 ++ 25 files changed, 436 insertions(+), 108 deletions(-) diff --git a/api/methods.py b/api/methods.py index d100d08..d164904 100644 --- a/api/methods.py +++ b/api/methods.py @@ -1234,6 +1234,64 @@ SELECT } ) +def get_account_entry_categorys(user, token_info): + return dbGetMany(user, token_info, { + "statement": """ +SELECT + id + ,description + ,overhead_relevant + FROM account_entry_category_t + ORDER BY + description + """, + "params": () + } + ) + +def insert_account_entry_category(user, token_info, **args): + try: + body = args["body"] + v_description = body["description"] + v_overhead_relevant = body["overhead_relevant"] + return dbInsert(user, token_info, { + "statement": """ +INSERT INTO account_entry_category_t + ( + description + ,overhead_relevant + ) VALUES ( + %s + ,%s + ) + RETURNING * +""", + "params": [ + v_description + ,v_overhead_relevant + ] + }) + except KeyError as e: + logger.warning("insert_account_entry_category: parameter missing: {}".format(e)) + raise werkzeug.exceptions.UnprocessableEntity("parameter missing: {}".format(e)) + + +def get_account_entry_category(user, token_info, account_entry_categoryId=None): + return dbGetOne(user, token_info, { + "statement": """ +SELECT + id + ,description + ,overhead_relevant + FROM account_entry_category_t + WHERE id = %s + """, + "params": (account_entry_categoryId, ) + } + ) + + + def get_account_entrys(user, token_info): return dbGetMany(user, token_info, { "statement": """ @@ -1243,6 +1301,7 @@ SELECT ,account ,created_at ,amount + ,account_entry_category FROM account_entry_t ORDER BY amount @@ -1258,6 +1317,7 @@ def insert_account_entry(user, token_info, **args): v_account = body["account"] v_created_at = body["created_at"] v_amount = body["amount"] + v_account_entry_category = body["account_entry_category"] return dbInsert(user, token_info, { "statement": """ INSERT INTO account_entry_t @@ -1266,11 +1326,13 @@ INSERT INTO account_entry_t ,account ,created_at ,amount + ,account_entry_category ) VALUES ( %s ,%s ,%s ,%s + ,%s ) RETURNING * """, @@ -1279,6 +1341,7 @@ INSERT INTO account_entry_t ,v_account ,v_created_at ,v_amount + ,v_account_entry_category ] }) except KeyError as e: @@ -1295,6 +1358,7 @@ SELECT ,account ,created_at ,amount + ,account_entry_category FROM account_entry_t WHERE id = %s """, @@ -1313,6 +1377,7 @@ SELECT ,account ,created_at ,amount + ,account_entry_category FROM account_entry_t WHERE account = %s """, @@ -1320,6 +1385,23 @@ SELECT } ) +def get_account_entry_by_account_entry_category(user, token_info, account_entry_categoryId=None): + return dbGetMany(user, token_info, { + "statement": """ +SELECT + id + ,description + ,account + ,created_at + ,amount + ,account_entry_category + FROM account_entry_t + WHERE account_entry_category = %s + """, + "params": (account_entry_categoryId, ) + } + ) + def get_notes(user, token_info): return dbGetMany(user, token_info, { "statement": """ diff --git a/api/openapi.yaml b/api/openapi.yaml index 2c6f785..9781178 100644 --- a/api/openapi.yaml +++ b/api/openapi.yaml @@ -1175,6 +1175,65 @@ paths: $ref: '#/components/schemas/tenancy_fee_mapping' security: - jwt: ['secret'] + /v1/account_entry_categorys: + get: + tags: [ "account_entry_category" ] + summary: Return all normalized account_entry_categorys + operationId: methods.get_account_entry_categorys + responses: + '200': + description: account_entry_categorys response + content: + 'application/json': + schema: + type: array + items: + $ref: '#/components/schemas/account_entry_category' + security: + - jwt: ['secret'] + post: + tags: [ "account_entry_category" ] + summary: Insert a account_entry_category + operationId: methods.insert_account_entry_category + requestBody: + description: account_entry_category + content: + application/json: + schema: + $ref: '#/components/schemas/account_entry_category' + responses: + '200': + description: account_entry_category successfully inserted + content: + 'application/json': + schema: + type: array + items: + $ref: '#/components/schemas/account_entry_category' + security: + - jwt: ['secret'] + /v1/account_entry_categorys/{account_entry_categoryId}: + get: + tags: [ "account_entry_category" ] + summary: Return the normalized account_entry_category with given id + operationId: methods.get_account_entry_category + parameters: + - name: account_entry_categoryId + in: path + required: true + schema: + type: integer + responses: + '200': + description: account_entry_category response + content: + 'application/json': + schema: + type: array + items: + $ref: '#/components/schemas/account_entry_category' + security: + - jwt: ['secret'] /v1/account_entrys: get: tags: [ "account_entry" ] @@ -1256,6 +1315,28 @@ paths: $ref: '#/components/schemas/account_entry' security: - jwt: ['secret'] + /v1/account_entrys/account_entry_category/{account_entry_categoryId}: + get: + tags: [ "account_entry", "account_entry_category" ] + summary: Return account_entry by $account_entry_category + operationId: methods.get_account_entry_by_account_entry_category + parameters: + - name: account_entry_categoryId + in: path + required: true + schema: + type: integer + responses: + '200': + description: account_entry response + content: + 'application/json': + schema: + type: array + items: + $ref: '#/components/schemas/account_entry' + security: + - jwt: ['secret'] /v1/notes: get: tags: [ "note" ] @@ -1578,6 +1659,16 @@ components: type: integer fee: type: integer + account_entry_category: + description: account_entry_category + type: object + properties: + id: + type: integer + description: + type: string + overhead_relevant: + type: boolean account_entry: description: account_entry type: object @@ -1592,6 +1683,8 @@ components: type: string amount: type: number + account_entry_category: + type: integer note: description: note type: object diff --git a/generate.py b/generate.py index b323c12..709343b 100644 --- a/generate.py +++ b/generate.py @@ -34,6 +34,9 @@ for table in schema["tables"]: elif column["sqltype"] == 'timestamp': column["apitype"] = 'string' column["jstype"] = 'string' + elif column["sqltype"] == 'boolean': + column["apitype"] = 'boolean' + column["jstype"] = 'boolean' elif column["sqltype"].startswith('varchar'): column["apitype"] = 'string' column["jstype"] = 'string' diff --git a/schema.json b/schema.json index b18d675..945d151 100644 --- a/schema.json +++ b/schema.json @@ -3,7 +3,7 @@ { "name": "account", "columns": [ - { "name": "description", "sqltype": "varchar(128)", "notnull": true, "selector": 0 } + { "name": "description", "sqltype": "varchar(128)", "notnull": true, "unique": true, "selector": 0 } ] }, { @@ -20,13 +20,16 @@ { "name": "phone1", "sqltype": "varchar(64)" }, { "name": "phone2", "sqltype": "varchar(64)" }, { "name": "iban", "sqltype": "varchar(64)" }, - { "name": "account", "sqltype": "integer", "notnull": true, "foreignkey": true, "immutable": true } - ] + { "name": "account", "sqltype": "integer", "notnull": true, "foreignkey": true, "immutable": true, "unique": true } + ] , + "tableConstraints": [ + "unique(firstname, lastname)" + ] }, { "name": "premise", "columns": [ - { "name": "description", "sqltype": "varchar(128)", "selector": 0 }, + { "name": "description", "sqltype": "varchar(128)", "selector": 0, "unique": true }, { "name": "street", "sqltype": "varchar(128)", "notnull": true }, { "name": "zip", "sqltype": "varchar(10)", "notnull": true }, { "name": "city", "sqltype": "varchar(128)", "notnull": true } @@ -39,12 +42,15 @@ { "name": "premise", "sqltype": "integer", "foreignkey": true, "selector": 0 }, { "name": "area", "sqltype": "numeric(10,2)", "notnull": true }, { "name": "flat_no", "sqltype": "integer" } + ], + "tableConstraints": [ + "unique(description, premise)" ] }, { "name": "overhead_advance", "columns": [ - { "name": "description", "sqltype": "varchar(128)", "selector": 0 }, + { "name": "description", "sqltype": "varchar(128)", "selector": 0, "unique": true }, { "name": "amount", "sqltype": "numeric(10,4)", "notnull": true, "immutable": true }, { "name": "startdate", "sqltype": "date", "selector": 1, "immutable": true }, { "name": "enddate", "sqltype": "date" } @@ -63,6 +69,9 @@ "columns": [ { "name": "description", "sqltype": "varchar(128)", "selector": 1 }, { "name": "premise", "sqltype": "integer", "foreignkey": true, "selector": 0 } + ], + "tableConstraints": [ + "unique(description, premise)" ] }, { @@ -70,12 +79,15 @@ "columns": [ { "name": "description", "sqltype": "varchar(128)", "selector": 1 }, { "name": "premise", "sqltype": "integer", "foreignkey": true, "selector": 0 } + ], + "tableConstraints": [ + "unique(description, premise)" ] }, { "name": "tenancy", "columns": [ - { "name": "description", "sqltype": "varchar(128)", "selector": 0 }, + { "name": "description", "sqltype": "varchar(128)", "selector": 0, "unique": true }, { "name": "tenant", "sqltype": "integer", "notnull": true, "foreignkey": true, "immutable": true }, { "name": "flat", "sqltype": "integer", "notnull": false, "foreignkey": true, "immutable": true }, { "name": "parking", "sqltype": "integer", "notnull": false, "foreignkey": true, "immutable": true }, @@ -84,20 +96,21 @@ { "name": "enddate", "sqltype": "date", "notnull": false } ], "tableConstraints": [ - "constraint tenancy_only_one_object check ((flat is not null and parking is null and commercial_premise is null) or (flat is null and parking is not null and commercial_premise is null) or (flat is null and parking is null and commercial_premise is not null))" + "check ((flat is not null and parking is null and commercial_premise is null) or (flat is null and parking is not null and commercial_premise is null) or (flat is null and parking is null and commercial_premise is not null))", + "unique(flat, parking, commercial_premise, startdate)" ] }, { "name": "fee", "columns": [ - { "name": "description", "sqltype": "varchar(128)", "selector": 0 }, + { "name": "description", "sqltype": "varchar(128)", "selector": 0, "unique": true }, { "name": "amount", "sqltype": "numeric(10,2)", "notnull": true, "immutable": true }, { "name": "fee_type", "sqltype": "varchar(10)", "notnull": true, "immutable": true }, { "name": "startdate", "sqltype": "date", "selector": 1, "immutable": true }, { "name": "enddate", "sqltype": "date" } ], "tableConstraints": [ - "constraint fee_fee_type check (fee_type = 'per_area' or fee_type = 'total')" + "check (fee_type = 'per_area' or fee_type = 'total')" ] }, { @@ -108,6 +121,14 @@ { "name": "fee", "sqltype": "integer", "notnull": true, "foreignkey": true } ] }, + { + "name": "account_entry_category", + "immutable": true, + "columns": [ + { "name": "description", "sqltype": "varchar(128)", "notnull": true, "selector": 0, "unique": true }, + { "name": "overhead_relevant", "sqltype": "boolean", "notnull": true, "default": "true" } + ] + }, { "name": "account_entry", "immutable": true, @@ -115,7 +136,11 @@ { "name": "description", "sqltype": "varchar(128)", "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": "amount", "sqltype": "numeric(10,2)", "notnull": true, "selector": 0 }, + { "name": "account_entry_category", "sqltype": "integer", "notnull": true, "foreignkey": true } + ], + "tableConstraints": [ + "unique(description, account, created_at)" ] }, { diff --git a/schema/create.sql b/schema/create.sql index d3e4066..d40ad07 100644 --- a/schema/create.sql +++ b/schema/create.sql @@ -7,9 +7,12 @@ CREATE TABLE account_t ( id serial not null primary key - ,description varchar(128) not null + ,description varchar(128) not null unique ); +GRANT SELECT, INSERT, UPDATE ON account_t TO hv2; +GRANT SELECT, UPDATE ON account_t_id_seq TO hv2; + CREATE TABLE tenant_t ( id serial not null primary key ,salutation varchar(128) @@ -23,87 +26,136 @@ CREATE TABLE tenant_t ( ,phone1 varchar(64) ,phone2 varchar(64) ,iban varchar(64) - ,account integer not null references account_t (id) + ,account integer not null references account_t (id) unique + ,unique(firstname, lastname) ); +GRANT SELECT, INSERT, UPDATE ON tenant_t TO hv2; +GRANT SELECT, UPDATE ON tenant_t_id_seq TO hv2; + CREATE TABLE premise_t ( id serial not null primary key - ,description varchar(128) + ,description varchar(128) unique ,street varchar(128) not null ,zip varchar(10) not null ,city varchar(128) not null ); +GRANT SELECT, INSERT, UPDATE ON premise_t TO hv2; +GRANT SELECT, UPDATE ON premise_t_id_seq TO hv2; + CREATE TABLE flat_t ( id serial not null primary key ,description varchar(128) ,premise integer references premise_t (id) ,area numeric(10,2) not null ,flat_no integer + ,unique(description, premise) ); +GRANT SELECT, INSERT, UPDATE ON flat_t TO hv2; +GRANT SELECT, UPDATE ON flat_t_id_seq TO hv2; + CREATE TABLE overhead_advance_t ( id serial not null primary key - ,description varchar(128) + ,description varchar(128) unique ,amount numeric(10,4) not null ,startdate date ,enddate date ); +GRANT SELECT, INSERT, UPDATE ON overhead_advance_t TO hv2; +GRANT SELECT, UPDATE ON overhead_advance_t_id_seq TO hv2; + CREATE TABLE overhead_advance_flat_mapping_t ( id serial not null primary key ,overhead_advance integer not null references overhead_advance_t (id) ,flat integer not null references flat_t (id) ); +GRANT SELECT, INSERT ON overhead_advance_flat_mapping_t TO hv2; +GRANT SELECT, UPDATE ON overhead_advance_flat_mapping_t_id_seq TO hv2; + CREATE TABLE parking_t ( id serial not null primary key ,description varchar(128) ,premise integer references premise_t (id) + ,unique(description, premise) ); +GRANT SELECT, INSERT, UPDATE ON parking_t TO hv2; +GRANT SELECT, UPDATE ON parking_t_id_seq TO hv2; + CREATE TABLE commercial_premise_t ( id serial not null primary key ,description varchar(128) ,premise integer references premise_t (id) + ,unique(description, premise) ); +GRANT SELECT, INSERT, UPDATE ON commercial_premise_t TO hv2; +GRANT SELECT, UPDATE ON commercial_premise_t_id_seq TO hv2; + CREATE TABLE tenancy_t ( id serial not null primary key - ,description varchar(128) + ,description varchar(128) unique ,tenant integer not null references tenant_t (id) ,flat integer references flat_t (id) ,parking integer references parking_t (id) ,commercial_premise integer references commercial_premise_t (id) ,startdate date not null ,enddate date - ,constraint tenancy_only_one_object check ((flat is not null and parking is null and commercial_premise is null) or (flat is null and parking is not null and commercial_premise is null) or (flat is null and parking is null and commercial_premise is not null)) + ,check ((flat is not null and parking is null and commercial_premise is null) or (flat is null and parking is not null and commercial_premise is null) or (flat is null and parking is null and commercial_premise is not null)) + ,unique(flat, parking, commercial_premise, startdate) ); +GRANT SELECT, INSERT, UPDATE ON tenancy_t TO hv2; +GRANT SELECT, UPDATE ON tenancy_t_id_seq TO hv2; + CREATE TABLE fee_t ( id serial not null primary key - ,description varchar(128) + ,description varchar(128) unique ,amount numeric(10,2) not null ,fee_type varchar(10) not null ,startdate date ,enddate date - ,constraint fee_fee_type check (fee_type = 'per_area' or fee_type = 'total') + ,check (fee_type = 'per_area' or fee_type = 'total') ); +GRANT SELECT, INSERT, UPDATE ON fee_t TO hv2; +GRANT SELECT, UPDATE ON fee_t_id_seq TO hv2; + CREATE TABLE tenancy_fee_mapping_t ( id serial not null primary key ,tenancy integer not null references tenancy_t (id) ,fee integer not null references fee_t (id) ); +GRANT SELECT, INSERT ON tenancy_fee_mapping_t TO hv2; +GRANT SELECT, UPDATE ON tenancy_fee_mapping_t_id_seq TO hv2; + +CREATE TABLE account_entry_category_t ( + id serial not null primary key + ,description varchar(128) not null unique + ,overhead_relevant boolean not null default true +); + +GRANT SELECT, INSERT ON account_entry_category_t TO hv2; +GRANT SELECT, UPDATE ON account_entry_category_t_id_seq TO hv2; + CREATE TABLE account_entry_t ( id serial not null primary key ,description varchar(128) not null ,account integer not null references account_t (id) ,created_at timestamp not null default now() ,amount numeric(10,2) not null + ,account_entry_category integer not null references account_entry_category_t (id) + ,unique(description, account, created_at) ); +GRANT SELECT, INSERT ON account_entry_t TO hv2; +GRANT SELECT, UPDATE ON account_entry_t_id_seq TO hv2; + CREATE TABLE note_t ( id serial not null primary key ,created_at timestamp not null default now() @@ -111,5 +163,9 @@ CREATE TABLE note_t ( ,note varchar(4096) not null ); +GRANT SELECT, INSERT ON note_t TO hv2; +GRANT SELECT, UPDATE ON note_t_id_seq TO hv2; + + diff --git a/schema/create.sql.tmpl b/schema/create.sql.tmpl index 9a17e36..4af3846 100644 --- a/schema/create.sql.tmpl +++ b/schema/create.sql.tmpl @@ -14,6 +14,9 @@ CREATE TABLE ${table.name}_t ( #if (('foreignkey' in $column) and $column.foreignkey) references ${column.name}_t (id) #slurp #end if + #if (('unique' in $column) and $column.unique) + unique #slurp + #end if #if ('default' in $column) default $column.default #slurp #end if @@ -26,6 +29,14 @@ CREATE TABLE ${table.name}_t ( #end if ); +GRANT SELECT, INSERT#slurp +#if (('immutable' not in $table) or (not $table.immutable)) +, UPDATE#slurp +#end if + ON ${table.name}_t TO hv2; +GRANT SELECT, UPDATE ON ${table.name}_t_id_seq TO hv2; + #end for + diff --git a/ui/hv2-ui/src/app/account/account.component.css b/ui/hv2-ui/src/app/account/account.component.css index a36a8fc..6416e2f 100644 --- a/ui/hv2-ui/src/app/account/account.component.css +++ b/ui/hv2-ui/src/app/account/account.component.css @@ -1,5 +1,6 @@ table { width: 75%; + border-spacing: 20px; } .spacer { @@ -23,9 +24,10 @@ table { } .rightaligned { - justify-self: right; + text-align: right; } .large { font-size: large; -} \ No newline at end of file +} + diff --git a/ui/hv2-ui/src/app/account/account.component.html b/ui/hv2-ui/src/app/account/account.component.html index ec5db5d..d08ae9f 100644 --- a/ui/hv2-ui/src/app/account/account.component.html +++ b/ui/hv2-ui/src/app/account/account.component.html @@ -23,6 +23,12 @@ + + Kategorie + + {{p.description}} + + Betrag (€) @@ -39,17 +45,25 @@
+ + + + - + - + - - - + + + + + + + diff --git a/ui/hv2-ui/src/app/account/account.component.ts b/ui/hv2-ui/src/app/account/account.component.ts index 5d290d9..cd8f1d8 100644 --- a/ui/hv2-ui/src/app/account/account.component.ts +++ b/ui/hv2-ui/src/app/account/account.component.ts @@ -1,12 +1,21 @@ import { Component, Input, OnInit, OnChanges, ViewChild } from '@angular/core'; import { MatButton } from '@angular/material/button'; import { MatTableDataSource } from '@angular/material/table'; -import { AccountEntryService, AccountService } from '../data-object-service'; -import { Account, AccountEntry, NULL_AccountEntry } from '../data-objects'; +import { AccountEntryCategoryService, AccountEntryService, AccountService } from '../data-object-service'; +import { Account, AccountEntry, AccountEntryCategory, NULL_AccountEntry } from '../data-objects'; import { ExtApiService } from '../ext-data-object-service'; import { Saldo } from '../ext-data-objects'; import { MessageService } from '../message.service'; + + +interface DN_AccountEntry { + rawAccountEntry: AccountEntry + accountEntryCategory: string + overheadRelevant: boolean +} + + @Component({ selector: 'app-account', templateUrl: './account.component.html', @@ -15,16 +24,20 @@ import { MessageService } from '../message.service'; export class AccountComponent implements OnInit { @Input() selectedAccountId: number + @Input() shallBeRentPayment: boolean @ViewChild('addAccountEntryButton') addAccountEntryButton: MatButton collapse: boolean = false account: Account - accountEntries: AccountEntry[] - accountEntriesDataSource: MatTableDataSource - accountEntriesDisplayedColumns: string[] = [ "description", "amount", "createdAt" ] + accountEntries: DN_AccountEntry[] + accountEntriesDataSource: MatTableDataSource + accountEntriesDisplayedColumns: string[] = [ "description", "amount", "createdAt", "category", "overhead_relevant" ] saldo: Saldo + accountEntryCategories: AccountEntryCategory[] + accountEntryCategoriesMap: Map + accountEntryCategoriesInverseMap: Map newAccountEntry: AccountEntry = NULL_AccountEntry @@ -33,6 +46,7 @@ export class AccountComponent implements OnInit { private accountService: AccountService, private accountEntryService: AccountEntryService, private extApiService: ExtApiService, + private accountEntryCategoryService: AccountEntryCategoryService, private messageService: MessageService ) { } @@ -51,12 +65,23 @@ export class AccountComponent implements OnInit { async getAccountEntries(): Promise { try { - this.accountEntries = await this.accountEntryService.getAccountEntrysByAccount(this.selectedAccountId) - this.accountEntries.reverse() - this.messageService.add(`AccountEntries: ${JSON.stringify(this.accountEntries, undefined, 4)}`) - this.accountEntriesDataSource = new MatTableDataSource(this.accountEntries) + const rawAccountEntries = await this.accountEntryService.getAccountEntrysByAccount(this.selectedAccountId) + rawAccountEntries.reverse() + this.messageService.add(`AccountEntries: ${JSON.stringify(rawAccountEntries, undefined, 4)}`) + this.accountEntries = [] + for (let f of rawAccountEntries) { + this.accountEntries.push({ + rawAccountEntry: f, + accountEntryCategory: this.accountEntryCategoriesMap.get(f.account_entry_category).description, + overheadRelevant: this.accountEntryCategoriesMap.get(f.account_entry_category).overhead_relevant + }) + } + + this.accountEntriesDataSource = new MatTableDataSource(this.accountEntries) this.saldo = await this.extApiService.getAccountSaldo(this.selectedAccountId) } catch (err) { + throw err + this.messageService.add(`Error in getAccountEntries: ${JSON.stringify(err, undefined, 4)}`) } } @@ -68,7 +93,7 @@ export class AccountComponent implements OnInit { this.messageService.add(`addAccountEntry: ${ JSON.stringify(this.newAccountEntry, undefined, 4) }`) this.newAccountEntry = await this.accountEntryService.postAccountEntry(this.newAccountEntry) this.messageService.add(`New accountEntry created: ${this.newAccountEntry.id}`) - this.newAccountEntry = { 'account': this.account.id, 'amount': undefined, 'created_at': '', 'description': '', 'id': 0 } + this.newAccountEntry = { 'account': this.account.id, 'amount': undefined, 'created_at': '', 'description': '', 'id': 0, 'account_entry_category': 0 } this.getAccountEntries() } catch (err) { this.messageService.add(`Error in addAccountEntry: ${JSON.stringify(err, undefined, 4)}`) @@ -77,14 +102,38 @@ export class AccountComponent implements OnInit { } } - ngOnInit(): void { - this.messageService.add(`AccountComponent.ngOnInit, account: ${this.selectedAccountId}`) + async getAccountEntryCategories(): Promise { + try { + this.accountEntryCategories = await this.accountEntryCategoryService.getAccountEntryCategorys() + this.accountEntryCategoriesMap = new Map() + this.accountEntryCategoriesInverseMap = new Map() + for (let p of this.accountEntryCategories) { + this.accountEntryCategoriesMap.set(p.id, p) + this.accountEntryCategoriesInverseMap.set(p.description, p) + } + + this.messageService.add(`getAccountEntryCategories: ${JSON.stringify(this.accountEntryCategories, undefined, 4)}`) + } catch (err) { + this.messageService.add(`Error in getAccountEntryCategories: ${JSON.stringify(err, undefined, 4)}`) + } + } + + private async init(): Promise { + this.messageService.add(`AccountComponent.init, account: ${this.selectedAccountId}`) this.getAccount() + await this.getAccountEntryCategories() + if (this.shallBeRentPayment) { + this.messageService.add('shall be rentpayment') + this.newAccountEntry.account_entry_category = this.accountEntryCategoriesInverseMap.get('Mietzahlung').id + } + } + + ngOnInit(): void { + this.init() } ngOnChanges(): void { - this.messageService.add(`AccountComponent.ngOnChanges, account: ${this.selectedAccountId}`) - this.getAccount() + this.init() } } diff --git a/ui/hv2-ui/src/app/data-object-service.ts b/ui/hv2-ui/src/app/data-object-service.ts index b70902c..db4c594 100644 --- a/ui/hv2-ui/src/app/data-object-service.ts +++ b/ui/hv2-ui/src/app/data-object-service.ts @@ -24,6 +24,7 @@ import { CommercialPremise } from './data-objects'; import { Tenancy } from './data-objects'; import { Fee } from './data-objects'; import { TenancyFeeMapping } from './data-objects'; +import { AccountEntryCategory } from './data-objects'; import { AccountEntry } from './data-objects'; import { Note } from './data-objects'; @@ -421,6 +422,31 @@ export class TenancyFeeMappingService { } +} + +@Injectable({ providedIn: 'root' }) +export class AccountEntryCategoryService { + constructor(private messageService: MessageService, private http: HttpClient) { } + + async getAccountEntryCategorys(): Promise { + this.messageService.add(`AccountEntryCategoryService: get data`); + return this.http.get(`${serviceBaseUrl}/v1/account_entry_categorys`).toPromise() + } + + async getAccountEntryCategory(id: number): Promise { + this.messageService.add(`AccountEntryCategoryService: get data for ${id}`); + return this.http.get(`${serviceBaseUrl}/v1/account_entry_categorys/${id}`).toPromise() + } + + async postAccountEntryCategory(item: AccountEntryCategory): Promise { + let itemStr: string = JSON.stringify(item, undefined, 4) + this.messageService.add(`AccountEntryCategoryService: post data for ${itemStr}`); + return this.http.post(`${serviceBaseUrl}/v1/account_entry_categorys`, item).toPromise() + } + + + + } @Injectable({ providedIn: 'root' }) @@ -450,6 +476,11 @@ export class AccountEntryService { return this.http.get(`${serviceBaseUrl}/v1/account_entrys/account/${id}`).toPromise() } + async getAccountEntrysByAccountEntryCategory(id: number): Promise { + this.messageService.add(`AccountEntryService: get data by AccountEntryCategory ${id}`); + return this.http.get(`${serviceBaseUrl}/v1/account_entrys/account_entry_category/${id}`).toPromise() + } + } diff --git a/ui/hv2-ui/src/app/data-objects.ts b/ui/hv2-ui/src/app/data-objects.ts index db5ed57..d8fa3fc 100644 --- a/ui/hv2-ui/src/app/data-objects.ts +++ b/ui/hv2-ui/src/app/data-objects.ts @@ -173,12 +173,24 @@ export const NULL_TenancyFeeMapping: TenancyFeeMapping = { ,fee: undefined } +export interface AccountEntryCategory { + id: number + description: string + overhead_relevant: boolean +} +export const NULL_AccountEntryCategory: AccountEntryCategory = { + id: 0 + ,description: '' + ,overhead_relevant: false +} + export interface AccountEntry { id: number description: string account: number created_at: string amount: number + account_entry_category: number } export const NULL_AccountEntry: AccountEntry = { id: 0 @@ -186,6 +198,7 @@ export const NULL_AccountEntry: AccountEntry = { ,account: undefined ,created_at: '' ,amount: undefined + ,account_entry_category: undefined } export interface Note { diff --git a/ui/hv2-ui/src/app/data-objects.ts.tmpl b/ui/hv2-ui/src/app/data-objects.ts.tmpl index 1fce557..9ee519c 100644 --- a/ui/hv2-ui/src/app/data-objects.ts.tmpl +++ b/ui/hv2-ui/src/app/data-objects.ts.tmpl @@ -17,6 +17,8 @@ export const NULL_$JsNameConverter($table.name): $JsNameConverter($table.name) = '' #else if $column.jstype == "number" undefined +#else if $column.jstype == "boolean" + false #end if #end for } diff --git a/ui/hv2-ui/src/app/flat-details/flat-details.component.html b/ui/hv2-ui/src/app/flat-details/flat-details.component.html index 2eed563..d273646 100644 --- a/ui/hv2-ui/src/app/flat-details/flat-details.component.html +++ b/ui/hv2-ui/src/app/flat-details/flat-details.component.html @@ -25,11 +25,11 @@
Fläche - + Wohnungsnummer - +
diff --git a/ui/hv2-ui/src/app/flat-details/flat-details.component.ts b/ui/hv2-ui/src/app/flat-details/flat-details.component.ts index f7e7ac2..61ead57 100644 --- a/ui/hv2-ui/src/app/flat-details/flat-details.component.ts +++ b/ui/hv2-ui/src/app/flat-details/flat-details.component.ts @@ -4,7 +4,7 @@ import { MatSelect } from '@angular/material/select'; import { MatTableDataSource } from '@angular/material/table'; import { ActivatedRoute, Router } from '@angular/router'; import { FlatService, OverheadAdvanceFlatMappingService, OverheadAdvanceService, PremiseService } from '../data-object-service'; -import { Flat, OverheadAdvance, OverheadAdvanceFlatMapping, Premise } from '../data-objects'; +import { Flat, NULL_Flat, NULL_Premise, OverheadAdvance, OverheadAdvanceFlatMapping, Premise } from '../data-objects'; import { ExtApiService } from '../ext-data-object-service'; import { MessageService } from '../message.service'; @@ -15,21 +15,9 @@ import { MessageService } from '../message.service'; }) export class FlatDetailsComponent implements OnInit { - flat: Flat = { - id: 0, - description: '', - premise: 0, - area: 0.0, - flat_no: 0 - } + flat: Flat = NULL_Flat - premise: Premise = { - id: 0, - description: '', - street: '', - zip: '', - city: '' - } + premise: Premise = NULL_Premise premises: Premise[] mappedOverheadAdvances: OverheadAdvance[] diff --git a/ui/hv2-ui/src/app/my-flats/my-flats.component.css b/ui/hv2-ui/src/app/my-flats/my-flats.component.css index 732345b..e69de29 100644 --- a/ui/hv2-ui/src/app/my-flats/my-flats.component.css +++ b/ui/hv2-ui/src/app/my-flats/my-flats.component.css @@ -1,3 +0,0 @@ -table { - width: 75%; -} diff --git a/ui/hv2-ui/src/app/my-flats/my-flats.component.html b/ui/hv2-ui/src/app/my-flats/my-flats.component.html index b49aa55..bb3bc55 100644 --- a/ui/hv2-ui/src/app/my-flats/my-flats.component.html +++ b/ui/hv2-ui/src/app/my-flats/my-flats.component.html @@ -20,7 +20,7 @@
- + diff --git a/ui/hv2-ui/src/app/my-parkings/my-parkings.component.css b/ui/hv2-ui/src/app/my-parkings/my-parkings.component.css index 732345b..e69de29 100644 --- a/ui/hv2-ui/src/app/my-parkings/my-parkings.component.css +++ b/ui/hv2-ui/src/app/my-parkings/my-parkings.component.css @@ -1,3 +0,0 @@ -table { - width: 75%; -} diff --git a/ui/hv2-ui/src/app/my-premises/my-premises.component.css b/ui/hv2-ui/src/app/my-premises/my-premises.component.css index 469ba71..e69de29 100644 --- a/ui/hv2-ui/src/app/my-premises/my-premises.component.css +++ b/ui/hv2-ui/src/app/my-premises/my-premises.component.css @@ -1,8 +0,0 @@ -table { - width: 75%; -} - -.spacer { - flex: 1 1 auto; -} - \ No newline at end of file diff --git a/ui/hv2-ui/src/app/my-tenants/my-tenants.component.css b/ui/hv2-ui/src/app/my-tenants/my-tenants.component.css index 469ba71..e69de29 100644 --- a/ui/hv2-ui/src/app/my-tenants/my-tenants.component.css +++ b/ui/hv2-ui/src/app/my-tenants/my-tenants.component.css @@ -1,8 +0,0 @@ -table { - width: 75%; -} - -.spacer { - flex: 1 1 auto; -} - \ No newline at end of file diff --git a/ui/hv2-ui/src/app/navigation/navigation.component.css b/ui/hv2-ui/src/app/navigation/navigation.component.css index 214606d..c278346 100644 --- a/ui/hv2-ui/src/app/navigation/navigation.component.css +++ b/ui/hv2-ui/src/app/navigation/navigation.component.css @@ -16,10 +16,6 @@ z-index: 1; } -.spacer { - flex: 1 1 auto; -} - .gittagversion { font-size: x-small; margin-right: 5em; diff --git a/ui/hv2-ui/src/app/note/note.component.css b/ui/hv2-ui/src/app/note/note.component.css index c047311..9e93355 100644 --- a/ui/hv2-ui/src/app/note/note.component.css +++ b/ui/hv2-ui/src/app/note/note.component.css @@ -1,11 +1,3 @@ -table { - width: 75%; -} - -.spacer { - flex: 1 1 auto; -} - #addEntryfield { margin-right: 15px; } diff --git a/ui/hv2-ui/src/app/overhead-advance-list/overhead-advance-list.component.css b/ui/hv2-ui/src/app/overhead-advance-list/overhead-advance-list.component.css index 469ba71..e69de29 100644 --- a/ui/hv2-ui/src/app/overhead-advance-list/overhead-advance-list.component.css +++ b/ui/hv2-ui/src/app/overhead-advance-list/overhead-advance-list.component.css @@ -1,8 +0,0 @@ -table { - width: 75%; -} - -.spacer { - flex: 1 1 auto; -} - \ No newline at end of file diff --git a/ui/hv2-ui/src/app/tenant-details/tenant-details.component.css b/ui/hv2-ui/src/app/tenant-details/tenant-details.component.css index ece0220..670ba54 100644 --- a/ui/hv2-ui/src/app/tenant-details/tenant-details.component.css +++ b/ui/hv2-ui/src/app/tenant-details/tenant-details.component.css @@ -1,11 +1,3 @@ -table { - width: 75%; -} - -.spacer { - flex: 1 1 auto; -} - #setenddatefield { margin-right: 15px; } diff --git a/ui/hv2-ui/src/app/tenant-details/tenant-details.component.html b/ui/hv2-ui/src/app/tenant-details/tenant-details.component.html index 44474ab..6bc34f5 100644 --- a/ui/hv2-ui/src/app/tenant-details/tenant-details.component.html +++ b/ui/hv2-ui/src/app/tenant-details/tenant-details.component.html @@ -208,6 +208,6 @@ - + diff --git a/ui/hv2-ui/src/styles.css b/ui/hv2-ui/src/styles.css index 7be00f3..7a61b43 100644 --- a/ui/hv2-ui/src/styles.css +++ b/ui/hv2-ui/src/styles.css @@ -3,7 +3,16 @@ html, body { height: 100%; } body { margin: 0; font-family: Roboto, "Helvetica Neue", sans-serif; } +table { + width: 75%; + border-spacing: 20px; +} + +.spacer { + flex: 1 1 auto; +} + .defaultCard { margin: 5px; } \ No newline at end of file
Datum{{element.rawAccountEntry.created_at | date}} Beschreibung{{element.description}}{{element.rawAccountEntry.description}} Betrag{{element.amount | number:'1.2-2'}} €{{element.rawAccountEntry.amount | number:'1.2-2'}} € Datum{{element.created_at | date}}Kategorie{{element.accountEntryCategory}}BK relevant{{element.overheadRelevant}}
Wohnfläche{{element.flat.area}}{{element.flat.area | number:'1.2-2'}} Wohnungsnummer