Add JSON files for Payment Gateway Interface and API documentation updates

- Created a new JSON file for the PaymentGatewayInterface.php, detailing its methods and return types.
- Added a JSON file for payment.md, documenting various API endpoints and their parameters, responses, and errors.
- Introduced a JSON file for fix-admin-modal-and-calendar.md, outlining issues and solutions related to admin modal and calendar functionalities.
This commit is contained in:
hamed
2026-07-02 21:22:14 +03:30
parent 1804b4215d
commit 1c81c6f2e5
64 changed files with 9663 additions and 1999 deletions
+157
View File
@@ -0,0 +1,157 @@
# ریسپانسیو کردن پنل ادمین برای موبایل (iPhone 8 / ۳۷۵px)
## پروژه
`clinicpro` (admin frontend — React 19 + `assets/admin/styles.css`)
## زمینه
پنل `/admin` روی صفحه‌های کوچک (مثل iPhone 8 عرض ۳۷۵px) به‌هم می‌ریزد و افقی اسکرول می‌شود. زیرساخت ریسپانسیو **تا حدی هست** (viewport meta درست است، drawer سایدبار + scrim در `@media (max-width: 860px)`، `.settings-grid`/`.stat-grid` در media collapse می‌شوند)، ولی **بی‌اثر شده** چون در بیشتر صفحه‌ها `grid-template-columns` به‌صورت **inline `style={{}}`** روی المان‌ها نوشته شده و **inline style بر قوانین `@media` در CSS اولویت دارد** → گریدها روی موبایل جمع نمی‌شوند و از عرض صفحه بیرون می‌زنند.
نمونهٔ واقعی: `PaymentsPage.tsx``<div className="stat-grid" style={{ gridTemplateColumns: 'repeat(4,1fr)' }}>`؛ روی ۳۷۵px می‌شود ۴ ستون ۹۰px‌ای که overflow می‌دهد. `.stat-grid` در CSS در `@media (max-width:560px)` به `1fr 1fr` می‌رود ولی inline آن را باطل می‌کند.
## مشکل / هدف
پنل ادمین روی ۳۷۵px بدون اسکرول افقی و خوانا شود:
1. گریدهای inline ثابت که media را می‌شکنند اصلاح شوند (بهترین راه: `repeat(auto-fit, minmax(...))` که بدون media خودکار جمع می‌شود، یا حذف inline و واگذاری به CSS).
2. breakpoint منوی موبایل (hamburger) با drawer یکسان شود.
3. جدول‌ها و محتوای عریض داخل کانتینر اسکرول‌شونده باشند، نه کل صفحه.
4. گارد سراسری ضد-overflow افقی.
## فایل‌های مرتبط
| فایل | نقش |
|------|-----|
| `clinicpro/assets/admin/styles.css` | `.stat-grid` auto-fit، breakpoint drawer، گارد overflow، paddingهای موبایل |
| `clinicpro/assets/admin/components/layout/Topbar.tsx` | هماهنگی breakpoint hamburger با CSS |
| صفحه‌های با گرید inline (لیست پایین) | حذف/ریسپانسیو کردن `gridTemplateColumns` inline |
**صفحه‌ها/کامپوننت‌های دارای `gridTemplateColumns` inline** (`grep -rn "gridTemplateColumns:" assets/admin`):
`PaymentsPage`, `DoctorsPage`, `StaffPage`, `FinancialReportPage`, `RepresentationFinancePage`, `RepresentationSettlementPage`, `DashboardPage` (چند مورد)، `ClinicDetailPage` (`1fr 300px``DoctorDetailPage` (`1fr 1fr auto``AppointmentsPage` (`1fr auto``SettingsPage` (`1fr auto``ServiceTariffModal` (`150px 1fr auto``DashboardPage` ردیف `160px 1fr 52px`. (`PersianCalendar` گریدهای `repeat(7,1fr)`/`repeat(3,1fr)` داخل popover کوچک‌اند و مشکل‌ساز نیستند — دست نزن.)
## وضعیت فعلی
### CSS (`assets/admin/styles.css`)
```css
:root { --sidebar-w: 252px; }
.main { flex: 1; min-width: 0; margin-right: var(--sidebar-w); }
.stat-grid { /* base بدون grid-template-columns صریح؟ inlineها آن را ست می‌کنند */ }
.scrim { display: none; }
@media (max-width: 1080px) {
.stat-grid { grid-template-columns: repeat(3, 1fr); }
.dash-main, .dash-3 { grid-template-columns: 1fr; }
}
@media (max-width: 860px) { /* ← drawer فقط تا 860 */
.main { margin-right: 0 !important; }
.sidebar { transform: translateX(100%); box-shadow: var(--shadow-lg); }
.app[data-mobile-open="true"] .sidebar { transform: translateX(0); width: var(--sidebar-w); }
.app[data-mobile-open="true"] .scrim { display: block; position: fixed; inset: 0; /* ... */ }
.topbar-search { display: none; }
.grid-2 { grid-template-columns: 1fr; }
}
@media (max-width: 560px) { .stat-grid { grid-template-columns: 1fr 1fr; } }
```
### Topbar breakpoint (ناهماهنگ با CSS)
```tsx
// assets/admin/components/layout/Topbar.tsx:26
onClick={typeof window !== 'undefined' && window.innerWidth < 1024 ? onMobileMenuOpen : toggleSidebar}
```
`< 1024` منوی موبایل را باز می‌کند، ولی drawer CSS فقط `≤ 860` است → در بازهٔ ۸۶۱–۱۰۲۳ hamburger «باز» می‌کند اما سایدبار حالت drawer ندارد (منطقهٔ خراب).
### نمونهٔ گرید inline (تکرارشده در ۲۰ فایل)
```tsx
<div className="stat-grid" style={{ gridTemplateColumns: 'repeat(4,1fr)' }}> // PaymentsPage:116
<div className="stat-grid" style={{ gridTemplateColumns: 'repeat(5,1fr)' }}> // DoctorsPage:212
<div style={{ display: 'grid', gridTemplateColumns: '1fr 300px', gap: 'var(--gap)' }}> // ClinicDetailPage:784
```
## وظایف
### ۱. `.stat-grid` را ذاتاً ریسپانسیو کن (CSS)
در `styles.css` به `.stat-grid` یک base با `auto-fit` بده تا **بدون نیاز به media و بدون تأثیرپذیری از تعداد ستون** خودش جمع شود:
```css
.stat-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
gap: var(--gap);
}
```
و قوانین media مربوط به `.stat-grid` (خطوط ۷۰۴ و ۷۲۰ فعلی) را **حذف** کن (دیگر لازم نیستند؛ auto-fit همه را پوشش می‌دهد).
### ۲. حذف `gridTemplateColumns` inline از stat-gridها
در همهٔ صفحه‌هایی که `<div className="stat-grid" style={{ gridTemplateColumns: 'repeat(N,1fr)', ... }}>` دارند، فقط **کلید `gridTemplateColumns` را از inline style حذف کن** (بقیهٔ propها مثل `marginBottom` بمانند). با تسک ۱، خودکار ریسپانسیو می‌شوند.
فایل‌ها: `PaymentsPage`, `DoctorsPage`, `StaffPage`, `FinancialReportPage`, `RepresentationFinancePage`, `RepresentationSettlementPage`, `DashboardPage` (خطوط ۹۵۰/۱۰۵۶/۱۰۷۲).
مثال:
```tsx
// قبل
<div className="stat-grid" style={{ gridTemplateColumns: 'repeat(4,1fr)' }}>
// بعد
<div className="stat-grid">
// اگر propهای دیگری بود:
<div className="stat-grid" style={{ marginBottom: 'var(--gap)' }}>
```
### ۳. لایه‌های دو/سه‌ستونهٔ inline → ریسپانسیو
برای گریدهای غیرِ stat که ستون ثابت دارند و باید روی موبایل عمودی شوند، به‌جای inline از کلاس ریسپانسیو استفاده کن. یک کلاس عمومی در CSS اضافه کن:
```css
/* لایهٔ دوستونه که زیر ۸۶۰ عمودی می‌شود */
.split-2 { display: grid; grid-template-columns: 1fr minmax(0, 320px); gap: var(--gap); align-items: start; }
@media (max-width: 860px) { .split-2 { grid-template-columns: 1fr; } }
/* ردیف فیلد + اکشن که زیر ۶۰۰ عمودی می‌شود */
.form-row { display: grid; grid-template-columns: 1fr auto; gap: 12px; align-items: end; }
@media (max-width: 600px) { .form-row { grid-template-columns: 1fr; } }
```
سپس:
- `ClinicDetailPage:784` (`1fr 300px`) → `className="split-2"` (حذف inline grid).
- `DoctorDetailPage:1107` (`1fr 1fr auto`) و `AppointmentsPage:409` (`1fr auto`) و `SettingsPage:431` (`1fr auto`) و `ServiceTariffModal:95` (`150px 1fr auto`) → از `form-row` استفاده کن یا اگر ساختار خاص است، همان inline را با wrap در media نگه‌دار ولی مطمئن شو زیر ۶۰۰ تک‌ستون می‌شود. (برای المان‌های inline که کلاس‌گذاری سخت است، می‌توانی `gridTemplateColumns` را با `repeat(auto-fit, minmax(140px, 1fr))` جایگزین کنی تا خودکار بشکند.)
- `DashboardPage:119` (`160px 1fr 52px`) و `DashboardPage:514` (`quick-grid` `repeat(3,1fr)`): `quick-grid` را هم مثل stat به auto-fit ببر؛ ردیف ۱۶۰px را زیر ۵۶۰ به `1fr auto` یا wrap تبدیل کن.
### ۴. هماهنگی breakpoint منوی موبایل
drawer را با hamburger یکسان کن. **سریع‌ترین راه:** در `styles.css` بلوک `@media (max-width: 860px)` را به `@media (max-width: 1024px)` تغییر بده (drawer/scrim/main-margin/topbar-search همگی زیر ۱۰۲۴). این با `window.innerWidth < 1024` در `Topbar` هم‌خوان می‌شود و منطقهٔ خرابِ ۸۶۱–۱۰۲۳ رفع می‌شود.
> اگر ترجیح می‌دهی سایدبار روی تبلت بماند، به‌جای آن `1024` در `Topbar.tsx` را به `860` تغییر بده. یکی از دو راه — نه هر دو. (توصیه: drawer تا ۱۰۲۴.)
### ۵. گارد سراسری ضد-overflow افقی + padding موبایل
در `styles.css`:
```css
html, body { max-width: 100%; overflow-x: hidden; }
.main { min-width: 0; } /* اجازهٔ کوچک‌شدن flex child */
@media (max-width: 560px) {
.page, .main > * { padding-left: 12px; padding-right: 12px; } /* اگر padding بزرگ‌تری دارند */
.page-head, .toolbar { flex-wrap: wrap; gap: 10px; } /* هدر/تولبار در چند خط */
}
```
(کلاس‌های واقعی padding صفحه را از `styles.css` پیدا کن — اگر نام `.page`/`.content` فرق دارد، همان را هدف بگیر.)
### ۶. جدول‌ها داخل کانتینر اسکرول‌شونده
هر `<table>` عریض باید داخل `.table-wrap` (که `overflow-x: auto` دارد) باشد تا فقط جدول اسکرول شود نه کل صفحه. فایل‌های دارای `<table>` بدون wrap را بررسی و در صورت نبودِ wrapper، دور جدول `<div className="table-wrap">` بگذار:
`PreRegistrationsPage`, `UsersPage`, `ClinicsPage`, `RepresentationFinancePage`, `AppointmentsPage`, `RepresentationSettlementPage`, `AdminSubscriptionPage`, `DoctorsPage`, `SmsWalletPage`, `RepresentationProfilePage`. (اگر از کامپوننت `DataTable` مشترک استفاده می‌کنند و آن خودش wrap دارد، نیازی نیست — اول بررسی کن.)
## نکات مهم
- **چرا inline بد است:** `style={{gridTemplateColumns}}` روی المان، specificity بالاتر از هر `@media` در stylesheet دارد؛ پس یا حذف شود یا خودش `auto-fit`/ریسپانسیو باشد. این هستهٔ باگ است.
- `auto-fit + minmax` بهترین انتخاب برای stat/quick گریدهاست: بدون media، با هر تعداد کارت، روی هر عرض درست جمع می‌شود.
- **RTL**: از `padding-inline`/`margin-inline` و رفتار موجود پیروی کن؛ چیزی که RTL را بشکند اضافه نکن.
- کلاس CSS جدید فقط در حد `.split-2`/`.form-row` (یا معادل)؛ کتابخانهٔ CSS جدید نصب نکن.
- بعد از تغییر: `ddev exec yarn dev` و `ddev exec npx tsc --noEmit` بدون خطا؛ سپس در DevTools با عرض **375px (iPhone 8)** این صفحه‌ها را چک کن: Dashboard، Payments، Doctors، Appointments، Settings، یک Detail (Clinic/Doctor) — نباید اسکرول افقی داشته باشند و کارت‌ها/جدول‌ها باید درست بچینند.
- تغییر فقط frontend/CSS است؛ backend و docs تغییری ندارند.
- این‌ها فایل‌های `.tsx`/CSS پنل‌اند؛ اگر جای دیگری هم `gridTemplateColumns` inline ثابت دیدی که overflow می‌دهد، همان الگو را اعمال کن.
+4 -4
View File
@@ -207,7 +207,7 @@ function PlansTab() {
{plan.periods.length === 0 ? (
<div style={{ padding: '20px 16px', color: 'var(--text-3)', fontSize: 13 }}>هنوز دورهای تعریف نشده</div>
) : (
<table style={{ width: '100%', borderCollapse: 'collapse', fontSize: 13 }}>
<div className="table-wrap"><table style={{ width: '100%', borderCollapse: 'collapse', fontSize: 13 }}>
<thead>
<tr style={{ borderBottom: '1px solid var(--border)' }}>
<th style={{ textAlign: 'right', padding: '8px 16px', color: 'var(--text-3)', fontWeight: 500 }}>دوره</th>
@@ -239,7 +239,7 @@ function PlansTab() {
</tr>
))}
</tbody>
</table>
</table></div>
)}
</div>
))}
@@ -382,7 +382,7 @@ function ReportTab() {
<div className="card-pad" style={{ color: 'var(--text-3)', textAlign: 'center', padding: '40px 0' }}>هیچ اشتراکی ثبت نشده</div>
) : (
<>
<table style={{ width: '100%', borderCollapse: 'collapse', fontSize: 13 }}>
<div className="table-wrap"><table style={{ width: '100%', borderCollapse: 'collapse', fontSize: 13 }}>
<thead>
<tr style={{ borderBottom: '1px solid var(--border)' }}>
<th style={{ textAlign: 'right', padding: '10px 16px', color: 'var(--text-3)', fontWeight: 500 }}>نوع</th>
@@ -416,7 +416,7 @@ function ReportTab() {
</tr>
))}
</tbody>
</table>
</table></div>
<div style={{ padding: '12px 16px' }}>
<Pagination page={page} total={total} limit={limit} onPageChange={setPage} />
</div>
+2 -2
View File
@@ -199,7 +199,7 @@ function TableView({
return (
<div style={{ overflowX: 'auto' }}>
<table style={{ width: '100%', borderCollapse: 'collapse', fontSize: 13 }}>
<div className="table-wrap"><table style={{ width: '100%', borderCollapse: 'collapse', fontSize: 13 }}>
<thead>
<tr style={{ borderBottom: '1px solid var(--border)', background: 'var(--surface-2)' }}>
<th style={th}>ردیف</th>
@@ -241,7 +241,7 @@ function TableView({
</tr>
))}
</tbody>
</table>
</table></div>
</div>
);
}
+1 -1
View File
@@ -781,7 +781,7 @@ export default function ClinicDetailPage() {
</div>
{/* ── Main grid ── */}
<div style={{ display: 'grid', gridTemplateColumns: '1fr 300px', gap: 'var(--gap)', alignItems: 'start' }}>
<div className="split-2">
{/* Left column */}
<div style={{ display: 'flex', flexDirection: 'column', gap: 'var(--gap)' }}>
+2 -2
View File
@@ -135,7 +135,7 @@ export default function ClinicsPage() {
</div>
</div>
<table className="t">
<div className="table-wrap"><table className="t">
<thead>
<tr>
<th>کلینیک</th>
@@ -237,7 +237,7 @@ export default function ClinicsPage() {
);
})}
</tbody>
</table>
</table></div>
<Pagination page={page} total={total} limit={limit} onPageChange={setPage} />
</div>
+4 -4
View File
@@ -511,7 +511,7 @@ function AdminDashboard() {
<div className="grid-2" style={{ marginBottom: 'var(--gap)' }}>
<div className="card card-pad">
<div className="card-title-row"><h3 style={{ fontSize: 16 }}>دسترسی سریع</h3></div>
<div className="quick-grid" style={{ gridTemplateColumns: 'repeat(3,1fr)' }}>
<div className="quick-grid">
{quickActions.map(a => (
<Link key={a.to} to={a.to} className="quick">
<span className="qi" style={{ background: a.bg, color: a.color }}>
@@ -947,7 +947,7 @@ function SecretaryDashboard() {
</div>
</div>
<div className="stat-grid" style={{ gridTemplateColumns: 'repeat(2, 1fr)' }}>
<div className="stat-grid">
{kpiCards.map(c => (
<div key={c.label} className="stat">
<div className="ico" style={{ background: c.bg, color: c.color }}>
@@ -1053,7 +1053,7 @@ function RepresentationDashboard() {
</button>
</div>
<div className="stat-grid" style={{ gridTemplateColumns: 'repeat(4, 1fr)' }}>
<div className="stat-grid">
{apptCards.map(c => (
<div key={c.label} className="stat">
<div className="ico" style={{ background: c.bg, color: c.color }}>
@@ -1069,7 +1069,7 @@ function RepresentationDashboard() {
<div className="card-title-row" style={{ marginBottom: 12 }}>
<h3 style={{ fontSize: 16 }}>درآمد نماینده</h3>
</div>
<div className="stat-grid" style={{ gridTemplateColumns: 'repeat(4, 1fr)' }}>
<div className="stat-grid">
{incomeCards.map(c => (
<div key={c.label} className="stat" style={{ background: 'var(--surface-3)' }}>
<div className="lbl">{c.label}</div>
+1 -1
View File
@@ -1104,7 +1104,7 @@ function SessionEditor({ session, onChange, onRemove, addresses }: {
<div style={{ border: '1px solid var(--border)', borderRadius: 'var(--r)', background: 'var(--surface)', overflow: 'hidden' }}>
{/* Time inputs */}
<div style={{ padding: '14px 16px 12px', display: 'grid', gridTemplateColumns: '1fr 1fr auto', gap: 12, alignItems: 'end' }}>
<div style={{ padding: '14px 16px 12px', display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(140px, 1fr))', gap: 12, alignItems: 'end' }}>
<div>
<div style={{ fontSize: 12, color: 'var(--text-2)', marginBottom: 5 }}>از ساعت</div>
<TimeSelect value={session.start_time} onChange={v => upd('start_time', v)} />
+1 -1
View File
@@ -209,7 +209,7 @@ export default function DoctorsPage() {
</div>
{/* KPI cards */}
<div className="stat-grid" style={{ gridTemplateColumns: 'repeat(5,1fr)' }}>
<div className="stat-grid">
{kpiCards.map((c) => (
<div key={c.label} className="stat">
<div className="ico" style={{ background: c.bg, color: c.color }}>
+1 -1
View File
@@ -93,7 +93,7 @@ export default function FinancialReportPage() {
</div>
</div>
<div className="stat-grid" style={{ gridTemplateColumns: 'repeat(5,1fr)', marginBottom: 'var(--gap)' }}>
<div className="stat-grid" style={{ marginBottom: 'var(--gap)' }}>
{cards.map((c) => (
<div key={c.label} className="stat" style={{ background: c.bg }}>
<div className="stat-label">{c.label}</div>
+1 -1
View File
@@ -113,7 +113,7 @@ export default function PaymentsPage() {
</div>
{/* Stat cards */}
<div className="stat-grid" style={{ gridTemplateColumns: 'repeat(4,1fr)' }}>
<div className="stat-grid">
{statCards.map((c) => (
<div key={c.label} className="stat">
<div className="ico" style={{ background: c.bg, color: c.color }}>
+2 -2
View File
@@ -98,7 +98,7 @@ export default function PreRegistrationsPage() {
</div>
<div className="card" style={{ padding: 0, overflow: 'hidden' }}>
<table className="t">
<div className="table-wrap"><table className="t">
<thead>
<tr>
<th>نام</th>
@@ -186,7 +186,7 @@ export default function PreRegistrationsPage() {
);
})}
</tbody>
</table>
</table></div>
</div>
<Pagination page={page} total={total} limit={limit} onPageChange={setPage} />
@@ -104,7 +104,7 @@ export default function RepresentationFinancePage() {
</div>
{/* کارت‌های خلاصه */}
<div className="stat-grid" style={{ gridTemplateColumns: 'repeat(4, 1fr)', marginBottom: 'var(--gap)' }}>
<div className="stat-grid" style={{ marginBottom: 'var(--gap)' }}>
{cards.map(c => (
<div key={c.label} className="stat">
<div className="ico" style={{ background: c.bg, color: c.color }}>
@@ -129,7 +129,7 @@ export default function RepresentationFinancePage() {
</div>
<div style={{ overflowX: 'auto' }}>
<table className="tbl tbl-zebra" style={{ width: '100%', minWidth: 720 }}>
<div className="table-wrap"><table className="tbl tbl-zebra" style={{ width: '100%', minWidth: 720 }}>
<thead>
<tr>
<th>پزشک</th>
@@ -174,7 +174,7 @@ export default function RepresentationFinancePage() {
</tr>
))}
</tbody>
</table>
</table></div>
</div>
</div>
@@ -146,7 +146,7 @@ export default function RepresentationProfilePage() {
</div>
<div style={{ overflowX: 'auto' }}>
<table className="tbl" style={{ width: '100%' }}>
<div className="table-wrap"><table className="tbl" style={{ width: '100%' }}>
<thead><tr><th>شماره شبا</th><th>بانک</th><th>صاحب حساب</th><th>وضعیت</th><th></th></tr></thead>
<tbody>
{ibans.length === 0 && (
@@ -166,7 +166,7 @@ export default function RepresentationProfilePage() {
</tr>
))}
</tbody>
</table>
</table></div>
</div>
{!verified && (
@@ -103,7 +103,7 @@ export default function RepresentationSettlementPage() {
</div>
</div>
<div className="stat-grid" style={{ gridTemplateColumns: 'repeat(3, 1fr)' }}>
<div className="stat-grid">
{cards.map(c => (
<div key={c.label} className="stat" style={{ background: 'var(--surface-3)' }}>
<div className="lbl">{c.label}</div>
@@ -151,7 +151,7 @@ export default function RepresentationSettlementPage() {
<h3 style={{ fontSize: 16 }}>درخواستهای قبلی</h3>
</div>
<div style={{ overflowX: 'auto' }}>
<table className="tbl" style={{ width: '100%' }}>
<div className="table-wrap"><table className="tbl" style={{ width: '100%' }}>
<thead><tr><th>مبلغ</th><th>وضعیت</th><th>توضیح مدیر</th><th>تاریخ</th></tr></thead>
<tbody>
{settlements.length === 0 && (
@@ -166,7 +166,7 @@ export default function RepresentationSettlementPage() {
</tr>
))}
</tbody>
</table>
</table></div>
</div>
<Pagination page={page} total={settlementsTotal} limit={limit} onPageChange={setPage} />
</div>
+2 -2
View File
@@ -427,7 +427,7 @@ function SmsWalletPageInner() {
</div>
) : (
<>
<table style={{ width: '100%', borderCollapse: 'collapse', fontSize: 13 }}>
<div className="table-wrap"><table style={{ width: '100%', borderCollapse: 'collapse', fontSize: 13 }}>
<thead>
<tr style={{ background: 'oklch(0.97 0.01 256)', borderBottom: '1px solid var(--border)' }}>
<th style={{ textAlign: 'right', padding: '10px 16px', fontWeight: 600, color: 'var(--text-2)' }}>نوع</th>
@@ -469,7 +469,7 @@ function SmsWalletPageInner() {
</tr>
))}
</tbody>
</table>
</table></div>
<div style={{ padding: '12px 16px' }}>
<Pagination page={logPage} total={total} limit={20} onPageChange={setLogPage} />
</div>
+1 -1
View File
@@ -168,7 +168,7 @@ export default function StaffPage() {
{/* KPI bar */}
{!isLoading && (
<div className="stat-grid" style={{ marginBottom: 16, gridTemplateColumns: 'repeat(3, 1fr)' }}>
<div className="stat-grid" style={{ marginBottom: 16 }}>
<div className="card card-pad" style={{ textAlign: 'center' }}>
<div style={{ fontSize: 28, fontWeight: 800, color: 'var(--text-1)' }}>{total}</div>
<div style={{ fontSize: 13, color: 'var(--text-3)', marginTop: 2 }}>کل پرسنل</div>
+17 -5
View File
@@ -466,7 +466,7 @@ body {
.stat .lbl { color: var(--text-2); font-size: 13px; font-weight: 500; }
.stat .val { font-size: 26px; font-weight: 800; letter-spacing: -.5px; margin: 4px 0 2px; color: var(--text); }
.stat .hint { font-size: 11.5px; color: var(--text-3); }
.stat-grid { display: grid; grid-template-columns: repeat(6, 1fr); gap: var(--gap); margin-bottom: var(--gap); }
.stat-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: var(--gap); margin-bottom: var(--gap); }
.trend { display: inline-flex; align-items: center; gap: 3px; font-size: 12px; font-weight: 700; padding: 2px 8px; border-radius: 99px; }
.trend.up { color: var(--success); background: var(--success-bg); }
.trend.down { color: var(--danger); background: var(--danger-bg); }
@@ -674,7 +674,7 @@ table.t tbody tr:last-child td { border-bottom: none; }
.timeline-item .tl-body time { font-size: 11px; color: var(--text-3); }
.tl-connector { width: 1px; background: var(--border); flex-shrink: 0; margin: 0 4px; }
.quick-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
.quick-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 12px; }
.quick {
display: flex; flex-direction: column; align-items: center; gap: 10px; padding: 20px 12px;
border: 1px solid var(--border); border-radius: var(--r); background: var(--surface-2);
@@ -699,13 +699,19 @@ table.t tbody tr:last-child td { border-bottom: none; }
.avatar.lg { width: 104px; height: 104px; font-size: 34px; border-radius: 22px; }
/* ── Responsive ──────────────────────────────────────────────── */
/* گارد ضد-overflow افقی سراسری */
html, body { max-width: 100%; overflow-x: hidden; }
/* لایه‌های ریسپانسیو مشترک */
.split-2 { display: grid; grid-template-columns: 1fr minmax(0, 320px); gap: var(--gap); align-items: start; }
.form-row { display: grid; grid-template-columns: 1fr auto; gap: 12px; align-items: end; }
.scrim { display: none; }
@media (max-width: 1080px) {
.stat-grid { grid-template-columns: repeat(3, 1fr); }
.dash-main { grid-template-columns: 1fr; }
.dash-3 { grid-template-columns: 1fr; }
}
@media (max-width: 860px) {
@media (max-width: 1024px) {
.main { margin-right: 0 !important; }
.sidebar { transform: translateX(100%); box-shadow: var(--shadow-lg); }
.app[data-mobile-open="true"] .sidebar { transform: translateX(0); width: var(--sidebar-w); }
@@ -716,8 +722,14 @@ table.t tbody tr:last-child td { border-bottom: none; }
.topbar-search { display: none; }
.grid-2 { grid-template-columns: 1fr; }
}
@media (max-width: 860px) {
.split-2 { grid-template-columns: 1fr; }
}
@media (max-width: 600px) {
.form-row { grid-template-columns: 1fr; }
}
@media (max-width: 560px) {
.stat-grid { grid-template-columns: 1fr 1fr; }
.page-head, .toolbar { flex-wrap: wrap; }
}
/* صفحه سرویس‌های کلینیک */
+21 -1
View File
@@ -653,6 +653,8 @@
"651": "Community 651",
"652": "Community 652",
"653": "Community 653",
"654": "Community 654",
"655": "Community 655",
"656": "Community 656",
"657": "Community 657",
"658": "Community 658",
@@ -661,6 +663,8 @@
"661": "Community 661",
"662": "Community 662",
"663": "Community 663",
"664": "Community 664",
"665": "Community 665",
"666": "Community 666",
"667": "Community 667",
"668": "Community 668",
@@ -668,7 +672,23 @@
"670": "Community 670",
"671": "Community 671",
"672": "Community 672",
"673": "Community 673",
"674": "Community 674",
"675": "Community 675",
"676": "Community 676",
"679": "Community 679"
"677": "Community 677",
"678": "Community 678",
"679": "Community 679",
"680": "Community 680",
"681": "Community 681",
"682": "Community 682",
"683": "Community 683",
"684": "Community 684",
"685": "Community 685",
"686": "Community 686",
"687": "Community 687",
"688": "Community 688",
"689": "Community 689",
"690": "Community 690",
"691": "Community 691"
}
+203 -119
View File
@@ -1,16 +1,16 @@
# Graph Report - clinicpro (2026-07-02)
## Corpus Check
- 674 files · ~473,936 words
- 692 files · ~493,676 words
- Verdict: corpus is large enough that graph structure adds value.
## Summary
- 8487 nodes · 11688 edges · 672 communities (543 shown, 129 thin omitted)
- Extraction: 98% EXTRACTED · 2% INFERRED · 0% AMBIGUOUS · INFERRED: 265 edges (avg confidence: 0.8)
- 8775 nodes · 12110 edges · 692 communities (559 shown, 133 thin omitted)
- Extraction: 98% EXTRACTED · 2% INFERRED · 0% AMBIGUOUS · INFERRED: 269 edges (avg confidence: 0.8)
- Token cost: 0 input · 0 output
## Graph Freshness
- Built from commit: `6d594822`
- Built from commit: `1804b421`
- Run `git rev-parse HEAD` and compare to check if the graph is stale.
- Run `graphify update .` after code changes (no API cost).
@@ -655,6 +655,8 @@
- [[_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]]
@@ -663,15 +665,33 @@
- [[_COMMUNITY_Community 661|Community 661]]
- [[_COMMUNITY_Community 662|Community 662]]
- [[_COMMUNITY_Community 663|Community 663]]
- [[_COMMUNITY_Community 664|Community 664]]
- [[_COMMUNITY_Community 665|Community 665]]
- [[_COMMUNITY_Community 666|Community 666]]
- [[_COMMUNITY_Community 667|Community 667]]
- [[_COMMUNITY_Community 668|Community 668]]
- [[_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]]
- [[_COMMUNITY_Community 680|Community 680]]
- [[_COMMUNITY_Community 681|Community 681]]
- [[_COMMUNITY_Community 682|Community 682]]
- [[_COMMUNITY_Community 683|Community 683]]
- [[_COMMUNITY_Community 684|Community 684]]
- [[_COMMUNITY_Community 685|Community 685]]
- [[_COMMUNITY_Community 686|Community 686]]
- [[_COMMUNITY_Community 687|Community 687]]
- [[_COMMUNITY_Community 688|Community 688]]
- [[_COMMUNITY_Community 689|Community 689]]
- [[_COMMUNITY_Community 690|Community 690]]
- [[_COMMUNITY_Community 691|Community 691]]
## God Nodes (most connected - your core abstractions)
1. `BaseController` - 76 edges
@@ -682,61 +702,61 @@
6. `Doctor` - 48 edges
7. `useAuthStore` - 43 edges
8. `ApiResponse` - 41 edges
9. `formatDate()` - 39 edges
10. `AdminApiController` - 37 edges
9. `AdminApiController` - 40 edges
10. `formatDate()` - 39 edges
## Surprising Connections (you probably didn't know these)
- `ServiceTariffModal()` --calls--> `formatNumber()` [EXTRACTED]
assets/admin/components/ServiceTariffModal.tsx → assets/admin/lib/utils.ts
- `Pagination()` --calls--> `formatNumber()` [EXTRACTED]
assets/admin/components/ui/Pagination.tsx → assets/admin/lib/utils.ts
- `MyFinancialPage()` --calls--> `formatRial()` [EXTRACTED]
assets/admin/pages/MyFinancialPage.tsx → assets/admin/lib/utils.ts
- `SettlementsPage()` --calls--> `formatRial()` [EXTRACTED]
assets/admin/pages/SettlementsPage.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
## Import Cycles
- None detected.
## Communities (672 total, 129 thin omitted)
## Communities (692 total, 133 thin omitted)
### Community 0 - "Community 0"
Cohesion: 0.05
Nodes (48): ALLOWED_ROLES, PrivateRoute(), PublicRoute(), RoleRoute(), queryClient, toastStyle, get, BeforeInstallPromptEvent (+40 more)
Nodes (41): ALLOWED_ROLES, PrivateRoute(), PublicRoute(), RoleRoute(), queryClient, toastStyle, AddForm, addSchema (+33 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 (27): usePaymentConfig(), emptyFeatures(), FEATURE_KEYS, FEATURE_LABELS, PeriodForm, periodSchema, PLAN_DISPLAY, PlanForm (+19 more)
Cohesion: 0.11
Nodes (19): PaymentConfig, PaymentGatewayInfo, usePaymentConfig(), ApiResponse, ChargeForm, chargeSchema, EMPTY_LOGS, POST_VISIT_VARS (+11 more)
### Community 3 - "Community 3"
Cohesion: 0.04
Nodes (71): PaginatedResponse, AddForm, addSchema, ClinicsPage(), HUES_LIST, FILTERS, Breakdown, SOURCE_LABEL (+63 more)
Cohesion: 0.06
Nodes (35): PaginatedResponse, STATUS_FILTERS, FILTERS, Breakdown, SOURCE_LABEL, Summary, LEVEL_FILTER_OPTIONS, LEVEL_META (+27 more)
### Community 4 - "Community 4"
Cohesion: 0.06
Nodes (8): DoctorService, Doctor, DoctorServiceRepository, Collection, self, User, WeeklySchedule, ManagerRegistry
Cohesion: 0.05
Nodes (11): DoctorServiceController, DoctorService, Doctor, DoctorServiceRepository, Collection, self, User, WeeklySchedule (+3 more)
### Community 5 - "Community 5"
Cohesion: 0.07
Nodes (3): UserProfile, self, User
### Community 6 - "Community 6"
Cohesion: 0.09
Nodes (15): SettlementController, SettlementRepository, WalletTransactionRepository, CommissionService, Settlement, JsonResponse, Request, User (+7 more)
Cohesion: 0.12
Nodes (12): SettlementController, SettlementRepository, WalletTransactionRepository, Settlement, JsonResponse, Request, User, ManagerRegistry (+4 more)
### Community 7 - "Community 7"
Cohesion: 0.07
Nodes (5): Clinic, Collection, Doctor, self, User
### Community 8 - "Community 8"
Cohesion: 0.07
Nodes (27): Contract, InsuranceOption, KIND_LABEL, AdminLayout(), Topbar(), DEGREE_OPTIONS, DoctorFormPage(), FormValues (+19 more)
Cohesion: 0.08
Nodes (27): useSubscription(), AdminLayout(), avatarBg(), buildSections(), HUES, Props, ROLE_LABELS, Section (+19 more)
### Community 9 - "Community 9"
Cohesion: 0.04
@@ -755,20 +775,20 @@ 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.05
Nodes (35): PaymentConfig, PaymentGatewayInfo, api, ApiError, ApiResponse, getToken(), refreshOnce(), request() (+27 more)
Cohesion: 0.06
Nodes (26): get, api, ApiError, getToken(), refreshOnce(), request(), { refreshMock, logoutMock }, replaceMock (+18 more)
### Community 14 - "Community 14"
Cohesion: 0.15
Nodes (8): AppointmentSettingsController, Holiday, HolidayRepository, JsonResponse, Request, User, Doctor, ManagerRegistry
### Community 15 - "Community 15"
Cohesion: 0.21
Nodes (6): PaymentController, JsonResponse, Payment, Request, Response, User
Cohesion: 0.25
Nodes (7): PaymentController, Appointment, JsonResponse, Payment, Request, Response, User
### Community 16 - "Community 16"
Cohesion: 0.06
Nodes (8): PatientSession, SmsWallet, AppLog, Appointment, Collection, PatientRecord, self, SessionService
Cohesion: 0.09
Nodes (6): PatientSession, Appointment, Collection, PatientRecord, self, SessionService
### Community 17 - "Community 17"
Cohesion: 0.05
@@ -779,20 +799,20 @@ Cohesion: 0.05
Nodes (38): API, API, API, API, API, Route, Route, Route (+30 more)
### Community 19 - "Community 19"
Cohesion: 0.06
Nodes (21): CityForm, citySchema, ImportError, InsuranceForm, insuranceSchema, LogoUploadField(), ProvinceForm, provinceSchema (+13 more)
Cohesion: 0.03
Nodes (56): ALL_STATUSES, CityForm, citySchema, ImportError, InsuranceForm, insuranceSchema, LogoUploadField(), ProvinceForm (+48 more)
### Community 20 - "Community 20"
Cohesion: 0.05
Nodes (13): AdminApiController, RepresentationActionController, DateTimeInterface, InputValidator, JalaliDateService, SlotCalculatorService, JsonResponse, Request (+5 more)
Cohesion: 0.13
Nodes (3): AdminApiController, JsonResponse, Request
### Community 21 - "Community 21"
Cohesion: 0.04
Nodes (46): formatNumber(), ClinicAddress, ClinicDetailPage(), ClinicDoctorItem, ClinicInvitation, EditForm, editSchema, HUES_LIST (+38 more)
Nodes (45): formatNumber(), ClinicAddress, ClinicDetailPage(), ClinicDoctorItem, ClinicInvitation, EditForm, editSchema, HUES_LIST (+37 more)
### Community 22 - "Community 22"
Cohesion: 0.11
Nodes (14): RatingController, Like, Rate, LikeRepository, RateRepository, JsonResponse, Request, User (+6 more)
Cohesion: 0.15
Nodes (9): RatingController, Like, LikeRepository, JsonResponse, Request, User, Comment, ManagerRegistry (+1 more)
### Community 23 - "Community 23"
Cohesion: 0.05
@@ -823,8 +843,8 @@ Cohesion: 0.06
Nodes (35): Bulk import / export, DELETE `/api/v1/admin/city/{id}`, DELETE `/api/v1/admin/province/{id}`, Errors, Errors, Errors, Errors, GET `/api/v1/admin/cities` (+27 more)
### Community 30 - "Community 30"
Cohesion: 0.08
Nodes (15): BillingCalculatorTest, BillingCalculator, Money, BillingCalculator, InvoiceService, PatientService, ErrorCodesTest, CoverageRule (+7 more)
Cohesion: 0.06
Nodes (19): BillingCalculatorTest, BillingCalculator, GatewayFactory, MellatGateway, Money, MellatGatewayTest, SepGateway, BillingCalculator (+11 more)
### Community 31 - "Community 31"
Cohesion: 0.06
@@ -835,8 +855,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.06
Nodes (27): CoverageRow, Draft, KIND, TenantInsurance, ServiceTariffModal(), TariffResponse, TariffRow, EMPTY_ITEMS (+19 more)
### Community 34 - "Community 34"
Cohesion: 0.06
@@ -883,8 +903,8 @@ Cohesion: 0.12
Nodes (3): Blog, self, User
### Community 45 - "Community 45"
Cohesion: 0.07
Nodes (27): Errors, Errors, Errors, Errors, GET `/api/v1/my/payments`, GET `/api/v1/payment/callback/{gateway}`, GET `/api/v1/payment/config`, GET `/api/v1/payment/{uuid}` (+19 more)
Cohesion: 0.06
Nodes (36): Errors, Errors, Errors, Errors, GET `/api/v1/my/payments`, GET `/api/v1/payment/callback/{gateway}`, GET `/api/v1/payment/config`, GET `/api/v1/payment/order/{appointmentUuid}` (+28 more)
### Community 46 - "Community 46"
Cohesion: 0.07
@@ -916,7 +936,7 @@ Nodes (26): الزامات UI, باگ‌فیکس صفحه نوبت‌ها, با
### Community 53 - "Community 53"
Cohesion: 0.10
Nodes (13): AppLogRepository, ClaimItemRepository, DoctorInsuranceRepository, PreRegistrationRepository, SessionServiceRepository, ServiceEntityRepository, ManagerRegistry, ManagerRegistry (+5 more)
Nodes (13): AppLogRepository, ClaimItemRepository, ClinicStaffRepository, PreRegistrationRepository, SessionServiceRepository, ServiceEntityRepository, ManagerRegistry, ManagerRegistry (+5 more)
### Community 54 - "Community 54"
Cohesion: 0.10
@@ -935,8 +955,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
@@ -959,13 +979,17 @@ Cohesion: 0.22
Nodes (5): AuthController, RateLimiterFactory, JsonResponse, Request, User
### Community 64 - "Community 64"
Cohesion: 0.32
Nodes (4): SmsWalletController, JsonResponse, Request, User
Cohesion: 0.19
Nodes (7): SmsWalletController, SmsSettingsRepository, SmsSettings, JsonResponse, Request, User, ManagerRegistry
### Community 65 - "Community 65"
Cohesion: 0.08
Nodes (24): 2. کاربر (User), 4. 🔵 `POST` verify code, 5. 🔵 `POST` send code, 6. 🔵 `POST` register, 7. 🔴 `DELETE` delete user, 8. 🟡 `PATCH` patch, 9. 🟢 `GET` list secretary, Request Body (+16 more)
### Community 66 - "Community 66"
Cohesion: 0.06
Nodes (6): ClinicStaff, SmsWallet, AppLog, LogPruneService, AppointmentExpiryService, self
### Community 67 - "Community 67"
Cohesion: 0.11
Nodes (4): Invoice, Collection, InvoiceItem, self
@@ -983,8 +1007,8 @@ Cohesion: 0.15
Nodes (12): رفع بهم‌ریختگی کامل پنل ادمین روی iPhone 8 (Safari/Chrome iOS), زمینه, فایل‌های مرتبط, مشکل / هدف, نکات مهم, وضعیت فعلی, وظایف, پروژه (+4 more)
### Community 71 - "Community 71"
Cohesion: 0.08
Nodes (14): Claim, ClaimItem, DebtRow, InsuranceOption, KIND_LABEL, STATUS_FILTERS, STATUS_META, EMPTY (+6 more)
Cohesion: 0.07
Nodes (21): Contract, InsuranceOption, KIND_LABEL, Claim, ClaimItem, DebtRow, InsuranceOption, KIND_LABEL (+13 more)
### Community 72 - "Community 72"
Cohesion: 0.09
@@ -1003,8 +1027,8 @@ Cohesion: 0.16
Nodes (5): DoctorSecretary, Clinic, Doctor, self, User
### Community 77 - "Community 77"
Cohesion: 0.20
Nodes (8): AdminUser, ChangeRoleModal(), getPrimaryRole(), HUES_LIST, ROLE_META, ROLE_TABS, RoleBadge(), UserStats
Cohesion: 0.24
Nodes (5): RepresentationActionController, JsonResponse, Representation, Request, User
### Community 78 - "Community 78"
Cohesion: 0.12
@@ -1032,7 +1056,7 @@ Nodes (30): devDependencies, @babel/core, @babel/preset-env, @babel/preset-react
### Community 86 - "Community 86"
Cohesion: 0.07
Nodes (13): AppointmentExpiryServiceTest, LowTierFixesTest, SendCodeMobileRateLimitTest, ClaimsListPaginationTest, ServiceItemStaffOwnershipTest, KernelBrowser, CommentPaginationTest, SecretaryListNPlusOneTest (+5 more)
Nodes (13): AppointmentExpiryServiceTest, LowTierFixesTest, SendCodeMobileRateLimitTest, ClaimsListPaginationTest, ServiceItemStaffOwnershipTest, KernelBrowser, CommentPaginationTest, SettlementListPaginationTest (+5 more)
### Community 87 - "Community 87"
Cohesion: 0.10
@@ -1099,8 +1123,8 @@ Cohesion: 0.10
Nodes (20): Bulk import / export, DELETE `/api/v1/admin/tag/{id}`, Errors, Errors, Errors, Errors, GET `/api/v1/admin/tags`, GET `/api/v1/tags` (+12 more)
### Community 103 - "Community 103"
Cohesion: 0.33
Nodes (4): BlogController, JsonResponse, Request, User
Cohesion: 0.11
Nodes (18): `AdminApiController::paymentDetail` — الان فقط GET, `MellatGateway.php` — الگوی موجود REST/SOAP (پس از کار sandbox), `PaymentGatewayInterface.php`, `PaymentManager.php` — الگوی log و transaction, برگشت/استرداد وجه ملت از پنل ادمین (bpReversalRequest / bpRefundRequest), زمینه, فایل‌های مرتبط, نکات مهم (+10 more)
### Community 104 - "Community 104"
Cohesion: 0.18
@@ -1119,8 +1143,8 @@ Cohesion: 0.32
Nodes (6): AppointmentController, Appointment, Doctor, JsonResponse, Request, User
### Community 108 - "Community 108"
Cohesion: 0.18
Nodes (7): BaseController, CategoryController, SmsMessageController, JsonResponse, JsonResponse, JsonResponse, Request
Cohesion: 0.13
Nodes (10): BaseController, CategoryController, CategoryImportController, SmsMessageController, JsonResponse, JsonResponse, Request, JsonResponse (+2 more)
### Community 109 - "Community 109"
Cohesion: 0.29
@@ -1175,8 +1199,8 @@ Cohesion: 0.26
Nodes (4): LocationController, City, JsonResponse, Request
### Community 122 - "Community 122"
Cohesion: 0.06
Nodes (27): DashboardController, HealthController, MyAppointmentsController, RepresentationController, SubscriptionController, EntityManagerInterface, ClinicInvitationService, Doctor (+19 more)
Cohesion: 0.26
Nodes (4): SubscriptionController, JsonResponse, Request, User
### Community 123 - "Community 123"
Cohesion: 0.12
@@ -1379,8 +1403,8 @@ Cohesion: 0.35
Nodes (5): PatientController, JsonResponse, PatientSession, Request, User
### Community 176 - "Community 176"
Cohesion: 0.33
Nodes (5): SecretaryController, DoctorSecretary, JsonResponse, Request, User
Cohesion: 0.09
Nodes (13): SecretaryController, SmsLogRepository, OtpService, PaymentManager, SmsLog, Payment, PaymentInitResult, PaymentRefundResult (+5 more)
### Community 177 - "Community 177"
Cohesion: 0.36
@@ -1471,12 +1495,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/secretaries`, 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 +1515,8 @@ Cohesion: 0.07
Nodes (20): Command, CancelExpiredAppointmentsCommand, CreateAdminCommand, PruneLogsCommand, SeedCategoriesCommand, SeedSmsMessageTemplatesCommand, SmsMessageTemplateRepository, SmsTextResolver (+12 more)
### Community 206 - "Community 206"
Cohesion: 0.26
Nodes (3): MellatGateway, PaymentInitResult, PaymentVerifyResult
Cohesion: 0.21
Nodes (5): MellatGateway, SoapClient, PaymentInitResult, PaymentRefundResult, PaymentVerifyResult
### Community 207 - "Community 207"
Cohesion: 0.15
@@ -1547,7 +1571,7 @@ Cohesion: 0.23
Nodes (4): PatientSessionRepository, ManagerRegistry, PatientRecord, PatientSession
### Community 224 - "Community 224"
Cohesion: 0.24
Cohesion: 0.23
Nodes (5): PaymentRepository, Appointment, ManagerRegistry, Payment, User
### Community 225 - "Community 225"
@@ -1559,8 +1583,8 @@ Cohesion: 0.15
Nodes (12): Callback Mellat, frontend_address, Idempotency, درگاه‌های واقعی پروژه (از کد Drupal), شرط ایجاد پرداخت, قیمت از Config (نه Request), مجوزها, نکات پیاده‌سازی — تسک ۱۵: ماژول پرداخت (+4 more)
### Community 227 - "Community 227"
Cohesion: 0.36
Nodes (4): SiteConfigController, JsonResponse, Request, User
Cohesion: 0.17
Nodes (7): HealthController, SiteConfigController, EntityManagerInterface, JsonResponse, Request, User, JsonResponse
### Community 228 - "Community 228"
Cohesion: 0.04
@@ -1623,7 +1647,7 @@ Cohesion: 0.26
Nodes (4): PatientRecordRepository, ManagerRegistry, PatientRecord, User
### Community 244 - "Community 244"
Cohesion: 0.32
Cohesion: 0.29
Nodes (3): SubscriptionService, ClinicSubscription, Payment
### Community 245 - "Community 245"
@@ -1651,16 +1675,16 @@ Cohesion: 0.18
Nodes (11): Appointment Management, Error Responses, GET `/api/v1/admin/appointments`, GET `/api/v1/admin/appointments/today-stats`, POST `/api/v1/admin/appointment`, Query Parameters, Query Parameters, Request Body (+3 more)
### Community 251 - "Community 251"
Cohesion: 0.21
Nodes (4): SmsLogRepository, OtpService, SmsLog, ManagerRegistry
Cohesion: 0.11
Nodes (18): `GatewayFactory.php``resolve()` در حالت test_mode همیشه Mock می‌دهد, `MellatGateway.php` (خطوط کلیدی), `SecurityHeadersSubscriber.php` (خط ۴۴), اطلاعات sandbox (banktest.ir), تست (e2e روی ddev), زمینه, فایل‌های مرتبط, فعال‌سازی درگاه sandbox بانک ملت (banktest.ir) — موقت (+10 more)
### Community 252 - "Community 252"
Cohesion: 0.45
Nodes (4): NotificationMobileController, JsonResponse, Request, User
### Community 253 - "Community 253"
Cohesion: 0.36
Nodes (3): DoctorServiceController, JsonResponse, Request
Cohesion: 0.11
Nodes (17): CSS (`assets/admin/styles.css`), Topbar breakpoint (ناهماهنگ با CSS), ریسپانسیو کردن پنل ادمین برای موبایل (iPhone 8 / ۳۷۵px), زمینه, فایل‌های مرتبط, مشکل / هدف, نمونهٔ گرید inline (تکرارشده در ۲۰ فایل), نکات مهم (+9 more)
### Community 254 - "Community 254"
Cohesion: 0.18
@@ -1739,7 +1763,7 @@ Cohesion: 0.18
Nodes (10): Endpoint های موجود که تغییر می‌کنند, GET /api/v1/admin/dashboard/charts?from=UNIX&to=UNIX, GET /api/v1/dashboard/clinic, GET /api/v1/dashboard/doctor, تسک ۱۶: داشبورد هوشمند — چارت + فیلتر زمانی, توضیح, زمان تخمینی, فیلتر بازه زمانی (+2 more)
### Community 274 - "Community 274"
Cohesion: 0.20
Cohesion: 0.21
Nodes (5): Authentication, ClinicPro — API Documentation Index, Error Code Reference, Modules, Standard Response Envelope
### Community 275 - "Community 275"
@@ -1856,7 +1880,7 @@ Nodes (16): آماده‌سازی پروژه ClinicPro برای دیپلوی ر
### Community 304 - "Community 304"
Cohesion: 0.22
Nodes (9): 30. 🟢 `GET` get 🆕, 33. 🔵 `POST` image_clinic, 43. 🟢 `GET` get, 6. کلینیک (Clinic), هدرهای اضافی, هدرهای اضافی, پاسخ‌ها, پاسخ‌ها (+1 more)
Nodes (9): 29. 🟢 `GET` clinic list 🆕, 30. 🟢 `GET` get 🆕, 36. 🟢 `GET` get my rate, 6. کلینیک (Clinic), هدرهای اضافی, پارامترهای Query, پاسخ‌ها, پاسخ‌ها (+1 more)
### Community 306 - "Community 306"
Cohesion: 0.07
@@ -1883,8 +1907,8 @@ Cohesion: 0.22
Nodes (8): [HIGH] BUG-3 — ساخت نماینده با شماره موبایلِ نامعتبر (بدون اعتبارسنجی فرمت), [MEDIUM] BUG-1 — ۵۰۰ روی ساخت بلاگ با تایپ اشتباهِ body ✅ رفع شد, [MEDIUM] BUG-2 — کد ملی نامعتبر بدون اعتبارسنجی سمت سرور ذخیره می‌شود, باگ‌ها, توصیه‌ها, خلاصه, مواردی که تست شدند و **سالم** بودند (شواهد مثبت), گزارش باگ — ممیزی ۱۴۰۵/۰۳/۳۰ (2026-06-20)
### Community 312 - "Community 312"
Cohesion: 0.36
Nodes (3): ClinicSubscriptionRepository, ClinicSubscription, ManagerRegistry
Cohesion: 0.27
Nodes (4): ClinicSubscriptionRepository, ClinicSubscription, ManagerRegistry, Payment
### Community 313 - "Community 313"
Cohesion: 0.36
@@ -2015,12 +2039,12 @@ Cohesion: 0.43
Nodes (3): SmsWalletRepository, ManagerRegistry, SmsWallet
### Community 351 - "Community 351"
Cohesion: 0.22
Nodes (4): MockGateway, PaymentGatewayInterface, PaymentInitResult, PaymentVerifyResult
Cohesion: 0.18
Nodes (5): MockGateway, PaymentGatewayInterface, PaymentInitResult, PaymentRefundResult, PaymentVerifyResult
### Community 352 - "Community 352"
Cohesion: 0.27
Nodes (3): SepGateway, PaymentInitResult, PaymentVerifyResult
Cohesion: 0.21
Nodes (4): SepGateway, PaymentInitResult, PaymentRefundResult, PaymentVerifyResult
### Community 354 - "Community 354"
Cohesion: 0.36
@@ -2095,8 +2119,8 @@ Cohesion: 0.15
Nodes (6): UniqueConstraintsTest, FinancialBreakdown, FinancialBreakdownRepository, FinancialBreakdownIntegrityTest, ManagerRegistry, Payment
### Community 372 - "Community 372"
Cohesion: 0.50
Nodes (4): Errors, PATCH `/api/v1/insurance/{id}`, Request Body, Response `200`
Cohesion: 0.11
Nodes (17): `PaymentManager::handleAppointmentConfirmation` (فقط پیامک بیمار), الگوی تگ‌ها (SmsLog), الگوی قالب‌ها (SmsMessageTemplate::DEFAULTS), زمینه, فایل‌های مرتبط, مشکل / هدف, مقادیر در دسترس, نکات مهم (+9 more)
### Community 374 - "Community 374"
Cohesion: 0.29
@@ -2191,24 +2215,28 @@ Cohesion: 0.21
Nodes (6): ClaimAmountBoundsTest, ClaimsListNPlusOneTest, ClaimItem, Claim, Doctor, User
### Community 398 - "Community 398"
Cohesion: 0.29
Nodes (4): initiate(), verify(), PaymentInitResult, PaymentVerifyResult
Cohesion: 0.22
Nodes (7): initiate(), refund(), reverse(), verify(), PaymentInitResult, PaymentRefundResult, PaymentVerifyResult
### Community 399 - "Community 399"
Cohesion: 0.23
Nodes (5): AbstractMigration, Schema, Version20260609130407, Schema, Version20260614182950
### Community 405 - "Community 405"
Cohesion: 0.48
Nodes (3): SmsSettingsRepository, SmsSettings, ManagerRegistry
Cohesion: 0.11
Nodes (17): بازطراحی معماری پرداخت — سرویس‌محور، امن، توسعه‌پذیر (Backend), تست دستی (ddev، در حالت `payment_test_mode=1`), خروجی نهایی (طبق spec — در گزارش اجرا ارائه شود), زمینه, فایل‌های مرتبط, مشکل / هدف, نکات مهم, وضعیت فعلی (+9 more)
### Community 407 - "Community 407"
Cohesion: 0.18
Nodes (4): RanginehProvider, SmsService, SendSmsMessage, SmsProviderInterface
Cohesion: 0.36
Nodes (3): SmsService, SendSmsMessage, SmsProviderInterface
### Community 418 - "Community 418"
Cohesion: 0.17
Nodes (11): دیپلوی ClinicPro روی Coolify (Docker Compose), رفع اشکال, مراحل دیپلوی, معماری دیپلوی, نکات عملیاتی, چند دامنه فرانت‌اند (مهم), ۱. ساخت Resource در Coolify, ۲. اختصاص دامنه (+3 more)
### Community 421 - "Community 421"
Cohesion: 0.23
Nodes (5): AbstractMigration, Schema, Version20260609132009, Schema, Version20260610140853
### Community 432 - "Community 432"
Cohesion: 0.12
Nodes (16): backend (آماده — فقط annotation/doc ناقص), افزودن فیلد «تاریخ شروع فعالیت» (سال تجربه) در پنل ادمین با تقویم شمسی, زمینه, فایل‌های مرتبط, فرم ساخت پزشک — `DoctorFormPage.tsx` (خط ~282), فرم ویرایش پزشک — `DoctorDetailPage.tsx` (وضعیت فعلی، بدون فیلد تاریخ), مشکل / هدف, نکات مهم (+8 more)
### Community 439 - "Community 439"
Cohesion: 0.40
@@ -2219,8 +2247,8 @@ 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.07
Nodes (38): FreeVisitPrice(), Pricing, cn(), formatDate(), formatDateTime(), formatRial(), iranMobileOptionalSchema, iranMobileSchema (+30 more)
Cohesion: 0.06
Nodes (45): FreeVisitPrice(), Pricing, cn(), formatDate(), formatDateTime(), formatRial(), iranMobileOptionalSchema, iranMobileSchema (+37 more)
### Community 456 - "Community 456"
Cohesion: 0.40
@@ -2311,8 +2339,8 @@ Cohesion: 0.40
Nodes (5): Errors, Notes, POST `/api/v1/notification-mobile/request-otp`, Request Body, Response `200`
### Community 482 - "Community 482"
Cohesion: 0.24
Nodes (4): RepositoryClassMappingTest, KernelTestCase, LoggerInterface, DbLoggerTest
Cohesion: 0.38
Nodes (3): RepositoryClassMappingTest, KernelTestCase, DbLoggerTest
### Community 483 - "Community 483"
Cohesion: 0.40
@@ -2335,8 +2363,8 @@ Cohesion: 0.40
Nodes (5): Admin Endpoints, GET /api/v1/admin/sms/settings/review, GET /api/v1/admin/sms/wallet-report, POST /api/v1/admin/sms/settings/{id}/approve, POST /api/v1/admin/sms/settings/{id}/reject
### Community 491 - "Community 491"
Cohesion: 0.43
Nodes (3): CategoryImportController, JsonResponse, Request
Cohesion: 0.12
Nodes (15): `Modal.tsx` (بدون Portal), `PersianCalendar.tsx` (buttonها بدون `type`) — نمونه‌ها, باگ ۱ — علت, باگ ۲ — علت, رفع دو باگ Modal و تقویم شمسی در پنل ادمین, زمینه, فایل‌های مرتبط, مشکل / هدف (+7 more)
### Community 493 - "Community 493"
Cohesion: 0.20
@@ -2486,6 +2514,10 @@ Nodes (4): Errors, POST `/api/v1/user/verify-code`, Request Body, Response `200`
Cohesion: 0.50
Nodes (4): Errors, GET `/api/v1/representation/{uuid}`, Path Parameters, Response `200`
### Community 536 - "Community 536"
Cohesion: 0.12
Nodes (15): `MellatGateway.php` — ثابت‌ها و مسیر prod فعلی (POST خام), آنچه نباید تغییر کند, بردن درگاه ملت روی محیط واقعی (production) با SOAP native, زمینه, فایل‌های مرتبط, نکات مهم (چک‌لیست عملیاتی prod), وضعیت فعلی, وظایف (+7 more)
### Community 537 - "Community 537"
Cohesion: 0.40
Nodes (3): Props, StatTone, TONE
@@ -2654,10 +2686,6 @@ Nodes (5): Errors, PATCH `/api/v1/clinic-pro/doctor-address/{id}`, Path Paramete
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.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 599 - "Community 599"
Cohesion: 0.67
Nodes (3): Errors, POST `/api/v1/sms/template/{uuid}/submit`, Response `200`
@@ -2687,8 +2715,8 @@ Cohesion: 0.25
Nodes (8): ثبت‌نام دکتر — از طریق نماینده, ثبت‌نام دکتر — از طریق کلینیک, ثبت‌نام دکتر — مستقل, ۱. معرفی محصول, ۱.۱ نقش‌های سیستم, ۱.۲ فلوهای عملیاتی اصلی, ۱.۳ پلن‌های اشتراک, ۱.۴ سیستم پیامک
### Community 607 - "Community 607"
Cohesion: 0.39
Nodes (3): ClinicStaffRepository, ClinicStaff, ManagerRegistry
Cohesion: 0.35
Nodes (5): RepresentationController, JsonResponse, Representation, Request, User
### Community 612 - "Community 612"
Cohesion: 0.67
@@ -2738,25 +2766,33 @@ Nodes (6): GET /api/v1/sms/balance — موجودی حساب پیامک, POST /a
Cohesion: 0.50
Nodes (4): Errors, POST `/api/v1/clinic-pro/doctor-address`, Request Body, Response `201`
### Community 641 - "Community 641"
Cohesion: 0.15
Nodes (11): emptyFeatures(), FEATURE_KEYS, FEATURE_LABELS, PeriodForm, periodSchema, PLAN_DISPLAY, PlanForm, planSchema (+3 more)
### Community 646 - "Community 646"
Cohesion: 0.40
Nodes (5): 35. 🟡 `PATCH` patch, Request Body, مثال Request, هدرهای اضافی, پاسخ‌ها
### Community 647 - "Community 647"
Cohesion: 0.14
Nodes (13): اصلاح فیلتر شهر/استان در لیست عمومی پزشکان (`GET /api/v1/doctors`), زمینه, فایل‌های مرتبط, مشکل / هدف, نکات مهم, وضعیت فعلی, وظایف, پروژه (+5 more)
### Community 648 - "Community 648"
Cohesion: 0.40
Nodes (5): 41. 🟡 `PATCH` patch, Request Body, مثال Request, هدرهای اضافی, پاسخ‌ها
### Community 649 - "Community 649"
Cohesion: 0.67
Nodes (3): 29. 🟢 `GET` clinic list 🆕, پارامترهای Query, پاسخ‌ها
Cohesion: 0.14
Nodes (13): زمینه, فایل‌های مرتبط, مشکل / هدف, نکات مهم, وضعیت فعلی (flow جدا در SmsWallet — باید حذف شود), وظایف, پروژه, یکسان‌سازی کامل پرداخت به یک Flow واحد + entry ریدایرکت خالص (Backend + Admin) (+5 more)
### Community 650 - "Community 650"
Cohesion: 0.67
Nodes (3): 34. 🔵 `POST` image logo, هدرهای اضافی, پاسخ‌ها
### Community 651 - "Community 651"
Cohesion: 0.67
Nodes (3): 36. 🟢 `GET` get my rate, هدرهای اضافی, پاسخ‌ها
Cohesion: 0.14
Nodes (13): زمینه, فایل‌های مرتبط, قیمت هر پیامک در تنظیمات + رفع تنظیمات ارسال پیامک کیف‌پول, مشکل / هدف, نکات مهم, وضعیت فعلی, وظایف, پروژه (+5 more)
### Community 652 - "Community 652"
Cohesion: 0.50
@@ -2766,21 +2802,29 @@ Nodes (4): Errors, Path Parameters, POST `/api/v1/clinic-pro/doctor-address/from
Cohesion: 0.67
Nodes (3): 42. 🔴 `DELETE` delete, هدرهای اضافی, پاسخ‌ها
### Community 654 - "Community 654"
Cohesion: 0.35
Nodes (6): DashboardController, Clinic, DoctorSecretary, JsonResponse, Request, User
### Community 655 - "Community 655"
Cohesion: 0.38
Nodes (5): MyAppointmentsController, Doctor, JsonResponse, Request, User
### Community 656 - "Community 656"
Cohesion: 0.40
Nodes (5): ۲.۸ تنظیمات نوبت (Appointment Settings), ۲.۸.۱ برنامه هفتگی (Weekly Schedule), ۲.۸.۲ تعطیلات (Holidays), ۲.۸.۳ لغو تعطیل (Date Override), ۲.۸.۴ الگوریتم محاسبه اسلات‌های خالی
### Community 657 - "Community 657"
Cohesion: 0.50
Nodes (4): GET `/api/v1/admin/payments`, Payment Management, Query Parameters, Response `200`
Cohesion: 0.20
Nodes (10): Errors (payment refund/reverse/detail), GET `/api/v1/admin/payments`, GET `/api/v1/admin/payments/{uuid}`, Payment Management, POST `/api/v1/admin/payments/{uuid}/refund`, POST `/api/v1/admin/payments/{uuid}/reverse`, Query Parameters, Query Parameters (تکمیل) (+2 more)
### Community 658 - "Community 658"
Cohesion: 0.67
Nodes (3): GET `/api/v1/clinic-pro/doctor-addresses/{doctorId}`, Path Parameters, Response `200`
### Community 659 - "Community 659"
Cohesion: 0.50
Nodes (4): GET `/api/v1/admin/secretaries`, Query Parameters, Response `200`, Secretary Management
Cohesion: 0.31
Nodes (4): ClinicInvitationService, Clinic, ClinicDoctorInvitation, User
### Community 661 - "Community 661"
Cohesion: 0.40
@@ -2790,6 +2834,10 @@ Nodes (5): 37. 🔵 `POST` post, Request Body, مثال Request, هدرهای ا
Cohesion: 0.29
Nodes (7): Application Logs, DELETE `/api/v1/admin/logs`, GET `/api/v1/admin/logs`, Log Retention, Query Parameters, Response `200`, Response `200`
### Community 665 - "Community 665"
Cohesion: 0.38
Nodes (5): Rate, RateRepository, Doctor, ManagerRegistry, User
### Community 666 - "Community 666"
Cohesion: 0.50
Nodes (4): GET /api/v1/appointment-settings/slots — دریافت اسلات‌های خالی, POST /api/v1/appointment-settings/holidays — ثبت تعطیلی (فقط ادمین), POST /api/v1/appointment-settings/overrides — ثبت Override توسط دکتر, Task-09: API تنظیمات نوبت
@@ -2806,6 +2854,10 @@ Nodes (4): ۲.۱۳ نظرات، لایک و امتیازدهی, ۲.۱۳.۱ نظ
Cohesion: 0.50
Nodes (4): GET `/api/v1/admin/settlements`, Query Parameters, Response `200`, Settlement Management
### Community 674 - "Community 674"
Cohesion: 0.47
Nodes (3): CommissionService, Payment, Representation
### Community 675 - "Community 675"
Cohesion: 0.50
Nodes (4): 39. 🟡 `PATCH` Comment confirmation, مثال Request, هدرهای اضافی, پاسخ‌ها
@@ -2814,25 +2866,57 @@ Nodes (4): 39. 🟡 `PATCH` Comment confirmation, مثال Request, هدرهای
Cohesion: 0.50
Nodes (4): 40. 🔵 `POST` post, مثال Request, هدرهای اضافی, پاسخ‌ها
### Community 677 - "Community 677"
Cohesion: 0.43
Nodes (5): BeforeInstallPromptEvent, usePwaInstall(), PwaInstallBanner(), detectIOS(), PwaLoginCard()
### Community 678 - "Community 678"
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 681 - "Community 681"
Cohesion: 0.48
Nodes (3): DoctorInsuranceRepository, DoctorInsurance, ManagerRegistry
### Community 684 - "Community 684"
Cohesion: 0.53
Nodes (3): PaymentLog, PaymentLogRepository, ManagerRegistry
### Community 686 - "Community 686"
Cohesion: 0.40
Nodes (5): GET `/api/v1/admin/comments`, GET `/api/v1/admin/rates`, Query Parameters, Query Parameters, Rating & Comment Management
### Community 687 - "Community 687"
Cohesion: 0.50
Nodes (4): Errors, PATCH `/api/v1/admin/insurance/{id}`, Path Parameters, Response `200`
### Community 689 - "Community 689"
Cohesion: 0.67
Nodes (3): 33. 🔵 `POST` image_clinic, هدرهای اضافی, پاسخ‌ها
### Community 690 - "Community 690"
Cohesion: 0.67
Nodes (3): 43. 🟢 `GET` get, هدرهای اضافی, پاسخ‌ها
## Knowledge Gaps
- **3656 isolated node(s):** `ALLOWED_ROLES`, `Pricing`, `TenantInsurance`, `CoverageRow`, `Draft` (+3651 more)
- **3812 isolated node(s):** `ALLOWED_ROLES`, `Pricing`, `TenantInsurance`, `CoverageRow`, `Draft` (+3807 more)
These have ≤1 connection - possible missing edges or undocumented components.
- **129 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
- **133 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 139`, `Community 14`, `Community 15`, `Community 20`, `Community 22`, `Community 26`, `Community 164`, `Community 295`, `Community 169`, `Community 300`, `Community 175`, `Community 176`, `Community 177`, `Community 59`, `Community 63`, `Community 64`, `Community 75`, `Community 227`, `Community 230`, `Community 103`, `Community 104`, `Community 107`, `Community 491`, `Community 109`, `Community 121`, `Community 122`, `Community 252`, `Community 253`?**
_High betweenness centrality (0.032) - this node is a cross-community bridge._
- **Why does `BaseController` connect `Community 108` to `Community 4`, `Community 6`, `Community 138`, `Community 139`, `Community 14`, `Community 654`, `Community 655`, `Community 15`, `Community 20`, `Community 22`, `Community 26`, `Community 164`, `Community 295`, `Community 169`, `Community 300`, `Community 175`, `Community 176`, `Community 177`, `Community 58`, `Community 59`, `Community 63`, `Community 64`, `Community 75`, `Community 77`, `Community 607`, `Community 227`, `Community 230`, `Community 104`, `Community 107`, `Community 109`, `Community 121`, `Community 122`, `Community 252`?**
_High betweenness centrality (0.044) - this node is a cross-community bridge._
- **Why does `AppointmentRepository` connect `Community 119` to `Community 53`?**
_High betweenness centrality (0.019) - this node is a cross-community bridge._
- **Why does `Version20260614181657` connect `Community 431` to `Community 421`?**
_High betweenness centrality (0.016) - this node is a cross-community bridge._
- **Why does `Version20260614181657` connect `Community 431` to `Community 399`?**
_High betweenness centrality (0.015) - this node is a cross-community bridge._
- **What connects `ALLOWED_ROLES`, `Pricing`, `TenantInsurance` to the rest of the system?**
_3656 weakly-connected nodes found - possible documentation gaps or missing edges._
_3812 weakly-connected nodes found - possible documentation gaps or missing edges._
- **Should `Community 0` be split into smaller, more focused modules?**
_Cohesion score 0.05004389815627744 - nodes in this community are weakly interconnected._
_Cohesion score 0.049678550555230856 - 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.0659536541889483 - nodes in this community are weakly interconnected._
_Cohesion score 0.10507246376811594 - nodes in this community are weakly interconnected._
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "users_hamed_pj_my_pj_clinic_pro_clinicpro_src_sms_entity_smslog_php", "label": "SmsLog.php", "file_type": "code", "source_file": "src/Sms/Entity/SmsLog.php", "source_location": "L1"}, {"id": "entity_smslog_smslog", "label": "SmsLog", "file_type": "code", "source_file": "src/Sms/Entity/SmsLog.php", "source_location": "L9"}, {"id": "entity_smslog_smslog_construct", "label": ".__construct()", "file_type": "code", "source_file": "src/Sms/Entity/SmsLog.php", "source_location": "L67"}, {"id": "entity_smslog_smslog_settemplateuuid", "label": ".setTemplateUuid()", "file_type": "code", "source_file": "src/Sms/Entity/SmsLog.php", "source_location": "L78"}, {"id": "self", "label": "self", "file_type": "code", "source_file": "src/Sms/Entity/SmsLog.php", "source_location": "L78"}, {"id": "entity_smslog_smslog_gettag", "label": ".getTag()", "file_type": "code", "source_file": "src/Sms/Entity/SmsLog.php", "source_location": "L79"}, {"id": "entity_smslog_smslog_settag", "label": ".setTag()", "file_type": "code", "source_file": "src/Sms/Entity/SmsLog.php", "source_location": "L80"}, {"id": "entity_smslog_smslog_toarray", "label": ".toArray()", "file_type": "code", "source_file": "src/Sms/Entity/SmsLog.php", "source_location": "L82"}], "edges": [{"source": "users_hamed_pj_my_pj_clinic_pro_clinicpro_src_sms_entity_smslog_php", "target": "mapping", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "src/Sms/Entity/SmsLog.php", "source_location": "L5", "weight": 1.0}, {"source": "users_hamed_pj_my_pj_clinic_pro_clinicpro_src_sms_entity_smslog_php", "target": "smslogrepository", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "src/Sms/Entity/SmsLog.php", "source_location": "L6", "weight": 1.0}, {"source": "users_hamed_pj_my_pj_clinic_pro_clinicpro_src_sms_entity_smslog_php", "target": "uuid", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "src/Sms/Entity/SmsLog.php", "source_location": "L7", "weight": 1.0}, {"source": "users_hamed_pj_my_pj_clinic_pro_clinicpro_src_sms_entity_smslog_php", "target": "entity_smslog_smslog", "relation": "contains", "confidence": "EXTRACTED", "source_file": "src/Sms/Entity/SmsLog.php", "source_location": "L9", "weight": 1.0}, {"source": "entity_smslog_smslog", "target": "entity_smslog_smslog_construct", "relation": "method", "confidence": "EXTRACTED", "source_file": "src/Sms/Entity/SmsLog.php", "source_location": "L67", "weight": 1.0}, {"source": "entity_smslog_smslog", "target": "entity_smslog_smslog_settemplateuuid", "relation": "method", "confidence": "EXTRACTED", "source_file": "src/Sms/Entity/SmsLog.php", "source_location": "L78", "weight": 1.0}, {"source": "entity_smslog_smslog_settemplateuuid", "target": "self", "relation": "references", "confidence": "EXTRACTED", "source_file": "src/Sms/Entity/SmsLog.php", "source_location": "L78", "weight": 1.0, "context": "return_type"}, {"source": "entity_smslog_smslog", "target": "entity_smslog_smslog_gettag", "relation": "method", "confidence": "EXTRACTED", "source_file": "src/Sms/Entity/SmsLog.php", "source_location": "L79", "weight": 1.0}, {"source": "entity_smslog_smslog", "target": "entity_smslog_smslog_settag", "relation": "method", "confidence": "EXTRACTED", "source_file": "src/Sms/Entity/SmsLog.php", "source_location": "L80", "weight": 1.0}, {"source": "entity_smslog_smslog_settag", "target": "self", "relation": "references", "confidence": "EXTRACTED", "source_file": "src/Sms/Entity/SmsLog.php", "source_location": "L80", "weight": 1.0, "context": "return_type"}, {"source": "entity_smslog_smslog", "target": "entity_smslog_smslog_toarray", "relation": "method", "confidence": "EXTRACTED", "source_file": "src/Sms/Entity/SmsLog.php", "source_location": "L82", "weight": 1.0}], "raw_calls": [{"caller_nid": "entity_smslog_smslog_construct", "callee": "toRfc4122", "is_member_call": true, "source_file": "/Users/hamed/pj/my_pj/clinic_pro/clinicpro/src/Sms/Entity/SmsLog.php", "source_location": "L69", "receiver": null}, {"caller_nid": "entity_smslog_smslog_construct", "callee": "Uuid", "is_member_call": false, "source_file": "/Users/hamed/pj/my_pj/clinic_pro/clinicpro/src/Sms/Entity/SmsLog.php", "source_location": "L69", "receiver": null}, {"caller_nid": "entity_smslog_smslog_construct", "callee": "time", "is_member_call": false, "source_file": "/Users/hamed/pj/my_pj/clinic_pro/clinicpro/src/Sms/Entity/SmsLog.php", "source_location": "L75", "receiver": null}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_hamed_pj_my_pj_clinic_pro_clinicpro_src_payment_entity_paymentlog_php", "label": "PaymentLog.php", "file_type": "code", "source_file": "src/Payment/Entity/PaymentLog.php", "source_location": "L1"}, {"id": "entity_paymentlog_paymentlog", "label": "PaymentLog", "file_type": "code", "source_file": "src/Payment/Entity/PaymentLog.php", "source_location": "L12"}, {"id": "entity_paymentlog_paymentlog_construct", "label": ".__construct()", "file_type": "code", "source_file": "src/Payment/Entity/PaymentLog.php", "source_location": "L52"}, {"id": "entity_paymentlog_paymentlog_getid", "label": ".getId()", "file_type": "code", "source_file": "src/Payment/Entity/PaymentLog.php", "source_location": "L71"}, {"id": "entity_paymentlog_paymentlog_getpaymentid", "label": ".getPaymentId()", "file_type": "code", "source_file": "src/Payment/Entity/PaymentLog.php", "source_location": "L72"}, {"id": "entity_paymentlog_paymentlog_getaction", "label": ".getAction()", "file_type": "code", "source_file": "src/Payment/Entity/PaymentLog.php", "source_location": "L73"}, {"id": "entity_paymentlog_paymentlog_getresult", "label": ".getResult()", "file_type": "code", "source_file": "src/Payment/Entity/PaymentLog.php", "source_location": "L74"}], "edges": [{"source": "users_hamed_pj_my_pj_clinic_pro_clinicpro_src_payment_entity_paymentlog_php", "target": "paymentlogrepository", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "src/Payment/Entity/PaymentLog.php", "source_location": "L5", "weight": 1.0}, {"source": "users_hamed_pj_my_pj_clinic_pro_clinicpro_src_payment_entity_paymentlog_php", "target": "mapping", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "src/Payment/Entity/PaymentLog.php", "source_location": "L6", "weight": 1.0}, {"source": "users_hamed_pj_my_pj_clinic_pro_clinicpro_src_payment_entity_paymentlog_php", "target": "entity_paymentlog_paymentlog", "relation": "contains", "confidence": "EXTRACTED", "source_file": "src/Payment/Entity/PaymentLog.php", "source_location": "L12", "weight": 1.0}, {"source": "entity_paymentlog_paymentlog", "target": "entity_paymentlog_paymentlog_construct", "relation": "method", "confidence": "EXTRACTED", "source_file": "src/Payment/Entity/PaymentLog.php", "source_location": "L52", "weight": 1.0}, {"source": "entity_paymentlog_paymentlog", "target": "entity_paymentlog_paymentlog_getid", "relation": "method", "confidence": "EXTRACTED", "source_file": "src/Payment/Entity/PaymentLog.php", "source_location": "L71", "weight": 1.0}, {"source": "entity_paymentlog_paymentlog", "target": "entity_paymentlog_paymentlog_getpaymentid", "relation": "method", "confidence": "EXTRACTED", "source_file": "src/Payment/Entity/PaymentLog.php", "source_location": "L72", "weight": 1.0}, {"source": "entity_paymentlog_paymentlog", "target": "entity_paymentlog_paymentlog_getaction", "relation": "method", "confidence": "EXTRACTED", "source_file": "src/Payment/Entity/PaymentLog.php", "source_location": "L73", "weight": 1.0}, {"source": "entity_paymentlog_paymentlog", "target": "entity_paymentlog_paymentlog_getresult", "relation": "method", "confidence": "EXTRACTED", "source_file": "src/Payment/Entity/PaymentLog.php", "source_location": "L74", "weight": 1.0}], "raw_calls": [{"caller_nid": "entity_paymentlog_paymentlog_construct", "callee": "time", "is_member_call": false, "source_file": "/Users/hamed/pj/my_pj/clinic_pro/clinicpro/src/Payment/Entity/PaymentLog.php", "source_location": "L68", "receiver": null}]}
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
@@ -0,0 +1 @@
{"nodes": [{"id": "users_hamed_pj_my_pj_clinic_pro_clinicpro_src_payment_gateway_paymentrefundresult_php", "label": "PaymentRefundResult.php", "file_type": "code", "source_file": "src/Payment/Gateway/PaymentRefundResult.php", "source_location": "L1"}, {"id": "gateway_paymentrefundresult_paymentrefundresult", "label": "PaymentRefundResult", "file_type": "code", "source_file": "src/Payment/Gateway/PaymentRefundResult.php", "source_location": "L5"}, {"id": "gateway_paymentrefundresult_paymentrefundresult_construct", "label": ".__construct()", "file_type": "code", "source_file": "src/Payment/Gateway/PaymentRefundResult.php", "source_location": "L7"}], "edges": [{"source": "users_hamed_pj_my_pj_clinic_pro_clinicpro_src_payment_gateway_paymentrefundresult_php", "target": "gateway_paymentrefundresult_paymentrefundresult", "relation": "contains", "confidence": "EXTRACTED", "source_file": "src/Payment/Gateway/PaymentRefundResult.php", "source_location": "L5", "weight": 1.0}, {"source": "gateway_paymentrefundresult_paymentrefundresult", "target": "gateway_paymentrefundresult_paymentrefundresult_construct", "relation": "method", "confidence": "EXTRACTED", "source_file": "src/Payment/Gateway/PaymentRefundResult.php", "source_location": "L7", "weight": 1.0}], "raw_calls": []}
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
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
@@ -0,0 +1 @@
{"nodes": [{"id": "users_hamed_pj_my_pj_clinic_pro_clinicpro_migrations_version20260702115209_php", "label": "Version20260702115209.php", "file_type": "code", "source_file": "migrations/Version20260702115209.php", "source_location": "L1"}, {"id": "migrations_version20260702115209_version20260702115209", "label": "Version20260702115209", "file_type": "code", "source_file": "migrations/Version20260702115209.php", "source_location": "L13"}, {"id": "abstractmigration", "label": "AbstractMigration", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "migrations_version20260702115209_version20260702115209_getdescription", "label": ".getDescription()", "file_type": "code", "source_file": "migrations/Version20260702115209.php", "source_location": "L15"}, {"id": "migrations_version20260702115209_version20260702115209_up", "label": ".up()", "file_type": "code", "source_file": "migrations/Version20260702115209.php", "source_location": "L20"}, {"id": "schema", "label": "Schema", "file_type": "code", "source_file": "migrations/Version20260702115209.php", "source_location": "L20"}, {"id": "migrations_version20260702115209_version20260702115209_down", "label": ".down()", "file_type": "code", "source_file": "migrations/Version20260702115209.php", "source_location": "L25"}], "edges": [{"source": "users_hamed_pj_my_pj_clinic_pro_clinicpro_migrations_version20260702115209_php", "target": "schema", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "migrations/Version20260702115209.php", "source_location": "L7", "weight": 1.0}, {"source": "users_hamed_pj_my_pj_clinic_pro_clinicpro_migrations_version20260702115209_php", "target": "abstractmigration", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "migrations/Version20260702115209.php", "source_location": "L8", "weight": 1.0}, {"source": "users_hamed_pj_my_pj_clinic_pro_clinicpro_migrations_version20260702115209_php", "target": "migrations_version20260702115209_version20260702115209", "relation": "contains", "confidence": "EXTRACTED", "source_file": "migrations/Version20260702115209.php", "source_location": "L13", "weight": 1.0}, {"source": "migrations_version20260702115209_version20260702115209", "target": "abstractmigration", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "migrations/Version20260702115209.php", "source_location": "L13", "weight": 1.0}, {"source": "migrations_version20260702115209_version20260702115209", "target": "migrations_version20260702115209_version20260702115209_getdescription", "relation": "method", "confidence": "EXTRACTED", "source_file": "migrations/Version20260702115209.php", "source_location": "L15", "weight": 1.0}, {"source": "migrations_version20260702115209_version20260702115209", "target": "migrations_version20260702115209_version20260702115209_up", "relation": "method", "confidence": "EXTRACTED", "source_file": "migrations/Version20260702115209.php", "source_location": "L20", "weight": 1.0}, {"source": "migrations_version20260702115209_version20260702115209_up", "target": "schema", "relation": "references", "confidence": "EXTRACTED", "source_file": "migrations/Version20260702115209.php", "source_location": "L20", "weight": 1.0, "context": "parameter_type"}, {"source": "migrations_version20260702115209_version20260702115209", "target": "migrations_version20260702115209_version20260702115209_down", "relation": "method", "confidence": "EXTRACTED", "source_file": "migrations/Version20260702115209.php", "source_location": "L25", "weight": 1.0}, {"source": "migrations_version20260702115209_version20260702115209_down", "target": "schema", "relation": "references", "confidence": "EXTRACTED", "source_file": "migrations/Version20260702115209.php", "source_location": "L25", "weight": 1.0, "context": "parameter_type"}], "raw_calls": [{"caller_nid": "migrations_version20260702115209_version20260702115209_up", "callee": "addSql", "is_member_call": true, "source_file": "/Users/hamed/pj/my_pj/clinic_pro/clinicpro/migrations/Version20260702115209.php", "source_location": "L22", "receiver": null}, {"caller_nid": "migrations_version20260702115209_version20260702115209_down", "callee": "addSql", "is_member_call": true, "source_file": "/Users/hamed/pj/my_pj/clinic_pro/clinicpro/migrations/Version20260702115209.php", "source_location": "L27", "receiver": null}]}
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
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
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"nodes": [{"id": "users_hamed_pj_my_pj_clinic_pro_clinicpro_src_payment_gateway_paymentinitresult_php", "label": "PaymentInitResult.php", "file_type": "code", "source_file": "src/Payment/Gateway/PaymentInitResult.php", "source_location": "L1"}, {"id": "gateway_paymentinitresult_paymentinitresult", "label": "PaymentInitResult", "file_type": "code", "source_file": "src/Payment/Gateway/PaymentInitResult.php", "source_location": "L5"}, {"id": "gateway_paymentinitresult_paymentinitresult_construct", "label": ".__construct()", "file_type": "code", "source_file": "src/Payment/Gateway/PaymentInitResult.php", "source_location": "L11"}], "edges": [{"source": "users_hamed_pj_my_pj_clinic_pro_clinicpro_src_payment_gateway_paymentinitresult_php", "target": "gateway_paymentinitresult_paymentinitresult", "relation": "contains", "confidence": "EXTRACTED", "source_file": "src/Payment/Gateway/PaymentInitResult.php", "source_location": "L5", "weight": 1.0}, {"source": "gateway_paymentinitresult_paymentinitresult", "target": "gateway_paymentinitresult_paymentinitresult_construct", "relation": "method", "confidence": "EXTRACTED", "source_file": "src/Payment/Gateway/PaymentInitResult.php", "source_location": "L11", "weight": 1.0}], "raw_calls": []}
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
@@ -0,0 +1 @@
{"nodes": [{"id": "users_hamed_pj_my_pj_clinic_pro_clinicpro_src_payment_gateway_paymentgatewayinterface_php", "label": "PaymentGatewayInterface.php", "file_type": "code", "source_file": "src/Payment/Gateway/PaymentGatewayInterface.php", "source_location": "L1"}, {"id": "gateway_paymentgatewayinterface_getname", "label": "getName()", "file_type": "code", "source_file": "src/Payment/Gateway/PaymentGatewayInterface.php", "source_location": "L7"}, {"id": "gateway_paymentgatewayinterface_isconfigured", "label": "isConfigured()", "file_type": "code", "source_file": "src/Payment/Gateway/PaymentGatewayInterface.php", "source_location": "L12"}, {"id": "gateway_paymentgatewayinterface_initiate", "label": "initiate()", "file_type": "code", "source_file": "src/Payment/Gateway/PaymentGatewayInterface.php", "source_location": "L17"}, {"id": "paymentinitresult", "label": "PaymentInitResult", "file_type": "code", "source_file": "src/Payment/Gateway/PaymentGatewayInterface.php", "source_location": "L17"}, {"id": "gateway_paymentgatewayinterface_verify", "label": "verify()", "file_type": "code", "source_file": "src/Payment/Gateway/PaymentGatewayInterface.php", "source_location": "L22"}, {"id": "paymentverifyresult", "label": "PaymentVerifyResult", "file_type": "code", "source_file": "src/Payment/Gateway/PaymentGatewayInterface.php", "source_location": "L22"}, {"id": "gateway_paymentgatewayinterface_refund", "label": "refund()", "file_type": "code", "source_file": "src/Payment/Gateway/PaymentGatewayInterface.php", "source_location": "L27"}, {"id": "paymentrefundresult", "label": "PaymentRefundResult", "file_type": "code", "source_file": "src/Payment/Gateway/PaymentGatewayInterface.php", "source_location": "L27"}, {"id": "gateway_paymentgatewayinterface_reverse", "label": "reverse()", "file_type": "code", "source_file": "src/Payment/Gateway/PaymentGatewayInterface.php", "source_location": "L32"}], "edges": [{"source": "users_hamed_pj_my_pj_clinic_pro_clinicpro_src_payment_gateway_paymentgatewayinterface_php", "target": "gateway_paymentgatewayinterface_getname", "relation": "contains", "confidence": "EXTRACTED", "source_file": "src/Payment/Gateway/PaymentGatewayInterface.php", "source_location": "L7", "weight": 1.0}, {"source": "users_hamed_pj_my_pj_clinic_pro_clinicpro_src_payment_gateway_paymentgatewayinterface_php", "target": "gateway_paymentgatewayinterface_isconfigured", "relation": "contains", "confidence": "EXTRACTED", "source_file": "src/Payment/Gateway/PaymentGatewayInterface.php", "source_location": "L12", "weight": 1.0}, {"source": "users_hamed_pj_my_pj_clinic_pro_clinicpro_src_payment_gateway_paymentgatewayinterface_php", "target": "gateway_paymentgatewayinterface_initiate", "relation": "contains", "confidence": "EXTRACTED", "source_file": "src/Payment/Gateway/PaymentGatewayInterface.php", "source_location": "L17", "weight": 1.0}, {"source": "gateway_paymentgatewayinterface_initiate", "target": "paymentinitresult", "relation": "references", "confidence": "EXTRACTED", "source_file": "src/Payment/Gateway/PaymentGatewayInterface.php", "source_location": "L17", "weight": 1.0, "context": "return_type"}, {"source": "users_hamed_pj_my_pj_clinic_pro_clinicpro_src_payment_gateway_paymentgatewayinterface_php", "target": "gateway_paymentgatewayinterface_verify", "relation": "contains", "confidence": "EXTRACTED", "source_file": "src/Payment/Gateway/PaymentGatewayInterface.php", "source_location": "L22", "weight": 1.0}, {"source": "gateway_paymentgatewayinterface_verify", "target": "paymentverifyresult", "relation": "references", "confidence": "EXTRACTED", "source_file": "src/Payment/Gateway/PaymentGatewayInterface.php", "source_location": "L22", "weight": 1.0, "context": "return_type"}, {"source": "users_hamed_pj_my_pj_clinic_pro_clinicpro_src_payment_gateway_paymentgatewayinterface_php", "target": "gateway_paymentgatewayinterface_refund", "relation": "contains", "confidence": "EXTRACTED", "source_file": "src/Payment/Gateway/PaymentGatewayInterface.php", "source_location": "L27", "weight": 1.0}, {"source": "gateway_paymentgatewayinterface_refund", "target": "paymentrefundresult", "relation": "references", "confidence": "EXTRACTED", "source_file": "src/Payment/Gateway/PaymentGatewayInterface.php", "source_location": "L27", "weight": 1.0, "context": "return_type"}, {"source": "users_hamed_pj_my_pj_clinic_pro_clinicpro_src_payment_gateway_paymentgatewayinterface_php", "target": "gateway_paymentgatewayinterface_reverse", "relation": "contains", "confidence": "EXTRACTED", "source_file": "src/Payment/Gateway/PaymentGatewayInterface.php", "source_location": "L32", "weight": 1.0}, {"source": "gateway_paymentgatewayinterface_reverse", "target": "paymentrefundresult", "relation": "references", "confidence": "EXTRACTED", "source_file": "src/Payment/Gateway/PaymentGatewayInterface.php", "source_location": "L32", "weight": 1.0, "context": "return_type"}], "raw_calls": []}
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
+9004 -1745
View File
File diff suppressed because it is too large Load Diff
+188 -98
View File
@@ -70,8 +70,8 @@
"semantic_hash": ""
},
"assets/admin/components/ui/Modal.tsx": {
"mtime": 1781106752.1961486,
"ast_hash": "f465bb8cc877c22477bd42184b57bce0",
"mtime": 1782979832.1321452,
"ast_hash": "577f5b6a650443b72262fd70e3704d4c",
"semantic_hash": ""
},
"assets/admin/components/ui/NotificationMobileCard.tsx": {
@@ -90,8 +90,8 @@
"semantic_hash": ""
},
"assets/admin/components/ui/PersianCalendar.tsx": {
"mtime": 1782404799.2521334,
"ast_hash": "1b9e2f3b55c381a175b659ba43503239",
"mtime": 1782979864.1043193,
"ast_hash": "d65b0ac6c2fc4451315d73ea8a669196",
"semantic_hash": ""
},
"assets/admin/components/ui/PersianDateInput.tsx": {
@@ -165,18 +165,18 @@
"semantic_hash": ""
},
"assets/admin/pages/AdminSubscriptionPage.tsx": {
"mtime": 1782259093.510682,
"ast_hash": "fee412655919a9a2d8759048f1912aa7",
"mtime": 1783014651.0181222,
"ast_hash": "f2502ed4238124e7d9b86857593bebdf",
"semantic_hash": ""
},
"assets/admin/pages/AppointmentDetailPage.tsx": {
"mtime": 1781281676.685875,
"ast_hash": "56ef1e5cd55740f981751ae118275b04",
"mtime": 1782992372.1432073,
"ast_hash": "9cf58f2636dd09e245edd9e28d1829fe",
"semantic_hash": ""
},
"assets/admin/pages/AppointmentsPage.tsx": {
"mtime": 1782364900.2562063,
"ast_hash": "eb797b50af9ce789b366056daf66d79e",
"mtime": 1783014651.0018947,
"ast_hash": "9b2a650e0f7b884341399dfac438ee0a",
"semantic_hash": ""
},
"assets/admin/pages/BlogFormPage.tsx": {
@@ -200,8 +200,8 @@
"semantic_hash": ""
},
"assets/admin/pages/ClinicDetailPage.tsx": {
"mtime": 1782367864.110122,
"ast_hash": "d8e7bd41d05e02e95fc588d1b855491e",
"mtime": 1783014566.3569148,
"ast_hash": "0b9752fdf176101b09568cd96adfab58",
"semantic_hash": ""
},
"assets/admin/pages/ClinicFormPage.tsx": {
@@ -215,8 +215,8 @@
"semantic_hash": ""
},
"assets/admin/pages/ClinicsPage.tsx": {
"mtime": 1781869963.5032022,
"ast_hash": "48738dd7d6e256367b405da8510820e9",
"mtime": 1783014650.9975634,
"ast_hash": "9821e090ed254341b6e0a94b1e30da7d",
"semantic_hash": ""
},
"assets/admin/pages/CommentsPage.tsx": {
@@ -225,18 +225,18 @@
"semantic_hash": ""
},
"assets/admin/pages/DashboardPage.tsx": {
"mtime": 1782304698.5288823,
"ast_hash": "697de789809cf2c5963152244a82f6b4",
"mtime": 1783014538.7834437,
"ast_hash": "7fda4f20c50443ec72ea00a7d92816e3",
"semantic_hash": ""
},
"assets/admin/pages/DoctorDetailPage.tsx": {
"mtime": 1782366852.7153738,
"ast_hash": "bdf631e69362e11a2d0a54d08764407d",
"mtime": 1783014580.2052991,
"ast_hash": "56eb0dfe4c7bf715ac61c245d05ba36f",
"semantic_hash": ""
},
"assets/admin/pages/DoctorFormPage.tsx": {
"mtime": 1781869880.8183048,
"ast_hash": "dd670a1ca1acbe444ddf081d51468076",
"mtime": 1782978917.310526,
"ast_hash": "37975f566f63aa8efbfb69e0b25b3ec5",
"semantic_hash": ""
},
"assets/admin/pages/DoctorProfilePage.tsx": {
@@ -245,13 +245,13 @@
"semantic_hash": ""
},
"assets/admin/pages/DoctorsPage.tsx": {
"mtime": 1782291104.7572682,
"ast_hash": "a90156fa17945bddd6d5e89a36131e22",
"mtime": 1783014538.7828207,
"ast_hash": "6cf2c963ef00401631e8d519b5f9b0ed",
"semantic_hash": ""
},
"assets/admin/pages/FinancialReportPage.tsx": {
"mtime": 1782293469.8242764,
"ast_hash": "96f9755045ce008d3d34fe35f8cab334",
"mtime": 1783014538.788071,
"ast_hash": "471bacb2480d911d8659e3adb72de194",
"semantic_hash": ""
},
"assets/admin/pages/InsurancePricingPage.tsx": {
@@ -290,18 +290,18 @@
"semantic_hash": ""
},
"assets/admin/pages/PaymentDetailPage.tsx": {
"mtime": 1781110095.4394236,
"ast_hash": "e702057d20244a2229622f52fd7638a6",
"mtime": 1783010796.4325852,
"ast_hash": "5e996e7b610a7826f35206b3e18f2c70",
"semantic_hash": ""
},
"assets/admin/pages/PaymentsPage.tsx": {
"mtime": 1781819421.7654989,
"ast_hash": "359060c2497105b85c71f466eeaff53a",
"mtime": 1783014538.78235,
"ast_hash": "0e2cad0f531169ccd722cc7efded481a",
"semantic_hash": ""
},
"assets/admin/pages/PreRegistrationsPage.tsx": {
"mtime": 1781252529.8164945,
"ast_hash": "6187f3752f5278f0fc9d583a20c9b5b3",
"mtime": 1783014651.0085008,
"ast_hash": "54355562c5a5c8b1a5affd1c3427dfed",
"semantic_hash": ""
},
"assets/admin/pages/RatingsPage.tsx": {
@@ -315,18 +315,18 @@
"semantic_hash": ""
},
"assets/admin/pages/RepresentationFinancePage.tsx": {
"mtime": 1782318800.574076,
"ast_hash": "dad16f2ba84938aca1d449d8e1c83eb4",
"mtime": 1783014651.0118818,
"ast_hash": "f0fd004929edc44e4d939a706bd5809c",
"semantic_hash": ""
},
"assets/admin/pages/RepresentationProfilePage.tsx": {
"mtime": 1782404861.8782403,
"ast_hash": "96667fc83e8615220f4cac2d1f48d3a2",
"mtime": 1783014651.021187,
"ast_hash": "d934c8007e2f9ad68fd8de59192331c4",
"semantic_hash": ""
},
"assets/admin/pages/RepresentationSettlementPage.tsx": {
"mtime": 1782728407.0997715,
"ast_hash": "a32a0e43ff05aa409ebf2fa0c5f6a4f4",
"mtime": 1783014651.0150015,
"ast_hash": "87c76a7946e4fd7ffd9ce47c4e355287",
"semantic_hash": ""
},
"assets/admin/pages/RepresentationsPage.tsx": {
@@ -345,8 +345,8 @@
"semantic_hash": ""
},
"assets/admin/pages/SettingsPage.tsx": {
"mtime": 1782975327.2297547,
"ast_hash": "b20c69938bd37c5db0e5b66a1ba3080f",
"mtime": 1783010796.4329321,
"ast_hash": "e70d4f6c19b088d4c8bb6bdd57b32bdb",
"semantic_hash": ""
},
"assets/admin/pages/SettlementDetailPage.tsx": {
@@ -365,18 +365,18 @@
"semantic_hash": ""
},
"assets/admin/pages/SmsWalletPage.tsx": {
"mtime": 1782253591.7398412,
"ast_hash": "13bdc0b62d3ff40dc92a3a8eb6084929",
"mtime": 1783014651.0052793,
"ast_hash": "6a10dbd574fe40dd0a7978dffd88db66",
"semantic_hash": ""
},
"assets/admin/pages/StaffPage.tsx": {
"mtime": 1781516938.5586853,
"ast_hash": "e0485bd57fd3439640a73b0fee25f6d6",
"mtime": 1783014538.7917976,
"ast_hash": "197932193ce83f478062e74bff2883af",
"semantic_hash": ""
},
"assets/admin/pages/SubscriptionPage.tsx": {
"mtime": 1782897125.5820823,
"ast_hash": "edb160fc9e85f915400426c76610e8c4",
"mtime": 1782997913.0032132,
"ast_hash": "275eb20d0aafcd6fa5f35c0c74dbe8f5",
"semantic_hash": ""
},
"assets/admin/pages/UserDetailPage.tsx": {
@@ -400,8 +400,8 @@
"semantic_hash": ""
},
"assets/admin/types/index.ts": {
"mtime": 1782974093.73864,
"ast_hash": "976545bf4ab31428db0fe23c17c23b5f",
"mtime": 1783010796.4332225,
"ast_hash": "e7305bcff435adaa9df6a2c42a992924",
"semantic_hash": ""
},
"assets/app.js": {
@@ -810,8 +810,8 @@
"semantic_hash": ""
},
"src/Admin/Controller/AdminApiController.php": {
"mtime": 1782929751.8803875,
"ast_hash": "8e5c78db08130ce9f65763e3306cc291",
"mtime": 1783010796.434586,
"ast_hash": "dd608da59b6af600e7a755b63ad0973a",
"semantic_hash": ""
},
"src/Admin/Controller/AdminController.php": {
@@ -1150,8 +1150,8 @@
"semantic_hash": ""
},
"src/Config/Controller/SiteConfigController.php": {
"mtime": 1782974471.6251059,
"ast_hash": "6bec4d13bccff8d60ceee16d65e6c71c",
"mtime": 1783010796.4351387,
"ast_hash": "e4424874defd966d41c4445dbd629806",
"semantic_hash": ""
},
"src/Config/Entity/SiteConfig.php": {
@@ -1180,8 +1180,8 @@
"semantic_hash": ""
},
"src/Doctor/Controller/DoctorController.php": {
"mtime": 1782931944.4072063,
"ast_hash": "2dd80d4ed9ec5a18474c17d7697cfee8",
"mtime": 1782978998.6554778,
"ast_hash": "86fbb75fbf607a364e8b98bcf921076a",
"semantic_hash": ""
},
"src/Doctor/Entity/Doctor.php": {
@@ -1200,8 +1200,8 @@
"semantic_hash": ""
},
"src/Doctor/Repository/DoctorRepository.php": {
"mtime": 1782728407.1963685,
"ast_hash": "e45b9dfd55967b2bb5082c25d947293b",
"mtime": 1782977943.3100293,
"ast_hash": "8107334c65e7a5db72bfe6f94875b463",
"semantic_hash": ""
},
"src/DoctorService/Controller/DoctorServiceController.php": {
@@ -1360,33 +1360,33 @@
"semantic_hash": ""
},
"src/Payment/Controller/PaymentController.php": {
"mtime": 1782974625.5218852,
"ast_hash": "1d84377c36b7d689201bc5324a2a0731",
"mtime": 1783011733.758226,
"ast_hash": "a4dbad9ee7aa5df9aed3acf2d7f89ba9",
"semantic_hash": ""
},
"src/Payment/Entity/Payment.php": {
"mtime": 1782728407.1985424,
"ast_hash": "e51a6e6ba0e8ee390d56474f58c6a660",
"mtime": 1782995955.1895328,
"ast_hash": "561a43f66c1fbbb5ea39ff0aa407f442",
"semantic_hash": ""
},
"src/Payment/Gateway/MellatGateway.php": {
"mtime": 1782896964.9076507,
"ast_hash": "67b1f4180e7bc36425229c9a9c1f2fa7",
"mtime": 1783010796.4370883,
"ast_hash": "8cd5f8a90d5b00606c4d2f0d26832d8c",
"semantic_hash": ""
},
"src/Payment/Gateway/MockGateway.php": {
"mtime": 1782896968.6033201,
"ast_hash": "69fbe77ed2ae3a608171039dc1c70b97",
"mtime": 1783010796.4373336,
"ast_hash": "974465e34e29020de2ddc3d9bd70a7d5",
"semantic_hash": ""
},
"src/Payment/Gateway/PaymentGatewayInterface.php": {
"mtime": 1782896961.142725,
"ast_hash": "bb1e00f14c34dbf92e95c97d374655b4",
"mtime": 1783010796.4378414,
"ast_hash": "94f2c47ea97cae77f3864f71dd3d2bea",
"semantic_hash": ""
},
"src/Payment/Gateway/PaymentInitResult.php": {
"mtime": 1781012933.0592759,
"ast_hash": "8c38c1536f6bf6bd0bac079ed8dd5939",
"mtime": 1782981352.8312612,
"ast_hash": "35dd5ee58868eef69c83373c48424cc0",
"semantic_hash": ""
},
"src/Payment/Gateway/PaymentVerifyResult.php": {
@@ -1395,13 +1395,13 @@
"semantic_hash": ""
},
"src/Payment/Gateway/SepGateway.php": {
"mtime": 1782896967.2453976,
"ast_hash": "3f729de2819cf3691231152b3f40924a",
"mtime": 1783010796.4384458,
"ast_hash": "92c36f974c3d975325585523c06607af",
"semantic_hash": ""
},
"src/Payment/Repository/PaymentRepository.php": {
"mtime": 1782728407.1991549,
"ast_hash": "28807b35e2c83ddd917bb2914cc71175",
"mtime": 1782993112.2747712,
"ast_hash": "838b2371c0a6c992371ef9ee13dffcb7",
"semantic_hash": ""
},
"src/Payment/Service/CircuitBreakerService.php": {
@@ -1445,8 +1445,8 @@
"semantic_hash": ""
},
"src/Representation/Controller/RepresentationActionController.php": {
"mtime": 1782728407.200476,
"ast_hash": "2e713e442ac0f71bcf2aebc00324d126",
"mtime": 1782979010.2578533,
"ast_hash": "7468f7a2aaa928ef0150fa745267e765",
"semantic_hash": ""
},
"src/Representation/Controller/RepresentationController.php": {
@@ -1565,8 +1565,8 @@
"semantic_hash": ""
},
"src/Shared/EventSubscriber/SecurityHeadersSubscriber.php": {
"mtime": 1782728407.2032897,
"ast_hash": "57d66396929ab5b7823859143ec1f563",
"mtime": 1783010796.4408703,
"ast_hash": "80fd13b7873c9e2bbdef6781f80e30ab",
"semantic_hash": ""
},
"src/Shared/Exception/AppException.php": {
@@ -1610,18 +1610,18 @@
"semantic_hash": ""
},
"src/Sms/Controller/SmsWalletController.php": {
"mtime": 1782894791.5387394,
"ast_hash": "6cf62fad0a8d8cfb3831f09c44a2d49c",
"mtime": 1782998941.568915,
"ast_hash": "50516e1d7620ba2aa7e98573777e7d8d",
"semantic_hash": ""
},
"src/Sms/Entity/SmsLog.php": {
"mtime": 1782902823.9580002,
"ast_hash": "42a038068db64c9b94f3ab6f99a51cd8",
"mtime": 1783012949.94825,
"ast_hash": "38a0149a5bffac7b9079a0628ee8a268",
"semantic_hash": ""
},
"src/Sms/Entity/SmsMessageTemplate.php": {
"mtime": 1782902828.6619399,
"ast_hash": "0c8f32c4fab56c8d392dfe11c937c9a3",
"mtime": 1783013406.3586075,
"ast_hash": "d61835bd817a3c614ac1f7ec4190cff2",
"semantic_hash": ""
},
"src/Sms/Entity/SmsSettings.php": {
@@ -1765,8 +1765,8 @@
"semantic_hash": ""
},
"src/Subscription/Repository/ClinicSubscriptionRepository.php": {
"mtime": 1781516938.5827265,
"ast_hash": "1dd25115699856a6c151e036c5bfddc0",
"mtime": 1783010796.4415107,
"ast_hash": "fe446782e41ca4566bc642ee87621b8f",
"semantic_hash": ""
},
"src/Subscription/Repository/SubscriptionPeriodRepository.php": {
@@ -1780,8 +1780,8 @@
"semantic_hash": ""
},
"src/Subscription/Service/SubscriptionService.php": {
"mtime": 1781516938.5831344,
"ast_hash": "991a261d858c934c4010e2cae9e59990",
"mtime": 1783010796.4419346,
"ast_hash": "df1c35a147116e7a52139e23bf0024c5",
"semantic_hash": ""
},
"src/Tag/Controller/TagController.php": {
@@ -2260,8 +2260,8 @@
"semantic_hash": ""
},
"config/packages/security.yaml": {
"mtime": 1781799523.4107985,
"ast_hash": "16c94112d88bc80b57a49c1157059a2f",
"mtime": 1782995001.0929694,
"ast_hash": "3b126684770e87f7fef6545e099751fa",
"semantic_hash": ""
},
"config/packages/twig.yaml": {
@@ -2300,8 +2300,8 @@
"semantic_hash": ""
},
"config/services.yaml": {
"mtime": 1782932864.251077,
"ast_hash": "0cd5b457c6df19eb90acd03c130bd713",
"mtime": 1782993263.0293136,
"ast_hash": "27502355f3182447d5ff05d58ae0f27b",
"semantic_hash": ""
},
"docs/Architecture_Audit.md": {
@@ -2340,8 +2340,8 @@
"semantic_hash": ""
},
"docs/api/admin.md": {
"mtime": 1782974658.9906943,
"ast_hash": "5715227d2011fce8439a74c3d3324e20",
"mtime": 1783010796.4335458,
"ast_hash": "9ea60f062cfff03f17720e9931e1c262",
"semantic_hash": ""
},
"docs/api/appointment-settings.md": {
@@ -2395,8 +2395,8 @@
"semantic_hash": ""
},
"docs/api/doctor.md": {
"mtime": 1782932001.1570988,
"ast_hash": "166c5a9c884b17c23a53d9cb592266f4",
"mtime": 1782979047.5438921,
"ast_hash": "7f95fa1394ef1d84899929b5f2cf4d64",
"semantic_hash": ""
},
"docs/api/insurance.md": {
@@ -2415,8 +2415,8 @@
"semantic_hash": ""
},
"docs/api/payment.md": {
"mtime": 1782974640.9762948,
"ast_hash": "fc916697880a8f302f4766d0a071c679",
"mtime": 1783011804.9949813,
"ast_hash": "b4e46fcd33854944ea5b9e80172cb47f",
"semantic_hash": ""
},
"docs/api/rating.md": {
@@ -2425,8 +2425,8 @@
"semantic_hash": ""
},
"docs/api/representation.md": {
"mtime": 1782728407.1112525,
"ast_hash": "3f525b4581e326a353afc4a563f19fca",
"mtime": 1782979067.5559928,
"ast_hash": "0766b25592e2868c3e87d4e38958fa2e",
"semantic_hash": ""
},
"docs/api/secretary.md": {
@@ -2440,8 +2440,8 @@
"semantic_hash": ""
},
"docs/api/sms.md": {
"mtime": 1782902976.009701,
"ast_hash": "2654051c73dddf1e702d686ef5790a47",
"mtime": 1783013072.0409873,
"ast_hash": "fa27f7d1bb6c3241447f844133a400f5",
"semantic_hash": ""
},
"docs/api/specialty.md": {
@@ -3513,5 +3513,95 @@
"mtime": 1782975691.9747198,
"ast_hash": "9583fb5ebc728ab1014038ac44d1d09a",
"semantic_hash": ""
},
"migrations/Version20260702115209.php": {
"mtime": 1782993164.6661437,
"ast_hash": "06a43da36c756d541b846d3ad023d282",
"semantic_hash": ""
},
"src/Payment/Entity/PaymentLog.php": {
"mtime": 1783010796.4357238,
"ast_hash": "8137c4d61aaf49f4661783c8e8779e33",
"semantic_hash": ""
},
"src/Payment/Gateway/GatewayFactory.php": {
"mtime": 1783010796.4360023,
"ast_hash": "c19dd16e34ac9af1f5364c4d96c5ecaa",
"semantic_hash": ""
},
"src/Payment/Gateway/PaymentRefundResult.php": {
"mtime": 1783010796.4381082,
"ast_hash": "4e563c218cb33c5511a0618ca6b5d286",
"semantic_hash": ""
},
"src/Payment/Repository/PaymentLogRepository.php": {
"mtime": 1782993118.7011945,
"ast_hash": "ea6eb55c4920775d5071457c5006f08d",
"semantic_hash": ""
},
"src/Payment/Service/PaymentManager.php": {
"mtime": 1783012974.905455,
"ast_hash": "c968b32943ddf0363ac01fc8e6c9eb31",
"semantic_hash": ""
},
"tests/Payment/MellatGatewayTest.php": {
"mtime": 1782984645.104304,
"ast_hash": "60cc79a004e9384bd2e1763d72bad268",
"semantic_hash": ""
},
".claude/prompt/admin-mobile-responsive.md": {
"mtime": 1783014366.933033,
"ast_hash": "70b0ba957159b75ea688cf026fdf5ac7",
"semantic_hash": ""
},
".claude/prompt/admin-payment-refund-reversal.md": {
"mtime": 1783010796.4317427,
"ast_hash": "ae73437b6945d08f135ac1667d110417",
"semantic_hash": ""
},
".claude/prompt/doctor-appointment-notification-sms.md": {
"mtime": 1783012880.3920286,
"ast_hash": "da92d8d2215f4951b4672a2b93384fe6",
"semantic_hash": ""
},
".claude/prompt/doctor-experience-activity-date.md": {
"mtime": 1782978755.9218872,
"ast_hash": "378ff8eadaf7125d500f5e5afd89589e",
"semantic_hash": ""
},
".claude/prompt/fix-admin-modal-and-calendar.md": {
"mtime": 1782979774.5608149,
"ast_hash": "d382433480e97dd3ee0725afc1eeb764",
"semantic_hash": ""
},
".claude/prompt/fix-doctors-list-location-filter.md": {
"mtime": 1782977589.9465406,
"ast_hash": "bc323ba27f13267d0e7c7b7d8ebff915",
"semantic_hash": ""
},
".claude/prompt/mellat-production-soap.md": {
"mtime": 1783010796.4320023,
"ast_hash": "a14fa3dbbfcb2977e894f9b31287a363",
"semantic_hash": ""
},
".claude/prompt/mellat-sandbox-gateway.md": {
"mtime": 1783010796.4322934,
"ast_hash": "b4ff14e1ad3d9409092022a9eed15121",
"semantic_hash": ""
},
".claude/prompt/payment-flow-architecture.md": {
"mtime": 1782992901.1053152,
"ast_hash": "33e12cf7ccecbb8af5ecbf2fe736fa96",
"semantic_hash": ""
},
".claude/prompt/payment-single-flow-consolidation.md": {
"mtime": 1782994765.4802427,
"ast_hash": "1bd99b26cca55aac8a662fbacf4e2292",
"semantic_hash": ""
},
".claude/prompt/sms-price-and-wallet-settings.md": {
"mtime": 1782998857.27679,
"ast_hash": "6884dbc77045e3a46508c1ea7b0b8206",
"semantic_hash": ""
}
}