This commit is contained in:
2026-04-17 16:21:10 +07:00
3 changed files with 507 additions and 515 deletions

View File

@ -248,12 +248,11 @@ export class ScheduleController {
roomId: Joi.string().uuid().required(), roomId: Joi.string().uuid().required(),
doctorId: Joi.string().uuid().required(), doctorId: Joi.string().uuid().required(),
title: Joi.string().max(256).required(), title: Joi.string().max(256).required(),
timezone: Joi.string().max(64).required(),
quota: Joi.number().integer().min(0).allow(null).optional(), quota: Joi.number().integer().min(0).allow(null).optional(),
startDate: Joi.string().required(), startDate: Joi.string().required(),
untilDate: Joi.string().allow("", null).optional(), untilDate: Joi.string().allow("", null).optional(),
startTimeLocal: Joi.string().required(), startTime: Joi.string().required(),
endTimeLocal: Joi.string().required(), endTime: Joi.string().required(),
recurrence: Joi.object({ recurrence: Joi.object({
type: Joi.string().valid("daily", "weekly", "monthly").required(), type: Joi.string().valid("daily", "weekly", "monthly").required(),
interval: Joi.number().min(1).optional(), interval: Joi.number().min(1).optional(),
@ -292,12 +291,11 @@ export class ScheduleController {
roomId: Joi.string().uuid().required(), roomId: Joi.string().uuid().required(),
doctorId: Joi.string().uuid().required(), doctorId: Joi.string().uuid().required(),
title: Joi.string().max(256).required(), title: Joi.string().max(256).required(),
timezone: Joi.string().max(64).required(),
quota: Joi.number().integer().min(0).allow(null).optional(), quota: Joi.number().integer().min(0).allow(null).optional(),
startDate: Joi.string().required(), startDate: Joi.string().required(),
untilDate: Joi.string().allow("", null).optional(), untilDate: Joi.string().allow("", null).optional(),
startTimeLocal: Joi.string().required(), startTime: Joi.string().required(),
endTimeLocal: Joi.string().required(), endTime: Joi.string().required(),
recurrence: Joi.object({ recurrence: Joi.object({
type: Joi.string().valid("daily", "weekly", "monthly").required(), type: Joi.string().valid("daily", "weekly", "monthly").required(),
interval: Joi.number().min(1).optional(), interval: Joi.number().min(1).optional(),

View File

@ -13,12 +13,11 @@ type ScheduleSeriesPayload = {
roomId: string; roomId: string;
doctorId: string; doctorId: string;
title: string; title: string;
timezone: string;
quota?: number | null; quota?: number | null;
startDate: string; startDate: string;
untilDate?: string | null; untilDate?: string | null;
startTimeLocal: string; startTime: string;
endTimeLocal: string; endTime: string;
recurrence?: RecurrenceInput | null; recurrence?: RecurrenceInput | null;
}; };
@ -112,8 +111,8 @@ export class ScheduleModel {
const exception = exceptionMap.get(`${series.id}:${occurrenceYmd}`); const exception = exceptionMap.get(`${series.id}:${occurrenceYmd}`);
if (exception && exception.is_cancelled) continue; if (exception && exception.is_cancelled) continue;
const defaultStart = ScheduleModel.combineDateAndTime(occurrenceYmd, series.start_time_local); const defaultStart = ScheduleModel.combineDateAndTime(occurrenceYmd, series.start_time);
const defaultEnd = ScheduleModel.combineDateAndTime(occurrenceYmd, series.end_time_local); const defaultEnd = ScheduleModel.combineDateAndTime(occurrenceYmd, series.end_time);
const doctor = exception?.override_doctor ?? series.doctor; const doctor = exception?.override_doctor ?? series.doctor;
const room = exception?.override_room ?? series.room; const room = exception?.override_room ?? series.room;
@ -262,12 +261,11 @@ export class ScheduleModel {
series.room = room; series.room = room;
series.doctor = doctor; series.doctor = doctor;
series.title = payload.title; series.title = payload.title;
series.timezone = payload.timezone;
series.quota = payload.quota ?? null; series.quota = payload.quota ?? null;
series.start_date = new Date(payload.startDate); series.start_date = new Date(payload.startDate);
series.until_date = payload.untilDate ? new Date(payload.untilDate) : null; series.until_date = payload.untilDate ? new Date(payload.untilDate) : null;
series.start_time_local = payload.startTimeLocal; series.start_time = payload.startTime;
series.end_time_local = payload.endTimeLocal; series.end_time = payload.endTime;
series.recurrence_rule = ScheduleModel.recurrenceToRRule(payload.recurrence || null); series.recurrence_rule = ScheduleModel.recurrenceToRRule(payload.recurrence || null);
series.status = Status.Active; series.status = Status.Active;
series.created_by = actor; series.created_by = actor;
@ -295,12 +293,11 @@ export class ScheduleModel {
series.room = room; series.room = room;
series.doctor = doctor; series.doctor = doctor;
series.title = payload.title; series.title = payload.title;
series.timezone = payload.timezone;
series.quota = payload.quota ?? null; series.quota = payload.quota ?? null;
series.start_date = new Date(payload.startDate); series.start_date = new Date(payload.startDate);
series.until_date = payload.untilDate ? new Date(payload.untilDate) : null; series.until_date = payload.untilDate ? new Date(payload.untilDate) : null;
series.start_time_local = payload.startTimeLocal; series.start_time = payload.startTime;
series.end_time_local = payload.endTimeLocal; series.end_time = payload.endTime;
series.recurrence_rule = ScheduleModel.recurrenceToRRule(payload.recurrence || null); series.recurrence_rule = ScheduleModel.recurrenceToRRule(payload.recurrence || null);
series.updated_by = actor; series.updated_by = actor;

View File

@ -401,24 +401,22 @@ const doc = {
$roomId: "uuid-string", $roomId: "uuid-string",
$doctorId: "uuid-string", $doctorId: "uuid-string",
$title: "Practice Schedule", $title: "Practice Schedule",
$timezone: "Asia/Jakarta",
$quota: 20, $quota: 20,
$startDate: "2026-03-20", $startDate: "2026-03-20",
$untilDate: "2026-06-30", $untilDate: "2026-06-30",
$startTimeLocal: "09:00:00", $startTime: "09:00:00",
$endTimeLocal: "12:00:00", $endTime: "12:00:00",
$recurrence: { $ref: "#/components/schemas/scheduleRecurrence" }, $recurrence: { $ref: "#/components/schemas/scheduleRecurrence" },
}, },
scheduleSeriesUpdate: { scheduleSeriesUpdate: {
$roomId: "uuid-string", $roomId: "uuid-string",
$doctorId: "uuid-string", $doctorId: "uuid-string",
$title: "Practice Schedule Updated", $title: "Practice Schedule Updated",
$timezone: "Asia/Jakarta",
$quota: 25, $quota: 25,
$startDate: "2026-03-20", $startDate: "2026-03-20",
$untilDate: "2026-07-31", $untilDate: "2026-07-31",
$startTimeLocal: "10:00:00", $startTime: "10:00:00",
$endTimeLocal: "13:00:00", $endTime: "13:00:00",
$recurrence: { $ref: "#/components/schemas/scheduleRecurrence" }, $recurrence: { $ref: "#/components/schemas/scheduleRecurrence" },
}, },
scheduleSeriesDetail: { scheduleSeriesDetail: {
@ -426,12 +424,11 @@ const doc = {
$room_id: "uuid-string", $room_id: "uuid-string",
$doctor_id: "uuid-string", $doctor_id: "uuid-string",
$title: "Practice Schedule", $title: "Practice Schedule",
$timezone: "Asia/Jakarta",
$quota: 20, $quota: 20,
$start_date: "2026-03-20", $start_date: "2026-03-20",
$until_date: "2026-06-30", $until_date: "2026-06-30",
$start_time_local: "09:00:00", $start_time: "09:00:00",
$end_time_local: "12:00:00", $end_time: "12:00:00",
$recurrence: { $ref: "#/components/schemas/scheduleRecurrence" }, $recurrence: { $ref: "#/components/schemas/scheduleRecurrence" },
$status: "Active", $status: "Active",
$room: { id: "uuid-string", room: "Room 1" }, $room: { id: "uuid-string", room: "Room 1" },