Files
CapaKraken/packages/shared/src/schemas/rate-card.schema.ts
T

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