-
diff --git a/app/pages/(features)/integration/bpjs/control-letter/index.vue b/app/pages/(features)/integration/bpjs-vclaim/control-letter/index.vue
similarity index 100%
rename from app/pages/(features)/integration/bpjs/control-letter/index.vue
rename to app/pages/(features)/integration/bpjs-vclaim/control-letter/index.vue
diff --git a/app/pages/(features)/integration/bpjs/sep/add.vue b/app/pages/(features)/integration/bpjs-vclaim/sep/add.vue
similarity index 100%
rename from app/pages/(features)/integration/bpjs/sep/add.vue
rename to app/pages/(features)/integration/bpjs-vclaim/sep/add.vue
diff --git a/app/pages/(features)/integration/bpjs/sep/index.vue b/app/pages/(features)/integration/bpjs-vclaim/sep/index.vue
similarity index 100%
rename from app/pages/(features)/integration/bpjs/sep/index.vue
rename to app/pages/(features)/integration/bpjs-vclaim/sep/index.vue
diff --git a/app/pages/(features)/outpatient/encounter/[id]/detail.vue b/app/pages/(features)/outpatient/encounter/[id]/detail.vue
new file mode 100644
index 00000000..534f49b3
--- /dev/null
+++ b/app/pages/(features)/outpatient/encounter/[id]/detail.vue
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
diff --git a/app/pages/(features)/patient/[id]/detail.vue b/app/pages/(features)/patient/[id]/detail.vue
deleted file mode 100644
index 33a36f0f..00000000
--- a/app/pages/(features)/patient/[id]/detail.vue
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
- detail pasien
-
diff --git a/app/pages/(features)/patient/[id]/edit.vue b/app/pages/(features)/patient/[id]/edit.vue
deleted file mode 100644
index 2b7e8a31..00000000
--- a/app/pages/(features)/patient/[id]/edit.vue
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
- edit pasien
-
diff --git a/app/pages/(features)/patient/add.vue b/app/pages/(features)/patient/add.vue
deleted file mode 100644
index 412c2b3e..00000000
--- a/app/pages/(features)/patient/add.vue
+++ /dev/null
@@ -1,41 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/app/pages/(features)/rehab/encounter-queue/index.vue b/app/pages/(features)/rehab/encounter-queue/index.vue
deleted file mode 100644
index 8616dd19..00000000
--- a/app/pages/(features)/rehab/encounter-queue/index.vue
+++ /dev/null
@@ -1,3 +0,0 @@
-
- Examination Queue
-
diff --git a/app/pages/(features)/rehab/encounter/[id]/control-letter/[control_letter_id]/edit.vue b/app/pages/(features)/rehab/encounter/[id]/control-letter/[control_letter_id]/edit.vue
deleted file mode 100644
index cc5d182f..00000000
--- a/app/pages/(features)/rehab/encounter/[id]/control-letter/[control_letter_id]/edit.vue
+++ /dev/null
@@ -1,41 +0,0 @@
-
-
-
-
-
diff --git a/app/pages/(features)/rehab/encounter/[id]/control-letter/[control_letter_id]/index.vue b/app/pages/(features)/rehab/encounter/[id]/control-letter/[control_letter_id]/index.vue
deleted file mode 100644
index 612315ad..00000000
--- a/app/pages/(features)/rehab/encounter/[id]/control-letter/[control_letter_id]/index.vue
+++ /dev/null
@@ -1,41 +0,0 @@
-
-
-
-
-
diff --git a/app/pages/(features)/rehab/encounter/[id]/control-letter/add.vue b/app/pages/(features)/rehab/encounter/[id]/control-letter/add.vue
deleted file mode 100644
index fa0b386b..00000000
--- a/app/pages/(features)/rehab/encounter/[id]/control-letter/add.vue
+++ /dev/null
@@ -1,41 +0,0 @@
-
-
-
-
-
diff --git a/app/pages/(features)/rehab/encounter/[id]/detail.vue b/app/pages/(features)/rehab/encounter/[id]/detail.vue
deleted file mode 100644
index e3d45895..00000000
--- a/app/pages/(features)/rehab/encounter/[id]/detail.vue
+++ /dev/null
@@ -1,41 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/app/pages/(features)/rehab/encounter/[id]/document-upload/[document_id]/edit.vue b/app/pages/(features)/rehab/encounter/[id]/document-upload/[document_id]/edit.vue
deleted file mode 100644
index 1cf5cc7c..00000000
--- a/app/pages/(features)/rehab/encounter/[id]/document-upload/[document_id]/edit.vue
+++ /dev/null
@@ -1,41 +0,0 @@
-
-
-
-
-
diff --git a/app/pages/(features)/rehab/encounter/[id]/document-upload/add.vue b/app/pages/(features)/rehab/encounter/[id]/document-upload/add.vue
deleted file mode 100644
index e04220f3..00000000
--- a/app/pages/(features)/rehab/encounter/[id]/document-upload/add.vue
+++ /dev/null
@@ -1,42 +0,0 @@
-
-
-
-
-
diff --git a/app/pages/(features)/rehab/encounter/[id]/edit.vue b/app/pages/(features)/rehab/encounter/[id]/edit.vue
deleted file mode 100644
index 02dc5428..00000000
--- a/app/pages/(features)/rehab/encounter/[id]/edit.vue
+++ /dev/null
@@ -1,55 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/app/pages/(features)/rehab/encounter/[id]/process.vue b/app/pages/(features)/rehab/encounter/[id]/process.vue
index e25b0e77..9708adfd 100644
--- a/app/pages/(features)/rehab/encounter/[id]/process.vue
+++ b/app/pages/(features)/rehab/encounter/[id]/process.vue
@@ -2,6 +2,7 @@
import type { PagePermission } from '~/models/role'
import Error from '~/components/pub/my-ui/error/error.vue'
import { PAGE_PERMISSIONS } from '~/lib/page-permission'
+import EncounterProcess from '~/components/content/encounter/process-next.vue'
definePageMeta({
middleware: ['rbac'],
@@ -35,7 +36,7 @@ const pagePermission = getPagePermissions(roleAccess)
-
+
diff --git a/app/pages/(features)/rehab/encounter/index.vue b/app/pages/(features)/rehab/encounter/index.vue
deleted file mode 100644
index 1dd93aa0..00000000
--- a/app/pages/(features)/rehab/encounter/index.vue
+++ /dev/null
@@ -1,47 +0,0 @@
-
-
-
-
-
diff --git a/app/pages/(features)/rehab/registration-queue/index.vue b/app/pages/(features)/rehab/registration-queue/index.vue
deleted file mode 100644
index d06e73ad..00000000
--- a/app/pages/(features)/rehab/registration-queue/index.vue
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/app/pages/(features)/rehab/registration-queue/sep-prosedur/add.vue b/app/pages/(features)/rehab/registration-queue/sep-prosedur/add.vue
deleted file mode 100644
index 6a45818c..00000000
--- a/app/pages/(features)/rehab/registration-queue/sep-prosedur/add.vue
+++ /dev/null
@@ -1,40 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/app/pages/(features)/rehab/registration/[id]/detail.vue b/app/pages/(features)/rehab/registration/[id]/detail.vue
deleted file mode 100644
index 77c30c00..00000000
--- a/app/pages/(features)/rehab/registration/[id]/detail.vue
+++ /dev/null
@@ -1,41 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/app/pages/(features)/rehab/registration/[id]/edit.vue b/app/pages/(features)/rehab/registration/[id]/edit.vue
deleted file mode 100644
index c6af01a9..00000000
--- a/app/pages/(features)/rehab/registration/[id]/edit.vue
+++ /dev/null
@@ -1,41 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/app/pages/(features)/rehab/registration/add.vue b/app/pages/(features)/rehab/registration/add.vue
deleted file mode 100644
index 87053270..00000000
--- a/app/pages/(features)/rehab/registration/add.vue
+++ /dev/null
@@ -1,41 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/app/pages/(features)/rehab/registration/index.vue b/app/pages/(features)/rehab/registration/index.vue
deleted file mode 100644
index 5b4fbfb8..00000000
--- a/app/pages/(features)/rehab/registration/index.vue
+++ /dev/null
@@ -1,40 +0,0 @@
-
-
-
-
-
diff --git a/app/pages/(features)/outpatient/registration-queue/index.vue b/app/pages/(features)/spirometry/index.vue
similarity index 100%
rename from app/pages/(features)/outpatient/registration-queue/index.vue
rename to app/pages/(features)/spirometry/index.vue
diff --git a/app/pages/(features)/outpation-action/hemophilia/index.vue b/app/pages/(features)/thalasemia/index.vue
similarity index 100%
rename from app/pages/(features)/outpation-action/hemophilia/index.vue
rename to app/pages/(features)/thalasemia/index.vue
diff --git a/app/pages/(features)/tools-equipment-src/medicine/index.vue b/app/pages/(features)/tools-equipment-src/medicine/index.vue
index 33f16618..25e5105e 100644
--- a/app/pages/(features)/tools-equipment-src/medicine/index.vue
+++ b/app/pages/(features)/tools-equipment-src/medicine/index.vue
@@ -5,7 +5,7 @@ import { PAGE_PERMISSIONS } from '~/lib/page-permission'
definePageMeta({
middleware: ['rbac'],
- roles: ['doctor', 'nurse', 'admisi', 'pharmacy', 'billing', 'management'],
+ roles: [],
title: 'Daftar Dokter',
contentFrame: 'cf-full-width',
})
@@ -16,7 +16,7 @@ useHead({
title: () => route.meta.title as string,
})
-const roleAccess: PagePermission = PAGE_PERMISSIONS['/doctor']
+const roleAccess: PagePermission = PAGE_PERMISSIONS['/tools-equipment-src/medicine']!
const { checkRole, hasReadAccess } = useRBAC()
diff --git a/app/schemas/integration-bpjs.schema.ts b/app/schemas/integration-bpjs.schema.ts
index 47206edf..452735f7 100644
--- a/app/schemas/integration-bpjs.schema.ts
+++ b/app/schemas/integration-bpjs.schema.ts
@@ -78,7 +78,7 @@ const IntegrationBpjsSchema = z
.optional(),
destinationClinic: z
.string({ required_error: ERROR_MESSAGES.required.destinationClinic })
- .min(1, ERROR_MESSAGES.required.destinationClinic),
+ .min(1, ERROR_MESSAGES.required.destinationClinic).optional(),
attendingDoctor: z
.string({ required_error: ERROR_MESSAGES.required.attendingDoctor })
.min(1, ERROR_MESSAGES.required.attendingDoctor),
@@ -89,7 +89,7 @@ const IntegrationBpjsSchema = z
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),
+ .min(1, ERROR_MESSAGES.required.clinicExcecutive).optional(),
subSpecialistId: z
.string({ required_error: ERROR_MESSAGES.required.subSpecialistId })
.min(1, ERROR_MESSAGES.required.subSpecialistId)
diff --git a/app/schemas/soapi.schema.ts b/app/schemas/soapi.schema.ts
index 50ade93e..2f5f8667 100644
--- a/app/schemas/soapi.schema.ts
+++ b/app/schemas/soapi.schema.ts
@@ -179,6 +179,14 @@ const InstructionSchema = z.object({
other: z.string().default(''),
})
+export const CprjSoapiSchema = z.object({
+ subjective: z.string().default(''),
+ objective: z.string().default(''),
+ assesment: z.string().default(''),
+ plan: z.string().default(''),
+ review: z.string().default(''),
+})
+
export const SoapSchema = z.object({
subject: SubjectSchema,
object: ObjectSchema,
diff --git a/app/services/_crud-base.ts b/app/services/_crud-base.ts
index e3c57689..bf3a89c5 100644
--- a/app/services/_crud-base.ts
+++ b/app/services/_crud-base.ts
@@ -74,6 +74,19 @@ export async function update(path: string, id: number | string, data: any, name:
}
}
+export async function updateCustom(path: string, data: any, name: string = 'item') {
+ try {
+ const resp = await xfetch(`${path}`, 'PATCH', data)
+ const result: any = {}
+ result.success = resp.success
+ result.body = (resp.body as Record
) || {}
+ return result
+ } catch (error) {
+ console.error(`Error putting ${name}:`, error)
+ throw new Error(`Failed to put ${name}`)
+ }
+}
+
export async function remove(path: string, id: number | string, name: string = 'item') {
try {
const resp = await xfetch(`${path}/${id}`, 'DELETE')
@@ -86,3 +99,16 @@ export async function remove(path: string, id: number | string, name: string = '
throw new Error(`Failed to delete ${name}`)
}
}
+
+export async function removeCustom(path: string, data: any, name: string = 'item') {
+ try {
+ const resp = await xfetch(`${path}`, 'DELETE', data)
+ const result: any = {}
+ result.success = resp.success
+ result.body = (resp.body as Record) || {}
+ return result
+ } catch (error) {
+ console.error(`Error deleting ${name}:`, error)
+ throw new Error(`Failed to delete ${name}`)
+ }
+}
\ No newline at end of file
diff --git a/app/services/encounter.service.ts b/app/services/encounter.service.ts
index 6e42fd41..3643277a 100644
--- a/app/services/encounter.service.ts
+++ b/app/services/encounter.service.ts
@@ -28,6 +28,11 @@ export function remove(id: number | string) {
return base.remove(path, id, name)
}
+export function cancel(id: number | string) {
+ let url = `${path}/${id}/cancel`
+ return base.updateCustom(url, null, name)
+}
+
export async function getValueLabelList(params: any = null): Promise<{ value: string; label: string }[]> {
let data: { value: string; label: string }[] = []
const result = await getList(params)
diff --git a/app/services/vclaim-control-letter.service.ts b/app/services/vclaim-control-letter.service.ts
index 007e91c5..2c638c2e 100644
--- a/app/services/vclaim-control-letter.service.ts
+++ b/app/services/vclaim-control-letter.service.ts
@@ -15,11 +15,11 @@ export function getList(params: any = null) {
if (params?.letterNumber && params.mode === 'by-sep') {
url += `/${params.letterNumber}`
}
- if (params?.letterNumber && params.mode === 'by-schedule') {
- url += `/jadwalDokter?jeniskontrol=${params.controlType}&kodepoli=${params.poliCode}&tanggalkontrol=${params.controlDate}`
+ if (params?.controlDate && params.mode === 'by-schedule') {
+ url += `/jadwalDokter?jeniskontrol=${params.controlType}&kodepoli=${params.polyCode}&tanggalkontrol=${params.controlDate}`
delete params.controlType
- delete params.poliCode
delete params.controlDate
+ delete params.polyCode
}
if (params) {
delete params.letterNumber
diff --git a/app/services/vclaim-monitoring-visit.service.ts b/app/services/vclaim-monitoring-visit.service.ts
index 0c5da64e..6004673e 100644
--- a/app/services/vclaim-monitoring-visit.service.ts
+++ b/app/services/vclaim-monitoring-visit.service.ts
@@ -4,68 +4,16 @@ import * as base from './_crud-base'
const path = '/api/vclaim/v1/monitoring/visit'
const name = 'monitoring-visit'
-const dummyResponse = {
- metaData: {
- code: '200',
- message: 'Sukses',
- },
- response: {
- sep: [
- {
- diagnosa: 'K65.0',
- jnsPelayanan: 'R.Inap',
- kelasRawat: '2',
- nama: 'HANIF ABDURRAHMAN',
- noKartu: '0001819122189',
- noSep: '0301R00110170000004',
- noRujukan: '0301U01108180200084',
- poli: null,
- tglPlgSep: '2017-10-03',
- tglSep: '2017-10-01',
- },
- {
- diagnosa: 'I50.0',
- jnsPelayanan: 'R.Inap',
- kelasRawat: '3',
- nama: 'ASRIZAL',
- noKartu: '0002283324674',
- noSep: '0301R00110170000005',
- noRujukan: '0301U01108180200184',
- poli: null,
- tglPlgSep: '2017-10-10',
- tglSep: '2017-10-01',
- },
- ],
- },
-}
-
export async function getList(params: any = null) {
- try {
- let url = path
- if (params?.date && params.serviceType) {
- url += `/${params.date}/${params.serviceType}`
- }
- if (params) {
- delete params.date
- delete params.serviceType
- }
- const resp = await base.getList(url, params, name)
-
- // Jika success false, return dummy response
- if (!resp.success || !resp.body?.response) {
- return {
- success: true,
- body: dummyResponse,
- }
- }
-
- return resp
- } catch (error) {
- // Jika terjadi error, return dummy response
- console.error(`Error fetching ${name}s:`, error)
- return {
- success: true,
- body: dummyResponse,
- }
+ let url = path
+ if (params?.date && params.serviceType) {
+ url += `/${params.date}/${params.serviceType}`
}
+ if (params) {
+ delete params.date
+ delete params.serviceType
+ }
+ const resp = await base.getList(url, params, name)
+
+ return resp
}
diff --git a/app/services/vclaim-sep.service.ts b/app/services/vclaim-sep.service.ts
index fdccc9c4..93224a4a 100644
--- a/app/services/vclaim-sep.service.ts
+++ b/app/services/vclaim-sep.service.ts
@@ -7,6 +7,9 @@ import type { IntegrationBpjsFormData } from '~/schemas/integration-bpjs.schema'
const path = '/api/vclaim-swagger/sep'
const name = 'sep'
+// TODO: temporary destinationClinic
+const destinationClinic = '1323R001'
+
export function create(data: any) {
return base.create(path, data, name)
}
@@ -20,8 +23,19 @@ export function getList(params: any = null) {
return base.getList(url, params, name)
}
+export function getDetail(id: number | string) {
+ return base.getDetail(path, id, name)
+}
+
+export function remove(payload: any) {
+ const url = `${path}`
+ return base.removeCustom(url, payload, name)
+}
+
export function makeSepData(
data: IntegrationBpjsFormData & {
+ userName: string
+ polyCode?: string
referralFrom?: string
referralTo?: string
referralLetterDate?: string
@@ -31,13 +45,13 @@ export function makeSepData(
const content = {
noKartu: data.cardNumber || '',
tglSep: data.sepDate,
- ppkPelayanan: data.fromClinic || '',
- jnsPelayanan: data.admissionType ? String(data.admissionType) : '1',
+ ppkPelayanan: destinationClinic || data.fromClinic || '',
+ jnsPelayanan: data.serviceType ? String(data.serviceType) : '2',
noMR: data.medicalRecordNumber || '',
catatan: data.note || '',
diagAwal: data.initialDiagnosis || '',
poli: {
- tujuan: data.destinationClinic || '',
+ tujuan: data.polyCode || '',
eksekutif: data.clinicExcecutive === 'yes' ? '1' : '0',
},
cob: {
@@ -46,19 +60,21 @@ export function makeSepData(
katarak: {
katarak: data.cataract === 'yes' ? '1' : '0',
},
- tujuanKunj: data.purposeOfVisit || '',
+ tujuanKunj: data.purposeOfVisit || '0',
flagProcedure: data.procedureType || '',
kdPenunjang: data.supportCode || '',
assesmentPel: data.serviceAssessment || '',
skdp: {
noSurat: ['3'].includes(data.admissionType) ? data.referralLetterNumber : '',
- kodeDPJP: ['3'].includes(data.admissionType)? data.attendingDoctor : '',
+ kodeDPJP: ['3'].includes(data.admissionType) ? data.attendingDoctor : '',
},
rujukan: {
- asalRujukan: ['2'].includes(data.admissionType) ? data?.referralFrom || '' : '',
- tglRujukan: ['2'].includes(data.admissionType) ? data?.referralLetterDate || '' : '',
- noRujukan: ['2'].includes(data.admissionType) ? data?.referralLetterNumber || '' : '',
- ppkRujukan: ['2'].includes(data.admissionType) ? data?.referralTo || '' : '',
+ // Handle referral data for admissionType !== '3'
+ // asalRujukan: 1 = Faskes 1, 2 = Faskes RS
+ asalRujukan: !['3'].includes(data.admissionType) ? data?.referralFrom || '' : '',
+ tglRujukan: !['3'].includes(data.admissionType) ? data?.referralLetterDate || '' : '',
+ noRujukan: !['3'].includes(data.admissionType) ? data?.referralLetterNumber || '' : '',
+ ppkRujukan: !['3'].includes(data.admissionType) ? data?.referralTo || '' : '',
},
klsRawat: {
klsRawatHak: data.classLevel || '',
@@ -68,7 +84,7 @@ export function makeSepData(
},
dpjpLayan: data.attendingDoctor || '',
noTelp: data.phoneNumber || '',
- user: data.patientName || '',
+ user: data.userName || '',
jaminan: {
lakaLantas: data.trafficAccident || '0',
noLP: data.lpNumber || '',
@@ -93,3 +109,14 @@ export function makeSepData(
},
}
}
+
+export function makeSepDataForRemove(data: any) {
+ return {
+ request: {
+ t_sep: {
+ noSep: data.sepNumber,
+ user: data.userName,
+ },
+ },
+ }
+}
diff --git a/app/stores/user.ts b/app/stores/user.ts
index 97bd4665..f7fe9fb5 100644
--- a/app/stores/user.ts
+++ b/app/stores/user.ts
@@ -1,19 +1,21 @@
export const useUserStore = defineStore(
'user',
() => {
+ // should be auth type
const user = ref(null)
// const token = useCookie('authentication')
const isAuthenticated = computed(() => !!user.value)
- const userRole = computed(() => {
+ const userRoles = computed(() => {
return user.value?.roles || []
- // return roles.map((input: string) => {
- // const parts = input.split('|')
- // return parts.length > 1 ? parts[1]: parts[0]
- // })
})
+ const userActiveRole = ref('') // watched user failed, so create a ref here
+ // computed(() => {
+ // // return user.value?.activeRole || ''
+ // })
+
const login = async (userData: any) => {
user.value = userData
}
@@ -25,10 +27,11 @@ export const useUserStore = defineStore(
const setActiveRole = (role: string) => {
if (user.value && user.value.roles.includes(role)) {
user.value.activeRole = role
+ userActiveRole.value = role
}
}
- const getActiveRole = () => {
+ const getActiveRole = (): string | undefined => {
if (user.value?.activeRole) {
return user.value.activeRole
}
@@ -36,12 +39,14 @@ export const useUserStore = defineStore(
user.value.activeRole = user.value.roles[0]
return user.value.activeRole
}
+ return undefined
}
return {
user,
isAuthenticated,
- userRole,
+ userRoles,
+ userActiveRole,
login,
logout,
setActiveRole,
diff --git a/package.json b/package.json
index d415abde..08b0d87c 100644
--- a/package.json
+++ b/package.json
@@ -23,10 +23,12 @@
"date-fns": "^4.1.0",
"embla-carousel": "^8.5.2",
"embla-carousel-vue": "^8.5.2",
+ "file-saver": "^2.0.5",
"h3": "^1.15.4",
"pinia": "^3.0.3",
"pinia-plugin-persistedstate": "^4.4.1",
- "tailwindcss-animate": "^1.0.7"
+ "tailwindcss-animate": "^1.0.7",
+ "xlsx": "^0.18.5"
},
"devDependencies": {
"@antfu/eslint-config": "^4.10.1",
@@ -36,6 +38,7 @@
"@nuxtjs/color-mode": "^3.5.2",
"@nuxtjs/tailwindcss": "6.14.0",
"@pinia/nuxt": "^0.11.2",
+ "@types/file-saver": "^2.0.7",
"@unocss/eslint-plugin": "^66.0.0",
"@unocss/nuxt": "^66.0.0",
"@vee-validate/zod": "^4.15.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 5ae777c3..565ff313 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -32,6 +32,9 @@ dependencies:
embla-carousel-vue:
specifier: ^8.5.2
version: 8.6.0(vue@3.5.21)
+ file-saver:
+ specifier: ^2.0.5
+ version: 2.0.5
h3:
specifier: ^1.15.4
version: 1.15.4
@@ -44,6 +47,9 @@ dependencies:
tailwindcss-animate:
specifier: ^1.0.7
version: 1.0.7(tailwindcss@3.4.17)
+ xlsx:
+ specifier: ^0.18.5
+ version: 0.18.5
devDependencies:
'@antfu/eslint-config':
@@ -67,6 +73,9 @@ devDependencies:
'@pinia/nuxt':
specifier: ^0.11.2
version: 0.11.2(pinia@3.0.3)
+ '@types/file-saver':
+ specifier: ^2.0.7
+ version: 2.0.7
'@unocss/eslint-plugin':
specifier: ^66.0.0
version: 66.5.1(eslint@9.36.0)(typescript@5.9.2)
@@ -3182,6 +3191,10 @@ packages:
/@types/estree@1.0.8:
resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
+ /@types/file-saver@2.0.7:
+ resolution: {integrity: sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A==}
+ dev: true
+
/@types/geojson@7946.0.16:
resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==}
dev: false
@@ -4588,6 +4601,11 @@ packages:
engines: {node: '>=0.4.0'}
hasBin: true
+ /adler-32@1.3.1:
+ resolution: {integrity: sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==}
+ engines: {node: '>=0.8'}
+ dev: false
+
/agent-base@7.1.4:
resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==}
engines: {node: '>= 14'}
@@ -4796,12 +4814,12 @@ packages:
dev: true
optional: true
- /my-ui64-js@1.5.1:
+ /base64-js@1.5.1:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
dev: true
- /my-uiline-browser-mapping@2.8.6:
- resolution: {integrity: sha512-wrH5NNqren/QMtKUEEJf7z86YjfqW/2uw3IL3/xpqZUC95SSVIFXYQeeGjL6FT/X68IROu6RMehZQS5foy2BXw==}
+ /baseline-browser-mapping@2.8.29:
+ resolution: {integrity: sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA==}
hasBin: true
dev: true
@@ -4845,7 +4863,7 @@ packages:
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true
dependencies:
- baseline-browser-mapping: 2.8.6
+ baseline-browser-mapping: 2.8.29
caniuse-lite: 1.0.30001743
electron-to-chromium: 1.5.222
node-releases: 2.0.21
@@ -4966,6 +4984,14 @@ packages:
resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
dev: true
+ /cfb@1.2.2:
+ resolution: {integrity: sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==}
+ engines: {node: '>=0.8'}
+ dependencies:
+ adler-32: 1.3.1
+ crc-32: 1.2.2
+ dev: false
+
/chai@5.3.3:
resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==}
engines: {node: '>=18'}
@@ -5084,6 +5110,11 @@ packages:
engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'}
dev: true
+ /codepage@1.15.0:
+ resolution: {integrity: sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==}
+ engines: {node: '>=0.8'}
+ dev: false
+
/color-convert@2.0.1:
resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
engines: {node: '>=7.0.0'}
@@ -5244,7 +5275,6 @@ packages:
resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==}
engines: {node: '>=0.8'}
hasBin: true
- dev: true
/crc32-stream@6.0.0:
resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==}
@@ -6754,6 +6784,10 @@ packages:
flat-cache: 4.0.1
dev: true
+ /file-saver@2.0.5:
+ resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==}
+ dev: false
+
/file-uri-to-path@1.0.0:
resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==}
dev: true
@@ -6814,6 +6848,11 @@ packages:
engines: {node: '>=0.4.x'}
dev: true
+ /frac@1.1.2:
+ resolution: {integrity: sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==}
+ engines: {node: '>=0.8'}
+ dev: false
+
/fraction.js@4.3.7:
resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
dev: true
@@ -10219,6 +10258,13 @@ packages:
resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==}
engines: {node: '>=0.10.0'}
+ /ssf@0.11.2:
+ resolution: {integrity: sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==}
+ engines: {node: '>=0.8'}
+ dependencies:
+ frac: 1.1.2
+ dev: false
+
/stable-hash-x@0.2.0:
resolution: {integrity: sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==}
engines: {node: '>=12.0.0'}
@@ -11603,11 +11649,21 @@ packages:
stackback: 0.0.2
dev: true
+ /wmf@1.0.2:
+ resolution: {integrity: sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==}
+ engines: {node: '>=0.8'}
+ dev: false
+
/word-wrap@1.2.5:
resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
engines: {node: '>=0.10.0'}
dev: true
+ /word@0.3.0:
+ resolution: {integrity: sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==}
+ engines: {node: '>=0.8'}
+ dev: false
+
/wrap-ansi@7.0.0:
resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
engines: {node: '>=10'}
@@ -11648,6 +11704,20 @@ packages:
is-wsl: 3.1.0
dev: true
+ /xlsx@0.18.5:
+ resolution: {integrity: sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==}
+ engines: {node: '>=0.8'}
+ hasBin: true
+ dependencies:
+ adler-32: 1.3.1
+ cfb: 1.2.2
+ codepage: 1.15.0
+ crc-32: 1.2.2
+ ssf: 0.11.2
+ wmf: 1.0.2
+ word: 0.3.0
+ dev: false
+
/xml-name-validator@4.0.0:
resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==}
engines: {node: '>=12'}
diff --git a/public/bpjs.png b/public/bpjs.png
new file mode 100644
index 00000000..781e19b0
Binary files /dev/null and b/public/bpjs.png differ
diff --git a/public/side-menu-items/emp-doc.json b/public/side-menu-items/emp-doc.json
index b7ecb430..292d8c5d 100644
--- a/public/side-menu-items/emp-doc.json
+++ b/public/side-menu-items/emp-doc.json
@@ -12,14 +12,14 @@
"icon": "i-lucide-stethoscope",
"children": [
{
- "title": "Triase",
+ "title": "Kunjungan",
"icon": "i-lucide-stethoscope",
- "link": "/outpatient/encounter"
+ "link": "/ambulatory/encounter"
},
{
"title": "Konsultasi",
"icon": "i-lucide-building-2",
- "link": "/outpatient/consultation"
+ "link": "/ambulatory/consultation"
}
]
},
@@ -44,22 +44,6 @@
}
]
},
- {
- "title": "Rehabilitasi Medik",
- "icon": "i-lucide-bike",
- "children": [
- {
- "title": "Kunjungan",
- "icon": "i-lucide-building-2",
- "link": "/rehab/encounter"
- },
- {
- "title": "Konsultasi",
- "icon": "i-lucide-building-2",
- "link": "/rehab/consultation"
- }
- ]
- },
{
"title": "Rawat Inap",
"icon": "i-lucide-building-2",
diff --git a/public/side-menu-items/emp-mid.json b/public/side-menu-items/emp-mid.json
index 80eeee7c..1c6e5aef 100644
--- a/public/side-menu-items/emp-mid.json
+++ b/public/side-menu-items/emp-mid.json
@@ -10,7 +10,7 @@
{
"title": "Rawat Jalan",
"icon": "i-lucide-stethoscope",
- "link": "/outpatient/encounter"
+ "link": "/ambulatory/encounter"
},
{
"title": "IGD",
diff --git a/public/side-menu-items/emp-nur.json b/public/side-menu-items/emp-nur.json
index 1c993144..f940219e 100644
--- a/public/side-menu-items/emp-nur.json
+++ b/public/side-menu-items/emp-nur.json
@@ -13,11 +13,11 @@
"children": [
{
"title": "Antrian Poliklinik",
- "link": "/outpatient/encounter-queue"
+ "link": "/ambulatory/encounter-queue"
},
{
"title": "Kunjungan",
- "link": "/outpatient/encounter"
+ "link": "/ambulatory/encounter"
}
]
},
@@ -35,21 +35,6 @@
}
]
},
- {
- "title": "Rehabilitasi Medik",
- "icon": "i-lucide-bike",
- "link": "/rehab",
- "children": [
- {
- "title": "Antrean Poliklinik",
- "link": "/rehab/encounter-queue"
- },
- {
- "title": "Kunjungan",
- "link": "/rehab/encounter"
- }
- ]
- },
{
"title": "Rawat Inap",
"icon": "i-lucide-building-2",
@@ -63,12 +48,12 @@
{
"title": "Kemoterapi",
"icon": "i-lucide-droplets",
- "link": "/outpation-action/chemotherapy"
+ "link": "/chemotherapy"
},
{
"title": "Hemofilia",
"icon": "i-lucide-droplet-off",
- "link": "/outpation-action/hemophilia"
+ "link": "/hemophilia"
}
]
},
@@ -78,17 +63,17 @@
{
"title": "Thalasemi",
"icon": "i-lucide-baby",
- "link": "/children-action/thalasemia"
+ "link": "/thalasemia"
},
{
"title": "Echocardiography",
"icon": "i-lucide-baby",
- "link": "/children-action/echocardiography"
+ "link": "/echocardiography"
},
{
"title": "Spirometri",
"icon": "i-lucide-baby",
- "link": "/children-action/spirometry"
+ "link": "/spirometry"
}
]
}
diff --git a/public/side-menu-items/emp-nut.json b/public/side-menu-items/emp-nut.json
index ef71282a..43f3e503 100644
--- a/public/side-menu-items/emp-nut.json
+++ b/public/side-menu-items/emp-nut.json
@@ -10,7 +10,7 @@
{
"title": "Rawat Jalan",
"icon": "i-lucide-stethoscope",
- "link": "/outpatient/encounter"
+ "link": "/ambulatory/encounter"
},
{
"title": "IGD",
diff --git a/public/side-menu-items/emp-reg.json b/public/side-menu-items/emp-reg.json
index 86d6d4ed..df874e65 100644
--- a/public/side-menu-items/emp-reg.json
+++ b/public/side-menu-items/emp-reg.json
@@ -13,11 +13,11 @@
"children": [
{
"title": "Antrian Pendaftaran",
- "link": "/outpatient/registration-queue"
+ "link": "/ambulatory/registration-queue"
},
{
"title": "Kunjungan",
- "link": "/outpatient/encounter"
+ "link": "/ambulatory/encounter"
}
]
},
@@ -26,21 +26,6 @@
"icon": "i-lucide-zap",
"link": "/emergency/encounter"
},
- {
- "title": "Rehabilitasi Medik",
- "icon": "i-lucide-bike",
- "link": "/rehab",
- "children": [
- {
- "title": "Antrean Pendaftaran",
- "link": "/rehab/registration-queue"
- },
- {
- "title": "Kunjungan",
- "link": "/rehab/encounter"
- }
- ]
- },
{
"title": "Rawat Inap",
"icon": "i-lucide-building-2",
diff --git a/public/side-menu-items/sys.json b/public/side-menu-items/sys.json
index 039066a4..996c2a6b 100644
--- a/public/side-menu-items/sys.json
+++ b/public/side-menu-items/sys.json
@@ -13,19 +13,19 @@
"children": [
{
"title": "Antrian Pendaftaran",
- "link": "/outpatient/registration-queue"
+ "link": "/ambulatory/registration-queue"
},
{
"title": "Antrian Poliklinik",
- "link": "/outpatient/polyclinic-queue"
+ "link": "/ambulatory/encounter-queue"
},
{
"title": "Kunjungan",
- "link": "/outpatient/encounter"
+ "link": "/ambulatory/encounter"
},
{
"title": "Konsultasi",
- "link": "/outpatient/consultation"
+ "link": "/ambulatory/consultation"
}
]
},
@@ -47,28 +47,6 @@
}
]
},
- {
- "title": "Rehab Medik",
- "icon": "i-lucide-bike",
- "children": [
- {
- "title": "Antrean Pendaftaran",
- "link": "/rehab/registration-queue"
- },
- {
- "title": "Antrean Poliklinik",
- "link": "/rehab/polyclinic-queue"
- },
- {
- "title": "Kunjungan",
- "link": "/rehab/encounter"
- },
- {
- "title": "Konsultasi",
- "link": "/rehab/consultation"
- }
- ]
- },
{
"title": "Rawat Inap",
"icon": "i-lucide-building-2",
@@ -101,10 +79,15 @@
}
]
},
+ {
+ "title": "Radiologi - Order",
+ "icon": "i-lucide-radio",
+ "link": "/radiology-order"
+ },
{
"title": "Lab - Order",
"icon": "i-lucide-microscope",
- "link": "/pc-lab-order"
+ "link": "/cp-lab-order"
},
{
"title": "Lab Mikro - Order",
@@ -114,12 +97,7 @@
{
"title": "Lab PA - Order",
"icon": "i-lucide-microscope",
- "link": "/pa-lab-order"
- },
- {
- "title": "Radiologi - Order",
- "icon": "i-lucide-radio",
- "link": "/radiology-order"
+ "link": "/ap-lab-order"
},
{
"title": "Gizi",
@@ -193,17 +171,17 @@
{
"title": "SEP",
"icon": "i-lucide-circuit-board",
- "link": "/integration/bpjs/sep"
+ "link": "/integration/bpjs-vclaim/sep"
},
{
"title": "Peserta",
"icon": "i-lucide-circuit-board",
- "link": "/integration/bpjs/member"
+ "link": "/integration/bpjs-vclaim/member"
},
{
"title": "Surat Kontrol",
"icon": "i-lucide-circuit-board",
- "link": "/integration/bpjs/control-letter"
+ "link": "/integration/bpjs-vclaim/control-letter"
}
]
},
@@ -284,40 +262,40 @@
]
},
{
- "title": "Layanan",
+ "title": "Infrastruktur",
"icon": "i-lucide-layout-list",
"children": [
- {
- "title": "Counter",
- "link": "/service-src/counter"
- },
- {
- "title": "Public Screen (Big Screen)",
- "link": "/service-src/public-screen"
- },
{
"title": "Kasur",
- "link": "/service-src/bed"
+ "link": "/infra-src/bed"
},
{
"title": "Kamar",
- "link": "/service-src/chamber"
+ "link": "/infra-src/chamber"
},
{
"title": "Ruang",
- "link": "/service-src/room"
+ "link": "/infra-src/room"
},
{
"title": "Depo",
- "link": "/service-src/warehouse"
+ "link": "/infra-src/warehouse"
},
{
"title": "Lantai",
- "link": "/service-src/floor"
+ "link": "/infra-src/floor"
},
{
"title": "Gedung",
- "link": "/service-src/building"
+ "link": "/infra-src/building"
+ },
+ {
+ "title": "Counter",
+ "link": "/infra-src/counter"
+ },
+ {
+ "title": "Public Screen (Big Screen)",
+ "link": "/infra-src/public-screen"
}
]
},
@@ -369,4 +347,4 @@
}
]
}
-]
\ No newline at end of file
+]
diff --git a/public/side-menu-items/system.json b/public/side-menu-items/system.json
index e12f58ec..c46775aa 100644
--- a/public/side-menu-items/system.json
+++ b/public/side-menu-items/system.json
@@ -13,19 +13,19 @@
"children": [
{
"title": "Antrian Pendaftaran",
- "link": "/outpatient/registration-queue"
+ "link": "/ambulatory/registration-queue"
},
{
"title": "Antrian Poliklinik",
- "link": "/outpatient/encounter-queue"
+ "link": "/ambulatory/encounter-queue"
},
{
"title": "Kunjungan",
- "link": "/outpatient/encounter"
+ "link": "/ambulatory/encounter"
},
{
"title": "Konsultasi",
- "link": "/outpatient/consultation"
+ "link": "/ambulatory/consultation"
}
]
},
@@ -193,17 +193,17 @@
{
"title": "SEP",
"icon": "i-lucide-circuit-board",
- "link": "/integration/bpjs/sep"
+ "link": "/integration/bpjs-vclaim/sep"
},
{
"title": "Peserta",
"icon": "i-lucide-circuit-board",
- "link": "/integration/bpjs/member"
+ "link": "/integration/bpjs-vclaim/member"
},
{
"title": "Surat Kontrol",
"icon": "i-lucide-circuit-board",
- "link": "/integration/bpjs/control-letter"
+ "link": "/integration/bpjs-vclaim/control-letter"
}
]
},
@@ -389,4 +389,4 @@
}
]
}
-]
\ No newline at end of file
+]
diff --git a/server/api/[...req].ts b/server/api/[...req].ts
index 5948eda6..c58bf7d6 100644
--- a/server/api/[...req].ts
+++ b/server/api/[...req].ts
@@ -1,7 +1,7 @@
import { defineEventHandler, getCookie, getRequestHeaders, getRequestURL, readBody } from 'h3'
export default defineEventHandler(async (event) => {
- const { method } = event.node.req
+ const { method } = event.node.req as any
const headers = getRequestHeaders(event)
const url = getRequestURL(event)
const config = useRuntimeConfig()
@@ -36,7 +36,7 @@ export default defineEventHandler(async (event) => {
}
let body: any
- if (['POST', 'PATCH'].includes(method!)) {
+ if (['POST', 'PATCH', 'PUT', 'DELETE'].includes(method)) {
if (headers['content-type']?.includes('multipart/form-data')) {
body = await readBody(event)
} else {