Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 18 additions & 9 deletions src/app/core/service/dossier.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ export class DossierService {
private configService: ConfigInitService,
private fileService: FileService,
private http: HttpClient
) {}
) { }

findAll(closed: boolean): Observable<Dossier[]> {
return this.http.post<Dossier[]>(
Expand All @@ -36,8 +36,7 @@ export class DossierService {
const direction = Direction[sortCriteria.direction];

return this.http.post<Page<Dossier>>(
`${this.configService.getConfig()['BACKEND_URL']}/api/dossier/find-all-paged?closed=${closed}&page=${
pageNumber - 1
`${this.configService.getConfig()['BACKEND_URL']}/api/dossier/find-all-paged?closed=${closed}&page=${pageNumber - 1
}&size=${pageSize}&sort=${sortCriteria.property},${direction}`,
{}
);
Expand All @@ -50,6 +49,13 @@ export class DossierService {
);
}

fromPrevious(): Observable<Dossier> {
return this.http.post<Dossier>(
`${this.configService.getConfig()['BACKEND_URL']}/api/dossier/new-from-previous`,
{}
);
}

import(file: File): Observable<void> {
let formData = new FormData();
formData.append('zip', file);
Expand Down Expand Up @@ -114,16 +120,19 @@ export class DossierService {
);
}

newDossier(dossier: Dossier): Observable<void> {
return this.http.post<void>(`${this.configService.getConfig()['BACKEND_URL']}/api/dossier/new-dossier`, dossier);
newDossier(dossier: Dossier): Observable<Dossier> {
return this.http.post<Dossier>(`${this.configService.getConfig()['BACKEND_URL']}/api/dossier/new-dossier`, dossier);
}

updateDossier(dossier: Dossier): Observable<void> {
return this.http.post<void>(`${this.configService.getConfig()['BACKEND_URL']}/api/dossier/update-dossier`, dossier);
updateDossier(dossier: Dossier): Observable<Dossier> {
return this.http.post<Dossier>(
`${this.configService.getConfig()['BACKEND_URL']}/api/dossier/update-dossier`,
dossier
);
}

recallForModification(dossier: Dossier): Observable<void> {
return this.http.post<void>(
recallForModification(dossier: Dossier): Observable<Dossier> {
return this.http.post<Dossier>(
`${this.configService.getConfig()['BACKEND_URL']}/api/dossier/recall-for-modification`,
dossier
);
Expand Down
42 changes: 32 additions & 10 deletions src/app/features/dossier/dossier-form/dossier-form.component.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Component, EventEmitter, Input, OnInit, Optional, Output } from '@angular/core';
import { Component, EventEmitter, Input, OnDestroy, OnInit, Optional, Output } from '@angular/core';
import { UntypedFormArray, UntypedFormBuilder, UntypedFormControl, UntypedFormGroup, Validators } from '@angular/forms';
import { Dossier, TvaAdvancePayment } from '@core/models/dossier';
import { NgbActiveModal, NgbModal } from '@ng-bootstrap/ng-bootstrap';
Expand All @@ -10,7 +10,7 @@ import { InvoiceService } from '@core/service/invoice.service';
import { FeeDetailComponent } from '@feature/fee/fee-detail/fee-detail.component';
import { InvoiceDetailComponent } from '@feature/invoice/invoice-detail/invoice-detail.component';
import { DateUtils } from '@core/utils/date-utils';
import { firstValueFrom } from 'rxjs';
import { firstValueFrom, Subscription } from 'rxjs';
import { BillableClient } from '@core/models/billable-client';
import { BillableClientService } from '@core/service/billable-client.service';

Expand All @@ -19,7 +19,10 @@ import { BillableClientService } from '@core/service/billable-client.service';
templateUrl: './dossier-form.component.html',
styleUrls: ['./dossier-form.component.scss'],
})
export class DossierFormComponent implements OnInit {
export class DossierFormComponent implements OnInit, OnDestroy {
dossierUpdatedSubscription: Subscription;
@Input()
dossierUpdatedEmitter: EventEmitter<Dossier>;
@Input()
dossier: Dossier;
@Input()
Expand Down Expand Up @@ -58,16 +61,31 @@ export class DossierFormComponent implements OnInit {
private fb: UntypedFormBuilder
) { }

async ngOnInit() {
ngOnDestroy(): void {
this.dossierUpdatedSubscription?.unsubscribe();
}

ngOnInit() {
this.load();
}

async load() {
this.dossierForm = this.createFormGroup();
await this.loadFees();
this.clients = await firstValueFrom(this.clientService.findAll());
await this.loadInvoices();
if (this.dossierUpdatedSubscription) {
this.dossierUpdatedSubscription.unsubscribe();
}
if (this.dossierUpdatedEmitter) {
this.dossierUpdatedEmitter.subscribe(async (d) => {
this.dossier = d;
await this.load();
});
}
}

async loadFees() {
this.expenses = [];
this.filteredExpenses = [];
this.feeTotalVat = 0;
this.feeTotalExclVat = 0;
if (this.dossier?.feeIds?.length) {
Expand All @@ -76,27 +94,31 @@ export class DossierFormComponent implements OnInit {
for (let fee of fees) {
this.feeTotalVat += fee.vat || 0;
this.feeTotalExclVat += fee.priceHVAT || 0;
this.expenses.push(fee);
this.filteredExpenses.push(fee);
}
this.expenses = fees;
this.filteredExpenses = fees;
this.filteredExpenses.sort((e1, e2) => new Date(e2.date).getTime() - new Date(e1.date).getTime());
} else {
this.expenses = [];
this.filteredExpenses = [];
}
}

async loadInvoices() {
this.dossier.invoices = [];
this.vatTotal = 0;
this.invoiceTotalExclVat = 0;
if (this.dossier?.invoiceIds?.length) {
const invoices = await firstValueFrom(this.invoiceService.findByIds(this.dossier.invoiceIds));
for (let invoice of invoices) {
this.vatTotal += invoice.taxes;
this.invoiceTotalExclVat += invoice.subTotal;
this.dossier.invoices.push(invoice);
}
this.dossier.invoices = invoices;
this.dossier.invoices.sort(
(e1, e2) => new Date(e2.dateOfInvoice).getTime() - new Date(e1.dateOfInvoice).getTime()
);
} else {
this.dossier.invoices = [];
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@
<fa-icon [icon]="['fas', 'plus']"></fa-icon>
New
</button>
<button ngbDropdownItem (click)="newDossierFromPrevious()" [disabled]="dossiers?.content?.length > 0">
<fa-icon [icon]="['fas', 'plus']"></fa-icon>
From Previous
</button>
<button
ngbDropdownItem
(click)="deleteDossier()"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Component, Inject, Input, OnInit, PLATFORM_ID } from '@angular/core';
import { Component, EventEmitter, Inject, Input, OnInit, PLATFORM_ID } from '@angular/core';
import { DossierService } from '@core/service/dossier.service';
import { Dossier } from '@core/models/dossier';
import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap';
Expand All @@ -7,14 +7,15 @@ import { FileService } from '@core/service/file.service';
import { WindowRefService } from '@core/service/window.service';
import { isPlatformBrowser } from '@angular/common';
import { LabelService } from '@core/service/label.service';
import { Label } from '@core/models/fee';
import { Fee, Label } from '@core/models/fee';
import { ToastService } from '@core/service/toast.service';
import { DossierImportFormComponent } from '../dossier-import-form/dossier-import-form.component';
import { Direction, Page, SortCriteria } from '@core/models/page';
import { MailService } from '@core/service/mail.service';
import { MailFormComponent } from '@shared/mail-form/mail-form.component';
import { MailRequest } from '@core/models/mail-request';
import { firstValueFrom } from 'rxjs';
import { Invoice } from '@core/models/invoice';

@Component({
selector: 'app-dossier-table-result',
Expand Down Expand Up @@ -63,6 +64,11 @@ export class DossierTableResultComponent implements OnInit {
newDossier() {
this.openDossier();
}
newDossierFromPrevious() {
this.dossierService.fromPrevious().subscribe((dossier: Dossier) => {
this.openDossier(dossier, false);
});
}

importDossier() {
const modalRef = this.modalService.open(DossierImportFormComponent, {
Expand All @@ -82,57 +88,62 @@ export class DossierTableResultComponent implements OnInit {
doss: Dossier = { name: null, advancePayments: [] },
recallForModification: boolean = false
): NgbModalRef {
const dossierUpdatedEmitter: EventEmitter<Dossier> = new EventEmitter<Dossier>();
const modalRef = this.modalService.open(DossierFormComponent, {
size: 'xl',
scrollable: true,
});
modalRef.componentInstance.dossier = doss;
modalRef.componentInstance.dossierUpdatedEmitter = dossierUpdatedEmitter;
modalRef.componentInstance.labels = this.labels;
modalRef.componentInstance.recallForModification = recallForModification;
modalRef.componentInstance.onDownloadSummary.subscribe((dossier) => {
modalRef.componentInstance.onDownloadSummary.subscribe((dossier: Dossier) => {
if (dossier.id) {
// modalRef.close();
this.dossierService.generateSummary(dossier.id);
}
});
modalRef.componentInstance.submitted.subscribe((dossier) => {
modalRef.componentInstance.submitted.subscribe((dossier: Dossier) => {
if (dossier.id) {
if (!dossier.closed) {
this.dossierService.updateDossier(dossier).subscribe((dossier) => {
this.dossierService.updateDossier(dossier).subscribe((savedDossier) => {
this.load();
dossierUpdatedEmitter.emit(savedDossier);
this.toastService.showSuccess('Dossier updated');
// modalRef.close();
});
} else if (modalRef.componentInstance.recallForModification) {
this.dossierService.recallForModification(dossier).subscribe((dossier) => {
this.dossierService.recallForModification(dossier).subscribe((savedDossier: Dossier) => {
this.load();
dossierUpdatedEmitter.emit(savedDossier);
this.toastService.showSuccess('Dossier updated');
// modalRef.close();
});
}
} else {
this.dossierService.newDossier(dossier).subscribe((dossier) => {
this.dossierService.newDossier(dossier).subscribe((savedDossier: Dossier) => {
this.load();
dossierUpdatedEmitter.emit(savedDossier);
this.toastService.showSuccess('Dossier created');
// modalRef.close();
});
}
});
modalRef.componentInstance.feeRemoved.subscribe((fee) => {
this.dossierService.removeFee(fee.id).subscribe((dossier) => {
modalRef.componentInstance.feeRemoved.subscribe((fee: Fee) => {
this.dossierService.removeFee(fee.id).subscribe((savedDossier: Dossier) => {
this.toastService.showSuccess('Expense removed');
modalRef.componentInstance.dossier = dossier;
modalRef.componentInstance.loadFees();
modalRef.componentInstance.loadInvoices();
dossierUpdatedEmitter.emit(savedDossier);
//modalRef.componentInstance.loadFees();
//modalRef.componentInstance.loadInvoices();
this.load();
});
});
modalRef.componentInstance.invoiceRemoved.subscribe((invoice) => {
this.dossierService.removeInvoice(invoice.id).subscribe((dossier) => {
modalRef.componentInstance.invoiceRemoved.subscribe((invoice: Invoice) => {
this.dossierService.removeInvoice(invoice.id).subscribe((savedDossier) => {
this.toastService.showSuccess('Invoice removed');
modalRef.componentInstance.dossier = dossier;
modalRef.componentInstance.loadInvoices();
modalRef.componentInstance.loadFees();
dossierUpdatedEmitter.emit(savedDossier);
// modalRef.componentInstance.loadInvoices();
// modalRef.componentInstance.loadFees();
this.load();
});
});
Expand Down