47 lines
2.0 KiB
TypeScript
47 lines
2.0 KiB
TypeScript
import { z } from "zod";
|
|
|
|
// ─── Rate Card Line ──────────────────────────────────────────────────────────
|
|
|
|
export const CreateRateCardLineSchema = z.object({
|
|
roleId: z.string().optional(),
|
|
chapter: z.string().max(200).optional(),
|
|
location: z.string().max(200).optional(),
|
|
seniority: z.string().max(100).optional(),
|
|
workType: z.string().max(100).optional(),
|
|
serviceGroup: z.string().max(100).optional(),
|
|
costRateCents: z.number().int().min(0),
|
|
billRateCents: z.number().int().min(0).optional(),
|
|
machineRateCents: z.number().int().min(0).optional(),
|
|
attributes: z.record(z.unknown()).default({}),
|
|
});
|
|
|
|
export const UpdateRateCardLineSchema = CreateRateCardLineSchema.partial();
|
|
|
|
export type CreateRateCardLineInput = z.infer<typeof CreateRateCardLineSchema>;
|
|
export type UpdateRateCardLineInput = z.infer<typeof UpdateRateCardLineSchema>;
|
|
|
|
// ─── Rate Card ───────────────────────────────────────────────────────────────
|
|
|
|
export const CreateRateCardSchema = z.object({
|
|
name: z.string().min(1).max(300),
|
|
currency: z.string().length(3).default("EUR"),
|
|
effectiveFrom: z.coerce.date().optional(),
|
|
effectiveTo: z.coerce.date().optional(),
|
|
source: z.string().max(200).optional(),
|
|
clientId: z.string().optional(),
|
|
lines: z.array(CreateRateCardLineSchema).default([]),
|
|
});
|
|
|
|
export const UpdateRateCardSchema = z.object({
|
|
name: z.string().min(1).max(300).optional(),
|
|
currency: z.string().length(3).optional(),
|
|
effectiveFrom: z.coerce.date().nullable().optional(),
|
|
effectiveTo: z.coerce.date().nullable().optional(),
|
|
source: z.string().max(200).nullable().optional(),
|
|
clientId: z.string().nullable().optional(),
|
|
isActive: z.boolean().optional(),
|
|
});
|
|
|
|
export type CreateRateCardInput = z.infer<typeof CreateRateCardSchema>;
|
|
export type UpdateRateCardInput = z.infer<typeof UpdateRateCardSchema>;
|