From d8f2e30bd68767f6bac4c7a4d69515bd857b614c Mon Sep 17 00:00:00 2001 From: riefive Date: Thu, 27 Nov 2025 14:19:58 +0700 Subject: [PATCH] feat: add member validation and enhance encounter entry form with additional fields --- app/components/app/encounter/entry-form.vue | 192 ++++++++++++++++++-- app/components/content/encounter/entry.vue | 6 +- app/handlers/encounter-entry.handler.ts | 27 ++- 3 files changed, 204 insertions(+), 21 deletions(-) diff --git a/app/components/app/encounter/entry-form.vue b/app/components/app/encounter/entry-form.vue index 9cb4d177..420e2a53 100644 --- a/app/components/app/encounter/entry-form.vue +++ b/app/components/app/encounter/entry-form.vue @@ -23,11 +23,12 @@ import { useForm } from 'vee-validate' import { refDebounced } from '@vueuse/core' const props = defineProps<{ + mode?: string isLoading?: boolean isReadonly?: boolean isSepValid?: boolean + isMemberValid?: boolean isCheckingSep?: boolean - mode?: string doctor?: any[] subSpecialist?: any[] specialists?: TreeItem[] @@ -61,6 +62,12 @@ const [patientName, patientNameAttrs] = defineField('patientName') const [nationalIdentity, nationalIdentityAttrs] = defineField('nationalIdentity') const [medicalRecordNumber, medicalRecordNumberAttrs] = defineField('medicalRecordNumber') const patientId = ref('') +const sepReference = ref('') +const sepControlDate = ref('') +const sepTrafficStatus = ref('') +const diagnosis = ref('') +const noteReference = ref('Hanya diperlukan jika pembayaran jenis JKN') +const noteFile = ref('Gunakan file [.pdf, .jpg, .png] dengan ukuran maksimal 1MB') const isLoading = props.isLoading !== undefined ? props.isLoading : false const isReadonly = props.isReadonly !== undefined ? props.isReadonly : false @@ -76,6 +83,8 @@ const doctorOpts = computed(() => { return [...defaultOption, ...doctors] }) const isJKNPayment = computed(() => paymentType.value === 'jkn') +const debouncedSepNumber = refDebounced(sepNumber, 500) +const debouncedCardNumber = refDebounced(cardNumber, 500) if (mode === 'add') { // Set default sepDate to current date in YYYY-MM-DD format @@ -101,12 +110,14 @@ watch(subSpecialistId, async (newValue) => { } }) -// Debounced SEP number watcher: emit change only after user stops typing -const debouncedSepNumber = refDebounced(sepNumber, 500) watch(debouncedSepNumber, (newValue) => { emit('event', 'sep-number-changed', newValue) }) +watch(debouncedCardNumber, (newValue) => { + emit('event', 'member-changed', newValue) +}) + // Sync props to form fields watch( () => props.objects, @@ -123,6 +134,10 @@ watch( cardNumber.value = objects?.cardNumber || '' sepType.value = objects?.sepType || '' sepNumber.value = objects?.sepNumber || '' + sepReference.value = objects?.sepReference || '' + sepControlDate.value = objects?.sepControlDate || '' + sepTrafficStatus.value = objects?.sepTrafficStatus || '' + diagnosis.value = objects?.diagnosis || '' } }, { deep: true, immediate: true }, @@ -141,6 +156,20 @@ watch( { deep: true, immediate: true }, ) +watch( + () => props.isSepValid, + (value) => { + if (!value) return + const objects = props.objects + if (objects && Object.keys(objects).length > 0) { + sepReference.value = objects?.sepReference || '' + sepControlDate.value = objects?.sepControlDate || '' + sepTrafficStatus.value = objects?.sepTrafficStatus || '' + diagnosis.value = objects?.diagnosis || '' + } + } +) + function onAddSep() { const formValues = { patientId: patientId.value || '', @@ -391,6 +420,9 @@ defineExpose({ placeholder="Pilih Kelompok Peserta" /> + + {{ noteReference }} + @@ -407,6 +439,26 @@ defineExpose({ placeholder="Masukkan nomor kartu BPJS" /> +
+ + Aktif +
+
+ + Tidak aktif +
@@ -469,7 +521,19 @@ defineExpose({ /> +