diff --git a/rd-account-12.png b/rd-account-12.png new file mode 100644 index 000000000..a2c2f52a0 Binary files /dev/null and b/rd-account-12.png differ 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 0ef4e187e..e152578ae 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 @@ -466,6 +466,51 @@ export class ClientGeneralStepComponent implements OnInit, OnDestroy, OnChanges } } + /** + * Resets transient session state back to a blank-client baseline. + * + * This app's RouteReusableStrategy (core/route/route-reusable-strategy.ts) keeps the SAME + * component instance alive across repeat visits to /clients/create — `ngOnInit`/the + * constructor never re-run for a second "create new client" session. Without this, computed + * state like `isMinor`, the linked guardian, or a prior sanctions/OTP verification would leak + * from whatever client was created in the previous session into the new one. Called by + * CreateClientComponent whenever `route.data` re-emits (which happens on every navigation, + * even a reused one). + */ + resetForNewClient(): void { + this.createClientForm.reset(); + // legalFormId's raw FormControl default is '' — the buildDependencies() subscription + // treats any non-PERSON value (including '') as "non-individual" and adds fullname / + // clientNonPersonDetails. Patch it back to the same PERSON default buildDependencies() + // itself applies on first construction, so a reset lands on a blank Individual client + // instead of stuck with leftover Entity-only controls. + this.createClientForm.get('legalFormId')?.setValue(LegalFormId.PERSON); + this.isMinor = false; + this.calculatedAgeDetail = null; + this.ageBreakdown = { years: 0, months: 0, days: 0 }; + this.selectedGuardian = null; + this.guardianSearchText = ''; + this.guardianSearchResults = []; + this.guardianExpanded = false; + if (this.createClientForm.get('guardianDetails')) { + this.createClientForm.removeControl('guardianDetails'); + } + // Verification state must not carry over — a previous client's cleared sanctions + // screening or verified OTP must not silently apply to a different new client. + this.mobileVerified = false; + this.dipLookupLogId = null; + this.dipTimestamp = null; + this.alternateMobileVerified = false; + this.alternateDipLookupLogId = null; + this.alternateDipTimestamp = null; + this.mobileNewOtpId = null; + this.emailNewOtpId = null; + this.sanctionsVerified = false; + this.sanctionsBlocked = false; + this.screeningLogId = null; + this.verifiedName = ''; + } + /** * Pre-fills the General step form from a manually-entered family member * when the user clicks "Create as Client" on the family members tab. @@ -521,7 +566,11 @@ export class ClientGeneralStepComponent implements OnInit, OnDestroy, OnChanges mobileNo: data.mobileNo, alternateMobileNo: data.alternateMobileNo || '', emailAddress: data.emailAddress, - dateOfBirth: data.dateOfBirth ? new Date(data.dateOfBirth) : '', + dateOfBirth: data.dateOfBirth + ? Array.isArray(data.dateOfBirth) + ? new Date(data.dateOfBirth[0], data.dateOfBirth[1] - 1, data.dateOfBirth[2]) + : new Date(data.dateOfBirth) + : '', occupationCategoryId: data.occupationCategory?.id || data.occupationCategoryId || '', occupationId: data.occupation?.id || data.occupationId || '', monthlyIncome: data.monthlyIncome || '', @@ -599,6 +648,42 @@ export class ClientGeneralStepComponent implements OnInit, OnDestroy, OnChanges } }); } + + // Restore linked guardian for minor clients. The `guardianDetails` control group above was + // just created synchronously by the dateOfBirth subscription (patched a few lines up), which + // also resets `selectedGuardian` to null — so this has to run after that patch, not before it. + // If a guardian is linked in the database (or the client is marked minor), we force minor state + // and explicitly ensure the form control exists so the guardian details load correctly. + if ((data.isMinor || this.isMinor || data.guardianClientId) && data.guardianClientId) { + this.isMinor = true; + if (!this.createClientForm.get('guardianDetails')) { + this.createClientForm.addControl( + 'guardianDetails', + this.formBuilder.group({ + guardianClientId: [ + '', + Validators.required + ], + guardianRelation: [ + '', + Validators.required + ] + }) + ); + } + setTimeout(() => { + this.createClientForm.get('guardianDetails')?.patchValue({ + guardianClientId: data.guardianClientId, + guardianRelation: data.guardianRelation || '' + }); + this.selectedGuardian = { + id: data.guardianClientId, + displayName: data.guardianClientDisplayName || '', + _loading: true + }; + this.fetchClientFullDetails(data.guardianClientId, this.selectedGuardian); + }); + } } /** diff --git a/src/app/clients/client-stepper/client-india-address-step/client-india-address-step.component.ts b/src/app/clients/client-stepper/client-india-address-step/client-india-address-step.component.ts index 2edeed950..4328be591 100644 --- a/src/app/clients/client-stepper/client-india-address-step/client-india-address-step.component.ts +++ b/src/app/clients/client-stepper/client-india-address-step/client-india-address-step.component.ts @@ -43,6 +43,9 @@ export class ClientIndiaAddressStepComponent implements OnInit, OnChanges { @Input() clientId: string = ''; /** Read-only mode — disables form editing until user clicks edit icon */ @Input() readOnly = false; + /** Minor clients can't hold utility bills, bank statements or an adult-only OVD in their own + * name — restricts the address-proof picker to Aadhaar/Passport when true. */ + @Input() isMinor = false; activeTab = 0; sameAsPermanent = false; @@ -240,7 +243,9 @@ export class ClientIndiaAddressStepComponent implements OnInit, OnChanges { this.clientsService.getKycProofTypes().subscribe({ next: (res: any) => { const activeFilter = (p: any) => p?.active !== false; - this.addressProofs = (res?.addressProofs || []).filter(activeFilter).map(normalizeProofType); + this.addressProofs = this.filterAddressProofsForMinor( + (res?.addressProofs || []).filter(activeFilter).map(normalizeProofType) + ); this.addressGroups = groupProofsByCategory(this.addressProofs); this.loadingProofs = false; }, @@ -250,6 +255,21 @@ export class ClientIndiaAddressStepComponent implements OnInit, OnChanges { }); } + /** Minors don't hold utility bills, bank statements, rent agreements, property tax receipts, + * employer letters or pension orders in their own name, and Voter ID/Driving Licence both + * require adult age — Aadhaar and Passport are the only OVDs left for proof of address. */ + private static readonly MINOR_ELIGIBLE_ADDRESS_PROOF_CODES = new Set([ + 'AADHAAR', + 'PASSPORT' + ]); + + private filterAddressProofsForMinor(proofs: ProofType[]): ProofType[] { + if (!this.isMinor) return proofs; + return proofs.filter((p) => + ClientIndiaAddressStepComponent.MINOR_ELIGIBLE_ADDRESS_PROOF_CODES.has((p.code || '').toUpperCase()) + ); + } + selectAddrProof(proof: ProofType): void { this.selectedAddrProof = proof; this.permanentForm.get('proofId')?.setValue(proof.id); @@ -355,6 +375,17 @@ export class ClientIndiaAddressStepComponent implements OnInit, OnChanges { } } } + if (changes['isMinor'] && !changes['isMinor'].firstChange && this.addressProofs.length) { + const filtered = this.filterAddressProofsForMinor(this.addressProofs); + if (filtered.length !== this.addressProofs.length) { + this.addressProofs = filtered; + this.addressGroups = groupProofsByCategory(this.addressProofs); + if (this.selectedAddrProof && !filtered.some((p) => p.id === this.selectedAddrProof?.id)) { + this.selectedAddrProof = null; + this.permanentForm.get('proofId')?.setValue(''); + } + } + } } /** diff --git a/src/app/clients/client-stepper/client-kyc-step/client-kyc-step.component.html b/src/app/clients/client-stepper/client-kyc-step/client-kyc-step.component.html index 64943f42c..60c70538c 100644 --- a/src/app/clients/client-stepper/client-kyc-step/client-kyc-step.component.html +++ b/src/app/clients/client-stepper/client-kyc-step/client-kyc-step.component.html @@ -28,33 +28,36 @@
@if (!isNonIndividual) { - @if (readOnly) { - -
-
- Client has PAN Card - @if (kycForm.get('hasPan')?.value) { - - check_circle - Yes - - } @else { - - cancel - No - - } + + @if (!isMinor) { + @if (readOnly) { + +
+
+ Client has PAN Card + @if (kycForm.get('hasPan')?.value) { + + check_circle + Yes + + } @else { + + cancel + No + + } +
-
- } @else { -
- Client has PAN Card -
+ } @else { +
+ Client has PAN Card +
+ } } - @if (kycForm.get('hasPan')?.value) { + @if (!isMinor && kycForm.get('hasPan')?.value) {
PAN Number @@ -1266,11 +1269,11 @@
- +

- Form 60 / 61 + Form 97 / 98 @if (!kycForm.get('hasPan')?.value) { Required — No PAN } @@ -1278,14 +1281,14 @@ @if (!kycForm.get('hasPan')?.value) {
warning - Client does not have PAN. Form 60/61 is mandatory. + Client does not have PAN. Form 97/98 is mandatory.
Form Type - Form 60 - Form 61 + Form 97 + Form 98 @@ -1296,26 +1299,26 @@
} @else { -

Client has PAN — Form 60/61 not required.

+

Client has PAN — Form 97/98 not required.

}

- +

- Form 15G / 15H + Form 121

- Form 15G/15H Applicable + Form 121 Applicable
@if (kycForm.get('form15Applicable')?.value) { Form Type - 15G (Below 60 years) - 15H (Senior Citizen 60+) + Form 121 (Below 60 years) + Form 121 (Senior Citizen 60+) diff --git a/src/app/clients/client-stepper/client-kyc-step/client-kyc-step.component.ts b/src/app/clients/client-stepper/client-kyc-step/client-kyc-step.component.ts index 97f850e9d..17565e642 100644 --- a/src/app/clients/client-stepper/client-kyc-step/client-kyc-step.component.ts +++ b/src/app/clients/client-stepper/client-kyc-step/client-kyc-step.component.ts @@ -61,6 +61,8 @@ export class ClientKycStepComponent implements OnInit, OnChanges, OnDestroy { /** Set by parent after client is created */ @Input() clientId: string = ''; @Input() isNonIndividual = false; + /** Minor clients don't hold a PAN card — hides the PAN section on the individual KYC form */ + @Input() isMinor = false; /** Constitution metadata (panLabel, showCin, etc.) passed from general step */ @Input() constitutionMeta: any = null; /** Entity full name (non-individual) — used for enterprise PAN verification */ @@ -163,7 +165,9 @@ export class ClientKycStepComponent implements OnInit, OnChanges, OnDestroy { { name: 'Driving Licence', code: 'DRIVING_LICENSE' }, { name: 'Voter ID', code: 'VOTER_ID' }, { name: 'NREGA Job Card', code: 'NREGA_JOB_CARD' }, - { name: 'National Population Register Letter', code: 'NPR_LETTER' } + { name: 'National Population Register Letter', code: 'NPR_LETTER' }, + { name: 'Birth Certificate', code: 'BIRTH_CERTIFICATE' }, + { name: 'School ID Card', code: 'SCHOOL_ID_CARD' } ]; /** Constitution-based KYC document types for non-individual clients */ private constitutionDocTypes: Record = { @@ -458,15 +462,44 @@ export class ClientKycStepComponent implements OnInit, OnChanges, OnDestroy { form15FY: [''] }); + /** RBI OVDs a minor cannot hold: Voter ID and Driving Licence require adult age, + * PAN and NREGA job cards are issued to adults. Aadhaar, Passport and NPR letters + * are unaffected by age and stay available. */ + private static readonly MINOR_INELIGIBLE_DOC_KEYWORDS = [ + 'pan', + 'driving', + 'voter', + 'nrega' + ]; + + /** Birth Certificate / School ID Card are minor-specific OVDs — not relevant once the + * client is an adult, so they're hidden the other direction. */ + private static readonly MINOR_ONLY_DOC_CODES = new Set([ + 'BIRTH_CERTIFICATE', + 'SCHOOL_ID_CARD' + ]); + + private filterDocTypesForMinor(docs: T[]): T[] { + if (this.isMinor) { + return docs.filter((d) => { + const text = `${d.name || ''} ${d.code || ''}`.toLowerCase(); + return !ClientKycStepComponent.MINOR_INELIGIBLE_DOC_KEYWORDS.some((k) => text.includes(k)); + }); + } + return docs.filter((d) => !ClientKycStepComponent.MINOR_ONLY_DOC_CODES.has((d.code || '').toUpperCase())); + } + ngOnInit(): void { // Seed defaults immediately so the picker has options before clientId is set // (template API requires clientId; user can still pick a type pre-save). if (!this.kycDocumentTypes.length) { - this.kycDocumentTypes = this.defaultDocumentTypes.map((d) => ({ - name: d.name, - code: d.code, - mandatory: false - })); + this.kycDocumentTypes = this.filterDocTypesForMinor( + this.defaultDocumentTypes.map((d) => ({ + name: d.name, + code: d.code, + mandatory: false + })) + ); this.rebuildKycDocPicker(); } this.loadExistingKycIfNeeded(); @@ -496,6 +529,21 @@ export class ClientKycStepComponent implements OnInit, OnChanges, OnDestroy { if (changes['constitutionMeta'] && this.isNonIndividual) { this.updateDocTypesForConstitution(); } + if (changes['isMinor']) { + if (this.isMinor) { + this.kycForm.get('hasPan')?.setValue(false); + this.kycForm.get('panNumber')?.setValue(''); + } + const filtered = this.filterDocTypesForMinor(this.kycDocumentTypes); + if (filtered.length !== this.kycDocumentTypes.length) { + this.kycDocumentTypes = filtered; + const currentName = this.kycForm.get('kycDocumentName')?.value; + if (currentName && !filtered.some((d) => d.name === currentName)) { + this.kycForm.get('kycDocumentName')?.setValue(''); + } + this.rebuildKycDocPicker(); + } + } } /** Update KYC document types based on selected constitution type */ @@ -874,11 +922,13 @@ export class ClientKycStepComponent implements OnInit, OnChanges, OnDestroy { this.kycTemplate = template; this.kycTemplateLoaded = true; if (template?.requiredDocuments?.length > 0) { - this.kycDocumentTypes = template.requiredDocuments.map((doc: any) => ({ - name: doc.name, - code: doc.code || doc.name, - mandatory: doc.mandatory ?? false - })); + this.kycDocumentTypes = this.filterDocTypesForMinor( + template.requiredDocuments.map((doc: any) => ({ + name: doc.name, + code: doc.code || doc.name, + mandatory: doc.mandatory ?? false + })) + ); // Update kycDocumentName validator based on mandatory docs const hasMandatory = this.kycDocumentTypes.some((d) => d.mandatory); if (hasMandatory) { @@ -891,11 +941,13 @@ export class ClientKycStepComponent implements OnInit, OnChanges, OnDestroy { error: () => { // Fallback to defaults if template API unavailable this.kycTemplateLoaded = true; - this.kycDocumentTypes = this.defaultDocumentTypes.map((d) => ({ - name: d.name, - code: d.code, - mandatory: false - })); + this.kycDocumentTypes = this.filterDocTypesForMinor( + this.defaultDocumentTypes.map((d) => ({ + name: d.name, + code: d.code, + mandatory: false + })) + ); this.rebuildKycDocPicker(); } }); diff --git a/src/app/clients/clients-routing.module.ts b/src/app/clients/clients-routing.module.ts index 9109e1003..60dc5b155 100644 --- a/src/app/clients/clients-routing.module.ts +++ b/src/app/clients/clients-routing.module.ts @@ -191,7 +191,7 @@ const routes: Routes = [ { path: 'form60', component: Form60TabComponent, - data: { title: 'Form 60', breadcrumb: 'Form 60', routeParamBreadcrumb: false } + data: { title: 'Form 97', breadcrumb: 'Form 97', routeParamBreadcrumb: false } }, { path: 'documents', diff --git a/src/app/clients/clients-view/form60-tab/form60-tab.component.html b/src/app/clients/clients-view/form60-tab/form60-tab.component.html index 97a73d9a8..3ec1df5f8 100644 --- a/src/app/clients/clients-view/form60-tab/form60-tab.component.html +++ b/src/app/clients/clients-view/form60-tab/form60-tab.component.html @@ -19,14 +19,14 @@
verified
-

Form 60 Not Required

+

Form 97 Not Required

PAN {{ panNumber }} is attached to this client. @if (panVerified) { check_circle Verified }

-

As per Income Tax Rule 114B, Form 60 is only required when PAN is not available.

+

As per Income Tax Rule 114B, Form 97 is only required when PAN is not available.

} @@ -36,7 +36,7 @@
warning_amber
- PAN not provided — Form 60 declaration is mandatory as per Income Tax Rule 114B. + PAN not provided — Form 97 declaration is mandatory as per Income Tax Rule 114B.
@@ -45,7 +45,7 @@
description -

Form 60 Declaration

+

Form 97 Declaration

Submitted }
diff --git a/src/app/clients/clients-view/form60-tab/form60-tab.component.ts b/src/app/clients/clients-view/form60-tab/form60-tab.component.ts index 5f66796af..e40a7da21 100644 --- a/src/app/clients/clients-view/form60-tab/form60-tab.component.ts +++ b/src/app/clients/clients-view/form60-tab/form60-tab.component.ts @@ -224,14 +224,14 @@ export class Form60TabComponent implements OnInit, OnDestroy { this.isEditMode = false; this.alertService.alert({ type: 'success', - message: 'Form 60 submitted successfully.' + message: 'Form 97 submitted successfully.' }); this.loadForm60Data(); }, error: (err: any) => { this.alertService.alert({ type: 'error', - message: err?.error?.developerMessage || err?.error?.defaultUserMessage || 'Failed to submit Form 60.' + message: err?.error?.developerMessage || err?.error?.defaultUserMessage || 'Failed to submit Form 97.' }); } }); diff --git a/src/app/clients/create-client/create-client.component.html b/src/app/clients/create-client/create-client.component.html index 8a6360884..85b900d5f 100644 --- a/src/app/clients/create-client/create-client.component.html +++ b/src/app/clients/create-client/create-client.component.html @@ -71,6 +71,7 @@
diff --git a/src/app/clients/create-client/create-client.component.ts b/src/app/clients/create-client/create-client.component.ts index 976918766..636208126 100644 --- a/src/app/clients/create-client/create-client.component.ts +++ b/src/app/clients/create-client/create-client.component.ts @@ -111,6 +111,12 @@ export class CreateClientComponent { this.route.data.subscribe((data: { clientTemplate: any; clientAddressFieldConfig: any }) => { this.clientTemplate = data.clientTemplate; this.clientAddressFieldConfig = data.clientAddressFieldConfig; + // This app's RouteReusableStrategy keeps this SAME component instance alive across + // repeat visits to /clients/create, so ngOnInit/constructor won't re-run for a second + // "create new client" session — reset transient state here instead, since `route.data` + // re-emits on every navigation regardless of whether the component was reused. Must run + // BEFORE setDatatables(), which reads legalFormType to filter clientTemplate.datatables. + this.resetForNewClient(); this.setDatatables(); }); // Read pre-fill data set by "Create as Client" from a manual family member @@ -121,6 +127,20 @@ export class CreateClientComponent { } } + /** Resets session state that could otherwise leak between clients when the route is reused. */ + private resetForNewClient(): void { + this.legalFormType = 1; + this.selectedTabIndex = 0; + this.createdClientId = ''; + this.savingClient = false; + this.saveProgress = 0; + this.tabEditMode = {}; + this.highestTabReached = 0; + this.validationError = ''; + this.prefillData = null; + this.clientGeneralStep?.resetForNewClient(); + } + /** Check if a tab is in read-only mode (completed tab navigated back to) */ isTabReadOnly(tabIndex: number): boolean { // Only tabs that have been passed (below highest reached) AND not explicitly set to edit mode diff --git a/src/app/clients/edit-client/edit-client.component.html b/src/app/clients/edit-client/edit-client.component.html index 87d01e65a..d4aa4f13d 100644 --- a/src/app/clients/edit-client/edit-client.component.html +++ b/src/app/clients/edit-client/edit-client.component.html @@ -149,6 +149,7 @@ @@ -206,6 +207,7 @@
diff --git a/src/app/clients/shared/kyc-proof-types.ts b/src/app/clients/shared/kyc-proof-types.ts index b2351fcbc..c0d678aec 100644 --- a/src/app/clients/shared/kyc-proof-types.ts +++ b/src/app/clients/shared/kyc-proof-types.ts @@ -70,6 +70,19 @@ export const PROOF_META: Record> = { documentKeyPlaceholder: 'NPR reference number', info: 'NPR letter — upload full document.' }, + BIRTH_CERTIFICATE: { + sides: 1, + documentKeyLabel: 'Birth certificate registration number', + documentKeyPlaceholder: 'Registration / certificate number', + category: 'Government-issued ID', + info: 'Birth certificate issued by the Municipal Corporation / Registrar of Births & Deaths — accepted proof of identity for minor clients as per RBI KYC norms.' + }, + SCHOOL_ID_CARD: { + sides: 1, + documentKeyLabel: 'School ID / admission number', + documentKeyPlaceholder: 'Student ID number', + info: 'School identity card bearing photograph — accepted proof of identity for minor clients as per RBI KYC norms.' + }, UTILITY_BILL: { sides: 1, category: 'Utility bills', diff --git a/src/app/core/shell/shell.component.html b/src/app/core/shell/shell.component.html index 27ba017cf..a6498fdfb 100644 --- a/src/app/core/shell/shell.component.html +++ b/src/app/core/shell/shell.component.html @@ -1468,13 +1468,13 @@ Balance Certificate
@@ -26,14 +23,14 @@
{{ count15G() | number }}
-
Form 15G (under 60)
+
Form 121 (under 60)
{{ count15H() | number }}
-
Form 15H (60+)
+
Form 121 (60+)
@@ -63,11 +60,11 @@
- +
@@ -92,7 +89,7 @@ Customer · PAN - Form + Form Type Age Branch Deposit Principal @@ -115,7 +112,7 @@ [class.cert-pill--blue]="formKind(r) === '15G'" [class.cert-pill--amber]="formKind(r) === '15H'" > - Form {{ formKind(r) }} + Form 121 ({{ formKind(r) }}) {{ age(r.dob) }} yrs diff --git a/src/app/letter-mgmt/certificates/form-15gh/form-15gh.component.ts b/src/app/letter-mgmt/certificates/form-15gh/form-15gh.component.ts index c6d96840c..839a9fb6f 100644 --- a/src/app/letter-mgmt/certificates/form-15gh/form-15gh.component.ts +++ b/src/app/letter-mgmt/certificates/form-15gh/form-15gh.component.ts @@ -146,9 +146,9 @@ export class Form15ghComponent implements OnInit { const kind = this.formKind(r); this.dscSign.promptThenDownload( { - title: `Form ${kind} Declaration`, + title: `Form 121 (${kind}) Declaration`, reference: `${r.customerId} · ${r.customerName} · ${r.fy}`, - filename: `Form-${kind}-${r.customerId}-${r.fy.replace(/\s+/g, '')}.pdf` + filename: `Form121-${r.customerId}-${r.fy.replace(/\s+/g, '')}.pdf` }, (dsc) => downloadForm15ghPdf(r, kind, dsc) ); diff --git a/src/app/letter-mgmt/certificates/form-60/form-60.component.html b/src/app/letter-mgmt/certificates/form-60/form-60.component.html index c22787b84..750169153 100644 --- a/src/app/letter-mgmt/certificates/form-60/form-60.component.html +++ b/src/app/letter-mgmt/certificates/form-60/form-60.component.html @@ -11,7 +11,7 @@
-

Form 60 Declaration

+

Form 97 Declaration

Income Tax Rule 114B — required for any customer transacting above the threshold who does not have a PAN on file. @@ -33,7 +33,7 @@
{{ totalFiled() | number }}
-
Form 60 Filed
+
Form 97 Filed
@@ -58,7 +58,7 @@
@@ -91,7 +91,7 @@ Trigger Transaction Amount PAN Status - Form 60 + Form 97 Actions @@ -146,7 +146,7 @@ class="cert-icon-btn primary" [disabled]="r.hasPan" (click)="viewCertificate(r)" - matTooltip="View / Print Form 60" + matTooltip="View / Print Form 97" > diff --git a/src/app/letter-mgmt/certificates/form-60/form-60.component.ts b/src/app/letter-mgmt/certificates/form-60/form-60.component.ts index 5c297b747..50e05a105 100644 --- a/src/app/letter-mgmt/certificates/form-60/form-60.component.ts +++ b/src/app/letter-mgmt/certificates/form-60/form-60.component.ts @@ -121,7 +121,7 @@ export class Form60Component implements OnInit { viewCertificate(r: Form60Record): void { if (r.hasPan) { - this.snack.open(`${r.customerName} already has a PAN on file — Form 60 is not applicable.`, 'OK', { + this.snack.open(`${r.customerName} already has a PAN on file — Form 97 is not applicable.`, 'OK', { duration: 3200 }); return; @@ -139,14 +139,14 @@ export class Form60Component implements OnInit { downloadCertificate(r: Form60Record): void { if (r.hasPan) { - this.snack.open(`${r.customerName} already has a PAN on file — Form 60 is not applicable.`, 'OK', { + this.snack.open(`${r.customerName} already has a PAN on file — Form 97 is not applicable.`, 'OK', { duration: 3200 }); return; } this.dscSign.promptThenDownload( { - title: 'Form 60 Declaration', + title: 'Form 97 Declaration', reference: `${r.customerId} · ${r.customerName}`, filename: `Form60-${r.customerId}.pdf` }, diff --git a/src/app/letter-mgmt/letter-mgmt-routing.module.ts b/src/app/letter-mgmt/letter-mgmt-routing.module.ts index b3df465f6..1053bfbba 100644 --- a/src/app/letter-mgmt/letter-mgmt-routing.module.ts +++ b/src/app/letter-mgmt/letter-mgmt-routing.module.ts @@ -44,12 +44,12 @@ const routes: Routes = [ { path: 'letter-mgmt/form-60', component: Form60Component, - data: { title: 'Form 60', breadcrumb: 'Form 60' } + data: { title: 'Form 97', breadcrumb: 'Form 97' } }, { path: 'letter-mgmt/form-15gh', component: Form15ghComponent, - data: { title: 'Form 15G & 15H', breadcrumb: 'Form 15G/H' } + data: { title: 'Form 121', breadcrumb: 'Form 121' } }, { path: 'letter-mgmt/hypothecation-certificate', diff --git a/src/assets/translations/en-US.json b/src/assets/translations/en-US.json index e813856e8..41e5d752b 100644 --- a/src/assets/translations/en-US.json +++ b/src/assets/translations/en-US.json @@ -2084,8 +2084,8 @@ "Floating Rates": "Floating Rates", "Floating rate": "Floating Rate", "Follow": "Follow", - "Form 60": "Form 60", - "Form 60 Declaration": "Form 60 Declaration", + "Form 60": "Form 97", + "Form 60 Declaration": "Form 97 Declaration", "Frequency": "Frequency", "Frequency Interval": "Frequency Interval", "Frequency Interval for compounding": "Frequency Interval for compounding", @@ -3983,7 +3983,7 @@ "Organization available languages": "Organization can select a language here from the available languages here.", "Original Schedule": "Original Schedule", "Overdue Charges": "Overdue Charges", - "PAN not provided. Please fill Form 60 as per Income Tax Rule 114B.": "PAN not provided. Please fill Form 60 as per Income Tax Rule 114B.", + "PAN not provided. Please fill Form 60 as per Income Tax Rule 114B.": "PAN not provided. Please fill Form 97 as per Income Tax Rule 114B.", "Password Preferences": "Password Preferences", "Passwords": "Passwords", "Pay Charge": "Pay Charge", diff --git a/src/environments/.env.ts b/src/environments/.env.ts index 11e3f647f..373b7c4a3 100644 --- a/src/environments/.env.ts +++ b/src/environments/.env.ts @@ -9,10 +9,9 @@ /* tslint:disable */ export default { 'mifos_x': { - 'version': '260723', - 'hash': 'ca85bae4' + 'version': '260728', + 'hash': 'a9c60083' }, 'allow_switching_backend_instance': true }; /* tslint:enable */ -