86 lines
2.2 KiB
TypeScript
86 lines
2.2 KiB
TypeScript
|
|
/**
|
||
|
|
* Billing Domain - Constants
|
||
|
|
*
|
||
|
|
* Domain constants for billing validation and business rules.
|
||
|
|
*/
|
||
|
|
|
||
|
|
// ============================================================================
|
||
|
|
// Invoice Validation Constants
|
||
|
|
// ============================================================================
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Pagination limits for invoice queries
|
||
|
|
*/
|
||
|
|
export const INVOICE_PAGINATION = {
|
||
|
|
MIN_LIMIT: 1,
|
||
|
|
MAX_LIMIT: 100,
|
||
|
|
DEFAULT_LIMIT: 10,
|
||
|
|
DEFAULT_PAGE: 1,
|
||
|
|
} as const;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Valid invoice statuses for filtering
|
||
|
|
* Matches the enum in schema.ts
|
||
|
|
*/
|
||
|
|
export const VALID_INVOICE_STATUSES = [
|
||
|
|
"Paid",
|
||
|
|
"Unpaid",
|
||
|
|
"Cancelled",
|
||
|
|
"Overdue",
|
||
|
|
"Collections",
|
||
|
|
] as const;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Invoice status for list filtering (subset of all statuses)
|
||
|
|
*/
|
||
|
|
export const VALID_INVOICE_LIST_STATUSES = [
|
||
|
|
"Paid",
|
||
|
|
"Unpaid",
|
||
|
|
"Cancelled",
|
||
|
|
"Overdue",
|
||
|
|
"Collections",
|
||
|
|
] as const;
|
||
|
|
|
||
|
|
// ============================================================================
|
||
|
|
// Validation Helpers
|
||
|
|
// ============================================================================
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Check if a status string is valid for invoices
|
||
|
|
*/
|
||
|
|
export function isValidInvoiceStatus(status: string): boolean {
|
||
|
|
return VALID_INVOICE_STATUSES.includes(status as any);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Check if pagination limit is within bounds
|
||
|
|
*/
|
||
|
|
export function isValidPaginationLimit(limit: number): boolean {
|
||
|
|
return limit >= INVOICE_PAGINATION.MIN_LIMIT && limit <= INVOICE_PAGINATION.MAX_LIMIT;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Sanitize pagination limit to be within bounds
|
||
|
|
*/
|
||
|
|
export function sanitizePaginationLimit(limit: number): number {
|
||
|
|
return Math.max(
|
||
|
|
INVOICE_PAGINATION.MIN_LIMIT,
|
||
|
|
Math.min(INVOICE_PAGINATION.MAX_LIMIT, Math.floor(limit))
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Sanitize pagination page to be >= 1
|
||
|
|
*/
|
||
|
|
export function sanitizePaginationPage(page: number): number {
|
||
|
|
return Math.max(INVOICE_PAGINATION.DEFAULT_PAGE, Math.floor(page));
|
||
|
|
}
|
||
|
|
|
||
|
|
// ============================================================================
|
||
|
|
// Type Exports
|
||
|
|
// ============================================================================
|
||
|
|
|
||
|
|
export type ValidInvoiceStatus = (typeof VALID_INVOICE_STATUSES)[number];
|
||
|
|
export type ValidInvoiceListStatus = (typeof VALID_INVOICE_LIST_STATUSES)[number];
|
||
|
|
|