176 lines
6.6 KiB
HTML
176 lines
6.6 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/.
|
|
-->
|
|
|
|
<h2 mat-dialog-title>Close {{ data.partyCode }} early</h2>
|
|
|
|
<mat-dialog-content>
|
|
@if (loading) {
|
|
<mat-progress-bar mode="indeterminate"></mat-progress-bar>
|
|
}
|
|
|
|
<!--
|
|
The account as it stands, so the clerk is choosing against real figures rather than from memory.
|
|
The term still to run is the whole reason there is a charge at all.
|
|
-->
|
|
<div class="pcd-summary">
|
|
<div class="pcd-row">
|
|
<span>Customer</span>
|
|
<strong>{{ data.partyName }}</strong>
|
|
</div>
|
|
<div class="pcd-row">
|
|
<span>Balance</span>
|
|
<strong class="pcd-amount">{{ data.currentBalance | number: '1.2-2' }}</strong>
|
|
</div>
|
|
<div class="pcd-row">
|
|
<span>Matures on</span>
|
|
<strong>{{ data.maturityDate | dateFormat }}</strong>
|
|
</div>
|
|
<div class="pcd-row">
|
|
<span>Scheme rate</span>
|
|
<strong>{{ data.interestRate | number: '1.0-2' }}%</strong>
|
|
</div>
|
|
</div>
|
|
|
|
<h4 class="pcd-question">Who bears the cost of closing early?</h4>
|
|
|
|
<mat-radio-group class="pcd-choices" [(ngModel)]="borneBy">
|
|
<label class="pcd-choice" [class.pcd-choice--on]="borneBy === 'CUSTOMER'">
|
|
<mat-radio-button value="CUSTOMER"></mat-radio-button>
|
|
<div class="pcd-choice-body">
|
|
<div class="pcd-choice-title">Customer</div>
|
|
@if (scheme) {
|
|
<div class="pcd-choice-detail">
|
|
Interest recalculated at
|
|
<strong>{{ reducedRate | number: '1.0-2' }}%</strong>
|
|
instead of {{ data.interestRate | number: '1.0-2' }}% for the whole period, and the difference taken back
|
|
before the balance is paid out.
|
|
</div>
|
|
} @else {
|
|
<div class="pcd-choice-detail">Their interest is recalculated at the scheme's reduced rate.</div>
|
|
}
|
|
</div>
|
|
</label>
|
|
|
|
<label class="pcd-choice" [class.pcd-choice--on]="borneBy === 'AGENT'">
|
|
<mat-radio-button value="AGENT"></mat-radio-button>
|
|
<div class="pcd-choice-body">
|
|
<div class="pcd-choice-title">Agent — {{ data.agentCode }}</div>
|
|
<div class="pcd-choice-detail">
|
|
The customer keeps a full month's interest, and the agent funds the days left in this month. The balance is
|
|
paid out in full.
|
|
</div>
|
|
</div>
|
|
</label>
|
|
</mat-radio-group>
|
|
|
|
<!--
|
|
Stated rather than offered as a third option: the agent is charged whichever answer is picked, and
|
|
a clerk who did not know that would be surprised by it afterwards.
|
|
-->
|
|
@if (scheme && scheme.prematureAgentCommissionPenalty > 0) {
|
|
<p class="pcd-note">
|
|
Either way, {{ data.agentCode }} is charged
|
|
<strong>{{ scheme.prematureAgentCommissionPenalty | number: '1.0-2' }}%</strong>
|
|
of the commission owed to them — the round was not kept going.
|
|
</p>
|
|
}
|
|
|
|
<h4 class="pcd-question">Where should the balance go?</h4>
|
|
|
|
<mat-radio-group class="pcd-destinations" [(ngModel)]="destination">
|
|
<mat-radio-button value="own" [disabled]="ownAccounts.length === 0">
|
|
Into another account of theirs at this bank
|
|
</mat-radio-button>
|
|
<mat-radio-button value="other">Park in Sundry (no account here)</mat-radio-button>
|
|
</mat-radio-group>
|
|
|
|
@if (destination === 'own' && ownAccounts.length > 0) {
|
|
<mat-form-field appearance="outline" class="pcd-field">
|
|
<mat-label>Credit to account</mat-label>
|
|
<mat-select [(ngModel)]="selectedAccountNo">
|
|
@for (account of ownAccounts; track account.accountNo) {
|
|
<mat-option [value]="account.accountNo"> {{ account.accountNo }} — {{ account.productName }} </mat-option>
|
|
}
|
|
</mat-select>
|
|
</mat-form-field>
|
|
}
|
|
|
|
@if (destination === 'other') {
|
|
<mat-form-field appearance="outline" class="pcd-field">
|
|
<mat-label>Park in GL account</mat-label>
|
|
<input
|
|
matInput
|
|
[ngModel]="sundrySearch"
|
|
(ngModelChange)="onSundryTyped($event)"
|
|
[matAutocomplete]="sundryAuto"
|
|
placeholder="Type GL code or name…"
|
|
autocomplete="off"
|
|
/>
|
|
<mat-autocomplete
|
|
#sundryAuto="matAutocomplete"
|
|
panelWidth="min(28rem, 90vw)"
|
|
[displayWith]="sundryDisplay"
|
|
(optionSelected)="pickSundry($event.option.value)"
|
|
>
|
|
@for (account of sundryOptions; track account.id) {
|
|
<mat-option [value]="account">{{ account.glCode }} · {{ account.name }}</mat-option>
|
|
}
|
|
@if (sundryOptions.length === 0) {
|
|
<mat-option disabled>No liability GL matches</mat-option>
|
|
}
|
|
</mat-autocomplete>
|
|
@if (!sundryGlAccountId) {
|
|
<mat-hint class="po-hint-warn">Search and pick your bank's Sundry GL account</mat-hint>
|
|
} @else {
|
|
<mat-hint>The balance is held here in the customer's name until it is paid to them</mat-hint>
|
|
}
|
|
</mat-form-field>
|
|
}
|
|
|
|
@if (ownAccounts.length === 0 && !loading) {
|
|
<p class="pcd-note">
|
|
This customer has no other account here, so the balance is parked in the Sundry account chosen above, in their
|
|
name until it is paid to them.
|
|
</p>
|
|
}
|
|
|
|
<!--
|
|
Inside the lock-in the scheme does not allow closing early, so this is asked for rather than done:
|
|
the reason goes to a manager, who approves this one account. The scheme's lock-in stays as it is.
|
|
-->
|
|
@if (withinLockin) {
|
|
<div class="pcd-lockin">
|
|
<p class="pcd-lockin-title">Within lock-in until {{ closableFrom | dateFormat }}</p>
|
|
<p class="pcd-note">
|
|
{{ data.partyCode }} opened on {{ data.openingDate | dateFormat }} and the scheme locks it in for
|
|
{{ scheme?.prematureLockinMonths }} months. It can be closed early only if a manager approves it.
|
|
</p>
|
|
<mat-form-field appearance="outline" class="pcd-field">
|
|
<mat-label>Reason for closing within lock-in</mat-label>
|
|
<textarea matInput rows="2" maxlength="250" required [(ngModel)]="lockinReason"></textarea>
|
|
<mat-hint align="end">{{ lockinReason.length }}/250</mat-hint>
|
|
</mat-form-field>
|
|
</div>
|
|
}
|
|
|
|
<p class="pcd-warn">
|
|
@if (withinLockin) {
|
|
Once approved, this closes the account. It cannot be reopened.
|
|
} @else {
|
|
This closes the account. It cannot be reopened.
|
|
}
|
|
</p>
|
|
</mat-dialog-content>
|
|
|
|
<mat-dialog-actions align="end">
|
|
<button mat-button mat-dialog-close type="button">Cancel</button>
|
|
<button mat-raised-button color="warn" type="button" [disabled]="!canClose" (click)="close()">
|
|
{{ withinLockin ? 'Send for Approval' : 'Close Account' }}
|
|
</button>
|
|
</mat-dialog-actions>
|