Files
pokemon-inventory/packages/validation/sale.js
T
fragginwagon 8e5ce80196
Quality / test (push) Canceled after 0s
feat: complete inventory image and sales workflows
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.
2026-09-09 00:35:57 -04:00

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();