Files
nobat724_front/components/doctor/appointmentList/bookingState.js
T
hamed 54bebbd41a feat: Implement resource-based appointment booking flow
- 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.
2026-08-09 10:45:52 +03:30

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)}`
: "فعلاً نوبت خالی ندارد",
};
}