- 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.
49 lines
1.9 KiB
TypeScript
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 };
|
|
}
|