feat(cashier): GL Entries view in Closing Cash Report
- New 'GL View' toggle button in header — switches between denomination report and GL entries table - GL table: Voucher No, A/C No, A/C Name (customer), DR (red), CR (green) - Filters: Teller Head dropdown → Cashier dropdown (cascading) - Load button resets to denomination view (showGl = false) - Header shows Total DR / Total CR summary - DR rows: light red bg; CR rows: light green bg Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
1aa46397a6
commit
3be2f96210
@@ -428,3 +428,190 @@
|
|||||||
border: 1px solid #bfdbfe;
|
border: 1px solid #bfdbfe;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GL View toggle button active state
|
||||||
|
.pg-btn--active {
|
||||||
|
background: #1e3a5f;
|
||||||
|
color: #fff;
|
||||||
|
border-color: #1e3a5f;
|
||||||
|
}
|
||||||
|
|
||||||
|
// GL Card
|
||||||
|
.gl-card {
|
||||||
|
background: #fff;
|
||||||
|
border: 1px solid #e2e8f0;
|
||||||
|
border-radius: 12px;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
&__header {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
padding: 16px 20px;
|
||||||
|
background: #f8fafc;
|
||||||
|
border-bottom: 1px solid #e2e8f0;
|
||||||
|
gap: 16px;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
&__header-left {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&__icon {
|
||||||
|
width: 40px;
|
||||||
|
height: 40px;
|
||||||
|
border-radius: 10px;
|
||||||
|
background: #1e3a5f;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
|
||||||
|
mat-icon {
|
||||||
|
color: #fff;
|
||||||
|
font-size: 20px;
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&__title {
|
||||||
|
font-size: 15px;
|
||||||
|
font-weight: 700;
|
||||||
|
color: #1e293b;
|
||||||
|
}
|
||||||
|
|
||||||
|
&__sub {
|
||||||
|
font-size: 12px;
|
||||||
|
color: #64748b;
|
||||||
|
margin-top: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&__totals {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&__total-sep {
|
||||||
|
color: #cbd5e1;
|
||||||
|
font-size: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&__total {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: flex-end;
|
||||||
|
}
|
||||||
|
|
||||||
|
&__total-label {
|
||||||
|
font-size: 10px;
|
||||||
|
font-weight: 700;
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 0.06em;
|
||||||
|
color: #94a3b8;
|
||||||
|
}
|
||||||
|
|
||||||
|
&__total-value {
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: 800;
|
||||||
|
font-variant-numeric: tabular-nums;
|
||||||
|
}
|
||||||
|
|
||||||
|
&__total--dr .gl-card__total-value {
|
||||||
|
color: #dc2626;
|
||||||
|
}
|
||||||
|
|
||||||
|
&__total--cr .gl-card__total-value {
|
||||||
|
color: #15803d;
|
||||||
|
}
|
||||||
|
|
||||||
|
&__filters {
|
||||||
|
display: flex;
|
||||||
|
align-items: flex-end;
|
||||||
|
gap: 12px;
|
||||||
|
padding: 14px 20px;
|
||||||
|
border-bottom: 1px solid #f1f5f9;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
background: #fff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// GL Table
|
||||||
|
.gl-table {
|
||||||
|
.gl-th--voucher {
|
||||||
|
width: 110px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gl-th--dr {
|
||||||
|
color: #dc2626 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gl-th--cr {
|
||||||
|
color: #15803d !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gl-voucher {
|
||||||
|
font-family: 'Roboto Mono', 'Courier New', monospace;
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: 700;
|
||||||
|
color: #475569;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gl-acno {
|
||||||
|
font-family: 'Roboto Mono', 'Courier New', monospace;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #1d4ed8;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gl-acname {
|
||||||
|
font-weight: 500;
|
||||||
|
color: #1e293b;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gl-amt--dr {
|
||||||
|
color: #dc2626;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gl-amt--cr {
|
||||||
|
color: #15803d;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gl-row--dr td {
|
||||||
|
background: #fff5f5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gl-row--cr td {
|
||||||
|
background: #f0fdf4;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gl-row--dr:hover td {
|
||||||
|
background: #fee2e2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gl-row--cr:hover td {
|
||||||
|
background: #dcfce7;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gl-foot {
|
||||||
|
background: #f1f5f9;
|
||||||
|
border-top: 2px solid #e2e8f0;
|
||||||
|
|
||||||
|
&__label {
|
||||||
|
font-size: 13px;
|
||||||
|
font-weight: 800;
|
||||||
|
color: #1e293b;
|
||||||
|
padding: 12px 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&__val {
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 800;
|
||||||
|
padding: 12px 14px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -129,6 +129,13 @@ export class CashierService {
|
|||||||
return this.http.get('/cashreports/cashier-day-status');
|
return this.http.get('/cashreports/cashier-day-status');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getGlEntries(date: string, cashierId?: number, tellerId?: number): Observable<any> {
|
||||||
|
let params = new HttpParams().set('date', date);
|
||||||
|
if (cashierId) params = params.set('cashierId', String(cashierId));
|
||||||
|
if (tellerId) params = params.set('tellerId', String(tellerId));
|
||||||
|
return this.http.get('/cashreports/gl-entries', { params });
|
||||||
|
}
|
||||||
|
|
||||||
checkSettlement(cashierId: number, date: string): Observable<any> {
|
checkSettlement(cashierId: number, date: string): Observable<any> {
|
||||||
const params = new HttpParams().set('cashierId', String(cashierId)).set('date', date);
|
const params = new HttpParams().set('cashierId', String(cashierId)).set('date', date);
|
||||||
return this.http.get('/cashsettlement/check', { params });
|
return this.http.get('/cashsettlement/check', { params });
|
||||||
|
|||||||
@@ -21,10 +21,13 @@
|
|||||||
<button type="button" class="pg-btn pg-btn--primary" (click)="load()" [disabled]="loading">
|
<button type="button" class="pg-btn pg-btn--primary" (click)="load()" [disabled]="loading">
|
||||||
<mat-icon>search</mat-icon> Load
|
<mat-icon>search</mat-icon> Load
|
||||||
</button>
|
</button>
|
||||||
|
<button type="button" class="pg-btn" [class.pg-btn--active]="showGl" (click)="toggleGl()">
|
||||||
|
<mat-icon>account_balance</mat-icon> GL View
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
@if (rows.length > 0) {
|
@if (!showGl && rows.length > 0) {
|
||||||
<!-- Summary totals bar -->
|
<!-- Summary totals bar -->
|
||||||
<div class="closing-summary">
|
<div class="closing-summary">
|
||||||
<div class="closing-summary__item closing-summary__item--in">
|
<div class="closing-summary__item closing-summary__item--in">
|
||||||
@@ -48,98 +51,205 @@
|
|||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|
||||||
<div class="pg-card">
|
@if (!showGl) {
|
||||||
@if (noteRows.length > 0) {
|
<div class="pg-card">
|
||||||
<div class="pos-section-label">Notes</div>
|
@if (noteRows.length > 0) {
|
||||||
<table class="pg-table">
|
<div class="pos-section-label">Notes</div>
|
||||||
<thead>
|
<table class="pg-table">
|
||||||
<tr>
|
<thead>
|
||||||
<th>Denomination</th>
|
|
||||||
<th class="num col-in">Deposit Pcs</th>
|
|
||||||
<th class="num col-in">Deposit Amt</th>
|
|
||||||
<th class="num col-out">Withdrawal Pcs</th>
|
|
||||||
<th class="num col-out">Withdrawal Amt</th>
|
|
||||||
<th class="num col-net">Net Pcs</th>
|
|
||||||
<th class="num col-net">Net Amount</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
@for (r of noteRows; track r.denominationId) {
|
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<th>Denomination</th>
|
||||||
<span class="pg-chip">₹{{ r.denominationValue }}</span>
|
<th class="num col-in">Deposit Pcs</th>
|
||||||
</td>
|
<th class="num col-in">Deposit Amt</th>
|
||||||
<td class="num col-in">{{ r.depositCount }}</td>
|
<th class="num col-out">Withdrawal Pcs</th>
|
||||||
<td class="num col-in">₹{{ r.depositAmount | number: '1.2-2' }}</td>
|
<th class="num col-out">Withdrawal Amt</th>
|
||||||
<td class="num col-out">{{ r.withdrawalCount }}</td>
|
<th class="num col-net">Net Pcs</th>
|
||||||
<td class="num col-out">₹{{ r.withdrawalAmount | number: '1.2-2' }}</td>
|
<th class="num col-net">Net Amount</th>
|
||||||
<td
|
|
||||||
class="num col-net"
|
|
||||||
[style.color]="r.netCount > 0 ? '#16a34a' : r.netCount < 0 ? '#dc2626' : '#94a3b8'"
|
|
||||||
>
|
|
||||||
{{ r.netCount > 0 ? '+' : '' }}{{ r.netCount }}
|
|
||||||
</td>
|
|
||||||
<td
|
|
||||||
class="num col-net"
|
|
||||||
[style.color]="r.netCount > 0 ? '#16a34a' : r.netCount < 0 ? '#dc2626' : '#94a3b8'"
|
|
||||||
>
|
|
||||||
{{ r.netCount >= 0 ? '' : '−' }}₹{{ (r.netAmount < 0 ? -r.netAmount : r.netAmount) | number: '1.2-2' }}
|
|
||||||
</td>
|
|
||||||
</tr>
|
</tr>
|
||||||
}
|
</thead>
|
||||||
</tbody>
|
<tbody>
|
||||||
</table>
|
@for (r of noteRows; track r.denominationId) {
|
||||||
}
|
<tr>
|
||||||
|
<td>
|
||||||
|
<span class="pg-chip">₹{{ r.denominationValue }}</span>
|
||||||
|
</td>
|
||||||
|
<td class="num col-in">{{ r.depositCount }}</td>
|
||||||
|
<td class="num col-in">₹{{ r.depositAmount | number: '1.2-2' }}</td>
|
||||||
|
<td class="num col-out">{{ r.withdrawalCount }}</td>
|
||||||
|
<td class="num col-out">₹{{ r.withdrawalAmount | number: '1.2-2' }}</td>
|
||||||
|
<td
|
||||||
|
class="num col-net"
|
||||||
|
[style.color]="r.netCount > 0 ? '#16a34a' : r.netCount < 0 ? '#dc2626' : '#94a3b8'"
|
||||||
|
>
|
||||||
|
{{ r.netCount > 0 ? '+' : '' }}{{ r.netCount }}
|
||||||
|
</td>
|
||||||
|
<td
|
||||||
|
class="num col-net"
|
||||||
|
[style.color]="r.netCount > 0 ? '#16a34a' : r.netCount < 0 ? '#dc2626' : '#94a3b8'"
|
||||||
|
>
|
||||||
|
{{ r.netCount >= 0 ? '' : '−' }}₹{{
|
||||||
|
(r.netAmount < 0 ? -r.netAmount : r.netAmount) | number: '1.2-2'
|
||||||
|
}}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
}
|
||||||
|
|
||||||
@if (coinRows.length > 0) {
|
@if (coinRows.length > 0) {
|
||||||
<div class="pos-section-label pos-section-label--coin">Coins</div>
|
<div class="pos-section-label pos-section-label--coin">Coins</div>
|
||||||
<table class="pg-table">
|
<table class="pg-table">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
|
||||||
<th>Denomination</th>
|
|
||||||
<th class="num col-in">Deposit Pcs</th>
|
|
||||||
<th class="num col-in">Deposit Amt</th>
|
|
||||||
<th class="num col-out">Withdrawal Pcs</th>
|
|
||||||
<th class="num col-out">Withdrawal Amt</th>
|
|
||||||
<th class="num col-net">Net Pcs</th>
|
|
||||||
<th class="num col-net">Net Amount</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
@for (r of coinRows; track r.denominationId) {
|
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<th>Denomination</th>
|
||||||
<span class="pg-chip pg-chip--coin">₹{{ r.denominationValue }}</span>
|
<th class="num col-in">Deposit Pcs</th>
|
||||||
</td>
|
<th class="num col-in">Deposit Amt</th>
|
||||||
<td class="num col-in">{{ r.depositCount }}</td>
|
<th class="num col-out">Withdrawal Pcs</th>
|
||||||
<td class="num col-in">₹{{ r.depositAmount | number: '1.2-2' }}</td>
|
<th class="num col-out">Withdrawal Amt</th>
|
||||||
<td class="num col-out">{{ r.withdrawalCount }}</td>
|
<th class="num col-net">Net Pcs</th>
|
||||||
<td class="num col-out">₹{{ r.withdrawalAmount | number: '1.2-2' }}</td>
|
<th class="num col-net">Net Amount</th>
|
||||||
<td
|
|
||||||
class="num col-net"
|
|
||||||
[style.color]="r.netCount > 0 ? '#16a34a' : r.netCount < 0 ? '#dc2626' : '#94a3b8'"
|
|
||||||
>
|
|
||||||
{{ r.netCount > 0 ? '+' : '' }}{{ r.netCount }}
|
|
||||||
</td>
|
|
||||||
<td
|
|
||||||
class="num col-net"
|
|
||||||
[style.color]="r.netCount > 0 ? '#16a34a' : r.netCount < 0 ? '#dc2626' : '#94a3b8'"
|
|
||||||
>
|
|
||||||
{{ r.netCount >= 0 ? '' : '−' }}₹{{ (r.netAmount < 0 ? -r.netAmount : r.netAmount) | number: '1.2-2' }}
|
|
||||||
</td>
|
|
||||||
</tr>
|
</tr>
|
||||||
}
|
</thead>
|
||||||
</tbody>
|
<tbody>
|
||||||
</table>
|
@for (r of coinRows; track r.denominationId) {
|
||||||
}
|
<tr>
|
||||||
|
<td>
|
||||||
|
<span class="pg-chip pg-chip--coin">₹{{ r.denominationValue }}</span>
|
||||||
|
</td>
|
||||||
|
<td class="num col-in">{{ r.depositCount }}</td>
|
||||||
|
<td class="num col-in">₹{{ r.depositAmount | number: '1.2-2' }}</td>
|
||||||
|
<td class="num col-out">{{ r.withdrawalCount }}</td>
|
||||||
|
<td class="num col-out">₹{{ r.withdrawalAmount | number: '1.2-2' }}</td>
|
||||||
|
<td
|
||||||
|
class="num col-net"
|
||||||
|
[style.color]="r.netCount > 0 ? '#16a34a' : r.netCount < 0 ? '#dc2626' : '#94a3b8'"
|
||||||
|
>
|
||||||
|
{{ r.netCount > 0 ? '+' : '' }}{{ r.netCount }}
|
||||||
|
</td>
|
||||||
|
<td
|
||||||
|
class="num col-net"
|
||||||
|
[style.color]="r.netCount > 0 ? '#16a34a' : r.netCount < 0 ? '#dc2626' : '#94a3b8'"
|
||||||
|
>
|
||||||
|
{{ r.netCount >= 0 ? '' : '−' }}₹{{
|
||||||
|
(r.netAmount < 0 ? -r.netAmount : r.netAmount) | number: '1.2-2'
|
||||||
|
}}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
}
|
||||||
|
|
||||||
@if (loaded && rows.length === 0 && exchangeRows.length === 0) {
|
@if (loaded && rows.length === 0 && exchangeRows.length === 0) {
|
||||||
<div class="pg-empty">No cash denomination data for this date.</div>
|
<div class="pg-empty">No cash denomination data for this date.</div>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
}
|
||||||
|
<!-- end !showGl -->
|
||||||
|
|
||||||
<!-- Cash Exchange section — separate from deposits/withdrawals (net monetary = ₹0) -->
|
<!-- GL View Panel -->
|
||||||
@if (exchangeRows.length > 0) {
|
@if (showGl) {
|
||||||
|
<div class="gl-card">
|
||||||
|
<!-- Card Header -->
|
||||||
|
<div class="gl-card__header">
|
||||||
|
<div class="gl-card__header-left">
|
||||||
|
<div class="gl-card__icon">
|
||||||
|
<mat-icon>account_balance</mat-icon>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<div class="gl-card__title">GL Entries</div>
|
||||||
|
<div class="gl-card__sub">Cashier transaction ledger for {{ date }}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="gl-card__totals">
|
||||||
|
<div class="gl-card__total gl-card__total--dr">
|
||||||
|
<span class="gl-card__total-label">Total DR</span>
|
||||||
|
<span class="gl-card__total-value">₹{{ glTotalDr | number: '1.2-2' }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="gl-card__total-sep">|</div>
|
||||||
|
<div class="gl-card__total gl-card__total--cr">
|
||||||
|
<span class="gl-card__total-label">Total CR</span>
|
||||||
|
<span class="gl-card__total-value">₹{{ glTotalCr | number: '1.2-2' }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Filters Bar -->
|
||||||
|
<div class="gl-card__filters">
|
||||||
|
<label class="pg-field">
|
||||||
|
<span>Teller Head</span>
|
||||||
|
<select class="pg-select" [(ngModel)]="selectedTellerId" (change)="onTellerChange()">
|
||||||
|
<option [ngValue]="null">All Tellers</option>
|
||||||
|
@for (t of tellers; track t.id) {
|
||||||
|
<option [ngValue]="t.id">{{ t.name }}</option>
|
||||||
|
}
|
||||||
|
</select>
|
||||||
|
</label>
|
||||||
|
@if (selectedTellerId) {
|
||||||
|
<label class="pg-field">
|
||||||
|
<span>Cashier</span>
|
||||||
|
<select class="pg-select" [(ngModel)]="selectedCashierId" (change)="onCashierChange()">
|
||||||
|
<option [ngValue]="null">All Cashiers</option>
|
||||||
|
@for (c of cashiers; track c.id) {
|
||||||
|
<option [ngValue]="c.id">{{ c.staffName }}</option>
|
||||||
|
}
|
||||||
|
</select>
|
||||||
|
</label>
|
||||||
|
}
|
||||||
|
<button type="button" class="pg-btn pg-btn--primary" (click)="loadGl()" [disabled]="glLoading">
|
||||||
|
<mat-icon>refresh</mat-icon> Refresh
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Table -->
|
||||||
|
@if (glLoading) {
|
||||||
|
<div class="pg-empty">Loading...</div>
|
||||||
|
} @else if (glRows.length === 0 && glLoaded) {
|
||||||
|
<div class="pg-empty">No entries found for this date and filter.</div>
|
||||||
|
} @else if (glRows.length > 0) {
|
||||||
|
<table class="pg-table gl-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="gl-th--voucher">Voucher No</th>
|
||||||
|
<th>A/C No</th>
|
||||||
|
<th>A/C Name</th>
|
||||||
|
<th class="num gl-th--dr">DR (₹)</th>
|
||||||
|
<th class="num gl-th--cr">CR (₹)</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@for (r of glRows; track $index) {
|
||||||
|
<tr [class.gl-row--dr]="r.dr > 0" [class.gl-row--cr]="r.cr > 0">
|
||||||
|
<td class="gl-voucher">{{ r.voucherNo }}</td>
|
||||||
|
<td class="gl-acno">{{ r.acNo }}</td>
|
||||||
|
<td class="gl-acname">{{ r.acName }}</td>
|
||||||
|
<td class="num gl-amt--dr">
|
||||||
|
@if (r.dr > 0) {
|
||||||
|
₹{{ r.dr | number: '1.2-2' }}
|
||||||
|
}
|
||||||
|
</td>
|
||||||
|
<td class="num gl-amt--cr">
|
||||||
|
@if (r.cr > 0) {
|
||||||
|
₹{{ r.cr | number: '1.2-2' }}
|
||||||
|
}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
}
|
||||||
|
</tbody>
|
||||||
|
<tfoot>
|
||||||
|
<tr class="gl-foot">
|
||||||
|
<td colspan="3" class="gl-foot__label">Total</td>
|
||||||
|
<td class="num gl-amt--dr gl-foot__val">₹{{ glTotalDr | number: '1.2-2' }}</td>
|
||||||
|
<td class="num gl-amt--cr gl-foot__val">₹{{ glTotalCr | number: '1.2-2' }}</td>
|
||||||
|
</tr>
|
||||||
|
</tfoot>
|
||||||
|
</table>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
@if (!showGl && exchangeRows.length > 0) {
|
||||||
<div class="pg-card">
|
<div class="pg-card">
|
||||||
<div class="closing-exchange-head">
|
<div class="closing-exchange-head">
|
||||||
<mat-icon>swap_horiz</mat-icon>
|
<mat-icon>swap_horiz</mat-icon>
|
||||||
|
|||||||
@@ -36,6 +36,20 @@ export class ClosingCashReportComponent implements OnInit {
|
|||||||
loading = false;
|
loading = false;
|
||||||
loaded = false;
|
loaded = false;
|
||||||
|
|
||||||
|
// GL View
|
||||||
|
showGl = false;
|
||||||
|
glRows: any[] = [];
|
||||||
|
glTotalDr = 0;
|
||||||
|
glTotalCr = 0;
|
||||||
|
glLoading = false;
|
||||||
|
glLoaded = false;
|
||||||
|
|
||||||
|
// Filters for GL
|
||||||
|
tellers: any[] = [];
|
||||||
|
cashiers: any[] = [];
|
||||||
|
selectedTellerId: number | null = null;
|
||||||
|
selectedCashierId: number | null = null;
|
||||||
|
|
||||||
get noteRows(): any[] {
|
get noteRows(): any[] {
|
||||||
return this.rows.filter((r) => r.kind !== 'coin');
|
return this.rows.filter((r) => r.kind !== 'coin');
|
||||||
}
|
}
|
||||||
@@ -53,9 +67,11 @@ export class ClosingCashReportComponent implements OnInit {
|
|||||||
const d = new Date();
|
const d = new Date();
|
||||||
this.date = `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;
|
this.date = `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;
|
||||||
this.load();
|
this.load();
|
||||||
|
this.service.getTellers().subscribe({ next: (t: any[]) => (this.tellers = t || []), error: () => {} });
|
||||||
}
|
}
|
||||||
|
|
||||||
load(): void {
|
load(): void {
|
||||||
|
this.showGl = false;
|
||||||
this.loading = true;
|
this.loading = true;
|
||||||
this.service.closingCashReport(this.date).subscribe({
|
this.service.closingCashReport(this.date).subscribe({
|
||||||
next: (res: any) => {
|
next: (res: any) => {
|
||||||
@@ -78,4 +94,51 @@ export class ClosingCashReportComponent implements OnInit {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
toggleGl(): void {
|
||||||
|
this.showGl = !this.showGl;
|
||||||
|
if (this.showGl && !this.glLoaded) {
|
||||||
|
this.loadGl();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onTellerChange(): void {
|
||||||
|
this.selectedCashierId = null;
|
||||||
|
this.cashiers = [];
|
||||||
|
if (this.selectedTellerId) {
|
||||||
|
this.service.getCashiersForTeller(this.selectedTellerId).subscribe({
|
||||||
|
next: (res: any) => (this.cashiers = res?.cashiers || res || []),
|
||||||
|
error: () => {}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
this.glLoaded = false;
|
||||||
|
this.loadGl();
|
||||||
|
}
|
||||||
|
|
||||||
|
onCashierChange(): void {
|
||||||
|
this.glLoaded = false;
|
||||||
|
this.loadGl();
|
||||||
|
}
|
||||||
|
|
||||||
|
loadGl(): void {
|
||||||
|
this.glLoading = true;
|
||||||
|
this.service
|
||||||
|
.getGlEntries(this.date, this.selectedCashierId || undefined, this.selectedTellerId || undefined)
|
||||||
|
.subscribe({
|
||||||
|
next: (res: any) => {
|
||||||
|
this.glRows = res?.rows || [];
|
||||||
|
this.glTotalDr = Number(res?.totalDr || 0);
|
||||||
|
this.glTotalCr = Number(res?.totalCr || 0);
|
||||||
|
this.glLoading = false;
|
||||||
|
this.glLoaded = true;
|
||||||
|
},
|
||||||
|
error: () => {
|
||||||
|
this.glRows = [];
|
||||||
|
this.glTotalDr = 0;
|
||||||
|
this.glTotalCr = 0;
|
||||||
|
this.glLoading = false;
|
||||||
|
this.glLoaded = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user