feat: update RBI reserve return form 1 & 9 UI and FD accounting mapping
This commit is contained in:
@@ -27,101 +27,104 @@
|
||||
} @else {
|
||||
<!-- ═══ Rates — only the reserve returns are charged at a percentage ═══ -->
|
||||
@if (showRates) {
|
||||
<div class="rrc-card">
|
||||
<h3 class="rrc-card__title">Reserve rates</h3>
|
||||
<p class="rrc-card__hint">
|
||||
Rates are effective-dated rather than overwritten: a return filed for an earlier period keeps reporting the rate
|
||||
that was actually in force then. Saving against a date that already has a rate edits it; a new date adds one.
|
||||
</p>
|
||||
<div class="rrc-card">
|
||||
<h3 class="rrc-card__title">Reserve rates</h3>
|
||||
<p class="rrc-card__hint">
|
||||
Rates are effective-dated rather than overwritten: a return filed for an earlier period keeps reporting the
|
||||
rate that was actually in force then. Saving against a date that already has a rate edits it; a new date adds
|
||||
one.
|
||||
</p>
|
||||
|
||||
<div class="rrc-rate-now">
|
||||
@for (type of ['CRR', 'SLR', 'SAVINGS_DEMAND']; track type) {
|
||||
<div class="rrc-rate-now__item">
|
||||
<span class="rrc-rate-now__label">
|
||||
{{ type === 'SAVINGS_DEMAND' ? 'Savings demand share' : type }} in force today
|
||||
</span>
|
||||
@if (currentRate(type); as rate) {
|
||||
<span class="rrc-rate-now__value">{{ rate.percentage }}%</span>
|
||||
@if (rate.seedDefault) {
|
||||
<span class="rrc-rate-now__since rrc-rate-now__since--warn">
|
||||
Placeholder — confirm the rate actually in force
|
||||
</span>
|
||||
} @else {
|
||||
<span class="rrc-rate-now__since">since {{ rate.effectiveFrom }}</span>
|
||||
}
|
||||
} @else {
|
||||
<span class="rrc-rate-now__value rrc-rate-now__value--none">Not set</span>
|
||||
<span class="rrc-rate-now__since">{{ type === 'CRR' ? 'Form 1' : 'Form 9' }} cannot compute</span>
|
||||
}
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
|
||||
<div class="rrc-rate-form">
|
||||
<mat-form-field appearance="outline" subscriptSizing="dynamic" class="rrc-rate-form__type">
|
||||
<mat-label>Rate</mat-label>
|
||||
<mat-select [(ngModel)]="newRate.rateType">
|
||||
<mat-option value="CRR">CRR — Form 1</mat-option>
|
||||
<mat-option value="SLR">SLR — Form 9</mat-option>
|
||||
<!-- Not a reserve ratio, but set by RBI and effective-dated the same way: the share of
|
||||
savings balances that counts as a demand liability, the rest being time. -->
|
||||
<mat-option value="SAVINGS_DEMAND">Savings — demand share</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline" subscriptSizing="dynamic" class="rrc-rate-form__pct">
|
||||
<mat-label>Percentage (%)</mat-label>
|
||||
<input matInput type="number" step="0.0001" min="0" max="100" [(ngModel)]="newRate.percentage" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline" subscriptSizing="dynamic" class="rrc-rate-form__date">
|
||||
<mat-label>Effective from</mat-label>
|
||||
<input matInput type="date" [(ngModel)]="newRate.effectiveFrom" />
|
||||
</mat-form-field>
|
||||
|
||||
<button mat-raised-button color="primary" [disabled]="savingRate" (click)="saveRate()">
|
||||
{{ savingRate ? 'Saving…' : 'Save rate' }}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<table class="rrc-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Rate</th>
|
||||
<th>Percentage</th>
|
||||
<th>Effective from</th>
|
||||
<th>Status</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@for (rate of rates; track rate.id) {
|
||||
<tr>
|
||||
<td><span class="rrc-key">{{ rate.rateType }}</span></td>
|
||||
<td class="rrc-num">{{ rate.percentage }}%</td>
|
||||
<td>{{ rate.effectiveFrom }}</td>
|
||||
<td>
|
||||
@if (isFuture(rate)) {
|
||||
<span class="rrc-badge rrc-badge--future">Future-dated</span>
|
||||
} @else if (currentRate(rate.rateType)?.id === rate.id) {
|
||||
<span class="rrc-badge rrc-badge--active">In force</span>
|
||||
} @else {
|
||||
<span class="rrc-badge rrc-badge--past">Superseded</span>
|
||||
}
|
||||
<div class="rrc-rate-now">
|
||||
@for (type of ['CRR', 'SLR', 'SAVINGS_DEMAND']; track type) {
|
||||
<div class="rrc-rate-now__item">
|
||||
<span class="rrc-rate-now__label">
|
||||
{{ type === 'SAVINGS_DEMAND' ? 'Savings demand share' : type }} in force today
|
||||
</span>
|
||||
@if (currentRate(type); as rate) {
|
||||
<span class="rrc-rate-now__value">{{ rate.percentage }}%</span>
|
||||
@if (rate.seedDefault) {
|
||||
<span class="rrc-badge rrc-badge--seed">Placeholder</span>
|
||||
<span class="rrc-rate-now__since rrc-rate-now__since--warn">
|
||||
Placeholder — confirm the rate actually in force
|
||||
</span>
|
||||
} @else {
|
||||
<span class="rrc-rate-now__since">since {{ rate.effectiveFrom }}</span>
|
||||
}
|
||||
</td>
|
||||
<td>
|
||||
<button mat-button class="rrc-remove" (click)="deleteRate(rate)" title="Remove this rate">
|
||||
<i class="fas fa-trash"></i>
|
||||
</button>
|
||||
</td>
|
||||
</tr>
|
||||
} @else {
|
||||
<span class="rrc-rate-now__value rrc-rate-now__value--none">Not set</span>
|
||||
<span class="rrc-rate-now__since">{{ type === 'CRR' ? 'Form 1' : 'Form 9' }} cannot compute</span>
|
||||
}
|
||||
</div>
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="rrc-rate-form">
|
||||
<mat-form-field appearance="outline" subscriptSizing="dynamic" class="rrc-rate-form__type">
|
||||
<mat-label>Rate</mat-label>
|
||||
<mat-select [(ngModel)]="newRate.rateType">
|
||||
<mat-option value="CRR">CRR — Form 1</mat-option>
|
||||
<mat-option value="SLR">SLR — Form 9</mat-option>
|
||||
<!-- Not a reserve ratio, but set by RBI and effective-dated the same way: the share of
|
||||
savings balances that counts as a demand liability, the rest being time. -->
|
||||
<mat-option value="SAVINGS_DEMAND">Savings — demand share</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline" subscriptSizing="dynamic" class="rrc-rate-form__pct">
|
||||
<mat-label>Percentage (%)</mat-label>
|
||||
<input matInput type="number" step="0.0001" min="0" max="100" [(ngModel)]="newRate.percentage" />
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field appearance="outline" subscriptSizing="dynamic" class="rrc-rate-form__date">
|
||||
<mat-label>Effective from</mat-label>
|
||||
<input matInput type="date" [(ngModel)]="newRate.effectiveFrom" />
|
||||
</mat-form-field>
|
||||
|
||||
<button mat-raised-button color="primary" [disabled]="savingRate" (click)="saveRate()">
|
||||
{{ savingRate ? 'Saving…' : 'Save rate' }}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<table class="rrc-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Rate</th>
|
||||
<th>Percentage</th>
|
||||
<th>Effective from</th>
|
||||
<th>Status</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@for (rate of rates; track rate.id) {
|
||||
<tr>
|
||||
<td>
|
||||
<span class="rrc-key">{{ rate.rateType }}</span>
|
||||
</td>
|
||||
<td class="rrc-num">{{ rate.percentage }}%</td>
|
||||
<td>{{ rate.effectiveFrom }}</td>
|
||||
<td>
|
||||
@if (isFuture(rate)) {
|
||||
<span class="rrc-badge rrc-badge--future">Future-dated</span>
|
||||
} @else if (currentRate(rate.rateType)?.id === rate.id) {
|
||||
<span class="rrc-badge rrc-badge--active">In force</span>
|
||||
} @else {
|
||||
<span class="rrc-badge rrc-badge--past">Superseded</span>
|
||||
}
|
||||
@if (rate.seedDefault) {
|
||||
<span class="rrc-badge rrc-badge--seed">Placeholder</span>
|
||||
}
|
||||
</td>
|
||||
<td>
|
||||
<button mat-button class="rrc-remove" (click)="deleteRate(rate)" title="Remove this rate">
|
||||
<i class="fas fa-trash"></i>
|
||||
</button>
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
}
|
||||
|
||||
<!-- ═══ GL accounts ═══ -->
|
||||
@@ -324,6 +327,17 @@
|
||||
<input matInput [(ngModel)]="newRole.description" placeholder="What this head covers" />
|
||||
</mat-form-field>
|
||||
|
||||
<!--
|
||||
The section prefixes are a naming convention rather than a field, so they have to be
|
||||
stated somewhere: an administrator who wants a head on the Memorandum has no way to
|
||||
discover that naming it so is what puts it there.
|
||||
-->
|
||||
<p class="rrc-card__hint rrc-add-role__note">
|
||||
Naming a head <strong>Memorandum - …</strong>, <strong>Annexure A - …</strong> or
|
||||
<strong>Annexure B - …</strong> prints it under that section of the return instead of in the main
|
||||
statement.
|
||||
</p>
|
||||
|
||||
<button mat-raised-button color="primary" [disabled]="addingRole" (click)="addRole()">
|
||||
{{ addingRole ? 'Adding…' : 'Add head' }}
|
||||
</button>
|
||||
|
||||
Reference in New Issue
Block a user