61 lines
2.0 KiB
TypeScript
61 lines
2.0 KiB
TypeScript
import { z } from "zod";
|
|
|
|
import type { Invoice, InvoiceItem, InvoiceList, InvoiceStatus } from "@customer-portal/contracts/billing";
|
|
|
|
const invoiceStatusValues: readonly InvoiceStatus[] = [
|
|
"Draft",
|
|
"Pending",
|
|
"Paid",
|
|
"Unpaid",
|
|
"Overdue",
|
|
"Cancelled",
|
|
"Refunded",
|
|
"Collections",
|
|
] as const;
|
|
|
|
export const invoiceStatusSchema = z.enum(invoiceStatusValues);
|
|
|
|
export const invoiceItemSchema = z.object({
|
|
id: z.number().int().positive("Invoice item id must be positive"),
|
|
description: z.string().min(1, "Description is required"),
|
|
amount: z.number(),
|
|
quantity: z.number().int().positive("Quantity must be positive").optional(),
|
|
type: z.string().min(1, "Item type is required"),
|
|
serviceId: z.number().int().positive().optional(),
|
|
}) satisfies z.ZodType<InvoiceItem>;
|
|
|
|
export const invoiceSchema = z.object({
|
|
id: z.number().int().positive("Invoice id must be positive"),
|
|
number: z.string().min(1, "Invoice number is required"),
|
|
status: invoiceStatusSchema,
|
|
currency: z.string().min(1, "Currency is required"),
|
|
currencySymbol: z.string().min(1, "Currency symbol is required").optional(),
|
|
total: z.number(),
|
|
subtotal: z.number(),
|
|
tax: z.number(),
|
|
issuedAt: z.string().optional(),
|
|
dueDate: z.string().optional(),
|
|
paidDate: z.string().optional(),
|
|
pdfUrl: z.string().optional(),
|
|
paymentUrl: z.string().optional(),
|
|
description: z.string().optional(),
|
|
items: z.array(invoiceItemSchema).optional(),
|
|
daysOverdue: z.number().int().nonnegative().optional(),
|
|
}) satisfies z.ZodType<Invoice>;
|
|
|
|
export const invoicePaginationSchema = z.object({
|
|
page: z.number().int().nonnegative(),
|
|
totalPages: z.number().int().nonnegative(),
|
|
totalItems: z.number().int().nonnegative(),
|
|
nextCursor: z.string().optional(),
|
|
});
|
|
|
|
export const invoiceListSchema = z.object({
|
|
invoices: z.array(invoiceSchema),
|
|
pagination: invoicePaginationSchema,
|
|
}) satisfies z.ZodType<InvoiceList>;
|
|
|
|
export type InvoiceSchema = typeof invoiceSchema;
|
|
export type InvoiceItemSchema = typeof invoiceItemSchema;
|
|
export type InvoiceListSchema = typeof invoiceListSchema;
|