Maturity Instructions can now be left unselected when opening a SINGLE/DOUBLE/SPECIAL FD -- a new "-- Not selected (decide later via FD Dashboard) --" option, plus a clear button next to the field, since a maker had no way to go back to blank once something was picked. An account left this way is never touched by the nightly maturity job; what happens to it at maturity is decided later, manually, from the FD Dashboard's Renew action (see the backend/dashboard commits) -- an explicit choice here still auto-processes on its own exactly as before. Also fixes a real, separate pre-existing bug found in the same step: editing an existing account never read back its own already-saved Maturity Instructions/transfer-target choice -- the Edit screen always opened onto a blank picker even for an account that genuinely had one set, because it was being read from the wrong template object (the blank per-product default template refetched from the Product dropdown, not the actual account+template response that carries the account's own saved values). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
123 lines
4.9 KiB
HTML
123 lines
4.9 KiB
HTML
<!--
|
|
Copyright since 2025 Mifos Initiative
|
|
|
|
This Source Code Form is subject to the terms of the Mozilla Public
|
|
License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
-->
|
|
|
|
<form [formGroup]="closureSettingsForm" class="layout-row-wrap gap-2px responsive-column">
|
|
<h4 class="mat-h4 flex-98">{{ 'labels.heading.Maturity Instructions' | translate }}</h4>
|
|
|
|
<mat-form-field class="flex-48">
|
|
<mat-label>{{ 'labels.inputs.Maturity Instructions' | translate }}</mat-label>
|
|
<mat-select formControlName="maturityInstructionId">
|
|
<mat-option [value]="''">-- Not selected (decide later via FD Dashboard) --</mat-option>
|
|
@for (maturityInstruction of maturityInstructionOptions; track maturityInstruction) {
|
|
<mat-option [value]="maturityInstruction.id">
|
|
{{ maturityInstruction.value | translateKey: 'catalogs' }}
|
|
</mat-option>
|
|
}
|
|
</mat-select>
|
|
@if (closureSettingsForm.value.maturityInstructionId) {
|
|
<button
|
|
mat-icon-button
|
|
matSuffix
|
|
type="button"
|
|
title="Clear -- decide later via FD Dashboard"
|
|
(click)="$event.stopPropagation(); closureSettingsForm.get('maturityInstructionId')?.setValue('')"
|
|
>
|
|
<mat-icon>close</mat-icon>
|
|
</button>
|
|
}
|
|
</mat-form-field>
|
|
|
|
@if (closureSettingsForm.contains('transferToSavingsId')) {
|
|
<div class="dal-card flex-98">
|
|
<div class="dal-card__header">
|
|
<div class="dal-card__header-left">
|
|
<div class="dal-card__icon">
|
|
<mat-icon>savings</mat-icon>
|
|
</div>
|
|
<div>
|
|
<h3 class="dal-card__title">{{ transferAccountCardTitle }}</h3>
|
|
<span class="dal-card__sub">{{ transferAccountCardSubtitle }}</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="dal-card__body">
|
|
@if (selectedTransferAccount) {
|
|
<div class="dal-selected">
|
|
<div class="dal-selected__info">
|
|
<span class="dal-type-badge dal-type-badge--savings">
|
|
<mat-icon>savings</mat-icon>
|
|
Savings
|
|
</span>
|
|
<div class="dal-selected__details">
|
|
<span class="dal-selected__accno">{{ selectedTransferAccount.accountNo }}</span>
|
|
<span class="dal-selected__product">{{ selectedTransferAccount.savingsProductName }}</span>
|
|
</div>
|
|
@if (selectedTransferAccount.summary?.accountBalance != null) {
|
|
<div class="dal-selected__balance">
|
|
<span class="dal-selected__bal-label">Balance</span>
|
|
<span class="dal-selected__bal-amount">
|
|
{{ selectedTransferAccount.currency?.code }}
|
|
{{ selectedTransferAccount.summary.accountBalance | number: '1.2-2' }}
|
|
</span>
|
|
</div>
|
|
}
|
|
</div>
|
|
<button
|
|
mat-stroked-button
|
|
color="primary"
|
|
type="button"
|
|
class="dal-change-btn"
|
|
(click)="clearTransferAccount()"
|
|
>
|
|
<mat-icon>swap_horiz</mat-icon>
|
|
Change
|
|
</button>
|
|
</div>
|
|
} @else {
|
|
<mat-form-field appearance="outline" class="flex-98">
|
|
<mat-label>{{ transferAccountCardTitle }}</mat-label>
|
|
<mat-select formControlName="transferToSavingsId" required>
|
|
@for (account of savingsAccountsData; track account) {
|
|
<mat-option [value]="account.id">
|
|
({{ account.accountNo }}) {{ account.savingsProductName }}
|
|
</mat-option>
|
|
}
|
|
</mat-select>
|
|
<mat-error>{{ transferAccountCardTitle }} is required</mat-error>
|
|
</mat-form-field>
|
|
}
|
|
</div>
|
|
</div>
|
|
}
|
|
|
|
<h4 class="mat-h4 flex-98">{{ 'labels.heading.For Pre-mature closure' | translate }}</h4>
|
|
|
|
<mat-checkbox class="flex-98 margin-v" labelPosition="before" formControlName="preClosurePenalApplicable">
|
|
{{ 'labels.inputs.Apply Penal Interest (less)' | translate }}
|
|
</mat-checkbox>
|
|
|
|
@if (closureSettingsForm.value.preClosurePenalApplicable) {
|
|
<mat-form-field class="flex-48">
|
|
<mat-label>{{ 'labels.inputs.Penal Interest' | translate }} (%)</mat-label>
|
|
<input type="number" matInput formControlName="preClosurePenalInterest" min="0" step="0.01" />
|
|
</mat-form-field>
|
|
|
|
<mat-form-field class="flex-48">
|
|
<mat-label>{{ 'labels.inputs.Period' | translate }}</mat-label>
|
|
<mat-select formControlName="preClosurePenalInterestOnTypeId">
|
|
@for (preClosurePenalInterestOnType of preClosurePenalInterestOnTypeData; track preClosurePenalInterestOnType) {
|
|
<mat-option [value]="preClosurePenalInterestOnType.id">
|
|
{{ preClosurePenalInterestOnType.value | translateKey: 'catalogs' }}
|
|
</mat-option>
|
|
}
|
|
</mat-select>
|
|
</mat-form-field>
|
|
}
|
|
</form>
|