import React from 'react'; import { useResourceAvailability } from '../../hooks/useResourceCalendar'; import { formatDate, formatNumber } from '../../lib/utils'; import { DAY_LABELS } from './ResourceWorkingHoursPanel'; import NationalHolidaysCard from '../holidays/NationalHolidaysCard'; import ResourceExceptionsCard from './ResourceExceptionsCard'; import type { ResourceAvailability } from '../../types'; /** چرا یک روز خالی است — بدون ترجمه، پاسخ خام سرور به کاربر نشان داده می‌شد. */ const REASON_LABELS: Record = { national_holiday: 'تعطیل رسمی', tenant_holiday: 'تعطیلی این محیط', no_shift: 'شیفتی تعریف نشده', exception: 'مرخصی یا سرویس', resource_inactive: 'منبع غیرفعال است', address_inactive: 'محل نوبت‌دهی غیرفعال است', }; /** نیمه‌شبِ امروز به‌صورت timestamp ثانیه‌ای. */ function todayMidnight(): number { const d = new Date(); d.setHours(0, 0, 0, 0); return Math.floor(d.getTime() / 1000); } /** * تقویمِ استثناهای یک منبع: تعطیلات رسمی، مرخصی و سرویس، و پیش‌نمایش دو هفته. * * این ترکیب مخصوص صفحهٔ جزئیات منبع است، جایی که کل صفحه دربارهٔ همان یک منبع است * و پیش‌نمایش پاسخِ «بعد از این تنظیمات، چه ساعتی باز می‌ماند؟» را می‌دهد. صفحهٔ * تنظیمات نوبت‌دهی همان دو کارت را بدون پیش‌نمایش و به‌صورت تب می‌چیند. */ export default function ResourceExceptionsPanel({ resourceUuid, canUpdate }: { resourceUuid?: string; canUpdate: boolean; }) { const previewFrom = todayMidnight(); const previewTo = previewFrom + 13 * 86400; const { availability } = useResourceAvailability(resourceUuid, previewFrom, previewTo); return (
); } /** * پیش‌نمایش دو هفته. * * ۱۴ سطرِ یکنواختِ «شیفتی تعریف نشده» فقط نویز است و با یک حالت خالیِ راه‌حل‌دار * جمع می‌شود. شرط عمداً تنگ است: اگر حتی یک روز به دلیل دیگری (تعطیل رسمی، * مرخصی) بسته باشد سطرها می‌مانند، چون آن دلیل خودش اطلاعات است — نه نویز. */ function PreviewCard({ availability }: { availability?: ResourceAvailability }) { const days = availability?.days ?? []; const nothingConfigured = days.length > 0 && days.every((d) => d.intervals.length === 0 && d.reasons.length > 0 && d.reasons.every((r) => r === 'no_shift')); return (

پیش‌نمایش دو هفته

ساعت خام — نوبت‌های ثبت‌شده هنوز از آن کسر نشده‌اند.

{days.length === 0 ? (
) : nothingConfigured ? (

در دو هفتهٔ آینده هیچ ساعتی باز نیست. اول در «شیفت هفتگی» روزهای کاری را تعریف کنید.

) : (
{days.map((day) => (
{DAY_LABELS[day.day_of_week]} · {formatDate(day.date)} {day.intervals.length === 0 ? ( {day.reasons.map((r) => REASON_LABELS[r] ?? r).join('، ') || '—'} ) : ( {formatNumber(day.total_minutes)} دقیقه )}
))}
)}
); }