diff --git a/src/controllers/schedule.ts b/src/controllers/schedule.ts index fc82e1d..02676e4 100644 --- a/src/controllers/schedule.ts +++ b/src/controllers/schedule.ts @@ -248,12 +248,11 @@ export class ScheduleController { roomId: Joi.string().uuid().required(), doctorId: Joi.string().uuid().required(), title: Joi.string().max(256).required(), - timezone: Joi.string().max(64).required(), quota: Joi.number().integer().min(0).allow(null).optional(), startDate: Joi.string().required(), untilDate: Joi.string().allow("", null).optional(), - startTimeLocal: Joi.string().required(), - endTimeLocal: Joi.string().required(), + startTime: Joi.string().required(), + endTime: Joi.string().required(), recurrence: Joi.object({ type: Joi.string().valid("daily", "weekly", "monthly").required(), interval: Joi.number().min(1).optional(), @@ -292,12 +291,11 @@ export class ScheduleController { roomId: Joi.string().uuid().required(), doctorId: Joi.string().uuid().required(), title: Joi.string().max(256).required(), - timezone: Joi.string().max(64).required(), quota: Joi.number().integer().min(0).allow(null).optional(), startDate: Joi.string().required(), untilDate: Joi.string().allow("", null).optional(), - startTimeLocal: Joi.string().required(), - endTimeLocal: Joi.string().required(), + startTime: Joi.string().required(), + endTime: Joi.string().required(), recurrence: Joi.object({ type: Joi.string().valid("daily", "weekly", "monthly").required(), interval: Joi.number().min(1).optional(), diff --git a/src/model/schedule.ts b/src/model/schedule.ts index 9064c64..b74a61f 100644 --- a/src/model/schedule.ts +++ b/src/model/schedule.ts @@ -13,12 +13,11 @@ type ScheduleSeriesPayload = { roomId: string; doctorId: string; title: string; - timezone: string; quota?: number | null; startDate: string; untilDate?: string | null; - startTimeLocal: string; - endTimeLocal: string; + startTime: string; + endTime: string; recurrence?: RecurrenceInput | null; }; @@ -112,8 +111,8 @@ export class ScheduleModel { const exception = exceptionMap.get(`${series.id}:${occurrenceYmd}`); if (exception && exception.is_cancelled) continue; - const defaultStart = ScheduleModel.combineDateAndTime(occurrenceYmd, series.start_time_local); - const defaultEnd = ScheduleModel.combineDateAndTime(occurrenceYmd, series.end_time_local); + const defaultStart = ScheduleModel.combineDateAndTime(occurrenceYmd, series.start_time); + const defaultEnd = ScheduleModel.combineDateAndTime(occurrenceYmd, series.end_time); const doctor = exception?.override_doctor ?? series.doctor; const room = exception?.override_room ?? series.room; @@ -262,12 +261,11 @@ export class ScheduleModel { series.room = room; series.doctor = doctor; series.title = payload.title; - series.timezone = payload.timezone; series.quota = payload.quota ?? null; series.start_date = new Date(payload.startDate); series.until_date = payload.untilDate ? new Date(payload.untilDate) : null; - series.start_time_local = payload.startTimeLocal; - series.end_time_local = payload.endTimeLocal; + series.start_time = payload.startTime; + series.end_time = payload.endTime; series.recurrence_rule = ScheduleModel.recurrenceToRRule(payload.recurrence || null); series.status = Status.Active; series.created_by = actor; @@ -295,12 +293,11 @@ export class ScheduleModel { series.room = room; series.doctor = doctor; series.title = payload.title; - series.timezone = payload.timezone; series.quota = payload.quota ?? null; series.start_date = new Date(payload.startDate); series.until_date = payload.untilDate ? new Date(payload.untilDate) : null; - series.start_time_local = payload.startTimeLocal; - series.end_time_local = payload.endTimeLocal; + series.start_time = payload.startTime; + series.end_time = payload.endTime; series.recurrence_rule = ScheduleModel.recurrenceToRRule(payload.recurrence || null); series.updated_by = actor; diff --git a/src/swagger/builder.js b/src/swagger/builder.js index 6b1554d..802422d 100644 --- a/src/swagger/builder.js +++ b/src/swagger/builder.js @@ -2,504 +2,501 @@ 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", - }, - currency: { - $name: "Dolar", - $symbol: "$", - $status: "Y", - }, - inpatient_room: { - $room_id: "34fdda87-9b42-44d3-8cab-2f2032481d42", - $name: "Name", - $number_of_bed: 1, - }, - 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", - $serviceclass: "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_id: "uuid-string", - $faretype: [ - { - $faretype_id: "uuid-string", - $service_class: [ - { - $service_class_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_ids: "[] array uuid-string", - $status: { "@enum": ["Y", "N"] }, - }, - serviceExamination: { - $examination_detail_ids: ["uuid-string"], - }, - serviceExaminationCreate: { - $examination_detail_ids: ["uuid-string"], - $service_id: "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)", - $smallunit: "string", - $largeunit: "string", - $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)", - $province: "Province Code", - $city: "City Code", - $subdistrict: "Subdistrict Code", - $ward: "Ward Code", - }, - 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) - $faretype: "3f1a1b33-bbb2-4f33-b2c4-cff5976f3f95", // Fare Type (UUID) - $maximalliability: 1000000, // Maximal Liability (opsional) - }, - refferal_hospital: { - $refferal_hospital_name: "RefferalHospital name", - }, - user_to_room: { - $user_id: "user ID (required, UUID)", - $room_id: "Room ID (required, UUID)", - }, - user_to_room_update: { - $user_id: "user ID (required, UUID)", - $room_ids: "Array [room-uuid-1, room-uuid-2]", - }, - room_to_pharmacy: { - $room_id: "room ID (required, UUID)", - $pharmacy_room_id: "Pharmacy Room ID (required, UUID)", - }, - 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)", - }, - card_type: { - $name: "Name (string)", - }, - payment_method: { - $name: "Name (string)", - }, - registration_fee: { - type: "emergency | outpatient", - service: ["uuid-string-1", "uuid-string-2"], - }, - serviceFareUpdate: { - $fare: 100000, - }, - responsiblepartyconsent: { - $bodytext: "string", - }, - }, - parameters: {}, - securitySchemes: { - bearerAuth: { - type: "http", - scheme: "bearer", - }, - }, - }, + 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", + }, + currency: { + $name: "Dolar", + $symbol: "$", + $status: "Y", + }, + inpatient_room: { + $room_id: "34fdda87-9b42-44d3-8cab-2f2032481d42", + $name: "Name", + $number_of_bed: 1, + }, + 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", + $serviceclass: "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_id: "uuid-string", + $faretype: [ + { + $faretype_id: "uuid-string", + $service_class: [ + { + $service_class_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_ids: "[] array uuid-string", + $status: { "@enum": ["Y", "N"] }, + }, + serviceExamination: { + $examination_detail_ids: ["uuid-string"], + }, + serviceExaminationCreate: { + $examination_detail_ids: ["uuid-string"], + $service_id: "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)", + $smallunit: "string", + $largeunit: "string", + $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)", + $province: "Province Code", + $city: "City Code", + $subdistrict: "Subdistrict Code", + $ward: "Ward Code", + }, + 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) + $faretype: "3f1a1b33-bbb2-4f33-b2c4-cff5976f3f95", // Fare Type (UUID) + $maximalliability: 1000000, // Maximal Liability (opsional) + }, + refferal_hospital: { + $refferal_hospital_name: "RefferalHospital name", + }, + user_to_room: { + $user_id: "user ID (required, UUID)", + $room_id: "Room ID (required, UUID)", + }, + user_to_room_update: { + $user_id: "user ID (required, UUID)", + $room_ids: "Array [room-uuid-1, room-uuid-2]", + }, + room_to_pharmacy: { + $room_id: "room ID (required, UUID)", + $pharmacy_room_id: "Pharmacy Room ID (required, UUID)", + }, + 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", + $quota: 20, + $startDate: "2026-03-20", + $untilDate: "2026-06-30", + $startTime: "09:00:00", + $endTime: "12:00:00", + $recurrence: { $ref: "#/components/schemas/scheduleRecurrence" }, + }, + scheduleSeriesUpdate: { + $roomId: "uuid-string", + $doctorId: "uuid-string", + $title: "Practice Schedule Updated", + $quota: 25, + $startDate: "2026-03-20", + $untilDate: "2026-07-31", + $startTime: "10:00:00", + $endTime: "13:00:00", + $recurrence: { $ref: "#/components/schemas/scheduleRecurrence" }, + }, + scheduleSeriesDetail: { + $id: "uuid-string", + $room_id: "uuid-string", + $doctor_id: "uuid-string", + $title: "Practice Schedule", + $quota: 20, + $start_date: "2026-03-20", + $until_date: "2026-06-30", + $start_time: "09:00:00", + $end_time: "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)", + }, + card_type: { + $name: "Name (string)", + }, + payment_method: { + $name: "Name (string)", + }, + registration_fee: { + type: "emergency | outpatient", + service: ["uuid-string-1", "uuid-string-2"], + }, + serviceFareUpdate: { + $fare: 100000, + }, + responsiblepartyconsent: { + $bodytext: "string", + }, + }, + parameters: {}, + securitySchemes: { + bearerAuth: { + type: "http", + scheme: "bearer", + }, + }, + }, }; const outputFile = "./swagger.json";