Merge branch 'dev' of https://github.com/dikstub-rssa/simrs-fe into feeat/pendaftaran-kemoterapi-141
This commit is contained in:
@@ -0,0 +1,20 @@
|
||||
import { z } from 'zod'
|
||||
import type { InstallationPosition } from '~/models/installation-position'
|
||||
|
||||
const InstallationPositionSchema = z.object({
|
||||
code: z.string({ required_error: 'Kode harus diisi' }).min(1, 'Kode minimum 1 karakter'),
|
||||
name: z.string({ required_error: 'Nama harus diisi' }).min(1, 'Nama minimum 1 karakter'),
|
||||
headStatus: z.boolean().optional().nullable(),
|
||||
installation_id: z.union([
|
||||
z.string({ required_error: 'Instalasi Induk harus diisi' }),
|
||||
z.number({ required_error: 'Instalasi Induk harus diisi' }),
|
||||
]),
|
||||
employee_id: z
|
||||
.union([z.string({ required_error: 'Karyawan harus diisi' }), z.number({ required_error: 'Karyawan harus diisi' })])
|
||||
.optional()
|
||||
.nullable(),
|
||||
})
|
||||
type InstallationPositionFormData = z.infer<typeof InstallationPositionSchema> & Partial<InstallationPosition>
|
||||
|
||||
export { InstallationPositionSchema }
|
||||
export type { InstallationPositionFormData }
|
||||
@@ -0,0 +1,255 @@
|
||||
import { z } from 'zod'
|
||||
|
||||
const ERROR_MESSAGES = {
|
||||
required: {
|
||||
sepDate: 'Tanggal wajib diisi',
|
||||
serviceType: 'Jenis Pelayanan wajib diisi',
|
||||
admissionType: 'Jenis Pendaftaran wajib diisi',
|
||||
cardNumber: 'No. Kartu BPJS wajib diisi',
|
||||
nationalId: 'Nomor ID wajib diisi',
|
||||
medicalRecordNumber: 'Nomor Rekam Medis wajib diisi',
|
||||
patientName: 'Nama wajib diisi',
|
||||
phoneNumber: 'Nomor Telepon wajib diisi',
|
||||
referralLetterNumber: 'Nomor Surat Kontrol wajib diisi',
|
||||
referralLetterDate: 'Tanggal Surat Kontrol wajib diisi',
|
||||
fromClinic: 'Faskes Asal wajib diisi',
|
||||
destinationClinic: 'Klinik Tujuan wajib diisi',
|
||||
attendingDoctor: 'Dokter wajib diisi',
|
||||
initialDiagnosis: 'Diagnosa Awal wajib diisi',
|
||||
cob: 'COB wajib diisi',
|
||||
cataract: 'Katarak wajib diisi',
|
||||
clinicExcecutive: 'Klinkik eksekutif wajib diisi',
|
||||
subSpecialistId: 'Subspesialis wajib diisi',
|
||||
procedureType: 'Jenis Prosedur wajib diisi',
|
||||
supportCode: 'Kode Penunjang wajib diisi',
|
||||
note: 'Catatan wajib diisi',
|
||||
trafficAccident: 'Kejadian lalu lintas wajib diisi',
|
||||
purposeOfVisit: 'Tujuan Kunjungan wajib diisi',
|
||||
serviceAssessment: 'Assemen Pelayanan wajib diisi',
|
||||
lpNumber: 'Nomor LP wajib diisi',
|
||||
accidentDate: 'Tanggal Kejadian lalu lintas wajib diisi',
|
||||
accidentNote: 'Keterangan Kejadian lalu lintas wajib diisi',
|
||||
accidentProvince: 'Provinsi Kejadian lalu lintas wajib diisi',
|
||||
accidentCity: 'Kota Kejadian lalu lintas wajib diisi',
|
||||
accidentDistrict: 'Kecamatan Kejadian lalu lintas wajib diisi',
|
||||
suplesi: 'Suplesi wajib diisi',
|
||||
suplesiNumber: 'Nomor Suplesi wajib diisi',
|
||||
classLevel: 'Kelas Rawat wajib diisi',
|
||||
classLevelUpgrade: 'Kelas Rawat Naik wajib diisi',
|
||||
classPaySource: 'Pembiayaan wajib diisi',
|
||||
responsiblePerson: 'Penanggung Jawab wajib diisi',
|
||||
},
|
||||
}
|
||||
|
||||
const IntegrationBpjsSchema = z
|
||||
.object({
|
||||
sepDate: z.string({ required_error: ERROR_MESSAGES.required.sepDate }).min(1, ERROR_MESSAGES.required.sepDate),
|
||||
serviceType: z
|
||||
.string({ required_error: ERROR_MESSAGES.required.serviceType })
|
||||
.min(1, ERROR_MESSAGES.required.serviceType)
|
||||
.optional(),
|
||||
admissionType: z
|
||||
.string({ required_error: ERROR_MESSAGES.required.admissionType })
|
||||
.min(1, ERROR_MESSAGES.required.admissionType),
|
||||
cardNumber: z
|
||||
.string({ required_error: ERROR_MESSAGES.required.cardNumber })
|
||||
.min(1, ERROR_MESSAGES.required.cardNumber),
|
||||
nationalId: z
|
||||
.string({ required_error: ERROR_MESSAGES.required.nationalId })
|
||||
.min(1, ERROR_MESSAGES.required.nationalId),
|
||||
medicalRecordNumber: z
|
||||
.string({ required_error: ERROR_MESSAGES.required.medicalRecordNumber })
|
||||
.min(1, ERROR_MESSAGES.required.medicalRecordNumber),
|
||||
patientName: z
|
||||
.string({ required_error: ERROR_MESSAGES.required.patientName })
|
||||
.min(1, ERROR_MESSAGES.required.patientName),
|
||||
phoneNumber: z
|
||||
.string({ required_error: ERROR_MESSAGES.required.phoneNumber })
|
||||
.min(1, ERROR_MESSAGES.required.phoneNumber),
|
||||
referralLetterNumber: z
|
||||
.string({ required_error: ERROR_MESSAGES.required.referralLetterNumber })
|
||||
.min(1, ERROR_MESSAGES.required.referralLetterNumber).optional(),
|
||||
referralLetterDate: z
|
||||
.string({ required_error: ERROR_MESSAGES.required.referralLetterDate })
|
||||
.min(1, ERROR_MESSAGES.required.referralLetterDate).optional(),
|
||||
fromClinic: z
|
||||
.string({ required_error: ERROR_MESSAGES.required.fromClinic })
|
||||
.min(1, ERROR_MESSAGES.required.fromClinic)
|
||||
.optional(),
|
||||
destinationClinic: z
|
||||
.string({ required_error: ERROR_MESSAGES.required.destinationClinic })
|
||||
.min(1, ERROR_MESSAGES.required.destinationClinic),
|
||||
attendingDoctor: z
|
||||
.string({ required_error: ERROR_MESSAGES.required.attendingDoctor })
|
||||
.min(1, ERROR_MESSAGES.required.attendingDoctor),
|
||||
initialDiagnosis: z
|
||||
.string({ required_error: ERROR_MESSAGES.required.initialDiagnosis })
|
||||
.min(1, ERROR_MESSAGES.required.initialDiagnosis),
|
||||
cob: z.string({ required_error: ERROR_MESSAGES.required.cob }).min(1, ERROR_MESSAGES.required.cob),
|
||||
cataract: z.string({ required_error: ERROR_MESSAGES.required.cataract }).min(1, ERROR_MESSAGES.required.cataract),
|
||||
clinicExcecutive: z
|
||||
.string({ required_error: ERROR_MESSAGES.required.clinicExcecutive })
|
||||
.min(1, ERROR_MESSAGES.required.clinicExcecutive),
|
||||
subSpecialistId: z
|
||||
.string({ required_error: ERROR_MESSAGES.required.subSpecialistId })
|
||||
.min(1, ERROR_MESSAGES.required.subSpecialistId)
|
||||
.optional(),
|
||||
procedureType: z
|
||||
.string({ required_error: ERROR_MESSAGES.required.procedureType })
|
||||
.min(1, ERROR_MESSAGES.required.procedureType)
|
||||
.optional(),
|
||||
supportCode: z
|
||||
.string({ required_error: ERROR_MESSAGES.required.supportCode })
|
||||
.min(1, ERROR_MESSAGES.required.supportCode)
|
||||
.optional(),
|
||||
note: z.string({ required_error: ERROR_MESSAGES.required.note }).min(1, ERROR_MESSAGES.required.note).optional(),
|
||||
trafficAccident: z
|
||||
.string({ required_error: ERROR_MESSAGES.required.trafficAccident })
|
||||
.min(1, ERROR_MESSAGES.required.trafficAccident)
|
||||
.optional(),
|
||||
purposeOfVisit: z
|
||||
.string({ required_error: ERROR_MESSAGES.required.purposeOfVisit })
|
||||
.min(1, ERROR_MESSAGES.required.purposeOfVisit)
|
||||
.optional(),
|
||||
serviceAssessment: z
|
||||
.string({ required_error: ERROR_MESSAGES.required.serviceAssessment })
|
||||
.min(1, ERROR_MESSAGES.required.serviceAssessment)
|
||||
.optional(),
|
||||
lpNumber: z.string({ required_error: ERROR_MESSAGES.required.lpNumber }).optional(),
|
||||
accidentDate: z.string({ required_error: ERROR_MESSAGES.required.accidentDate }).optional(),
|
||||
accidentNote: z.string({ required_error: ERROR_MESSAGES.required.accidentNote }).optional(),
|
||||
accidentProvince: z.string({ required_error: ERROR_MESSAGES.required.accidentProvince }).optional(),
|
||||
accidentCity: z.string({ required_error: ERROR_MESSAGES.required.accidentCity }).optional(),
|
||||
accidentDistrict: z.string({ required_error: ERROR_MESSAGES.required.accidentDistrict }).optional(),
|
||||
suplesi: z.string({ required_error: ERROR_MESSAGES.required.suplesi }).optional(),
|
||||
suplesiNumber: z.string({ required_error: ERROR_MESSAGES.required.suplesiNumber }).optional(),
|
||||
classLevel: z.string({ required_error: ERROR_MESSAGES.required.classLevel }).optional(),
|
||||
classLevelUpgrade: z.string({ required_error: ERROR_MESSAGES.required.classLevelUpgrade }).optional(),
|
||||
classPaySource: z.string({ required_error: ERROR_MESSAGES.required.classPaySource }).optional(),
|
||||
responsiblePerson: z.string({ required_error: ERROR_MESSAGES.required.responsiblePerson }).optional(),
|
||||
})
|
||||
.refine(
|
||||
(data) => {
|
||||
if (data.trafficAccident && data.trafficAccident.trim() !== '') {
|
||||
return data.accidentDate && data.accidentDate.trim() !== ''
|
||||
}
|
||||
return true
|
||||
},
|
||||
{
|
||||
message: ERROR_MESSAGES.required.accidentDate,
|
||||
path: ['accidentDate'],
|
||||
},
|
||||
)
|
||||
.refine(
|
||||
(data) => {
|
||||
if (data.trafficAccident && data.trafficAccident.trim() !== '') {
|
||||
return data.accidentProvince && data.accidentProvince.trim() !== ''
|
||||
}
|
||||
return true
|
||||
},
|
||||
{
|
||||
message: ERROR_MESSAGES.required.accidentProvince,
|
||||
path: ['accidentProvince'],
|
||||
},
|
||||
)
|
||||
.refine(
|
||||
(data) => {
|
||||
if (data.trafficAccident && data.trafficAccident.trim() !== '') {
|
||||
return data.accidentCity && data.accidentCity.trim() !== ''
|
||||
}
|
||||
return true
|
||||
},
|
||||
{
|
||||
message: ERROR_MESSAGES.required.accidentCity,
|
||||
path: ['accidentCity'],
|
||||
},
|
||||
)
|
||||
.refine(
|
||||
(data) => {
|
||||
if (data.trafficAccident && data.trafficAccident.trim() !== '') {
|
||||
return data.accidentDistrict && data.accidentDistrict.trim() !== ''
|
||||
}
|
||||
return true
|
||||
},
|
||||
{
|
||||
message: ERROR_MESSAGES.required.accidentDistrict,
|
||||
path: ['accidentDistrict'],
|
||||
},
|
||||
)
|
||||
.refine(
|
||||
(data) => {
|
||||
if (data.trafficAccident && data.trafficAccident.trim() !== '') {
|
||||
return data.suplesi && data.suplesi.trim() !== ''
|
||||
}
|
||||
return true
|
||||
},
|
||||
{
|
||||
message: ERROR_MESSAGES.required.suplesi,
|
||||
path: ['suplesi'],
|
||||
},
|
||||
)
|
||||
.refine(
|
||||
(data) => {
|
||||
if (data.trafficAccident && data.trafficAccident.trim() !== '' && data.suplesi?.trim() === 'yes') {
|
||||
return data.suplesiNumber && data.suplesiNumber.trim() !== ''
|
||||
}
|
||||
return true
|
||||
},
|
||||
{
|
||||
message: ERROR_MESSAGES.required.suplesiNumber,
|
||||
path: ['suplesiNumber'],
|
||||
},
|
||||
)
|
||||
.refine(
|
||||
(data) => {
|
||||
if (data.serviceType === '1') {
|
||||
return data.classLevel && data.classLevel.trim() !== ''
|
||||
}
|
||||
return true
|
||||
},
|
||||
{
|
||||
message: ERROR_MESSAGES.required.classLevel,
|
||||
path: ['classLevel'],
|
||||
},
|
||||
)
|
||||
.refine(
|
||||
(data) => {
|
||||
if (data.serviceType === '1') {
|
||||
return data.classLevelUpgrade && data.classLevelUpgrade.trim() !== ''
|
||||
}
|
||||
return true
|
||||
},
|
||||
{
|
||||
message: ERROR_MESSAGES.required.classLevelUpgrade,
|
||||
path: ['classLevelUpgrade'],
|
||||
},
|
||||
)
|
||||
.refine(
|
||||
(data) => {
|
||||
if (data.serviceType === '1' && data.classLevelUpgrade?.trim() !== '') {
|
||||
return data.classPaySource && data.classPaySource.trim() !== ''
|
||||
}
|
||||
return true
|
||||
},
|
||||
{
|
||||
message: ERROR_MESSAGES.required.classPaySource,
|
||||
path: ['classPaySource'],
|
||||
},
|
||||
)
|
||||
.refine(
|
||||
(data) => {
|
||||
if (data.serviceType === '1' && data.classPaySource?.trim() !== '') {
|
||||
return data.responsiblePerson && data.responsiblePerson.trim() !== ''
|
||||
}
|
||||
return true
|
||||
},
|
||||
{
|
||||
message: ERROR_MESSAGES.required.responsiblePerson,
|
||||
path: ['responsiblePerson'],
|
||||
},
|
||||
)
|
||||
|
||||
type IntegrationBpjsFormData = z.infer<typeof IntegrationBpjsSchema>
|
||||
|
||||
export { IntegrationBpjsSchema }
|
||||
export type { IntegrationBpjsFormData }
|
||||
@@ -0,0 +1,133 @@
|
||||
import { z } from 'zod'
|
||||
|
||||
const ERROR_MESSAGES = {
|
||||
required: {
|
||||
doctorId: 'Dokter wajib diisi',
|
||||
registerDate: 'Tanggal Daftar wajib diisi',
|
||||
paymentType: 'Jenis Pembayaran wajib diisi',
|
||||
subSpecialistId: 'Subspesialis wajib diisi',
|
||||
patientCategory: 'Kelompok Peserta wajib diisi',
|
||||
cardNumber: 'No. Kartu BPJS wajib diisi',
|
||||
sepType: 'Jenis SEP wajib diisi',
|
||||
sepNumber: 'No. SEP wajib diisi',
|
||||
},
|
||||
}
|
||||
|
||||
const ACCEPTED_UPLOAD_TYPES = ['image/jpeg', 'image/png', 'application/pdf']
|
||||
|
||||
const IntegrationEncounterSchema = z
|
||||
.object({
|
||||
// Patient data (readonly, populated from selected patient)
|
||||
patientName: z.string().optional(),
|
||||
nationalIdentity: z.string().optional(),
|
||||
medicalRecordNumber: z.string().optional(),
|
||||
|
||||
// Visit data
|
||||
doctorId: z
|
||||
.string({ required_error: ERROR_MESSAGES.required.doctorId })
|
||||
.min(1, ERROR_MESSAGES.required.doctorId),
|
||||
subSpecialistId: z
|
||||
.string({ required_error: ERROR_MESSAGES.required.subSpecialistId })
|
||||
.min(1, ERROR_MESSAGES.required.subSpecialistId)
|
||||
.optional(),
|
||||
registerDate: z
|
||||
.string({ required_error: ERROR_MESSAGES.required.registerDate })
|
||||
.min(1, ERROR_MESSAGES.required.registerDate),
|
||||
paymentType: z
|
||||
.string({ required_error: ERROR_MESSAGES.required.paymentType })
|
||||
.min(1, ERROR_MESSAGES.required.paymentType),
|
||||
|
||||
// BPJS related fields
|
||||
patientCategory: z
|
||||
.string()
|
||||
.min(1, ERROR_MESSAGES.required.patientCategory)
|
||||
.optional(),
|
||||
cardNumber: z
|
||||
.string()
|
||||
.min(1, ERROR_MESSAGES.required.cardNumber)
|
||||
.optional(),
|
||||
sepType: z
|
||||
.string()
|
||||
.min(1, ERROR_MESSAGES.required.sepType)
|
||||
.optional(),
|
||||
sepNumber: z
|
||||
.string()
|
||||
.min(1, ERROR_MESSAGES.required.sepNumber)
|
||||
.optional(),
|
||||
|
||||
// File uploads
|
||||
sepFile: z
|
||||
.any()
|
||||
.optional()
|
||||
.refine((f) => !f || f instanceof File, { message: 'Harus berupa file yang valid' })
|
||||
.refine((f) => !f || ACCEPTED_UPLOAD_TYPES.includes(f.type), {
|
||||
message: 'Format file harus JPG, PNG, atau PDF',
|
||||
})
|
||||
.refine((f) => !f || f.size <= 1 * 1024 * 1024, { message: 'Maksimal 1MB' }),
|
||||
sippFile: z
|
||||
.any()
|
||||
.optional()
|
||||
.refine((f) => !f || f instanceof File, { message: 'Harus berupa file yang valid' })
|
||||
.refine((f) => !f || ACCEPTED_UPLOAD_TYPES.includes(f.type), {
|
||||
message: 'Format file harus JPG, PNG, atau PDF',
|
||||
})
|
||||
.refine((f) => !f || f.size <= 1 * 1024 * 1024, { message: 'Maksimal 1MB' }),
|
||||
})
|
||||
.refine(
|
||||
(data) => {
|
||||
// If payment type is jkn, then patient category is required
|
||||
if (data.paymentType === 'jkn') {
|
||||
return data.patientCategory && data.patientCategory.trim() !== ''
|
||||
}
|
||||
return true
|
||||
},
|
||||
{
|
||||
message: ERROR_MESSAGES.required.patientCategory,
|
||||
path: ['patientCategory'],
|
||||
},
|
||||
)
|
||||
.refine(
|
||||
(data) => {
|
||||
// If payment type is jkn, then card number is required
|
||||
if (data.paymentType === 'jkn') {
|
||||
return data.cardNumber && data.cardNumber.trim() !== ''
|
||||
}
|
||||
return true
|
||||
},
|
||||
{
|
||||
message: ERROR_MESSAGES.required.cardNumber,
|
||||
path: ['cardNumber'],
|
||||
},
|
||||
)
|
||||
.refine(
|
||||
(data) => {
|
||||
// If payment type is jkn, then SEP type is required
|
||||
if (data.paymentType === 'jkn') {
|
||||
return data.sepType && data.sepType.trim() !== ''
|
||||
}
|
||||
return true
|
||||
},
|
||||
{
|
||||
message: ERROR_MESSAGES.required.sepType,
|
||||
path: ['sepType'],
|
||||
},
|
||||
)
|
||||
.refine(
|
||||
(data) => {
|
||||
// If payment type is jkn and SEP type is selected, then SEP number is required
|
||||
if (data.paymentType === 'jkn' && data.sepType && data.sepType.trim() !== '') {
|
||||
return data.sepNumber && data.sepNumber.trim() !== ''
|
||||
}
|
||||
return true
|
||||
},
|
||||
{
|
||||
message: ERROR_MESSAGES.required.sepNumber,
|
||||
path: ['sepNumber'],
|
||||
},
|
||||
)
|
||||
|
||||
type IntegrationEncounterFormData = z.infer<typeof IntegrationEncounterSchema>
|
||||
|
||||
export { IntegrationEncounterSchema }
|
||||
export type { IntegrationEncounterFormData }
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
import { z } from 'zod'
|
||||
import type { PrescriptionItem } from '~/models/prescription-item'
|
||||
|
||||
const PrescriptionItemSchema = z.object({
|
||||
})
|
||||
|
||||
type PrescriptionItemFormData = z.infer<typeof PrescriptionItemSchema> & PrescriptionItem
|
||||
|
||||
export { PrescriptionItemSchema }
|
||||
export type { PrescriptionItemFormData }
|
||||
@@ -0,0 +1,11 @@
|
||||
import { z } from 'zod'
|
||||
import type { Prescription } from '~/models/prescription'
|
||||
|
||||
const PrescriptionSchema = z.object({
|
||||
'encounter-id': z.number().nullable().optional(),
|
||||
})
|
||||
|
||||
type PrescriptionFormData = z.infer<typeof PrescriptionSchema> & Prescription
|
||||
|
||||
export { PrescriptionSchema }
|
||||
export type { PrescriptionFormData }
|
||||
@@ -0,0 +1,24 @@
|
||||
import { z } from 'zod'
|
||||
import type { SpecialistPosition } from '~/models/specialist-position'
|
||||
|
||||
const SpecialistPositionSchema = z.object({
|
||||
code: z.string({ required_error: 'Kode harus diisi' }).min(1, 'Kode minimum 1 karakter'),
|
||||
name: z.string({ required_error: 'Nama harus diisi' }).min(1, 'Nama minimum 1 karakter'),
|
||||
headStatus: z.boolean().optional().nullable(),
|
||||
specialist_id: z
|
||||
.union([
|
||||
z.string({ required_error: 'Spesialis harus diisi' }),
|
||||
z.number({ required_error: 'Spesialis harus diisi' }),
|
||||
])
|
||||
.optional()
|
||||
.nullable(),
|
||||
employee_id: z
|
||||
.union([z.string({ required_error: 'Karyawan harus diisi' }), z.number({ required_error: 'Karyawan harus diisi' })])
|
||||
.optional()
|
||||
.nullable(),
|
||||
})
|
||||
|
||||
type SpecialistPositionFormData = z.infer<typeof SpecialistPositionSchema> & Partial<SpecialistPosition>
|
||||
|
||||
export { SpecialistPositionSchema }
|
||||
export type { SpecialistPositionFormData }
|
||||
@@ -0,0 +1,24 @@
|
||||
import { z } from 'zod'
|
||||
import type { SubSpecialistPosition } from '~/models/subspecialist-position'
|
||||
|
||||
const SubSpecialistPositionSchema = z.object({
|
||||
code: z.string({ required_error: 'Kode harus diisi' }).min(1, 'Kode minimum 1 karakter'),
|
||||
name: z.string({ required_error: 'Nama harus diisi' }).min(1, 'Nama minimum 1 karakter'),
|
||||
headStatus: z.boolean().optional().nullable(),
|
||||
subspecialist_id: z
|
||||
.union([
|
||||
z.string({ required_error: 'Spesialis harus diisi' }),
|
||||
z.number({ required_error: 'Spesialis harus diisi' }),
|
||||
])
|
||||
.optional()
|
||||
.nullable(),
|
||||
employee_id: z
|
||||
.union([z.string({ required_error: 'Karyawan harus diisi' }), z.number({ required_error: 'Karyawan harus diisi' })])
|
||||
.optional()
|
||||
.nullable(),
|
||||
})
|
||||
|
||||
type SubSpecialistPositionFormData = z.infer<typeof SubSpecialistPositionSchema> & Partial<SubSpecialistPosition>
|
||||
|
||||
export { SubSpecialistPositionSchema }
|
||||
export type { SubSpecialistPositionFormData }
|
||||
@@ -0,0 +1,24 @@
|
||||
import { z } from 'zod'
|
||||
import type { UnitPosition } from '~/models/unit-position'
|
||||
|
||||
const UnitPositionSchema = z.object({
|
||||
code: z.string({ required_error: 'Kode harus diisi' }).min(1, 'Kode minimum 1 karakter'),
|
||||
name: z.string({ required_error: 'Nama harus diisi' }).min(1, 'Nama minimum 1 karakter'),
|
||||
headStatus: z.boolean().optional().nullable(),
|
||||
unit_id: z
|
||||
.union([
|
||||
z.string({ required_error: 'Unit Induk harus diisi' }),
|
||||
z.number({ required_error: 'Unit Induk harus diisi' }),
|
||||
])
|
||||
.optional()
|
||||
.nullable(),
|
||||
employee_id: z
|
||||
.union([z.string({ required_error: 'Karyawan harus diisi' }), z.number({ required_error: 'Karyawan harus diisi' })])
|
||||
.optional()
|
||||
.nullable(),
|
||||
})
|
||||
|
||||
type UnitPositionFormData = z.infer<typeof UnitPositionSchema> & Partial<UnitPosition>
|
||||
|
||||
export { UnitPositionSchema }
|
||||
export type { UnitPositionFormData }
|
||||
Reference in New Issue
Block a user