Files
clinicpro/assets/admin/hooks/useRecordNumberSettings.ts
T
hamed 85a27812c7 feat(patient): implement record number pattern management
- Add RecordNumberSettingsController for managing patient record number patterns.
- Create RecordNumberPattern entity to represent the pattern configuration.
- Implement RecordNumberPatternRepository for database interactions.
- Develop RecordNumberGenerator service for generating and validating record numbers.
- Add tests for record number generation, backfilling, and API interactions.
- Ensure proper access control for viewing and updating patterns based on user roles.
2026-08-04 12:30:17 +03:30

49 lines
1.9 KiB
TypeScript

import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import { toast } from 'sonner';
import { api, ApiError, type ApiResponse } from '../lib/api';
export type RecordNumberResetPolicy = 'none' | 'yearly' | 'monthly';
export interface RecordNumberSettings {
enabled: boolean;
pattern: string;
reset_policy: RecordNumberResetPolicy;
counter: number;
/** شمارهٔ بعدی، بدون مصرف‌کردن شمارنده. */
next_preview: string;
/** فقط صاحب مجموعه (و ادمین) اجازهٔ ذخیره دارد؛ گیت اصلی سمت سرور است. */
can_edit: boolean;
}
const KEY = ['record-number-settings'];
/**
* الگوی شمارهٔ پروندهٔ محیط جاری.
*
* هم صفحهٔ تنظیمات از آن می‌خواند، هم فرم پرونده — فرم باید بداند شماره خودکار
* ساخته می‌شود یا هنوز دستی است.
*/
export function useRecordNumberSettings() {
const qc = useQueryClient();
const query = useQuery({
queryKey: KEY,
queryFn: () => api.get<ApiResponse<RecordNumberSettings>>('/api/v1/patient-record-number-settings'),
staleTime: 60_000,
// منشیِ بدون مجوز `patients.view` اینجا ۴۰۳ می‌گیرد؛ تلاش دوباره چیزی عوض نمی‌کند.
retry: false,
});
const save = useMutation({
mutationFn: (d: Pick<RecordNumberSettings, 'enabled' | 'pattern' | 'reset_policy'>) =>
api.put<ApiResponse<RecordNumberSettings>>('/api/v1/patient-record-number-settings', d),
onSuccess: () => {
toast.success('الگوی شماره پرونده ذخیره شد');
qc.invalidateQueries({ queryKey: KEY });
},
onError: (e) => toast.error(e instanceof ApiError ? e.message : 'ذخیرهٔ الگو ناموفق بود'),
});
return { settings: query.data?.data ?? null, loading: query.isLoading, save };
}