diff --git a/src/app/products/loan-interest-rate-register/cibil-adjustment/cibil-adjustment.component.ts b/src/app/products/loan-interest-rate-register/cibil-adjustment/cibil-adjustment.component.ts index 244bca647..701b5667c 100644 --- a/src/app/products/loan-interest-rate-register/cibil-adjustment/cibil-adjustment.component.ts +++ b/src/app/products/loan-interest-rate-register/cibil-adjustment/cibil-adjustment.component.ts @@ -41,7 +41,12 @@ export class CibilAdjustmentComponent implements OnInit { const idParam = this.route.snapshot.queryParamMap.get('id'); const id = idParam ? Number(idParam) : null; this.service.list().subscribe((all) => { - this.register = (id ? all.find((r) => r.id === id) : undefined) ?? this.service.getActiveOrFirstDraft(); + const found = (id ? all.find((r) => r.id === id) : undefined) ?? this.service.getActiveOrFirstDraft(); + if (!found) { + this.router.navigate(['/products/loan-interest-rate-register']); + return; + } + this.register = found; this.active = this.service.getActive(); }); } diff --git a/src/app/products/loan-interest-rate-register/edit-register/edit-register.component.html b/src/app/products/loan-interest-rate-register/edit-register/edit-register.component.html index 8db7e5e86..0ec403f4b 100644 --- a/src/app/products/loan-interest-rate-register/edit-register/edit-register.component.html +++ b/src/app/products/loan-interest-rate-register/edit-register/edit-register.component.html @@ -55,6 +55,9 @@ {{ rows.length }} products × {{ slabs.length }} amount slabs · click any cell to edit · read-only view + 0" + >· {{ unmappedCount() }} without GL — map every product's GL before submitting
|
{{ row.srNo }}{{ row.particulars }}
+
+ {{ row.glAccountId == null ? 'GL not mapped' : glLabel(row) }}
+
+ |
{{ canEdit ? 'Cancel' : 'Back to list' }}
diff --git a/src/app/products/loan-interest-rate-register/edit-register/edit-register.component.scss b/src/app/products/loan-interest-rate-register/edit-register/edit-register.component.scss
index 78c8ccc5b..476337e6e 100644
--- a/src/app/products/loan-interest-rate-register/edit-register/edit-register.component.scss
+++ b/src/app/products/loan-interest-rate-register/edit-register/edit-register.component.scss
@@ -70,6 +70,79 @@
}
}
+ &__gl {
+ margin: 3px 0 0 30px;
+ }
+
+ &__gl-tag {
+ display: inline-block;
+ font-size: 10px;
+ font-weight: 600;
+ color: #475569;
+ background: #f1f5f9;
+ border-radius: 999px;
+ padding: 1px 8px;
+ white-space: nowrap;
+
+ &--unmapped {
+ color: #92400e;
+ background: #fef3c7;
+ }
+
+ &--editable {
+ cursor: pointer;
+
+ &:hover {
+ outline: 1px solid #94a3b8;
+ }
+ }
+ }
+
+ &__gl-select {
+ display: block;
+ margin: 4px 0 0 30px;
+ max-width: 340px;
+ }
+
+ &__gl-warn {
+ color: #b45309;
+ font-weight: 600;
+ }
+
+ &__add-panel {
+ padding: 14px 18px;
+ border-bottom: 1px solid #f1f5f9;
+ background: #f8fafc;
+ }
+
+ &__add-title {
+ font-size: 13px;
+ font-weight: 600;
+ color: #0f172a;
+ margin-bottom: 10px;
+ }
+
+ &__add-fields {
+ display: flex;
+ align-items: flex-end;
+ gap: 12px;
+ flex-wrap: wrap;
+
+ .er__field {
+ min-width: 240px;
+ }
+
+ .er__field--gl {
+ min-width: 320px;
+ }
+ }
+
+ &__add-error {
+ margin-top: 8px;
+ font-size: 12px;
+ color: #b91c1c;
+ }
+
&__readonly-banner {
display: flex;
align-items: center;
diff --git a/src/app/products/loan-interest-rate-register/edit-register/edit-register.component.ts b/src/app/products/loan-interest-rate-register/edit-register/edit-register.component.ts
index 329cdd8f7..95472abde 100644
--- a/src/app/products/loan-interest-rate-register/edit-register/edit-register.component.ts
+++ b/src/app/products/loan-interest-rate-register/edit-register/edit-register.component.ts
@@ -6,7 +6,8 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
-import { Component, ElementRef, OnInit, ViewChild, inject } from '@angular/core';
+import { Component, ElementRef, OnDestroy, OnInit, ViewChild, inject } from '@angular/core';
+import { MatSnackBar } from '@angular/material/snack-bar';
import { CommonModule } from '@angular/common';
import { ActivatedRoute, Router, RouterLink } from '@angular/router';
import { FormsModule } from '@angular/forms';
@@ -18,7 +19,8 @@ import { MatIconModule } from '@angular/material/icon';
import { MatDatepickerModule } from '@angular/material/datepicker';
import { MatNativeDateModule } from '@angular/material/core';
import { RateRegisterService } from '../rate-register.service';
-import { RateCell, RateChartRow, RateRegister, SlabColumn } from '../models/rate-register.model';
+import { GlOption, RateCell, RateChartRow, RateRegister, SlabColumn } from '../models/rate-register.model';
+import { GlPickerComponent } from '../gl-picker/gl-picker.component';
/**
* Grid editor for one Loan Interest Rate Register — Excel-shaped: 34 products as rows and 10
@@ -39,10 +41,13 @@ import { RateCell, RateChartRow, RateRegister, SlabColumn } from '../models/rate
MatSelectModule,
MatIconModule,
MatDatepickerModule,
- MatNativeDateModule
+ MatNativeDateModule,
+ GlPickerComponent
]
})
-export class EditRegisterComponent implements OnInit {
+export class EditRegisterComponent implements OnInit, OnDestroy {
+ private readonly snack = inject(MatSnackBar);
+
private readonly service = inject(RateRegisterService);
private readonly route = inject(ActivatedRoute);
private readonly router = inject(Router);
@@ -58,11 +63,42 @@ export class EditRegisterComponent implements OnInit {
@ViewChild('cellInput') cellInput?: ElementRef No rate register versions yet
- Create the first version to publish rates for all loan products. The template comes pre-filled from the bank's
- approved Excel chart (34 products × 10 amount slabs + 5 CIBIL bands) — you can edit everything before
- submitting for approval.
+ Create the first version to publish rates for all loan products. It starts with the standard loan types (rates
+ blank) and 5 CIBIL bands — fill in the rates, add any bank-specific products, and submit for approval.
{{ row.srNo }}{{ row.particulars }}
+ {{
+ row.glAccountId == null ? 'GL not mapped' : glLabel(row.glAccountId)
+ }}
|
{{ display(cell) }} |
diff --git a/src/app/products/loan-interest-rate-register/loan-interest-rate-register.component.scss b/src/app/products/loan-interest-rate-register/loan-interest-rate-register.component.scss
index 0756a126f..13cad796d 100644
--- a/src/app/products/loan-interest-rate-register/loan-interest-rate-register.component.scss
+++ b/src/app/products/loan-interest-rate-register/loan-interest-rate-register.component.scss
@@ -424,6 +424,22 @@
}
}
+ &__gl-tag {
+ display: inline-block;
+ margin-left: 8px;
+ font-size: 10px;
+ font-weight: 600;
+ color: #475569;
+ background: #f1f5f9;
+ border-radius: 999px;
+ padding: 1px 8px;
+
+ &--unmapped {
+ color: #92400e;
+ background: #fef3c7;
+ }
+ }
+
&__history-foot {
padding: 10px 20px;
border-top: 1px solid #f1f5f9;
diff --git a/src/app/products/loan-interest-rate-register/loan-interest-rate-register.component.ts b/src/app/products/loan-interest-rate-register/loan-interest-rate-register.component.ts
index 2f4265b80..2fc9f859b 100644
--- a/src/app/products/loan-interest-rate-register/loan-interest-rate-register.component.ts
+++ b/src/app/products/loan-interest-rate-register/loan-interest-rate-register.component.ts
@@ -38,9 +38,15 @@ export class LoanInterestRateRegisterComponent implements OnInit {
active?: RateRegister;
ngOnInit(): void {
+ // Load the GL list once so mapped particulars show a readable label instead of "GL #id".
+ this.service.getGlOptions().subscribe();
this.reload();
}
+ glLabel(id: number | null | undefined): string | null {
+ return this.service.glLabel(id);
+ }
+
private reload(): void {
this.service.list().subscribe((rows) => {
this.registers = rows;
@@ -168,10 +174,11 @@ export class LoanInterestRateRegisterComponent implements OnInit {
/** Scaffold the very first version — used only when the register has no versions at all. */
createFirstVersion(): void {
- const draft = this.service.createFirstVersion();
- this.snack.open('Blank draft created — fill in rates and submit for approval', 'OK', { duration: 3000 });
- this.reload();
- this.edit(draft);
+ this.service.createFirstVersion().subscribe((draft) => {
+ this.snack.open('Draft created — fill in rates and submit for approval', 'OK', { duration: 3000 });
+ this.reload();
+ this.edit(draft);
+ });
}
/** Open the Compare screen for a pending register (checker view). */
diff --git a/src/app/products/loan-interest-rate-register/models/rate-register.model.ts b/src/app/products/loan-interest-rate-register/models/rate-register.model.ts
index 943cc6029..8f25e359f 100644
--- a/src/app/products/loan-interest-rate-register/models/rate-register.model.ts
+++ b/src/app/products/loan-interest-rate-register/models/rate-register.model.ts
@@ -21,9 +21,17 @@ export interface RateChartRow {
srNo: number;
particulars: string;
isFormula?: boolean;
+ /** GL account this particular is mapped to. null/undefined = "GL not mapped". */
+ glAccountId?: number | null;
rates: RateCell[];
}
+/** One selectable GL account for the particular-to-GL mapping. */
+export interface GlOption {
+ id: number;
+ label: string;
+}
+
export type RiskTier = 'V. Poor' | 'Poor' | 'Fair' | 'Good' | 'Excellent';
export interface CibilSlab {
diff --git a/src/app/products/loan-interest-rate-register/preview-register/preview-register.component.html b/src/app/products/loan-interest-rate-register/preview-register/preview-register.component.html
index a7262b2a9..8f258ebdf 100644
--- a/src/app/products/loan-interest-rate-register/preview-register/preview-register.component.html
+++ b/src/app/products/loan-interest-rate-register/preview-register/preview-register.component.html
@@ -48,121 +48,23 @@
-
-
-
-
-
-
-
-
-
-
- Rate chart — inline diff
- Changed cells highlighted · unchanged cells show single value
-
-
-
-
- No changes detected
-
- Draft is identical to the current Active register. Edit the Draft first to see diffs here.
-
- 0">
-
-
0">
-
+
-
-
-
- CIBIL slabs — inline diff
- Changed fields shown as OLD → NEW · unchanged fields render once
-
|