feat(loan-products): extend loan product stepper with legacy account-type fields
Add UI-only fields across the details, settings, charges, terms, and accounting steps to mirror the legacy Account Type Creation screen (classification, cheque book, interest, and additional settings). These are stripped from the create/edit payload via CUSTOM_UI_ONLY_FIELDS until a backend mechanism (e.g. a linked data table) exists to persist them. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
e58fd3c79a
commit
f0b4e98e71
@@ -26,6 +26,7 @@
|
||||
<div class="lp-tab-content">
|
||||
<mifosx-loan-product-details-step
|
||||
[loanProductsTemplate]="loanProductsTemplate"
|
||||
(productSubGroupChange)="setProductSubGroup($event)"
|
||||
></mifosx-loan-product-details-step>
|
||||
</div>
|
||||
</mat-tab>
|
||||
@@ -51,6 +52,7 @@
|
||||
<mifosx-loan-product-settings-step
|
||||
[loanProductsTemplate]="loanProductsTemplate"
|
||||
[isLinkedToFloatingInterestRates]="loanProductTermsForm.get('isLinkedToFloatingInterestRates')"
|
||||
[productSubGroup]="selectedProductSubGroup"
|
||||
(advancePaymentStrategy)="advancePaymentStrategy($event)"
|
||||
></mifosx-loan-product-settings-step>
|
||||
</div>
|
||||
|
||||
@@ -88,6 +88,7 @@ export class CreateLoanProductComponent implements OnInit {
|
||||
selectedTabIndex = 0;
|
||||
|
||||
isAdvancedPaymentStrategy = false;
|
||||
selectedProductSubGroup = '';
|
||||
paymentAllocation: PaymentAllocation[] = [];
|
||||
creditAllocation: PaymentAllocation[] = [];
|
||||
supportedInterestRefundTypes: StringEnumOptionData[] = [];
|
||||
@@ -144,6 +145,10 @@ export class CreateLoanProductComponent implements OnInit {
|
||||
return this.loanProductTermsStep.loanProductTermsForm;
|
||||
}
|
||||
|
||||
setProductSubGroup(value: string) {
|
||||
this.selectedProductSubGroup = value;
|
||||
}
|
||||
|
||||
advancePaymentStrategy(value: string) {
|
||||
this.isAdvancedPaymentStrategy = LoanProducts.isAdvancedPaymentAllocationStrategy(value);
|
||||
if (this.isAdvancedPaymentStrategy) {
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
|
||||
<mifosx-loan-product-details-step
|
||||
[loanProductsTemplate]="loanProductAndTemplate"
|
||||
(productSubGroupChange)="setProductSubGroup($event)"
|
||||
></mifosx-loan-product-details-step>
|
||||
</mat-step>
|
||||
|
||||
@@ -56,6 +57,7 @@
|
||||
<mifosx-loan-product-settings-step
|
||||
[loanProductsTemplate]="loanProductAndTemplate"
|
||||
[isLinkedToFloatingInterestRates]="loanProductTermsForm.get('isLinkedToFloatingInterestRates')"
|
||||
[productSubGroup]="selectedProductSubGroup"
|
||||
(advancePaymentStrategy)="advancePaymentStrategy($event)"
|
||||
>
|
||||
</mifosx-loan-product-settings-step>
|
||||
|
||||
@@ -95,6 +95,7 @@ export class EditLoanProductComponent implements OnInit {
|
||||
itemsByDefault: GlobalConfiguration[] = [];
|
||||
|
||||
isAdvancedPaymentStrategy = false;
|
||||
selectedProductSubGroup = '';
|
||||
wasPaymentAllocationChanged = false;
|
||||
paymentAllocation: PaymentAllocation[] = [];
|
||||
creditAllocation: CreditAllocation[] = [];
|
||||
@@ -218,6 +219,10 @@ export class EditLoanProductComponent implements OnInit {
|
||||
this.isAdvancedPaymentStrategy = LoanProducts.isAdvancedPaymentAllocationStrategy(value);
|
||||
}
|
||||
|
||||
setProductSubGroup(value: string): void {
|
||||
this.selectedProductSubGroup = value;
|
||||
}
|
||||
|
||||
buildAdvancedPaymentAllocation(): void {
|
||||
this.advancedPaymentAllocations = this.advancedPaymentStrategy.buildAdvancedPaymentAllocationList(
|
||||
this.loanProductAndTemplate
|
||||
|
||||
+93
-13
@@ -210,7 +210,14 @@ export class LoanProductAccountingStepComponent implements OnInit, OnChanges {
|
||||
intOverdueReserveAccountId: accountingMappings.intOverdueReserveAccount?.id || '',
|
||||
undebitedInterestAccountId: accountingMappings.undebitedInterestAccount?.id || '',
|
||||
penalIntCrGlAccountId: accountingMappings.penalIntCrGlAccount?.id || '',
|
||||
rdMaturedGlAccountId: accountingMappings.rdMaturedGlAccount?.id || ''
|
||||
rdMaturedGlAccountId: accountingMappings.rdMaturedGlAccount?.id || '',
|
||||
glAccountId: accountingMappings.glAccount?.id || '',
|
||||
icChargeGlAccountId: accountingMappings.icChargeGlAccount?.id || '',
|
||||
inoperativeGlAccountId: accountingMappings.inoperativeGlAccount?.id || '',
|
||||
creditBalanceLiabilityGlAccountId: accountingMappings.creditBalanceLiabilityGlAccount?.id || '',
|
||||
creditBalanceAssetGlAccountId: accountingMappings.creditBalanceAssetGlAccount?.id || '',
|
||||
overdueAccountsGlAccountId: accountingMappings.overdueAccountsGlAccount?.id || '',
|
||||
rebateGlAccountId: accountingMappings.rebateGlAccount?.id || ''
|
||||
});
|
||||
|
||||
if (this.loanProductsTemplate.paymentChannelToFundSourceMappings) {
|
||||
@@ -281,11 +288,8 @@ export class LoanProductAccountingStepComponent implements OnInit, OnChanges {
|
||||
'receivablePenaltyAccountId',
|
||||
'intReceivablesGlAccountId',
|
||||
'intPayableGlAccountId',
|
||||
'deafIntPayableGlAccountId',
|
||||
'intOverdueReserveAccountId',
|
||||
'undebitedInterestAccountId',
|
||||
'penalIntCrGlAccountId',
|
||||
'rdMaturedGlAccountId'
|
||||
'glAccountId',
|
||||
'inoperativeGlAccountId'
|
||||
];
|
||||
commonFields.forEach((field) => {
|
||||
if (!this.loanProductAccountingForm.contains(field)) {
|
||||
@@ -293,6 +297,26 @@ export class LoanProductAccountingStepComponent implements OnInit, OnChanges {
|
||||
}
|
||||
});
|
||||
|
||||
// Optional custom GL account fields (legacy screenshot fields not marked mandatory) —
|
||||
// no Validators.required, so mat-form-field does not render a required asterisk for these.
|
||||
const optionalCommonFields = [
|
||||
'deafIntPayableGlAccountId',
|
||||
'intOverdueReserveAccountId',
|
||||
'undebitedInterestAccountId',
|
||||
'penalIntCrGlAccountId',
|
||||
'rdMaturedGlAccountId',
|
||||
'icChargeGlAccountId',
|
||||
'creditBalanceLiabilityGlAccountId',
|
||||
'creditBalanceAssetGlAccountId',
|
||||
'overdueAccountsGlAccountId',
|
||||
'rebateGlAccountId'
|
||||
];
|
||||
optionalCommonFields.forEach((field) => {
|
||||
if (!this.loanProductAccountingForm.contains(field)) {
|
||||
this.loanProductAccountingForm.addControl(field, new UntypedFormControl(''));
|
||||
}
|
||||
});
|
||||
|
||||
if (!this.loanProductAccountingForm.contains('advancedAccountingRules')) {
|
||||
this.loanProductAccountingForm.addControl('advancedAccountingRules', new UntypedFormControl(false));
|
||||
}
|
||||
@@ -708,15 +732,15 @@ export class LoanProductAccountingStepComponent implements OnInit, OnChanges {
|
||||
{
|
||||
key: 'intReceivablesGlAccountId',
|
||||
label: 'Int. Receivables GL A/c',
|
||||
inputLabel: 'Int. Receivables GL A/c',
|
||||
inputLabel: 'Int Receivables GL A/c',
|
||||
controlName: 'intReceivablesGlAccountId',
|
||||
options: this.assetAccountData,
|
||||
required: false
|
||||
required: true
|
||||
},
|
||||
{
|
||||
key: 'deafIntPayableGlAccountId',
|
||||
label: 'Deaf Int. Payble GL A/c',
|
||||
inputLabel: 'Deaf Int. Payble GL A/c',
|
||||
inputLabel: 'Deaf Int Payble GL A/c',
|
||||
controlName: 'deafIntPayableGlAccountId',
|
||||
options: this.assetAccountData,
|
||||
required: false
|
||||
@@ -724,7 +748,7 @@ export class LoanProductAccountingStepComponent implements OnInit, OnChanges {
|
||||
{
|
||||
key: 'intOverdueReserveAccountId',
|
||||
label: 'Int. Overdue Reserve A/c (AS)',
|
||||
inputLabel: 'Int. Overdue Reserve A/c',
|
||||
inputLabel: 'Int Overdue Reserve A/c',
|
||||
controlName: 'intOverdueReserveAccountId',
|
||||
options: this.assetAccountData,
|
||||
required: false
|
||||
@@ -736,6 +760,38 @@ export class LoanProductAccountingStepComponent implements OnInit, OnChanges {
|
||||
controlName: 'rdMaturedGlAccountId',
|
||||
options: this.assetAccountData,
|
||||
required: false
|
||||
},
|
||||
{
|
||||
key: 'glAccountId',
|
||||
label: 'GL A/c No.',
|
||||
inputLabel: 'GL A/c No',
|
||||
controlName: 'glAccountId',
|
||||
options: this.assetAccountData,
|
||||
required: true
|
||||
},
|
||||
{
|
||||
key: 'inoperativeGlAccountId',
|
||||
label: 'InOperative GL A/c',
|
||||
inputLabel: 'InOperative GL A/c',
|
||||
controlName: 'inoperativeGlAccountId',
|
||||
options: this.assetAccountData,
|
||||
required: true
|
||||
},
|
||||
{
|
||||
key: 'creditBalanceAssetGlAccountId',
|
||||
label: 'Cr.Balance Asset GL A/c',
|
||||
inputLabel: 'Cr Balance Asset GL A/c',
|
||||
controlName: 'creditBalanceAssetGlAccountId',
|
||||
options: this.assetAccountData,
|
||||
required: false
|
||||
},
|
||||
{
|
||||
key: 'overdueAccountsGlAccountId',
|
||||
label: 'Overdue Accounts GL A/c No.',
|
||||
inputLabel: 'Overdue Accounts GL A/c No',
|
||||
controlName: 'overdueAccountsGlAccountId',
|
||||
options: this.assetAccountData,
|
||||
required: false
|
||||
}
|
||||
],
|
||||
otherMappingsControlName: 'assetsOtherGlMappings',
|
||||
@@ -848,10 +904,18 @@ export class LoanProductAccountingStepComponent implements OnInit, OnChanges {
|
||||
{
|
||||
key: 'penalIntCrGlAccountId',
|
||||
label: 'Penal Int. Cr. GL A/c',
|
||||
inputLabel: 'Penal Int. Cr. GL A/c',
|
||||
inputLabel: 'Penal Int Cr GL A/c',
|
||||
controlName: 'penalIntCrGlAccountId',
|
||||
options: this.incomeAccountData,
|
||||
required: false
|
||||
},
|
||||
{
|
||||
key: 'icChargeGlAccountId',
|
||||
label: 'I.C. Charge GL A/c No.',
|
||||
inputLabel: 'IC Charge GL A/c No',
|
||||
controlName: 'icChargeGlAccountId',
|
||||
options: this.incomeAccountData,
|
||||
required: false
|
||||
}
|
||||
],
|
||||
otherMappingsControlName: 'incomeOtherGlMappings',
|
||||
@@ -903,6 +967,14 @@ export class LoanProductAccountingStepComponent implements OnInit, OnChanges {
|
||||
options: this.expenseAccountData,
|
||||
required: true,
|
||||
deferredBuyDownMerchantOnly: true
|
||||
},
|
||||
{
|
||||
key: 'rebateGlAccountId',
|
||||
label: 'Rebate GL A/c No.',
|
||||
inputLabel: 'Rebate GL A/c No',
|
||||
controlName: 'rebateGlAccountId',
|
||||
options: this.expenseAccountData,
|
||||
required: false
|
||||
}
|
||||
],
|
||||
otherMappingsControlName: 'expensesOtherGlMappings',
|
||||
@@ -934,10 +1006,10 @@ export class LoanProductAccountingStepComponent implements OnInit, OnChanges {
|
||||
{
|
||||
key: 'intPayableGlAccountId',
|
||||
label: 'Int. Payable GL A/c',
|
||||
inputLabel: 'Int. Payable GL A/c',
|
||||
inputLabel: 'Int Payable GL A/c',
|
||||
controlName: 'intPayableGlAccountId',
|
||||
options: this.liabilityAccountData,
|
||||
required: false
|
||||
required: true
|
||||
},
|
||||
{
|
||||
key: 'undebitedInterestAccountId',
|
||||
@@ -946,6 +1018,14 @@ export class LoanProductAccountingStepComponent implements OnInit, OnChanges {
|
||||
controlName: 'undebitedInterestAccountId',
|
||||
options: this.liabilityAccountData,
|
||||
required: false
|
||||
},
|
||||
{
|
||||
key: 'creditBalanceLiabilityGlAccountId',
|
||||
label: 'Cr.Balance Liability GL A/c',
|
||||
inputLabel: 'Cr Balance Liability GL A/c',
|
||||
controlName: 'creditBalanceLiabilityGlAccountId',
|
||||
options: this.liabilityAccountData,
|
||||
required: false
|
||||
}
|
||||
],
|
||||
otherMappingsControlName: 'liabilitiesOtherGlMappings',
|
||||
|
||||
+176
-2
@@ -6,7 +6,11 @@
|
||||
file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
-->
|
||||
|
||||
<!-- Charges -->
|
||||
<!--
|
||||
Charges & Overdue Charges (native Fineract charge-picker sections) are temporarily
|
||||
disabled — not currently in use (no matching backend charge data / not part of the
|
||||
active workflow). Re-enable by removing this comment block when needed.
|
||||
|
||||
<div class="lpch-section">
|
||||
<div class="lpch-section__header">
|
||||
<i class="fas fa-receipt"></i>
|
||||
@@ -89,7 +93,6 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Overdue Charges -->
|
||||
<div class="lpch-section">
|
||||
<div class="lpch-section__header">
|
||||
<i class="fas fa-exclamation-circle"></i>
|
||||
@@ -171,3 +174,174 @@
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
-->
|
||||
|
||||
<!-- Additional Charges (legacy Page 2/Page 4 charge fields) -->
|
||||
<form [formGroup]="legacyChargesForm">
|
||||
<div class="lpch-section">
|
||||
<div class="lpch-section__header">
|
||||
<i class="fas fa-money-check"></i>
|
||||
<h3>Cheque & Standing Instruction Charges</h3>
|
||||
</div>
|
||||
<div class="lpch-section__body lpch-grid-4">
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Chq. Book Charge</mat-label>
|
||||
<mat-select formControlName="chequeBookChargeEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Chq. Return Charge</mat-label>
|
||||
<mat-select formControlName="chequeReturnChargeEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>I.C. Charge Debit</mat-label>
|
||||
<mat-select formControlName="icChargeDebitEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Cash Bundle Charge</mat-label>
|
||||
<mat-select formControlName="cashBundleChargeEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Cash Bundle Charge With PAN Limit</mat-label>
|
||||
<input matInput type="number" formControlName="cashBundleChargeWithPanLimit" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Per Cheque Entry Charge</mat-label>
|
||||
<input matInput type="number" formControlName="perChequeEntryCharge" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Per Cheque Entry Service Charge</mat-label>
|
||||
<input matInput type="number" formControlName="perChequeEntryServiceCharge" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Per Inward Cheque Entry Charge</mat-label>
|
||||
<input matInput type="number" formControlName="perInwardChequeEntryCharge" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Per Outward Cheque Entry Charge</mat-label>
|
||||
<input matInput type="number" formControlName="perOutwardChequeEntryCharge" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Creditor Standing Instr. Fail Charge</mat-label>
|
||||
<input matInput type="number" formControlName="creditorStandingInstructionFailCharge" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Debtor Standing Instr. Fail Charge</mat-label>
|
||||
<input matInput type="number" formControlName="debtorStandingInstructionFailCharge" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Calculate Daily Against Clearing Charge</mat-label>
|
||||
<mat-select formControlName="calculateDailyAgainstClearingCharge">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="lpch-section">
|
||||
<div class="lpch-section__header">
|
||||
<i class="fas fa-wallet"></i>
|
||||
<h3>Minimum Balance Charges</h3>
|
||||
</div>
|
||||
<div class="lpch-section__body lpch-grid-4">
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Minimum Balance Checking</mat-label>
|
||||
<mat-select formControlName="minimumBalanceCheckingType">
|
||||
<mat-option value="STRICT">Strict</mat-option>
|
||||
<mat-option value="AVERAGE">Average</mat-option>
|
||||
<mat-option value="LENIENT">Lenient</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Auto Minimum Balance Charge</mat-label>
|
||||
<mat-select formControlName="autoMinimumBalanceCharge">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Calculate Daily Min. Balance Charges</mat-label>
|
||||
<mat-select formControlName="calculateDailyMinimumBalanceCharges">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Minimum Balance Charge</mat-label>
|
||||
<mat-select formControlName="minimumBalanceChargeEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Min. Balance Charge (Rs.)</mat-label>
|
||||
<input matInput type="number" formControlName="minimumBalanceChargeAmount" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Min. Balance Charge For Cheque Issue (Rs.)</mat-label>
|
||||
<input matInput type="number" formControlName="minimumBalanceChargeForChequeIssue" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Min. Balance Charge Method</mat-label>
|
||||
<mat-select formControlName="minimumBalanceChargeMethod">
|
||||
<mat-option value="FLAT">Flat</mat-option>
|
||||
<mat-option value="SLAB">Slab</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Months After Min. Balance Charge Calculate</mat-label>
|
||||
<input matInput type="number" formControlName="monthsAfterMinBalanceChargeCalculate" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>For Cheque Issue</mat-label>
|
||||
<input matInput type="number" formControlName="forChequeIssue" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>For Cheque Issue (Avg.)</mat-label>
|
||||
<input matInput type="number" formControlName="forChequeIssueAvg" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>For Withdrawal Slip</mat-label>
|
||||
<input matInput type="number" formControlName="forWithdrawalSlip" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>For Withdrawal Slip (Avg.)</mat-label>
|
||||
<input matInput type="number" formControlName="forWithdrawalSlipAvg" />
|
||||
</mat-form-field>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
+24
@@ -88,3 +88,27 @@ $gray-900: #202124;
|
||||
.lpch-table {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.lpch-section__body {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
align-items: start;
|
||||
gap: 18px 16px;
|
||||
padding: 20px 24px;
|
||||
|
||||
@media (width <= 600px) {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
}
|
||||
|
||||
.lpch-section__body.lpch-grid-4 {
|
||||
grid-template-columns: repeat(4, 1fr);
|
||||
|
||||
@media (width <= 1100px) {
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
}
|
||||
|
||||
@media (width <= 600px) {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
}
|
||||
|
||||
+50
-3
@@ -7,7 +7,7 @@
|
||||
*/
|
||||
|
||||
import { Component, Input, OnInit, inject } from '@angular/core';
|
||||
import { UntypedFormControl } from '@angular/forms';
|
||||
import { UntypedFormControl, UntypedFormBuilder, UntypedFormGroup, ReactiveFormsModule } from '@angular/forms';
|
||||
import { MatDialog } from '@angular/material/dialog';
|
||||
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
@@ -51,12 +51,16 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module';
|
||||
MatRow,
|
||||
ChargesFilterPipe,
|
||||
ChargesPenaltyFilterPipe,
|
||||
FormatNumberPipe
|
||||
FormatNumberPipe,
|
||||
ReactiveFormsModule
|
||||
]
|
||||
})
|
||||
export class LoanProductChargesStepComponent implements OnInit {
|
||||
dialog = inject(MatDialog);
|
||||
private translateService = inject(TranslateService);
|
||||
private formBuilder = inject(UntypedFormBuilder);
|
||||
|
||||
legacyChargesForm: UntypedFormGroup;
|
||||
|
||||
@Input() loanProductsTemplate: any;
|
||||
@Input() currencyCode: UntypedFormControl;
|
||||
@@ -76,6 +80,48 @@ export class LoanProductChargesStepComponent implements OnInit {
|
||||
|
||||
pristine = true;
|
||||
|
||||
constructor() {
|
||||
this.createLegacyChargesForm();
|
||||
}
|
||||
|
||||
createLegacyChargesForm() {
|
||||
this.legacyChargesForm = this.formBuilder.group({
|
||||
// Cheque-related charges (legacy "A/c Mas Scr2 Para")
|
||||
chequeBookChargeEnabled: ['NO'],
|
||||
chequeReturnChargeEnabled: ['NO'],
|
||||
icChargeDebitEnabled: ['NO'],
|
||||
cashBundleChargeEnabled: ['NO'],
|
||||
cashBundleChargeWithPanLimit: [''],
|
||||
|
||||
// Cheque transaction charges (legacy Page 4)
|
||||
perChequeEntryCharge: [''],
|
||||
perChequeEntryServiceCharge: [''],
|
||||
perInwardChequeEntryCharge: [''],
|
||||
perOutwardChequeEntryCharge: [''],
|
||||
|
||||
// Standing Instruction fail charges (legacy Page 4)
|
||||
creditorStandingInstructionFailCharge: [''],
|
||||
debtorStandingInstructionFailCharge: [''],
|
||||
|
||||
// Minimum Balance Information (legacy Page 2 + Page 4)
|
||||
minimumBalanceCheckingType: [''],
|
||||
autoMinimumBalanceCharge: [''],
|
||||
calculateDailyMinimumBalanceCharges: ['NO'],
|
||||
minimumBalanceChargeEnabled: ['NO'],
|
||||
minimumBalanceChargeAmount: [''],
|
||||
minimumBalanceChargeForChequeIssue: [''],
|
||||
minimumBalanceChargeMethod: [''],
|
||||
monthsAfterMinBalanceChargeCalculate: [''],
|
||||
forChequeIssue: [''],
|
||||
forChequeIssueAvg: [''],
|
||||
forWithdrawalSlip: [''],
|
||||
forWithdrawalSlipAvg: [''],
|
||||
|
||||
// Against Clearing charge (legacy Page 4)
|
||||
calculateDailyAgainstClearingCharge: ['NO']
|
||||
});
|
||||
}
|
||||
|
||||
ngOnInit() {
|
||||
this.chargeData = this.loanProductsTemplate.chargeOptions;
|
||||
this.overdueChargeData = this.loanProductsTemplate.penaltyOptions
|
||||
@@ -112,7 +158,8 @@ export class LoanProductChargesStepComponent implements OnInit {
|
||||
|
||||
get loanProductCharges() {
|
||||
return {
|
||||
charges: this.chargesDataSource
|
||||
charges: this.chargesDataSource,
|
||||
...this.legacyChargesForm.value
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
+207
-95
@@ -7,40 +7,144 @@
|
||||
-->
|
||||
|
||||
<form [formGroup]="loanProductDetailsForm">
|
||||
<!-- Product Classification + General Information — merged single section, 2-column layout -->
|
||||
<div class="lpd-section">
|
||||
<div class="lpd-section__header">
|
||||
<i class="fas fa-info-circle"></i>
|
||||
<h3>{{ 'labels.inputs.Product Name' | translate }} & {{ 'labels.inputs.Description' | translate }}</h3>
|
||||
<h3>General Information</h3>
|
||||
</div>
|
||||
<div class="lpd-grid">
|
||||
<mat-form-field appearance="outline" class="lpd-field lpd-field--full">
|
||||
<mat-label>{{ 'labels.inputs.Product Name' | translate }}</mat-label>
|
||||
<input
|
||||
matInput
|
||||
formControlName="name"
|
||||
matTooltip="{{ 'tooltips.Product name is a unique identifier' | translate }}"
|
||||
required
|
||||
/>
|
||||
<mat-error>
|
||||
{{ 'labels.inputs.Product Name' | translate }} {{ 'labels.commons.is' | translate }}
|
||||
<strong>{{ 'labels.commons.required' | translate }}</strong>
|
||||
</mat-error>
|
||||
</mat-form-field>
|
||||
<div class="lpd-two-col">
|
||||
<div class="lpd-two-col__column">
|
||||
<mat-form-field appearance="outline" class="lpd-field">
|
||||
<mat-label>Account Type Group</mat-label>
|
||||
<mat-select formControlName="productTypeGroup">
|
||||
@for (group of productTypeGroups; track group.id) {
|
||||
<mat-option [value]="group.id">{{ group.label }}</mat-option>
|
||||
}
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline" class="lpd-field">
|
||||
<mat-label>{{ 'labels.inputs.Short Name' | translate }}</mat-label>
|
||||
<input
|
||||
matInput
|
||||
formControlName="shortName"
|
||||
maxlength="4"
|
||||
matTooltip="{{ 'tooltips.Short name is a unique identifier' | translate }}"
|
||||
required
|
||||
/>
|
||||
<mat-error>
|
||||
{{ 'labels.inputs.Short Name' | translate }} {{ 'labels.commons.is' | translate }}
|
||||
<strong>{{ 'labels.commons.required' | translate }}</strong>
|
||||
</mat-error>
|
||||
</mat-form-field>
|
||||
@if (availableSubGroups.length) {
|
||||
<mat-form-field appearance="outline" class="lpd-field">
|
||||
<mat-label>Product Type Sub Group</mat-label>
|
||||
<mat-select formControlName="productTypeSubGroup">
|
||||
@for (subGroup of availableSubGroups; track subGroup.id) {
|
||||
<mat-option [value]="subGroup.id">{{ subGroup.label }}</mat-option>
|
||||
}
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
}
|
||||
|
||||
<mat-form-field appearance="outline" class="lpd-field">
|
||||
<mat-label>A/c. Type Description</mat-label>
|
||||
<input
|
||||
matInput
|
||||
formControlName="name"
|
||||
matTooltip="{{ 'tooltips.Product name is a unique identifier' | translate }}"
|
||||
required
|
||||
/>
|
||||
<mat-error>
|
||||
{{ 'labels.inputs.Product Name' | translate }} {{ 'labels.commons.is' | translate }}
|
||||
<strong>{{ 'labels.commons.required' | translate }}</strong>
|
||||
</mat-error>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline" class="lpd-field">
|
||||
<mat-label>{{ 'labels.inputs.Short Name' | translate }}</mat-label>
|
||||
<input
|
||||
matInput
|
||||
formControlName="shortName"
|
||||
maxlength="4"
|
||||
matTooltip="{{ 'tooltips.Short name is a unique identifier' | translate }}"
|
||||
required
|
||||
/>
|
||||
<mat-error>
|
||||
{{ 'labels.inputs.Short Name' | translate }} {{ 'labels.commons.is' | translate }}
|
||||
<strong>{{ 'labels.commons.required' | translate }}</strong>
|
||||
</mat-error>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline" class="lpd-field">
|
||||
<mat-label>A/c Type Code</mat-label>
|
||||
<input matInput formControlName="accountTypeCode" maxlength="2" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline" class="lpd-field">
|
||||
<mat-label>MICR Trn. Code</mat-label>
|
||||
<input matInput formControlName="micrTransactionCode" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline" class="lpd-field">
|
||||
<mat-label>Reserved Code Srno For ECS</mat-label>
|
||||
<input matInput formControlName="reservedEcsSerialNumber" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline" class="lpd-field">
|
||||
<mat-label>Reverse ECS No.</mat-label>
|
||||
<input matInput formControlName="reverseEcsNumber" />
|
||||
</mat-form-field>
|
||||
</div>
|
||||
|
||||
<div class="lpd-two-col__column">
|
||||
<mat-form-field appearance="outline" class="lpd-field">
|
||||
<mat-label>Lock Cheque Info</mat-label>
|
||||
<mat-select formControlName="lockChequeInfoEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline" class="lpd-field">
|
||||
<mat-label>Lock Page 2 Info</mat-label>
|
||||
<mat-select formControlName="lockPageTwoInfoEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline" class="lpd-field" (click)="computerizationDatePicker.open()">
|
||||
<mat-label>Computerization Date</mat-label>
|
||||
<input
|
||||
matInput
|
||||
[min]="minDate"
|
||||
[max]="maxDate"
|
||||
[matDatepicker]="computerizationDatePicker"
|
||||
formControlName="computerizationDate"
|
||||
/>
|
||||
<mat-datepicker-toggle matSuffix [for]="computerizationDatePicker"></mat-datepicker-toggle>
|
||||
<mat-datepicker #computerizationDatePicker></mat-datepicker>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline" class="lpd-field">
|
||||
<mat-label>PFMS Account Type</mat-label>
|
||||
<input matInput formControlName="pfmsAccountType" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline" class="lpd-field">
|
||||
<mat-label>Chq. Print Description</mat-label>
|
||||
<input matInput formControlName="chequePrintDescription" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline" class="lpd-field">
|
||||
<mat-label>POS A/c Type Description</mat-label>
|
||||
<input matInput formControlName="posAccountTypeDescription" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline" class="lpd-field">
|
||||
<mat-label>Renewal Dt. Add Months</mat-label>
|
||||
<input matInput type="number" formControlName="renewalDateAddMonths" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline" class="lpd-field">
|
||||
<mat-label>Renewal Grace Days</mat-label>
|
||||
<input matInput type="number" formControlName="renewalGraceDays" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline" class="lpd-field">
|
||||
<mat-label>Doc. Renewal Dt. Add Months</mat-label>
|
||||
<input matInput type="number" formControlName="documentRenewalDateAddMonths" />
|
||||
</mat-form-field>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -97,86 +201,94 @@
|
||||
<i class="fas fa-percentage"></i>
|
||||
<h3>Interest Information</h3>
|
||||
</div>
|
||||
<div class="lpd-grid">
|
||||
<mat-form-field appearance="outline" class="lpd-field">
|
||||
<mat-label>Debit Int. Calculation</mat-label>
|
||||
<mat-select formControlName="debitIntCalculation">
|
||||
@for (opt of yesNoOptions; track opt.value) {
|
||||
<mat-option [value]="opt.value">{{ opt.label }}</mat-option>
|
||||
}
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline" class="lpd-field">
|
||||
<mat-label>Separate Penal Int.</mat-label>
|
||||
<mat-select formControlName="separatePenalInterest">
|
||||
@for (opt of yesNoOptions; track opt.value) {
|
||||
<mat-option [value]="opt.value">{{ opt.label }}</mat-option>
|
||||
}
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline" class="lpd-field">
|
||||
<mat-label>Credit Int. Calculation</mat-label>
|
||||
<mat-select formControlName="creditIntCalculation">
|
||||
@for (opt of yesNoOptions; track opt.value) {
|
||||
<mat-option [value]="opt.value">{{ opt.label }}</mat-option>
|
||||
}
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline" class="lpd-field">
|
||||
<mat-label>Sub A/c Type Balance</mat-label>
|
||||
<mat-select formControlName="subAccountTypeBalance">
|
||||
@for (opt of yesNoOptions; track opt.value) {
|
||||
<mat-option [value]="opt.value">{{ opt.label }}</mat-option>
|
||||
}
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline" class="lpd-field">
|
||||
<mat-label>Final Int. Rounding</mat-label>
|
||||
<mat-select formControlName="finalIntRounding">
|
||||
@for (opt of yesNoOptions; track opt.value) {
|
||||
<mat-option [value]="opt.value">{{ opt.label }}</mat-option>
|
||||
}
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
@if (loanProductDetailsForm.get('finalIntRounding')?.value) {
|
||||
<div class="lpd-two-col">
|
||||
<div class="lpd-two-col__column">
|
||||
<mat-form-field appearance="outline" class="lpd-field">
|
||||
<mat-label>Rounding UpTo</mat-label>
|
||||
<input matInput type="number" formControlName="roundingUpTo" min="0" />
|
||||
<mat-label>Debit Int. Calculation</mat-label>
|
||||
<mat-select formControlName="debitIntCalculation">
|
||||
@for (opt of yesNoOptions; track opt.value) {
|
||||
<mat-option [value]="opt.value">{{ opt.label }}</mat-option>
|
||||
}
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
}
|
||||
|
||||
<mat-form-field appearance="outline" class="lpd-field">
|
||||
<mat-label>Separate Penal Int.</mat-label>
|
||||
<mat-select formControlName="separatePenalInterest">
|
||||
@for (opt of yesNoOptions; track opt.value) {
|
||||
<mat-option [value]="opt.value">{{ opt.label }}</mat-option>
|
||||
}
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline" class="lpd-field">
|
||||
<mat-label>Final Int. Rounding</mat-label>
|
||||
<mat-select formControlName="finalIntRounding">
|
||||
@for (opt of yesNoOptions; track opt.value) {
|
||||
<mat-option [value]="opt.value">{{ opt.label }}</mat-option>
|
||||
}
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
@if (loanProductDetailsForm.get('finalIntRounding')?.value) {
|
||||
<mat-form-field appearance="outline" class="lpd-field">
|
||||
<mat-label>Rounding UpTo</mat-label>
|
||||
<input matInput type="number" formControlName="roundingUpTo" min="0" />
|
||||
</mat-form-field>
|
||||
}
|
||||
</div>
|
||||
|
||||
<div class="lpd-two-col__column">
|
||||
<mat-form-field appearance="outline" class="lpd-field">
|
||||
<mat-label>Credit Int. Calculation</mat-label>
|
||||
<mat-select formControlName="creditIntCalculation">
|
||||
@for (opt of yesNoOptions; track opt.value) {
|
||||
<mat-option [value]="opt.value">{{ opt.label }}</mat-option>
|
||||
}
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline" class="lpd-field">
|
||||
<mat-label>Sub A/c Type Balance</mat-label>
|
||||
<mat-select formControlName="subAccountTypeBalance">
|
||||
@for (opt of yesNoOptions; track opt.value) {
|
||||
<mat-option [value]="opt.value">{{ opt.label }}</mat-option>
|
||||
}
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
</div>
|
||||
</div>
|
||||
<div class="lpd-info-note">
|
||||
<i class="fas fa-circle-info"></i>
|
||||
GL Account mappings for these fields (Int. Receivables, Penal Int. Cr., RD Matured, Int. Payable, Deaf Int.
|
||||
Payable, Int. Overdue Reserve, UnDebited Interest) are available in the <strong>Accounting</strong> tab.
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Product Classification + GL Account — combined section -->
|
||||
<!-- PPS Limit & Write Off Details (legacy Page 1 bottom fields) -->
|
||||
<div class="lpd-section">
|
||||
<div class="lpd-section__header">
|
||||
<i class="fas fa-sitemap"></i>
|
||||
<h3>Product Classification</h3>
|
||||
<i class="fas fa-ban"></i>
|
||||
<h3>PPS Limit & Write Off Details</h3>
|
||||
</div>
|
||||
<div class="lpd-grid">
|
||||
<mat-form-field appearance="outline" class="lpd-field">
|
||||
<mat-label>Product Type Group</mat-label>
|
||||
<mat-select formControlName="productTypeGroup">
|
||||
@for (group of productTypeGroups; track group.id) {
|
||||
<mat-option [value]="group.id">{{ group.label }}</mat-option>
|
||||
}
|
||||
<mat-label>PPS Limit</mat-label>
|
||||
<input matInput type="number" formControlName="ppsLimit" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline" class="lpd-field">
|
||||
<mat-label>Is this Actyp Write Off?</mat-label>
|
||||
<mat-select formControlName="isWriteOffAccountType">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
@if (loanProductDetailsForm.get('productTypeGroup')?.value) {
|
||||
@if (loanProductDetailsForm.get('isWriteOffAccountType')?.value === 'YES') {
|
||||
<mat-form-field appearance="outline" class="lpd-field">
|
||||
<mat-label>GL Account ({{ glClassificationLabel }})</mat-label>
|
||||
<mat-select formControlName="glAccount">
|
||||
@for (acc of availableGlAccounts; track acc.id) {
|
||||
<mat-option [value]="acc.id"> ({{ acc.glCode }}) {{ acc.name }} </mat-option>
|
||||
}
|
||||
</mat-select>
|
||||
<mat-error>GL Account is required</mat-error>
|
||||
<mat-label>Write Off Actyp</mat-label>
|
||||
<input matInput formControlName="writeOffAccountTypeCode" />
|
||||
</mat-form-field>
|
||||
}
|
||||
</div>
|
||||
|
||||
+42
-3
@@ -46,9 +46,10 @@ $gray-900: #202124;
|
||||
|
||||
.lpd-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
gap: 4px 16px;
|
||||
padding: 16px 24px;
|
||||
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
|
||||
align-items: start;
|
||||
gap: 18px 16px;
|
||||
padding: 20px 24px;
|
||||
|
||||
@media (width <= 600px) {
|
||||
grid-template-columns: 1fr;
|
||||
@@ -57,6 +58,7 @@ $gray-900: #202124;
|
||||
|
||||
.lpd-field {
|
||||
width: 100%;
|
||||
min-width: 0;
|
||||
|
||||
&--full {
|
||||
grid-column: 1 / -1;
|
||||
@@ -69,6 +71,43 @@ $gray-900: #202124;
|
||||
padding: 4px 0;
|
||||
}
|
||||
|
||||
// Two independent vertical columns of fields, side by side
|
||||
.lpd-two-col {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 4px 40px;
|
||||
padding: 20px 24px;
|
||||
align-items: start;
|
||||
|
||||
@media (width <= 700px) {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
&__column {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
}
|
||||
|
||||
.lpd-info-note {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
gap: 8px;
|
||||
margin: 0 24px 16px;
|
||||
padding: 10px 14px;
|
||||
background: #eff6ff;
|
||||
border: 1px solid #bfdbfe;
|
||||
border-radius: 8px;
|
||||
font-size: 12.5px;
|
||||
color: #1e3a8a;
|
||||
line-height: 1.5;
|
||||
|
||||
i {
|
||||
color: #2563eb;
|
||||
margin-top: 2px;
|
||||
}
|
||||
}
|
||||
|
||||
// GL Section
|
||||
.lpd-gl-section {
|
||||
border-top: 2px solid #e0f2fe;
|
||||
|
||||
+66
-57
@@ -7,7 +7,7 @@
|
||||
*/
|
||||
|
||||
/** Angular Imports */
|
||||
import { Component, OnInit, Input, inject } from '@angular/core';
|
||||
import { Component, OnInit, Input, Output, EventEmitter, inject } from '@angular/core';
|
||||
import { UntypedFormGroup, UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms';
|
||||
import { Dates } from 'app/core/utils/dates';
|
||||
|
||||
@@ -33,6 +33,7 @@ export class LoanProductDetailsStepComponent implements OnInit {
|
||||
private settingsService = inject(SettingsService);
|
||||
|
||||
@Input() loanProductsTemplate: any;
|
||||
@Output() productSubGroupChange = new EventEmitter<string>();
|
||||
|
||||
loanProductDetailsForm: UntypedFormGroup;
|
||||
|
||||
@@ -49,6 +50,10 @@ export class LoanProductDetailsStepComponent implements OnInit {
|
||||
this.createLoanProductDetailsForm();
|
||||
}
|
||||
|
||||
assetAccountOptions: any[] = [];
|
||||
incomeAccountOptions: any[] = [];
|
||||
liabilityAccountOptions: any[] = [];
|
||||
|
||||
ngOnInit() {
|
||||
this.loanProductDetailsForm.patchValue({
|
||||
name: this.loanProductsTemplate.name,
|
||||
@@ -58,10 +63,6 @@ export class LoanProductDetailsStepComponent implements OnInit {
|
||||
closeDate: this.loanProductsTemplate.closeDate && new Date(this.loanProductsTemplate.closeDate)
|
||||
});
|
||||
|
||||
const mappingOptions = this.loanProductsTemplate?.accountingMappingOptions ?? {};
|
||||
this.assetAccountOptions = mappingOptions.assetAccountOptions ?? [];
|
||||
this.liabilityAccountOptions = mappingOptions.liabilityAccountOptions ?? [];
|
||||
|
||||
this.loanProductDetailsForm.patchValue({
|
||||
debitIntCalculation: this.loanProductsTemplate.debitIntCalculation ?? false,
|
||||
separatePenalInterest: this.loanProductsTemplate.separatePenalInterest ?? false,
|
||||
@@ -70,66 +71,59 @@ export class LoanProductDetailsStepComponent implements OnInit {
|
||||
finalIntRounding: this.loanProductsTemplate.finalIntRounding ?? false,
|
||||
roundingUpTo: this.loanProductsTemplate.roundingUpTo ?? null
|
||||
});
|
||||
|
||||
const mappingOptions = this.loanProductsTemplate?.accountingMappingOptions ?? {};
|
||||
this.assetAccountOptions = mappingOptions.assetAccountOptions ?? [];
|
||||
this.incomeAccountOptions = mappingOptions.incomeAccountOptions ?? [];
|
||||
this.liabilityAccountOptions = mappingOptions.liabilityAccountOptions ?? [];
|
||||
|
||||
const accountingMappings = this.loanProductsTemplate?.accountingMappings;
|
||||
if (accountingMappings) {
|
||||
this.loanProductDetailsForm.patchValue({
|
||||
intReceivablesGlAccountId: accountingMappings.intReceivablesGlAccount?.id || '',
|
||||
penalIntCrGlAccountId: accountingMappings.penalIntCrGlAccount?.id || '',
|
||||
rdMaturedGlAccountId: accountingMappings.rdMaturedGlAccount?.id || '',
|
||||
intPayableGlAccountId: accountingMappings.intPayableGlAccount?.id || '',
|
||||
deafIntPayableGlAccountId: accountingMappings.deafIntPayableGlAccount?.id || '',
|
||||
intOverdueReserveAccountId: accountingMappings.intOverdueReserveAccount?.id || '',
|
||||
undebitedInterestAccountId: accountingMappings.undebitedInterestAccount?.id || ''
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/** Product Classification data */
|
||||
readonly productTypeGroups = [
|
||||
{ id: 'loans', label: 'Loan' },
|
||||
{ id: 'advanced', label: 'Advanced' }
|
||||
{ id: 'advances', label: 'Advances A/C' },
|
||||
{ id: 'loans', label: 'Loans A/C' }
|
||||
];
|
||||
|
||||
readonly productTypeSubGroups: Record<string, { id: string; label: string }[]> = {
|
||||
loans: [
|
||||
{ id: 'emi', label: 'EMI' },
|
||||
{ id: 'cc', label: 'CC (Cash Credit)' },
|
||||
{ id: 'overdraft', label: 'Overdraft' },
|
||||
{ id: 'warehouse', label: 'Warehouse' },
|
||||
{ id: 'gold', label: 'Gold' }
|
||||
// Renewable, Drawing-Power/limit-based revolving credit facilities
|
||||
advances: [
|
||||
{ id: 'cc', label: 'Cash Credit (CC)' },
|
||||
{ id: 'overdraft', label: 'Overdraft (OD)' },
|
||||
{ id: 'gold', label: 'Gold Loan' },
|
||||
{ id: 'warehouse', label: 'Warehouse Receipt / Pledge Loan' },
|
||||
{ id: 'kcc', label: 'Kisan Credit Card (KCC)' },
|
||||
{ id: 'bills', label: 'Bills Purchased / Discounted' }
|
||||
],
|
||||
advanced: [
|
||||
{ id: 'fd', label: 'FD (Fixed Deposit)' },
|
||||
{ id: 'rd', label: 'RD (Recurring Deposit)' }
|
||||
// Fixed disbursement, fixed tenure, EMI-based term credit facilities
|
||||
loans: [
|
||||
{ id: 'term', label: 'Term Loan / Long Term Loan' },
|
||||
{ id: 'personal', label: 'Personal Loan' },
|
||||
{ id: 'housing', label: 'Housing Loan' },
|
||||
{ id: 'vehicle', label: 'Vehicle Loan' },
|
||||
{ id: 'education', label: 'Education Loan' },
|
||||
{ id: 'business', label: 'Business / MSME Term Loan' },
|
||||
{ id: 'gold_emi', label: 'Gold EMI Loan' }
|
||||
]
|
||||
};
|
||||
|
||||
/** Default GL per product type group */
|
||||
private readonly glDefaultMap: Record<string, string> = {
|
||||
loans: 'asset',
|
||||
advanced: 'asset'
|
||||
};
|
||||
|
||||
get availableSubGroups() {
|
||||
const group = this.loanProductDetailsForm.get('productTypeGroup')?.value;
|
||||
return group ? (this.productTypeSubGroups[group] ?? []) : [];
|
||||
}
|
||||
|
||||
get glOptions(): string[] {
|
||||
return [
|
||||
'asset',
|
||||
'liability'
|
||||
];
|
||||
}
|
||||
|
||||
assetAccountOptions: any[] = [];
|
||||
liabilityAccountOptions: any[] = [];
|
||||
|
||||
get availableGlAccounts(): any[] {
|
||||
const type = this.loanProductDetailsForm.get('glClassification')?.value;
|
||||
if (type === 'asset') return this.assetAccountOptions;
|
||||
if (type === 'liability') return this.liabilityAccountOptions;
|
||||
return [];
|
||||
}
|
||||
|
||||
get glClassificationLabel(): string {
|
||||
const type = this.loanProductDetailsForm.get('glClassification')?.value;
|
||||
return type === 'liability' ? 'Liability' : 'Asset';
|
||||
}
|
||||
|
||||
get selectedGroupLabel(): string {
|
||||
const group = this.loanProductDetailsForm.get('productTypeGroup')?.value;
|
||||
return this.productTypeGroups.find((g) => g.id === group)?.label ?? '';
|
||||
}
|
||||
|
||||
readonly yesNoOptions = [
|
||||
{ value: true, label: 'YES' },
|
||||
{ value: false, label: 'NO' }
|
||||
@@ -150,21 +144,36 @@ export class LoanProductDetailsStepComponent implements OnInit {
|
||||
closeDate: [''],
|
||||
productTypeGroup: [''],
|
||||
productTypeSubGroup: [''],
|
||||
glClassification: ['asset'],
|
||||
glAccount: [''],
|
||||
debitIntCalculation: [false],
|
||||
separatePenalInterest: [false],
|
||||
creditIntCalculation: [false],
|
||||
subAccountTypeBalance: [false],
|
||||
finalIntRounding: [false],
|
||||
roundingUpTo: [null]
|
||||
roundingUpTo: [null],
|
||||
|
||||
// General Information (legacy Page 1 header fields)
|
||||
accountTypeCode: [''],
|
||||
micrTransactionCode: [''],
|
||||
reservedEcsSerialNumber: [''],
|
||||
reverseEcsNumber: [''],
|
||||
lockChequeInfoEnabled: ['NO'],
|
||||
lockPageTwoInfoEnabled: ['NO'],
|
||||
computerizationDate: [''],
|
||||
chequePrintDescription: [''],
|
||||
posAccountTypeDescription: [''],
|
||||
pfmsAccountType: [''],
|
||||
renewalDateAddMonths: [''],
|
||||
renewalGraceDays: [''],
|
||||
documentRenewalDateAddMonths: [''],
|
||||
|
||||
// PPS Limit & Write Off Details
|
||||
ppsLimit: [''],
|
||||
isWriteOffAccountType: ['NO'],
|
||||
writeOffAccountTypeCode: ['']
|
||||
});
|
||||
|
||||
// Auto-set GL based on product type group
|
||||
this.loanProductDetailsForm.get('productTypeGroup')?.valueChanges.subscribe((group: string) => {
|
||||
const defaultVal = this.glDefaultMap[group] ?? 'asset';
|
||||
this.loanProductDetailsForm.get('glClassification')?.setValue(defaultVal);
|
||||
this.loanProductDetailsForm.get('glAccount')?.setValue('');
|
||||
this.loanProductDetailsForm.get('productTypeSubGroup')?.valueChanges.subscribe((subGroup: string) => {
|
||||
this.productSubGroupChange.emit(subGroup);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
+712
-176
@@ -235,209 +235,361 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Cheque Book Settings -->
|
||||
<div class="lps-section">
|
||||
<div class="lps-section__header">
|
||||
<i class="fas fa-money-check lps-section__icon"></i>
|
||||
<h3 class="lps-section__title">Cheque Book Settings</h3>
|
||||
</div>
|
||||
<div class="lps-section__body lps-grid-4">
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Cheque Book Issue Enabled</mat-label>
|
||||
<mat-select formControlName="chequeBookIssueEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
<mat-accordion class="lps-accordion" multi="true">
|
||||
@if (showChequeBookSettings) {
|
||||
<mat-expansion-panel [expanded]="true">
|
||||
<mat-expansion-panel-header>
|
||||
<mat-panel-title>
|
||||
<i class="fas fa-money-check lps-section__icon"></i>
|
||||
Cheque Book Settings
|
||||
</mat-panel-title>
|
||||
</mat-expansion-panel-header>
|
||||
<div class="lps-section__body lps-grid-4">
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Cheque Book Issue Enabled</mat-label>
|
||||
<mat-select formControlName="chequeBookIssueEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Cheque Validation Required</mat-label>
|
||||
<mat-select formControlName="chequeValidationRequired">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Cheque Validation Required</mat-label>
|
||||
<mat-select formControlName="chequeValidationRequired">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Is First Cheque Book Free</mat-label>
|
||||
<mat-select formControlName="isFirstChequeBookFree">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Is First Cheque Book Free</mat-label>
|
||||
<mat-select formControlName="isFirstChequeBookFree">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Cheque Printing Account Type</mat-label>
|
||||
<mat-select formControlName="chequePrintingAccountType">
|
||||
<mat-option value="SAVINGS_BANK">Savings Bank</mat-option>
|
||||
<mat-option value="CURRENT_ACCOUNT">Current Account</mat-option>
|
||||
<mat-option value="CASH_CREDIT">Cash Credit</mat-option>
|
||||
<mat-option value="OVERDRAFT">Overdraft</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Cheque Printing Account Type</mat-label>
|
||||
<mat-select formControlName="chequePrintingAccountType">
|
||||
<mat-option value="SAVINGS_BANK">Savings Bank</mat-option>
|
||||
<mat-option value="CURRENT_ACCOUNT">Current Account</mat-option>
|
||||
<mat-option value="CASH_CREDIT">Cash Credit</mat-option>
|
||||
<mat-option value="OVERDRAFT">Overdraft</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Allow Withdrawal Slip Usage</mat-label>
|
||||
<mat-select formControlName="allowWithdrawalSlipUsage">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Allow Withdrawal Slip Usage</mat-label>
|
||||
<mat-select formControlName="allowWithdrawalSlipUsage">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Maintain Cheque Book Stock Registry</mat-label>
|
||||
<mat-select formControlName="maintainChequeBookStockRegistry">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Maintain Cheque Book Stock Registry</mat-label>
|
||||
<mat-select formControlName="maintainChequeBookStockRegistry">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Free Cheque Books Per Year</mat-label>
|
||||
<input type="number" matInput formControlName="freeChequeBooksPerYear" />
|
||||
</mat-form-field>
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Free Cheque Books Per Year</mat-label>
|
||||
<input type="number" matInput formControlName="freeChequeBooksPerYear" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Allow Credit By Cheque Number</mat-label>
|
||||
<mat-select formControlName="allowCreditByChequeNumber">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Allow Credit By Cheque Number</mat-label>
|
||||
<mat-select formControlName="allowCreditByChequeNumber">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Credit Cheque Validation Required</mat-label>
|
||||
<mat-select formControlName="creditChequeValidationRequired">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Credit Cheque Validation Required</mat-label>
|
||||
<mat-select formControlName="creditChequeValidationRequired">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Grace Days For Stock Statement</mat-label>
|
||||
<input type="number" matInput formControlName="graceDaysForStockStatement" />
|
||||
</mat-form-field>
|
||||
</div>
|
||||
</div>
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Grace Days For Stock Statement</mat-label>
|
||||
<input type="number" matInput formControlName="graceDaysForStockStatement" />
|
||||
</mat-form-field>
|
||||
</div>
|
||||
</mat-expansion-panel>
|
||||
}
|
||||
|
||||
<!-- Additional Product Settings -->
|
||||
<div class="lps-section">
|
||||
<div class="lps-section__header">
|
||||
<i class="fas fa-cogs lps-section__icon"></i>
|
||||
<h3 class="lps-section__title">Additional Product Settings</h3>
|
||||
</div>
|
||||
<div class="lps-section__body lps-grid-4">
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Account Type Active For Transactions</mat-label>
|
||||
<mat-select formControlName="accountTypeActiveForTransactions">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
<mat-expansion-panel [expanded]="true">
|
||||
<mat-expansion-panel-header>
|
||||
<mat-panel-title>
|
||||
<i class="fas fa-cogs lps-section__icon"></i>
|
||||
Additional Product Settings
|
||||
</mat-panel-title>
|
||||
</mat-expansion-panel-header>
|
||||
<div class="lps-section__body lps-grid-4">
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Account Type Active For Transactions</mat-label>
|
||||
<mat-select formControlName="accountTypeActiveForTransactions">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Sub Type Activity Enabled</mat-label>
|
||||
<mat-select formControlName="subTypeActivityEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Sub Type Activity Enabled</mat-label>
|
||||
<mat-select formControlName="subTypeActivityEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Account Opening Charges</mat-label>
|
||||
<input type="number" matInput formControlName="accountOpeningCharges" />
|
||||
</mat-form-field>
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Account Opening Charges</mat-label>
|
||||
<input type="number" matInput formControlName="accountOpeningCharges" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Maximum Gold Loan Limit</mat-label>
|
||||
<input type="number" matInput formControlName="maximumGoldLoanLimit" />
|
||||
</mat-form-field>
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Maximum Gold Loan Limit</mat-label>
|
||||
<input type="number" matInput formControlName="maximumGoldLoanLimit" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Last Account Number Opened</mat-label>
|
||||
<input type="text" matInput formControlName="lastAccountNumberOpened" />
|
||||
</mat-form-field>
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Gold Loan [Packet No.] With Year?</mat-label>
|
||||
<mat-select formControlName="goldLoanPacketNumberWithYearEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Customer Termination Allowed</mat-label>
|
||||
<mat-select formControlName="customerTerminationAllowed">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Last Account Number Opened</mat-label>
|
||||
<input type="text" matInput formControlName="lastAccountNumberOpened" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Charges For Cash Credit Above Limit</mat-label>
|
||||
<input type="number" matInput formControlName="chargesForCashCreditAboveLimit" />
|
||||
</mat-form-field>
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Customer Termination Allowed</mat-label>
|
||||
<mat-select formControlName="customerTerminationAllowed">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Death Interest GL Account</mat-label>
|
||||
<input type="text" matInput formControlName="deathInterestGLAccount" />
|
||||
</mat-form-field>
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Charges For Cash Credit Above Limit</mat-label>
|
||||
<input type="number" matInput formControlName="chargesForCashCreditAboveLimit" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Starting Ledger Number</mat-label>
|
||||
<input type="number" matInput formControlName="startingLedgerNumber" />
|
||||
</mat-form-field>
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Death Interest GL Account</mat-label>
|
||||
<input type="text" matInput formControlName="deathInterestGLAccount" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Ending Ledger Number</mat-label>
|
||||
<input type="number" matInput formControlName="endingLedgerNumber" />
|
||||
</mat-form-field>
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Starting Ledger Number</mat-label>
|
||||
<input type="number" matInput formControlName="startingLedgerNumber" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Current Ledger Number</mat-label>
|
||||
<input type="number" matInput formControlName="currentLedgerNumber" />
|
||||
</mat-form-field>
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Ending Ledger Number</mat-label>
|
||||
<input type="number" matInput formControlName="endingLedgerNumber" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Remittance Account Number</mat-label>
|
||||
<input type="text" matInput formControlName="remittanceAccountNumber" />
|
||||
</mat-form-field>
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Current Ledger Number</mat-label>
|
||||
<input type="number" matInput formControlName="currentLedgerNumber" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Is Non Resident Indian Account</mat-label>
|
||||
<mat-select formControlName="isNonResidentIndianAccount">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Remittance Account Number</mat-label>
|
||||
<input type="text" matInput formControlName="remittanceAccountNumber" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Debit Clearing GL Account</mat-label>
|
||||
<input type="text" matInput formControlName="debitClearingGLAccount" />
|
||||
</mat-form-field>
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Is Non Resident Indian Account</mat-label>
|
||||
<mat-select formControlName="isNonResidentIndianAccount">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Missed Call Alert Service Active</mat-label>
|
||||
<mat-select formControlName="missedCallAlertServiceActive">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Debit Clearing GL Account</mat-label>
|
||||
<input type="text" matInput formControlName="debitClearingGLAccount" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Standing Instruction Charge GL Account</mat-label>
|
||||
<input type="text" matInput formControlName="standingInstructionChargeGLAccount" />
|
||||
</mat-form-field>
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Missed Call Alert Service Active</mat-label>
|
||||
<mat-select formControlName="missedCallAlertServiceActive">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Standing Instruction Debit Charge Skip Option</mat-label>
|
||||
<mat-select formControlName="standingInstructionDebitChargeSkipOption">
|
||||
<mat-option value="SKIP_ALWAYS">Skip Always</mat-option>
|
||||
<mat-option value="SKIP_ON_FIRST_FAILURE">Skip on First Failure</mat-option>
|
||||
<mat-option value="NEVER_SKIP">Never Skip</mat-option>
|
||||
<mat-option value="RETRY_AFTER_24_HOURS">Retry after 24 Hours</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Standing Instruction Charge GL Account</mat-label>
|
||||
<input type="text" matInput formControlName="standingInstructionChargeGLAccount" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Opening Balance Multiplier For Remittance Charges</mat-label>
|
||||
<input type="number" matInput formControlName="openingBalanceMultiplierForRemittanceCharges" />
|
||||
</mat-form-field>
|
||||
</div>
|
||||
</div>
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Standing Instruction Debit Charge Skip Option</mat-label>
|
||||
<mat-select formControlName="standingInstructionDebitChargeSkipOption">
|
||||
<mat-option value="SKIP_ALWAYS">Skip Always</mat-option>
|
||||
<mat-option value="SKIP_ON_FIRST_FAILURE">Skip on First Failure</mat-option>
|
||||
<mat-option value="NEVER_SKIP">Never Skip</mat-option>
|
||||
<mat-option value="RETRY_AFTER_24_HOURS">Retry after 24 Hours</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Opening Balance Multiplier For Remittance Charges</mat-label>
|
||||
<input type="number" matInput formControlName="openingBalanceMultiplierForRemittanceCharges" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>A/c Move To InOperative A/c</mat-label>
|
||||
<mat-select formControlName="accountMoveToInoperativeEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Generate GL Diff Entry</mat-label>
|
||||
<mat-select formControlName="generateGlDiffEntryEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Sub Type Wise GL Balance Gen</mat-label>
|
||||
<mat-select formControlName="subTypeWiseGlBalanceGenerationEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Want To Validation While Deleting Debit Entry</mat-label>
|
||||
<mat-select formControlName="validateBeforeDeletingDebitEntryEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Want To RC File Concept</mat-label>
|
||||
<mat-select formControlName="rcFileConceptEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>A/c Close With Zero Bal. In Open Day Process</mat-label>
|
||||
<mat-select formControlName="accountCloseZeroBalanceInOpenDayProcess">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>A/c Close When Bal. Zero At Subled Tran Entry</mat-label>
|
||||
<mat-select formControlName="accountCloseZeroBalanceAtSubledgerTranEntry">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Lmt.Enh/Ag.Clg Screen Display</mat-label>
|
||||
<mat-select formControlName="limitEnhancementAgainstClearingScreenDisplayEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Advance Int. Param In Ledger</mat-label>
|
||||
<mat-select formControlName="advanceInterestParameterInLedgerEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Vehicle Detail In Master</mat-label>
|
||||
<mat-select formControlName="vehicleDetailInMasterEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Deleted Chq. Issue</mat-label>
|
||||
<mat-select formControlName="deletedChequeIssueEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>DP Reduce In Doc. Renewal Date</mat-label>
|
||||
<mat-select formControlName="dpReduceInDocumentRenewalDateEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>DP Reduce In Renewal Date</mat-label>
|
||||
<mat-select formControlName="dpReduceInRenewalDateEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Auto Close Day-End</mat-label>
|
||||
<mat-select formControlName="autoCloseAtDayEndEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Loan Rate From Master</mat-label>
|
||||
<mat-select formControlName="loanRateFromMasterEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Cheque Short Name</mat-label>
|
||||
<input type="text" matInput formControlName="chequeShortName" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Statement Print</mat-label>
|
||||
<mat-select formControlName="statementPrintEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>NESL Code</mat-label>
|
||||
<input type="text" matInput formControlName="neslCode" />
|
||||
</mat-form-field>
|
||||
</div>
|
||||
</mat-expansion-panel>
|
||||
</mat-accordion>
|
||||
|
||||
<!-- Interest Related Parameters (Page 3) -->
|
||||
<div class="lps-section">
|
||||
@@ -754,6 +906,85 @@
|
||||
<mat-label>Add Penal Interest Rate</mat-label>
|
||||
<input type="number" matInput formControlName="addPenalInterestRate" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Atyp14 Simple Int.</mat-label>
|
||||
<mat-select formControlName="atyp14SimpleInterestEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>FDOD Margin Type</mat-label>
|
||||
<input type="text" matInput formControlName="fixedDepositOverdraftMarginType" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline" class="lps-span-2">
|
||||
<mat-label>Check Master Detail Edited (Passing Pend.)</mat-label>
|
||||
<mat-select formControlName="checkMasterDetailEditedPassingPendingEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline" class="lps-span-2">
|
||||
<mat-label>Credit/Debit Int. Calc. Separate</mat-label>
|
||||
<mat-select formControlName="creditDebitInterestCalculationSeparateEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>On Time Interest Provision</mat-label>
|
||||
<mat-select formControlName="onTimeInterestProvisionEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Check Against Clearing</mat-label>
|
||||
<mat-select formControlName="checkAgainstClearingEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>GST On Penalty</mat-label>
|
||||
<mat-select formControlName="gstOnPenaltyEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Penalty Int. Grace Days</mat-label>
|
||||
<input type="number" min="0" matInput formControlName="penaltyInterestGraceDays" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Over Drawn Int. Rate</mat-label>
|
||||
<input type="number" matInput formControlName="overdrawnInterestRate" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline" class="lps-span-2">
|
||||
<mat-label>Calculate Daily Limit Enhancement (TOD)</mat-label>
|
||||
<mat-select formControlName="calculateDailyLimitEnhancementTodEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline" class="lps-span-2">
|
||||
<mat-label>FDOD Multiple Int. Rate</mat-label>
|
||||
<mat-select formControlName="fixedDepositOverdraftMultipleInterestRateEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -801,6 +1032,306 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<mat-accordion class="lps-accordion" multi="true">
|
||||
@if (showChannelLimits) {
|
||||
<mat-expansion-panel [expanded]="true">
|
||||
<mat-expansion-panel-header>
|
||||
<mat-panel-title>
|
||||
<i class="fas fa-network-wired lps-section__icon"></i>
|
||||
Channel & Transaction Limits
|
||||
</mat-panel-title>
|
||||
</mat-expansion-panel-header>
|
||||
<div class="lps-section__body lps-grid-4">
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Is Mobile App?</mat-label>
|
||||
<mat-select formControlName="isMobileAppEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Is ATM?</mat-label>
|
||||
<mat-select formControlName="isAtmEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
@if (loanProductSettingsForm.value.isAtmEnabled === 'YES') {
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>ATM Yearly Charge?</mat-label>
|
||||
<mat-select formControlName="atmYearlyChargeEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>ATM Min. Balance</mat-label>
|
||||
<input type="number" matInput formControlName="atmMinimumBalance" />
|
||||
</mat-form-field>
|
||||
}
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Email Active?</mat-label>
|
||||
<mat-select formControlName="emailActiveEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Is IMPS?</mat-label>
|
||||
<mat-select formControlName="isImpsEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Is UPI?</mat-label>
|
||||
<mat-select formControlName="isUpiEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Is POS?</mat-label>
|
||||
<mat-select formControlName="isPosEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Is BBPS?</mat-label>
|
||||
<mat-select formControlName="isBbpsEnabled">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Inter Bank Limit (Per Day)</mat-label>
|
||||
<input type="number" matInput formControlName="interBankLimitPerDay" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Inter Bank Limit (Per Transaction)</mat-label>
|
||||
<input type="number" matInput formControlName="interBankLimitPerTransaction" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>NEFT/RTGS Limit (Per Day)</mat-label>
|
||||
<input type="number" matInput formControlName="neftRtgsLimitPerDay" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>NEFT/RTGS Limit (Per Transaction)</mat-label>
|
||||
<input type="number" matInput formControlName="neftRtgsLimitPerTransaction" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>NEFT Cutoff Limit</mat-label>
|
||||
<input type="number" matInput formControlName="neftCutoffLimit" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>RTGS Cutoff Limit</mat-label>
|
||||
<input type="number" matInput formControlName="rtgsCutoffLimit" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>NEFT/RTGS Min. Balance</mat-label>
|
||||
<input type="number" matInput formControlName="neftRtgsMinimumBalance" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Is Charge Req. NEFT/RTGS (CBS)?</mat-label>
|
||||
<mat-select formControlName="isChargeRequiredNeftRtgsCbs">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Is Charge Req. NEFT/RTGS (Mobile)?</mat-label>
|
||||
<mat-select formControlName="isChargeRequiredNeftRtgsMobile">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
@if (loanProductSettingsForm.value.isImpsEnabled === 'YES') {
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>IMPS Limit (Per Day)</mat-label>
|
||||
<input type="number" matInput formControlName="impsLimitPerDay" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>IMPS Limit (Per Transaction)</mat-label>
|
||||
<input type="number" matInput formControlName="impsLimitPerTransaction" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>IMPS Limit (Per Month)</mat-label>
|
||||
<input type="number" matInput formControlName="impsLimitPerMonth" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>IMPS Min. Limit</mat-label>
|
||||
<input type="number" matInput formControlName="impsMinLimit" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>IMPS Monthly Transaction Count</mat-label>
|
||||
<input type="number" matInput formControlName="impsMonthlyTransactionCount" />
|
||||
</mat-form-field>
|
||||
}
|
||||
</div>
|
||||
</mat-expansion-panel>
|
||||
}
|
||||
|
||||
@if (
|
||||
showChannelLimits &&
|
||||
(loanProductSettingsForm.value.isPosEnabled === 'YES' || loanProductSettingsForm.value.isAtmEnabled === 'YES')
|
||||
) {
|
||||
<mat-expansion-panel [expanded]="true">
|
||||
<mat-expansion-panel-header>
|
||||
<mat-panel-title>
|
||||
<i class="fas fa-credit-card lps-section__icon"></i>
|
||||
POS Facility & ATM CSV Settings
|
||||
</mat-panel-title>
|
||||
</mat-expansion-panel-header>
|
||||
<div class="lps-section__body lps-grid-4">
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Max Per Transaction Limit (ATM)</mat-label>
|
||||
<input type="number" matInput formControlName="maxPerTransactionLimitAtm" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Max Day Transaction Limit (ATM)</mat-label>
|
||||
<input type="number" matInput formControlName="maxDayTransactionLimitAtm" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Max Per Transaction Limit (POS)</mat-label>
|
||||
<input type="number" matInput formControlName="maxPerTransactionLimitPos" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Max Day Transaction Limit (POS)</mat-label>
|
||||
<input type="number" matInput formControlName="maxDayTransactionLimitPos" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Max Per Transaction Limit (ECOM)</mat-label>
|
||||
<input type="number" matInput formControlName="maxPerTransactionLimitEcom" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Max Day Transaction Limit (ECOM)</mat-label>
|
||||
<input type="number" matInput formControlName="maxDayTransactionLimitEcom" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Max Per Transaction Limit (UPI)</mat-label>
|
||||
<input type="number" matInput formControlName="maxPerTransactionLimitUpi" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Max Day Transaction Limit (UPI)</mat-label>
|
||||
<input type="number" matInput formControlName="maxDayTransactionLimitUpi" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>ATM CSV Product Code</mat-label>
|
||||
<input type="text" matInput formControlName="atmCsvProductCode" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>ATM CSV Type Code</mat-label>
|
||||
<input type="text" matInput formControlName="atmCsvTypeCode" />
|
||||
</mat-form-field>
|
||||
</div>
|
||||
</mat-expansion-panel>
|
||||
}
|
||||
|
||||
<mat-expansion-panel [expanded]="true">
|
||||
<mat-expansion-panel-header>
|
||||
<mat-panel-title>
|
||||
<i class="fas fa-clock lps-section__icon"></i>
|
||||
Auto Interest Post Parameters
|
||||
</mat-panel-title>
|
||||
</mat-expansion-panel-header>
|
||||
<div class="lps-section__body lps-grid-4">
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Auto Int. Post Type</mat-label>
|
||||
<mat-select formControlName="autoInterestPostType">
|
||||
<mat-option value="MONTHLY">Monthly</mat-option>
|
||||
<mat-option value="QUARTERLY">Quarterly</mat-option>
|
||||
<mat-option value="HALF_YEARLY">Half Yearly</mat-option>
|
||||
<mat-option value="YEARLY">Yearly</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Auto Int. Post When</mat-label>
|
||||
<mat-select formControlName="autoInterestPostWhen">
|
||||
<mat-option value="MONTH_END">Month End</mat-option>
|
||||
<mat-option value="FIX_DAY">Fix Day</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
@if (loanProductSettingsForm.value.autoInterestPostWhen === 'FIX_DAY') {
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Fix Day</mat-label>
|
||||
<input type="number" min="1" max="31" matInput formControlName="autoInterestPostFixDay" />
|
||||
</mat-form-field>
|
||||
}
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Auto Last Int. Date</mat-label>
|
||||
<input type="text" matInput formControlName="autoLastInterestDate" placeholder="DD/MM/YYYY" />
|
||||
</mat-form-field>
|
||||
</div>
|
||||
</mat-expansion-panel>
|
||||
|
||||
@if (showForeclosureSettings) {
|
||||
<mat-expansion-panel [expanded]="true">
|
||||
<mat-expansion-panel-header>
|
||||
<mat-panel-title>
|
||||
<i class="fas fa-door-closed lps-section__icon"></i>
|
||||
Foreclosure / Early Account Closure
|
||||
</mat-panel-title>
|
||||
</mat-expansion-panel-header>
|
||||
<div class="lps-section__body lps-grid-4">
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Calculate Early A/c Close Charge?</mat-label>
|
||||
<mat-select formControlName="calculateEarlyAccountCloseCharge">
|
||||
<mat-option value="YES">YES</mat-option>
|
||||
<mat-option value="NO">NO</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
@if (loanProductSettingsForm.value.calculateEarlyAccountCloseCharge === 'YES') {
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Early A/c Close Charge</mat-label>
|
||||
<input type="number" matInput formControlName="earlyAccountCloseCharge" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Early A/c Close Period (In Months)</mat-label>
|
||||
<input type="number" matInput formControlName="earlyAccountClosePeriodInMonths" />
|
||||
</mat-form-field>
|
||||
}
|
||||
</div>
|
||||
</mat-expansion-panel>
|
||||
}
|
||||
</mat-accordion>
|
||||
|
||||
<!-- Credit Bureau Settings (CIBIL) -->
|
||||
<div class="lps-section">
|
||||
<div class="lps-section__header">
|
||||
@@ -883,6 +1414,11 @@
|
||||
<input type="number" min="0" matInput formControlName="graceOnInterestPayment" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>Grace Days After Overdue For Moratorium A/c</mat-label>
|
||||
<input type="number" min="0" matInput formControlName="graceDaysAfterOverdueForMoratorium" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline">
|
||||
<mat-label>{{ 'labels.inputs.Delinquency Bucket' | translate }}</mat-label>
|
||||
<mat-select formControlName="delinquencyBucketId">
|
||||
|
||||
+23
-2
@@ -50,8 +50,9 @@
|
||||
&__body {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
gap: 4px 16px;
|
||||
padding: 16px 24px;
|
||||
align-items: start;
|
||||
gap: 18px 16px;
|
||||
padding: 20px 24px;
|
||||
|
||||
@media (width <= 600px) {
|
||||
grid-template-columns: 1fr;
|
||||
@@ -83,6 +84,26 @@
|
||||
grid-column: span 3;
|
||||
}
|
||||
|
||||
.lps-narrow {
|
||||
max-width: 160px;
|
||||
}
|
||||
|
||||
.lps-accordion {
|
||||
margin-top: 16px;
|
||||
|
||||
.lps-section__body {
|
||||
padding: 16px 24px 20px;
|
||||
}
|
||||
|
||||
mat-panel-title {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
}
|
||||
}
|
||||
|
||||
.lps-checkbox-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
+128
-2
@@ -21,6 +21,12 @@ import { ProcessingStrategyService } from '../../services/processing-strategy.se
|
||||
import { MatTooltip } from '@angular/material/tooltip';
|
||||
import { MatCheckbox } from '@angular/material/checkbox';
|
||||
import { MatIconButton } from '@angular/material/button';
|
||||
import {
|
||||
MatAccordion,
|
||||
MatExpansionPanel,
|
||||
MatExpansionPanelHeader,
|
||||
MatExpansionPanelTitle
|
||||
} from '@angular/material/expansion';
|
||||
import { FaIconComponent } from '@fortawesome/angular-fontawesome';
|
||||
import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module';
|
||||
|
||||
@@ -34,6 +40,10 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module';
|
||||
MatTooltip,
|
||||
MatCheckbox,
|
||||
MatIconButton,
|
||||
MatAccordion,
|
||||
MatExpansionPanel,
|
||||
MatExpansionPanelHeader,
|
||||
MatExpansionPanelTitle,
|
||||
FaIconComponent,
|
||||
ReactiveFormsModule
|
||||
]
|
||||
@@ -45,8 +55,41 @@ export class LoanProductSettingsStepComponent implements OnInit {
|
||||
@Input() toEdit: boolean;
|
||||
@Input() loanProductsTemplate: any;
|
||||
@Input() isLinkedToFloatingInterestRates: UntypedFormControl;
|
||||
@Input() productSubGroup: string;
|
||||
@Output() advancePaymentStrategy = new EventEmitter<string>();
|
||||
|
||||
/** Sub-groups (from Details step) that are current-account-linked, channel-heavy products */
|
||||
readonly channelEnabledSubGroups = [
|
||||
'cc',
|
||||
'overdraft'
|
||||
];
|
||||
|
||||
/** Sub-groups that are fixed-tenure, EMI-based term loans (foreclosure applies to these) */
|
||||
readonly termLoanSubGroups = [
|
||||
'term',
|
||||
'personal',
|
||||
'housing',
|
||||
'vehicle',
|
||||
'education',
|
||||
'business',
|
||||
'gold_emi'
|
||||
];
|
||||
|
||||
get showChannelLimits(): boolean {
|
||||
return !this.productSubGroup || this.channelEnabledSubGroups.includes(this.productSubGroup);
|
||||
}
|
||||
|
||||
get showChequeBookSettings(): boolean {
|
||||
return !this.productSubGroup || ![
|
||||
'gold',
|
||||
'gold_emi'
|
||||
].includes(this.productSubGroup);
|
||||
}
|
||||
|
||||
get showForeclosureSettings(): boolean {
|
||||
return !this.productSubGroup || this.termLoanSubGroups.includes(this.productSubGroup);
|
||||
}
|
||||
|
||||
loanProductSettingsForm: UntypedFormGroup;
|
||||
|
||||
amortizationTypeData: any;
|
||||
@@ -366,6 +409,24 @@ export class LoanProductSettingsStepComponent implements OnInit {
|
||||
standingInstructionChargeGLAccount: [''],
|
||||
standingInstructionDebitChargeSkipOption: [''],
|
||||
openingBalanceMultiplierForRemittanceCharges: [''],
|
||||
accountMoveToInoperativeEnabled: ['NO'],
|
||||
generateGlDiffEntryEnabled: ['NO'],
|
||||
subTypeWiseGlBalanceGenerationEnabled: ['NO'],
|
||||
validateBeforeDeletingDebitEntryEnabled: ['NO'],
|
||||
rcFileConceptEnabled: ['NO'],
|
||||
accountCloseZeroBalanceInOpenDayProcess: ['NO'],
|
||||
accountCloseZeroBalanceAtSubledgerTranEntry: ['NO'],
|
||||
limitEnhancementAgainstClearingScreenDisplayEnabled: ['NO'],
|
||||
advanceInterestParameterInLedgerEnabled: ['NO'],
|
||||
vehicleDetailInMasterEnabled: ['NO'],
|
||||
deletedChequeIssueEnabled: ['NO'],
|
||||
dpReduceInDocumentRenewalDateEnabled: ['NO'],
|
||||
dpReduceInRenewalDateEnabled: ['NO'],
|
||||
autoCloseAtDayEndEnabled: ['NO'],
|
||||
loanRateFromMasterEnabled: ['NO'],
|
||||
chequeShortName: [''],
|
||||
statementPrintEnabled: ['YES'],
|
||||
neslCode: [''],
|
||||
|
||||
// Interest Related Parameters
|
||||
drawingPowerAndLimitGenerationProcedure: ['NORMAL D.P. ENTRY IS CONSIDER'],
|
||||
@@ -385,7 +446,7 @@ export class LoanProductSettingsStepComponent implements OnInit {
|
||||
penaltyInterestDateDifferentThanRegularInterest: ['YES'],
|
||||
fixedDepositOverdraftCertificateSortOrder: ['ORDER ON INTEREST RATE'],
|
||||
useDocumentSubmissionDateForInterest: ['NO'],
|
||||
loanManagementSystemRenewalPenaltyActive: [''],
|
||||
loanManagementSystemRenewalPenaltyActive: ['NO'],
|
||||
minimumNormalInterestAmount: [''],
|
||||
minimumInterestCalculationMethod: [''],
|
||||
minimumAgainstClearingInterestAmount: [''],
|
||||
@@ -409,6 +470,18 @@ export class LoanProductSettingsStepComponent implements OnInit {
|
||||
nonPerformingAssetPenalInterestRate: [''],
|
||||
fixedDepositOverdraftPenalInterestRateUpdateInBranchProcess: ['YES'],
|
||||
addPenalInterestRate: [''],
|
||||
atyp14SimpleInterestEnabled: ['NO'],
|
||||
fixedDepositOverdraftMarginType: [''],
|
||||
checkMasterDetailEditedPassingPendingEnabled: ['NO'],
|
||||
creditDebitInterestCalculationSeparateEnabled: ['NO'],
|
||||
onTimeInterestProvisionEnabled: ['NO'],
|
||||
checkAgainstClearingEnabled: ['NO'],
|
||||
gstOnPenaltyEnabled: ['NO'],
|
||||
penaltyInterestGraceDays: [''],
|
||||
overdrawnInterestRate: [''],
|
||||
calculateDailyLimitEnhancementTodEnabled: ['NO'],
|
||||
fixedDepositOverdraftMultipleInterestRateEnabled: ['NO'],
|
||||
graceDaysAfterOverdueForMoratorium: [''],
|
||||
|
||||
// Credit Bureau Settings (CIBIL)
|
||||
cibilAccountType: [''],
|
||||
@@ -426,7 +499,60 @@ export class LoanProductSettingsStepComponent implements OnInit {
|
||||
isFloatingRate: [false],
|
||||
foreclosureChargesApplicable: ['NO'],
|
||||
keyFactStatementEnabled: [true],
|
||||
annualPercentageRateCalculationEnabled: [true]
|
||||
annualPercentageRateCalculationEnabled: [true],
|
||||
|
||||
// Channel & Transaction Limits
|
||||
isMobileAppEnabled: ['NO'],
|
||||
isAtmEnabled: ['NO'],
|
||||
atmYearlyChargeEnabled: ['NO'],
|
||||
atmMinimumBalance: [''],
|
||||
emailActiveEnabled: ['NO'],
|
||||
isImpsEnabled: ['NO'],
|
||||
isUpiEnabled: ['NO'],
|
||||
isPosEnabled: ['NO'],
|
||||
isBbpsEnabled: ['NO'],
|
||||
interBankLimitPerDay: [''],
|
||||
interBankLimitPerTransaction: [''],
|
||||
neftRtgsLimitPerDay: [''],
|
||||
neftRtgsLimitPerTransaction: [''],
|
||||
neftCutoffLimit: [''],
|
||||
rtgsCutoffLimit: [''],
|
||||
neftRtgsMinimumBalance: [''],
|
||||
isChargeRequiredNeftRtgsCbs: [''],
|
||||
isChargeRequiredNeftRtgsMobile: [''],
|
||||
impsLimitPerDay: [''],
|
||||
impsLimitPerTransaction: [''],
|
||||
impsLimitPerMonth: [''],
|
||||
impsMinLimit: [''],
|
||||
impsMonthlyTransactionCount: [''],
|
||||
|
||||
// POS Facility
|
||||
maxPerTransactionLimitAtm: [''],
|
||||
maxDayTransactionLimitAtm: [''],
|
||||
maxPerTransactionLimitPos: [''],
|
||||
maxDayTransactionLimitPos: [''],
|
||||
maxPerTransactionLimitEcom: [''],
|
||||
maxDayTransactionLimitEcom: [''],
|
||||
maxPerTransactionLimitUpi: [''],
|
||||
maxDayTransactionLimitUpi: [''],
|
||||
|
||||
// ATM CSV File Related Other Details
|
||||
atmCsvProductCode: [''],
|
||||
atmCsvTypeCode: [''],
|
||||
|
||||
// Auto Interest Post Parameters
|
||||
autoInterestPostType: [''],
|
||||
autoInterestPostWhen: [''],
|
||||
autoInterestPostFixDay: [''],
|
||||
autoLastInterestDate: [''],
|
||||
|
||||
// Foreclosure / Early Account Closure
|
||||
calculateEarlyAccountCloseCharge: ['NO'],
|
||||
earlyAccountCloseCharge: [''],
|
||||
earlyAccountClosePeriodInMonths: [''],
|
||||
|
||||
// Gold Loan Specific
|
||||
goldLoanPacketNumberWithYearEnabled: ['NO']
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
+45
-79
@@ -264,90 +264,56 @@
|
||||
}
|
||||
</div>
|
||||
|
||||
<!-- Interest Rate Slabs Section -->
|
||||
<!-- Interest Rate Detail Section (legacy Page 1 table) -->
|
||||
<div class="lpt-section">
|
||||
<div class="lpt-section-header">
|
||||
<i class="fas fa-table lpt-section-icon"></i>
|
||||
<h3>Interest Rate Slabs</h3>
|
||||
<h3>Interest Rate Detail</h3>
|
||||
</div>
|
||||
|
||||
<div class="lpt-slab-c">
|
||||
<!-- Particular Name -->
|
||||
<div class="lpt-slab-c-particular">
|
||||
<label class="lpt-slab-c-particular-label">Particular</label>
|
||||
<input
|
||||
type="text"
|
||||
class="lpt-slab-c-name-input"
|
||||
[formControl]="particularLabel"
|
||||
placeholder="e.g. Consumer Loan"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<!-- 2-column slab grid (same as before, General + Special inside each card) -->
|
||||
<div class="lpt-slab-c-grid">
|
||||
@for (genGroup of slabGroups; track $index) {
|
||||
<div class="lpt-slab-c-item">
|
||||
<span class="lpt-slab-c-range">{{ interestSlabDefinitions[$index].label }}</span>
|
||||
<div class="lpt-slab-c-rate-pair">
|
||||
<!-- General -->
|
||||
<div class="lpt-slab-c-rate-field" [formGroup]="genGroup">
|
||||
<span class="lpt-slab-c-rate-label">Gen</span>
|
||||
<div class="lpt-slab-c-input-wrap">
|
||||
<input
|
||||
type="number"
|
||||
class="lpt-slab-c-input"
|
||||
formControlName="interestRate"
|
||||
placeholder="0.00"
|
||||
min="0"
|
||||
max="100"
|
||||
step="0.01"
|
||||
/>
|
||||
<span class="lpt-slab-c-suffix">%</span>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Special -->
|
||||
<div class="lpt-slab-c-rate-field" [formGroup]="specialSlabGroups[$index]">
|
||||
<span class="lpt-slab-c-rate-label lpt-slab-c-rate-label--special">Spl</span>
|
||||
<div class="lpt-slab-c-input-wrap">
|
||||
<input
|
||||
type="number"
|
||||
class="lpt-slab-c-input lpt-slab-c-input--special"
|
||||
formControlName="interestRate"
|
||||
placeholder="0.00"
|
||||
min="0"
|
||||
max="100"
|
||||
step="0.01"
|
||||
/>
|
||||
<span class="lpt-slab-c-suffix">%</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
|
||||
<!-- Fixed Interest Rate row -->
|
||||
<div class="lpt-slab-c-fixed" [formGroup]="fixedRateGroup">
|
||||
<label class="lpt-slab-c-fixed-toggle">
|
||||
<input type="checkbox" formControlName="hasFixed" class="lpt-slab-c-checkbox" />
|
||||
<i class="fas fa-lock"></i>
|
||||
<span>Fixed Interest Rate (%)</span>
|
||||
</label>
|
||||
@if (fixedRateGroup.get('hasFixed').value) {
|
||||
<div class="lpt-slab-c-input-wrap">
|
||||
<input
|
||||
type="number"
|
||||
class="lpt-slab-c-input lpt-slab-c-input--fixed"
|
||||
formControlName="fixedAmount"
|
||||
placeholder="0.00"
|
||||
min="0"
|
||||
max="100"
|
||||
step="0.01"
|
||||
/>
|
||||
<span class="lpt-slab-c-suffix">%</span>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
<div class="lpt-ird-table-wrap">
|
||||
<table class="lpt-ird-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th rowspan="2">Interest Type</th>
|
||||
<th rowspan="2">Calculation</th>
|
||||
<th colspan="2">Normal Category</th>
|
||||
<th colspan="2">Special Category</th>
|
||||
<th rowspan="2">Period</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Mini. Rate</th>
|
||||
<th>Maxi. Rate</th>
|
||||
<th>Mini. Rate</th>
|
||||
<th>Maxi. Rate</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@for (row of interestRateDetailGroups; track $index) {
|
||||
<tr [formGroup]="row">
|
||||
<td class="lpt-ird-type">{{ interestRateDetailTypes[$index] }}</td>
|
||||
<td>
|
||||
<select formControlName="calculation" class="lpt-ird-select">
|
||||
<option [ngValue]="true">YES</option>
|
||||
<option [ngValue]="false">NO</option>
|
||||
</select>
|
||||
</td>
|
||||
<td><input type="number" formControlName="normalMinRate" class="lpt-ird-input" min="0" max="100" /></td>
|
||||
<td><input type="number" formControlName="normalMaxRate" class="lpt-ird-input" min="0" max="100" /></td>
|
||||
<td><input type="number" formControlName="specialMinRate" class="lpt-ird-input" min="0" max="100" /></td>
|
||||
<td><input type="number" formControlName="specialMaxRate" class="lpt-ird-input" min="0" max="100" /></td>
|
||||
<td>
|
||||
<select formControlName="period" class="lpt-ird-select">
|
||||
<option value=""></option>
|
||||
@for (period of interestRateDetailPeriods; track period) {
|
||||
<option [value]="period">{{ period }}</option>
|
||||
}
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
+35
-221
@@ -199,175 +199,42 @@ $shadow-hover: 0 4px 12px rgb(37 99 235 / 10%);
|
||||
padding: 8px 4px;
|
||||
}
|
||||
|
||||
// ─── Interest Rate Slabs — Option C (2-column grid) ──────────────────────────
|
||||
.lpt-slab-c {
|
||||
// ─── Interest Rate Detail table (legacy Page 1 grid) ─────────────────────────
|
||||
.lpt-ird-table-wrap {
|
||||
padding: 16px 24px 20px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 0;
|
||||
overflow-x: auto;
|
||||
}
|
||||
|
||||
// Particular row
|
||||
.lpt-slab-c-particular {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 14px;
|
||||
padding-bottom: 14px;
|
||||
border-bottom: 1px solid $border;
|
||||
margin-bottom: 12px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.lpt-slab-c-particular-label {
|
||||
font-size: 12px;
|
||||
font-weight: 700;
|
||||
color: $text-secondary;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.05em;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.lpt-slab-c-name-input {
|
||||
flex: 1;
|
||||
max-width: 320px;
|
||||
padding: 7px 12px;
|
||||
border: 1px solid $border;
|
||||
border-radius: 8px;
|
||||
font-size: 13.5px;
|
||||
font-weight: 600;
|
||||
color: $text-primary;
|
||||
background: $surface;
|
||||
outline: none;
|
||||
transition:
|
||||
border-color 0.15s,
|
||||
box-shadow 0.15s;
|
||||
|
||||
&::placeholder {
|
||||
color: #b0b8c4;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
&:focus {
|
||||
border-color: $primary;
|
||||
box-shadow: 0 0 0 3px rgb(37 99 235 / 10%);
|
||||
}
|
||||
}
|
||||
|
||||
// General / Special tab toggle
|
||||
.lpt-slab-tabs {
|
||||
display: flex;
|
||||
gap: 6px;
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
.lpt-slab-tab {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
padding: 6px 16px;
|
||||
border: 1.5px solid $border;
|
||||
border-radius: 20px;
|
||||
background: $surface;
|
||||
.lpt-ird-table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
font-size: 12.5px;
|
||||
font-weight: 600;
|
||||
color: $text-secondary;
|
||||
cursor: pointer;
|
||||
transition: all 0.15s;
|
||||
|
||||
i {
|
||||
th,
|
||||
td {
|
||||
border: 1px solid $border;
|
||||
padding: 6px 8px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
thead th {
|
||||
background: $surface-alt;
|
||||
font-weight: 700;
|
||||
color: $text-secondary;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.03em;
|
||||
font-size: 11px;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
border-color: $primary;
|
||||
color: $primary;
|
||||
}
|
||||
|
||||
&--active {
|
||||
background: $primary;
|
||||
border-color: $primary;
|
||||
color: $surface;
|
||||
box-shadow: 0 2px 8px rgb(37 99 235 / 25%);
|
||||
}
|
||||
}
|
||||
|
||||
// 2-column slab grid
|
||||
.lpt-slab-c-grid {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 8px 16px;
|
||||
|
||||
@media (width <= 540px) {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
}
|
||||
|
||||
.lpt-slab-c-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 10px;
|
||||
padding: 8px 12px;
|
||||
border: 1px solid $border;
|
||||
border-radius: 8px;
|
||||
background: $surface;
|
||||
transition:
|
||||
border-color 0.15s,
|
||||
box-shadow 0.15s;
|
||||
|
||||
&:focus-within {
|
||||
border-color: $primary;
|
||||
box-shadow: 0 0 0 3px rgb(37 99 235 / 8%);
|
||||
}
|
||||
}
|
||||
|
||||
// General + Special pair inside each card
|
||||
.lpt-slab-c-rate-pair {
|
||||
display: flex;
|
||||
gap: 8px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.lpt-slab-c-rate-field {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
}
|
||||
|
||||
.lpt-slab-c-rate-label {
|
||||
font-size: 10px;
|
||||
font-weight: 700;
|
||||
color: $primary;
|
||||
background: #eff6ff;
|
||||
padding: 2px 5px;
|
||||
border-radius: 4px;
|
||||
.lpt-ird-type {
|
||||
text-align: left !important;
|
||||
font-weight: 600;
|
||||
color: $text-primary;
|
||||
white-space: nowrap;
|
||||
|
||||
&--special {
|
||||
color: #92400e;
|
||||
background: #fef9c3;
|
||||
}
|
||||
}
|
||||
|
||||
.lpt-slab-c-range {
|
||||
font-size: 12.5px;
|
||||
font-weight: 500;
|
||||
color: $text-label;
|
||||
flex: 1;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
// Input + suffix wrapper
|
||||
.lpt-slab-c-input-wrap {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.lpt-slab-c-input {
|
||||
.lpt-ird-input {
|
||||
width: 70px;
|
||||
padding: 4px 6px;
|
||||
border: 1px solid $border;
|
||||
@@ -379,79 +246,26 @@ $shadow-hover: 0 4px 12px rgb(37 99 235 / 10%);
|
||||
background: $surface-alt;
|
||||
outline: none;
|
||||
transition: border-color 0.15s;
|
||||
appearance: textfield;
|
||||
|
||||
&::-webkit-outer-spin-button,
|
||||
&::-webkit-inner-spin-button {
|
||||
appearance: none;
|
||||
}
|
||||
|
||||
&:focus {
|
||||
border-color: $primary;
|
||||
background: $primary-light;
|
||||
}
|
||||
|
||||
&--fixed {
|
||||
width: 90px;
|
||||
}
|
||||
}
|
||||
|
||||
.lpt-slab-c-suffix {
|
||||
font-size: 12px;
|
||||
font-weight: 700;
|
||||
color: $text-secondary;
|
||||
user-select: none;
|
||||
|
||||
&--special {
|
||||
color: #92400e;
|
||||
}
|
||||
}
|
||||
|
||||
.lpt-slab-c-input--special {
|
||||
&:focus {
|
||||
border-color: #f59e0b;
|
||||
background: #fef9c3;
|
||||
}
|
||||
}
|
||||
|
||||
.lpt-slab-c-error {
|
||||
font-size: 10px;
|
||||
color: #ef4444;
|
||||
}
|
||||
|
||||
// Fixed Interest Rate row (below grid)
|
||||
.lpt-slab-c-fixed {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 20px;
|
||||
margin: 12px -24px -20px;
|
||||
padding: 12px 16px;
|
||||
border-top: 2px dashed $primary-border;
|
||||
background: $primary-light;
|
||||
border-radius: 0 0 $radius-card $radius-card;
|
||||
padding-left: 24px;
|
||||
padding-right: 24px;
|
||||
}
|
||||
|
||||
.lpt-slab-c-fixed-toggle {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
cursor: pointer;
|
||||
.lpt-ird-select {
|
||||
width: 100%;
|
||||
min-width: 90px;
|
||||
padding: 4px 6px;
|
||||
border: 1px solid $border;
|
||||
border-radius: 6px;
|
||||
font-size: 13px;
|
||||
font-weight: 600;
|
||||
color: $primary;
|
||||
user-select: none;
|
||||
color: $text-primary;
|
||||
background: $surface;
|
||||
outline: none;
|
||||
|
||||
i {
|
||||
font-size: 12px;
|
||||
opacity: 0.7;
|
||||
&:focus {
|
||||
border-color: $primary;
|
||||
}
|
||||
}
|
||||
|
||||
.lpt-slab-c-checkbox {
|
||||
accent-color: $primary;
|
||||
width: 15px;
|
||||
height: 15px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
+39
-65
@@ -57,24 +57,23 @@ export class LoanProductTermsStepComponent implements OnInit, OnChanges {
|
||||
repaymentFrequencyTypeData: any;
|
||||
repaymentStartDateTypeOptions: any;
|
||||
|
||||
readonly interestSlabDefinitions = [
|
||||
{ label: 'Upto 10,000', maxAmount: 10000 },
|
||||
{ label: 'Upto 25,000', maxAmount: 25000 },
|
||||
{ label: 'Upto 1,00,000', maxAmount: 100000 },
|
||||
{ label: 'Upto 2,00,000', maxAmount: 200000 },
|
||||
{ label: 'Upto 5,00,000', maxAmount: 500000 },
|
||||
{ label: 'Upto 10,00,000', maxAmount: 1000000 },
|
||||
{ label: 'Upto 15,00,000', maxAmount: 1500000 },
|
||||
{ label: 'Upto 20,00,000', maxAmount: 2000000 },
|
||||
{ label: 'Upto 25,00,000', maxAmount: 2500000 },
|
||||
{ label: 'More than 25,00,000', maxAmount: null }
|
||||
// Legacy "Interest Rate Detail" table — 4 interest types x Normal/Special category x Min/Max Rate x Period
|
||||
readonly interestRateDetailTypes = [
|
||||
'Normal Debit',
|
||||
'Normal Credit',
|
||||
'Against Clearing',
|
||||
'Penalty'
|
||||
];
|
||||
|
||||
interestRateSlabsArray: FormArray;
|
||||
specialSlabsArray: FormArray;
|
||||
fixedRateGroup: FormGroup;
|
||||
particularLabel = new FormControl('');
|
||||
activeSlabTab: 'general' | 'special' = 'general';
|
||||
readonly interestRateDetailPeriods = [
|
||||
'DAILY',
|
||||
'MONTHLY',
|
||||
'QUARTERLY',
|
||||
'HALF YEARLY',
|
||||
'YEARLY'
|
||||
];
|
||||
|
||||
interestRateDetailArray: FormArray;
|
||||
|
||||
constructor() {
|
||||
this.createLoanProductTermsForm();
|
||||
@@ -134,35 +133,32 @@ export class LoanProductTermsStepComponent implements OnInit, OnChanges {
|
||||
}
|
||||
|
||||
createLoanProductTermsForm() {
|
||||
this.interestRateSlabsArray = new FormArray(
|
||||
this.interestSlabDefinitions.map(
|
||||
this.interestRateDetailArray = new FormArray(
|
||||
this.interestRateDetailTypes.map(
|
||||
() =>
|
||||
new FormGroup({
|
||||
interestRate: new FormControl(null, [
|
||||
calculation: new FormControl(false),
|
||||
normalMinRate: new FormControl(null, [
|
||||
Validators.min(0),
|
||||
Validators.max(100)
|
||||
])
|
||||
]),
|
||||
normalMaxRate: new FormControl(null, [
|
||||
Validators.min(0),
|
||||
Validators.max(100)
|
||||
]),
|
||||
specialMinRate: new FormControl(null, [
|
||||
Validators.min(0),
|
||||
Validators.max(100)
|
||||
]),
|
||||
specialMaxRate: new FormControl(null, [
|
||||
Validators.min(0),
|
||||
Validators.max(100)
|
||||
]),
|
||||
period: new FormControl('')
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
this.specialSlabsArray = new FormArray(
|
||||
this.interestSlabDefinitions.map(
|
||||
() =>
|
||||
new FormGroup({
|
||||
interestRate: new FormControl(null, [
|
||||
Validators.min(0),
|
||||
Validators.max(100)
|
||||
])
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
this.fixedRateGroup = new FormGroup({
|
||||
hasFixed: new FormControl(false),
|
||||
fixedAmount: new FormControl({ value: null, disabled: true }, [Validators.min(0)])
|
||||
});
|
||||
|
||||
this.loanProductTermsForm = this.formBuilder.group({
|
||||
isLinkedToFloatingInterestRates: [false],
|
||||
allowApprovedDisbursedAmountsOverApplied: [false],
|
||||
@@ -287,15 +283,6 @@ export class LoanProductTermsStepComponent implements OnInit, OnChanges {
|
||||
}
|
||||
});
|
||||
|
||||
this.fixedRateGroup.get('hasFixed').valueChanges.subscribe((hasFixed: boolean) => {
|
||||
if (hasFixed) {
|
||||
this.fixedRateGroup.get('fixedAmount').enable();
|
||||
} else {
|
||||
this.fixedRateGroup.get('fixedAmount').disable();
|
||||
this.fixedRateGroup.get('fixedAmount').setValue(null);
|
||||
}
|
||||
});
|
||||
|
||||
this.zeroInterest.valueChanges.subscribe((zeroInterest) => {
|
||||
if (zeroInterest) {
|
||||
this.loanProductTermsForm.get('minInterestRatePerPeriod').patchValue(0);
|
||||
@@ -322,16 +309,8 @@ export class LoanProductTermsStepComponent implements OnInit, OnChanges {
|
||||
});
|
||||
}
|
||||
|
||||
get slabGroups(): FormGroup[] {
|
||||
return this.interestRateSlabsArray.controls as FormGroup[];
|
||||
}
|
||||
|
||||
get activeSlabGroups(): FormGroup[] {
|
||||
return this.interestRateSlabsArray.controls as FormGroup[];
|
||||
}
|
||||
|
||||
get specialSlabGroups(): FormGroup[] {
|
||||
return this.specialSlabsArray.controls as FormGroup[];
|
||||
get interestRateDetailGroups(): FormGroup[] {
|
||||
return this.interestRateDetailArray.controls as FormGroup[];
|
||||
}
|
||||
|
||||
get loanProductTerms() {
|
||||
@@ -349,15 +328,10 @@ export class LoanProductTermsStepComponent implements OnInit, OnChanges {
|
||||
minInterestRatePerPeriod: normalizeDecimal(formValue.minInterestRatePerPeriod),
|
||||
interestRatePerPeriod: normalizeDecimal(formValue.interestRatePerPeriod),
|
||||
maxInterestRatePerPeriod: normalizeDecimal(formValue.maxInterestRatePerPeriod),
|
||||
interestRateSlabs: this.interestRateSlabsArray.getRawValue().map((slab, i) => ({
|
||||
maxAmount: this.interestSlabDefinitions[i].maxAmount,
|
||||
label: this.interestSlabDefinitions[i].label,
|
||||
interestRate: slab.interestRate
|
||||
})),
|
||||
fixedRate: (() => {
|
||||
const fr = this.fixedRateGroup.getRawValue();
|
||||
return fr.hasFixed ? fr.fixedAmount : null;
|
||||
})()
|
||||
interestRateDetail: this.interestRateDetailArray.getRawValue().map((row, i) => ({
|
||||
interestType: this.interestRateDetailTypes[i],
|
||||
...row
|
||||
}))
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -9,6 +9,246 @@
|
||||
import { Injectable, inject } from '@angular/core';
|
||||
import { SettingsService } from 'app/settings/settings.service';
|
||||
|
||||
// Custom, UI-only fields grafted onto the loan product form to mirror the legacy
|
||||
// "Account Type Creation" screen. Fineract's LoanProductDataValidator rejects any
|
||||
// unrecognised parameter, so these are stripped from the payload until a backend
|
||||
// mechanism (e.g. a linked Data Table) exists to persist them.
|
||||
const CUSTOM_UI_ONLY_FIELDS: string[] = [
|
||||
// Details step — classification & legacy header fields
|
||||
'productTypeGroup',
|
||||
'productTypeSubGroup',
|
||||
'debitIntCalculation',
|
||||
'separatePenalInterest',
|
||||
'creditIntCalculation',
|
||||
'subAccountTypeBalance',
|
||||
'finalIntRounding',
|
||||
'roundingUpTo',
|
||||
'accountTypeCode',
|
||||
'micrTransactionCode',
|
||||
'reservedEcsSerialNumber',
|
||||
'reverseEcsNumber',
|
||||
'lockChequeInfoEnabled',
|
||||
'lockPageTwoInfoEnabled',
|
||||
'computerizationDate',
|
||||
'chequePrintDescription',
|
||||
'posAccountTypeDescription',
|
||||
'pfmsAccountType',
|
||||
'renewalDateAddMonths',
|
||||
'documentRenewalDateAddMonths',
|
||||
'ppsLimit',
|
||||
'isWriteOffAccountType',
|
||||
'writeOffAccountTypeCode',
|
||||
'renewalGraceDays',
|
||||
// Settings step — Cheque Book Settings
|
||||
'chequeBookIssueEnabled',
|
||||
'chequeValidationRequired',
|
||||
'isFirstChequeBookFree',
|
||||
'chequePrintingAccountType',
|
||||
'allowWithdrawalSlipUsage',
|
||||
'maintainChequeBookStockRegistry',
|
||||
'freeChequeBooksPerYear',
|
||||
'allowCreditByChequeNumber',
|
||||
'creditChequeValidationRequired',
|
||||
'graceDaysForStockStatement',
|
||||
// Settings step — Additional Product Settings
|
||||
'accountTypeActiveForTransactions',
|
||||
'subTypeActivityEnabled',
|
||||
'accountOpeningCharges',
|
||||
'maximumGoldLoanLimit',
|
||||
'lastAccountNumberOpened',
|
||||
'customerTerminationAllowed',
|
||||
'chargesForCashCreditAboveLimit',
|
||||
'deathInterestGLAccount',
|
||||
'startingLedgerNumber',
|
||||
'endingLedgerNumber',
|
||||
'currentLedgerNumber',
|
||||
'remittanceAccountNumber',
|
||||
'isNonResidentIndianAccount',
|
||||
'debitClearingGLAccount',
|
||||
'missedCallAlertServiceActive',
|
||||
'standingInstructionChargeGLAccount',
|
||||
'standingInstructionDebitChargeSkipOption',
|
||||
'openingBalanceMultiplierForRemittanceCharges',
|
||||
'goldLoanPacketNumberWithYearEnabled',
|
||||
'accountMoveToInoperativeEnabled',
|
||||
'generateGlDiffEntryEnabled',
|
||||
'subTypeWiseGlBalanceGenerationEnabled',
|
||||
'validateBeforeDeletingDebitEntryEnabled',
|
||||
'rcFileConceptEnabled',
|
||||
'accountCloseZeroBalanceInOpenDayProcess',
|
||||
'accountCloseZeroBalanceAtSubledgerTranEntry',
|
||||
'limitEnhancementAgainstClearingScreenDisplayEnabled',
|
||||
'advanceInterestParameterInLedgerEnabled',
|
||||
'vehicleDetailInMasterEnabled',
|
||||
'deletedChequeIssueEnabled',
|
||||
'dpReduceInDocumentRenewalDateEnabled',
|
||||
'dpReduceInRenewalDateEnabled',
|
||||
'autoCloseAtDayEndEnabled',
|
||||
'loanRateFromMasterEnabled',
|
||||
'chequeShortName',
|
||||
'statementPrintEnabled',
|
||||
'neslCode',
|
||||
// Settings step — Interest Related Parameters
|
||||
'drawingPowerAndLimitGenerationProcedure',
|
||||
'advancesInterestCalculationMethod',
|
||||
'againstInterestCalculationEnabled',
|
||||
'dayWiseAgainstClearingInterestRounding',
|
||||
'interestCalculationOneFourthMethod',
|
||||
'againstClearingInterestProcedureType',
|
||||
'considerDebitClosingAmountForAgainstClearing',
|
||||
'interestRoundingMethod',
|
||||
'penaltyInterestCalculationEnabled',
|
||||
'penaltyInterestCalculationMethod',
|
||||
'penaltyInterestProcedureNumber',
|
||||
'overdrawnInterestCalculationMethod',
|
||||
'calculateOverdrawnInterestAfterRenewal',
|
||||
'interestOnCreditBalance',
|
||||
'penaltyInterestDateDifferentThanRegularInterest',
|
||||
'fixedDepositOverdraftCertificateSortOrder',
|
||||
'useDocumentSubmissionDateForInterest',
|
||||
'loanManagementSystemRenewalPenaltyActive',
|
||||
'minimumNormalInterestAmount',
|
||||
'minimumInterestCalculationMethod',
|
||||
'minimumAgainstClearingInterestAmount',
|
||||
'limitIncreaseUptoInterestAmountInInterestCalculation',
|
||||
'minimumPenaltyInterestAmount',
|
||||
'daysForLimitIncreaseUptoInterestAmount',
|
||||
'additionalInterestRateForFixedDepositOverdraft',
|
||||
'considerDdPayorderInAgainstClearingInterestCalculation',
|
||||
'graceDaysAfterRenewDate',
|
||||
'applyUndebitedInterestConceptEnabled',
|
||||
'interestRegisterPrintFormatType',
|
||||
'normalGraceDaysAfterOverdue',
|
||||
'allowAgainstClearingEntry',
|
||||
'allowNoBalanceEntry',
|
||||
'fixedDepositOverdraftPenaltyInterestCombinedWithNormalInterest',
|
||||
'allowNoBalanceEntryWithPassword',
|
||||
'undebitedSimpleInterestAccountWise',
|
||||
'dailyInterestCalculationEnabled',
|
||||
'dailyInterestCalculationStartDate',
|
||||
'nonPerformingAssetPenalInterestRateUpdate',
|
||||
'nonPerformingAssetPenalInterestRate',
|
||||
'fixedDepositOverdraftPenalInterestRateUpdateInBranchProcess',
|
||||
'addPenalInterestRate',
|
||||
'atyp14SimpleInterestEnabled',
|
||||
'fixedDepositOverdraftMarginType',
|
||||
'checkMasterDetailEditedPassingPendingEnabled',
|
||||
'creditDebitInterestCalculationSeparateEnabled',
|
||||
'onTimeInterestProvisionEnabled',
|
||||
'checkAgainstClearingEnabled',
|
||||
'gstOnPenaltyEnabled',
|
||||
'penaltyInterestGraceDays',
|
||||
'overdrawnInterestRate',
|
||||
'calculateDailyLimitEnhancementTodEnabled',
|
||||
'fixedDepositOverdraftMultipleInterestRateEnabled',
|
||||
'graceDaysAfterOverdueForMoratorium',
|
||||
// Settings step — Credit Bureau Settings (CIBIL)
|
||||
'cibilAccountType',
|
||||
'cibilCommercialAccountType',
|
||||
'highmarkAccountType',
|
||||
'highmarkCommercialAccountType',
|
||||
'experianAccountType',
|
||||
'experianCommercialAccountType',
|
||||
'equifaxAccountType',
|
||||
'equifaxCommercialAccountType',
|
||||
// Settings step — RBI Compliance & Product Category
|
||||
'loanProductCategory',
|
||||
'penalChargeMethod',
|
||||
'isFloatingRate',
|
||||
'foreclosureChargesApplicable',
|
||||
'keyFactStatementEnabled',
|
||||
'annualPercentageRateCalculationEnabled',
|
||||
// Settings step — Channel & Transaction Limits
|
||||
'isMobileAppEnabled',
|
||||
'isAtmEnabled',
|
||||
'atmYearlyChargeEnabled',
|
||||
'atmMinimumBalance',
|
||||
'emailActiveEnabled',
|
||||
'isImpsEnabled',
|
||||
'isUpiEnabled',
|
||||
'isPosEnabled',
|
||||
'isBbpsEnabled',
|
||||
'interBankLimitPerDay',
|
||||
'interBankLimitPerTransaction',
|
||||
'neftRtgsLimitPerDay',
|
||||
'neftRtgsLimitPerTransaction',
|
||||
'neftCutoffLimit',
|
||||
'rtgsCutoffLimit',
|
||||
'neftRtgsMinimumBalance',
|
||||
'isChargeRequiredNeftRtgsCbs',
|
||||
'isChargeRequiredNeftRtgsMobile',
|
||||
'impsLimitPerDay',
|
||||
'impsLimitPerTransaction',
|
||||
'impsLimitPerMonth',
|
||||
'impsMinLimit',
|
||||
'impsMonthlyTransactionCount',
|
||||
// Settings step — POS Facility & ATM CSV Settings
|
||||
'maxPerTransactionLimitAtm',
|
||||
'maxDayTransactionLimitAtm',
|
||||
'maxPerTransactionLimitPos',
|
||||
'maxDayTransactionLimitPos',
|
||||
'maxPerTransactionLimitEcom',
|
||||
'maxDayTransactionLimitEcom',
|
||||
'maxPerTransactionLimitUpi',
|
||||
'maxDayTransactionLimitUpi',
|
||||
'atmCsvProductCode',
|
||||
'atmCsvTypeCode',
|
||||
// Settings step — Auto Interest Post Parameters
|
||||
'autoInterestPostType',
|
||||
'autoInterestPostWhen',
|
||||
'autoInterestPostFixDay',
|
||||
'autoLastInterestDate',
|
||||
// Settings step — Foreclosure / Early Account Closure
|
||||
'calculateEarlyAccountCloseCharge',
|
||||
'earlyAccountCloseCharge',
|
||||
'earlyAccountClosePeriodInMonths',
|
||||
// Terms step
|
||||
'debitBalanceAllow',
|
||||
'allowDebitTransAfterDueDate',
|
||||
'branchLevelAccountType',
|
||||
'interestRateDetail',
|
||||
// Charges step — legacy cheque / standing instruction / minimum balance charges
|
||||
'chequeBookChargeEnabled',
|
||||
'chequeReturnChargeEnabled',
|
||||
'icChargeDebitEnabled',
|
||||
'cashBundleChargeEnabled',
|
||||
'cashBundleChargeWithPanLimit',
|
||||
'perChequeEntryCharge',
|
||||
'perChequeEntryServiceCharge',
|
||||
'perInwardChequeEntryCharge',
|
||||
'perOutwardChequeEntryCharge',
|
||||
'creditorStandingInstructionFailCharge',
|
||||
'debtorStandingInstructionFailCharge',
|
||||
'minimumBalanceCheckingType',
|
||||
'autoMinimumBalanceCharge',
|
||||
'calculateDailyMinimumBalanceCharges',
|
||||
'minimumBalanceChargeEnabled',
|
||||
'minimumBalanceChargeAmount',
|
||||
'minimumBalanceChargeForChequeIssue',
|
||||
'minimumBalanceChargeMethod',
|
||||
'monthsAfterMinBalanceChargeCalculate',
|
||||
'forChequeIssue',
|
||||
'forChequeIssueAvg',
|
||||
'forWithdrawalSlip',
|
||||
'forWithdrawalSlipAvg',
|
||||
'calculateDailyAgainstClearingCharge',
|
||||
// Accounting step — custom GL account mappings
|
||||
'intReceivablesGlAccountId',
|
||||
'intPayableGlAccountId',
|
||||
'deafIntPayableGlAccountId',
|
||||
'intOverdueReserveAccountId',
|
||||
'undebitedInterestAccountId',
|
||||
'penalIntCrGlAccountId',
|
||||
'rdMaturedGlAccountId',
|
||||
'glAccountId',
|
||||
'icChargeGlAccountId',
|
||||
'inoperativeGlAccountId',
|
||||
'creditBalanceLiabilityGlAccountId',
|
||||
'creditBalanceAssetGlAccountId',
|
||||
'overdueAccountsGlAccountId',
|
||||
'rebateGlAccountId'
|
||||
];
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
})
|
||||
@@ -49,6 +289,9 @@ export class LoanProducts {
|
||||
delete loanProduct.allowAttributeConfiguration;
|
||||
delete loanProduct.advancedAccountingRules;
|
||||
|
||||
// Remove custom, UI-only fields not yet recognised by the Fineract backend
|
||||
CUSTOM_UI_ONLY_FIELDS.forEach((field) => delete loanProduct[field]);
|
||||
|
||||
// In Fineract, the POST and PUT endpoints for /v1/loanproducts have a typo in the field
|
||||
// allowPartialPeriodInterestCalculation. Until that is fixed, we need to replace the field name in the payload.
|
||||
loanProduct.allowPartialPeriodInterestCalculation = loanProduct.allowPartialPeriodInterestCalculation;
|
||||
|
||||
Reference in New Issue
Block a user