refactor: route/schema consistency (parseId, broad invalidation, Czech messages, Zod 4 strictObject)

- OfferDetail: invalidate broad ["offers"] not ["offers","list"] (CLAUDE.md convention)
- trips.ts/sessions.ts: use parseId helper (validated 400) instead of raw parseInt for route ids
- audit-log.ts: z.object().strict() -> z.strictObject() (Zod 4 idiom)
- attendance.ts, orders/offers schemas: English user-facing strings -> Czech
- project-files.ts: unify 'not found' phrasing to the codebase-dominant 'nenalezen' form

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
BOHA
2026-06-06 02:29:04 +02:00
parent 522afefc80
commit 9ae49c0d6a
8 changed files with 43 additions and 45 deletions

View File

@@ -6,14 +6,14 @@ const QuotationItemSchema = z.object({
quantity: z
.union([z.number(), z.string()])
.transform((v) => Number(v))
.refine((v) => !Number.isNaN(v), { message: "Must be a valid number" })
.refine((v) => !Number.isNaN(v), { message: "Musí být platné číslo" })
.optional()
.default(1),
unit: z.string().nullish(),
unit_price: z
.union([z.number(), z.string()])
.transform((v) => Number(v))
.refine((v) => !Number.isNaN(v), { message: "Must be a valid number" })
.refine((v) => !Number.isNaN(v), { message: "Musí být platné číslo" })
.optional()
.default(0),
is_included_in_total: z
@@ -23,7 +23,7 @@ const QuotationItemSchema = z.object({
position: z
.union([z.number(), z.string()])
.transform((v) => Number(v))
.refine((v) => !Number.isNaN(v), { message: "Must be a valid number" })
.refine((v) => !Number.isNaN(v), { message: "Musí být platné číslo" })
.optional(),
});
@@ -34,7 +34,7 @@ const ScopeSectionSchema = z.object({
position: z
.union([z.number(), z.string()])
.transform((v) => Number(v))
.refine((v) => !Number.isNaN(v), { message: "Must be a valid number" })
.refine((v) => !Number.isNaN(v), { message: "Musí být platné číslo" })
.optional(),
});
@@ -53,7 +53,7 @@ export const CreateQuotationSchema = z.object({
vat_rate: z
.union([z.number(), z.string()])
.transform((v) => Number(v))
.refine((v) => !Number.isNaN(v), { message: "Must be a valid number" })
.refine((v) => !Number.isNaN(v), { message: "Musí být platné číslo" })
.optional()
.default(21.0),
apply_vat: z
@@ -75,7 +75,7 @@ export const UpdateQuotationSchema = z.object({
customer_id: z
.union([z.number(), z.string()])
.transform((v) => Number(v))
.refine((v) => !Number.isNaN(v), { message: "Must be a valid number" })
.refine((v) => !Number.isNaN(v), { message: "Musí být platné číslo" })
.optional(),
created_at: z.union([z.string(), z.null()]).optional(),
valid_until: z.union([z.string(), z.null()]).optional(),
@@ -84,7 +84,7 @@ export const UpdateQuotationSchema = z.object({
vat_rate: z
.union([z.number(), z.string()])
.transform((v) => Number(v))
.refine((v) => !Number.isNaN(v), { message: "Must be a valid number" })
.refine((v) => !Number.isNaN(v), { message: "Musí být platné číslo" })
.optional(),
apply_vat: z
.preprocess((v) => v === true || v === 1 || v === "1", z.boolean())

View File

@@ -6,14 +6,14 @@ const OrderItemSchema = z.object({
quantity: z
.union([z.number(), z.string()])
.transform((v) => Number(v))
.refine((v) => !Number.isNaN(v), { message: "Must be a valid number" })
.refine((v) => !Number.isNaN(v), { message: "Musí být platné číslo" })
.optional()
.default(1),
unit: z.string().nullish(),
unit_price: z
.union([z.number(), z.string()])
.transform((v) => Number(v))
.refine((v) => !Number.isNaN(v), { message: "Must be a valid number" })
.refine((v) => !Number.isNaN(v), { message: "Musí být platné číslo" })
.optional()
.default(0),
is_included_in_total: z
@@ -23,7 +23,7 @@ const OrderItemSchema = z.object({
position: z
.union([z.number(), z.string()])
.transform((v) => Number(v))
.refine((v) => !Number.isNaN(v), { message: "Must be a valid number" })
.refine((v) => !Number.isNaN(v), { message: "Musí být platné číslo" })
.optional(),
});
@@ -34,7 +34,7 @@ const OrderSectionSchema = z.object({
position: z
.union([z.number(), z.string()])
.transform((v) => Number(v))
.refine((v) => !Number.isNaN(v), { message: "Must be a valid number" })
.refine((v) => !Number.isNaN(v), { message: "Musí být platné číslo" })
.optional(),
});
@@ -42,7 +42,7 @@ export const CreateOrderFromQuotationSchema = z.object({
quotationId: z
.union([z.number(), z.string()])
.transform((v) => Number(v))
.refine((v) => !Number.isNaN(v), { message: "Must be a valid number" }),
.refine((v) => !Number.isNaN(v), { message: "Musí být platné číslo" }),
customerOrderNumber: z.string().optional().default(""),
});
@@ -68,7 +68,7 @@ export const CreateOrderSchema = z.object({
vat_rate: z
.union([z.number(), z.string()])
.transform((v) => Number(v))
.refine((v) => !Number.isNaN(v), { message: "Must be a valid number" })
.refine((v) => !Number.isNaN(v), { message: "Musí být platné číslo" })
.optional()
.default(21.0),
apply_vat: z
@@ -78,7 +78,7 @@ export const CreateOrderSchema = z.object({
exchange_rate: z
.union([z.number(), z.string()])
.transform((v) => Number(v))
.refine((v) => !Number.isNaN(v), { message: "Must be a valid number" })
.refine((v) => !Number.isNaN(v), { message: "Musí být platné číslo" })
.optional()
.default(1.0),
scope_title: z.string().nullish(),
@@ -103,7 +103,7 @@ export const UpdateOrderSchema = z.object({
vat_rate: z
.union([z.number(), z.string()])
.transform((v) => Number(v))
.refine((v) => !Number.isNaN(v), { message: "Must be a valid number" })
.refine((v) => !Number.isNaN(v), { message: "Musí být platné číslo" })
.optional(),
apply_vat: z
.preprocess((v) => v === true || v === 1 || v === "1", z.boolean())