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
+79
View File
@@ -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) => {
</Cell>
</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
labelSize="thin"
class="!pt-0"
+21
View File
@@ -20,6 +20,9 @@ import {
supportCodes,
procedureTypes,
purposeOfVisits,
classLevels,
classLevelUpgrades,
classPaySources,
} from '~/lib/constants.vclaim'
// Services
@@ -60,6 +63,9 @@ const assessmentsList = ref<Array<{ value: string; label: string }>>([])
const provincesList = ref<Array<{ value: string; label: string }>>([])
const citiesList = 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 paginationMeta = ref<PaginationMeta>({
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"
+24 -1
View File
@@ -10,6 +10,29 @@ export const registerMethods: Record<string, string> = {
'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> = {
'0': 'Prosedur tidak berkelanjutan',
'1': 'Prosedur dan terapi berkelanjutan',
@@ -24,7 +47,7 @@ export const purposeOfVisits: Record<string, string> = {
export const trafficAccidents: Record<string, string> = {
'0': 'Bukan Kecelakaan lalu lintas [BKLL]',
'1': 'KLL dan Bukan Kecelakaan Kerja [BKK]',
'2': 'KLL',
'2': 'KLL dan KK',
'3': 'KK',
}
+192 -100
View File
@@ -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<typeof IntegrationBpjsSchema>
+2 -2
View File
@@ -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 || '',