import { z } from "zod"; import { PROJECT_STATUS } from "../../utils/constants"; //#region Service Project export const projectSchema = z.object({ name: z.string().trim().min(1, "Name is required"), shortName: z.string().trim().min(1, "Short name is required"), clientId: z.string().trim().min(1, { message: "Client is required" }), services: z .array(z.string()) .min(1, { message: "At least one service required" }), address: z.string().trim().min(1, "Address is required"), assignedDate: z.string().trim().min(1, { message: "Date is required" }), statusId: z.string().trim().min(1, "Status is required"), contactName: z .string() .trim() .min(1, "Contact name is required"), contactPhone: z .string() .trim() .regex(/^\d+$/, "Phone number must contain only digits") .min(7, "Invalid phone number") .max(15, "Phone number too long"), contactEmail: z.string().trim().email("Invalid email address"), }); export const defaultProjectValues = { name: "", shortName: "", clientId: "", services: [], address: "", assignedDate: "", statusId: PROJECT_STATUS.find((s) => s.label === "Active")?.id, contactName: "", contactPhone: "", contactEmail: "", }; //#endregion //#region JobSchema export const TagSchema = z.object({ name: z.string().min(1, "Tag name is required"), isActive: z.boolean().default(true), }); export const jobSchema = z.object({ title: z.string().min(1, "Title is required"), description: z.string().min(1, "Description is required"), projectId: z.string().min(1, "Project is required"), assignees: z.array(z.string()).optional(), startDate: z.string(), dueDate: z.string(), tags: z.array(TagSchema).optional().default([]), statusId: z.string().optional().nullable(), projectBranchId: z.string().optional().nullable(), }); const MAX_FILE_SIZE = 5 * 1024 * 1024; // 5MB const ALLOWED_TYPES = [ "application/pdf", "image/png", "image/jpg", "image/jpeg", ]; export const JobCommentSchema = z.object({ comment: z.string().min(1, { message: "Please leave comment" }), attachments: z .array( z.object({ fileName: z.string().min(1), base64Data: z.string().nullable(), contentType: z.string().refine((val) => ALLOWED_TYPES.includes(val), { message: "Only PDF, PNG, JPG, or JPEG files are allowed", }), documentId: z.string().optional(), fileSize: z.number().max(MAX_FILE_SIZE), description: z.string().optional(), isActive: z.boolean().default(true), }) ) .optional() .default([]), }); export const defaultJobValue = { title: "", description: "", projectId: "", assignees: [], statusId: null, startDate: null, dueDate: null, tags: [], branchId: null, }; //#endregion //#region Branch export const BranchSchema = () => z.object({ projectId: z .string() .trim() .min(1, { message: "Project is required" }), branchName: z .string() .trim() .min(1, { message: "Branch Name is required" }), contactInformation: z.string().optional(), address: z .string() .trim() .min(1, { message: "Address is required" }), branchType: z .string() .trim() .min(1, { message: "Branch Type is required" }), googleMapUrl: z .string() }); export const defaultBranches = { branchName: "", projectId: "", contactInformation: "", address: "", branchType: "", googleMapUrl: "", }; //#endregion