; slot: { start: number; end: number } | null }>({ serviceUuids: [], durations: {}, slot: null });
// ── زمان نوبت
@@ -158,7 +189,10 @@ export default function AppointmentCreatePage() {
const create = useMutation({
mutationFn: async () => {
- const createEndpoint = primaryRole === 'admin' ? '/api/v1/admin/appointment' : '/api/v1/my/appointment';
+ // اندپوینت ادمین `resource_uuid` نمیشناسد؛ نوبتِ منبع همیشه از مسیر پنل میرود.
+ const createEndpoint = primaryRole === 'admin' && !resourceMode
+ ? '/api/v1/admin/appointment'
+ : '/api/v1/my/appointment';
const slotStart = serviceMode ? servicePick.slot!.start : (slotPick ? slotPick.start : toEpoch(date, start));
const slotEnd = serviceMode ? servicePick.slot!.end : (slotPick ? slotPick.end : toEpoch(date, end));
@@ -169,13 +203,18 @@ export default function AppointmentCreatePage() {
patient_name: effectiveName,
patient_mobile: effectiveMobile,
patient_national_code: effectiveNationalCode,
+ // محل نوبتدهی: بدون `clinic_uuid` سرور نوبت را به مطب شخصیِ پزشک مینشاند —
+ // و در حالت منبع، منبعِ کلینیک اصلاً «متعلق به این محیط» شناخته نمیشود (۴۲۲).
+ ...(clinicUuid ? { clinic_uuid: clinicUuid } : {}),
+ ...(resourceMode ? { resource_uuid: activeResource!.uuid } : {}),
...(serviceMode
? { service_item_uuids: servicePick.serviceUuids, duration_from_services: true, service_durations: servicePick.durations }
: {
...(sectionUuid ? { service_section_uuid: sectionUuid } : {}),
...(selectedServices.length ? { service_item_uuids: selectedServices.map(s => s.uuid) } : {}),
}),
- ...(staffUuid ? { staff_uuid: staffUuid } : {}),
+ // پرسنل فقط در حالت پزشک معنا دارد؛ در حالت منبع، خودِ منبع مجریِ نوبت است.
+ ...(staffUuid && !resourceMode ? { staff_uuid: staffUuid } : {}),
...(depositRequired ? { deposit_required: true, deposit_amount_rials: tomanToRial(depositToman) } : {}),
...(visitPriceToman > 0 ? { visit_price_rials: tomanToRial(visitPriceToman) } : {}),
...(note.trim() ? { note: note.trim() } : {}),
@@ -234,8 +273,37 @@ export default function AppointmentCreatePage() {
>
)}
+ {/* هدف نوبت — فقط وقتی این پزشک منبعی زیر نظر دارد */}
+ {supervisedResources.length > 0 && (
+ <>
+ هدف نوبت:
+
+ {[{ uuid: '', name: 'خودِ پزشک' }, ...supervisedResources.map(r => ({ uuid: r.uuid, name: r.name }))].map(t => {
+ const active = resourceUuid === t.uuid;
+ return (
+ setResourceUuid(t.uuid)}
+ style={{
+ fontSize: 13, padding: '8px 14px', borderRadius: 'var(--r-pill)', cursor: 'pointer',
+ fontFamily: 'inherit', minHeight: 36,
+ border: active ? '1px solid var(--primary)' : '1px solid var(--border)',
+ background: active ? 'var(--primary)' : 'var(--surface)',
+ color: active ? 'var(--on-primary)' : 'var(--text)',
+ }}>
+ {t.name}
+
+ );
+ })}
+
+
+ {resourceMode
+ ? 'زمانها از تقویم خودِ منبع میآیند و سرویسها همانهاییاند که روی این منبع فعالاند.'
+ : 'زمانها از برنامهٔ هفتگی پزشک میآیند.'}
+
+ >
+ )}
+
{/* مراجعه کننده */}
- اطلاعات مراجعه کننده :
+ اطلاعات مراجعه کننده :
{/* آمده از پروندهٔ بیمار: مراجعهکننده معلوم است، جستجو معنا ندارد. */}
{fromRecordUuid ? (
@@ -358,9 +426,10 @@ export default function AppointmentCreatePage() {
>
)}
- {/* مشخصات سرویس */}
- مشخصات سرویس
- {!serviceMode ? (
+ {/* مشخصات سرویس — در حالت منبع، سرویسها داخل انتخابگر زمانِ همان منبع انتخاب
+ میشوند (فقط سرویسهایی که روی آن منبع فعالاند)، پس این بخش جا ندارد. */}
+ {!resourceMode && مشخصات سرویس
}
+ {resourceMode ? null : !serviceMode ? (
<>
@@ -472,7 +541,7 @@ export default function AppointmentCreatePage() {
)}
{/* زمان نوبت */}
-
زمان نوبت
+
زمان نوبت{resourceMode ? ` — ${activeResource!.name}` : ''}
{serviceMode ? (
<>
انتخاب تاریخ
@@ -481,8 +550,9 @@ export default function AppointmentCreatePage() {
{doctorUuid ? (
) : (