import { z } from "zod"; import { formatDate } from "@/lib/utils"; import { v4 as uuidv4 } from "uuid"; import { priorityType, taskStatus } from "@/server/task/domain/models"; import moment from "moment"; const baseTaskSchema = z.object({ projectId: z .string({ message: "Proyecto inválido" }) .uuid({ message: "Selecciona un proyecto" }), floorName: z .string({ message: "Piso inválido" }) .min(1, { message: "Selecciona un piso" }), areaName: z .string({ message: "Área inválida" }) .min(1, { message: "Selecciona un área" }), projectName: z .string({ message: "Proyecto inválido" }) .min(1, { message: "Selecciona un proyecto" }), userId: z .string({ message: "Selecciona un usuario " }) .min(1, { message: "Usuario invalido" }), areaId: z .string({ message: "Area no valida" }) .uuid({ message: "Selecciona un area" }), priority: z.enum(priorityType, { message: "Selecciona una prioridad" }), startDate: z.string(), expireDate: z.string().optional(), comments: z.string(), }); const withCustomRefinements = (schema: z.ZodType) => schema .refine( (data) => { if (data.comments && data.comments.length > 0) { return data.comments.length >= 5 && data.comments.length <= 120; } return true; // Si está vacío o no está presente, no aplicar validación }, { message: "El mensaje debe contener entre 5 y 120 caracteres si está presente", path: ["comments"], } ) .refine( (data) => { if (data.expireDate) { return formatDate(data.expireDate) >= formatDate(data.startDate!); } return true; }, { message: "La fecha de expiración debe ser igual o posterior a la fecha de inicio", path: ["expireDate"], } ) export const createTaskSchema = withCustomRefinements( baseTaskSchema.extend({ id: z .string() .uuid() .default(() => uuidv4()), }) ); export const updateTaskSchema = withCustomRefinements( baseTaskSchema .extend({ id: z.string().uuid({ message: "Tarea inválida" }), areaId: z.string().uuid(), status: z.enum(taskStatus).optional(), }) .partial() );