- Reports > Interest Posting Reports: per branch and product, generate/regenerate at any time, approve; branch column, HO-on-behalf marker, posted txn per account - Reports > Interest Posting Summary (branch-wise) for the head office, with Excel export - Day Close warns and disables Close Day while the branch's interest report is unapproved - Savings product accounting: Interest On Savings (expense), Savings Interest Payable and Paid (liability rows, required) - RBI Form 1 statutory and Form 9 return screens, reserve config updates - Interest posting report GETs exempted from the response cache Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
155 lines
5.7 KiB
HTML
155 lines
5.7 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="bor-root">
|
|
<div class="bor-head">
|
|
<div class="bor-head-left">
|
|
<fa-icon icon="gavel" class="bor-head-ic"></fa-icon>
|
|
<div>
|
|
<h2 class="bor-head-t">Board of Resolution Register — Share Capital</h2>
|
|
<p class="bor-head-s">
|
|
Every share account with the board resolution that authorised the allotment. Accounts with no resolution on
|
|
record sort to the top.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
<button
|
|
class="bor-btn bor-btn--xls"
|
|
type="button"
|
|
[disabled]="exporting || !filtered.length"
|
|
(click)="exportExcel()"
|
|
>
|
|
<fa-icon icon="file-excel"></fa-icon>
|
|
{{ exporting ? 'Exporting…' : 'Export' }}
|
|
</button>
|
|
</div>
|
|
|
|
@if (loading) {
|
|
<div class="bor-note">Loading the register…</div>
|
|
} @else if (loadError) {
|
|
<div class="bor-note bor-note--warn"><fa-icon icon="exclamation-triangle"></fa-icon> {{ loadError }}</div>
|
|
}
|
|
|
|
@if (!loading && !loadError) {
|
|
<!-- Counted over the whole register, not the filtered view: it is a standing figure the
|
|
secretary acts on, and hiding it behind a filter would hide the problem. -->
|
|
@if (missingResolutionCount > 0) {
|
|
<div class="bor-note bor-note--warn">
|
|
<fa-icon icon="exclamation-triangle"></fa-icon>
|
|
{{ missingResolutionCount }} share account{{ missingResolutionCount === 1 ? '' : 's' }} carr{{
|
|
missingResolutionCount === 1 ? 'ies' : 'y'
|
|
}}
|
|
no resolution number. Share capital allotted without a board resolution cannot be evidenced to the Registrar.
|
|
</div>
|
|
}
|
|
|
|
<div class="bor-kpis">
|
|
<div class="bor-kpi">
|
|
<div class="bor-kpi-n">{{ filtered.length | number }}</div>
|
|
<div class="bor-kpi-l">Share Accounts</div>
|
|
</div>
|
|
<div class="bor-kpi bor-kpi--blue">
|
|
<div class="bor-kpi-n">{{ distinctResolutions | number }}</div>
|
|
<div class="bor-kpi-l">Resolutions</div>
|
|
</div>
|
|
<div class="bor-kpi bor-kpi--green">
|
|
<div class="bor-kpi-n">{{ totalShares | number }}</div>
|
|
<div class="bor-kpi-l">Shares Allotted</div>
|
|
</div>
|
|
<div class="bor-kpi bor-kpi--amber">
|
|
<div class="bor-kpi-n">₹{{ totalValue | number: '1.0-0' }}</div>
|
|
<div class="bor-kpi-l">Share Value</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="bor-filters">
|
|
<div class="bor-filter">
|
|
<label>Resolution No.</label>
|
|
<input class="bor-inp" type="text" [(ngModel)]="filterResolution" placeholder="e.g. BOR/2026-27/001" />
|
|
</div>
|
|
<div class="bor-filter">
|
|
<label>Branch</label>
|
|
<select class="bor-inp" [(ngModel)]="filterBranch">
|
|
<option value="">All branches</option>
|
|
@for (b of branches; track b) {
|
|
<option [value]="b">{{ b }}</option>
|
|
}
|
|
</select>
|
|
</div>
|
|
<div class="bor-filter">
|
|
<label>Status</label>
|
|
<select class="bor-inp" [(ngModel)]="filterStatus">
|
|
<option [ngValue]="''">Any status</option>
|
|
@for (s of statuses; track s) {
|
|
<option [ngValue]="s">{{ statusText(s) }}</option>
|
|
}
|
|
</select>
|
|
</div>
|
|
<div class="bor-filter bor-filter--grow">
|
|
<label>Search</label>
|
|
<input class="bor-inp" type="text" [(ngModel)]="search" placeholder="Member name, share A/c or CIF…" />
|
|
</div>
|
|
<label class="bor-check">
|
|
<input type="checkbox" [(ngModel)]="missingOnly" />
|
|
No resolution only
|
|
</label>
|
|
<button class="bor-btn" type="button" (click)="resetFilters()"><fa-icon icon="undo"></fa-icon> Reset</button>
|
|
</div>
|
|
|
|
<div class="bor-table-wrap">
|
|
<table class="bor-table">
|
|
<thead>
|
|
<tr>
|
|
<th>Resolution No.</th>
|
|
<th>Resolution Date</th>
|
|
<th>Share A/c No.</th>
|
|
<th>CIF No.</th>
|
|
<th>Member Name</th>
|
|
<th>Branch</th>
|
|
<th>Product</th>
|
|
<th class="num">Shares</th>
|
|
<th class="num">Share Value</th>
|
|
<th class="num">Tranches</th>
|
|
<th>Status</th>
|
|
<th>Activated On</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
@for (r of filtered; track r.shareAccountId) {
|
|
<tr [class.bor-row--missing]="!r.resolutionNumber">
|
|
<td>
|
|
@if (r.resolutionNumber) {
|
|
<strong class="bor-res">{{ r.resolutionNumber }}</strong>
|
|
} @else {
|
|
<span class="bor-missing">Not recorded</span>
|
|
}
|
|
</td>
|
|
<td class="mono">{{ r.resolutionDate || '—' }}</td>
|
|
<td class="mono">{{ r.accountNo }}</td>
|
|
<td class="mono">{{ r.cifNumber || '—' }}</td>
|
|
<td>{{ r.clientName }}</td>
|
|
<td>{{ r.officeName || '—' }}</td>
|
|
<td>{{ r.productName || '—' }}</td>
|
|
<td class="num">{{ r.approvedShares | number }}</td>
|
|
<td class="num strong">{{ r.shareValue | number: '1.2-2' }}</td>
|
|
<td class="num">{{ r.trancheCount }}</td>
|
|
<td>
|
|
<span [class]="statusClass(r.statusEnum)">{{ statusText(r.statusEnum) }}</span>
|
|
</td>
|
|
<td class="mono">{{ r.activatedDate || '—' }}</td>
|
|
</tr>
|
|
} @empty {
|
|
<tr>
|
|
<td colspan="12" class="bor-empty">No share account matches the filters.</td>
|
|
</tr>
|
|
}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
}
|
|
</div>
|