export const yesNoSchema = z.enum(YES_NO);
export const optionalDayjsSchema = z.custom<Dayjs>().optional();
export const bizNoSchema = z
.string()
// .optional()
// .nullable()
.refine(
(val) => !val || REGEX_BIZ_NO.test(val),
'사업자번호 형식이 올바르지 않습니다. (예: 123-12-12345)'
);
export const vatTypeSchema = z.enum(['NONE', 'INCLUDE', 'EXCLUDE']);
export const orderTypeSchema = z.enum(['SALE', 'PURCHASE']);
export const nonNegativeNumber = (message: string) =>
z.preprocess(coerceNumber, z.number({ message }).min(0, message));
export const nonNegativeInt = (message: string) =>
z.preprocess(
coerceNumber,
z.number({ message }).int(message).min(0, message)
);
// (money) 1,000,000 string -> 1000000 변환 및 유효성 검증
totalAmount : z.string().or(z.number()).transform(toNumber) .pipe(z.number())
.optional()
.default(0),
/**
* Zod preprocess용: 다양한 입력을 숫자로 변환
*/
export const coerceNumber = (value: unknown): number | undefined => {
if (typeof value === 'number') return value;
if (typeof value === 'string') {
const trimmed = value.trim();
if (trimmed === '') return undefined;
const n = Number(trimmed.replace(/,/g, ''));
return Number.isNaN(n) ? undefined : n;
}
return undefined;
};
/** 콤마 포함 문자열 → number 변환, 빈값은 0 (e.g. "1,000" → 1000) */
export const toNumber = (value: string | number | undefined): number =>
coerceNumber(value) ?? 0;