fixes
This commit is contained in:
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -23,6 +23,12 @@
|
||||
<mat-datepicker-toggle matSuffix [for]="createdAtPicker"></mat-datepicker-toggle>
|
||||
<mat-datepicker #createdAtPicker></mat-datepicker>
|
||||
</mat-form-field>
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Kategorie</mat-label>
|
||||
<mat-select [(ngModel)]="newAccountEntry.account_entry_category" name="category" disabled="shallBeRentPayment">
|
||||
<mat-option *ngFor="let p of accountEntryCategories" [value]="p.id">{{p.description}}</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Betrag (€)</mat-label>
|
||||
<input matInput type="number" name="amount" [(ngModel)]="newAccountEntry.amount"/>
|
||||
@ -39,17 +45,25 @@
|
||||
</div>
|
||||
<div id="secondBlock">
|
||||
<table mat-table [dataSource]="accountEntriesDataSource" #zftable>
|
||||
<ng-container matColumnDef="createdAt">
|
||||
<th mat-header-cell *matHeaderCellDef>Datum</th>
|
||||
<td mat-cell *matCellDef="let element">{{element.rawAccountEntry.created_at | date}}</td>
|
||||
</ng-container>
|
||||
<ng-container matColumnDef="description">
|
||||
<th mat-header-cell *matHeaderCellDef>Beschreibung</th>
|
||||
<td mat-cell *matCellDef="let element">{{element.description}}</td>
|
||||
<td mat-cell *matCellDef="let element">{{element.rawAccountEntry.description}}</td>
|
||||
</ng-container>
|
||||
<ng-container matColumnDef="amount">
|
||||
<th mat-header-cell *matHeaderCellDef>Betrag</th>
|
||||
<td mat-cell *matCellDef="let element">{{element.amount | number:'1.2-2'}} €</td>
|
||||
<td mat-cell *matCellDef="let element" class="rightaligned">{{element.rawAccountEntry.amount | number:'1.2-2'}} €</td>
|
||||
</ng-container>
|
||||
<ng-container matColumnDef="createdAt">
|
||||
<th mat-header-cell *matHeaderCellDef>Datum</th>
|
||||
<td mat-cell *matCellDef="let element">{{element.created_at | date}}</td>
|
||||
<ng-container matColumnDef="category">
|
||||
<th mat-header-cell *matHeaderCellDef>Kategorie</th>
|
||||
<td mat-cell *matCellDef="let element">{{element.accountEntryCategory}}</td>
|
||||
</ng-container>
|
||||
<ng-container matColumnDef="overhead_relevant">
|
||||
<th mat-header-cell *matHeaderCellDef>BK relevant</th>
|
||||
<td mat-cell *matCellDef="let element">{{element.overheadRelevant}}</td>
|
||||
</ng-container>
|
||||
<tr mat-header-row *matHeaderRowDef="accountEntriesDisplayedColumns"></tr>
|
||||
<tr mat-row *matRowDef="let row; columns: accountEntriesDisplayedColumns;"></tr>
|
||||
|
@ -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<AccountEntry>
|
||||
accountEntriesDisplayedColumns: string[] = [ "description", "amount", "createdAt" ]
|
||||
accountEntries: DN_AccountEntry[]
|
||||
accountEntriesDataSource: MatTableDataSource<DN_AccountEntry>
|
||||
accountEntriesDisplayedColumns: string[] = [ "description", "amount", "createdAt", "category", "overhead_relevant" ]
|
||||
saldo: Saldo
|
||||
|
||||
accountEntryCategories: AccountEntryCategory[]
|
||||
accountEntryCategoriesMap: Map<number, AccountEntryCategory>
|
||||
accountEntryCategoriesInverseMap: Map<string, AccountEntryCategory>
|
||||
|
||||
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<void> {
|
||||
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<AccountEntry>(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<DN_AccountEntry>(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<void> {
|
||||
try {
|
||||
this.accountEntryCategories = await this.accountEntryCategoryService.getAccountEntryCategorys()
|
||||
this.accountEntryCategoriesMap = new Map<number, AccountEntryCategory>()
|
||||
this.accountEntryCategoriesInverseMap = new Map<string, AccountEntryCategory>()
|
||||
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<void> {
|
||||
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()
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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<AccountEntryCategory[]> {
|
||||
this.messageService.add(`AccountEntryCategoryService: get data`);
|
||||
return this.http.get<AccountEntryCategory[]>(`${serviceBaseUrl}/v1/account_entry_categorys`).toPromise()
|
||||
}
|
||||
|
||||
async getAccountEntryCategory(id: number): Promise<AccountEntryCategory> {
|
||||
this.messageService.add(`AccountEntryCategoryService: get data for ${id}`);
|
||||
return this.http.get<AccountEntryCategory>(`${serviceBaseUrl}/v1/account_entry_categorys/${id}`).toPromise()
|
||||
}
|
||||
|
||||
async postAccountEntryCategory(item: AccountEntryCategory): Promise<AccountEntryCategory> {
|
||||
let itemStr: string = JSON.stringify(item, undefined, 4)
|
||||
this.messageService.add(`AccountEntryCategoryService: post data for ${itemStr}`);
|
||||
return this.http.post<AccountEntryCategory>(`${serviceBaseUrl}/v1/account_entry_categorys`, item).toPromise()
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Injectable({ providedIn: 'root' })
|
||||
@ -450,6 +476,11 @@ export class AccountEntryService {
|
||||
return this.http.get<AccountEntry[]>(`${serviceBaseUrl}/v1/account_entrys/account/${id}`).toPromise()
|
||||
}
|
||||
|
||||
async getAccountEntrysByAccountEntryCategory(id: number): Promise<AccountEntry[]> {
|
||||
this.messageService.add(`AccountEntryService: get data by AccountEntryCategory ${id}`);
|
||||
return this.http.get<AccountEntry[]>(`${serviceBaseUrl}/v1/account_entrys/account_entry_category/${id}`).toPromise()
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
@ -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 {
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -25,11 +25,11 @@
|
||||
</div><div>
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Fläche</mat-label>
|
||||
<input matInput name="area" [(ngModel)]="flat.area"/>
|
||||
<input type="number" matInput name="area" [(ngModel)]="flat.area"/>
|
||||
</mat-form-field>
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Wohnungsnummer</mat-label>
|
||||
<input matInput name="flat_no" [(ngModel)]="flat.flat_no"/>
|
||||
<input type="number" matInput name="flat_no" [(ngModel)]="flat.flat_no"/>
|
||||
</mat-form-field>
|
||||
</div>
|
||||
<button #submitButton type="submit" mat-raised-button color="primary">Speichern</button>
|
||||
|
@ -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[]
|
||||
|
@ -1,3 +0,0 @@
|
||||
table {
|
||||
width: 75%;
|
||||
}
|
||||
|
@ -20,7 +20,7 @@
|
||||
</ng-container>
|
||||
<ng-container matColumnDef="area">
|
||||
<th mat-header-cell *matHeaderCellDef>Wohnfläche</th>
|
||||
<td mat-cell *matCellDef="let element">{{element.flat.area}}</td>
|
||||
<td mat-cell *matCellDef="let element">{{element.flat.area | number:'1.2-2'}}</td>
|
||||
</ng-container>
|
||||
<ng-container matColumnDef="flat_no">
|
||||
<th mat-header-cell *matHeaderCellDef>Wohnungsnummer</th>
|
||||
|
@ -1,3 +0,0 @@
|
||||
table {
|
||||
width: 75%;
|
||||
}
|
||||
|
@ -1,8 +0,0 @@
|
||||
table {
|
||||
width: 75%;
|
||||
}
|
||||
|
||||
.spacer {
|
||||
flex: 1 1 auto;
|
||||
}
|
||||
|
@ -1,8 +0,0 @@
|
||||
table {
|
||||
width: 75%;
|
||||
}
|
||||
|
||||
.spacer {
|
||||
flex: 1 1 auto;
|
||||
}
|
||||
|
@ -16,10 +16,6 @@
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.spacer {
|
||||
flex: 1 1 auto;
|
||||
}
|
||||
|
||||
.gittagversion {
|
||||
font-size: x-small;
|
||||
margin-right: 5em;
|
||||
|
@ -1,11 +1,3 @@
|
||||
table {
|
||||
width: 75%;
|
||||
}
|
||||
|
||||
.spacer {
|
||||
flex: 1 1 auto;
|
||||
}
|
||||
|
||||
#addEntryfield {
|
||||
margin-right: 15px;
|
||||
}
|
||||
|
@ -1,8 +0,0 @@
|
||||
table {
|
||||
width: 75%;
|
||||
}
|
||||
|
||||
.spacer {
|
||||
flex: 1 1 auto;
|
||||
}
|
||||
|
@ -1,11 +1,3 @@
|
||||
table {
|
||||
width: 75%;
|
||||
}
|
||||
|
||||
.spacer {
|
||||
flex: 1 1 auto;
|
||||
}
|
||||
|
||||
#setenddatefield {
|
||||
margin-right: 15px;
|
||||
}
|
||||
|
@ -208,6 +208,6 @@
|
||||
</mat-card-content>
|
||||
</mat-card>
|
||||
|
||||
<app-account [selectedAccountId]="tenant.account"></app-account>
|
||||
<app-account [selectedAccountId]="tenant.account" [shallBeRentPayment]="true"></app-account>
|
||||
|
||||
</section>
|
||||
|
@ -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;
|
||||
}
|
Reference in New Issue
Block a user