feat: cash-only registers, day book sections and DD amendments
This commit is contained in:
@@ -126,66 +126,6 @@ export class CashierService {
|
||||
return this.http.get('/cashreports/day-book', { params });
|
||||
}
|
||||
|
||||
// ── Voucher physical verification & attachments ──
|
||||
// The voucher number always travels in the body or a query parameter, never as a path segment:
|
||||
// numbers are formatted CR/001/2108/0001 and Spring Security's strict firewall rejects the
|
||||
// encoded slashes with a 400 before the request reaches the resource.
|
||||
|
||||
/** Records the outcome of checking a voucher against the paper slip. */
|
||||
verifyVoucher(
|
||||
voucherNo: string,
|
||||
status: 'VERIFIED' | 'EXCEPTION',
|
||||
slipAmount?: number,
|
||||
remarks?: string
|
||||
): Observable<any> {
|
||||
return this.http.post('/vouchers/verify', {
|
||||
voucherNo,
|
||||
status,
|
||||
slipAmount: slipAmount != null ? String(slipAmount) : null,
|
||||
remarks: remarks ?? null,
|
||||
locale: 'en'
|
||||
});
|
||||
}
|
||||
|
||||
uploadVoucherAttachment(
|
||||
voucherNo: string,
|
||||
fileName: string,
|
||||
contentType: string,
|
||||
fileData: string,
|
||||
description?: string
|
||||
): Observable<any> {
|
||||
return this.http.post('/vouchers/attachments', {
|
||||
voucherNo,
|
||||
fileName,
|
||||
contentType,
|
||||
fileData,
|
||||
description: description ?? null
|
||||
});
|
||||
}
|
||||
|
||||
listVoucherAttachments(voucherNo: string): Observable<any> {
|
||||
const params = new HttpParams().set('voucherNo', voucherNo);
|
||||
return this.http.get('/vouchers/attachments', { params });
|
||||
}
|
||||
|
||||
deleteVoucherAttachment(id: number): Observable<any> {
|
||||
return this.http.delete(`/vouchers/attachments/${id}`);
|
||||
}
|
||||
|
||||
/** Fetched as a blob through HttpClient so the interceptor's auth header travels with it. */
|
||||
downloadVoucherAttachment(id: number): Observable<Blob> {
|
||||
return this.http.get(`/vouchers/attachments/${id}/download`, { responseType: 'blob' });
|
||||
}
|
||||
|
||||
/**
|
||||
* Flagged vouchers awaiting (or carrying) a conclusion. Not scoped to a date — an exception
|
||||
* raised on Friday still needs answering on Monday.
|
||||
*/
|
||||
voucherExceptions(status: 'OPEN' | 'RESOLVED' | 'ALL' = 'OPEN'): Observable<any> {
|
||||
const params = new HttpParams().set('status', status);
|
||||
return this.http.get('/vouchers/exceptions', { params });
|
||||
}
|
||||
|
||||
/**
|
||||
* The vouchers raised over a period, one row each, with what was debited and what credited.
|
||||
*
|
||||
@@ -193,7 +133,13 @@ export class CashierService {
|
||||
* own work whatever they ask for — so `username` is a filter for those allowed to use it, not a
|
||||
* way to choose whose report this is.
|
||||
*/
|
||||
voucherReport(from: string, to: string, username?: string, voucherType?: string): Observable<any> {
|
||||
voucherReport(
|
||||
from: string,
|
||||
to: string,
|
||||
username?: string,
|
||||
voucherType?: string,
|
||||
cashOnly?: boolean
|
||||
): Observable<any> {
|
||||
let params = new HttpParams().set('from', from).set('to', to);
|
||||
if (username) {
|
||||
params = params.set('username', username);
|
||||
@@ -201,25 +147,14 @@ export class CashierService {
|
||||
if (voucherType) {
|
||||
params = params.set('voucherType', voucherType);
|
||||
}
|
||||
// Only sent when asked for: the server treats a missing flag as the full register, so the
|
||||
// cashier screens opt in to cash and the back-office ones keep seeing everything.
|
||||
if (cashOnly) {
|
||||
params = params.set('cashOnly', 'true');
|
||||
}
|
||||
return this.http.get('/vouchers/report', { params });
|
||||
}
|
||||
|
||||
/**
|
||||
* One voucher and the debit and credit sides it is made of — what a printed voucher shows.
|
||||
*
|
||||
* The voucher number travels as a query parameter, not a path segment: numbers are formatted
|
||||
* CR/2708/0001 and the server rejects the encoded slashes in a path.
|
||||
*/
|
||||
voucherDetail(voucherNo: string): Observable<any> {
|
||||
const params = new HttpParams().set('voucherNo', voucherNo);
|
||||
return this.http.get('/vouchers/detail', { params });
|
||||
}
|
||||
|
||||
/** Closes an exception. Manager / head cashier only, and a supporting document must exist. */
|
||||
resolveVoucherException(voucherNo: string, resolutionStatus: string, resolutionNotes: string): Observable<any> {
|
||||
return this.http.post('/vouchers/exceptions/resolve', { voucherNo, resolutionStatus, resolutionNotes });
|
||||
}
|
||||
|
||||
/**
|
||||
* Account register for one date: what opened and closed that day, each account's balance as it
|
||||
* stood then, and what it holds now.
|
||||
|
||||
Reference in New Issue
Block a user