import { z } from 'zod'; export const TempoSchema = z.object({ name: z.string().min(1, { message: 'Nama harus diisi' }), street: z.string().min(1, { message: 'Alamat harus diisi' }), industryId: z.string().min(1, { message: 'Jenis usaha harus dipilih' }), zip: z.string().min(1, { message: 'Kode pos harus diisi' }), state: z.string().min(1, { message: 'Provinsi harus dipilih' }), city: z.string().min(1, { message: 'Kota harus dipilih' }), district: z.string().min(1, { message: 'Kecamatan harus dipilih' }), subDistrict: z.string().optional(), mobile: z .string() .min(1, { message: 'Nomor telepon harus diisi' }) .refine((val) => /^\d{10,12}$/.test(val), { message: 'Format nomor telepon tidak valid, contoh: 081234567890 atau 021234567890', }), bankName: z.string().min(1, { message: 'Nama bank harus diisi' }), accountName: z.string().min(1, { message: 'Nama rekening harus diisi' }), accountNumber: z .string() .min(1, { message: 'Nomor rekening harus diisi' }) .refine((val) => /^\d+$/.test(val), { message: 'Nomor rekening hanya boleh mengandung angka', }), estimasi: z.string().optional(), website: z.string().optional(), tempoDuration: z.string().min(1, { message: 'Durasi tempo harus dipilih' }), bersedia: z.string().min(1, { message: 'Harus dipilih' }), portal: z.string().min(1, { message: 'Harus dipilih' }), categoryProduk: z .string() .min(1, { message: 'Category produk harus dipilih' }), }); export const TempoSchemaKontakPerson = z .object({ direkturName: z.string().min(1, { message: 'Nama harus diisi' }), direkturTittle: z.string().min(1, { message: 'Tittle harus dipilih' }), financeName: z.string().min(1, { message: 'Nama harus diisi' }), direkturMobile: z.string().optional(), financeMobile: z .string() .min(1, { message: 'Nomor telepon harus diisi' }) .refine((val) => /^\d{10,12}$/.test(val), { message: 'Format nomor telepon tidak valid, contoh: 081234567890 atau 021234567890', }), purchasingTittle: z.string().min(1, { message: 'Tittle harus dipilih' }), financeTittle: z.string().min(1, { message: 'Tittle harus dipilih' }), purchasingMobile: z .string() .min(1, { message: 'Nomor telepon harus diisi' }) .refine((val) => /^\d{10,12}$/.test(val), { message: 'Format nomor telepon tidak valid, contoh: 081234567890 atau 021234567890', }), direkturEmail: z .string() .min(1, { message: 'Email harus diisi' }) .email({ message: 'Email harus menggunakan format example@mail.com' }), purchasingEmail: z .string() .min(1, { message: 'Email harus diisi' }) .email({ message: 'Email harus menggunakan format example@mail.com' }), financeEmail: z .string() .min(1, { message: 'Email harus diisi' }) .email({ message: 'Email harus menggunakan format example@mail.com' }), purchasingName: z.string().min(1, { message: 'Nama harus diisi' }), }) .refine( (data) => !data.financeEmail || data.financeEmail !== data.purchasingEmail, { message: 'Email Finance tidak boleh sama dengan Email Purchasing', path: ['financeEmail'], } ) .refine( (data) => !data.direkturEmail || (data.direkturEmail !== data.financeEmail && data.direkturEmail !== data.purchasingEmail), { message: 'Email Direktur tidak boleh sama dengan Email Finance atau Purchasing', path: ['direkturEmail'], } ) .superRefine((data, ctx) => { const phones = [ { key: 'direkturMobile', label: 'No. HP Direktur', value: data.direkturMobile }, { key: 'purchasingMobile', label: 'No. HP Purchasing', value: data.purchasingMobile }, { key: 'financeMobile', label: 'No. HP Finance', value: data.financeMobile }, ]; const seen = new Map(); for (const phone of phones) { if (!phone.value) continue; if (!seen.has(phone.value)) { seen.set(phone.value, { key: phone.key, label: phone.label }); } else { const first = seen.get(phone.value)!; ctx.addIssue({ code: 'custom', path: [phone.key], message: `${phone.label} tidak boleh sama dengan ${first.label}`, }); ctx.addIssue({ code: 'custom', path: [first.key], message: `${first.label} tidak boleh sama dengan ${phone.label}`, }); } } }); export const TempoSchemaDokumen = z.object({ dokumenNib: z.object({ name: z.string().min(1, { message: 'Nama file harus diisi' }), format: z.string().optional(), base64: z.string().optional(), }), dokumenNpwp: z.object({ name: z.string().min(1, { message: 'Nama file harus diisi' }), format: z.string().optional(), base64: z.string().optional(), }), dokumenSppkp: z.object({ name: z.string().min(1, { message: 'Nama file harus diisi' }), format: z.string().optional(), base64: z.string().optional(), }), dokumenSiup: z.object({ name: z.string().optional(), format: z.string().optional(), base64: z.string().optional(), }), dokumenTdp: z.object({ name: z.string().optional(), format: z.string().optional(), base64: z.string().optional(), }), dokumenSkdp: z.object({ name: z.string().optional(), format: z.string().optional(), base64: z.string().optional(), }), dokumenSkt: z.object({ name: z.string().optional(), format: z.string().optional(), base64: z.string().optional(), }), dokumenAktaPerubahan: z.object({ name: z.string().optional(), format: z.string().optional(), base64: z.string().optional(), }), dokumenKtpDirut: z.object({ name: z.string().optional(), format: z.string().optional(), base64: z.string().optional(), }), dokumenAktaPendirian: z.object({ name: z.string().optional(), format: z.string().optional(), base64: z.string().optional(), }), dokumenLaporanKeuangan: z.object({ name: z.string().optional(), format: z.string().optional(), base64: z.string().optional(), }), dokumenFotoKantor: z.object({ name: z.string().min(1, { message: 'Nama file harus diisi' }), format: z.string().optional(), base64: z.string().optional(), }), dokumenTempatBekerja: z.object({ name: z.string().min(1, { message: 'Nama file harus diisi' }), format: z.string().optional(), base64: z.string().optional(), }), }); export const TempoSchemaPengiriman = z .object({ PICBarangMobile: z .string() .min(1, { message: 'Nomor telepon harus diisi' }) .refine((val) => /^\d{10,12}$/.test(val), { message: 'Format nomor telepon tidak valid, contoh: 081234567890 atau 021234567890', }), invoicePicMobile: z .string() .min(1, { message: 'Nomor telepon harus diisi' }) .refine((val) => /^\d{10,12}$/.test(val), { message: 'Format nomor telepon tidak valid, contoh: 081234567890 atau 021234567890', }), }); // .refine((data) => data.PICBarangMobile !== data.invoicePicMobile, { // message: 'Nomor HP PIC Barang tidak boleh sama dengan Nomor HP PIC Invoice', // path: ['invoicePicMobile'], // error akan tampil di bawah field invoicePicMobile // });