WEB-460 Shares per Client Field Allows Zero and Negative Values in Share Product Creation Form

This commit is contained in:
Soni Jay
2025-12-15 23:02:47 +05:30
parent 5666fcbe82
commit 94bb2a06b2
2 changed files with 89 additions and 19 deletions
@@ -12,21 +12,56 @@
<mat-form-field class="flex-31">
<mat-label>{{ 'labels.inputs.Minimum' | translate }}</mat-label>
<input type="number" matInput formControlName="minimumShares" />
<input type="number" matInput formControlName="minimumShares" min="1" step="1" required />
<mat-error *ngIf="shareProductSettingsForm.get('minimumShares').hasError('required')">
Minimum is <strong>required</strong>
</mat-error>
<mat-error *ngIf="shareProductSettingsForm.get('minimumShares').hasError('min')">
{{ 'labels.inputs.Minimum Shares per Client' | translate }}
{{ 'labels.commons.must be greater than zero' | translate }}
</mat-error>
<mat-error *ngIf="shareProductSettingsForm.get('minimumShares').hasError('pattern')">
{{ 'labels.inputs.Minimum Shares per Client' | translate }}
{{ 'labels.commons.must be an integer' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="flex-31">
<mat-label>{{ 'labels.inputs.Default' | translate }}</mat-label>
<input type="number" matInput formControlName="nominalShares" required />
<mat-error>
{{ 'labels.inputs.Default Shares per Client' | translate }} {{ 'labels.commons.is' | translate }}
<strong>{{ 'labels.commons.required' | translate }}</strong>
<input type="number" matInput formControlName="nominalShares" min="1" step="1" required />
<mat-error *ngIf="shareProductSettingsForm.get('nominalShares').hasError('required')">
Default is <strong>required</strong>
</mat-error>
<mat-error *ngIf="shareProductSettingsForm.get('nominalShares').hasError('min')">
{{ 'labels.inputs.Default Shares per Client' | translate }}
{{ 'labels.commons.must be greater than zero' | translate }}
</mat-error>
<mat-error *ngIf="shareProductSettingsForm.get('nominalShares').hasError('pattern')">
{{ 'labels.inputs.Default Shares per Client' | translate }}
{{ 'labels.commons.must be an integer' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="flex-31">
<mat-label>{{ 'labels.inputs.Maximum' | translate }}</mat-label>
<input type="number" matInput formControlName="maximumShares" />
<input type="number" matInput formControlName="maximumShares" min="1" step="1" required />
<mat-error *ngIf="shareProductSettingsForm.get('maximumShares').hasError('required')">
Maximum is <strong>required</strong>
</mat-error>
<mat-error *ngIf="shareProductSettingsForm.get('maximumShares').hasError('min')">
{{ 'labels.inputs.Maximum Shares per Client' | translate }}
{{ 'labels.commons.must be greater than zero' | translate }}
</mat-error>
<mat-error *ngIf="shareProductSettingsForm.get('maximumShares').hasError('pattern')">
{{ 'labels.inputs.Maximum Shares per Client' | translate }}
{{ 'labels.commons.must be an integer' | translate }}
</mat-error>
<mat-error *ngIf="shareProductSettingsForm.hasError('sharesOrder')">
{{
'labels.commons.minimum must be less than or equal to default and default must be less than or equal to maximum'
| translate
}}
</mat-error>
</mat-form-field>
<h4 class="mat-h4 flex-98">
@@ -53,19 +53,54 @@ export class ShareProductSettingsStepComponent implements OnInit {
}
createShareProductSettingsForm() {
this.shareProductSettingsForm = this.formBuilder.group({
minimumShares: [''],
nominalShares: [
'',
Validators.required
],
maximumShares: [''],
minimumActivePeriodForDividends: [''],
minimumactiveperiodFrequencyType: [''],
lockinPeriodFrequency: [''],
lockinPeriodFrequencyType: [''],
allowDividendCalculationForInactiveClients: [false]
});
this.shareProductSettingsForm = this.formBuilder.group(
{
minimumShares: [
'',
[
Validators.required,
Validators.min(1),
Validators.pattern(/^[0-9]+$/)
]
],
nominalShares: [
'',
[
Validators.required,
Validators.min(1),
Validators.pattern(/^[0-9]+$/)
]
],
maximumShares: [
'',
[
Validators.required,
Validators.min(1),
Validators.pattern(/^[0-9]+$/)
]
],
minimumActivePeriodForDividends: [''],
minimumactiveperiodFrequencyType: [''],
lockinPeriodFrequency: [''],
lockinPeriodFrequencyType: [''],
allowDividendCalculationForInactiveClients: [false]
},
{
validators: this.validateSharesOrder
}
);
}
private validateSharesOrder(group: UntypedFormGroup): { [key: string]: any } | null {
const min = Number(group.get('minimumShares')?.value);
const nominal = Number(group.get('nominalShares')?.value);
const max = Number(group.get('maximumShares')?.value);
if (min && nominal && max) {
if (min > nominal || nominal > max) {
return { sharesOrder: true };
}
}
return null;
}
get shareProductSettings() {