266 lines
9.9 KiB
HTML
266 lines
9.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/.
|
|
-->
|
|
|
|
<!-- Laid out as Disbursement & Transfers reviews its requests, and styled by the same sheet. -->
|
|
<div class="dri dri--dialog">
|
|
<nav class="cashier-nav cashier-nav--clerk">
|
|
<span class="dri-header-title">DDS {{ entry.type }} Review</span>
|
|
<span class="cashier-nav__esc-hint" (click)="close()">✕ Close</span>
|
|
</nav>
|
|
|
|
@if (loading) {
|
|
<div class="dri-loading">
|
|
<mat-icon class="dri-loading__icon">hourglass_empty</mat-icon>
|
|
<span>Loading entry…</span>
|
|
</div>
|
|
} @else {
|
|
<div class="dri-body">
|
|
<!-- Header card: the voucher it moves under, its status, who made it and when -->
|
|
<div class="dri-card dri-card--header">
|
|
<div class="dri-card-header">
|
|
<div class="dri-card-header__left">
|
|
<span class="dri-voucher">{{ voucherNo || '—' }}</span>
|
|
<span class="dri-status" [ngClass]="statusClass(entry.status)">
|
|
{{ entry.status }}{{ entry.voucherCancelled ? ' · VOUCHER CANCELLED' : '' }}
|
|
</span>
|
|
</div>
|
|
<div class="dri-card-header__meta">
|
|
<span class="dri-meta-item">
|
|
<mat-icon>person</mat-icon>
|
|
{{ entry.makerName || entry.maker }} ({{ entry.maker }})
|
|
</span>
|
|
<span class="dri-meta-item">
|
|
<mat-icon>schedule</mat-icon>
|
|
{{ formatDateTime(entry.madeOn) }}
|
|
</span>
|
|
@if (entry.status !== 'PENDING' && entry.checker) {
|
|
<span class="dri-meta-item">
|
|
<mat-icon>check_circle</mat-icon>
|
|
Actioned by: {{ entry.checkerName || entry.checker }}
|
|
</span>
|
|
}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Summary -->
|
|
<div class="dri-card">
|
|
<div class="dri-section-title">
|
|
<mat-icon>swap_horiz</mat-icon>
|
|
{{ entry.type }} Summary
|
|
</div>
|
|
<div class="dri-detail-grid">
|
|
<div class="dri-detail-item">
|
|
<span class="dri-detail-label">Total Amount</span>
|
|
<span class="dri-detail-value dri-amount">
|
|
{{ entry.amount !== null && entry.amount !== undefined ? '₹' + (entry.amount | number: '1.2-2') : '—' }}
|
|
</span>
|
|
</div>
|
|
<div class="dri-detail-item">
|
|
<span class="dri-detail-label">DR Accounts</span>
|
|
<span class="dri-detail-value"
|
|
>{{ debitLines.length }} account{{ debitLines.length !== 1 ? 's' : '' }}</span
|
|
>
|
|
</div>
|
|
<div class="dri-detail-item">
|
|
<span class="dri-detail-label">CR Accounts</span>
|
|
<span class="dri-detail-value"
|
|
>{{ creditLines.length }} account{{ creditLines.length !== 1 ? 's' : '' }}</span
|
|
>
|
|
</div>
|
|
<div class="dri-detail-item dri-detail-item--full">
|
|
<span class="dri-detail-label">Details</span>
|
|
<span class="dri-detail-value">{{ entry.details || '—' }}</span>
|
|
</div>
|
|
@if (detail?.description) {
|
|
<div class="dri-detail-item dri-detail-item--full">
|
|
<span class="dri-detail-label">Description</span>
|
|
<span class="dri-detail-value">{{ detail.description }}</span>
|
|
</div>
|
|
}
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Debit entries -->
|
|
@if (debitLines.length) {
|
|
<div class="dri-card">
|
|
<div class="dri-section-title">
|
|
<mat-icon>arrow_upward</mat-icon>
|
|
Debit Entries ({{ debitLines.length }} account{{ debitLines.length !== 1 ? 's' : '' }} — funds out)
|
|
</div>
|
|
<table class="dri-cr-table">
|
|
<thead>
|
|
<tr>
|
|
<th>#</th>
|
|
<th>Account No</th>
|
|
<th>Account Name</th>
|
|
<th>Type</th>
|
|
<th class="num">Amount (DR)</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
@for (line of debitLines; track $index; let i = $index) {
|
|
<tr>
|
|
<td class="dri-cr-idx">{{ i + 1 }}</td>
|
|
<td class="cell-mono">{{ line.accountNo || '—' }}</td>
|
|
<td>{{ line.accountName || '—' }}</td>
|
|
<td>
|
|
<span class="dri-type-badge">{{ line.type || '—' }}</span>
|
|
</td>
|
|
<td class="num dri-cr-amount">₹{{ line.amount | number: '1.2-2' }}</td>
|
|
</tr>
|
|
}
|
|
<tr class="dri-cr-total-row">
|
|
<td colspan="4" class="dri-cr-total-label">Total Debit</td>
|
|
<td class="num dri-cr-total-amount">₹{{ total(debitLines) | number: '1.2-2' }}</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
}
|
|
|
|
<!-- Credit entries -->
|
|
@if (creditLines.length) {
|
|
<div class="dri-card">
|
|
<div class="dri-section-title">
|
|
<mat-icon>arrow_downward</mat-icon>
|
|
Credit Entries ({{ creditLines.length }} account{{ creditLines.length !== 1 ? 's' : '' }} — funds in)
|
|
</div>
|
|
<table class="dri-cr-table">
|
|
<thead>
|
|
<tr>
|
|
<th>#</th>
|
|
<th>Account No</th>
|
|
<th>Account Name</th>
|
|
<th>Type</th>
|
|
<th class="num">Amount (CR)</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
@for (line of creditLines; track $index; let i = $index) {
|
|
<tr>
|
|
<td class="dri-cr-idx">{{ i + 1 }}</td>
|
|
<td class="cell-mono">{{ line.accountNo || '—' }}</td>
|
|
<td>{{ line.accountName || '—' }}</td>
|
|
<td>
|
|
<span class="dri-type-badge">{{ line.type || '—' }}</span>
|
|
</td>
|
|
<td class="num dri-cr-amount">₹{{ line.amount | number: '1.2-2' }}</td>
|
|
</tr>
|
|
}
|
|
<tr class="dri-cr-total-row">
|
|
<td colspan="4" class="dri-cr-total-label">Total Credit</td>
|
|
<td class="num dri-cr-total-amount">₹{{ total(creditLines) | number: '1.2-2' }}</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
}
|
|
|
|
@if (entry.status === 'PENDING' && isMine && !done) {
|
|
<div class="dri-card dri-card--processing">
|
|
<div class="dri-section-title">
|
|
<mat-icon>info</mat-icon>
|
|
Your own entry
|
|
</div>
|
|
<p class="dri-processing-text">
|
|
You made this entry, so another user with checker rights has to approve or reject it.
|
|
</p>
|
|
</div>
|
|
}
|
|
|
|
@if (entry.status === 'REJECTED') {
|
|
<div class="dri-card dri-card--rejected">
|
|
<div class="dri-section-title">
|
|
<mat-icon>cancel</mat-icon>
|
|
Rejected
|
|
</div>
|
|
<p class="dri-rejection-text">
|
|
Nothing was done{{ voucherNo ? '. Voucher ' + voucherNo + ' is cancelled and will not be used' : '' }}.
|
|
</p>
|
|
@if (entry.checker) {
|
|
<div class="dri-meta-item" style="margin-top: 8px">
|
|
<mat-icon>manage_accounts</mat-icon>
|
|
{{ entry.checker }}
|
|
</div>
|
|
}
|
|
</div>
|
|
}
|
|
|
|
@if (entry.status === 'APPROVED') {
|
|
<div class="dri-card dri-card--approved">
|
|
<div class="dri-section-title">
|
|
<mat-icon>check_circle</mat-icon>
|
|
Approved and carried out
|
|
</div>
|
|
<p class="dri-txn-refs cell-mono">
|
|
{{
|
|
voucherNo
|
|
? 'Voucher ' + voucherNo
|
|
: entry.entity === 'DDSBATCH'
|
|
? 'Posting is running - refresh for its voucher'
|
|
: '—'
|
|
}}
|
|
</p>
|
|
<div class="dri-meta-item" style="margin-top: 8px">
|
|
<mat-icon>manage_accounts</mat-icon>
|
|
Approved by: {{ entry.checker || '—' }}
|
|
</div>
|
|
</div>
|
|
}
|
|
|
|
@if (error) {
|
|
<div class="dri-card dri-card--failed">
|
|
<div class="dri-section-title">
|
|
<mat-icon>error</mat-icon>
|
|
Could not complete
|
|
</div>
|
|
<p class="dri-rejection-text">{{ error }}</p>
|
|
</div>
|
|
}
|
|
|
|
@if (entry.status === 'PENDING' && !done) {
|
|
<div class="dri-actions">
|
|
@if (!confirmReject) {
|
|
<button type="button" class="dri-btn dri-btn--approve" [disabled]="!canAct" (click)="act('approve')">
|
|
<mat-icon>check_circle</mat-icon>
|
|
{{ working ? 'Processing…' : 'Approve ' + entry.type }}
|
|
</button>
|
|
<button type="button" class="dri-btn dri-btn--reject" [disabled]="!canAct" (click)="confirmReject = true">
|
|
<mat-icon>cancel</mat-icon>
|
|
Reject
|
|
</button>
|
|
} @else {
|
|
<div class="dri-reject-form">
|
|
<label class="dri-reject-label">
|
|
Reject this entry? Nothing will be done{{
|
|
voucherNo ? ' and voucher ' + voucherNo + ' will be cancelled' : ''
|
|
}}.
|
|
</label>
|
|
<div class="dri-reject-actions">
|
|
<button type="button" class="dri-btn dri-btn--reject" [disabled]="!canAct" (click)="act('reject')">
|
|
<mat-icon>cancel</mat-icon>
|
|
{{ working ? 'Processing…' : 'Confirm Rejection' }}
|
|
</button>
|
|
<button
|
|
type="button"
|
|
class="dri-btn dri-btn--ghost"
|
|
[disabled]="working"
|
|
(click)="confirmReject = false"
|
|
>
|
|
Cancel
|
|
</button>
|
|
</div>
|
|
</div>
|
|
}
|
|
</div>
|
|
}
|
|
</div>
|
|
}
|
|
</div>
|