165 lines
6.9 KiB
HTML
165 lines
6.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/.
|
||
-->
|
||
|
||
<h2 mat-dialog-title>Pay out {{ data.partyCode }}</h2>
|
||
|
||
<mat-dialog-content>
|
||
<!-- What is being paid and to whom, stated once at the top so the officer confirms against the
|
||
customer in front of them rather than against a row they clicked a moment ago. -->
|
||
<div class="po-summary">
|
||
<div class="po-summary__row">
|
||
<span class="po-summary__label">Customer</span>
|
||
<span class="po-summary__value">{{ data.partyName }}</span>
|
||
</div>
|
||
<div class="po-summary__row">
|
||
<span class="po-summary__label">Matured on</span>
|
||
<span class="po-summary__value">{{ data.maturityDate | dateFormat }}</span>
|
||
</div>
|
||
<div class="po-summary__row">
|
||
<span class="po-summary__label">Opened on</span>
|
||
<span class="po-summary__value">{{ data.openingDate | dateFormat }}</span>
|
||
</div>
|
||
|
||
@if (breakdown) {
|
||
<div class="po-breakdown">
|
||
<div class="po-summary__row">
|
||
<span class="po-summary__label">Deposits collected</span>
|
||
<span class="po-summary__value">{{ breakdown.deposits | number: '1.2-2' }}</span>
|
||
</div>
|
||
@if (breakdown.transfersIn > 0) {
|
||
<div class="po-summary__row">
|
||
<span class="po-summary__label">Transferred in</span>
|
||
<span class="po-summary__value">+ {{ breakdown.transfersIn | number: '1.2-2' }}</span>
|
||
</div>
|
||
}
|
||
@if (breakdown.transfersOut > 0) {
|
||
<div class="po-summary__row">
|
||
<span class="po-summary__label">Transferred out</span>
|
||
<span class="po-summary__value">− {{ breakdown.transfersOut | number: '1.2-2' }}</span>
|
||
</div>
|
||
}
|
||
@if (breakdown.other !== 0) {
|
||
<div class="po-summary__row">
|
||
<span class="po-summary__label">Other (opening balance / adjustments)</span>
|
||
<span class="po-summary__value">{{ breakdown.other | number: '1.2-2' }}</span>
|
||
</div>
|
||
}
|
||
<div class="po-summary__row">
|
||
<span class="po-summary__label">
|
||
Interest @ {{ data.interestRate | number: '1.2-2' }}%
|
||
<span class="po-summary__note"
|
||
>{{ data.openingDate | dateFormat }} to {{ data.interestDate | dateFormat }}</span
|
||
>
|
||
</span>
|
||
<span class="po-summary__value">+ {{ breakdown.interest | number: '1.2-2' }}</span>
|
||
</div>
|
||
@if (breakdown.interestToPost > 0) {
|
||
<div class="po-summary__row">
|
||
<span class="po-summary__label"> Interest calculated, posted with this payout </span>
|
||
<span class="po-summary__value">+ {{ breakdown.interestToPost | number: '1.2-2' }}</span>
|
||
</div>
|
||
}
|
||
</div>
|
||
}
|
||
|
||
<div class="po-summary__row po-summary__row--amount">
|
||
<span class="po-summary__label">Total payable</span>
|
||
<span class="po-summary__value">{{ (breakdown ? breakdown.total : data.currentBalance) | number: '1.2-2' }}</span>
|
||
</div>
|
||
@if (interestStillToCome) {
|
||
<p class="po-summary__note">
|
||
Interest from {{ data.interestDate | dateFormat }} to {{ data.maturityDate | dateFormat }} is not worked out yet
|
||
- it is added when this is paid out, so the amount paid will be a little more.
|
||
</p>
|
||
}
|
||
</div>
|
||
<p class="po-summary__note">
|
||
Paying out closes {{ data.partyCode }} - the balance is nil afterwards and it takes nothing more.
|
||
</p>
|
||
|
||
@if (loading) {
|
||
<mat-progress-bar mode="indeterminate"></mat-progress-bar>
|
||
} @else {
|
||
<p class="po-question">Where should this go?</p>
|
||
|
||
<mat-radio-group [(ngModel)]="destination" class="po-choices">
|
||
<mat-radio-button value="own" [disabled]="ownAccounts.length === 0" class="po-choice">
|
||
<span class="po-choice__title">Into another account of theirs here</span>
|
||
@if (ownAccounts.length === 0) {
|
||
<span class="po-choice__note">{{ data.partyName }} has no other savings account at this bank</span>
|
||
} @else {
|
||
<span class="po-choice__note">Moved across today</span>
|
||
}
|
||
</mat-radio-button>
|
||
|
||
@if (destination === 'own' && ownAccounts.length > 0) {
|
||
<mat-form-field appearance="outline" class="po-account">
|
||
<mat-label>Account</mat-label>
|
||
<mat-select [(ngModel)]="selectedAccountNo" panelWidth="min(28rem, 90vw)">
|
||
@for (account of ownAccounts; track account.id) {
|
||
<mat-option [value]="account.accountNo"> {{ account.accountNo }} · {{ account.productName }} </mat-option>
|
||
}
|
||
</mat-select>
|
||
</mat-form-field>
|
||
}
|
||
|
||
<mat-radio-button value="other" class="po-choice">
|
||
<span class="po-choice__title">Park in Sundry</span>
|
||
<span class="po-choice__note"
|
||
>When the customer has no account here - held in the bank's Sundry account in their name</span
|
||
>
|
||
</mat-radio-button>
|
||
</mat-radio-group>
|
||
|
||
@if (destination === 'other') {
|
||
<mat-form-field appearance="outline" class="po-account">
|
||
<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 (destination === 'other') {
|
||
<!-- Said plainly, because the officer will be asked by the customer when the money arrives. -->
|
||
<div class="po-callout">
|
||
The money comes off {{ data.partyCode }} today and is held in the Sundry account chosen above against
|
||
{{ data.partyName }} until it is paid to them - so it is accounted for the whole time and nothing is lost.
|
||
</div>
|
||
}
|
||
}
|
||
</mat-dialog-content>
|
||
|
||
<mat-dialog-actions align="end">
|
||
<button mat-stroked-button mat-dialog-close>Cancel</button>
|
||
<button mat-raised-button color="primary" [disabled]="!canPayOut" (click)="payOut()">Pay out & Close</button>
|
||
</mat-dialog-actions>
|