diff --git a/src/app/clients/client-stepper/client-general-step/client-general-step.component.ts b/src/app/clients/client-stepper/client-general-step/client-general-step.component.ts index ed53470c4..db39bae63 100644 --- a/src/app/clients/client-stepper/client-general-step/client-general-step.component.ts +++ b/src/app/clients/client-stepper/client-general-step/client-general-step.component.ts @@ -643,8 +643,9 @@ export class ClientGeneralStepComponent implements OnInit, OnDestroy, OnChanges this.createClientForm.get('degreeQualificationId')?.setValue(''); } }); - // Fetch all constitution options from code ID 17 - this.clientService.getCodeValuesById(17).subscribe((options) => { + // Constitution options by code NAME, never by id: code ids differ per tenant (on abc_bank id 17 is the empty + // ClientClassification code and Constitution is id 24), so a hardcoded id left the dropdown empty. + this.clientService.getCodeValuesByName('Constitution').subscribe((options) => { if (options?.length) { this.constitutionOptions = options; // Sort master by value length descending so longer/more-specific keys match first diff --git a/src/app/clients/clients-routing.module.ts b/src/app/clients/clients-routing.module.ts index 22ee81703..cb7b21e06 100644 --- a/src/app/clients/clients-routing.module.ts +++ b/src/app/clients/clients-routing.module.ts @@ -61,6 +61,7 @@ import { KycTabComponent } from './clients-view/kyc-tab/kyc-tab.component'; import { CkycTabComponent } from './clients-view/ckyc-tab/ckyc-tab.component'; import { Form60TabComponent } from './clients-view/form60-tab/form60-tab.component'; import { Form121TabComponent } from './clients-view/form121-tab/form121-tab.component'; +import { tdsConfigResolver } from '../letter-mgmt/certificates/form-15gh/tds-config.service'; import { EntityClassificationTabComponent } from './clients-view/entity-classification-tab/entity-classification-tab.component'; import { AuthorizedSignatoriesTabComponent } from './clients-view/authorized-signatories-tab/authorized-signatories-tab.component'; import { familyAllowedGuard, nomineeAllowedGuard } from './utils/family-nominee.guard'; @@ -198,6 +199,7 @@ const routes: Routes = [ { path: 'form121', component: Form121TabComponent, + resolve: { tdsConfig: tdsConfigResolver }, data: { title: 'Form 121 / TDS', breadcrumb: 'Form 121 / TDS', routeParamBreadcrumb: false } }, { diff --git a/src/app/clients/clients-view/form121-tab/form121-tab.component.html b/src/app/clients/clients-view/form121-tab/form121-tab.component.html index 1b75a798d..800f617bf 100644 --- a/src/app/clients/clients-view/form121-tab/form121-tab.component.html +++ b/src/app/clients/clients-view/form121-tab/form121-tab.component.html @@ -55,7 +55,10 @@
+ Overdraft is not allowed on this product. Tick "Is Overdraft Allowed" on the Terms tab to set the OD limits. +
+ }- Automatically closes OD accounts when balance reaches zero during day-end closing. + At day-end, withdraws the OD sanction when the debit balance is cleared to zero. Only the OD ends, not + the account. Leave off for a regular OD: a customer who uses it and repays the same day would lose it.
{{ selectedSecurityTypeHint }}
+Off: a withdrawal that would cross the limit is refused.
+ } @else { +{{ excessExample }}
+ } + } ++ Each account is sanctioned its own limit within this range, valid for the period above. The OD interest + rate is set on the Terms tab. +
+ These lines have no GL accounts behind them, so they are left blank rather than reported as nil. If the bank + genuinely has nothing under a head, leaving it unmapped is correct. +
+| {{ item.label }} | +{{ item.value }} | +
|---|---|
| Office scope | +{{ data.officeName }} | +
{{ data.basis.note }}
+| {{ section.title }} | +{{ section.unit }} | +
|---|---|
| {{ line.label }} | ++ @if (!line.configured) { + Not configured + } @else if (line.count) { + {{ count(line.amount) }} + } @else { + {{ amount(line.amount) }} + } + | +
| + {{ account.glCode }} + {{ account.name }} + @if (account.excluded) { + excluded — {{ account.excluded }} + } + | +{{ amount(account.balance) }} | +
| {{ total.label }} | +{{ amount(total.value) }} | +
| {{ field.caption }} | ++ {{ field.value || 'Not set in Institution Profile' }} + | +
|---|
{{ data.basis.note }}
+| Particulars | +As at | +Amount (INR) | +
|---|---|---|
| + {{ line.label }} + @if (!line.configured) { + Not configured + } + | +{{ line.asOnDate }} | ++ @if (line.configured) { + {{ amount(line.amount) }} + } @else { + — + } + | +
| + {{ account.glCode }} + {{ account.name }} + + @if (account.excluded) { + excluded — {{ account.excluded }} + } + + @if (isPartial(account)) { + + {{ account.weightPercentage }}% of {{ amount(account.accountBalance) }} + + } + + @if (account.liabilityClass) { + {{ account.liabilityClass | titlecase }} + } + | ++ | {{ amount(account.balance) }} | +
| {{ data.rateType }} required ({{ data.ratePercentage }}% of NDTL) | ++ | {{ amount(data.requiredAmount) }} | +
| {{ data.rateType }} maintained | ++ | {{ amount(data.maintainedAmount) }} | +
| {{ isShortfall ? 'Shortfall' : 'Surplus' }} | ++ | {{ amount(shortfallAmount) }} | +
+ CRR is reckoned over the whole fortnight, not on one day: the full requirement must be held + on average, and at least {{ m.dailyMinimumPercent }}% of it on every single day. +
+ +| Date | +Maintained (INR) | +Against floor | +
|---|---|---|
| {{ day.date }} | +{{ amount(day.amount) }} | ++ @if (day.amount < m.dailyMinimumAmount) { + Below floor + } @else { + OK + } + | +
{{ section.hint }}
+| Particulars | +Amount (INR) | +
|---|---|
| + {{ row.label }} + @if (!row.configured) { + Not configured + } + | ++ @if (row.configured) { + {{ amount(row.amount) }} + } @else { + — + } + | +