Clerk submits a governed share redemption request (shares, Board Resolution No., Meeting Date, settlement Payment Type); Bank Manager reviews with a live backend-validated checklist (account/GL state, not just submit-time snapshot) before approving, which redeems the shares and settles the linked savings account in one transaction. Adds a Passbook tab to the Share Account view, a reusable search-select control, and a Savings Product "Map Payment Types to Specific Funds" fund-source override (only Loan Products had this before) so settlement can be GL-mapped correctly. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
74 lines
2.3 KiB
HTML
74 lines
2.3 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/.
|
|
-->
|
|
|
|
<div class="pg">
|
|
<header class="pg-head">
|
|
<div>
|
|
<div class="pg-eyebrow">CLERK · SHARE WITHDRAWAL</div>
|
|
<h1 class="pg-title">My Share Requests</h1>
|
|
<p class="pg-sub">Share withdrawal requests you have submitted, and their approval status.</p>
|
|
</div>
|
|
<div class="pg-toolbar">
|
|
<button type="button" class="pg-btn pg-btn--primary" (click)="newRequest()">New Share Withdrawal</button>
|
|
</div>
|
|
</header>
|
|
|
|
<div class="pg-card">
|
|
<div class="inv-form-grid" style="padding: 12px 16px">
|
|
<label class="inv-form-field">
|
|
<span>Status</span>
|
|
<select [(ngModel)]="filterStatus" (change)="onFilterChange()">
|
|
@for (opt of statusOptions; track opt.value) {
|
|
<option [value]="opt.value">{{ opt.label }}</option>
|
|
}
|
|
</select>
|
|
</label>
|
|
</div>
|
|
<table class="pg-table">
|
|
<thead>
|
|
<tr>
|
|
<th>Account No</th>
|
|
<th>Client</th>
|
|
<th class="num">Shares</th>
|
|
<th>Resolution No.</th>
|
|
<th>Meeting Date</th>
|
|
<th>Submitted At</th>
|
|
<th>Status</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
@if (loading) {
|
|
<tr>
|
|
<td colspan="7" class="pg-empty">Loading…</td>
|
|
</tr>
|
|
} @else if (loaded && requests.length === 0) {
|
|
<tr>
|
|
<td colspan="7" class="pg-empty">No share withdrawal requests found.</td>
|
|
</tr>
|
|
} @else {
|
|
@for (r of requests; track r.id) {
|
|
<tr>
|
|
<td>
|
|
<span class="pg-chip">{{ r.account_no }}</span>
|
|
</td>
|
|
<td>{{ r.client_name }}</td>
|
|
<td class="num">{{ r.requested_shares }}</td>
|
|
<td>{{ r.resolution_number }}</td>
|
|
<td>{{ formatDateTime(r.meeting_date) }}</td>
|
|
<td>{{ formatDateTime(r.submitted_at) }}</td>
|
|
<td>
|
|
<span [class]="statusClass(r.status)">{{ statusLabel(r.status) }}</span>
|
|
</td>
|
|
</tr>
|
|
}
|
|
}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|