Merge remote-tracking branch 'origin/uate' into uate

This commit is contained in:
2026-07-28 10:53:26 +05:30
23 changed files with 305 additions and 101 deletions
@@ -516,6 +516,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.
@@ -571,7 +616,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 || '',
@@ -653,6 +702,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);
});
}
}
/**