- Updated DoctorPage component to accept bookingResources prop for appointment list. - Added serviceQuery function to serialize service item UUIDs for API requests. - Introduced new API endpoints for fetching booking resources and resource slots. - Enhanced tests for new resource-based booking functionality, including resource selection and service availability. - Created ResourceSelect component for selecting appointment types, including doctor and resource options. - Updated appointment submission logic to include resource_uuid in payload when applicable. - Ensured UI reflects changes in booking flow without disrupting existing doctor-centric experience.
64 lines
2.2 KiB
JavaScript
64 lines
2.2 KiB
JavaScript
import moment from "moment-jalaali";
|
|
|
|
const DAY_NAMES = [
|
|
"یکشنبه",
|
|
"دوشنبه",
|
|
"سهشنبه",
|
|
"چهارشنبه",
|
|
"پنجشنبه",
|
|
"جمعه",
|
|
"شنبه",
|
|
];
|
|
|
|
const formatJalali = (ts) => {
|
|
const m = moment.unix(ts);
|
|
return `${DAY_NAMES[m.day()]} ${m.format("HH:mm")}`;
|
|
};
|
|
|
|
/**
|
|
* قاعدهٔ واحد فعال/غیرفعال بودن نوبتدهی در پروفایل پزشک.
|
|
*
|
|
* booking_locations دقیقتر از doctor.active است: backend فقط محلهای واقعاً
|
|
* قابلرزرو را برمیگرداند. تا وقتی حداقل یک محل هست، نوبتدهی فعال است — حتی
|
|
* اگر فیلد قدیمی active به هر دلیل false باشد. بدون محل، همان فیلدهای doctor
|
|
* ملاک میمانند (سازگاری با پزشک بدون برنامه).
|
|
*
|
|
* منبع مسیر سومی است: دستگاه و اتاق تقویم خودشان را دارند و به برنامهٔ هفتگیِ پزشک
|
|
* وابسته نیستند. پزشکی که خودش نوبت آنلاین نمیدهد ولی دستگاهش میدهد، «نوبتدهی
|
|
* غیرفعال» نیست — فقط ویزیت مستقیم ندارد.
|
|
*/
|
|
export function bookingState(doctor, bookingLocations, bookingResources = []) {
|
|
const hasLocations =
|
|
Array.isArray(bookingLocations) && bookingLocations.length > 0;
|
|
const hasResources =
|
|
Array.isArray(bookingResources) && bookingResources.length > 0;
|
|
|
|
if (!hasLocations && hasResources) {
|
|
return { enabled: true, label: "رزرو نوبت دستگاه و خدمات" };
|
|
}
|
|
|
|
if (!hasLocations) {
|
|
const enabled = doctor?.active !== false && !!doctor?.free_turn;
|
|
return {
|
|
enabled,
|
|
label: enabled
|
|
? `اولین نوبت آزاد: ${doctor.free_turn}`
|
|
: "نوبتدهی غیرفعال است",
|
|
};
|
|
}
|
|
|
|
const earliest =
|
|
bookingLocations
|
|
.map((l) => l.next_available_at)
|
|
.filter((t) => t != null)
|
|
.sort((a, b) => a - b)[0] ?? null;
|
|
|
|
return {
|
|
enabled: true,
|
|
label:
|
|
earliest != null
|
|
? `اولین نوبت آزاد: ${formatJalali(earliest)}`
|
|
: "فعلاً نوبت خالی ندارد",
|
|
};
|
|
}
|