import React, { useState } from 'react'; import { useNavigate, useParams } from 'react-router-dom'; import { BeakerIcon } from '@heroicons/react/24/outline'; import PageHeader from '../components/ui/PageHeader'; import ConfirmDialog from '../components/ui/ConfirmDialog'; import DataTable, { type Column } from '../components/ui/DataTable'; import { formatDate } from '../lib/utils'; import { usePermissions } from '../hooks/usePermissions'; import { usePolicies, usePolicy, usePolicySimulation } from '../hooks/usePolicies'; import type { PolicySimulationRun, SimulationRow } from '../types'; const SEVERITY: Record = { none: { label: 'بدون اثر', className: 'badge', note: 'این قانون روی هیچ نوبتی از نمونه اثر نداشت — احتمالاً شرطش هرگز برقرار نمی‌شود.', }, low: { label: 'کم', className: 'badge green', note: 'اثر محدود و قابل انتظار.' }, medium: { label: 'متوسط', className: 'badge amber', note: 'بخش قابل‌توجهی از نوبت‌ها تغییر می‌کنند.' }, high: { label: 'زیاد', className: 'badge red', note: 'بیشتر نوبت‌های نمونه تغییر می‌کنند. مطمئنید قانون درست نوشته شده؟', }, }; /** * آزمایش قانون روی نوبت‌های واقعی گذشته. * * ستون «وضعیت فعلی → با این قانون» تنها چیزی است که کاربر غیرفنی می‌فهمد؛ درصد و شدت * هم لازم‌اند چون قانونی که ۹۸٪ نوبت‌ها را عوض می‌کند تقریباً همیشه اشتباه است. */ export default function PolicySimulationPage() { const { policyUuid } = useParams<{ policyUuid: string }>(); const navigate = useNavigate(); const { policy } = usePolicy(policyUuid); const { runs, loading, run } = usePolicySimulation(policyUuid); const { activate } = usePolicies(); const { can } = usePermissions(); const canManage = can('appointment_settings', 'update'); const [latest, setLatest] = useState(null); const [confirming, setConfirming] = useState(false); const current = latest ?? runs[0] ?? null; const isCurrentVersion = !!policy && !!current && current.policy_version === policy.version; const severity = current ? SEVERITY[current.severity] : null; const columns: Column[] = [ { key: 'patient_name', header: 'بیمار', render: (r) => {r.patient_name}, }, { key: 'slot_start', header: 'تاریخ نوبت', render: (r) => {formatDate(r.slot_start)}, }, { key: 'change', header: 'وضعیت فعلی ← با این قانون', render: (r) => ( {r.before} {' ← '} {r.after} ), }, { key: 'reason', header: 'توضیح', render: (r) => {r.reason}, }, ]; return (
setLatest((await run.mutateAsync(50)).data)} > اجرای آزمایش } /> {current && severity && (
نمونه: {current.sample_size} نوبت · تحت تأثیر: {current.affected_count} نوبت ( {current.affected_percent}٪) شدت: {severity.label} نسخهٔ آزمایش‌شده: {current.policy_version}

{current.warning ?? severity.note}

{!isCurrentVersion && (

این گزارش برای نسخهٔ {current.policy_version} است و قانون اکنون نسخهٔ{' '} {policy?.version} است. برای فعال‌سازی، دوباره آزمایش کنید.

)} {canManage && (
)}
)} setConfirming(false)} onConfirm={() => { setConfirming(false); activate.mutate(policyUuid!, { onSuccess: () => navigate('/admin/policies') }); }} /> {policy?.versions && policy.versions.length > 1 && (

تاریخچهٔ نسخه‌ها

{policy.versions.map((v) => (
نسخهٔ {v.version} {formatDate(v.created_at)} {JSON.stringify((v.snapshot as { effects?: unknown }).effects)}
))}
)}
); }