From 7f0e7bee4a24a5f22bf32eac4d584a19a29afbfb Mon Sep 17 00:00:00 2001 From: riefive Date: Thu, 23 Oct 2025 12:15:55 +0700 Subject: [PATCH] feat(sep): add class form --- app/components/app/sep/entry-form.vue | 79 +++++++ app/components/content/sep/entry.vue | 21 ++ app/lib/constants.vclaim.ts | 25 ++- app/schemas/integration-bpjs.schema.ts | 292 ++++++++++++++++--------- app/services/vclaim-sep.service.ts | 4 +- 5 files changed, 318 insertions(+), 103 deletions(-) diff --git a/app/components/app/sep/entry-form.vue b/app/components/app/sep/entry-form.vue index 1ef55b58..bfef617c 100644 --- a/app/components/app/sep/entry-form.vue +++ b/app/components/app/sep/entry-form.vue @@ -36,6 +36,9 @@ const props = defineProps<{ procedures: any[] assessments: any[] supportCodes: any[] + classLevels: any[] + classLevelUpgrades: any[] + classPaySources: any[] provinces: any[] cities: any[] districts: any[] @@ -78,6 +81,10 @@ const [clinicExcecutive, clinicExcecutiveAttrs] = defineField('clinicExcecutive' const [procedureType, procedureTypeAttrs] = defineField('procedureType') const [supportCode, supportCodeAttrs] = defineField('supportCode') const [note, noteAttrs] = defineField('note') +const [classLevel, classLevelAttrs] = defineField('classLevel') +const [classLevelUpgrade, classLevelUpgradeAttrs] = defineField('classLevelUpgrade') +const [classPaySource, classPaySourceAttrs] = defineField('classPaySource') +const [responsiblePerson, responsiblePersonAttrs] = defineField('responsiblePerson') const [accident, accidentAttrs] = defineField('trafficAccident') const [purposeOfVisit, purposeOfVisitAttrs] = defineField('purposeOfVisit') const [serviceAssessment, serviceAssessmentAttrs] = defineField('serviceAssessment') @@ -469,6 +476,78 @@ watch(props, (value) => { + + + + + + + + + + + + + + + + + >([]) const provincesList = ref>([]) const citiesList = ref>([]) const districtsList = ref>([]) +const classLevelsList = ref>([]) +const classLevelUpgradesList = ref>([]) +const classPaySourcesList = ref>([]) const isPatientsLoading = ref(false) const paginationMeta = ref({ recordCount: 0, @@ -341,6 +347,18 @@ async function handleInit() { value: item.toString(), label: `${item.toString()} - ${supportCodes[item]}`, })) as any + classLevelsList.value = Object.keys(classLevels).map((item) => ({ + value: item.toString(), + label: classLevels[item], + })) as any + classLevelUpgradesList.value = Object.keys(classLevelUpgrades).map((item) => ({ + value: item.toString(), + label: classLevelUpgrades[item], + })) as any + classPaySourcesList.value = Object.keys(classPaySources).map((item) => ({ + value: item.toString(), + label: classPaySources[item], + })) as any } onMounted(async () => { @@ -376,6 +394,9 @@ onMounted(async () => { :provinces="provincesList" :cities="citiesList" :districts="districtsList" + :class-levels="classLevelsList" + :class-level-upgrades="classLevelUpgradesList" + :class-pay-sources="classPaySourcesList" :patient="selectedPatientObject" @fetch="handleFetch" @event="handleEvent" diff --git a/app/lib/constants.vclaim.ts b/app/lib/constants.vclaim.ts index bc8162be..f3022fe4 100644 --- a/app/lib/constants.vclaim.ts +++ b/app/lib/constants.vclaim.ts @@ -10,6 +10,29 @@ export const registerMethods: Record = { '4': 'Rujukan Internal', } +export const classLevels: Record = { + '1': 'Kelas 1', + '2': 'Kelas 2', + '3': 'Kelas 3', +} + +export const classLevelUpgrades: Record = { + '1': 'VVIP', + '2': 'VIP', + '3': 'Kelas 1', + '4': 'Kelas 2', + '5': 'Kelas 3', + '6': 'ICCU', + '7': 'ICU', + '8': 'Diatas Kelas 1', +}; + +export const classPaySources: Record = { + '1': 'Pribadi', + '2': 'Pemberi Kerja', + '3': 'Asuransi Kesehatan Tambahan' +} + export const procedureTypes: Record = { '0': 'Prosedur tidak berkelanjutan', '1': 'Prosedur dan terapi berkelanjutan', @@ -24,7 +47,7 @@ export const purposeOfVisits: Record = { export const trafficAccidents: Record = { '0': 'Bukan Kecelakaan lalu lintas [BKLL]', '1': 'KLL dan Bukan Kecelakaan Kerja [BKK]', - '2': 'KLL', + '2': 'KLL dan KK', '3': 'KK', } diff --git a/app/schemas/integration-bpjs.schema.ts b/app/schemas/integration-bpjs.schema.ts index 57e4d56f..c98c32de 100644 --- a/app/schemas/integration-bpjs.schema.ts +++ b/app/schemas/integration-bpjs.schema.ts @@ -33,109 +33,201 @@ const ERROR_MESSAGES = { 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), - bpjsNumber: z - .string({ required_error: ERROR_MESSAGES.required.bpjsNumber }) - .min(1, ERROR_MESSAGES.required.bpjsNumber), - 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), - referralLetterDate: z - .string({ required_error: ERROR_MESSAGES.required.referralLetterDate }) - .min(1, ERROR_MESSAGES.required.referralLetterDate), - 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), - 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 }) - .min(1, ERROR_MESSAGES.required.lpNumber) - .optional(), - accidentDate: z - .string({ required_error: ERROR_MESSAGES.required.accidentDate }) - .min(1, ERROR_MESSAGES.required.accidentDate) - .optional(), - accidentNote: z - .string({ required_error: ERROR_MESSAGES.required.accidentNote }) - .min(1, ERROR_MESSAGES.required.accidentNote) - .optional(), - accidentProvince: z - .string({ required_error: ERROR_MESSAGES.required.accidentProvince }) - .min(1, ERROR_MESSAGES.required.accidentProvince) - .optional(), - accidentCity: z - .string({ required_error: ERROR_MESSAGES.required.accidentCity }) - .min(1, ERROR_MESSAGES.required.accidentCity) - .optional(), - accidentDistrict: z - .string({ required_error: ERROR_MESSAGES.required.accidentDistrict }) - .min(1, ERROR_MESSAGES.required.accidentDistrict) - .optional(), - suplesi: z - .string({ required_error: ERROR_MESSAGES.required.suplesi }) - .min(1, ERROR_MESSAGES.required.suplesi) - .optional(), - suplesiNumber: z - .string({ required_error: ERROR_MESSAGES.required.suplesiNumber }) - .min(1, ERROR_MESSAGES.required.suplesiNumber) - .optional(), -}) +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), + bpjsNumber: z + .string({ required_error: ERROR_MESSAGES.required.bpjsNumber }) + .min(1, ERROR_MESSAGES.required.bpjsNumber), + 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), + referralLetterDate: z + .string({ required_error: ERROR_MESSAGES.required.referralLetterDate }) + .min(1, ERROR_MESSAGES.required.referralLetterDate), + 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), + 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) => { + return data.trafficAccident !== '' && data.accidentDate && data.accidentDate.trim() !== '' + }, + { + message: ERROR_MESSAGES.required.accidentDate, + path: ['accidentDate'], + }, + ) + .refine( + (data) => { + return data.trafficAccident !== '' && data.accidentProvince && data.accidentProvince.trim() !== '' + }, + { + message: ERROR_MESSAGES.required.accidentProvince, + path: ['accidentProvince'], + }, + ) + .refine( + (data) => { + return data.trafficAccident !== '' && data.accidentCity && data.accidentCity.trim() !== '' + }, + { + message: ERROR_MESSAGES.required.accidentCity, + path: ['accidentCity'], + }, + ) + .refine( + (data) => { + return data.trafficAccident !== '' && data.accidentDistrict && data.accidentDistrict.trim() !== '' + }, + { + message: ERROR_MESSAGES.required.accidentDistrict, + path: ['accidentDistrict'], + }, + ) + .refine( + (data) => { + return data.trafficAccident !== '' && data.suplesi && data.suplesi.trim() !== '' + }, + { + message: ERROR_MESSAGES.required.suplesi, + path: ['suplesi'], + }, + ) + .refine( + (data) => { + return ( + data.trafficAccident !== '' && + data.suplesi?.trim() === 'yes' && + data.suplesiNumber && + data.suplesiNumber.trim() !== '' + ) + }, + { + message: ERROR_MESSAGES.required.suplesiNumber, + path: ['suplesiNumber'], + }, + ) + .refine( + (data) => { + return data.serviceType === '1' && data.classLevel && data.classLevel.trim() !== '' + }, + { + message: ERROR_MESSAGES.required.classLevel, + path: ['classLevel'], + }, + ) + .refine( + (data) => { + return data.serviceType === '1' && data.classLevelUpgrade && data.classLevelUpgrade.trim() !== '' + }, + { + message: ERROR_MESSAGES.required.classLevelUpgrade, + path: ['classLevelUpgrade'], + }, + ) + .refine( + (data) => { + return ( + data.serviceType === '1' && + data.classLevelUpgrade?.trim() !== '' && + data.classPaySource && + data.classPaySource.trim() !== '' + ) + }, + { + message: ERROR_MESSAGES.required.classLevelUpgrade, + path: ['classPaySource'], + }, + ) + .refine( + (data) => { + return ( + data.serviceType === '1' && + data.classPaySource?.trim() !== '' && + data.responsiblePerson && + data.responsiblePerson.trim() !== '' + ) + }, + { + message: ERROR_MESSAGES.required.responsiblePerson, + path: ['responsiblePerson'], + }, + ) type IntegrationBpjsFormData = z.infer diff --git a/app/services/vclaim-sep.service.ts b/app/services/vclaim-sep.service.ts index b54f278f..efda6160 100644 --- a/app/services/vclaim-sep.service.ts +++ b/app/services/vclaim-sep.service.ts @@ -53,8 +53,8 @@ export function makeSepData(data: IntegrationBpjsFormData) { kdPenunjang: data.supportCode || '', assesmentPel: data.serviceAssessment || '', skdp: { - noSurat: '0208R0060825K000001', - kodeDPJP: '6546', + noSurat: '', // 0208R0060825K000001 + kodeDPJP: '', // 6546 }, dpjpLayan: '000002', noTelp: data.phoneNumber || '',