feat(sep): add class form

This commit is contained in:
riefive
2025-10-23 12:15:55 +07:00
parent 891c67d6ff
commit 7f0e7bee4a
5 changed files with 318 additions and 103 deletions

No files matched your search

+79
View File
@@ -36,6 +36,9 @@ const props = defineProps<{
procedures: any[] procedures: any[]
assessments: any[] assessments: any[]
supportCodes: any[] supportCodes: any[]
classLevels: any[]
classLevelUpgrades: any[]
classPaySources: any[]
provinces: any[] provinces: any[]
cities: any[] cities: any[]
districts: any[] districts: any[]
@@ -78,6 +81,10 @@ const [clinicExcecutive, clinicExcecutiveAttrs] = defineField('clinicExcecutive'
const [procedureType, procedureTypeAttrs] = defineField('procedureType') const [procedureType, procedureTypeAttrs] = defineField('procedureType')
const [supportCode, supportCodeAttrs] = defineField('supportCode') const [supportCode, supportCodeAttrs] = defineField('supportCode')
const [note, noteAttrs] = defineField('note') 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 [accident, accidentAttrs] = defineField('trafficAccident')
const [purposeOfVisit, purposeOfVisitAttrs] = defineField('purposeOfVisit') const [purposeOfVisit, purposeOfVisitAttrs] = defineField('purposeOfVisit')
const [serviceAssessment, serviceAssessmentAttrs] = defineField('serviceAssessment') const [serviceAssessment, serviceAssessmentAttrs] = defineField('serviceAssessment')
@@ -469,6 +476,78 @@ watch(props, (value) => {
</Cell> </Cell>
</Block> </Block>
<Block
v-if="serviceType === '1'"
labelSize="thin"
class="!pt-0"
:colCount="3"
:cellFlex="false"
>
<Cell>
<Label height="dynamic">Kelas Rawat</Label>
<Field>
<Select
id="classLevel"
v-model="classLevel"
v-bind="classLevelAttrs"
:items="classLevels"
:disabled="isLoading || isReadonly"
placeholder="Pilih Kelas Rawat"
/>
</Field>
</Cell>
<Cell>
<Label height="dynamic">Kelas Rawat Naik</Label>
<Field>
<Select
id="classLevelUpgrade"
v-model="classLevelUpgrade"
v-bind="classLevelUpgradeAttrs"
:items="classLevelUpgrades"
:disabled="isLoading || isReadonly"
placeholder="Pilih Kelas Rawat Naik"
/>
</Field>
</Cell>
<Cell>
<Label height="dynamic">Pembiayaan</Label>
<Field>
<Select
id="classPaySource"
v-model="classPaySource"
v-bind="classPaySourceAttrs"
:items="classPaySources"
:disabled="isLoading || isReadonly"
placeholder="Pilih Pembiayaan"
/>
</Field>
</Cell>
</Block>
<Block
v-if="serviceType === '1' && classLevelUpgrade !== ''"
labelSize="thin"
class="!pt-0"
:colCount="1"
:cellFlex="false"
>
<Cell>
<Label height="dynamic">Penanggung Jawab</Label>
<Field>
<Input
id="responsiblePerson"
v-model="responsiblePerson"
v-bind="responsiblePersonAttrs"
:disabled="isLoading || isReadonly"
placeholder="Masukkan penanggung jawab"
/>
</Field>
</Cell>
</Block>
<Block <Block
labelSize="thin" labelSize="thin"
class="!pt-0" class="!pt-0"
+21
View File
@@ -20,6 +20,9 @@ import {
supportCodes, supportCodes,
procedureTypes, procedureTypes,
purposeOfVisits, purposeOfVisits,
classLevels,
classLevelUpgrades,
classPaySources,
} from '~/lib/constants.vclaim' } from '~/lib/constants.vclaim'
// Services // Services
@@ -60,6 +63,9 @@ const assessmentsList = ref<Array<{ value: string; label: string }>>([])
const provincesList = ref<Array<{ value: string; label: string }>>([]) const provincesList = ref<Array<{ value: string; label: string }>>([])
const citiesList = ref<Array<{ value: string; label: string }>>([]) const citiesList = ref<Array<{ value: string; label: string }>>([])
const districtsList = ref<Array<{ value: string; label: string }>>([]) const districtsList = ref<Array<{ value: string; label: string }>>([])
const classLevelsList = ref<Array<{ value: string; label: string }>>([])
const classLevelUpgradesList = ref<Array<{ value: string; label: string }>>([])
const classPaySourcesList = ref<Array<{ value: string; label: string }>>([])
const isPatientsLoading = ref(false) const isPatientsLoading = ref(false)
const paginationMeta = ref<PaginationMeta>({ const paginationMeta = ref<PaginationMeta>({
recordCount: 0, recordCount: 0,
@@ -341,6 +347,18 @@ async function handleInit() {
value: item.toString(), value: item.toString(),
label: `${item.toString()} - ${supportCodes[item]}`, label: `${item.toString()} - ${supportCodes[item]}`,
})) as any })) 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 () => { onMounted(async () => {
@@ -376,6 +394,9 @@ onMounted(async () => {
:provinces="provincesList" :provinces="provincesList"
:cities="citiesList" :cities="citiesList"
:districts="districtsList" :districts="districtsList"
:class-levels="classLevelsList"
:class-level-upgrades="classLevelUpgradesList"
:class-pay-sources="classPaySourcesList"
:patient="selectedPatientObject" :patient="selectedPatientObject"
@fetch="handleFetch" @fetch="handleFetch"
@event="handleEvent" @event="handleEvent"
+24 -1
View File
@@ -10,6 +10,29 @@ export const registerMethods: Record<string, string> = {
'4': 'Rujukan Internal', '4': 'Rujukan Internal',
} }
export const classLevels: Record<string, string> = {
'1': 'Kelas 1',
'2': 'Kelas 2',
'3': 'Kelas 3',
}
export const classLevelUpgrades: Record<string, string> = {
'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<string, string> = {
'1': 'Pribadi',
'2': 'Pemberi Kerja',
'3': 'Asuransi Kesehatan Tambahan'
}
export const procedureTypes: Record<string, string> = { export const procedureTypes: Record<string, string> = {
'0': 'Prosedur tidak berkelanjutan', '0': 'Prosedur tidak berkelanjutan',
'1': 'Prosedur dan terapi berkelanjutan', '1': 'Prosedur dan terapi berkelanjutan',
@@ -24,7 +47,7 @@ export const purposeOfVisits: Record<string, string> = {
export const trafficAccidents: Record<string, string> = { export const trafficAccidents: Record<string, string> = {
'0': 'Bukan Kecelakaan lalu lintas [BKLL]', '0': 'Bukan Kecelakaan lalu lintas [BKLL]',
'1': 'KLL dan Bukan Kecelakaan Kerja [BKK]', '1': 'KLL dan Bukan Kecelakaan Kerja [BKK]',
'2': 'KLL', '2': 'KLL dan KK',
'3': 'KK', '3': 'KK',
} }
+192 -100
View File
@@ -33,109 +33,201 @@ const ERROR_MESSAGES = {
accidentDistrict: 'Kecamatan Kejadian lalu lintas wajib diisi', accidentDistrict: 'Kecamatan Kejadian lalu lintas wajib diisi',
suplesi: 'Suplesi wajib diisi', suplesi: 'Suplesi wajib diisi',
suplesiNumber: 'Nomor 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({ const IntegrationBpjsSchema = z
sepDate: z.string({ required_error: ERROR_MESSAGES.required.sepDate }).min(1, ERROR_MESSAGES.required.sepDate), .object({
serviceType: z sepDate: z.string({ required_error: ERROR_MESSAGES.required.sepDate }).min(1, ERROR_MESSAGES.required.sepDate),
.string({ required_error: ERROR_MESSAGES.required.serviceType }) serviceType: z
.min(1, ERROR_MESSAGES.required.serviceType) .string({ required_error: ERROR_MESSAGES.required.serviceType })
.optional(), .min(1, ERROR_MESSAGES.required.serviceType)
admissionType: z .optional(),
.string({ required_error: ERROR_MESSAGES.required.admissionType }) admissionType: z
.min(1, ERROR_MESSAGES.required.admissionType), .string({ required_error: ERROR_MESSAGES.required.admissionType })
bpjsNumber: z .min(1, ERROR_MESSAGES.required.admissionType),
.string({ required_error: ERROR_MESSAGES.required.bpjsNumber }) bpjsNumber: z
.min(1, ERROR_MESSAGES.required.bpjsNumber), .string({ required_error: ERROR_MESSAGES.required.bpjsNumber })
nationalId: z .min(1, ERROR_MESSAGES.required.bpjsNumber),
.string({ required_error: ERROR_MESSAGES.required.nationalId }) nationalId: z
.min(1, ERROR_MESSAGES.required.nationalId), .string({ required_error: ERROR_MESSAGES.required.nationalId })
medicalRecordNumber: z .min(1, ERROR_MESSAGES.required.nationalId),
.string({ required_error: ERROR_MESSAGES.required.medicalRecordNumber }) medicalRecordNumber: z
.min(1, ERROR_MESSAGES.required.medicalRecordNumber), .string({ required_error: ERROR_MESSAGES.required.medicalRecordNumber })
patientName: z .min(1, ERROR_MESSAGES.required.medicalRecordNumber),
.string({ required_error: ERROR_MESSAGES.required.patientName }) patientName: z
.min(1, ERROR_MESSAGES.required.patientName), .string({ required_error: ERROR_MESSAGES.required.patientName })
phoneNumber: z .min(1, ERROR_MESSAGES.required.patientName),
.string({ required_error: ERROR_MESSAGES.required.phoneNumber }) phoneNumber: z
.min(1, ERROR_MESSAGES.required.phoneNumber), .string({ required_error: ERROR_MESSAGES.required.phoneNumber })
referralLetterNumber: z .min(1, ERROR_MESSAGES.required.phoneNumber),
.string({ required_error: ERROR_MESSAGES.required.referralLetterNumber }) referralLetterNumber: z
.min(1, ERROR_MESSAGES.required.referralLetterNumber), .string({ required_error: ERROR_MESSAGES.required.referralLetterNumber })
referralLetterDate: z .min(1, ERROR_MESSAGES.required.referralLetterNumber),
.string({ required_error: ERROR_MESSAGES.required.referralLetterDate }) referralLetterDate: z
.min(1, ERROR_MESSAGES.required.referralLetterDate), .string({ required_error: ERROR_MESSAGES.required.referralLetterDate })
fromClinic: z .min(1, ERROR_MESSAGES.required.referralLetterDate),
.string({ required_error: ERROR_MESSAGES.required.fromClinic }) fromClinic: z
.min(1, ERROR_MESSAGES.required.fromClinic) .string({ required_error: ERROR_MESSAGES.required.fromClinic })
.optional(), .min(1, ERROR_MESSAGES.required.fromClinic)
destinationClinic: z .optional(),
.string({ required_error: ERROR_MESSAGES.required.destinationClinic }) destinationClinic: z
.min(1, ERROR_MESSAGES.required.destinationClinic), .string({ required_error: ERROR_MESSAGES.required.destinationClinic })
attendingDoctor: z .min(1, ERROR_MESSAGES.required.destinationClinic),
.string({ required_error: ERROR_MESSAGES.required.attendingDoctor }) attendingDoctor: z
.min(1, ERROR_MESSAGES.required.attendingDoctor), .string({ required_error: ERROR_MESSAGES.required.attendingDoctor })
initialDiagnosis: z .min(1, ERROR_MESSAGES.required.attendingDoctor),
.string({ required_error: ERROR_MESSAGES.required.initialDiagnosis }) initialDiagnosis: z
.min(1, ERROR_MESSAGES.required.initialDiagnosis), .string({ required_error: ERROR_MESSAGES.required.initialDiagnosis })
cob: z.string({ required_error: ERROR_MESSAGES.required.cob }).min(1, ERROR_MESSAGES.required.cob), .min(1, ERROR_MESSAGES.required.initialDiagnosis),
cataract: z.string({ required_error: ERROR_MESSAGES.required.cataract }).min(1, ERROR_MESSAGES.required.cataract), cob: z.string({ required_error: ERROR_MESSAGES.required.cob }).min(1, ERROR_MESSAGES.required.cob),
clinicExcecutive: z cataract: z.string({ required_error: ERROR_MESSAGES.required.cataract }).min(1, ERROR_MESSAGES.required.cataract),
.string({ required_error: ERROR_MESSAGES.required.clinicExcecutive }) clinicExcecutive: z
.min(1, ERROR_MESSAGES.required.clinicExcecutive), .string({ required_error: ERROR_MESSAGES.required.clinicExcecutive })
procedureType: z .min(1, ERROR_MESSAGES.required.clinicExcecutive),
.string({ required_error: ERROR_MESSAGES.required.procedureType }) procedureType: z
.min(1, ERROR_MESSAGES.required.procedureType).optional(), .string({ required_error: ERROR_MESSAGES.required.procedureType })
supportCode: z .min(1, ERROR_MESSAGES.required.procedureType)
.string({ required_error: ERROR_MESSAGES.required.supportCode }) .optional(),
.min(1, ERROR_MESSAGES.required.supportCode).optional(), supportCode: z
note: z.string({ required_error: ERROR_MESSAGES.required.note }).min(1, ERROR_MESSAGES.required.note).optional(), .string({ required_error: ERROR_MESSAGES.required.supportCode })
trafficAccident: z .min(1, ERROR_MESSAGES.required.supportCode)
.string({ required_error: ERROR_MESSAGES.required.trafficAccident }) .optional(),
.min(1, ERROR_MESSAGES.required.trafficAccident) note: z.string({ required_error: ERROR_MESSAGES.required.note }).min(1, ERROR_MESSAGES.required.note).optional(),
.optional(), trafficAccident: z
purposeOfVisit: z .string({ required_error: ERROR_MESSAGES.required.trafficAccident })
.string({ required_error: ERROR_MESSAGES.required.purposeOfVisit }) .min(1, ERROR_MESSAGES.required.trafficAccident)
.min(1, ERROR_MESSAGES.required.purposeOfVisit) .optional(),
.optional(), purposeOfVisit: z
serviceAssessment: z .string({ required_error: ERROR_MESSAGES.required.purposeOfVisit })
.string({ required_error: ERROR_MESSAGES.required.serviceAssessment }) .min(1, ERROR_MESSAGES.required.purposeOfVisit)
.min(1, ERROR_MESSAGES.required.serviceAssessment) .optional(),
.optional(), serviceAssessment: z
lpNumber: z .string({ required_error: ERROR_MESSAGES.required.serviceAssessment })
.string({ required_error: ERROR_MESSAGES.required.lpNumber }) .min(1, ERROR_MESSAGES.required.serviceAssessment)
.min(1, ERROR_MESSAGES.required.lpNumber) .optional(),
.optional(), lpNumber: z.string({ required_error: ERROR_MESSAGES.required.lpNumber }).optional(),
accidentDate: z accidentDate: z.string({ required_error: ERROR_MESSAGES.required.accidentDate }).optional(),
.string({ required_error: ERROR_MESSAGES.required.accidentDate }) accidentNote: z.string({ required_error: ERROR_MESSAGES.required.accidentNote }).optional(),
.min(1, ERROR_MESSAGES.required.accidentDate) accidentProvince: z.string({ required_error: ERROR_MESSAGES.required.accidentProvince }).optional(),
.optional(), accidentCity: z.string({ required_error: ERROR_MESSAGES.required.accidentCity }).optional(),
accidentNote: z accidentDistrict: z.string({ required_error: ERROR_MESSAGES.required.accidentDistrict }).optional(),
.string({ required_error: ERROR_MESSAGES.required.accidentNote }) suplesi: z.string({ required_error: ERROR_MESSAGES.required.suplesi }).optional(),
.min(1, ERROR_MESSAGES.required.accidentNote) suplesiNumber: z.string({ required_error: ERROR_MESSAGES.required.suplesiNumber }).optional(),
.optional(), classLevel: z.string({ required_error: ERROR_MESSAGES.required.classLevel }).optional(),
accidentProvince: z classLevelUpgrade: z.string({ required_error: ERROR_MESSAGES.required.classLevelUpgrade }).optional(),
.string({ required_error: ERROR_MESSAGES.required.accidentProvince }) classPaySource: z.string({ required_error: ERROR_MESSAGES.required.classPaySource }).optional(),
.min(1, ERROR_MESSAGES.required.accidentProvince) responsiblePerson: z.string({ required_error: ERROR_MESSAGES.required.responsiblePerson }).optional(),
.optional(), })
accidentCity: z .refine(
.string({ required_error: ERROR_MESSAGES.required.accidentCity }) (data) => {
.min(1, ERROR_MESSAGES.required.accidentCity) return data.trafficAccident !== '' && data.accidentDate && data.accidentDate.trim() !== ''
.optional(), },
accidentDistrict: z {
.string({ required_error: ERROR_MESSAGES.required.accidentDistrict }) message: ERROR_MESSAGES.required.accidentDate,
.min(1, ERROR_MESSAGES.required.accidentDistrict) path: ['accidentDate'],
.optional(), },
suplesi: z )
.string({ required_error: ERROR_MESSAGES.required.suplesi }) .refine(
.min(1, ERROR_MESSAGES.required.suplesi) (data) => {
.optional(), return data.trafficAccident !== '' && data.accidentProvince && data.accidentProvince.trim() !== ''
suplesiNumber: z },
.string({ required_error: ERROR_MESSAGES.required.suplesiNumber }) {
.min(1, ERROR_MESSAGES.required.suplesiNumber) message: ERROR_MESSAGES.required.accidentProvince,
.optional(), 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<typeof IntegrationBpjsSchema> type IntegrationBpjsFormData = z.infer<typeof IntegrationBpjsSchema>
+2 -2
View File
@@ -53,8 +53,8 @@ export function makeSepData(data: IntegrationBpjsFormData) {
kdPenunjang: data.supportCode || '', kdPenunjang: data.supportCode || '',
assesmentPel: data.serviceAssessment || '', assesmentPel: data.serviceAssessment || '',
skdp: { skdp: {
noSurat: '0208R0060825K000001', noSurat: '', // 0208R0060825K000001
kodeDPJP: '6546', kodeDPJP: '', // 6546
}, },
dpjpLayan: '000002', dpjpLayan: '000002',
noTelp: data.phoneNumber || '', noTelp: data.phoneNumber || '',