Merge branch 'dev-latest' into feature/bugfix
This commit is contained in:
@@ -6041,7 +6041,12 @@ export class TransactionEntryComponent implements OnInit, OnDestroy {
|
|||||||
this.editRequest = req;
|
this.editRequest = req;
|
||||||
}
|
}
|
||||||
|
|
||||||
const acTyp = 'SD';
|
// Same bug, same fix as the token-driven withdrawal-slip lookup above (see its comment): the
|
||||||
|
// request carries its own real account_type (SAVINGS, CURRENT, FIXED_DEPOSIT or
|
||||||
|
// RECURRING_DEPOSIT), and hardcoding 'SD' here searched every non-savings account on the
|
||||||
|
// wrong endpoint, so reviewing a Current-account withdrawal always failed with "Account not
|
||||||
|
// found".
|
||||||
|
const acTyp = TransactionEntryComponent.SEARCH_ACCOUNT_TYPE_TO_AC_TYP[req.account_type || ''] || 'SD';
|
||||||
const row = this.rows[0];
|
const row = this.rows[0];
|
||||||
row.acNo = req.account_no ?? '';
|
row.acNo = req.account_no ?? '';
|
||||||
row.acTyp = acTyp;
|
row.acTyp = acTyp;
|
||||||
|
|||||||
+21
-2
@@ -54,8 +54,8 @@
|
|||||||
<mat-icon>account_balance</mat-icon>
|
<mat-icon>account_balance</mat-icon>
|
||||||
</div>
|
</div>
|
||||||
<div class="bank-name-block">
|
<div class="bank-name-block">
|
||||||
<div class="bank-title">LincPay Co-operative Bank Ltd.</div>
|
<div class="bank-title">{{ bankName }}</div>
|
||||||
<div class="bank-subtitle">Current Account Statement</div>
|
<div class="bank-subtitle">{{ bankSubtitle }}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="statement-label">
|
<div class="statement-label">
|
||||||
@@ -64,6 +64,25 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Branch line — IFSC/MICR are how a UCB customer identifies which branch issued this, and are
|
||||||
|
needed for NEFT/RTGS/cheque printing, so a real passbook always carries them. -->
|
||||||
|
@if (branchName || ifscCode || micrCode) {
|
||||||
|
<div class="branch-line">
|
||||||
|
@if (branchName) {
|
||||||
|
<span>{{ branchName }} Branch</span>
|
||||||
|
}
|
||||||
|
@if (branchAddress) {
|
||||||
|
<span>{{ branchAddress }}</span>
|
||||||
|
}
|
||||||
|
@if (ifscCode) {
|
||||||
|
<span>IFSC: {{ ifscCode }}</span>
|
||||||
|
}
|
||||||
|
@if (micrCode) {
|
||||||
|
<span>MICR: {{ micrCode }}</span>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
<!-- Account Details -->
|
<!-- Account Details -->
|
||||||
<div class="account-details-band">
|
<div class="account-details-band">
|
||||||
<div class="account-details-grid">
|
<div class="account-details-grid">
|
||||||
|
|||||||
+12
@@ -127,6 +127,18 @@ $header-text: #fff;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ─── Branch Identification Line ──────────────────────────────────────────────
|
||||||
|
.branch-line {
|
||||||
|
background: #e8edf5;
|
||||||
|
border-bottom: 1px solid $border-color;
|
||||||
|
padding: 6px 24px;
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 4px 18px;
|
||||||
|
font-size: 11px;
|
||||||
|
color: #4a5a7a;
|
||||||
|
}
|
||||||
|
|
||||||
// ─── Account Details Band ────────────────────────────────────────────────────
|
// ─── Account Details Band ────────────────────────────────────────────────────
|
||||||
.account-details-band {
|
.account-details-band {
|
||||||
background: #f0f3f9;
|
background: #f0f3f9;
|
||||||
|
|||||||
+53
-1
@@ -11,11 +11,12 @@ import { Component, OnInit, OnDestroy, inject, ElementRef, ViewChild } from '@an
|
|||||||
import { ActivatedRoute } from '@angular/router';
|
import { ActivatedRoute } from '@angular/router';
|
||||||
import { UntypedFormBuilder } from '@angular/forms';
|
import { UntypedFormBuilder } from '@angular/forms';
|
||||||
import { CurrencyPipe } from '@angular/common';
|
import { CurrencyPipe } from '@angular/common';
|
||||||
import { Subject, takeUntil } from 'rxjs';
|
import { Subject, takeUntil, catchError, forkJoin, of } from 'rxjs';
|
||||||
|
|
||||||
/** Custom Services */
|
/** Custom Services */
|
||||||
import { SettingsService } from 'app/settings/settings.service';
|
import { SettingsService } from 'app/settings/settings.service';
|
||||||
import { Dates } from 'app/core/utils/dates';
|
import { Dates } from 'app/core/utils/dates';
|
||||||
|
import { OrganizationService } from '../../../organization/organization.service';
|
||||||
import { Currency } from 'app/shared/models/general.model';
|
import { Currency } from 'app/shared/models/general.model';
|
||||||
import {
|
import {
|
||||||
CurrentAccountTransaction,
|
CurrentAccountTransaction,
|
||||||
@@ -44,6 +45,7 @@ export class PassbookTabComponent implements OnInit, OnDestroy {
|
|||||||
private formBuilder = inject(UntypedFormBuilder);
|
private formBuilder = inject(UntypedFormBuilder);
|
||||||
private settingsService = inject(SettingsService);
|
private settingsService = inject(SettingsService);
|
||||||
private dateUtils = inject(Dates);
|
private dateUtils = inject(Dates);
|
||||||
|
private organizationService = inject(OrganizationService);
|
||||||
|
|
||||||
private destroy$ = new Subject<void>();
|
private destroy$ = new Subject<void>();
|
||||||
|
|
||||||
@@ -60,6 +62,17 @@ export class PassbookTabComponent implements OnInit, OnDestroy {
|
|||||||
availableBalance: number = 0;
|
availableBalance: number = 0;
|
||||||
activatedOnDate: any = null;
|
activatedOnDate: any = null;
|
||||||
|
|
||||||
|
/** Bank/branch letterhead — real values from Institution Profile + Branch Profile (Organization
|
||||||
|
* module) rather than a hardcoded name, so a printed passbook actually identifies which bank and
|
||||||
|
* branch issued it, the way a real UCB's core banking system does. Falls back to a generic label
|
||||||
|
* if the profile was never filled in, rather than showing a fabricated bank name. */
|
||||||
|
bankName = 'Bank';
|
||||||
|
bankSubtitle = 'Current Account Statement';
|
||||||
|
branchName = '';
|
||||||
|
branchAddress = '';
|
||||||
|
ifscCode = '';
|
||||||
|
micrCode = '';
|
||||||
|
|
||||||
/** Transactions */
|
/** Transactions */
|
||||||
allTransactions: CurrentAccountTransaction[] = [];
|
allTransactions: CurrentAccountTransaction[] = [];
|
||||||
filteredTransactions: CurrentAccountTransaction[] = [];
|
filteredTransactions: CurrentAccountTransaction[] = [];
|
||||||
@@ -92,6 +105,33 @@ export class PassbookTabComponent implements OnInit, OnDestroy {
|
|||||||
fromDate: [''],
|
fromDate: [''],
|
||||||
toDate: ['']
|
toDate: ['']
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.loadLetterhead();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Institution Profile is the bank's own single record; Branch Profile is per-office. There is no
|
||||||
|
* office id on the current account data reaching this tab, and this deployment runs a single
|
||||||
|
* branch, so the first branch profile on record is the correct one here — a genuinely
|
||||||
|
* multi-branch deployment would need the account's own office id threaded through instead. */
|
||||||
|
private loadLetterhead(): void {
|
||||||
|
forkJoin({
|
||||||
|
institution: this.organizationService.getInstitutionProfile().pipe(catchError(() => of(null))),
|
||||||
|
branches: this.organizationService.getBranchProfiles().pipe(catchError(() => of([])))
|
||||||
|
}).subscribe(({ institution, branches }: any) => {
|
||||||
|
if (institution) {
|
||||||
|
this.bankName = institution.passbookHeaderName || institution.bankName || institution.legalName || 'Bank';
|
||||||
|
this.bankSubtitle = institution.licenseNumber
|
||||||
|
? `Lic. No. ${institution.licenseNumber}`
|
||||||
|
: 'Current Account Statement';
|
||||||
|
}
|
||||||
|
const branch = Array.isArray(branches) ? branches[0] : null;
|
||||||
|
if (branch) {
|
||||||
|
this.branchName = branch.officeName || '';
|
||||||
|
this.branchAddress = branch.address || '';
|
||||||
|
this.ifscCode = branch.ifscCode || '';
|
||||||
|
this.micrCode = branch.micrCode || '';
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private computeRunningBalances(transactions: CurrentAccountTransaction[]): CurrentAccountTransaction[] {
|
private computeRunningBalances(transactions: CurrentAccountTransaction[]): CurrentAccountTransaction[] {
|
||||||
@@ -279,6 +319,18 @@ export class PassbookTabComponent implements OnInit, OnDestroy {
|
|||||||
margin-top: 3px;
|
margin-top: 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Branch identification line */
|
||||||
|
.branch-line {
|
||||||
|
background: #e8edf5;
|
||||||
|
border-bottom: 1px solid #d0d7e3;
|
||||||
|
padding: 5px 20px;
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 4px 16px;
|
||||||
|
font-size: 9.5px;
|
||||||
|
color: #4a5a7a;
|
||||||
|
}
|
||||||
|
|
||||||
/* Account details band */
|
/* Account details band */
|
||||||
.account-details-band {
|
.account-details-band {
|
||||||
background: #f0f3f9;
|
background: #f0f3f9;
|
||||||
|
|||||||
+2
-2
@@ -20,8 +20,8 @@
|
|||||||
// Tenants the login screen offers, and which one it starts on. Every identifier here has to exist
|
// Tenants the login screen offers, and which one it starts on. Every identifier here has to exist
|
||||||
// in the tenants table of the tenant-store database, or the platform rejects the request as an
|
// in the tenants table of the tenant-store database, or the platform rejects the request as an
|
||||||
// unknown tenant.
|
// unknown tenant.
|
||||||
window["env"]["fineractPlatformTenantId"] = 'lincpay';
|
window["env"]["fineractPlatformTenantId"] = 'utkarshbank';
|
||||||
window["env"]["fineractPlatformTenantIds"] = 'lincpay';
|
window["env"]["fineractPlatformTenantIds"] = 'utkarshbank';
|
||||||
|
|
||||||
window['env']['tenantLogoUrl'] = '';
|
window['env']['tenantLogoUrl'] = '';
|
||||||
window['env']['tenantLogoUrlDark'] = '';
|
window['env']['tenantLogoUrlDark'] = '';
|
||||||
|
|||||||
@@ -19,8 +19,8 @@ export const environment = {
|
|||||||
version: env.mifos_x.version,
|
version: env.mifos_x.version,
|
||||||
hash: env.mifos_x.hash,
|
hash: env.mifos_x.hash,
|
||||||
// For connecting to server running elsewhere update the tenant identifier
|
// For connecting to server running elsewhere update the tenant identifier
|
||||||
fineractPlatformTenantId: loadedEnv['fineractPlatformTenantId'] || 'lincpay',
|
fineractPlatformTenantId: loadedEnv['fineractPlatformTenantId'] || 'utkarshbank',
|
||||||
fineractPlatformTenantIds: loadedEnv['fineractPlatformTenantIds'] || 'lincpay',
|
fineractPlatformTenantIds: loadedEnv['fineractPlatformTenantIds'] || 'utkarshbank',
|
||||||
// For connecting to others servers running elsewhere update the base API URL
|
// For connecting to others servers running elsewhere update the base API URL
|
||||||
baseApiUrls:
|
baseApiUrls:
|
||||||
loadedEnv['fineractApiUrls'] || 'https://demo.mifos.community,https://localhost:8443,' + window.location.origin,
|
loadedEnv['fineractApiUrls'] || 'https://demo.mifos.community,https://localhost:8443,' + window.location.origin,
|
||||||
|
|||||||
@@ -22,8 +22,8 @@ export const environment = {
|
|||||||
version: env.mifos_x.version,
|
version: env.mifos_x.version,
|
||||||
hash: env.mifos_x.hash,
|
hash: env.mifos_x.hash,
|
||||||
// For connecting to server running elsewhere update the tenant identifier
|
// For connecting to server running elsewhere update the tenant identifier
|
||||||
fineractPlatformTenantId: loadedEnv.fineractPlatformTenantId || 'lincpay',
|
fineractPlatformTenantId: loadedEnv.fineractPlatformTenantId || 'utkarshbank',
|
||||||
fineractPlatformTenantIds: loadedEnv.fineractPlatformTenantIds || 'lincpay',
|
fineractPlatformTenantIds: loadedEnv.fineractPlatformTenantIds || 'utkarshbank',
|
||||||
// For connecting to others servers running elsewhere update the base API URL
|
// For connecting to others servers running elsewhere update the base API URL
|
||||||
baseApiUrls:
|
baseApiUrls:
|
||||||
loadedEnv.fineractApiUrls || 'https://demo.mifos.community,https://localhost:8443,' + window.location.origin,
|
loadedEnv.fineractApiUrls || 'https://demo.mifos.community,https://localhost:8443,' + window.location.origin,
|
||||||
|
|||||||
Reference in New Issue
Block a user