const swaggerAutogen = require('swagger-autogen')({ openapi: '3.0.0' }); const config = require('config'); const doc = { info: { title: config.get('app.name'), description: config.get('app.description'), version: config.get('app.version') }, servers: [ { url: config.get('server.host_swagger'), description: 'Environtment ' + config.get('app.env') }, ], components: { schemas: { product: { $code: "123456", $name: "Product name", $description: "Product description", $source: "trialBalanceBranch / cifAccount / lnkolek", $status: "Y", }, branch: { $code: "123456", $name: "Branch name", $status: "Y", }, menu: { $module: "Dashboard", $name: "Dashboard", $link: "/", $id_parent: "", $order_number: 1, $icon: "", $application: "ukln", $status: "Y" }, administrativu: { $code: '123456', $name: 'Administrativu name', $status: "Y", $munisipo_id: "uuid-string" }, application: { $id: 'ukln', $name: 'Dashboard Performance Business', $reset_password_url: 'https://brilianapps.britimorleste.tl/ukln/auth/reset-password/', $status: "Y" }, aldeia: { $code: '123456', $name: 'Aldeia name', $status: "Y", $suco_id: "uuid-string" }, class_economi: { $code: '123456', $name: 'Class economi name', $status: "Y" }, district: { $code: '123456', $name: 'District name', $status: "Y" }, income_tier: { $code: '123456', $name: 'Income tier name', $status: "Y" }, munisipo: { $code: '123456', $name: 'Munisipo name', $status: "Y" }, suco: { $code: '123456', $name: 'Suco name', $status: "Y", $administrativu_id: "uuid-string" }, nationality: { $code: '123456', $name: 'Nationality name', $status: "Y" }, classEconomi: { $code: '123456', $name: 'Class Economi name', $status: "Y" }, incomeTier: { $code: '123456', $name: 'Income Tier name', $status: "Y" }, diagnosis: { $diagnosis: "Diagnosis name (ICD-11)", $code: "ABC123", $status: "Y" }, diagnostic_procedure: { $diagnosticProcedure: "Procedure name (ICD-9)", $code: "XYZ789", $status: "Y" }, room: { $room: "Room name", $code: "R001", $description: "Optional description", $department_id: "uuid-string", $status: "Y", $location: "Room location", $picture: "Room picture name" }, laboratory: { $room: "Room name", $code: "R001", $description: "Optional description", $department_id: "uuid-string", $status: "Y" }, // pharmacy: { // $room: "Room name", // $code: "R001", // $description: "Optional description", // $department_id: "uuid-string", // $status: "Y" // }, serviceType: { $name: "Registration & Tickets", $status: { "@enum": ["Y", "N"] } }, serviceClass: { $name: "Class name" }, service: { $name: "e.g. ER Registration", $service_type_id: "uuid-string", $status: { "@enum": ["Y", "N"] } }, roomServices: { $service_ids: ["uuid-string"] }, serviceFare: { $service_class_id: "uuid-string", $service_id: "uuid-string", $fare: 100000 }, servicePackage: { $name: "Package name", $service_class_id: "uuid-string", $fare: 500000, $service_ids: ["uuid-string"] }, department: { $name: "igd", $status: { "@enum": ["Y", "N"] } }, doctorSchedule: { $day: "Senin", $start_time: "08:00", $end_time: "12:00", $doctor_id: "uuid-string", $room_id: "uuid-string", $quota: "20", $status: { "@enum": ["Y", "N"] } }, doctorItem: { $doctor_id: "uuid-string", $item_master_id: "uuid-string" }, doctorItemPackage: { $doctor_id: "uuid-string", $name: "Paket Obat Harian", $description: "Optional description", $item_master_ids: ["uuid-string"], $active: true }, measurementUnit: { $unit: "Milligram", $status: { "@enum": ["Y", "N"] } }, referenceRange: { $gender: { "@enum": ["male", "female"] }, $age_range_min: "0 | (days)", $age_range_max: "20 | (days)", $value_min: "13.7", $value_max: "17.5", $status: { "@enum": ["Y", "N"] } }, queueMonitoring: { $name: "Ground Floor Queue", $slug: "ground-floor-queue", $room_ids: ["uuid-string"], $status: { "@enum": ["Y", "N"] } }, examinationType: { $name: "Examination Type name", $status: { "@enum": ["Y", "N"] }, $service_ids: ["uuid-string"] }, examinationDetail: { $name: "Examination Detail name", $order_no: "Order number", $measurement_unit_id: "uuid-string", $reference_range_id: "uuid-string", $status: { "@enum": ["Y", "N"] } }, serviceExamination: { $examination_detail_ids: ["uuid-string"] }, hospitalinformation: { $name: "Hospital Name", $address: "Hospital Address", $phone: "Hospital Phone", $logo: "Hospital Logo", }, files: { $file_name: "File Name", }, item_group: { $group_name: 'ItemGroup name', }, item_origin: { $origin_name: 'ItemOrigin name', $origin_description: 'ItemOrigin Desc', $department: 'Department name', $account: 'Account name', }, item_type: { $type_name: 'ItemType name', $item_group_id: 'ItemGroup Id' }, item_type_detail: { $type_detail_name: 'ItemTypeDetail name', $item_type_id: 'ItemType Id' }, unit: { $unit_name: 'Unit name', $small_unit: 'Small unit name', $large_unit: 'Large unit name' }, item_category: { $category_name: 'ItemCategory name', }, item_status: { $status_name: 'Itemstatus name', }, item_class: { $item_class_name: 'ItemClass name', }, item_class_detail: { $class_detail_name: 'ItemClassDetail name', }, usage_instructions: { $usage_instructions_name: 'UsageInstructions name', $usage_instructions_abbreviation: 'UsageInstructions Abbreviation' }, usage_time: { $usage_time_name: 'UsageInstructions name', $usage_time_abbreviation: 'UsageInstructions Abbreviation' }, generic_name: { $generic_name: 'Generic name', }, factory: { $factory_name: 'factory name', $address: 'Factory address', $web: 'Factory url web', $phone: 'Factory phone', $email: 'Factory email' }, supplier: { $supplier_name: 'supplier name', $address: 'supplier address', $phone: 'supplier phone', $email: 'supplier email' }, factory_to_supplier: { $supplier_id: 'Supplier ID (required, UUID)', $factory_ids: 'Array [factory-uuid-1, factory-uuid-2]' }, item_master: { $item_name: 'Item name', $generic_name_id: 'Generic name ID (UUID)', $item_type_detail_id: 'Item type detail ID (UUID)', $item_category_id: 'Item category ID (UUID)', $item_class_id: 'Item class ID (UUID)', $item_class_detail_id: 'Item class Detail ID (UUID)', $item_status_id: 'Item status ID (UUID)', $factory_id: 'Factory ID (UUID)', $unit_id: 'Unit ID (UUID)', $pack_size: 'Pack size (integer, minimum 0)', $minimum_quantity: 'Minimum quantity (integer, minimum 0)', $minimum_sales_quantity: 'Minimum sales quantity (integer, minimum 0)', $strength: 'Strength value (number, minimum 0)', $active: 'Active status (boolean)' }, pharmacy_info: { $logo: 'Logo (string, max 256)', $name: 'Name (string, max 256)', $address: 'Address (string, max 500)', $munisipiu: 'Munisipiu ID (UUID)', $postu_admin: 'Postu Admin ID (UUID)', $suco: 'Suco ID (UUID)', $aldeia: 'Aldeia ID (UUID)', $phone: 'Phone (string, max 30, optional)', $default_room_id: 'Default Room ID (UUID)' }, item_price: { $item_master_id: 'Item Master ID (required, UUID)', $purchase_price: 'Purchase Price (required, number, minimum 0)', $selling_price: 'Selling Price (required, number, minimum 0)', $expired_date: 'Expired Date (required, date)' }, initial_stock: { $itemmaster: 'Item Master uuid', $room: 'Room uuid', $itemorigin: 'Item Origin uuid', $batch: 'Batch', $exp_date: 'Exp Date', $stock: 'Stock' }, selling_price_percentage: { $item_master_id: 'Item Master ID (required, UUID)', $item_origin_id: 'Item Origin ID (required, UUID)', $percentage: 'Percentage (required, number, min 0, max 999.99, 2 decimal places)' }, patient_group: { $patient_group_name: 'PatientGroup name', }, patient_guarantor: { $guarantor_name: 'PatientGuarantor name', $phone: '08123456789', // Nomor telepon $province: 'West Java', // Provinsi $city: 'Bandung', // Kota $zip_code: '40123', // Kode Pos $agreement_no: 'AG123456789', // Nomor Perjanjian $agreement_desc: 'Health Insurance Agreement', // Deskripsi Perjanjian (opsional) $patient_group_id: '2e1a1b33-bbb2-4f33-b2c4-cff5976f3f95', // Patient Group (UUID) }, refferal_hospital: { $refferal_hospital_name: 'RefferalHospital name', }, user_to_room: { $user_id: 'user ID (required, UUID)', $room_ids: 'Array [room-uuid-1, room-uuid-2]' }, room_to_pharmacy: { $pharmacy_room_id: 'Pharmacy Room ID (required, UUID)', $room_ids: 'Array [room-uuid-1, room-uuid-2]' }, planning_verificator: { $user_id: 'User ID (required, UUID)' }, scheduleRecurrence: { $type: { "@enum": ["daily", "weekly", "monthly"] }, $interval: 1, $daysOfWeek: ["MO", "WE", "FR"] }, scheduleSeriesCreate: { $roomId: "uuid-string", $doctorId: "uuid-string", $title: "Practice Schedule", $timezone: "Asia/Jakarta", $quota: 20, $startDate: "2026-03-20", $untilDate: "2026-06-30", $startTimeLocal: "09:00:00", $endTimeLocal: "12:00:00", $recurrence: { $ref: "#/components/schemas/scheduleRecurrence" } }, scheduleSeriesUpdate: { $roomId: "uuid-string", $doctorId: "uuid-string", $title: "Practice Schedule Updated", $timezone: "Asia/Jakarta", $quota: 25, $startDate: "2026-03-20", $untilDate: "2026-07-31", $startTimeLocal: "10:00:00", $endTimeLocal: "13:00:00", $recurrence: { $ref: "#/components/schemas/scheduleRecurrence" } }, scheduleSeriesDetail: { $id: "uuid-string", $room_id: "uuid-string", $doctor_id: "uuid-string", $title: "Practice Schedule", $timezone: "Asia/Jakarta", $quota: 20, $start_date: "2026-03-20", $until_date: "2026-06-30", $start_time_local: "09:00:00", $end_time_local: "12:00:00", $recurrence: { $ref: "#/components/schemas/scheduleRecurrence" }, $status: "Active", $room: { id: "uuid-string", room: "Room 1" }, $doctor: { id: "uuid-string", name: "Dr A" } }, scheduleExceptionCreate: { $occurrenceDate: "2026-03-24", $isCancelled: false, $overrideRoomId: "uuid-string", $overrideDoctorId: "uuid-string", $overrideTitle: "Override Practice", $overrideStartAt: "2026-03-24T10:00:00.000Z", $overrideEndAt: "2026-03-24T12:30:00.000Z" }, scheduleCalendarResource: { $id: "room-1:doctor-1", $roomId: "room-1", $roomName: "Room 1", $doctorId: "doctor-1", $doctorName: "Dr A" }, scheduleCalendarEvent: { $id: "occ:series-101:2026-03-20", $seriesId: "series-101", $resourceId: "room-1:doctor-1", $title: "Practice", $startAt: "2026-03-20T09:00:00+07:00", $endAt: "2026-03-20T12:00:00+07:00", $quota: 20, $usedQuota: 7, $leftQuota: 13, $isRecurring: true, $isException: false, $status: "confirmed" }, scheduleCalendarMeta: { $total_count: 24, $page: 1, $limit: 20 }, faretype: { $name: 'Name (string)', }, }, parameters: { }, securitySchemes: { bearerAuth: { type: 'http', scheme: 'bearer' } } } }; const outputFile = './swagger.json'; const routes = ['../routes/private.ts', '../routes/public.ts']; swaggerAutogen(outputFile, routes, doc);