Merge branch 'dev' of https://github.com/dikstub-rssa/simrs-fe into feat/cprj-146

This commit is contained in:
Abizrh
2025-11-21 14:14:17 +07:00
436 changed files with 27168 additions and 2469 deletions

No files matched your search

+5
View File
@@ -0,0 +1,5 @@
export interface GenerateFile {
entityType_code: string
ref_id: number
type_code: string
}
+73
View File
@@ -0,0 +1,73 @@
import { z } from 'zod'
const dateStringSchema = z.string().min(1)
export const chemotherapySchema = z.object({
// Data Pasien
namaPasien: z.string({
required_error: 'Nama pasien harus diisi',
}).min(1, 'Nama pasien harus diisi'),
tanggalLahir: z.string({
required_error: 'Tanggal lahir harus diisi',
}).min(1, 'Tanggal lahir harus diisi'),
noRM: z.string({
required_error: 'Nomor RM harus diisi',
}).min(1, 'Nomor RM harus diisi'),
alamat: z.string({
required_error: 'Alamat harus diisi',
}).min(1, 'Alamat harus diisi'),
beratBadan: z.union([
z.string(),
z.number()
]).transform(val => val === '' ? null : Number(val))
.refine(val => val === null || (val >= 0 && val <= 500), {
message: 'Berat badan harus di antara 0-500 kg',
}),
tinggiBadan: z.union([
z.string(),
z.number()
]).transform(val => val === '' ? null : Number(val))
.refine(val => val === null || (val >= 0 && val <= 300), {
message: 'Tinggi badan harus di antara 0-300 cm',
}),
diagnosa: z.string({
required_error: 'Diagnosa harus dipilih',
}).min(1, 'Diagnosa harus dipilih'),
// Protokol Kemoterapi
siklus: z.string({
required_error: 'Siklus harus diisi',
}).min(1, 'Siklus harus diisi'),
periodeAwal: z.string({
required_error: 'Periode awal harus diisi',
}).min(1, 'Periode awal harus diisi'),
periodeAkhir: dateStringSchema.refine((val) => {
if (!val) return false
const date = new Date(val)
return !isNaN(date.getTime())
}, {
message: 'Format tanggal tidak valid'
}),
tanggalKemoterapi: dateStringSchema.refine((val) => {
if (!val) return false
const date = new Date(val)
return !isNaN(date.getTime())
}, {
message: 'Format tanggal tidak valid'
}),
dokterKRJ: z.string({
required_error: 'Dokter harus dipilih',
}).refine(val => val !== '', {
message: 'Dokter harus dipilih',
}),
})
+47
View File
@@ -0,0 +1,47 @@
import { z } from 'zod'
const ControlLetterSchema = z.object({
sepStatus: z.string({
required_error: 'Mohon isi status SEP',
}).default('SEP Internal'),
unit_code: z.string({
required_error: 'Mohon isi Unit',
}),
specialist_code: z.string({
required_error: 'Mohon isi Spesialis',
}),
subspecialist_code: z.string({
required_error: 'Mohon isi Sub Spesialis',
}),
doctor_code: z.string({
required_error: 'Mohon isi DPJP',
}),
encounter_code: z.string().optional(),
date: z.string({
required_error: 'Mohon lengkapi Tanggal Kontrol',
})
.refine(
(date) => {
// Jika kosong, return false untuk required validation
if (!date || date.trim() === '') return false
// Jika ada isi, validasi format tanggal
try {
const dateObj = new Date(date)
// Cek apakah tanggal valid dan tahun >= 1900
return !isNaN(dateObj.getTime()) && dateObj.getFullYear() >= 1900
} catch {
return false
}
},
{
message: 'Mohon lengkapi Tanggal Kontrol dengan format yang valid',
},
)
.transform((dateStr) => new Date(dateStr).toISOString()),
})
type ControlLetterFormData = z.infer<typeof ControlLetterSchema>
export { ControlLetterSchema }
export type { ControlLetterFormData }
+25
View File
@@ -0,0 +1,25 @@
import { z } from 'zod'
const ACCEPTED_UPLOAD_TYPES = ['image/jpeg', 'image/png', 'application/pdf']
const MAX_SIZE_BYTES = 1 * 1024 * 1024 // 1MB
const DocumentUploadSchema = z.object({
entityType_code: z.string().default('encounter'),
ref_id: z.number(),
upload_employee_id: z.number().optional(),
// upload_employee_id: z.number(),
name: z.string({ required_error: 'Mohon isi', }),
type_code: z.string({ required_error: 'Mohon isi', }),
content: z.custom<File>()
.refine((f) => f, { message: 'File tidak boleh kosong' })
.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 <= MAX_SIZE_BYTES, { message: 'Maksimal 1MB' }),
})
type DocumentUploadFormData = z.infer<typeof DocumentUploadSchema>
export { DocumentUploadSchema }
export type { DocumentUploadFormData }
+16
View File
@@ -0,0 +1,16 @@
import { z } from 'zod'
import type { CreateDto } from '~/models/general-consent'
const GeneralConsentSchema = z.object({
relatives: z.array(z.object({ name: z.string(), phone: z.string() })),
responsibleName: z.string().optional(),
responsiblePhone: z.string().optional(),
informant: z.string().optional(),
witness1: z.string().optional(),
witness2: z.string().optional(),
})
type GeneralConsentFormData = z.infer<typeof GeneralConsentSchema> & CreateDto
export { GeneralConsentSchema }
export type { GeneralConsentFormData }
@@ -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 }
+255
View File
@@ -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 }
+133
View File
@@ -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 }
+1
View File
@@ -5,6 +5,7 @@ export const MedicineSchema = z.object({
name: z.string({ required_error: 'Nama harus diisi' }).min(1, 'Nama minimal 1 karakter'),
medicineGroup_code: z.string({ required_error: 'Kelompok obat harus diisi' }).min(1, 'Kelompok obat harus diisi'),
medicineMethod_code: z.string({ required_error: 'Metode pemberian harus diisi' }).min(1, 'Metode pemberian harus diisi'),
medicineForm_code: z.string({ required_error: 'Sediaan Obat harus diisi' }).min(1, 'Sediaan Obat harus diisi'),
uom_code: z.string({ required_error: 'Satuan harus diisi' }).min(1, 'Satuan harus diisi'),
infra_id: z.number().nullable().optional(),
stock: z.preprocess((val) => Number(val), z.number({ invalid_type_error: 'Stok harus berupa angka' }).min(1, 'Stok harus lebih besar dari 0')),
+10
View File
@@ -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 }
+11
View File
@@ -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 }
+76
View File
@@ -0,0 +1,76 @@
import { z } from 'zod'
import type { CreateDto } from '~/models/consultation'
export type ResumeArrangementType = "krs" | "mrs" | "rujukInternal" | "rujukExternal" | "meninggal" | "other"
const SecondaryDiagnosisSchema = z.object({
diagnosis: z.string({ required_error: 'Diagnosis harus diisi' }),
icd10: z.string({ required_error: 'ICD 10 harus diisi' }),
diagnosisBasis: z.string({ required_error: 'Dasar Diagnosis harus diisi' })
.min(1, 'Uraian minimum 1 karakter')
.max(2048, 'Uraian maksimum 2048 karakter'),
})
const SecondaryActionSchema = z.object({
action: z.string({ required_error: 'Action harus diisi' }),
icd9: z.string({ required_error: 'ICD 10 harus diisi' }),
actionBasis: z.string({ required_error: 'Dasar Action harus diisi' })
.min(1, 'Uraian minimum 1 karakter')
.max(2048, 'Uraian maksimum 2048 karakter'),
})
const ConsultationSchema = z.object({
consultation: z.string({ required_error: 'Consultation harus diisi' })
.min(1, 'Uraian minimum 1 karakter')
.max(2048, 'Uraian maksimum 2048 karakter'),
consultationReply: z.string({ required_error: 'Jawaban Consultation harus diisi' })
.min(1, 'Uraian minimum 1 karakter')
.max(2048, 'Uraian maksimum 2048 karakter'),
})
const ResumeSchema = z.object({
inDate: z.string({ required_error: 'Tanggal harus diisi' }),
outDate: z.string({ required_error: 'Tanggal harus diisi' }),
anamnesis: z.number({ required_error: 'Anamnesis harus diisi' })
.min(1, 'Anamnesis minimum 1 karakter')
.max(2048, 'Anamnesis maksimum 2048 karakter'),
physicalCheckup: z.string({ required_error: 'Uraian harus diisi' })
.min(1, 'Uraian minimum 1 karakter')
.max(2048, 'Uraian maksimum 2048 karakter'),
supplementCheckup: z.string({ required_error: 'Uraian harus diisi' })
.min(1, 'Uraian minimum 1 karakter')
.max(2048, 'Uraian maksimum 2048 karakter'),
primaryDiagnosis: z.string({ required_error: 'Diagnosis harus diisi' }),
secondaryDiagnosis: z.array(SecondaryDiagnosisSchema).optional(),
primaryOperativeNonOperativeAct: z.string({ required_error: 'Diagnosis harus diisi' }),
secondaryOperativeNonOperativeAct: z.array(SecondaryActionSchema).optional(),
medikamentosa: z.string({ required_error: 'Uraian harus diisi' })
.min(1, 'Uraian minimum 1 karakter')
.max(2048, 'Uraian maksimum 2048 karakter'),
consultation: z.array(ConsultationSchema).optional(),
arrangement: z.custom<ResumeArrangementType>().default("krs"),
inpatientIndication: z.string({ required_error: 'Uraian harus diisi' })
.min(1, 'Uraian minimum 1 karakter')
.max(2048, 'Uraian maksimum 2048 karakter'),
faskes: z.string({ required_error: 'Faskes harus diisi' }).optional(),
clinic: z.string({ required_error: 'Klinik harus diisi' }).optional(),
deathDate: z.string({ required_error: 'Tanggal harus diisi' }).optional(),
deathCause: z.array(z.string()).optional().default([]),
deathCauseDescription: z.string({ required_error: 'Uraian harus diisi' })
.min(1, 'Uraian minimum 1 karakter')
.max(2048, 'Uraian maksimum 2048 karakter')
.optional(),
keterangan: z.string({ required_error: 'Uraian harus diisi' })
.min(1, 'Uraian minimum 1 karakter')
.max(2048, 'Uraian maksimum 2048 karakter')
.optional(),
})
type ResumeFormData = z.infer<typeof ResumeSchema> & (CreateDto)
export { ResumeSchema }
export type { ResumeFormData }
+24
View File
@@ -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 }
+24
View File
@@ -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 }
+19
View File
@@ -0,0 +1,19 @@
import { z } from 'zod'
const VerificationSchema = z.object({
name: z.string({
required_error: 'Mohon lengkapi Nama Anda',
}),
email: z.string({
required_error: 'Mohon lengkapi email',
}),
password: z.string({
required_error: 'Mohon lengkapi password',
}),
})
type VerificationFormData = z.infer<typeof VerificationSchema>
export { VerificationSchema, }
export type { VerificationFormData, }