+
diff --git a/app/pages/(features)/outpation-action/chemotherapy/[mode]/[id]/verification.vue b/app/pages/(features)/rehab/encounter/[id]/document-upload/[document_id]/edit.vue
similarity index 53%
rename from app/pages/(features)/outpation-action/chemotherapy/[mode]/[id]/verification.vue
rename to app/pages/(features)/rehab/encounter/[id]/document-upload/[document_id]/edit.vue
index ef936ff2..1cf5cc7c 100644
--- a/app/pages/(features)/outpation-action/chemotherapy/[mode]/[id]/verification.vue
+++ b/app/pages/(features)/rehab/encounter/[id]/document-upload/[document_id]/edit.vue
@@ -2,46 +2,40 @@
import type { PagePermission } from '~/models/role'
import Error from '~/components/pub/my-ui/error/error.vue'
import { PAGE_PERMISSIONS } from '~/lib/page-permission'
-import ContentChemotherapyAdminList from '~/components/content/chemotherapy/admin-list.vue'
-import ContentChemotherapyVerification from '~/components/content/chemotherapy/verification.vue'
definePageMeta({
middleware: ['rbac'],
roles: ['doctor', 'nurse', 'admisi', 'pharmacy', 'billing', 'management'],
- title: 'Kemoterapi Admin',
+ title: 'Update Dokumen Pendukung',
contentFrame: 'cf-full-width',
})
const route = useRoute()
useHead({
- title: () => 'Verifikasi Jadwal Pasien',
+ title: () => route.meta.title as string,
})
-const roleAccess: PagePermission = PAGE_PERMISSIONS['/doctor'] || {}
+const roleAccess: PagePermission = PAGE_PERMISSIONS['/patient']
const { checkRole, hasReadAccess } = useRBAC()
// Check if user has access to this page
const hasAccess = checkRole(roleAccess)
-if (!hasAccess) {
- navigateTo('/403')
-}
+// if (!hasAccess) {
+// navigateTo('/403')
+// }
// Define permission-based computed properties
-const canRead = true // hasReadAccess(roleAccess)
-
-const mode = computed(() => route.params.mode as string)
+// const canRead = hasReadAccess(roleAccess)
+const canRead = true
diff --git a/app/pages/(features)/rehab/encounter/[id]/document-upload/add.vue b/app/pages/(features)/rehab/encounter/[id]/document-upload/add.vue
new file mode 100644
index 00000000..e04220f3
--- /dev/null
+++ b/app/pages/(features)/rehab/encounter/[id]/document-upload/add.vue
@@ -0,0 +1,42 @@
+
+
+
+
+
diff --git a/app/pages/(features)/rehab/encounter/[id]/process.vue b/app/pages/(features)/rehab/encounter/[id]/process.vue
index abd0efa7..e25b0e77 100644
--- a/app/pages/(features)/rehab/encounter/[id]/process.vue
+++ b/app/pages/(features)/rehab/encounter/[id]/process.vue
@@ -18,7 +18,7 @@ useHead({
const roleAccess: PagePermission = PAGE_PERMISSIONS['/rehab/encounter']
-const { checkRole, hasCreateAccess } = useRBAC()
+const { checkRole, hasCreateAccess, getPagePermissions } = useRBAC()
// Check if user has access to this page
const hasAccess = checkRole(roleAccess)
@@ -30,11 +30,11 @@ const hasAccess = checkRole(roleAccess)
// }
// Define permission-based computed properties
-const canCreate = true // hasCreateAccess(roleAccess)
+const pagePermission = getPagePermissions(roleAccess)
-
+
diff --git a/app/pages/(features)/rehab/encounter/index.vue b/app/pages/(features)/rehab/encounter/index.vue
index f50ad954..1dd93aa0 100644
--- a/app/pages/(features)/rehab/encounter/index.vue
+++ b/app/pages/(features)/rehab/encounter/index.vue
@@ -22,9 +22,9 @@ const { checkRole, hasReadAccess } = useRBAC()
// Check if user has access to this page
const hasAccess = checkRole(roleAccess)
-if (!hasAccess) {
- // navigateTo('/403')
-}
+// if (!hasAccess) {
+// navigateTo('/403')
+// }
// Define permission-based computed properties
const canRead = true // hasReadAccess(roleAccess)
diff --git a/app/pages/(features)/resume/add.vue b/app/pages/(features)/resume/add.vue
new file mode 100644
index 00000000..7cc707f9
--- /dev/null
+++ b/app/pages/(features)/resume/add.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
diff --git a/app/pages/(features)/outpation-action/chemotherapy/list.vue b/app/pages/(features)/tools-equipment-src/medicine-form/index.vue
similarity index 75%
rename from app/pages/(features)/outpation-action/chemotherapy/list.vue
rename to app/pages/(features)/tools-equipment-src/medicine-form/index.vue
index a141baaa..120df6ea 100644
--- a/app/pages/(features)/outpation-action/chemotherapy/list.vue
+++ b/app/pages/(features)/tools-equipment-src/medicine-form/index.vue
@@ -6,8 +6,8 @@ import { PAGE_PERMISSIONS } from '~/lib/page-permission'
definePageMeta({
middleware: ['rbac'],
roles: ['doctor', 'nurse', 'admisi', 'pharmacy', 'billing', 'management'],
- title: 'Daftar Kempterapi',
- contentFrame: 'cf-full-width',
+ title: 'Daftar Dokter',
+ contentFrame: 'cf-container-lg',
})
const route = useRoute()
@@ -22,19 +22,17 @@ const { checkRole, hasReadAccess } = useRBAC()
// Check if user has access to this page
const hasAccess = checkRole(roleAccess)
-if (!hasAccess) {
- navigateTo('/403')
-}
+// if (!hasAccess) {
+// navigateTo('/403')
+// }
// Define permission-based computed properties
const canRead = true // hasReadAccess(roleAccess)
-
+
+
+
+
diff --git a/app/pages/(features)/tools-equipment-src/medicine/index.vue b/app/pages/(features)/tools-equipment-src/medicine/index.vue
index 2be85f63..33f16618 100644
--- a/app/pages/(features)/tools-equipment-src/medicine/index.vue
+++ b/app/pages/(features)/tools-equipment-src/medicine/index.vue
@@ -22,12 +22,12 @@ const { checkRole, hasReadAccess } = useRBAC()
// Check if user has access to this page
const hasAccess = checkRole(roleAccess)
-if (!hasAccess) {
- navigateTo('/403')
-}
+// if (!hasAccess) {
+// navigateTo('/403')
+// }
// Define permission-based computed properties
-const canRead = hasReadAccess(roleAccess)
+const canRead = true // hasReadAccess(roleAccess)
diff --git a/app/schemas/_generate-file.ts b/app/schemas/_generate-file.ts
new file mode 100644
index 00000000..0e0b05fc
--- /dev/null
+++ b/app/schemas/_generate-file.ts
@@ -0,0 +1,5 @@
+export interface GenerateFile {
+ entityType_code: string
+ ref_id: number
+ type_code: string
+}
diff --git a/app/schemas/document-upload.schema.ts b/app/schemas/document-upload.schema.ts
new file mode 100644
index 00000000..305ec16c
--- /dev/null
+++ b/app/schemas/document-upload.schema.ts
@@ -0,0 +1,25 @@
+import { z } from 'zod'
+
+const ACCEPTED_UPLOAD_TYPES = ['image/jpeg', 'image/png', 'application/pdf']
+const MAX_SIZE_BYTES = 1 * 1024 * 1024 // 1MB
+
+const DocumentUploadSchema = z.object({
+ entityType_code: z.string().default('encounter'),
+ ref_id: z.number(),
+ upload_employee_id: z.number().optional(),
+ // upload_employee_id: z.number(),
+ name: z.string({ required_error: 'Mohon isi', }),
+ type_code: z.string({ required_error: 'Mohon isi', }),
+ content: z.custom()
+ .refine((f) => f, { message: 'File tidak boleh kosong' })
+ .refine((f) => !f || f instanceof File, { message: 'Harus berupa file yang valid' })
+ .refine((f) => !f || ACCEPTED_UPLOAD_TYPES.includes(f.type), {
+ message: 'Format file harus JPG, PNG, atau PDF',
+ })
+ .refine((f) => !f || f.size <= MAX_SIZE_BYTES, { message: 'Maksimal 1MB' }),
+})
+
+type DocumentUploadFormData = z.infer
+
+export { DocumentUploadSchema }
+export type { DocumentUploadFormData }
diff --git a/app/schemas/general-consent.schema.ts b/app/schemas/general-consent.schema.ts
new file mode 100644
index 00000000..e06c7240
--- /dev/null
+++ b/app/schemas/general-consent.schema.ts
@@ -0,0 +1,16 @@
+import { z } from 'zod'
+import type { CreateDto } from '~/models/general-consent'
+
+const GeneralConsentSchema = z.object({
+ relatives: z.array(z.object({ name: z.string(), phone: z.string() })),
+ responsibleName: z.string().optional(),
+ responsiblePhone: z.string().optional(),
+ informant: z.string().optional(),
+ witness1: z.string().optional(),
+ witness2: z.string().optional(),
+})
+
+type GeneralConsentFormData = z.infer & CreateDto
+
+export { GeneralConsentSchema }
+export type { GeneralConsentFormData }
diff --git a/app/schemas/medicine.schema.ts b/app/schemas/medicine.schema.ts
index 44113777..6443be36 100644
--- a/app/schemas/medicine.schema.ts
+++ b/app/schemas/medicine.schema.ts
@@ -5,6 +5,7 @@ export const MedicineSchema = z.object({
name: z.string({ required_error: 'Nama harus diisi' }).min(1, 'Nama minimal 1 karakter'),
medicineGroup_code: z.string({ required_error: 'Kelompok obat harus diisi' }).min(1, 'Kelompok obat harus diisi'),
medicineMethod_code: z.string({ required_error: 'Metode pemberian harus diisi' }).min(1, 'Metode pemberian harus diisi'),
+ medicineForm_code: z.string({ required_error: 'Sediaan Obat harus diisi' }).min(1, 'Sediaan Obat harus diisi'),
uom_code: z.string({ required_error: 'Satuan harus diisi' }).min(1, 'Satuan harus diisi'),
infra_id: z.number().nullable().optional(),
stock: z.preprocess((val) => Number(val), z.number({ invalid_type_error: 'Stok harus berupa angka' }).min(1, 'Stok harus lebih besar dari 0')),
diff --git a/app/schemas/resume.schema.ts b/app/schemas/resume.schema.ts
new file mode 100644
index 00000000..3e466a33
--- /dev/null
+++ b/app/schemas/resume.schema.ts
@@ -0,0 +1,76 @@
+import { z } from 'zod'
+import type { CreateDto } from '~/models/consultation'
+
+export type ResumeArrangementType = "krs" | "mrs" | "rujukInternal" | "rujukExternal" | "meninggal" | "other"
+
+const SecondaryDiagnosisSchema = z.object({
+ diagnosis: z.string({ required_error: 'Diagnosis harus diisi' }),
+ icd10: z.string({ required_error: 'ICD 10 harus diisi' }),
+ diagnosisBasis: z.string({ required_error: 'Dasar Diagnosis harus diisi' })
+ .min(1, 'Uraian minimum 1 karakter')
+ .max(2048, 'Uraian maksimum 2048 karakter'),
+})
+
+const SecondaryActionSchema = z.object({
+ action: z.string({ required_error: 'Action harus diisi' }),
+ icd9: z.string({ required_error: 'ICD 10 harus diisi' }),
+ actionBasis: z.string({ required_error: 'Dasar Action harus diisi' })
+ .min(1, 'Uraian minimum 1 karakter')
+ .max(2048, 'Uraian maksimum 2048 karakter'),
+})
+
+const ConsultationSchema = z.object({
+ consultation: z.string({ required_error: 'Consultation harus diisi' })
+ .min(1, 'Uraian minimum 1 karakter')
+ .max(2048, 'Uraian maksimum 2048 karakter'),
+ consultationReply: z.string({ required_error: 'Jawaban Consultation harus diisi' })
+ .min(1, 'Uraian minimum 1 karakter')
+ .max(2048, 'Uraian maksimum 2048 karakter'),
+})
+
+const ResumeSchema = z.object({
+ inDate: z.string({ required_error: 'Tanggal harus diisi' }),
+ outDate: z.string({ required_error: 'Tanggal harus diisi' }),
+ anamnesis: z.number({ required_error: 'Anamnesis harus diisi' })
+ .min(1, 'Anamnesis minimum 1 karakter')
+ .max(2048, 'Anamnesis maksimum 2048 karakter'),
+ physicalCheckup: z.string({ required_error: 'Uraian harus diisi' })
+ .min(1, 'Uraian minimum 1 karakter')
+ .max(2048, 'Uraian maksimum 2048 karakter'),
+ supplementCheckup: z.string({ required_error: 'Uraian harus diisi' })
+ .min(1, 'Uraian minimum 1 karakter')
+ .max(2048, 'Uraian maksimum 2048 karakter'),
+
+ primaryDiagnosis: z.string({ required_error: 'Diagnosis harus diisi' }),
+ secondaryDiagnosis: z.array(SecondaryDiagnosisSchema).optional(),
+
+ primaryOperativeNonOperativeAct: z.string({ required_error: 'Diagnosis harus diisi' }),
+ secondaryOperativeNonOperativeAct: z.array(SecondaryActionSchema).optional(),
+ medikamentosa: z.string({ required_error: 'Uraian harus diisi' })
+ .min(1, 'Uraian minimum 1 karakter')
+ .max(2048, 'Uraian maksimum 2048 karakter'),
+
+ consultation: z.array(ConsultationSchema).optional(),
+
+ arrangement: z.custom().default("krs"),
+ inpatientIndication: z.string({ required_error: 'Uraian harus diisi' })
+ .min(1, 'Uraian minimum 1 karakter')
+ .max(2048, 'Uraian maksimum 2048 karakter'),
+ faskes: z.string({ required_error: 'Faskes harus diisi' }).optional(),
+ clinic: z.string({ required_error: 'Klinik harus diisi' }).optional(),
+ deathDate: z.string({ required_error: 'Tanggal harus diisi' }).optional(),
+ deathCause: z.array(z.string()).optional().default([]),
+ deathCauseDescription: z.string({ required_error: 'Uraian harus diisi' })
+ .min(1, 'Uraian minimum 1 karakter')
+ .max(2048, 'Uraian maksimum 2048 karakter')
+ .optional(),
+ keterangan: z.string({ required_error: 'Uraian harus diisi' })
+ .min(1, 'Uraian minimum 1 karakter')
+ .max(2048, 'Uraian maksimum 2048 karakter')
+ .optional(),
+})
+
+type ResumeFormData = z.infer & (CreateDto)
+
+export { ResumeSchema }
+export type { ResumeFormData }
diff --git a/app/schemas/verification.schema.ts b/app/schemas/verification.schema.ts
new file mode 100644
index 00000000..db0319cf
--- /dev/null
+++ b/app/schemas/verification.schema.ts
@@ -0,0 +1,19 @@
+import { z } from 'zod'
+
+const VerificationSchema = z.object({
+ name: z.string({
+ required_error: 'Mohon lengkapi Nama Anda',
+ }),
+ email: z.string({
+ required_error: 'Mohon lengkapi email',
+ }),
+ password: z.string({
+ required_error: 'Mohon lengkapi password',
+ }),
+})
+
+
+type VerificationFormData = z.infer
+
+export { VerificationSchema, }
+export type { VerificationFormData, }
\ No newline at end of file
diff --git a/app/services/general-consent.service.ts b/app/services/general-consent.service.ts
new file mode 100644
index 00000000..2a6611fc
--- /dev/null
+++ b/app/services/general-consent.service.ts
@@ -0,0 +1,23 @@
+import * as base from './_crud-base'
+
+const path = '/api/v1/general-consent'
+
+export function create(data: any) {
+ return base.create(path, data)
+}
+
+export function getList(params: any = null) {
+ return base.getList(path, params)
+}
+
+export function getDetail(id: number | string) {
+ return base.getDetail(path, id)
+}
+
+export function update(id: number | string, data: any) {
+ return base.update(path, id, data)
+}
+
+export function remove(id: number | string) {
+ return base.remove(path, id)
+}
diff --git a/app/services/generate-file.service.ts b/app/services/generate-file.service.ts
new file mode 100644
index 00000000..5849e3d0
--- /dev/null
+++ b/app/services/generate-file.service.ts
@@ -0,0 +1,15 @@
+import * as base from './_crud-base'
+
+const path = '/api/v1/generate-file'
+
+export function create(data: any) {
+ return base.create(path, data)
+}
+
+export function getList(params: any = null) {
+ return base.getList(path, params)
+}
+
+export function getDetail(id: number | string) {
+ return base.getDetail(path, id)
+}
diff --git a/app/services/medicine-form.service.ts b/app/services/medicine-form.service.ts
new file mode 100644
index 00000000..21874f5c
--- /dev/null
+++ b/app/services/medicine-form.service.ts
@@ -0,0 +1,41 @@
+// Base
+import * as base from './_crud-base'
+
+// Types
+import type { MedicineForm } from '~/models/medicine-form'
+
+const path = '/api/v1/medicine-form'
+const name = 'medicine-form'
+
+export function create(data: any) {
+ return base.create(path, data, name)
+}
+
+export function getList(params: any = null) {
+ return base.getList(path, params, name)
+}
+
+export function getDetail(id: number | string) {
+ return base.getDetail(path, id, name)
+}
+
+export function update(id: number | string, data: any) {
+ return base.update(path, id, data, name)
+}
+
+export function remove(id: number | string) {
+ return base.remove(path, id, name)
+}
+
+export async function getValueLabelList(params: any = null): Promise<{ value: string; label: string }[]> {
+ let data: { value: string; label: string }[] = []
+ const result = await getList(params)
+ if (result.success) {
+ const resultData = result.body?.data || []
+ data = resultData.map((item: MedicineForm) => ({
+ value: item.code,
+ label: item.name,
+ }))
+ }
+ return data
+}
diff --git a/app/services/supporting-document.service.ts b/app/services/supporting-document.service.ts
new file mode 100644
index 00000000..23f94820
--- /dev/null
+++ b/app/services/supporting-document.service.ts
@@ -0,0 +1,56 @@
+// Base
+import * as base from './_crud-base'
+
+// Constants
+import { uploadCode, type UploadCodeKey } from '~/lib/constants'
+
+const path = '/api/v1/encounter-document'
+const create_path = '/api/v1/upload-file'
+const name = 'encounter-document'
+
+export function create(data: any) {
+ return base.create(create_path, data, name)
+}
+
+export function getList(params: any = null) {
+ return base.getList(path, params, name)
+}
+
+export function getDetail(id: number | string, params?: any) {
+ return base.getDetail(path, id, name, params)
+}
+
+export function update(id: number | string, data: any) {
+ return base.update(path, id, data, name)
+}
+
+export function remove(id: number | string) {
+ return base.remove(path, id, name)
+}
+
+export async function uploadAttachment(file: File, userId: number, key: UploadCodeKey) {
+ try {
+ const resolvedKey = uploadCode[key]
+ if (!resolvedKey) {
+ throw new Error(`Invalid upload code key: ${key}`)
+ }
+
+ // siapkan form-data body
+ const formData = new FormData()
+ formData.append('code', resolvedKey)
+ formData.append('content', file)
+
+ // kirim via xfetch
+ const resp = await xfetch(`${path}/${userId}/upload`, 'POST', formData)
+
+ // struktur hasil sama seperti patchPatient
+ const result: any = {}
+ result.success = resp.success
+ result.body = (resp.body as Record) || {}
+
+ return result
+ } catch (error) {
+ console.error('Error uploading attachment:', error)
+ throw new Error('Failed to upload attachment')
+ }
+}
diff --git a/public/side-menu-items/sys.json b/public/side-menu-items/sys.json
new file mode 100644
index 00000000..db4a402c
--- /dev/null
+++ b/public/side-menu-items/sys.json
@@ -0,0 +1,372 @@
+[
+ {
+ "heading": "Menu Utama",
+ "items": [
+ {
+ "title": "Dashboard",
+ "icon": "i-lucide-home",
+ "link": "/"
+ },
+ {
+ "title": "Rawat Jalan",
+ "icon": "i-lucide-stethoscope",
+ "children": [
+ {
+ "title": "Antrian Pendaftaran",
+ "link": "/outpatient/registration-queue"
+ },
+ {
+ "title": "Antrian Poliklinik",
+ "link": "/outpatient/polyclinic-queue"
+ },
+ {
+ "title": "Kunjungan",
+ "link": "/outpatient/encounter"
+ },
+ {
+ "title": "Konsultasi",
+ "link": "/outpatient/consultation"
+ }
+ ]
+ },
+ {
+ "title": "IGD",
+ "icon": "i-lucide-zap",
+ "children": [
+ {
+ "title": "Triase",
+ "link": "/emergency/triage"
+ },
+ {
+ "title": "Kunjungan",
+ "link": "/emergency/encounter"
+ },
+ {
+ "title": "Konsultasi",
+ "link": "/emergency/consultation"
+ }
+ ]
+ },
+ {
+ "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",
+ "children": [
+ {
+ "title": "Permintaan",
+ "link": "/inpatient/request"
+ },
+ {
+ "title": "Kunjungan",
+ "link": "/inpatient/encounter"
+ },
+ {
+ "title": "Konsultasi",
+ "link": "/inpatient/consultation"
+ }
+ ]
+ },
+ {
+ "title": "Obat - Order",
+ "icon": "i-lucide-briefcase-medical",
+ "children": [
+ {
+ "title": "Permintaan",
+ "link": "/medication/order"
+ },
+ {
+ "title": "Standing Order",
+ "link": "/medication/standing-order"
+ }
+ ]
+ },
+ {
+ "title": "Lab - Order",
+ "icon": "i-lucide-microscope",
+ "link": "/pc-lab-order"
+ },
+ {
+ "title": "Lab Mikro - Order",
+ "icon": "i-lucide-microscope",
+ "link": "/micro-lab-order"
+ },
+ {
+ "title": "Lab PA - Order",
+ "icon": "i-lucide-microscope",
+ "link": "/pa-lab-order"
+ },
+ {
+ "title": "Radiologi - Order",
+ "icon": "i-lucide-radio",
+ "link": "/radiology-order"
+ },
+ {
+ "title": "Gizi",
+ "icon": "i-lucide-egg-fried",
+ "link": "/nutrition-order"
+ },
+ {
+ "title": "Pembayaran",
+ "icon": "i-lucide-banknote-arrow-up",
+ "link": "/payment"
+ }
+ ]
+ },
+ {
+ "heading": "Ruang Tindakan Rajal",
+ "items": [
+ {
+ "title": "Kemoterapi",
+ "icon": "i-lucide-droplets",
+ "link": "/outpation-action/cemotherapy"
+ },
+ {
+ "title": "Hemofilia",
+ "icon": "i-lucide-droplet-off",
+ "link": "/outpation-action/hemophilia"
+ }
+ ]
+ },
+ {
+ "heading": "Ruang Tindakan Anak",
+ "items": [
+ {
+ "title": "Thalasemi",
+ "icon": "i-lucide-baby",
+ "link": "/children-action/thalasemia"
+ },
+ {
+ "title": "Echocardiography",
+ "icon": "i-lucide-baby",
+ "link": "/children-action/echocardiography"
+ },
+ {
+ "title": "Spirometri",
+ "icon": "i-lucide-baby",
+ "link": "/children-action/spirometry"
+ }
+ ]
+ },
+ {
+ "heading": "Client",
+ "items": [
+ {
+ "title": "Pasien",
+ "icon": "i-lucide-users",
+ "link": "/client/patient"
+ },
+ {
+ "title": "Rekam Medis",
+ "icon": "i-lucide-file-text",
+ "link": "/client/medical-record"
+ }
+ ]
+ },
+ {
+ "heading": "Integrasi",
+ "items": [
+ {
+ "title": "BPJS",
+ "icon": "i-lucide-circuit-board",
+ "children": [
+ {
+ "title": "SEP",
+ "icon": "i-lucide-circuit-board",
+ "link": "/integration/bpjs/sep"
+ },
+ {
+ "title": "Peserta",
+ "icon": "i-lucide-circuit-board",
+ "link": "/integration/bpjs/member"
+ },
+ {
+ "title": "Surat Kontrol",
+ "icon": "i-lucide-circuit-board",
+ "link": "/integration/bpjs/control-letter"
+ }
+ ]
+ },
+ {
+ "title": "SATUSEHAT",
+ "icon": "i-lucide-database",
+ "link": "/integration/satusehat"
+ }
+ ]
+ },
+ {
+ "heading": "Source",
+ "items": [
+ {
+ "title": "Peralatan dan Perlengkapan",
+ "icon": "i-lucide-layout-dashboard",
+ "children": [
+ {
+ "title": "Obat",
+ "link": "/tools-equipment-src/medicine"
+ },
+ {
+ "title": "Peralatan",
+ "link": "/tools-equipment-src/tools"
+ },
+ {
+ "title": "Perlengkapan (BMHP)",
+ "link": "/tools-equipment-src/equipment"
+ },
+ {
+ "title": "Metode Obat",
+ "link": "/tools-equipment-src/medicine-method"
+ },
+ {
+ "title": "Jenis Obat",
+ "link": "/tools-equipment-src/medicine-type"
+ },
+ {
+ "title": "Sediaan Obat",
+ "link": "/tools-equipment-src/medicine-form"
+ }
+ ]
+ },
+ {
+ "title": "Pengguna",
+ "icon": "i-lucide-user",
+ "children": [
+ {
+ "title": "Pegawai",
+ "link": "/human-src/employee"
+ },
+ {
+ "title": "PPDS",
+ "link": "/human-src/specialist-intern"
+ }
+ ]
+ },
+ {
+ "title": "Pemeriksaan Penunjang",
+ "icon": "i-lucide-layout-list",
+ "children": [
+ {
+ "title": "Checkup",
+ "link": "/mcu-src/mcu"
+ },
+ {
+ "title": "Prosedur",
+ "link": "/mcu-src/procedure"
+ },
+ {
+ "title": "Diagnosis",
+ "link": "/mcu-src/diagnose"
+ },
+ {
+ "title": "Medical Action",
+ "link": "/mcu-src/medical-action"
+ }
+ ]
+ },
+ {
+ "title": "Layanan",
+ "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"
+ },
+ {
+ "title": "Kamar",
+ "link": "/service-src/chamber"
+ },
+ {
+ "title": "Ruang",
+ "link": "/service-src/room"
+ },
+ {
+ "title": "Depo",
+ "link": "/service-src/warehouse"
+ },
+ {
+ "title": "Lantai",
+ "link": "/service-src/floor"
+ },
+ {
+ "title": "Gedung",
+ "link": "/service-src/building"
+ }
+ ]
+ },
+ {
+ "title": "Organisasi",
+ "icon": "i-lucide-network",
+ "children": [
+ {
+ "title": "Divisi",
+ "link": "/org-src/division"
+ },
+ {
+ "title": "Instalasi",
+ "link": "/org-src/installation"
+ },
+ {
+ "title": "Unit",
+ "link": "/org-src/unit"
+ },
+ {
+ "title": "Spesialis",
+ "link": "/org-src/specialist"
+ },
+ {
+ "title": "Sub Spesialis",
+ "link": "/org-src/subspecialist"
+ }
+ ]
+ },
+ {
+ "title": "Umum",
+ "icon": "i-lucide-airplay",
+ "children": [
+ {
+ "title": "Uom",
+ "link": "/common/uom"
+ }
+ ]
+ },
+ {
+ "title": "Keuangan",
+ "icon": "i-lucide-airplay",
+ "children": [
+ {
+ "title": "Item & Pricing",
+ "link": "/common/item"
+ }
+ ]
+ }
+ ]
+ }
+]
diff --git a/public/side-menu-items/system.json b/public/side-menu-items/system.json
index 5bf62f36..31890951 100644
--- a/public/side-menu-items/system.json
+++ b/public/side-menu-items/system.json
@@ -240,6 +240,10 @@
{
"title": "Jenis Obat",
"link": "/tools-equipment-src/medicine-type"
+ },
+ {
+ "title": "Sediaan Obat",
+ "link": "/tools-equipment-src/medicine-form"
}
]
},