From 630cda65af657e907beeeba66f5db1e0cc0c69f5 Mon Sep 17 00:00:00 2001 From: riefive Date: Fri, 7 Nov 2025 15:37:45 +0700 Subject: [PATCH] feat(sep): search member through vclaim --- app/components/app/encounter/entry-form.vue | 14 ++-- app/components/app/sep/entry-form.vue | 22 +++--- app/components/content/sep/entry.vue | 76 ++++++++++++++++----- app/schemas/integration-bpjs.schema.ts | 8 +-- app/schemas/integration-encounter.schema.ts | 14 ++-- 5 files changed, 87 insertions(+), 47 deletions(-) diff --git a/app/components/app/encounter/entry-form.vue b/app/components/app/encounter/entry-form.vue index 1ac00703..a735a554 100644 --- a/app/components/app/encounter/entry-form.vue +++ b/app/components/app/encounter/entry-form.vue @@ -50,7 +50,7 @@ const [subSpecialistId, subSpecialistIdAttrs] = defineField('subSpecialistId') const [registerDate, registerDateAttrs] = defineField('registerDate') const [paymentType, paymentTypeAttrs] = defineField('paymentType') const [patientCategory, patientCategoryAttrs] = defineField('patientCategory') -const [bpjsNumber, bpjsNumberAttrs] = defineField('bpjsNumber') +const [cardNumber, cardNumberAttrs] = defineField('cardNumber') const [sepType, sepTypeAttrs] = defineField('sepType') const [sepNumber, sepNumberAttrs] = defineField('sepNumber') const [patientName, patientNameAttrs] = defineField('patientName') @@ -100,7 +100,7 @@ watch(props, (value) => { registerDate.value = objects?.registerDate || '' paymentType.value = objects?.paymentType || '' patientCategory.value = objects?.patientCategory || '' - bpjsNumber.value = objects?.bpjsNumber || '' + cardNumber.value = objects?.cardNumber || '' sepType.value = objects?.sepType || '' sepNumber.value = objects?.sepNumber || '' } @@ -119,7 +119,7 @@ function onAddSep() { doctorCode: doctorId.value, subSpecialistCode: subSpecialistId.value, registerDate: registerDate.value, - cardNumber: bpjsNumber.value, + cardNumber: cardNumber.value, paymentType: paymentType.value, sepType: sepType.value } @@ -331,11 +331,11 @@ const onSubmit = handleSubmit((values) => { No. Kartu BPJS * - + diff --git a/app/components/app/sep/entry-form.vue b/app/components/app/sep/entry-form.vue index 914f7860..0a646cd4 100644 --- a/app/components/app/sep/entry-form.vue +++ b/app/components/app/sep/entry-form.vue @@ -67,7 +67,7 @@ const { handleSubmit, errors, defineField } = useForm({ const [sepDate, sepDateAttrs] = defineField('sepDate') const [serviceType, serviceTypeAttrs] = defineField('serviceType') const [admissionType, admissionTypeAttrs] = defineField('admissionType') -const [bpjsNumber, bpjsNumberAttrs] = defineField('bpjsNumber') +const [cardNumber, cardNumberAttrs] = defineField('cardNumber') const [nationalId, nationalIdAttrs] = defineField('nationalId') const [medicalRecordNumber, medicalRecordNumberAttrs] = defineField('medicalRecordNumber') const [patientName, patientNameAttrs] = defineField('patientName') @@ -115,7 +115,7 @@ const isShowPatient = ref(props.isShowPatient || false) const isDateReload = ref(false) // Debounced search for bpjsNumber and nationalId -const debouncedBpjsNumber = refDebounced(bpjsNumber, 500) +const debouncedCardNumber = refDebounced(cardNumber, 500) const debouncedNationalId = refDebounced(nationalId, 500) if (mode === 'add') { @@ -142,7 +142,7 @@ watch(props, (value) => { const objects = value.objects || ({} as any) if (Object.keys(objects).length > 0) { sepDate.value = objects?.registerDate || new Date().toISOString().substring(0, 10) - bpjsNumber.value = objects?.bpjsNumber || '-' + cardNumber.value = objects?.cardNumber || '-' nationalId.value = objects?.nationalIdentity || '-' medicalRecordNumber.value = objects?.medicalRecordNumber || '-' patientName.value = objects?.patientName || '-' @@ -161,7 +161,7 @@ watch(props, (value) => { }, 100) } if (Object.keys(patient).length > 0) { - bpjsNumber.value = '-' + cardNumber.value = '-' nationalId.value = patient?.person?.residentIdentityNumber || '-' medicalRecordNumber.value = patient?.number || '-' patientName.value = patient?.person?.name || '-' @@ -170,15 +170,15 @@ watch(props, (value) => { }) // Watch debounced search values -watch(debouncedBpjsNumber, (newValue) => { +watch(debouncedCardNumber, (newValue) => { if (newValue && newValue !== '-' && newValue.length >= 3) { - emit('event', 'search-patient-by-identifier', { text: newValue, type: 'bpjs' }) + emit('event', 'search-patient-by-identifier', { text: newValue, type: 'cardNumber' }) } }) watch(debouncedNationalId, (newValue) => { if (newValue && newValue !== '-' && newValue.length >= 3) { - emit('event', 'search-patient-by-identifier', { text: newValue, type: 'nationalId' }) + emit('event', 'search-patient-by-identifier', { text: newValue, type: 'indentity' }) } }) @@ -282,11 +282,11 @@ onMounted(() => { No. Kartu BPJS * - + diff --git a/app/components/content/sep/entry.vue b/app/components/content/sep/entry.vue index 4518df27..143948a1 100644 --- a/app/components/content/sep/entry.vue +++ b/app/components/content/sep/entry.vue @@ -186,7 +186,6 @@ async function getLetterMappers(admissionType: string, search: string) { // "penanggungJawab": "" // }, - letters.value = [ { letterNumber: lettersRaw?.rujukan?.noKunjungan || '', @@ -206,18 +205,39 @@ async function getLetterMappers(admissionType: string, search: string) { patientName: lettersRaw?.rujukan?.peserta?.nama || '', patientPhone: lettersRaw?.rujukan?.peserta?.mr?.noTelepon || '', medicalRecordNumber: lettersRaw?.rujukan?.peserta?.mr?.noMR || '', - } + }, }, ] } } } -function handleSavePatient() { - selectedPatientObject.value = null - setTimeout(() => { - getPatientCurrent(selectedPatient.value) - }, 150) +async function getPatientInternalMappers(id: string) { + try { + await getPatientCurrent(id) + if (selectedPatientObject.value) { + const patient = selectedPatientObject.value + selectedObjects.value['cardNumber'] = '-' + selectedObjects.value['patientName'] = patient?.person?.name || '-' + selectedObjects.value['nationalIdentity'] = patient?.person?.residentIdentityNumber || '-' + selectedObjects.value['medicalRecordNumber'] = patient?.number || '-' + selectedObjects.value['phoneNumber'] = patient?.person?.contacts?.[0]?.value || '-' + } + } catch (err) { + console.error('Failed to load patient from query params:', err) + } +} + +async function getPatientExternalMappers(id: string, type: string) { + try { + const resultMember = await getMemberList({ + mode: type, + number: id, + date: new Date().toISOString().substring(0, 10), + }) + } catch (err) { + console.error('Failed to load patient from query params:', err) + } } function handleSaveLetter() { @@ -228,6 +248,11 @@ function handleSaveLetter() { } } +async function handleSavePatient() { + selectedPatientObject.value = null + await getPatientInternalMappers(selectedPatient.value) +} + async function handleEvent(menu: string, value: any) { if (menu === 'admission-type') { selectedAdmissionType.value = value @@ -251,8 +276,22 @@ async function handleEvent(menu: string, value: any) { const text = value.text const type = value.type const prevCardNumber = selectedPatientObject.value?.person?.residentIdentityNumber || '' - if (type === 'nationalId' && text !== prevCardNumber) { - getPatientByIdentifierSearch(text) + if (type === 'indentity' && text !== prevCardNumber) { + await getPatientByIdentifierSearch(text) + const resultMember = await getMemberList({ + mode: 'by-identity', + number: text, + date: new Date().toISOString().substring(0, 10), + }) + console.log(resultMember) + } + if (type === 'cardNumber' && text !== prevCardNumber) { + const resultMember = await getMemberList({ + mode: 'by-card', + number: text, + date: new Date().toISOString().substring(0, 10), + }) + console.log(resultMember) } return } @@ -419,20 +458,22 @@ async function handleInit() { if (queries['doctor-code']) selectedObjects.value['doctorCode'] = queries['doctor-code'] if (queries['specialist-code']) selectedObjects.value['subSpecialistCode'] = queries['specialist-code'] if (queries['sub-specialist-code']) selectedObjects.value['subSpecialistCode'] = queries['sub-specialist-code'] - if (queries['bpjs-number']) selectedObjects.value['bpjsNumber'] = queries['bpjs-number'] + if (queries['card-number']) selectedObjects.value['cardNumber'] = queries['card-number'] if (queries['register-date']) selectedObjects.value['registerDate'] = queries['register-date'] if (queries['sep-type']) selectedObjects.value['sepType'] = queries['sep-type'] if (queries['sep-number']) selectedObjects.value['sepNumber'] = queries['sep-number'] if (queries['register-date']) selectedObjects.value['registerDate'] = queries['register-date'] if (queries['payment-type']) selectedObjects.value['paymentType'] = queries['payment-type'] - // Load patient data if identifier is provided if (queries['patient-id']) { - try { - await getPatientCurrent(queries['patient-id']) - console.log(selectedPatientObject.value) - } catch (err) { - console.error('Failed to load patient from query params:', err) - } + await getPatientInternalMappers(queries['patient-id']) + } + if (queries['card-number']) { + const resultMember = await getMemberList({ + mode: 'by-card', + number: queries['card-number'], + date: new Date().toISOString().substring(0, 10), + }) + console.log(resultMember) } delete selectedObjects.value['is-service'] } @@ -473,7 +514,6 @@ onMounted(async () => { :class-level-upgrades="classLevelUpgradesList" :class-pay-sources="classPaySourcesList" :specialists="specialistsTree" - :patient="selectedPatientObject" :objects="selectedObjects" @fetch="handleFetch" @event="handleEvent" diff --git a/app/schemas/integration-bpjs.schema.ts b/app/schemas/integration-bpjs.schema.ts index 2a0626b9..47206edf 100644 --- a/app/schemas/integration-bpjs.schema.ts +++ b/app/schemas/integration-bpjs.schema.ts @@ -5,7 +5,7 @@ const ERROR_MESSAGES = { sepDate: 'Tanggal wajib diisi', serviceType: 'Jenis Pelayanan wajib diisi', admissionType: 'Jenis Pendaftaran wajib diisi', - bpjsNumber: 'No. Kartu BPJS wajib diisi', + cardNumber: 'No. Kartu BPJS wajib diisi', nationalId: 'Nomor ID wajib diisi', medicalRecordNumber: 'Nomor Rekam Medis wajib diisi', patientName: 'Nama wajib diisi', @@ -51,9 +51,9 @@ const IntegrationBpjsSchema = z 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), + 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), diff --git a/app/schemas/integration-encounter.schema.ts b/app/schemas/integration-encounter.schema.ts index 7f76a792..32327328 100644 --- a/app/schemas/integration-encounter.schema.ts +++ b/app/schemas/integration-encounter.schema.ts @@ -7,7 +7,7 @@ const ERROR_MESSAGES = { paymentType: 'Jenis Pembayaran wajib diisi', subSpecialistId: 'Subspesialis wajib diisi', patientCategory: 'Kelompok Peserta wajib diisi', - bpjsNumber: 'No. Kartu BPJS wajib diisi', + cardNumber: 'No. Kartu BPJS wajib diisi', sepType: 'Jenis SEP wajib diisi', sepNumber: 'No. SEP wajib diisi', }, @@ -42,9 +42,9 @@ const IntegrationEncounterSchema = z .string() .min(1, ERROR_MESSAGES.required.patientCategory) .optional(), - bpjsNumber: z + cardNumber: z .string() - .min(1, ERROR_MESSAGES.required.bpjsNumber) + .min(1, ERROR_MESSAGES.required.cardNumber) .optional(), sepType: z .string() @@ -88,15 +88,15 @@ const IntegrationEncounterSchema = z ) .refine( (data) => { - // If payment type is jkn, then bpjs number is required + // If payment type is jkn, then card number is required if (data.paymentType === 'jkn') { - return data.bpjsNumber && data.bpjsNumber.trim() !== '' + return data.cardNumber && data.cardNumber.trim() !== '' } return true }, { - message: ERROR_MESSAGES.required.bpjsNumber, - path: ['bpjsNumber'], + message: ERROR_MESSAGES.required.cardNumber, + path: ['cardNumber'], }, ) .refine(