update customer filter and overview

This commit is contained in:
2024-10-05 01:45:17 +02:00
parent d6985f3885
commit 23a37b2601
10 changed files with 93 additions and 20 deletions
@@ -1,10 +1,10 @@
package de.champonthis.buntspecht.controller;
import java.time.Instant;
import java.util.List;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.web.PagedModel;
import org.springframework.http.HttpStatus;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.util.StringUtils;
@@ -20,6 +20,7 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.querydsl.core.QueryResults;
import com.querydsl.core.Tuple;
import de.champonthis.buntspecht.businesslogic.TurnoverManager;
import de.champonthis.buntspecht.businesslogic.UserManager;
@@ -64,6 +65,35 @@ public class TurnoverController extends BaseController {
sort.orElse("created"), descending.orElse(false), filter);
}
@PreAuthorize("isAuthenticated()")
@GetMapping("/overview")
@Transactional
public Tuple overview(
@RequestParam("limit") Optional<Long> limitParameter,
@RequestParam("offset") Optional<Long> offsetParameter,
@RequestParam("sort") Optional<String> sort,
@RequestParam("descending") Optional<Boolean> descending,
@RequestParam("from") Optional<Instant> from,
@RequestParam("to") Optional<Instant> to,
@RequestParam("customer") Optional<String> customer,
@RequestParam("motif") Optional<String> motif) {
TurnoverFilterModel filter = new TurnoverFilterModel();
filter.setCreated(new MinMax<Instant>(from.orElse(null), to.orElse(null)));
filter.setCustomer(customer.orElse(null));
filter.setMotif(motif.orElse(null));
List<Tuple> result = turnoverManager.overview(getCurrentUsername(), limitParameter.orElse(15L),
offsetParameter.orElse(0L), sort.orElse("username"),
descending.orElse(false), filter).getResults();
if (result.isEmpty()) {
return null;
}
return result.get(0);
}
@PreAuthorize("isAuthenticated()")
@GetMapping("/{id}")
@Transactional
@@ -64,7 +64,7 @@ public class TurnoverManagementController extends BaseController {
@PreAuthorize("hasRole('ROLE_ADMIN')")
@GetMapping("/overview")
@Transactional
public QueryResults<Tuple> fetchGroup(
public QueryResults<Tuple> overview(
@RequestParam("username") Optional<String> usernameParameter,
@RequestParam("limit") Optional<Long> limitParameter,
@RequestParam("offset") Optional<Long> offsetParameter,
@@ -31,6 +31,16 @@
}
</mat-autocomplete>
</mat-form-field>
<mat-form-field class="margin">
<mat-label>{{'turnovers.filter.customer' | i18n}}</mat-label>
<input type="text" matInput (input)="setInputFilter('customer', $event.target)">
</mat-form-field>
<mat-form-field class="margin">
<mat-label>{{'turnovers.filter.motif' | i18n}}</mat-label>
<input type="text" matInput (input)="setInputFilter('motif', $event.target)">
</mat-form-field>
</form>
</div>
@@ -19,9 +19,19 @@
<mat-datepicker-toggle matIconSuffix [for]="picker"></mat-datepicker-toggle>
<mat-date-range-picker #picker></mat-date-range-picker>
</mat-form-field>
<mat-form-field class="margin">
<mat-label>{{'turnovers.filter.customer' | i18n}}</mat-label>
<input type="text" matInput (input)="setInputFilter('customer', $event.target)">
</mat-form-field>
<mat-form-field class="margin">
<mat-label>{{'turnovers.filter.motif' | i18n}}</mat-label>
<input type="text" matInput (input)="setInputFilter('motif', $event.target)">
</mat-form-field>
</form>
</div>
<ui-turnovers class="flex column grow" [turnovers]="turnovers" (page)="applyPage($event)"
<ui-turnovers class="flex column grow" [turnovers]="turnovers" [overview]="overview" (page)="applyPage($event)"
(sort)="applySort($event)"></ui-turnovers>
</div>
@@ -14,6 +14,7 @@ import { UserManagementService } from 'src/app/services/user.management.service'
export class PageTurnovers implements OnInit {
turnovers: any;
overview: any[];
sort: string = "created";
descending: boolean = true;
filterOpen: boolean = false;
@@ -40,6 +41,17 @@ export class PageTurnovers implements OnInit {
this.turnovers = { error: error };
}
})
this.turnoverService.overview(this.turnovers.limit || 15, this.turnovers.offset || 0, this.sort, this.descending, this.turnovers.filter).subscribe({
next: (data: any) => {
this.overview = data;
if (!this.overview) {
this.overview = ['', 0, 0];
}
}, error: (error) => {
this.turnovers = { error: error };
}
})
}
applyPage(event: PageEvent) {
@@ -54,6 +66,10 @@ export class PageTurnovers implements OnInit {
this.update();
}
setInputFilter(key: string, target: EventTarget) {
this.setFilter(key, (target as HTMLInputElement).value);
}
setFilter(key: string, value) {
if (value != this.turnovers.filter[key]) {
this.turnovers.filter[key] = value;
@@ -16,6 +16,10 @@ export class TurnoverService {
return this.abstractService.fetch("/turnovers", limit, offset, sort, descending, filter);
}
overview(limit: number, offset: number, sort: string, descending: boolean, filter: any | undefined) {
return this.abstractService.fetch("/turnovers/overview", limit, offset, sort, descending, filter);
}
get(id: number) {
return this.http.get(environment.apiUrl + "/turnovers/" + id);
}
@@ -125,6 +125,12 @@
<span class="spacer"></span>
<div class="mat-mdc-paginator flex">
@if (overview && overview.length > 2) {
<div class="flex middle">
<span class="margin">{{'turnover.price.total' | i18n:(overview[1] | number: '1.2-2')}}</span> <span
class="margin">{{'turnover.timeInvestment.total' | i18n:(overview[2] | number: '1.1-1')}}</span>
</div>
}
<span class="spacer"></span>
<mat-paginator [pageSizeOptions]="pageSizeOptions" [pageIndex]="turnovers.offset / turnovers.limit"
[length]="turnovers.total" [pageSize]="turnovers.limit" (page)="page.emit($event)" showFirstLastButtons>
@@ -11,6 +11,7 @@ import { Router } from '@angular/router';
export class UiTurnovers implements OnInit {
@Input() turnovers: any;
@Input() overview: any[];
@Input() showFilter: boolean = true;
@Input() linkTurnover: boolean = true;
@Input() username: boolean = false;
@@ -115,13 +115,15 @@
"price": {
".": "Preis",
"error": "Angabe des Preises erforderlich",
"suffix": "€"
"suffix": "€",
"total": "Umsatz: {0} €"
},
"remark": "Bemerkungen",
"success": "Erfolgreich gespeichert",
"timeInvestment": {
".": "Zeiteinsatz",
"suffix": "Std."
"suffix": "Std.",
"total": "Zeiteinsatz: {0} Std."
},
"update": "Aktualisieren",
"updated": {
@@ -134,10 +136,12 @@
".": "Buchungen",
"filter": {
"created": {
".": "Erstellungsdatum",
".": "Zeitraum",
"from": "von",
"to": "bis"
},
"customer": "Kunde durchsuchen",
"motif": "Motif durchsuchen",
"username": "User auswählen"
},
"mine": "Eigene Buchungen"
+5 -13
View File
@@ -1,15 +1,7 @@
{
"folders": [
{
"path": "buntspecht-backend"
},
{
"path": "buntspecht-frontend"
}
],
"settings": {
"java.configuration.updateBuildConfiguration": "automatic",
"java.compile.nullAnalysis.mode": "disabled",
"html.autoClosingTags": false
}
"folders": [
{
"path": "."
}
]
}