Quality / test (push) Canceled after 0s
Commit the working vertical slices for inventory image processing and the Sale workflow, including Sale history, audited voiding, multi-item persistence, admin UI, migrations, documentation, and tests.
45 lines
1.8 KiB
JavaScript
45 lines
1.8 KiB
JavaScript
import { z } from 'zod';
|
|
|
|
const isoDate = /^\d{4}-\d{2}-\d{2}$/;
|
|
const currencyCode = /^[A-Za-z]{3}$/;
|
|
const saleItemSchema = z.object({
|
|
inventoryItemId: z.uuid(),
|
|
soldPriceMinor: z.int().positive(),
|
|
costBasisMinor: z.int().nonnegative(),
|
|
});
|
|
|
|
export const createSaleSchema = z.object({
|
|
inventoryItemId: z.uuid(),
|
|
costBasisMinor: z.int().nonnegative(),
|
|
saleDate: z.string().trim().regex(isoDate),
|
|
saleLocation: z.string().trim().max(255).optional(),
|
|
soldPriceMinor: z.int().positive(),
|
|
currency: z.string().trim().regex(currencyCode).optional(),
|
|
platformFeesMinor: z.int().nonnegative().optional(),
|
|
paymentProcessingFeesMinor: z.int().nonnegative().optional(),
|
|
shippingCostMinor: z.int().nonnegative().optional(),
|
|
taxesMinor: z.int().nonnegative().optional(),
|
|
otherFeesMinor: z.int().nonnegative().optional(),
|
|
buyerName: z.string().trim().max(255).optional(),
|
|
buyerContact: z.string().trim().max(255).optional(),
|
|
notes: z.string().trim().max(10000).optional(),
|
|
}).strict();
|
|
|
|
export const createMultiItemSaleSchema = z.object({
|
|
items: z.array(saleItemSchema).min(2),
|
|
saleDate: z.string().trim().regex(isoDate),
|
|
saleLocation: z.string().trim().max(255).optional(),
|
|
currency: z.string().trim().regex(currencyCode).optional(),
|
|
platformFeesMinor: z.int().nonnegative().optional(),
|
|
paymentProcessingFeesMinor: z.int().nonnegative().optional(),
|
|
shippingCostMinor: z.int().nonnegative().optional(),
|
|
taxesMinor: z.int().nonnegative().optional(),
|
|
otherFeesMinor: z.int().nonnegative().optional(),
|
|
buyerName: z.string().trim().max(255).optional(),
|
|
buyerContact: z.string().trim().max(255).optional(),
|
|
notes: z.string().trim().max(10000).optional(),
|
|
}).strict();
|
|
|
|
export const voidSaleSchema = z.object({
|
|
reason: z.string().trim().min(3).max(1000),
|
|
}).strict(); |