diff --git a/src/app/clients/clients-view/general-tab/general-tab.component.html b/src/app/clients/clients-view/general-tab/general-tab.component.html
index 54dcdeb9a..4125300b5 100644
--- a/src/app/clients/clients-view/general-tab/general-tab.component.html
+++ b/src/app/clients/clients-view/general-tab/general-tab.component.html
@@ -893,4 +893,14 @@
[routerLink]="['../', 'client-collateral', row.collateralId]"
>
+
+
+
diff --git a/src/app/clients/clients-view/general-tab/general-tab.component.ts b/src/app/clients/clients-view/general-tab/general-tab.component.ts
index b454293a2..edd4953f1 100644
--- a/src/app/clients/clients-view/general-tab/general-tab.component.ts
+++ b/src/app/clients/clients-view/general-tab/general-tab.component.ts
@@ -7,9 +7,9 @@
*/
/** Angular Imports */
-import { Component, OnInit, inject } from '@angular/core';
-import { environment } from '../../../../environments/environment';
+import { Component, OnInit, OnDestroy, inject } from '@angular/core';
import { Router, ActivatedRoute, RouterLink } from '@angular/router';
+import { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';
/** Custom Services. */
import { ClientsService } from 'app/clients/clients.service';
@@ -35,6 +35,12 @@ import { DateFormatPipe } from '../../../pipes/date-format.pipe';
import { FormatNumberPipe } from '../../../pipes/format-number.pipe';
import { CurrencyPipe } from '@angular/common';
import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module';
+import { ReportsService } from 'app/reports/reports.service';
+import { SettingsService } from 'app/settings/settings.service';
+import { Subject } from 'rxjs';
+import { takeUntil, catchError } from 'rxjs/operators';
+import { AlertService } from 'app/core/alert/alert.service';
+import { EMPTY } from 'rxjs';
/**
* General Tab component.
@@ -66,21 +72,76 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module';
CurrencyPipe
]
})
-export class GeneralTabComponent {
+export class GeneralTabComponent implements OnDestroy {
+ private destroy$ = new Subject();
+ private alertService = inject(AlertService);
+ private sanitizer = inject(DomSanitizer);
+ pdfUrl: SafeResourceUrl | null = null;
+ rawPdfUrl: string | null = null;
+ showPdf: boolean = false;
+
openLoanApplicationReport(event: MouseEvent, loanId: string) {
event.stopPropagation();
- const baseApiUrl = environment.baseApiUrl?.replace(/\/$/, '') || '';
- const apiProvider = environment.apiProvider?.replace(/\/$/, '') || '';
- const apiVersion = environment.apiVersion?.replace(/\/$/, '') || '';
- const tenantIdentifier = environment.fineractPlatformTenantId || 'default';
- const locale = environment.defaultLanguage || 'en';
- const dateFormat = 'dd MMMM yyyy';
- const reportUrl = `${baseApiUrl}${apiProvider}${apiVersion}/runreports/LoanApplicationReport?tenantIdentifier=${tenantIdentifier}&locale=${locale}&dateFormat=${encodeURIComponent(dateFormat)}&R_loanId=${loanId}&output-type=PDF`;
- window.open(reportUrl, '_blank', 'noopener,noreferrer');
+ const tenantIdentifier = this.settingsService.tenantIdentifier || 'default';
+ const locale = this.settingsService.languageCode || 'en-US';
+ const dateFormat = this.settingsService.dateFormat || 'dd MMMM yyyy';
+ const formData = { R_loanId: loanId, 'output-type': 'PDF' };
+ this.reportsService
+ .getPentahoRunReportData('LoanApplicationReport', formData, tenantIdentifier, locale, dateFormat)
+ .pipe(
+ takeUntil(this.destroy$),
+ catchError((error): any => {
+ this.showPdf = false;
+ if (this.rawPdfUrl) {
+ URL.revokeObjectURL(this.rawPdfUrl);
+ this.rawPdfUrl = null;
+ }
+ this.pdfUrl = null;
+ this.alertService.alert({
+ type: 'error',
+ message: 'Failed to load Loan Application PDF report.'
+ });
+ return EMPTY;
+ })
+ )
+ .subscribe((res: any) => {
+ if (this.rawPdfUrl) {
+ URL.revokeObjectURL(this.rawPdfUrl);
+ this.rawPdfUrl = null;
+ this.pdfUrl = null;
+ }
+ const contentType = res.headers.get('Content-Type') || 'application/pdf';
+ const file = new Blob([res.body], { type: contentType });
+ this.rawPdfUrl = URL.createObjectURL(file);
+ this.pdfUrl = this.sanitizer.bypassSecurityTrustResourceUrl(this.rawPdfUrl);
+ this.showPdf = true;
+ });
}
+
+ closePdf() {
+ this.showPdf = false;
+ if (this.rawPdfUrl) {
+ URL.revokeObjectURL(this.rawPdfUrl);
+ this.rawPdfUrl = null;
+ }
+ this.pdfUrl = null;
+ }
+
+ ngOnDestroy() {
+ this.destroy$.next();
+ this.destroy$.complete();
+ if (this.rawPdfUrl) {
+ URL.revokeObjectURL(this.rawPdfUrl);
+ this.rawPdfUrl = null;
+ }
+ this.pdfUrl = null;
+ }
+
private route = inject(ActivatedRoute);
private clientService = inject(ClientsService);
private router = inject(Router);
+ private reportsService = inject(ReportsService);
+ private settingsService = inject(SettingsService);
/** Open Loan Accounts Columns */
openLoansColumns: string[] = [