feat(subscription): gate insurance pages behind "insurance" plan feature

Wrap InsurancePricingPage and ClaimsPage in <FeatureGate feature="insurance">
so direct-URL access is blocked without an active subscription that enables
the feature. Add feature: "insurance" to the sidebar links (doctor/clinic/
secretary sections) so the menu items hide when the plan lacks it.

Make AdminSubscriptionPage feature controls dynamic: derive the plan feature
checkboxes from FEATURE_LABELS (now including "insurance") and switch the Zod
schema to z.record, so adding a feature only touches the label map.

No backend/migration change: plan.features is free-form JSON; existing plans
default to insurance:false and admins enable it per plan.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
hamed
2026-06-24 03:21:52 +03:30
co-authored by Claude Opus 4.8
parent fc87e4a04e
commit 15e7d92fc1
5 changed files with 181 additions and 16 deletions
+3
View File
@@ -7,6 +7,7 @@ import { formatRial, formatNumber } from '../lib/utils';
import PageHeader from '../components/ui/PageHeader';
import Modal from '../components/ui/Modal';
import SearchableSelect from '../components/ui/SearchableSelect';
import FeatureGate from '../components/ui/FeatureGate';
interface ClaimItem {
invoice_item_id: number;
@@ -80,6 +81,7 @@ export default function ClaimsPage() {
});
return (
<FeatureGate feature="insurance">
<div className="fade-in">
<PageHeader title="مطالبات بیمه" description="پیگیری مطالبات و بدهی بیمه‌ها" />
@@ -189,5 +191,6 @@ export default function ClaimsPage() {
</div>
</Modal>
</div>
</FeatureGate>
);
}