feat: send denominationId in deposit payload + block submit on denomination mismatch
- All 4 deposit forms (Current/Savings/FD/RD) now send denominationId + denominationValue in denominationBreakdown so the backend can persist rows. - Submit is disabled when a denomination breakdown is entered but its total does not match the transaction amount. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.7
parent
89e17f561f
commit
555d9fb4b7
+6
-1
@@ -402,7 +402,12 @@
|
|||||||
<fa-icon icon="times" class="m-r-6"></fa-icon>
|
<fa-icon icon="times" class="m-r-6"></fa-icon>
|
||||||
{{ 'labels.buttons.Cancel' | translate }}
|
{{ 'labels.buttons.Cancel' | translate }}
|
||||||
</button>
|
</button>
|
||||||
<button mat-flat-button type="submit" class="sat__submit" [disabled]="!currentAccountTransactionForm.valid">
|
<button
|
||||||
|
mat-flat-button
|
||||||
|
type="submit"
|
||||||
|
class="sat__submit"
|
||||||
|
[disabled]="!currentAccountTransactionForm.valid || (denominationTotal > 0 && !denominationMatchesForm)"
|
||||||
|
>
|
||||||
<fa-icon icon="check" class="m-r-6"></fa-icon>
|
<fa-icon icon="check" class="m-r-6"></fa-icon>
|
||||||
{{ 'labels.buttons.Submit' | translate }}
|
{{ 'labels.buttons.Submit' | translate }}
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
+4
-1
@@ -35,6 +35,7 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module';
|
|||||||
|
|
||||||
/** Single Indian denomination row (note or coin). */
|
/** Single Indian denomination row (note or coin). */
|
||||||
interface Denomination {
|
interface Denomination {
|
||||||
|
id: number;
|
||||||
value: number;
|
value: number;
|
||||||
kind: 'note' | 'coin';
|
kind: 'note' | 'coin';
|
||||||
label: string;
|
label: string;
|
||||||
@@ -138,6 +139,7 @@ export class CurrentAccountTransactionsComponent implements OnInit {
|
|||||||
this.denominationMasterService.getAll().subscribe({
|
this.denominationMasterService.getAll().subscribe({
|
||||||
next: (list: any[]) => {
|
next: (list: any[]) => {
|
||||||
const rows: Denomination[] = (list || []).map((d) => ({
|
const rows: Denomination[] = (list || []).map((d) => ({
|
||||||
|
id: d.id,
|
||||||
value: d.denomination,
|
value: d.denomination,
|
||||||
kind: d.kind as 'note' | 'coin',
|
kind: d.kind as 'note' | 'coin',
|
||||||
label: '₹' + d.denomination,
|
label: '₹' + d.denomination,
|
||||||
@@ -399,7 +401,8 @@ export class CurrentAccountTransactionsComponent implements OnInit {
|
|||||||
...this.coins
|
...this.coins
|
||||||
]
|
]
|
||||||
.map((d) => ({
|
.map((d) => ({
|
||||||
denomination: d.value,
|
denominationId: d.id,
|
||||||
|
denominationValue: d.value,
|
||||||
kind: d.kind,
|
kind: d.kind,
|
||||||
count: this.countFor(d),
|
count: this.countFor(d),
|
||||||
subtotal: this.subtotalFor(d)
|
subtotal: this.subtotalFor(d)
|
||||||
|
|||||||
+6
-1
@@ -368,7 +368,12 @@
|
|||||||
<fa-icon icon="times" class="m-r-6"></fa-icon>
|
<fa-icon icon="times" class="m-r-6"></fa-icon>
|
||||||
{{ 'labels.buttons.Cancel' | translate }}
|
{{ 'labels.buttons.Cancel' | translate }}
|
||||||
</button>
|
</button>
|
||||||
<button mat-flat-button type="submit" class="sat__submit" [disabled]="!accountTransactionForm.valid">
|
<button
|
||||||
|
mat-flat-button
|
||||||
|
type="submit"
|
||||||
|
class="sat__submit"
|
||||||
|
[disabled]="!accountTransactionForm.valid || (denominationTotal > 0 && !denominationMatchesForm)"
|
||||||
|
>
|
||||||
<fa-icon icon="check" class="m-r-6"></fa-icon>
|
<fa-icon icon="check" class="m-r-6"></fa-icon>
|
||||||
{{ 'labels.buttons.Submit' | translate }}
|
{{ 'labels.buttons.Submit' | translate }}
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
+9
-1
@@ -32,6 +32,7 @@ import { IdentityVerifyDialogComponent } from '../../../../savings/saving-accoun
|
|||||||
import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module';
|
import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module';
|
||||||
|
|
||||||
interface Denomination {
|
interface Denomination {
|
||||||
|
id: number;
|
||||||
value: number;
|
value: number;
|
||||||
kind: 'note' | 'coin';
|
kind: 'note' | 'coin';
|
||||||
label: string;
|
label: string;
|
||||||
@@ -117,6 +118,7 @@ export class FixedDepositsCashTransactionComponent implements OnInit {
|
|||||||
this.denominationMasterService.getAll().subscribe({
|
this.denominationMasterService.getAll().subscribe({
|
||||||
next: (list: any[]) => {
|
next: (list: any[]) => {
|
||||||
const rows: Denomination[] = (list || []).map((d) => ({
|
const rows: Denomination[] = (list || []).map((d) => ({
|
||||||
|
id: d.id,
|
||||||
value: d.denomination,
|
value: d.denomination,
|
||||||
kind: d.kind as 'note' | 'coin',
|
kind: d.kind as 'note' | 'coin',
|
||||||
label: '₹' + d.denomination,
|
label: '₹' + d.denomination,
|
||||||
@@ -308,7 +310,13 @@ export class FixedDepositsCashTransactionComponent implements OnInit {
|
|||||||
...this.notes,
|
...this.notes,
|
||||||
...this.coins
|
...this.coins
|
||||||
]
|
]
|
||||||
.map((d) => ({ denomination: d.value, kind: d.kind, count: this.countFor(d), subtotal: this.subtotalFor(d) }))
|
.map((d) => ({
|
||||||
|
denominationId: d.id,
|
||||||
|
denominationValue: d.value,
|
||||||
|
kind: d.kind,
|
||||||
|
count: this.countFor(d),
|
||||||
|
subtotal: this.subtotalFor(d)
|
||||||
|
}))
|
||||||
.filter((row) => row.count > 0);
|
.filter((row) => row.count > 0);
|
||||||
}
|
}
|
||||||
this.fixedDepositsService
|
this.fixedDepositsService
|
||||||
|
|||||||
+6
-1
@@ -374,7 +374,12 @@
|
|||||||
<fa-icon icon="times" class="m-r-6"></fa-icon>
|
<fa-icon icon="times" class="m-r-6"></fa-icon>
|
||||||
{{ 'labels.buttons.Cancel' | translate }}
|
{{ 'labels.buttons.Cancel' | translate }}
|
||||||
</button>
|
</button>
|
||||||
<button mat-flat-button type="submit" class="sat__submit" [disabled]="!depositRecurringDepositForm.valid">
|
<button
|
||||||
|
mat-flat-button
|
||||||
|
type="submit"
|
||||||
|
class="sat__submit"
|
||||||
|
[disabled]="!depositRecurringDepositForm.valid || (denominationTotal > 0 && !denominationMatchesForm)"
|
||||||
|
>
|
||||||
<fa-icon icon="check" class="m-r-6"></fa-icon>
|
<fa-icon icon="check" class="m-r-6"></fa-icon>
|
||||||
{{ 'labels.buttons.Submit' | translate }}
|
{{ 'labels.buttons.Submit' | translate }}
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
+9
-1
@@ -35,6 +35,7 @@ import { IdentityVerifyDialogComponent } from '../../../../savings/saving-accoun
|
|||||||
import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module';
|
import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module';
|
||||||
|
|
||||||
interface Denomination {
|
interface Denomination {
|
||||||
|
id: number;
|
||||||
value: number;
|
value: number;
|
||||||
kind: 'note' | 'coin';
|
kind: 'note' | 'coin';
|
||||||
label: string;
|
label: string;
|
||||||
@@ -135,6 +136,7 @@ export class DepositRecurringDepositsAccountComponent implements OnInit {
|
|||||||
this.denominationMasterService.getAll().subscribe({
|
this.denominationMasterService.getAll().subscribe({
|
||||||
next: (list: any[]) => {
|
next: (list: any[]) => {
|
||||||
const rows: Denomination[] = (list || []).map((d) => ({
|
const rows: Denomination[] = (list || []).map((d) => ({
|
||||||
|
id: d.id,
|
||||||
value: d.denomination,
|
value: d.denomination,
|
||||||
kind: d.kind as 'note' | 'coin',
|
kind: d.kind as 'note' | 'coin',
|
||||||
label: '₹' + d.denomination,
|
label: '₹' + d.denomination,
|
||||||
@@ -329,7 +331,13 @@ export class DepositRecurringDepositsAccountComponent implements OnInit {
|
|||||||
...this.notes,
|
...this.notes,
|
||||||
...this.coins
|
...this.coins
|
||||||
]
|
]
|
||||||
.map((d) => ({ denomination: d.value, kind: d.kind, count: this.countFor(d), subtotal: this.subtotalFor(d) }))
|
.map((d) => ({
|
||||||
|
denominationId: d.id,
|
||||||
|
denominationValue: d.value,
|
||||||
|
kind: d.kind,
|
||||||
|
count: this.countFor(d),
|
||||||
|
subtotal: this.subtotalFor(d)
|
||||||
|
}))
|
||||||
.filter((row) => row.count > 0);
|
.filter((row) => row.count > 0);
|
||||||
}
|
}
|
||||||
this.recurringDepositsService
|
this.recurringDepositsService
|
||||||
|
|||||||
+6
-1
@@ -402,7 +402,12 @@
|
|||||||
<fa-icon icon="times" class="m-r-6"></fa-icon>
|
<fa-icon icon="times" class="m-r-6"></fa-icon>
|
||||||
{{ 'labels.buttons.Cancel' | translate }}
|
{{ 'labels.buttons.Cancel' | translate }}
|
||||||
</button>
|
</button>
|
||||||
<button mat-flat-button type="submit" class="sat__submit" [disabled]="!savingAccountTransactionForm.valid">
|
<button
|
||||||
|
mat-flat-button
|
||||||
|
type="submit"
|
||||||
|
class="sat__submit"
|
||||||
|
[disabled]="!savingAccountTransactionForm.valid || (denominationTotal > 0 && !denominationMatchesForm)"
|
||||||
|
>
|
||||||
<fa-icon icon="check" class="m-r-6"></fa-icon>
|
<fa-icon icon="check" class="m-r-6"></fa-icon>
|
||||||
{{ 'labels.buttons.Submit' | translate }}
|
{{ 'labels.buttons.Submit' | translate }}
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
+4
-1
@@ -35,6 +35,7 @@ import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module';
|
|||||||
|
|
||||||
/** Single Indian denomination row (note or coin). */
|
/** Single Indian denomination row (note or coin). */
|
||||||
interface Denomination {
|
interface Denomination {
|
||||||
|
id: number;
|
||||||
value: number;
|
value: number;
|
||||||
kind: 'note' | 'coin';
|
kind: 'note' | 'coin';
|
||||||
label: string;
|
label: string;
|
||||||
@@ -155,6 +156,7 @@ export class SavingsAccountTransactionsComponent implements OnInit {
|
|||||||
this.denominationMasterService.getAll().subscribe({
|
this.denominationMasterService.getAll().subscribe({
|
||||||
next: (list: any[]) => {
|
next: (list: any[]) => {
|
||||||
const rows: Denomination[] = (list || []).map((d) => ({
|
const rows: Denomination[] = (list || []).map((d) => ({
|
||||||
|
id: d.id,
|
||||||
value: d.denomination,
|
value: d.denomination,
|
||||||
kind: d.kind as 'note' | 'coin',
|
kind: d.kind as 'note' | 'coin',
|
||||||
label: '₹' + d.denomination,
|
label: '₹' + d.denomination,
|
||||||
@@ -457,7 +459,8 @@ export class SavingsAccountTransactionsComponent implements OnInit {
|
|||||||
...this.coins
|
...this.coins
|
||||||
]
|
]
|
||||||
.map((d) => ({
|
.map((d) => ({
|
||||||
denomination: d.value,
|
denominationId: d.id,
|
||||||
|
denominationValue: d.value,
|
||||||
kind: d.kind,
|
kind: d.kind,
|
||||||
count: this.countFor(d),
|
count: this.countFor(d),
|
||||||
subtotal: this.subtotalFor(d)
|
subtotal: this.subtotalFor(d)
|
||||||
|
|||||||
Reference in New Issue
Block a user