feat: reconcile application vertical slices

Backfill the completed acquisitions, sales, dashboard, pricing, search, public detail, worker, migration, contracts, validation, tests, and implementation-status changes into one verified application slice.
This commit is contained in:
2026-09-09 22:12:53 -04:00
parent b9ff7445a6
commit b8f089a5d9
78 changed files with 4561 additions and 2057 deletions
+21 -15
View File
@@ -1,16 +1,22 @@
import { z } from 'zod';
import { z } from "zod";
export const createAcquisitionSchema = z.object({
inventoryItemId: z.uuid(),
method: z.string().trim().min(1).max(100),
costMinor: z.int().nonnegative(),
currency: z.string().trim().regex(/^[A-Za-z]{3}$/).optional(),
date: z.string().trim().max(10).optional(),
source: z.string().trim().max(255).optional(),
location: z.string().trim().max(255).optional(),
shippingMinor: z.int().nonnegative().optional(),
taxMinor: z.int().nonnegative().optional(),
otherFeesMinor: z.int().nonnegative().optional(),
estimatedTradeValueMinor: z.int().nonnegative().optional(),
notes: z.string().trim().max(10000).optional(),
}).strict();
export const createAcquisitionSchema = z
.object({
inventoryItemId: z.uuid(),
method: z.string().trim().min(1).max(100),
costMinor: z.int().nonnegative(),
currency: z
.string()
.trim()
.regex(/^[A-Za-z]{3}$/)
.optional(),
date: z.string().trim().max(10).optional(),
source: z.string().trim().max(255).optional(),
location: z.string().trim().max(255).optional(),
shippingMinor: z.int().nonnegative().optional(),
taxMinor: z.int().nonnegative().optional(),
otherFeesMinor: z.int().nonnegative().optional(),
estimatedTradeValueMinor: z.int().nonnegative().optional(),
notes: z.string().trim().max(10000).optional(),
})
.strict();
+3 -3
View File
@@ -9,11 +9,11 @@
"./image": "./image.js",
"./listing": "./listing.js",
"./sale": "./sale.js",
"./product": "./product.js"
,"./pricing": "./pricing.js",
"./product": "./product.js",
"./pricing": "./pricing.js",
"./provider-mapping": "./provider-mapping.js"
},
"dependencies": {
"zod": "^4.1.8"
}
}
}
+29 -17
View File
@@ -1,19 +1,31 @@
import { z } from 'zod';
import { z } from "zod";
export const createPricingObservationSchema = z.object({
productId: z.uuid(),
inventoryItemId: z.uuid(),
providerId: z.string().trim().min(1).max(100),
priceMinor: z.int().positive(),
currency: z.string().trim().regex(/^[A-Za-z]{3}$/).optional(),
sourceIdentifier: z.string().trim().min(1).max(255),
conditionId: z.uuid(),
sourceUrl: z.string().trim().url().optional(),
qualityScore: z.int().min(0).max(100).optional(),
}).strict();
export const createPricingObservationSchema = z
.object({
productId: z.uuid(),
inventoryItemId: z.uuid(),
providerId: z.string().trim().min(1).max(100),
priceMinor: z.int().positive(),
currency: z
.string()
.trim()
.regex(/^[A-Za-z]{3}$/)
.optional(),
sourceIdentifier: z.string().trim().min(1).max(255),
conditionId: z.uuid(),
sourceUrl: z.string().trim().url().optional(),
qualityScore: z.int().min(0).max(100).optional(),
})
.strict();
export const createMarketValueOverrideSchema = z.object({
valueMinor: z.int().nonnegative(),
currency: z.string().trim().regex(/^[A-Za-z]{3}$/).optional(),
reason: z.string().trim().min(3).max(1000),
}).strict();
export const createMarketValueOverrideSchema = z
.object({
valueMinor: z.int().nonnegative(),
currency: z
.string()
.trim()
.regex(/^[A-Za-z]{3}$/)
.optional(),
reason: z.string().trim().min(3).max(1000),
})
.strict();
+11 -9
View File
@@ -1,10 +1,12 @@
import { z } from 'zod';
import { z } from "zod";
export const createProviderMappingSchema = z.object({
providerId: z.string().trim().min(1).max(100),
mappingType: z.enum(['PRODUCT', 'SEARCH']),
externalIdentifier: z.string().trim().max(255).optional(),
searchQuery: z.string().trim().max(1000).optional(),
sourceUrl: z.string().trim().url().optional(),
metadata: z.record(z.string(), z.unknown()).optional(),
}).strict();
export const createProviderMappingSchema = z
.object({
providerId: z.string().trim().min(1).max(100),
mappingType: z.enum(["PRODUCT", "SEARCH"]),
externalIdentifier: z.string().trim().max(255).optional(),
searchQuery: z.string().trim().max(1000).optional(),
sourceUrl: z.string().trim().url().optional(),
metadata: z.record(z.string(), z.unknown()).optional(),
})
.strict();
+40 -34
View File
@@ -1,4 +1,4 @@
import { z } from 'zod';
import { z } from "zod";
const isoDate = /^\d{4}-\d{2}-\d{2}$/;
const currencyCode = /^[A-Za-z]{3}$/;
@@ -8,38 +8,44 @@ const saleItemSchema = z.object({
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 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 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();
export const voidSaleSchema = z
.object({
reason: z.string().trim().min(3).max(1000),
})
.strict();