Add migration to include site_name column in cities table

This commit is contained in:
hamed
2026-07-02 10:09:14 +03:30
parent a7d5d17b9c
commit 70d280070b
21 changed files with 1062 additions and 814 deletions
+8
View File
@@ -370,6 +370,7 @@ function ProvincesTab() {
const citySchema = z.object({
name: z.string().min(1, 'نام الزامی است'),
site_name: z.string().optional(),
province_id: z.number().nullable().optional(),
weight: z.string().optional(),
status: z.string().optional(),
@@ -436,6 +437,7 @@ function CitiesTab() {
status: parseInt(d.status ?? '1'),
province_id: d.province_id ?? null,
representation_id: d.representation_id ?? null,
...(d.site_name?.trim() && { site_name: d.site_name.trim() }),
...(d.contact_phone?.trim() && { contact_phone: d.contact_phone.trim() }),
...(d.email?.trim() && { email: d.email.trim() }),
...(d.description?.trim() && { description: d.description.trim() }),
@@ -467,6 +469,7 @@ function CitiesTab() {
setEditTarget(c);
reset({
name: c.name, weight: String(c.weight), status: String(c.status),
site_name: c.site_name ?? '',
province_id: c.province_id ?? null,
representation_id: c.representation_id ?? null,
contact_phone: c.contact_phone ?? '',
@@ -482,6 +485,7 @@ function CitiesTab() {
const columns: Column<City>[] = [
{ key: 'id', sortable: true, header: 'شناسه', render: (c) => <span className="muted" style={{ fontFamily: 'monospace', fontSize: 12 }}>{c.id}</span> },
{ key: 'name', header: 'نام', render: (c) => <b>{c.name}</b> },
{ key: 'site_name', header: 'نام سایت', render: (c) => c.site_name ? <span>{c.site_name}</span> : <span className="muted"></span> },
{ key: 'province_id', header: 'استان', render: (c) => c.province_id ? <span className="chip">{provinceMap[c.province_id] ?? `#${c.province_id}`}</span> : <span className="muted"></span> },
{ key: 'representation_id', header: 'نماینده', render: (c) => c.representation_id ? <span className="muted" style={{ fontSize: 12 }}>{representationMap[c.representation_id] ?? `#${c.representation_id}`}</span> : <span className="muted"></span> },
{ key: 'domain', header: 'دامنه', render: (c) => c.domain ? <span className="muted" style={{ fontFamily: 'monospace', fontSize: 12 }}>{c.domain}</span> : <span className="muted"></span> },
@@ -511,6 +515,10 @@ function CitiesTab() {
<input {...register('name')} className="input" placeholder="نام شهر" />
{errors.name && <p className="err-text">{errors.name.message}</p>}
</div>
<div className="form-row" style={{ marginTop: 12 }}>
<label>نام سایت</label>
<input {...register('site_name')} className="input" placeholder="مثال: یزد نوبت" />
</div>
<div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 12, marginTop: 12 }}>
<div className="form-row">
<label>استان</label>
+1
View File
@@ -230,6 +230,7 @@ export interface City {
id: number;
uuid: string;
name: string;
site_name?: string | null;
status: number;
weight: number;
province_id: number | null;
+32 -23
View File
@@ -3,6 +3,7 @@
"id": 129,
"uuid": "7bfba4b5-646b-11f1-84d7-f26ca1845824",
"name": "اراک",
"site_name": "اراک نوبت",
"status": 1,
"weight": 0,
"province_id": 28,
@@ -26,6 +27,7 @@
"id": 103,
"uuid": "7bfb6d65-646b-11f1-84d7-f26ca1845824",
"name": "اردبیل",
"site_name": "اردبیل نوبت",
"status": 1,
"weight": 0,
"province_id": 3,
@@ -49,6 +51,7 @@
"id": 102,
"uuid": "7bfb6ac3-646b-11f1-84d7-f26ca1845824",
"name": "ارومیه",
"site_name": "ارومیه نوبت",
"status": 1,
"weight": 0,
"province_id": 2,
@@ -72,6 +75,7 @@
"id": 104,
"uuid": "7bfb6f78-646b-11f1-84d7-f26ca1845824",
"name": "اصفهان",
"site_name": "اصفهان نوبت",
"status": 1,
"weight": 0,
"province_id": 4,
@@ -95,6 +99,7 @@
"id": 113,
"uuid": "7bfb8171-646b-11f1-84d7-f26ca1845824",
"name": "اهواز",
"site_name": "اهواز نوبت",
"status": 1,
"weight": 0,
"province_id": 13,
@@ -118,6 +123,7 @@
"id": 106,
"uuid": "7bfb738a-646b-11f1-84d7-f26ca1845824",
"name": "ایلام",
"site_name": "ایلام نوبت",
"status": 1,
"weight": 0,
"province_id": 6,
@@ -141,6 +147,7 @@
"id": 112,
"uuid": "7bfb7f73-646b-11f1-84d7-f26ca1845824",
"name": "بجنورد",
"site_name": "بجنورد نوبت",
"status": 1,
"weight": 0,
"province_id": 12,
@@ -164,6 +171,7 @@
"id": 130,
"uuid": "7bfba6b9-646b-11f1-84d7-f26ca1845824",
"name": "بندرعباس",
"site_name": "بندرعباس نوبت",
"status": 1,
"weight": 0,
"province_id": 29,
@@ -187,6 +195,7 @@
"id": 107,
"uuid": "7bfb7583-646b-11f1-84d7-f26ca1845824",
"name": "بوشهر",
"site_name": "بوشهر نوبت",
"status": 1,
"weight": 0,
"province_id": 7,
@@ -210,6 +219,7 @@
"id": 110,
"uuid": "7bfb7b9b-646b-11f1-84d7-f26ca1845824",
"name": "بیرجند",
"site_name": "بیرجند نوبت",
"status": 1,
"weight": 0,
"province_id": 10,
@@ -233,6 +243,7 @@
"id": 101,
"uuid": "7bfb684b-646b-11f1-84d7-f26ca1845824",
"name": "تبریز",
"site_name": "تبریز نوبت",
"status": 1,
"weight": 0,
"province_id": 1,
@@ -256,6 +267,7 @@
"id": 108,
"uuid": "7bfb777e-646b-11f1-84d7-f26ca1845824",
"name": "تهران",
"site_name": "تهران نوبت",
"status": 1,
"weight": 0,
"province_id": 8,
@@ -279,6 +291,7 @@
"id": 127,
"uuid": "7bfba0b0-646b-11f1-84d7-f26ca1845824",
"name": "خرم‌آباد",
"site_name": "خرم‌آباد نوبت",
"status": 1,
"weight": 0,
"province_id": 26,
@@ -302,6 +315,7 @@
"id": 126,
"uuid": "7bfb9ea9-646b-11f1-84d7-f26ca1845824",
"name": "رشت",
"site_name": "رشت نوبت",
"status": 1,
"weight": 0,
"province_id": 25,
@@ -325,6 +339,7 @@
"id": 116,
"uuid": "7bfb88eb-646b-11f1-84d7-f26ca1845824",
"name": "زاهدان",
"site_name": "زاهدان نوبت",
"status": 1,
"weight": 0,
"province_id": 16,
@@ -348,6 +363,7 @@
"id": 114,
"uuid": "7bfb8454-646b-11f1-84d7-f26ca1845824",
"name": "زنجان",
"site_name": "زنجان نوبت",
"status": 1,
"weight": 0,
"province_id": 14,
@@ -371,6 +387,7 @@
"id": 128,
"uuid": "7bfba2b0-646b-11f1-84d7-f26ca1845824",
"name": "ساری",
"site_name": "ساری نوبت",
"status": 1,
"weight": 0,
"province_id": 27,
@@ -394,6 +411,7 @@
"id": 115,
"uuid": "7bfb8666-646b-11f1-84d7-f26ca1845824",
"name": "سمنان",
"site_name": "سمنان نوبت",
"status": 1,
"weight": 0,
"province_id": 15,
@@ -417,6 +435,7 @@
"id": 120,
"uuid": "7bfb90fb-646b-11f1-84d7-f26ca1845824",
"name": "سنندج",
"site_name": "سنندج نوبت",
"status": 1,
"weight": 0,
"province_id": 20,
@@ -440,6 +459,7 @@
"id": 109,
"uuid": "7bfb797f-646b-11f1-84d7-f26ca1845824",
"name": "شهرکرد",
"site_name": "شهرکرد نوبت",
"status": 1,
"weight": 0,
"province_id": 9,
@@ -463,6 +483,7 @@
"id": 117,
"uuid": "7bfb8b02-646b-11f1-84d7-f26ca1845824",
"name": "شیراز",
"site_name": "شیراز نوبت",
"status": 1,
"weight": 0,
"province_id": 17,
@@ -486,6 +507,7 @@
"id": 118,
"uuid": "7bfb8d02-646b-11f1-84d7-f26ca1845824",
"name": "قزوین",
"site_name": "قزوین نوبت",
"status": 1,
"weight": 0,
"province_id": 18,
@@ -509,6 +531,7 @@
"id": 119,
"uuid": "7bfb8efd-646b-11f1-84d7-f26ca1845824",
"name": "قم",
"site_name": "قم نوبت",
"status": 1,
"weight": 0,
"province_id": 19,
@@ -532,6 +555,7 @@
"id": 105,
"uuid": "7bfb718c-646b-11f1-84d7-f26ca1845824",
"name": "کرج",
"site_name": "کرج نوبت",
"status": 1,
"weight": 0,
"province_id": 5,
@@ -555,6 +579,7 @@
"id": 121,
"uuid": "7bfb93e4-646b-11f1-84d7-f26ca1845824",
"name": "کرمان",
"site_name": "کرمان نوبت",
"status": 1,
"weight": 0,
"province_id": 21,
@@ -578,6 +603,7 @@
"id": 122,
"uuid": "7bfb9685-646b-11f1-84d7-f26ca1845824",
"name": "کرمانشاه",
"site_name": "کرمانشاه نوبت",
"status": 1,
"weight": 0,
"province_id": 22,
@@ -597,33 +623,11 @@
},
"logo_url": null
},
{
"id": 124,
"uuid": "7bfb9ab1-646b-11f1-84d7-f26ca1845824",
"name": "گچساران",
"status": 1,
"weight": 0,
"province_id": 23,
"province_name": "کهگیلویه و بویراحمد",
"representation_id": null,
"contact_phone": "+98 074 33333333",
"email": "nobat724@gmail.com",
"description": "یاسوج نوبت، سامانه نوبت‌دهی آنلاین پزشکی در کهگیلویه و بویراحمد. دسترسی به پزشکان متخصص و مراکز درمانی. یاسوج نوبت باعث کاهش اتلاف وقت و هزینه می‌شود.",
"slogan": "نوبت‌دهی پزشکان یاسوج، بدون اتلاف وقت و هزینه",
"domain": "yasuj-nobat.ir",
"keywords": "نوبت پزشک یاسوج, مراکز درمانی کهگیلویه و بویراحمد, متخصصین یاسوج, کلینیک‌های یاسوج, درمانگاه‌های یاسوج",
"footer_description": "یاسوج نوبت، سامانه جامع نوبت‌دهی پزشکی در استان کهگیلویه و بویراحمد. رزرو نوبت از پزشکان و مراکز درمانی یاسوج بدون نیاز به مراجعه حضوری.",
"social_media": {
"instagram": "yasuj_nobat",
"telegram": "yasuj_nobat",
"whatsapp": "989120000022"
},
"logo_url": null
},
{
"id": 125,
"uuid": "7bfb9cb5-646b-11f1-84d7-f26ca1845824",
"name": "گرگان",
"site_name": "گرگان نوبت",
"status": 1,
"weight": 0,
"province_id": 24,
@@ -647,6 +651,7 @@
"id": 111,
"uuid": "7bfb7d86-646b-11f1-84d7-f26ca1845824",
"name": "مشهد",
"site_name": "مشهد نوبت",
"status": 1,
"weight": 0,
"province_id": 11,
@@ -670,6 +675,7 @@
"id": 600,
"uuid": "7bfbad3c-646b-11f1-84d7-f26ca1845824",
"name": "نوبت 724",
"site_name": "نوبت 724 نوبت",
"status": 1,
"weight": 0,
"province_id": null,
@@ -693,6 +699,7 @@
"id": 131,
"uuid": "7bfba8b7-646b-11f1-84d7-f26ca1845824",
"name": "همدان",
"site_name": "همدان نوبت",
"status": 1,
"weight": 0,
"province_id": 30,
@@ -716,6 +723,7 @@
"id": 123,
"uuid": "7bfb989e-646b-11f1-84d7-f26ca1845824",
"name": "یاسوج",
"site_name": "یاسوج نوبت",
"status": 1,
"weight": 0,
"province_id": 23,
@@ -739,6 +747,7 @@
"id": 132,
"uuid": "7bfbaacd-646b-11f1-84d7-f26ca1845824",
"name": "یزد",
"site_name": "یزد نوبت",
"status": 1,
"weight": 0,
"province_id": 100,
+3
View File
@@ -177,6 +177,7 @@ Create a new city.
```json
{
"name": "تهران",
"site_name": "تهران نوبت",
"province_id": 1,
"status": "active",
"weight": 1
@@ -186,9 +187,11 @@ Create a new city.
| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `name` | string | ✅ | City name |
| `site_name` | string | ❌ | Public site name shown on the city's booking website (e.g. `"یزد نوبت"`) |
| `province_id` | integer | ❌ | Parent province ID |
| `status` | string | ❌ | `"active"` or `"inactive"` |
| `weight` | integer | ❌ | Sort weight |
| `contact_phone`, `email`, `description`, `slogan`, `domain`, `keywords`, `footer_description`, `social_media`, `logo_url` | mixed | ❌ | SEO / branding fields returned in the city object |
### Response `201`
City object.
-6
View File
@@ -637,7 +637,6 @@
"635": "Community 635",
"636": "Community 636",
"637": "Community 637",
"638": "Community 638",
"639": "Community 639",
"640": "Community 640",
"641": "Community 641",
@@ -651,13 +650,11 @@
"649": "Community 649",
"650": "Community 650",
"651": "Community 651",
"652": "Community 652",
"653": "Community 653",
"654": "Community 654",
"655": "Community 655",
"656": "Community 656",
"657": "Community 657",
"658": "Community 658",
"659": "Community 659",
"660": "Community 660",
"661": "Community 661",
@@ -672,10 +669,7 @@
"670": "Community 670",
"671": "Community 671",
"672": "Community 672",
"673": "Community 673",
"674": "Community 674",
"675": "Community 675",
"676": "Community 676",
"677": "Community 677",
"678": "Community 678",
"679": "Community 679"
+93 -115
View File
@@ -1,16 +1,16 @@
# Graph Report - clinicpro (2026-07-01)
# Graph Report - clinicpro (2026-07-02)
## Corpus Check
- 672 files · ~472,879 words
- 673 files · ~473,180 words
- Verdict: corpus is large enough that graph structure adds value.
## Summary
- 8457 nodes · 11652 edges · 680 communities (547 shown, 133 thin omitted)
- 8465 nodes · 11664 edges · 674 communities (543 shown, 131 thin omitted)
- Extraction: 98% EXTRACTED · 2% INFERRED · 0% AMBIGUOUS · INFERRED: 265 edges (avg confidence: 0.8)
- Token cost: 0 input · 0 output
## Graph Freshness
- Built from commit: `a31e8b43`
- Built from commit: `a7d5d17b`
- Run `git rev-parse HEAD` and compare to check if the graph is stale.
- Run `graphify update .` after code changes (no API cost).
@@ -641,7 +641,6 @@
- [[_COMMUNITY_Community 635|Community 635]]
- [[_COMMUNITY_Community 636|Community 636]]
- [[_COMMUNITY_Community 637|Community 637]]
- [[_COMMUNITY_Community 638|Community 638]]
- [[_COMMUNITY_Community 639|Community 639]]
- [[_COMMUNITY_Community 640|Community 640]]
- [[_COMMUNITY_Community 641|Community 641]]
@@ -653,13 +652,11 @@
- [[_COMMUNITY_Community 649|Community 649]]
- [[_COMMUNITY_Community 650|Community 650]]
- [[_COMMUNITY_Community 651|Community 651]]
- [[_COMMUNITY_Community 652|Community 652]]
- [[_COMMUNITY_Community 653|Community 653]]
- [[_COMMUNITY_Community 654|Community 654]]
- [[_COMMUNITY_Community 655|Community 655]]
- [[_COMMUNITY_Community 656|Community 656]]
- [[_COMMUNITY_Community 657|Community 657]]
- [[_COMMUNITY_Community 658|Community 658]]
- [[_COMMUNITY_Community 659|Community 659]]
- [[_COMMUNITY_Community 660|Community 660]]
- [[_COMMUNITY_Community 661|Community 661]]
@@ -673,10 +670,7 @@
- [[_COMMUNITY_Community 669|Community 669]]
- [[_COMMUNITY_Community 671|Community 671]]
- [[_COMMUNITY_Community 672|Community 672]]
- [[_COMMUNITY_Community 673|Community 673]]
- [[_COMMUNITY_Community 674|Community 674]]
- [[_COMMUNITY_Community 675|Community 675]]
- [[_COMMUNITY_Community 676|Community 676]]
- [[_COMMUNITY_Community 677|Community 677]]
- [[_COMMUNITY_Community 678|Community 678]]
- [[_COMMUNITY_Community 679|Community 679]]
@@ -698,33 +692,33 @@
assets/admin/components/ServiceTariffModal.tsx → assets/admin/lib/utils.ts
- `PersianDatePicker()` --calls--> `formatDate()` [EXTRACTED]
assets/admin/components/ui/PersianDatePicker.tsx → assets/admin/lib/utils.ts
- `LogsPage()` --calls--> `formatDateTime()` [EXTRACTED]
assets/admin/pages/LogsPage.tsx → assets/admin/lib/utils.ts
- `SmsPage()` --calls--> `formatDateTime()` [EXTRACTED]
assets/admin/pages/SmsPage.tsx → assets/admin/lib/utils.ts
- `NewAppointmentModal()` --calls--> `useAuthStore` [EXTRACTED]
assets/admin/pages/AppointmentsPage.tsx → assets/admin/stores/authStore.ts
- `LogoUploadField()` --calls--> `useAuthStore` [EXTRACTED]
assets/admin/pages/CategoriesPage.tsx → assets/admin/stores/authStore.ts
## Import Cycles
- None detected.
## Communities (680 total, 133 thin omitted)
## Communities (674 total, 131 thin omitted)
### Community 0 - "Community 0"
Cohesion: 0.05
Nodes (37): ALLOWED_ROLES, PrivateRoute(), PublicRoute(), RoleRoute(), queryClient, toastStyle, AddForm, addSchema (+29 more)
Nodes (40): ALLOWED_ROLES, PrivateRoute(), PublicRoute(), RoleRoute(), queryClient, toastStyle, AddForm, addSchema (+32 more)
### Community 1 - "Community 1"
Cohesion: 0.03
Nodes (41): AddressData, AddrForm, addrSchema, AVATAR_COLORS, BookingMeta, CityOpt, DateOverrideData, DEFAULT_BOOKING_META (+33 more)
### Community 2 - "Community 2"
Cohesion: 0.07
Nodes (26): get, PaymentConfig, PaymentGatewayInfo, api, ApiError, getToken(), refreshOnce(), request() (+18 more)
Cohesion: 0.08
Nodes (23): get, PaymentConfig, PaymentGatewayInfo, api, ApiError, getToken(), refreshOnce(), request() (+15 more)
### Community 3 - "Community 3"
Cohesion: 0.03
Nodes (80): ApiResponse, PaginatedResponse, formatDate(), ALL_STATUSES, AppointmentDetailPage(), STATUS_FILTERS, FILTERS, Breakdown (+72 more)
Cohesion: 0.05
Nodes (42): ApiResponse, PaginatedResponse, formatDate(), STATUS_FILTERS, FILTERS, Breakdown, SOURCE_LABEL, Summary (+34 more)
### Community 4 - "Community 4"
Cohesion: 0.06
@@ -755,28 +749,28 @@ Cohesion: 0.04
Nodes (46): Clinic Address Management, Clinic API, DELETE `/api/v1/admin/clinic/{clinicUuid}/doctor/{doctorUuid}`, `DELETE /api/v1/clinic/{clinicUuid}/address/{addressUuid}`, Errors, Errors, Errors, Errors (+38 more)
### Community 11 - "Community 11"
Cohesion: 0.33
Nodes (4): BlogController, JsonResponse, Request, User
Cohesion: 0.05
Nodes (48): usePaymentConfig(), ALL_STATUSES, SmsPage(), STATUS_LOG_META, Tab, TAG_FILTER_OPTIONS, TAG_LABELS, TemplateFormData (+40 more)
### Community 12 - "Community 12"
Cohesion: 0.05
Nodes (44): Clinic Doctor Invitation API, DELETE `/api/v1/admin/clinic/invitation/{invUuid}`, Errors, Errors, Errors, Errors, Errors, Errors (+36 more)
### Community 13 - "Community 13"
Cohesion: 0.06
Nodes (35): FreeVisitPrice(), Pricing, usePaymentConfig(), formatDateTime(), formatRial(), InsurancePricingPage(), LogsPage(), FinancialSummary (+27 more)
Cohesion: 0.07
Nodes (25): FreeVisitPrice(), Pricing, formatDateTime(), formatRial(), AppointmentDetailPage(), InsurancePricingPage(), FinancialSummary, MonthlyEntry (+17 more)
### Community 14 - "Community 14"
Cohesion: 0.15
Nodes (8): AppointmentSettingsController, Holiday, HolidayRepository, JsonResponse, Request, User, Doctor, ManagerRegistry
### Community 15 - "Community 15"
Cohesion: 0.07
Nodes (16): PaymentController, MellatGateway, MockGateway, SepGateway, JsonResponse, Payment, PaymentGatewayInterface, Request (+8 more)
Cohesion: 0.09
Nodes (13): PaymentController, MockGateway, SepGateway, JsonResponse, Payment, PaymentGatewayInterface, Request, Response (+5 more)
### Community 16 - "Community 16"
Cohesion: 0.07
Nodes (7): PatientSession, SmsWallet, Appointment, Collection, PatientRecord, self, SessionService
Cohesion: 0.09
Nodes (6): PatientSession, Appointment, Collection, PatientRecord, self, SessionService
### Community 17 - "Community 17"
Cohesion: 0.05
@@ -791,16 +785,16 @@ Cohesion: 0.20
Nodes (8): AdminUser, ChangeRoleModal(), getPrimaryRole(), HUES_LIST, ROLE_META, ROLE_TABS, RoleBadge(), UserStats
### Community 20 - "Community 20"
Cohesion: 0.15
Cohesion: 0.14
Nodes (3): AdminApiController, JsonResponse, Request
### Community 21 - "Community 21"
Cohesion: 0.05
Nodes (37): formatNumber(), ClinicDetailPage(), AdminCharts, AdminDashboard(), AdminRecent, AdminStats, APPT_CLS, APPT_COLOR (+29 more)
Nodes (34): formatNumber(), ClinicDetailPage(), AdminCharts, AdminDashboard(), AdminRecent, AdminStats, APPT_CLS, APPT_COLOR (+26 more)
### Community 22 - "Community 22"
Cohesion: 0.15
Nodes (9): RatingController, Like, LikeRepository, JsonResponse, Request, User, Comment, ManagerRegistry (+1 more)
Cohesion: 0.29
Nodes (4): RatingController, JsonResponse, Request, User
### Community 23 - "Community 23"
Cohesion: 0.05
@@ -819,8 +813,8 @@ Cohesion: 0.15
Nodes (7): InsuranceController, EntityInsurancePricing, EntityInsurancePricingRepository, JsonResponse, Request, User, ManagerRegistry
### Community 27 - "Community 27"
Cohesion: 0.05
Nodes (40): 55. 🟢 `GET` all tag, 56. 🟢 `GET` supplementary_insurance, 57. 🟢 `GET` categories list, 58. 🟢 `GET` all state, 59. 🟢 `GET` all city, 60. 🟢 `GET` all specially doctor, 61. 🔵 `POST` post, 62. 🟡 `PATCH` patch (+32 more)
Cohesion: 0.06
Nodes (35): 55. 🟢 `GET` all tag, 56. 🟢 `GET` supplementary_insurance, 57. 🟢 `GET` categories list, 58. 🟢 `GET` all state, 59. 🟢 `GET` all city, 60. 🟢 `GET` all specially doctor, 61. 🔵 `POST` post, 63. 🔴 `DELETE` DELETE (+27 more)
### Community 28 - "Community 28"
Cohesion: 0.09
@@ -843,8 +837,8 @@ Cohesion: 0.06
Nodes (32): 10. Modal / Dialog, 11. Toast Notifications, 12. Empty States & Loading, 13. Page Header (هر صفحه), 14. تکنولوژی Stack, 15. Responsive Breakpoints, 16. Dark Mode (اختیاری — فاز دوم), 17. نمونه رنگ‌بندی صفحه داشبورد (+24 more)
### Community 33 - "Community 33"
Cohesion: 0.08
Nodes (20): CoverageRow, Draft, KIND, TenantInsurance, ServiceTariffModal(), TariffResponse, TariffRow, EMPTY_ITEMS (+12 more)
Cohesion: 0.04
Nodes (39): CoverageRow, Draft, KIND, TenantInsurance, ServiceTariffModal(), TariffResponse, TariffRow, Contract (+31 more)
### Community 34 - "Community 34"
Cohesion: 0.06
@@ -875,8 +869,8 @@ Cohesion: 0.09
Nodes (4): User, PasswordAuthenticatedUserInterface, self, UserInterface
### Community 41 - "Community 41"
Cohesion: 0.05
Nodes (29): Contract, InsuranceOption, KIND_LABEL, CityForm, citySchema, ImportError, InsuranceForm, insuranceSchema (+21 more)
Cohesion: 0.06
Nodes (23): CityForm, citySchema, ImportError, InsuranceForm, insuranceSchema, LogoUploadField(), ProvinceForm, provinceSchema (+15 more)
### Community 42 - "Community 42"
Cohesion: 0.07
@@ -923,8 +917,8 @@ Cohesion: 0.07
Nodes (26): الزامات UI, باگ‌فیکس صفحه نوبت‌ها, باگ ۱ — کرش تقویم, باگ ۲ — روز هفته در DateNavigator, باگ ۳ — پیام «slot نیست», باگ ۴ — نوبت جدید: نام اجباری + find-or-create patient, باگ ۵ — patient_mobile نشان می‌دهد موبایل پزشک, باگ ۶ — نوبت‌های رزرو شده در نمایش زمانبندی (+18 more)
### Community 53 - "Community 53"
Cohesion: 0.09
Nodes (12): AppLogRepository, ClaimItemRepository, PreRegistrationRepository, SiteConfigRepository, TaxRateHistoryRepository, ServiceEntityRepository, ManagerRegistry, ManagerRegistry (+4 more)
Cohesion: 0.08
Nodes (17): AppLogRepository, ClaimItemRepository, InvoiceItemRepository, PreRegistrationRepository, SessionServiceRepository, UserActiveContextRepository, ServiceEntityRepository, ManagerRegistry (+9 more)
### Community 54 - "Community 54"
Cohesion: 0.10
@@ -943,8 +937,8 @@ Cohesion: 0.08
Nodes (24): Blog API, DELETE `/api/v1/blog/{uuid}`, Errors, Errors, Errors, Errors, Errors, GET `/api/v1/blog/{slug}` (+16 more)
### Community 58 - "Community 58"
Cohesion: 0.28
Nodes (4): Blog, BlogRepository, ManagerRegistry, QueryBuilder
Cohesion: 0.15
Nodes (8): Blog, BlogController, BlogRepository, JsonResponse, Request, User, ManagerRegistry, QueryBuilder
### Community 59 - "Community 59"
Cohesion: 0.22
@@ -1040,7 +1034,7 @@ Nodes (29): devDependencies, @babel/core, @babel/preset-env, @babel/preset-react
### Community 86 - "Community 86"
Cohesion: 0.06
Nodes (15): AppointmentExpiryServiceTest, LowTierFixesTest, SendCodeMobileRateLimitTest, ClaimsListPaginationTest, ServiceItemDeleteCleanupTest, ServiceItemStaffOwnershipTest, EntityManagerInterface, KernelBrowser (+7 more)
Nodes (15): AppointmentExpiryServiceTest, LowTierFixesTest, SendCodeMobileRateLimitTest, ClaimsListPaginationTest, ServiceItemStaffOwnershipTest, EntityManagerInterface, KernelBrowser, CommentPaginationTest (+7 more)
### Community 87 - "Community 87"
Cohesion: 0.10
@@ -1127,8 +1121,8 @@ Cohesion: 0.32
Nodes (6): AppointmentController, Appointment, Doctor, JsonResponse, Request, User
### Community 108 - "Community 108"
Cohesion: 0.12
Nodes (12): AbstractController, AdminController, BaseController, CategoryController, CategoryImportController, HomeController, Response, JsonResponse (+4 more)
Cohesion: 0.18
Nodes (7): BaseController, CategoryController, CategoryImportController, JsonResponse, JsonResponse, Request, JsonResponse
### Community 109 - "Community 109"
Cohesion: 0.29
@@ -1328,7 +1322,7 @@ Nodes (15): Date Overrides, DELETE `/api/v1/appointment-settings/date-override/{
### Community 161 - "Community 161"
Cohesion: 0.24
Nodes (5): ClaimsListNPlusOneTest, ClaimItem, ClaimService, Claim, Invoice
Nodes (7): ClaimSubmitterInterface, ClaimService, ManualClaimSubmitter, Claim, Invoice, Claim, ClaimSubmissionResult
### Community 162 - "Community 162"
Cohesion: 0.13
@@ -1406,6 +1400,10 @@ Nodes (3): PatientRecord, Collection, User
Cohesion: 0.23
Nodes (3): WeeklySchedule, Doctor, self
### Community 182 - "Community 182"
Cohesion: 0.07
Nodes (5): SmsSettings, SmsWallet, LogPruneService, AppointmentExpiryService, self
### Community 183 - "Community 183"
Cohesion: 0.14
Nodes (13): `UserDetailPage.tsx` — فقط user query, زمینه, فایل‌های مرتبط, قرارداد پروفایل (`UserProfile.toArray`), مشکل / هدف, نمایش پروفایل کاربر در صفحه‌ی جزئیات کاربرِ پنل ادمین, نکات مهم, وضعیت فعلی (کد واقعی) (+5 more)
@@ -1475,12 +1473,12 @@ Cohesion: 0.14
Nodes (13): Endpoint ها, PATCH /api/v1/secretary/{uuid}, POST /api/v1/secretary, تسک ۱۴: ماژول منشی, توضیح, زمان تخمینی, ساختار JSON, سیستم مجوزها — Resource-Based Permissions (مقیاس‌پذیر) (+5 more)
### Community 201 - "Community 201"
Cohesion: 0.20
Nodes (10): Admin API, Clinic Invitation Management, GET `/api/v1/admin/comments`, GET `/api/v1/admin/rates`, GET /api/v1/admin/settings, PATCH /api/v1/admin/settings, Query Parameters, Query Parameters (+2 more)
Cohesion: 0.15
Nodes (13): Admin API, Clinic Invitation Management, GET `/api/v1/admin/pre-registrations`, GET `/api/v1/admin/representations`, GET /api/v1/admin/settings, PATCH /api/v1/admin/settings, POST `/api/v1/admin/pre-registrations/{uuid}/approve`, POST `/api/v1/admin/pre-registrations/{uuid}/reject` (+5 more)
### Community 202 - "Community 202"
Cohesion: 0.10
Nodes (19): Appointment Settings API, Available Locations, DELETE `/api/v1/appointment-settings/holidays/{uuid}`, Errors, Errors, `GET /api/v1/appointment-settings/available-locations/{doctorUuid}`, GET `/api/v1/appointment-settings/holidays/list/{doctorUuid}`, GET `/api/v1/appointment-settings/holidays/{uuid}` (+11 more)
Cohesion: 0.15
Nodes (13): DELETE `/api/v1/appointment-settings/holidays/{uuid}`, Errors, GET `/api/v1/appointment-settings/holidays/list/{doctorUuid}`, GET `/api/v1/appointment-settings/holidays/{uuid}`, Holidays, PATCH `/api/v1/appointment-settings/holidays/{uuid}`, POST `/api/v1/appointment-settings/holidays`, Request Body (+5 more)
### Community 203 - "Community 203"
Cohesion: 0.15
@@ -1491,8 +1489,8 @@ Cohesion: 0.21
Nodes (6): AuthenticationException, ExceptionSubscriber, SecurityHeadersSubscriber, EventSubscriberInterface, ExceptionEvent, ResponseEvent
### Community 205 - "Community 205"
Cohesion: 0.07
Nodes (20): Command, CancelExpiredAppointmentsCommand, CreateAdminCommand, PruneLogsCommand, SeedCategoriesCommand, SeedSmsMessageTemplatesCommand, SmsMessageTemplateRepository, SmsTextResolver (+12 more)
Cohesion: 0.10
Nodes (16): Command, CancelExpiredAppointmentsCommand, CreateAdminCommand, PruneLogsCommand, SeedCategoriesCommand, SeedSmsMessageTemplatesCommand, InputInterface, OutputInterface (+8 more)
### Community 206 - "Community 206"
Cohesion: 0.35
@@ -1567,8 +1565,8 @@ Cohesion: 0.30
Nodes (6): AbstractAuthenticator, Passport, PasswordAuthenticator, Request, Response, TokenInterface
### Community 228 - "Community 228"
Cohesion: 0.04
Nodes (47): Bulk import / export, DELETE `/api/v1/admin/insurance/{id}`, DELETE `/api/v1/billing/tenant-insurances/{uuid}`, DELETE `/api/v1/insurance/{id}`, EntityInsurancePricing — قیمت‌گذاری ویزیت بر اساس بیمه, Errors, Errors, Errors (+39 more)
Cohesion: 0.05
Nodes (43): Bulk import / export, DELETE `/api/v1/admin/insurance/{id}`, DELETE `/api/v1/billing/tenant-insurances/{uuid}`, DELETE `/api/v1/insurance/{id}`, EntityInsurancePricing — قیمت‌گذاری ویزیت بر اساس بیمه, Errors, Errors, Errors (+35 more)
### Community 229 - "Community 229"
Cohesion: 0.15
@@ -1703,8 +1701,8 @@ Cohesion: 0.33
Nodes (4): RepresentationRepository, ManagerRegistry, Representation, User
### Community 265 - "Community 265"
Cohesion: 0.08
Nodes (27): calcFinalPrice(), EMPTY_RECORDS, EMPTY_SESSIONS, fileNumber(), getPatientName(), getPatientPhone(), InsurancePricing, MyPatientsPageInner() (+19 more)
Cohesion: 0.15
Nodes (17): calcFinalPrice(), EMPTY_RECORDS, EMPTY_SESSIONS, fileNumber(), getPatientName(), getPatientPhone(), InsurancePricing, MyPatientsPageInner() (+9 more)
### Community 266 - "Community 266"
Cohesion: 0.33
@@ -1819,8 +1817,8 @@ Cohesion: 0.24
Nodes (10): gridItemStyle, JALALI_MONTHS, jalaliFirstWeekday(), jalaliToGregorian(), navBtnStyle, PersianCalendar(), pf, Props (+2 more)
### Community 295 - "Community 295"
Cohesion: 0.57
Nodes (3): SeoController, Request, Response
Cohesion: 0.22
Nodes (8): AbstractController, AdminController, HomeController, SeoController, Response, Response, Request, Response
### Community 296 - "Community 296"
Cohesion: 0.22
@@ -1856,7 +1854,7 @@ Nodes (16): آماده‌سازی پروژه ClinicPro برای دیپلوی ر
### Community 304 - "Community 304"
Cohesion: 0.22
Nodes (9): 29. 🟢 `GET` clinic list 🆕, 30. 🟢 `GET` get 🆕, 36. 🟢 `GET` get my rate, 6. کلینیک (Clinic), هدرهای اضافی, پارامترهای Query, پاسخ‌ها, پاسخ‌ها (+1 more)
Nodes (9): 30. 🟢 `GET` get 🆕, 33. 🔵 `POST` image_clinic, 36. 🟢 `GET` get my rate, 6. کلینیک (Clinic), هدرهای اضافی, هدرهای اضافی, پاسخ‌ها, پاسخ‌ها (+1 more)
### Community 306 - "Community 306"
Cohesion: 0.07
@@ -1955,8 +1953,8 @@ Cohesion: 0.22
Nodes (8): Query های جدید, بیماران منحصربه‌فرد در بازه, درآمد بر اساس روز (از patient_sessions), فروش اشتراک بر اساس پنل (admin), نوبت‌ها بر اساس روز (admin chart), نکات مهم, هیچ migration لازم نیست, پایگاه داده — تسک ۱۶: داشبورد هوشمند
### Community 333 - "Community 333"
Cohesion: 0.25
Nodes (7): DELETE `/api/v1/clinic-pro/doctor-address/{id}`, Doctor API, Errors, GET `/api/v1/doctors`, Query Parameters, Response `200`, Response `200`
Cohesion: 0.05
Nodes (39): DELETE `/api/v1/clinic-pro/doctor-address/{id}`, DELETE `/api/v1/doctor/{uuid}`, Doctor API, Errors, Errors, Errors, Errors, Errors (+31 more)
### Community 334 - "Community 334"
Cohesion: 0.25
@@ -2019,8 +2017,8 @@ Cohesion: 0.43
Nodes (3): SmsWalletRepository, ManagerRegistry, SmsWallet
### Community 351 - "Community 351"
Cohesion: 0.50
Nodes (4): UserActiveContextRepository, ManagerRegistry, User, UserActiveContext
Cohesion: 0.26
Nodes (3): MellatGateway, PaymentInitResult, PaymentVerifyResult
### Community 352 - "Community 352"
Cohesion: 0.36
@@ -2187,16 +2185,16 @@ Cohesion: 0.33
Nodes (6): Refactoring Plan, فاز ۰ — مستندسازی (۳ تا ۵ روز، قبل از هر کدنویسی), فاز ۱ — زیرساخت پایه (task-01), فاز ۲ — پیاده‌سازی ماژول‌ها (به ترتیب dependency), فاز ۳ — بهینه‌سازی (بعد از پیاده‌سازی), فاز ۴ — آماده‌سازی تولید
### Community 397 - "Community 397"
Cohesion: 0.36
Nodes (4): ClaimAmountBoundsTest, Claim, Doctor, User
Cohesion: 0.21
Nodes (6): ClaimAmountBoundsTest, ClaimsListNPlusOneTest, ClaimItem, Claim, Doctor, User
### Community 398 - "Community 398"
Cohesion: 0.29
Nodes (4): initiate(), verify(), PaymentInitResult, PaymentVerifyResult
### Community 399 - "Community 399"
### Community 404 - "Community 404"
Cohesion: 0.23
Nodes (5): AbstractMigration, Schema, Version20260609130407, Schema, Version20260619121047
Nodes (5): AbstractMigration, Schema, Version20260609133334, Schema, Version20260619062912
### Community 405 - "Community 405"
Cohesion: 0.47
@@ -2210,13 +2208,17 @@ Nodes (3): SmsService, SendSmsMessage, SmsProviderInterface
Cohesion: 0.17
Nodes (11): دیپلوی ClinicPro روی Coolify (Docker Compose), رفع اشکال, مراحل دیپلوی, معماری دیپلوی, نکات عملیاتی, چند دامنه فرانت‌اند (مهم), ۱. ساخت Resource در Coolify, ۲. اختصاص دامنه (+3 more)
### Community 439 - "Community 439"
Cohesion: 0.33
Nodes (5): Like, LikeRepository, Comment, ManagerRegistry, User
### Community 440 - "Community 440"
Cohesion: 0.11
Nodes (18): [F10] راهنمای کهنه در `CLAUDE.md`: endpoint `categorys/{bundle}` منتقل شده, [F11] داشبورد دکتر `GET /api/v1/dashboard/doctor` همیشه 500 (فیلد ناموجود در DQL) — ✅ رفع شد, [F1] phpstan: مقایسهٔ همیشه‌درست در محاسبهٔ estimated SMS — ✅ رفع شد, [F2] تست‌های PHPUnit به API خارجی Kavenegar درخواست واقعی می‌زنند, [F3] دیتابیس تست seed نشده — فقط کاربر ادمین وجود دارد, [F4] اسکریپت seeder `create_test_users.php` وجود ندارد, [F5] ادمین با JWT معتبر به `/api/doc` (Swagger UI) دسترسی ندارد (401), [F6] ناسازگاری کدهای خطا بین دامنه‌ها (+10 more)
### Community 452 - "Community 452"
Cohesion: 0.05
Nodes (34): cn(), iranMobileOptionalSchema, iranMobileSchema, isValidIranMobile(), maskMobile(), sanitizeMobileInput(), toDate(), toEnglishDigits() (+26 more)
Cohesion: 0.06
Nodes (31): cn(), iranMobileOptionalSchema, iranMobileSchema, isValidIranMobile(), maskMobile(), sanitizeMobileInput(), toDate(), toEnglishDigits() (+23 more)
### Community 456 - "Community 456"
Cohesion: 0.38
@@ -2447,8 +2449,8 @@ Cohesion: 0.12
Nodes (16): دیپلوی ClinicPro (Symfony) روی لیارا با پلتفرم PHP (بدون داکر), زمینه, فایل‌های مرتبط, مشکل / هدف, نکات مهم, وضعیت فعلی (کد واقعی), وظایف, پروژه (+8 more)
### Community 525 - "Community 525"
Cohesion: 0.53
Nodes (3): SessionServiceRepository, ManagerRegistry, SessionService
Cohesion: 0.25
Nodes (4): SmsMessageTemplateRepository, SmsTextResolver, SmsMessageTemplate, ManagerRegistry
### Community 526 - "Community 526"
Cohesion: 0.50
@@ -2487,32 +2489,20 @@ Cohesion: 0.50
Nodes (4): Errors, GET `/api/v1/representation/{uuid}`, Path Parameters, Response `200`
### Community 536 - "Community 536"
Cohesion: 0.50
Nodes (4): Errors, POST `/file/upload/clinic_pro/doctor/field_image`, Request, Response `200`
### Community 537 - "Community 537"
Cohesion: 0.50
Nodes (4): Errors, POST `/api/v1/clinic-pro/doctor-address`, Request Body, Response `201`
### Community 538 - "Community 538"
Cohesion: 0.50
Nodes (4): Errors, Path Parameters, POST `/api/v1/clinic-pro/doctor-address/from-clinic/{clinicUuid}`, Response `201`
Cohesion: 0.29
Nodes (6): Appointment Settings API, Available Locations, Errors, `GET /api/v1/appointment-settings/available-locations/{doctorUuid}`, Response `200`, Slot Calculation Logic (Reference)
### Community 539 - "Community 539"
Cohesion: 0.67
Nodes (3): Errors, GET `/api/v1/notification-mobile/{target}`, Response `200`
### Community 540 - "Community 540"
Cohesion: 0.43
Nodes (3): InvoiceItemRepository, InvoiceItem, ManagerRegistry
### Community 542 - "Community 542"
Cohesion: 0.15
Nodes (11): emptyFeatures(), FEATURE_KEYS, FEATURE_LABELS, PeriodForm, periodSchema, PLAN_DISPLAY, PlanForm, planSchema (+3 more)
### Community 543 - "Community 543"
Cohesion: 0.50
Nodes (4): Errors, PATCH `/api/v1/insurance/{id}`, Request Body, Response `200`
Cohesion: 0.53
Nodes (3): TaxRateHistoryRepository, ManagerRegistry, TaxRateHistory
### Community 544 - "Community 544"
Cohesion: 0.15
@@ -2660,15 +2650,15 @@ Nodes (5): Errors, GET `/api/v1/clinic/my-doctor/{doctorUuid}`, Path Parameters,
### Community 596 - "Community 596"
Cohesion: 0.40
Nodes (5): Errors, PATCH `/api/v1/clinic-pro/doctor-address/{id}`, Path Parameters, Request Body, Response `200`
Nodes (5): GET `/api/v1/admin/comments`, GET `/api/v1/admin/rates`, Query Parameters, Query Parameters, Rating & Comment Management
### Community 597 - "Community 597"
Cohesion: 0.20
Nodes (10): Configuration, DELETE `/api/v1/sms/template/{uuid}`, Errors, Errors, GET `/api/v1/admin/sms/templates`, GET `/api/v1/sms/template/{uuid}`, Response `200`, Response `200` (+2 more)
### Community 598 - "Community 598"
Cohesion: 0.53
Nodes (4): ClaimSubmitterInterface, ManualClaimSubmitter, Claim, ClaimSubmissionResult
Cohesion: 0.40
Nodes (5): 62. 🟡 `PATCH` patch, Request Body, مثال Request, هدرهای اضافی, پاسخ‌ها
### Community 599 - "Community 599"
Cohesion: 0.67
@@ -2707,20 +2697,20 @@ Cohesion: 0.67
Nodes (3): بک‌اند, فرانت‌اند, وضعیت فعلی کد (مهم — قبل از تغییر بخوان)
### Community 618 - "Community 618"
Cohesion: 0.12
Nodes (6): ServiceCoverageNPlusOneTest, TenantInsuranceCleanupTest, TenantServiceCoverageRepository, TenantInsuranceCleanupService, ManagerRegistry, TenantServiceCoverage
Cohesion: 0.10
Nodes (7): ServiceItemDeleteCleanupTest, ServiceCoverageNPlusOneTest, TenantInsuranceCleanupTest, TenantServiceCoverageRepository, TenantInsuranceCleanupService, ManagerRegistry, TenantServiceCoverage
### Community 631 - "Community 631"
Cohesion: 0.50
Nodes (4): DELETE `/api/v1/doctor/{uuid}`, Errors, Path Parameters, Response `200`
Cohesion: 0.40
Nodes (3): Props, StatTone, TONE
### Community 632 - "Community 632"
Cohesion: 0.50
Nodes (4): Errors, POST `/api/v1/doctor`, Request Body (`application/json`), Response `201`
Nodes (4): Errors, GET `/api/v1/admin/insurances`, Query Parameters, Response `200`
### Community 633 - "Community 633"
Cohesion: 0.50
Nodes (4): Errors, GET `/api/v1/doctor/{uuid}`, Path Parameters, Response `200`
Nodes (4): Errors, POST `/api/v1/insurance/`, Request Body (`application/json`), Response `201`
### Community 634 - "Community 634"
Cohesion: 0.25
@@ -2730,9 +2720,9 @@ Nodes (8): ۲.۲ انواع دسته‌بندی (Category Types), ۲.۲.۱ تگ
Cohesion: 0.43
Nodes (5): BeforeInstallPromptEvent, usePwaInstall(), PwaInstallBanner(), detectIOS(), PwaLoginCard()
### Community 638 - "Community 638"
### Community 636 - "Community 636"
Cohesion: 0.67
Nodes (3): GET `/api/v1/clinic-pro/doctor-addresses/{doctorId}`, Path Parameters, Response `200`
Nodes (3): 29. 🟢 `GET` clinic list 🆕, پارامترهای Query, پاسخ‌ها
### Community 639 - "Community 639"
Cohesion: 0.33
@@ -2754,10 +2744,6 @@ Nodes (5): 31. 🟡 `PATCH` patch, Request Body, مثال Request, هدرهای
Cohesion: 0.40
Nodes (5): 32. 🔵 `POST` post, Request Body, مثال Request, هدرهای اضافی, پاسخ‌ها
### Community 652 - "Community 652"
Cohesion: 0.50
Nodes (4): GET `/api/v1/admin/pre-registrations`, POST `/api/v1/admin/pre-registrations/{uuid}/approve`, POST `/api/v1/admin/pre-registrations/{uuid}/reject`, Pre-Registration Management
### Community 653 - "Community 653"
Cohesion: 0.50
Nodes (4): 38. 🟢 `GET` Unapproved comments, هدرهای اضافی, پارامترهای Query, پاسخ‌ها
@@ -2778,10 +2764,6 @@ Nodes (5): ۲.۸ تنظیمات نوبت (Appointment Settings), ۲.۸.۱ برن
Cohesion: 0.50
Nodes (4): GET `/api/v1/admin/payments`, Payment Management, Query Parameters, Response `200`
### Community 658 - "Community 658"
Cohesion: 0.50
Nodes (4): GET `/api/v1/admin/representations`, Query Parameters, Representation Management, Response `200`
### Community 659 - "Community 659"
Cohesion: 0.50
Nodes (4): GET `/api/v1/admin/secretaries`, Query Parameters, Response `200`, Secretary Management
@@ -2826,10 +2808,6 @@ Nodes (4): GET `/api/v1/admin/settlements`, Query Parameters, Response `200`, Se
Cohesion: 0.67
Nodes (3): 34. 🔵 `POST` image logo, هدرهای اضافی, پاسخ‌ها
### Community 676 - "Community 676"
Cohesion: 0.67
Nodes (3): 33. 🔵 `POST` image_clinic, هدرهای اضافی, پاسخ‌ها
### Community 677 - "Community 677"
Cohesion: 0.67
Nodes (3): 42. 🔴 `DELETE` delete, هدرهای اضافی, پاسخ‌ها
@@ -2841,22 +2819,22 @@ Nodes (3): 43. 🟢 `GET` get, هدرهای اضافی, پاسخ‌ها
## Knowledge Gaps
- **3644 isolated node(s):** `ALLOWED_ROLES`, `Pricing`, `TenantInsurance`, `CoverageRow`, `Draft` (+3639 more)
These have ≤1 connection - possible missing edges or undocumented components.
- **133 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
- **131 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
## Suggested Questions
_Questions this graph is uniquely positioned to answer:_
- **Why does `BaseController` connect `Community 108` to `Community 6`, `Community 138`, `Community 11`, `Community 139`, `Community 14`, `Community 15`, `Community 275`, `Community 20`, `Community 22`, `Community 26`, `Community 164`, `Community 300`, `Community 301`, `Community 175`, `Community 176`, `Community 177`, `Community 59`, `Community 63`, `Community 64`, `Community 70`, `Community 71`, `Community 75`, `Community 206`, `Community 352`, `Community 230`, `Community 103`, `Community 104`, `Community 107`, `Community 491`, `Community 109`, `Community 121`, `Community 122`, `Community 252`?**
_High betweenness centrality (0.031) - this node is a cross-community bridge._
- **Why does `BaseController` connect `Community 108` to `Community 6`, `Community 138`, `Community 139`, `Community 14`, `Community 15`, `Community 275`, `Community 20`, `Community 22`, `Community 26`, `Community 164`, `Community 295`, `Community 300`, `Community 301`, `Community 175`, `Community 176`, `Community 177`, `Community 58`, `Community 59`, `Community 63`, `Community 64`, `Community 70`, `Community 71`, `Community 75`, `Community 206`, `Community 352`, `Community 230`, `Community 103`, `Community 104`, `Community 107`, `Community 491`, `Community 109`, `Community 121`, `Community 122`, `Community 252`?**
_High betweenness centrality (0.030) - this node is a cross-community bridge._
- **Why does `AppointmentRepository` connect `Community 119` to `Community 53`?**
_High betweenness centrality (0.021) - this node is a cross-community bridge._
- **Why does `Version20260614181657` connect `Community 431` to `Community 399`?**
_High betweenness centrality (0.022) - this node is a cross-community bridge._
- **Why does `Version20260614181657` connect `Community 431` to `Community 404`?**
_High betweenness centrality (0.015) - this node is a cross-community bridge._
- **What connects `ALLOWED_ROLES`, `Pricing`, `TenantInsurance` to the rest of the system?**
_3644 weakly-connected nodes found - possible documentation gaps or missing edges._
- **Should `Community 0` be split into smaller, more focused modules?**
_Cohesion score 0.054426705370101594 - nodes in this community are weakly interconnected._
_Cohesion score 0.05137844611528822 - nodes in this community are weakly interconnected._
- **Should `Community 1` be split into smaller, more focused modules?**
_Cohesion score 0.028985507246376812 - nodes in this community are weakly interconnected._
- **Should `Community 2` be split into smaller, more focused modules?**
_Cohesion score 0.06565656565656566 - nodes in this community are weakly interconnected._
_Cohesion score 0.07692307692307693 - nodes in this community are weakly interconnected._
@@ -0,0 +1 @@
{"nodes": [{"id": "users_hamed_pj_my_pj_clinic_pro_clinicpro_migrations_version20260702063537_php", "label": "Version20260702063537.php", "file_type": "code", "source_file": "migrations/Version20260702063537.php", "source_location": "L1"}, {"id": "migrations_version20260702063537_version20260702063537", "label": "Version20260702063537", "file_type": "code", "source_file": "migrations/Version20260702063537.php", "source_location": "L13"}, {"id": "abstractmigration", "label": "AbstractMigration", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "migrations_version20260702063537_version20260702063537_getdescription", "label": ".getDescription()", "file_type": "code", "source_file": "migrations/Version20260702063537.php", "source_location": "L15"}, {"id": "migrations_version20260702063537_version20260702063537_up", "label": ".up()", "file_type": "code", "source_file": "migrations/Version20260702063537.php", "source_location": "L20"}, {"id": "schema", "label": "Schema", "file_type": "code", "source_file": "migrations/Version20260702063537.php", "source_location": "L20"}, {"id": "migrations_version20260702063537_version20260702063537_down", "label": ".down()", "file_type": "code", "source_file": "migrations/Version20260702063537.php", "source_location": "L25"}], "edges": [{"source": "users_hamed_pj_my_pj_clinic_pro_clinicpro_migrations_version20260702063537_php", "target": "schema", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "migrations/Version20260702063537.php", "source_location": "L7", "weight": 1.0}, {"source": "users_hamed_pj_my_pj_clinic_pro_clinicpro_migrations_version20260702063537_php", "target": "abstractmigration", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "migrations/Version20260702063537.php", "source_location": "L8", "weight": 1.0}, {"source": "users_hamed_pj_my_pj_clinic_pro_clinicpro_migrations_version20260702063537_php", "target": "migrations_version20260702063537_version20260702063537", "relation": "contains", "confidence": "EXTRACTED", "source_file": "migrations/Version20260702063537.php", "source_location": "L13", "weight": 1.0}, {"source": "migrations_version20260702063537_version20260702063537", "target": "abstractmigration", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "migrations/Version20260702063537.php", "source_location": "L13", "weight": 1.0}, {"source": "migrations_version20260702063537_version20260702063537", "target": "migrations_version20260702063537_version20260702063537_getdescription", "relation": "method", "confidence": "EXTRACTED", "source_file": "migrations/Version20260702063537.php", "source_location": "L15", "weight": 1.0}, {"source": "migrations_version20260702063537_version20260702063537", "target": "migrations_version20260702063537_version20260702063537_up", "relation": "method", "confidence": "EXTRACTED", "source_file": "migrations/Version20260702063537.php", "source_location": "L20", "weight": 1.0}, {"source": "migrations_version20260702063537_version20260702063537_up", "target": "schema", "relation": "references", "confidence": "EXTRACTED", "source_file": "migrations/Version20260702063537.php", "source_location": "L20", "weight": 1.0, "context": "parameter_type"}, {"source": "migrations_version20260702063537_version20260702063537", "target": "migrations_version20260702063537_version20260702063537_down", "relation": "method", "confidence": "EXTRACTED", "source_file": "migrations/Version20260702063537.php", "source_location": "L25", "weight": 1.0}, {"source": "migrations_version20260702063537_version20260702063537_down", "target": "schema", "relation": "references", "confidence": "EXTRACTED", "source_file": "migrations/Version20260702063537.php", "source_location": "L25", "weight": 1.0, "context": "parameter_type"}], "raw_calls": [{"caller_nid": "migrations_version20260702063537_version20260702063537_up", "callee": "addSql", "is_member_call": true, "source_file": "/Users/hamed/pj/my_pj/clinic_pro/clinicpro/migrations/Version20260702063537.php", "source_location": "L22", "receiver": null}, {"caller_nid": "migrations_version20260702063537_version20260702063537_down", "callee": "addSql", "is_member_call": true, "source_file": "/Users/hamed/pj/my_pj/clinic_pro/clinicpro/migrations/Version20260702063537.php", "source_location": "L27", "receiver": null}]}
@@ -0,0 +1 @@
{"nodes": [], "edges": [], "skipped": "data json (non-object root)"}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+851 -646
View File
File diff suppressed because it is too large Load Diff
+28 -23
View File
@@ -190,8 +190,8 @@
"semantic_hash": ""
},
"assets/admin/pages/CategoriesPage.tsx": {
"mtime": 1782844707.7293186,
"ast_hash": "a5dab31477ec4359b88f76d40bcb35bf",
"mtime": 1782974127.331514,
"ast_hash": "43d7e427a556469e4374224c4e665117",
"semantic_hash": ""
},
"assets/admin/pages/ClaimsPage.tsx": {
@@ -400,8 +400,8 @@
"semantic_hash": ""
},
"assets/admin/types/index.ts": {
"mtime": 1782750264.645306,
"ast_hash": "61c032545f706815210d6f66b080bdae",
"mtime": 1782974093.73864,
"ast_hash": "976545bf4ab31428db0fe23c17c23b5f",
"semantic_hash": ""
},
"assets/app.js": {
@@ -1180,8 +1180,8 @@
"semantic_hash": ""
},
"src/Doctor/Controller/DoctorController.php": {
"mtime": 1782728407.195775,
"ast_hash": "5a7f22cf91ac6726ce3427c88eea1a82",
"mtime": 1782931944.4072063,
"ast_hash": "2dd80d4ed9ec5a18474c17d7697cfee8",
"semantic_hash": ""
},
"src/Doctor/Entity/Doctor.php": {
@@ -1295,13 +1295,13 @@
"semantic_hash": ""
},
"src/Location/Controller/LocationController.php": {
"mtime": 1782844299.834749,
"ast_hash": "6a1296178827cdc99c6775db563c41f0",
"mtime": 1782974061.7243073,
"ast_hash": "eeba5749c527b2712549c2dda539e368",
"semantic_hash": ""
},
"src/Location/Entity/City.php": {
"mtime": 1781089230.145856,
"ast_hash": "a74133b8e50f52660ee00586b6d630db",
"mtime": 1782974046.9918911,
"ast_hash": "b37a5c9d79443b32709a30a3decffd30",
"semantic_hash": ""
},
"src/Location/Entity/Province.php": {
@@ -2185,8 +2185,8 @@
"semantic_hash": ""
},
"README.MD": {
"mtime": 1782845053.6544068,
"ast_hash": "57c7558eea01b735b714575a461ee751",
"mtime": 1782933937.9090674,
"ast_hash": "1da6a3afea0f626c55b6f7c1ff126b65",
"semantic_hash": ""
},
"TEST_USERS.md": {
@@ -2240,7 +2240,7 @@
"semantic_hash": ""
},
"config/packages/nelmio_cors.yaml": {
"mtime": 1781009943.585995,
"mtime": 1782933581.6906326,
"ast_hash": "c552214796d17d0d2a94154346b2afa8",
"semantic_hash": ""
},
@@ -2300,7 +2300,7 @@
"semantic_hash": ""
},
"config/services.yaml": {
"mtime": 1782902861.3039489,
"mtime": 1782932864.251077,
"ast_hash": "0cd5b457c6df19eb90acd03c130bd713",
"semantic_hash": ""
},
@@ -2340,7 +2340,7 @@
"semantic_hash": ""
},
"docs/api/admin.md": {
"mtime": 1782930000.5470378,
"mtime": 1782932869.818139,
"ast_hash": "27318238aa2741292c79a491870ba31b",
"semantic_hash": ""
},
@@ -2395,8 +2395,8 @@
"semantic_hash": ""
},
"docs/api/doctor.md": {
"mtime": 1782728407.108632,
"ast_hash": "6dedc0cdfc171e0f7c31fb29647cb27b",
"mtime": 1782932001.1570988,
"ast_hash": "166c5a9c884b17c23a53d9cb592266f4",
"semantic_hash": ""
},
"docs/api/insurance.md": {
@@ -2405,8 +2405,8 @@
"semantic_hash": ""
},
"docs/api/location.md": {
"mtime": 1782844893.6796494,
"ast_hash": "bd93b9cdb9c60259814f49193b6cab77",
"mtime": 1782974277.4647317,
"ast_hash": "237d13c1f44f23001d6e9ab287b80898",
"semantic_hash": ""
},
"docs/api/patient.md": {
@@ -3430,8 +3430,8 @@
"semantic_hash": ""
},
"data/seed/cities.json": {
"mtime": 1782843868.7730389,
"ast_hash": "2baadcc7287ed58538b074906b531efc",
"mtime": 1782973838.4322407,
"ast_hash": "089a1a2c29c7dafdc0f279e72c23f556",
"semantic_hash": ""
},
"data/seed/doctor_services.json": {
@@ -3455,8 +3455,8 @@
"semantic_hash": ""
},
"src/Category/Service/CategoryImporter.php": {
"mtime": 1782843813.8434396,
"ast_hash": "47a348a1a7cf97da5de81caad5f026d9",
"mtime": 1782974082.771482,
"ast_hash": "daaeddb090469fda67b5bdf08c52cacb",
"semantic_hash": ""
},
".claude/prompt/production-fixes-cors-payment-gateways.md": {
@@ -3503,5 +3503,10 @@
"mtime": 1782929788.2918966,
"ast_hash": "7d306f9d2eba4693cd01ff21f2eda173",
"semantic_hash": ""
},
"migrations/Version20260702063537.php": {
"mtime": 1782974183.0364032,
"ast_hash": "dc5d90afffa97b8150bcacba60846c8d",
"semantic_hash": ""
}
}
+29
View File
@@ -0,0 +1,29 @@
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20260702063537 extends AbstractMigration
{
public function getDescription(): string
{
return 'Add site_name column to cities';
}
public function up(Schema $schema): void
{
$this->addSql('ALTER TABLE cities ADD site_name VARCHAR(255) DEFAULT NULL AFTER name');
}
public function down(Schema $schema): void
{
$this->addSql('ALTER TABLE cities DROP site_name');
}
}
@@ -142,6 +142,7 @@ class CategoryImporter
$row['logo_url'] = self::optStr($raw['logo_url'] ?? null);
break;
case 'cities':
$row['site_name'] = self::optStr($raw['site_name'] ?? null);
$row['province_id'] = self::nullableId($raw['province_id'] ?? null, $add, 'province_id');
$row['representation_id'] = self::nullableId($raw['representation_id'] ?? null, $add, 'representation_id');
$row['contact_phone'] = self::optStr($raw['contact_phone'] ?? null);
@@ -223,6 +223,7 @@ class LocationController extends BaseController
if (isset($data['weight'])) $city->setWeight((int) $data['weight']);
if (array_key_exists('representation_id', $data))
$city->setRepresentationId($data['representation_id'] !== null ? (int) $data['representation_id'] : null);
if (array_key_exists('site_name', $data)) $city->setSiteName($data['site_name']);
if (array_key_exists('contact_phone', $data)) $city->setContactPhone($data['contact_phone']);
if (array_key_exists('email', $data)) $city->setEmail($data['email']);
if (array_key_exists('description', $data)) $city->setDescription($data['description']);
+6
View File
@@ -24,6 +24,9 @@ class City
#[ORM\Column(type: 'string', length: 255)]
private string $name;
#[ORM\Column(name: 'site_name', type: 'string', length: 255, nullable: true)]
private ?string $siteName = null;
#[ORM\Column(type: 'smallint')]
private int $status = 1;
@@ -74,6 +77,7 @@ class City
public function getId(): ?int { return $this->id; }
public function getUuid(): string { return $this->uuid; }
public function getName(): string { return $this->name; }
public function getSiteName(): ?string { return $this->siteName; }
public function getStatus(): int { return $this->status; }
public function getWeight(): int { return $this->weight; }
public function getProvince(): ?Province { return $this->province; }
@@ -89,6 +93,7 @@ class City
public function getLogoUrl(): ?string { return $this->logoUrl; }
public function setName(string $v): self { $this->name = $v; return $this; }
public function setSiteName(?string $v): self { $this->siteName = $v; return $this; }
public function setStatus(int $v): self { $this->status = $v; return $this; }
public function setWeight(int $v): self { $this->weight = $v; return $this; }
public function setProvince(?Province $v): self { $this->province = $v; return $this; }
@@ -109,6 +114,7 @@ class City
'id' => $this->id,
'uuid' => $this->uuid,
'name' => $this->name,
'site_name' => $this->siteName,
'status' => $this->status,
'weight' => $this->weight,
'province_id' => $this->province?->getId(),