Add SmsServiceLookupOnlyTest AST and migration for template_code in sms_logs
- Created a new AST JSON file for SmsServiceLookupOnlyTest.php, detailing nodes, edges, and raw calls for better code analysis. - Added a new migration (Version20260707202553) to alter the sms_logs table by adding a nullable template_code column.
This commit is contained in:
@@ -314,6 +314,7 @@ export default function SmsPage() {
|
||||
},
|
||||
},
|
||||
{ key: 'tag', header: 'تگ', render: (l) => <span className="badge gray"><span className="bdot" />{TAG_LABELS[l.tag] ?? l.tag}</span> },
|
||||
{ key: 'template', header: 'الگوی کاوهنگار', render: (l) => l.template ? <code dir="ltr" style={{ fontSize: 12 }}>{l.template}</code> : <span className="muted">—</span> },
|
||||
{ key: 'provider', header: 'سرویسدهنده' },
|
||||
{ key: 'sent_at', header: 'زمان ارسال', render: (l) => formatDateTime(l.sent_at) },
|
||||
];
|
||||
|
||||
@@ -201,6 +201,7 @@ export interface SmsLog {
|
||||
status: "queued" | "sent" | "failed";
|
||||
provider: string;
|
||||
tag: string;
|
||||
template: string | null;
|
||||
sent_at: string | null;
|
||||
created_at: string;
|
||||
}
|
||||
|
||||
@@ -851,6 +851,7 @@ List SMS send logs.
|
||||
"status": "sent",
|
||||
"provider": "kavenegar",
|
||||
"tag": "otp",
|
||||
"template": "clinicpro-otp",
|
||||
"sent_at": "2026-06-19T...",
|
||||
"created_at": "2026-06-19T..."
|
||||
}
|
||||
@@ -859,6 +860,7 @@ List SMS send logs.
|
||||
}
|
||||
```
|
||||
> `tag` نوع پیامک را مشخص میکند؛ پیشفرض پیامکهای سیستمیِ بیبرچسب `global` است.
|
||||
> `template` نام الگوی VerifyLookup کاوهنگار است که پیامک با آن ارسال شده (مثلاً `clinicpro-otp`)؛ `null` اگر ارسال نشده باشد (مثلاً رد بهدلیل نبود الگو در سیاست lookup-only).
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
> (`verify/lookup.json`) ارسال میشوند. ارسال متن آزاد با `sms/send.json` **غیرفعال** است
|
||||
> (در ایران برای پیام خدماتی فیلتر میشود). هر پیامی که الگو/کد VerifyLookup نداشته باشد
|
||||
> ارسال **نمیشود**؛ در `SmsLog` با `success=false` ثبت و در لاگ برنامه خطا میخورد.
|
||||
> هر رکورد `SmsLog` نام الگوی کاوهنگارِ استفادهشده را در فیلد `template_code` نگه میدارد
|
||||
> (در پاسخ `GET /api/v1/admin/sms/logs` با کلید `template`)؛ برای پیامکهای ردشده `null` است.
|
||||
|
||||
## Configuration
|
||||
|
||||
|
||||
@@ -707,8 +707,6 @@
|
||||
"705": "Community 705",
|
||||
"706": "Community 706",
|
||||
"707": "Community 707",
|
||||
"708": "Community 708",
|
||||
"709": "Community 709",
|
||||
"710": "Community 710",
|
||||
"711": "Community 711",
|
||||
"712": "Community 712",
|
||||
@@ -718,10 +716,8 @@
|
||||
"716": "Community 716",
|
||||
"717": "Community 717",
|
||||
"718": "Community 718",
|
||||
"719": "Community 719",
|
||||
"720": "Community 720",
|
||||
"721": "Community 721",
|
||||
"722": "Community 722",
|
||||
"723": "Community 723",
|
||||
"724": "Community 724"
|
||||
}
|
||||
|
||||
+98
-110
@@ -1,16 +1,16 @@
|
||||
# Graph Report - clinicpro (2026-07-07)
|
||||
|
||||
## Corpus Check
|
||||
- 711 files · ~521,407 words
|
||||
- 712 files · ~521,677 words
|
||||
- Verdict: corpus is large enough that graph structure adds value.
|
||||
|
||||
## Summary
|
||||
- 8995 nodes · 12432 edges · 725 communities (585 shown, 140 thin omitted)
|
||||
- 9003 nodes · 12444 edges · 721 communities (583 shown, 138 thin omitted)
|
||||
- Extraction: 98% EXTRACTED · 2% INFERRED · 0% AMBIGUOUS · INFERRED: 277 edges (avg confidence: 0.8)
|
||||
- Token cost: 0 input · 0 output
|
||||
|
||||
## Graph Freshness
|
||||
- Built from commit: `4ee1524f`
|
||||
- Built from commit: `2982eaa7`
|
||||
- Run `git rev-parse HEAD` and compare to check if the graph is stale.
|
||||
- Run `graphify update .` after code changes (no API cost).
|
||||
|
||||
@@ -708,8 +708,6 @@
|
||||
- [[_COMMUNITY_Community 705|Community 705]]
|
||||
- [[_COMMUNITY_Community 706|Community 706]]
|
||||
- [[_COMMUNITY_Community 707|Community 707]]
|
||||
- [[_COMMUNITY_Community 708|Community 708]]
|
||||
- [[_COMMUNITY_Community 709|Community 709]]
|
||||
- [[_COMMUNITY_Community 710|Community 710]]
|
||||
- [[_COMMUNITY_Community 711|Community 711]]
|
||||
- [[_COMMUNITY_Community 712|Community 712]]
|
||||
@@ -719,10 +717,8 @@
|
||||
- [[_COMMUNITY_Community 716|Community 716]]
|
||||
- [[_COMMUNITY_Community 717|Community 717]]
|
||||
- [[_COMMUNITY_Community 718|Community 718]]
|
||||
- [[_COMMUNITY_Community 719|Community 719]]
|
||||
- [[_COMMUNITY_Community 720|Community 720]]
|
||||
- [[_COMMUNITY_Community 721|Community 721]]
|
||||
- [[_COMMUNITY_Community 722|Community 722]]
|
||||
- [[_COMMUNITY_Community 723|Community 723]]
|
||||
- [[_COMMUNITY_Community 724|Community 724]]
|
||||
|
||||
@@ -743,8 +739,8 @@
|
||||
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
|
||||
- `PersianDatePicker()` --calls--> `formatDate()` [EXTRACTED]
|
||||
assets/admin/components/ui/PersianDatePicker.tsx → assets/admin/lib/utils.ts
|
||||
- `RepresentationSettlementPage()` --calls--> `formatRial()` [EXTRACTED]
|
||||
assets/admin/pages/RepresentationSettlementPage.tsx → assets/admin/lib/utils.ts
|
||||
- `SettlementsPage()` --calls--> `formatRial()` [EXTRACTED]
|
||||
assets/admin/pages/SettlementsPage.tsx → assets/admin/lib/utils.ts
|
||||
- `NewAppointmentModal()` --calls--> `useAuthStore` [EXTRACTED]
|
||||
@@ -753,11 +749,11 @@
|
||||
## Import Cycles
|
||||
- None detected.
|
||||
|
||||
## Communities (725 total, 140 thin omitted)
|
||||
## Communities (721 total, 138 thin omitted)
|
||||
|
||||
### Community 0 - "Community 0"
|
||||
Cohesion: 0.05
|
||||
Nodes (37): ALLOWED_ROLES, PrivateRoute(), PublicRoute(), RoleRoute(), queryClient, toastStyle, DEGREE_OPTIONS, DoctorFormPage() (+29 more)
|
||||
Nodes (38): ALLOWED_ROLES, PrivateRoute(), PublicRoute(), RoleRoute(), queryClient, toastStyle, DEGREE_OPTIONS, DoctorFormPage() (+30 more)
|
||||
|
||||
### Community 1 - "Community 1"
|
||||
Cohesion: 0.03
|
||||
@@ -805,11 +801,11 @@ Nodes (4): UserActiveContextRepository, ManagerRegistry, User, UserActiveContext
|
||||
|
||||
### Community 12 - "Community 12"
|
||||
Cohesion: 0.05
|
||||
Nodes (40): Clinic Doctor Invitation API, Errors, Errors, Errors, Errors, Errors, Errors, Errors (+32 more)
|
||||
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.08
|
||||
Nodes (22): get, PaymentConfig, PaymentGatewayInfo, api, ApiError, getToken(), refreshOnce(), request() (+14 more)
|
||||
Cohesion: 0.07
|
||||
Nodes (25): get, api, ApiError, getToken(), refreshOnce(), request(), { refreshMock, logoutMock }, replaceMock (+17 more)
|
||||
|
||||
### Community 14 - "Community 14"
|
||||
Cohesion: 0.10
|
||||
@@ -820,32 +816,32 @@ Cohesion: 0.25
|
||||
Nodes (7): PaymentController, Appointment, JsonResponse, Payment, Request, Response, User
|
||||
|
||||
### Community 16 - "Community 16"
|
||||
Cohesion: 0.07
|
||||
Nodes (7): PatientSession, SmsWallet, Appointment, Collection, PatientRecord, self, SessionService
|
||||
Cohesion: 0.06
|
||||
Nodes (8): PatientSession, SmsWallet, LogPruneService, Appointment, Collection, PatientRecord, self, SessionService
|
||||
|
||||
### Community 17 - "Community 17"
|
||||
Cohesion: 0.05
|
||||
Nodes (38): DELETE `/api/v1/comment/{uuid}`, Errors, Errors, Errors, Errors, Errors, Errors, Errors (+30 more)
|
||||
Cohesion: 0.06
|
||||
Nodes (33): DELETE `/api/v1/comment/{uuid}`, Errors, Errors, Errors, Errors, Errors, Errors, Errors (+25 more)
|
||||
|
||||
### Community 18 - "Community 18"
|
||||
Cohesion: 0.05
|
||||
Nodes (38): API, API, API, API, API, Route, Route, Route (+30 more)
|
||||
|
||||
### Community 19 - "Community 19"
|
||||
Cohesion: 0.04
|
||||
Nodes (56): PaginatedResponse, formatDate(), STATUS_FILTERS, AddForm, addSchema, ClinicsPage(), HUES_LIST, FILTERS (+48 more)
|
||||
Cohesion: 0.03
|
||||
Nodes (81): PaginatedResponse, CityForm, citySchema, ImportError, InsuranceForm, insuranceSchema, LogoUploadField(), ProvinceForm (+73 more)
|
||||
|
||||
### Community 20 - "Community 20"
|
||||
Cohesion: 0.14
|
||||
Cohesion: 0.13
|
||||
Nodes (3): AdminApiController, JsonResponse, Request
|
||||
|
||||
### Community 21 - "Community 21"
|
||||
Cohesion: 0.05
|
||||
Nodes (33): formatNumber(), ClinicDetailPage(), AdminCharts, AdminDashboard(), AdminRecent, AdminStats, APPT_CLS, APPT_COLOR (+25 more)
|
||||
Cohesion: 0.04
|
||||
Nodes (59): PaymentConfig, PaymentGatewayInfo, usePaymentConfig(), ApiResponse, formatNumber(), formatRial(), ClinicDetailPage(), AdminCharts (+51 more)
|
||||
|
||||
### Community 22 - "Community 22"
|
||||
Cohesion: 0.15
|
||||
Nodes (9): RatingController, Like, LikeRepository, JsonResponse, Request, User, Comment, ManagerRegistry (+1 more)
|
||||
Cohesion: 0.09
|
||||
Nodes (15): RatingController, Like, Rate, CommentListNPlusOneTest, LikeRepository, RateRepository, JsonResponse, Request (+7 more)
|
||||
|
||||
### Community 23 - "Community 23"
|
||||
Cohesion: 0.05
|
||||
@@ -856,8 +852,8 @@ Cohesion: 0.08
|
||||
Nodes (3): City, Province, self
|
||||
|
||||
### Community 25 - "Community 25"
|
||||
Cohesion: 0.05
|
||||
Nodes (39): Appointment API, Error Responses, Errors, Errors, Errors, Errors, Errors, Errors (+31 more)
|
||||
Cohesion: 0.06
|
||||
Nodes (34): Appointment API, Error Responses, Errors, Errors, Errors, Errors, Errors, Errors (+26 more)
|
||||
|
||||
### Community 26 - "Community 26"
|
||||
Cohesion: 0.24
|
||||
@@ -875,6 +871,10 @@ Nodes (4): Appointment, Doctor, self, User
|
||||
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.09
|
||||
Nodes (13): BillingCalculatorTest, BillingCalculator, Money, BillingCalculator, InvoiceService, PatientService, CoverageRule, ShareBreakdown (+5 more)
|
||||
|
||||
### Community 31 - "Community 31"
|
||||
Cohesion: 0.06
|
||||
Nodes (33): `AppointmentStatusDropdown.tsx`, Doctor Tabs در داشبورد کلینیک, Pagination, `PersianCalendar.tsx`, Stats Bar, Status Badge (inline قابل کلیک), Status Dropdown (کلیک روی badge), Toolbar (+25 more)
|
||||
@@ -960,8 +960,8 @@ Cohesion: 0.07
|
||||
Nodes (26): الزامات UI, باگفیکس صفحه نوبتها, باگ ۱ — کرش تقویم, باگ ۲ — روز هفته در DateNavigator, باگ ۳ — پیام «slot نیست», باگ ۴ — نوبت جدید: نام اجباری + find-or-create patient, باگ ۵ — patient_mobile نشان میدهد موبایل پزشک, باگ ۶ — نوبتهای رزرو شده در نمایش زمانبندی (+18 more)
|
||||
|
||||
### Community 53 - "Community 53"
|
||||
Cohesion: 0.08
|
||||
Nodes (15): AppLogRepository, ClaimItemRepository, ClinicStaffRepository, PreRegistrationRepository, SessionServiceRepository, SiteConfigRepository, ServiceEntityRepository, ManagerRegistry (+7 more)
|
||||
Cohesion: 0.10
|
||||
Nodes (13): AppLogRepository, ClaimItemRepository, InvoiceItemRepository, PreRegistrationRepository, SessionServiceRepository, ServiceEntityRepository, ManagerRegistry, ManagerRegistry (+5 more)
|
||||
|
||||
### Community 54 - "Community 54"
|
||||
Cohesion: 0.10
|
||||
@@ -1000,12 +1000,12 @@ Cohesion: 0.08
|
||||
Nodes (25): Bulk import / export, DELETE `/api/v1/admin/specialty/{id}`, Errors, Errors, Errors, Errors, GET `/api/v1/admin/specialties`, GET `/api/v1/specialties` (+17 more)
|
||||
|
||||
### Community 63 - "Community 63"
|
||||
Cohesion: 0.05
|
||||
Nodes (31): AbstractAuthenticator, AuthenticationException, ErrorCodes, AuthController, ClinicServiceController, PatientController, StaffController, AppException (+23 more)
|
||||
Cohesion: 0.22
|
||||
Nodes (5): AuthController, RateLimiterFactory, JsonResponse, Request, User
|
||||
|
||||
### Community 64 - "Community 64"
|
||||
Cohesion: 0.29
|
||||
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
|
||||
@@ -1028,8 +1028,8 @@ Cohesion: 0.15
|
||||
Nodes (12): رفع بهمریختگی کامل پنل ادمین روی iPhone 8 (Safari/Chrome iOS), زمینه, فایلهای مرتبط, مشکل / هدف, نکات مهم, وضعیت فعلی, وظایف, پروژه (+4 more)
|
||||
|
||||
### Community 71 - "Community 71"
|
||||
Cohesion: 0.20
|
||||
Nodes (8): AdminUser, ChangeRoleModal(), getPrimaryRole(), HUES_LIST, ROLE_META, ROLE_TABS, RoleBadge(), UserStats
|
||||
Cohesion: 0.09
|
||||
Nodes (21): AddForm, addSchema, ClinicsPage(), HUES_LIST, EMPTY, PreRegistration, STATUS_META, STATUS_TABS (+13 more)
|
||||
|
||||
### Community 72 - "Community 72"
|
||||
Cohesion: 0.09
|
||||
@@ -1104,7 +1104,7 @@ Cohesion: 0.10
|
||||
Nodes (20): DELETE `/api/v1/admin/users/{uuid}`, Errors, Errors, GET `/api/v1/admin/users`, GET `/api/v1/admin/users/stats`, GET `/api/v1/admin/users/{uuid}`, POST `/api/v1/admin/users/{uuid}/status`, PUT `/api/v1/admin/users/{uuid}` (+12 more)
|
||||
|
||||
### Community 92 - "Community 92"
|
||||
Cohesion: 0.09
|
||||
Cohesion: 0.10
|
||||
Nodes (21): Bulk import / export, DELETE `/api/v1/admin/doctor-service/{id}`, Doctor Service API, Errors, Errors, Errors, Errors, GET `/api/v1/admin/doctor-services` (+13 more)
|
||||
|
||||
### Community 93 - "Community 93"
|
||||
@@ -1376,8 +1376,8 @@ Cohesion: 0.13
|
||||
Nodes (13): Architecture, Auth, Backend (PHP/Symfony), Backend — `src/`, Category / Bundle system, Commands, Database, First-time setup (+5 more)
|
||||
|
||||
### Community 163 - "Community 163"
|
||||
Cohesion: 0.11
|
||||
Nodes (18): autoload, autoload-dev, psr-4, psr-4, conflict, symfony/symfony, description, extra (+10 more)
|
||||
Cohesion: 0.13
|
||||
Nodes (14): autoload, autoload-dev, psr-4, psr-4, conflict, symfony/symfony, description, license (+6 more)
|
||||
|
||||
### Community 164 - "Community 164"
|
||||
Cohesion: 0.29
|
||||
@@ -1400,8 +1400,8 @@ Cohesion: 0.10
|
||||
Nodes (20): api.ir (استعلام هویت — Shahkar / IbanMatch), اتصال به دیتابیسهای مستقل (الزامی), اسرار (الزامی — قبل از اولین دیپلوی), امنیت و منابع, بررسی سلامت, دامنهها و CORS, دیپلویهای بعدی, راهنمای دیپلوی ClinicPro (Coolify + Docker Compose) (+12 more)
|
||||
|
||||
### Community 169 - "Community 169"
|
||||
Cohesion: 0.04
|
||||
Nodes (46): CityForm, citySchema, ImportError, InsuranceForm, insuranceSchema, LogoUploadField(), ProvinceForm, provinceSchema (+38 more)
|
||||
Cohesion: 0.31
|
||||
Nodes (6): ErrorCodes, ClinicServiceController, JsonResponse, Request, ServiceSection, User
|
||||
|
||||
### Community 170 - "Community 170"
|
||||
Cohesion: 0.13
|
||||
@@ -1424,8 +1424,8 @@ Cohesion: 0.14
|
||||
Nodes (14): Doctor Management, Errors, Errors, GET `/api/v1/admin/doctors`, GET `/api/v1/admin/doctors/stats`, POST `/api/v1/admin/clinic`, POST `/api/v1/admin/doctors`, POST `/api/v1/admin/doctors/{uuid}/status` (+6 more)
|
||||
|
||||
### Community 175 - "Community 175"
|
||||
Cohesion: 0.13
|
||||
Nodes (12): AdminUserDetail, AVATAR_COLORS, EditForm, editSchema, GENDER_LABELS, getPrimaryRole(), MARITAL_LABELS, MEDICAL_SECTIONS (+4 more)
|
||||
Cohesion: 0.05
|
||||
Nodes (37): formatDate(), formatDateTime(), ALL_STATUSES, AppointmentDetailPage(), timeOf(), Claim, ClaimItem, DebtRow (+29 more)
|
||||
|
||||
### Community 176 - "Community 176"
|
||||
Cohesion: 0.25
|
||||
@@ -1521,7 +1521,7 @@ Nodes (13): Endpoint ها, PATCH /api/v1/secretary/{uuid}, POST /api/v1/secretar
|
||||
|
||||
### Community 201 - "Community 201"
|
||||
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)
|
||||
Nodes (13): Admin API, Clinic Invitation Management, GET `/api/v1/admin/secretaries`, GET /api/v1/admin/settings, GET `/api/v1/admin/settlements`, PATCH /api/v1/admin/settings, Query Parameters, Query Parameters (+5 more)
|
||||
|
||||
### Community 202 - "Community 202"
|
||||
Cohesion: 0.15
|
||||
@@ -1532,16 +1532,16 @@ Cohesion: 0.15
|
||||
Nodes (12): Clinic Services API, DELETE /api/v1/service-item/{uuid}, DELETE /api/v1/service-section/{uuid}, GET /api/v1/service-items/{sectionUuid}, GET /api/v1/service-items/{uuid}/tariffs, GET /api/v1/service-sections, PATCH /api/v1/service-item/{uuid}, PATCH /api/v1/service-section/{uuid} (+4 more)
|
||||
|
||||
### Community 204 - "Community 204"
|
||||
Cohesion: 0.23
|
||||
Nodes (5): ExceptionSubscriber, SecurityHeadersSubscriber, EventSubscriberInterface, ExceptionEvent, ResponseEvent
|
||||
Cohesion: 0.21
|
||||
Nodes (6): AuthenticationException, ExceptionSubscriber, SecurityHeadersSubscriber, EventSubscriberInterface, ExceptionEvent, ResponseEvent
|
||||
|
||||
### Community 205 - "Community 205"
|
||||
Cohesion: 0.10
|
||||
Nodes (16): Command, CancelExpiredAppointmentsCommand, CreateAdminCommand, PruneLogsCommand, SeedCategoriesCommand, SeedSmsMessageTemplatesCommand, InputInterface, OutputInterface (+8 more)
|
||||
|
||||
### Community 206 - "Community 206"
|
||||
Cohesion: 0.08
|
||||
Nodes (14): MellatGateway, MockGateway, SepGateway, SoapClient, PaymentGatewayInterface, PaymentInitResult, PaymentRefundResult, PaymentVerifyResult (+6 more)
|
||||
Cohesion: 0.06
|
||||
Nodes (17): GatewayFactory, MellatGateway, MockGateway, SepGateway, MellatGateway, SepGateway, SoapClient, PaymentGatewayInterface (+9 more)
|
||||
|
||||
### Community 207 - "Community 207"
|
||||
Cohesion: 0.15
|
||||
@@ -1676,8 +1676,8 @@ Cohesion: 0.28
|
||||
Nodes (4): SubscriptionService, ClinicSubscription, Payment, SubscriptionPlan
|
||||
|
||||
### Community 245 - "Community 245"
|
||||
Cohesion: 0.10
|
||||
Nodes (13): Claim, ClaimItem, DebtRow, InsuranceOption, KIND_LABEL, STATUS_FILTERS, STATUS_META, IbanItem (+5 more)
|
||||
Cohesion: 0.35
|
||||
Nodes (5): PatientController, JsonResponse, PatientSession, Request, User
|
||||
|
||||
### Community 246 - "Community 246"
|
||||
Cohesion: 0.17
|
||||
@@ -1788,12 +1788,12 @@ 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.21
|
||||
Cohesion: 0.18
|
||||
Nodes (5): Authentication, ClinicPro — API Documentation Index, Error Code Reference, Modules, Standard Response Envelope
|
||||
|
||||
### Community 275 - "Community 275"
|
||||
Cohesion: 0.24
|
||||
Nodes (4): MellatGateway, MellatGatewayTest, ErrorCodesTest, TestCase
|
||||
Cohesion: 0.21
|
||||
Nodes (4): MellatGatewayTest, CorsRegexEnvProcessorTest, ErrorCodesTest, TestCase
|
||||
|
||||
### Community 276 - "Community 276"
|
||||
Cohesion: 0.20
|
||||
@@ -1892,8 +1892,8 @@ Cohesion: 0.42
|
||||
Nodes (3): PreRegistrationController, JsonResponse, Request
|
||||
|
||||
### Community 301 - "Community 301"
|
||||
Cohesion: 0.04
|
||||
Nodes (45): FreeVisitPrice(), Pricing, usePaymentConfig(), formatDateTime(), formatRial(), rialToToman(), tomanToRial(), InsurancePricingPage() (+37 more)
|
||||
Cohesion: 0.09
|
||||
Nodes (20): FreeVisitPrice(), Pricing, rialToToman(), tomanToRial(), IbanItem, RepMe, RepresentationSettlementPage(), RepSummary (+12 more)
|
||||
|
||||
### Community 302 - "Community 302"
|
||||
Cohesion: 0.12
|
||||
@@ -1905,7 +1905,7 @@ Nodes (16): آمادهسازی پروژه ClinicPro برای دیپلوی ر
|
||||
|
||||
### Community 304 - "Community 304"
|
||||
Cohesion: 0.22
|
||||
Nodes (9): 29. 🟢 `GET` clinic list 🆕, 30. 🟢 `GET` get 🆕, 33. 🔵 `POST` image_clinic, 6. کلینیک (Clinic), هدرهای اضافی, پارامترهای Query, پاسخها, پاسخها (+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
|
||||
@@ -1916,8 +1916,8 @@ Cohesion: 0.28
|
||||
Nodes (3): UserActiveContext, self, User
|
||||
|
||||
### Community 308 - "Community 308"
|
||||
Cohesion: 0.43
|
||||
Nodes (3): InvoiceItemRepository, InvoiceItem, ManagerRegistry
|
||||
Cohesion: 0.36
|
||||
Nodes (5): StaffController, ClinicStaff, JsonResponse, Request, User
|
||||
|
||||
### Community 309 - "Community 309"
|
||||
Cohesion: 0.22
|
||||
@@ -1952,8 +1952,8 @@ Cohesion: 0.31
|
||||
Nodes (3): SubscriptionPlanRepository, ManagerRegistry, SubscriptionPlan
|
||||
|
||||
### Community 318 - "Community 318"
|
||||
Cohesion: 0.33
|
||||
Nodes (4): PatientService, Appointment, PatientRecord, PatientSession
|
||||
Cohesion: 0.30
|
||||
Nodes (6): AbstractAuthenticator, Passport, PasswordAuthenticator, Request, Response, TokenInterface
|
||||
|
||||
### Community 319 - "Community 319"
|
||||
Cohesion: 0.39
|
||||
@@ -2027,6 +2027,10 @@ Nodes (15): ClaimsPage.tsx — بدون صفحهبندی، فقط `data.data.
|
||||
Cohesion: 0.39
|
||||
Nodes (5): JsonContains, FunctionNode, Node, Parser, SqlWalker
|
||||
|
||||
### Community 340 - "Community 340"
|
||||
Cohesion: 0.22
|
||||
Nodes (3): AppException, SlotTakenException, RuntimeException
|
||||
|
||||
### Community 341 - "Community 341"
|
||||
Cohesion: 0.12
|
||||
Nodes (15): بازنویسی متن استارتاپی و رفع نمایش موبایل صفحه فرود (Landing), تست نهایی, راهنمای بازنویسی (نمونه لحن استارتاپی — میتوانی بهترش کنی), زمینه, فایلهای مرتبط, مشکل / هدف, مشکل ۲٫۱ — سرریز هدر روی گوشی, مشکل ۲٫۲ — منوی موبایل با inline-style شکننده باز میشود و بسته نمیشود (+7 more)
|
||||
@@ -2247,6 +2251,10 @@ Nodes (6): ClaimAmountBoundsTest, ClaimsListNPlusOneTest, ClaimItem, Claim, Doct
|
||||
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, Version20260614183527
|
||||
|
||||
### Community 401 - "Community 401"
|
||||
Cohesion: 0.12
|
||||
Nodes (15): `lib/utils.ts`, `SettingsPage.tsx` (ورودیها ریال ذخیره میشوند), زمینه, فایلهای مرتبط, مشکل / هدف, نمونهٔ نمایش (Subscription), نکات مهم, واحد پول = تومان در پنل ادمین (نمایش ÷۱۰ / ورودی ×۱۰) — ذخیره و درگاه ریال میماند (+7 more)
|
||||
@@ -2256,17 +2264,13 @@ Cohesion: 0.11
|
||||
Nodes (17): بازطراحی معماری پرداخت — سرویسمحور، امن، توسعهپذیر (Backend), تست دستی (ddev، در حالت `payment_test_mode=1`), خروجی نهایی (طبق spec — در گزارش اجرا ارائه شود), زمینه, فایلهای مرتبط, مشکل / هدف, نکات مهم, وضعیت فعلی (+9 more)
|
||||
|
||||
### Community 407 - "Community 407"
|
||||
Cohesion: 0.16
|
||||
Nodes (11): KavehNegarProvider, MessageBusInterface, MockObject, SmsService, SmsServiceLookupOnlyTest, SmsLogRepository, SmsMessageTemplateRepository, SmsService (+3 more)
|
||||
Cohesion: 0.18
|
||||
Nodes (11): KavehNegarProvider, MessageBusInterface, MockObject, SmsLogRepository, SmsServiceLookupOnlyTest, SmsLog, SmsLogRepository, SmsMessageTemplateRepository (+3 more)
|
||||
|
||||
### 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, Version20260619062912
|
||||
|
||||
### Community 424 - "Community 424"
|
||||
Cohesion: 0.33
|
||||
Nodes (5): SecretaryController, DoctorSecretary, JsonResponse, Request, User
|
||||
@@ -2275,6 +2279,10 @@ Nodes (5): SecretaryController, DoctorSecretary, JsonResponse, Request, User
|
||||
Cohesion: 0.12
|
||||
Nodes (16): backend (آماده — فقط annotation/doc ناقص), افزودن فیلد «تاریخ شروع فعالیت» (سال تجربه) در پنل ادمین با تقویم شمسی, زمینه, فایلهای مرتبط, فرم ساخت پزشک — `DoctorFormPage.tsx` (خط ~282), فرم ویرایش پزشک — `DoctorDetailPage.tsx` (وضعیت فعلی، بدون فیلد تاریخ), مشکل / هدف, نکات مهم (+8 more)
|
||||
|
||||
### Community 433 - "Community 433"
|
||||
Cohesion: 0.39
|
||||
Nodes (3): ClinicStaffRepository, ClinicStaff, ManagerRegistry
|
||||
|
||||
### Community 439 - "Community 439"
|
||||
Cohesion: 0.40
|
||||
Nodes (5): 31. 🟡 `PATCH` patch, Request Body, مثال Request, هدرهای اضافی, پاسخها
|
||||
@@ -2284,8 +2292,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.05
|
||||
Nodes (37): ApiResponse, cn(), iranMobileOptionalSchema, iranMobileSchema, isValidIranMobile(), maskMobile(), sanitizeMobileInput(), toDate() (+29 more)
|
||||
Cohesion: 0.06
|
||||
Nodes (31): cn(), iranMobileOptionalSchema, iranMobileSchema, isValidIranMobile(), maskMobile(), sanitizeMobileInput(), toDate(), toEnglishDigits() (+23 more)
|
||||
|
||||
### Community 456 - "Community 456"
|
||||
Cohesion: 0.15
|
||||
@@ -2407,6 +2415,10 @@ Nodes (8): ثبتنام دکتر — از طریق نماینده, ثبت
|
||||
Cohesion: 0.12
|
||||
Nodes (15): `Modal.tsx` (بدون Portal), `PersianCalendar.tsx` (buttonها بدون `type`) — نمونهها, باگ ۱ — علت, باگ ۲ — علت, رفع دو باگ Modal و تقویم شمسی در پنل ادمین, زمینه, فایلهای مرتبط, مشکل / هدف (+7 more)
|
||||
|
||||
### Community 492 - "Community 492"
|
||||
Cohesion: 0.13
|
||||
Nodes (4): LoggerInterface, KavehNegarProvider, RanginehProvider, SmsProviderInterface
|
||||
|
||||
### Community 493 - "Community 493"
|
||||
Cohesion: 0.20
|
||||
Nodes (9): Backend Audit Backlog — ClinicPro, ☐ CRITICAL, ✅ DONE (committed on backend-audit), ☐ EPICS (design debt — cross-repo, defer; do NOT quick-fix), ☐ HIGH, ☐ LOW, ☐ MEDIUM, Progress (this audit session) (+1 more)
|
||||
@@ -2648,8 +2660,8 @@ Cohesion: 0.50
|
||||
Nodes (4): GET /api/v1/sms/wallet/balance, GET /api/v1/sms/wallet/logs, POST /api/v1/sms/wallet/charge, SMS Wallet
|
||||
|
||||
### Community 561 - "Community 561"
|
||||
Cohesion: 0.43
|
||||
Nodes (3): BaseKernel, MicroKernelTrait, Kernel
|
||||
Cohesion: 0.19
|
||||
Nodes (6): BaseKernel, Closure, CorsRegexEnvProcessor, EnvVarProcessorInterface, MicroKernelTrait, Kernel
|
||||
|
||||
### Community 563 - "Community 563"
|
||||
Cohesion: 0.67
|
||||
@@ -2759,10 +2771,6 @@ Nodes (8): ۲.۲ انواع دستهبندی (Category Types), ۲.۲.۱ تگ
|
||||
Cohesion: 0.35
|
||||
Nodes (5): RepresentationController, JsonResponse, Representation, Request, User
|
||||
|
||||
### Community 608 - "Community 608"
|
||||
Cohesion: 0.43
|
||||
Nodes (3): SmsLogRepository, SmsLog, ManagerRegistry
|
||||
|
||||
### Community 612 - "Community 612"
|
||||
Cohesion: 0.67
|
||||
Nodes (3): بکاند, فرانتاند, وضعیت فعلی کد (مهم — قبل از تغییر بخوان)
|
||||
@@ -2771,10 +2779,6 @@ Nodes (3): بکاند, فرانتاند, وضعیت فعلی کد (مهم
|
||||
Cohesion: 0.16
|
||||
Nodes (5): ServiceItemDeleteCleanupTest, ServiceCoverageNPlusOneTest, TenantServiceCoverageRepository, ManagerRegistry, TenantServiceCoverage
|
||||
|
||||
### Community 625 - "Community 625"
|
||||
Cohesion: 0.48
|
||||
Nodes (3): SmsSettingsRepository, SmsSettings, ManagerRegistry
|
||||
|
||||
### Community 631 - "Community 631"
|
||||
Cohesion: 0.50
|
||||
Nodes (4): GET `/api/v1/admin/representations`, Query Parameters, Representation Management, Response `200`
|
||||
@@ -2859,21 +2863,13 @@ Nodes (3): TagRepository, ManagerRegistry, Tag
|
||||
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 667 - "Community 667"
|
||||
Cohesion: 0.40
|
||||
Nodes (5): DELETE `/api/v1/billing/tenant-insurances/{uuid}`, GET `/api/v1/billing/tenant-insurances`, PATCH `/api/v1/billing/tenant-insurances/{uuid}`, POST `/api/v1/billing/tenant-insurances`, TenantInsurance — قراردادهای بیمهی tenant (فاز ۱ سیستم صورتحساب)
|
||||
|
||||
### Community 672 - "Community 672"
|
||||
Cohesion: 0.50
|
||||
Nodes (4): GET `/api/v1/admin/settlements`, Query Parameters, Response `200`, Settlement Management
|
||||
|
||||
### Community 673 - "Community 673"
|
||||
Cohesion: 0.15
|
||||
Nodes (3): LoggerInterface, RanginehProvider, ApiIrService
|
||||
Cohesion: 0.40
|
||||
Nodes (5): Errors, PATCH `/api/v1/appointment/{uuid}/status`, Path Parameters, Request Body, Response `200`
|
||||
|
||||
### Community 674 - "Community 674"
|
||||
Cohesion: 0.50
|
||||
@@ -2912,8 +2908,8 @@ Cohesion: 0.50
|
||||
Nodes (4): Errors, PATCH `/api/v1/admin/insurance/{id}`, Path Parameters, Response `200`
|
||||
|
||||
### Community 688 - "Community 688"
|
||||
Cohesion: 0.33
|
||||
Nodes (3): Closure, CorsRegexEnvProcessor, EnvVarProcessorInterface
|
||||
Cohesion: 0.40
|
||||
Nodes (5): Errors, Path Parameters, POST `/api/v1/like/{commentUuid}`, Request Body (`application/json`), Response `200`
|
||||
|
||||
### Community 689 - "Community 689"
|
||||
Cohesion: 0.50
|
||||
@@ -2948,16 +2944,16 @@ Cohesion: 0.43
|
||||
Nodes (3): SmsMessageController, JsonResponse, Request
|
||||
|
||||
### Community 698 - "Community 698"
|
||||
Cohesion: 0.43
|
||||
Nodes (3): InvoiceService, Invoice, PatientSession
|
||||
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 699 - "Community 699"
|
||||
Cohesion: 0.33
|
||||
Nodes (6): GET /api/v1/sms/balance — موجودی حساب پیامک, POST /api/v1/sms/queue — افزودن به صف, ۴. سیستم حساب و صف پیامک, ۴.۱ حساب پیامک (SMS Account), ۴.۲ صف پیامک (SMS Queue), ۴.۳ API پیامک
|
||||
|
||||
### Community 701 - "Community 701"
|
||||
Cohesion: 0.53
|
||||
Nodes (4): Money, BillingCalculator, CoverageRule, ShareBreakdown
|
||||
Cohesion: 0.50
|
||||
Nodes (4): extra, symfony, allow-contrib, require
|
||||
|
||||
### Community 702 - "Community 702"
|
||||
Cohesion: 0.53
|
||||
@@ -2979,13 +2975,9 @@ Nodes (5): 37. 🔵 `POST` post, Request Body, مثال Request, هدرهای ا
|
||||
Cohesion: 0.40
|
||||
Nodes (5): ۲.۸ تنظیمات نوبت (Appointment Settings), ۲.۸.۱ برنامه هفتگی (Weekly Schedule), ۲.۸.۲ تعطیلات (Holidays), ۲.۸.۳ لغو تعطیل (Date Override), ۲.۸.۴ الگوریتم محاسبه اسلاتهای خالی
|
||||
|
||||
### Community 708 - "Community 708"
|
||||
Cohesion: 0.40
|
||||
Nodes (3): Props, StatTone, TONE
|
||||
|
||||
### Community 709 - "Community 709"
|
||||
Cohesion: 0.50
|
||||
Nodes (4): DELETE `/api/v1/admin/clinic/invitation/{invUuid}`, Errors, Path Parameters, Response `204`
|
||||
### Community 707 - "Community 707"
|
||||
Cohesion: 0.67
|
||||
Nodes (3): 33. 🔵 `POST` image_clinic, هدرهای اضافی, پاسخها
|
||||
|
||||
### Community 710 - "Community 710"
|
||||
Cohesion: 0.50
|
||||
@@ -3023,10 +3015,6 @@ Nodes (4): ۲.۱۳ نظرات، لایک و امتیازدهی, ۲.۱۳.۱ نظ
|
||||
Cohesion: 0.67
|
||||
Nodes (3): 34. 🔵 `POST` image logo, هدرهای اضافی, پاسخها
|
||||
|
||||
### Community 722 - "Community 722"
|
||||
Cohesion: 0.67
|
||||
Nodes (3): 36. 🟢 `GET` get my rate, هدرهای اضافی, پاسخها
|
||||
|
||||
### Community 723 - "Community 723"
|
||||
Cohesion: 0.67
|
||||
Nodes (3): 42. 🔴 `DELETE` delete, هدرهای اضافی, پاسخها
|
||||
@@ -3038,21 +3026,21 @@ Nodes (3): 43. 🟢 `GET` get, هدرهای اضافی, پاسخها
|
||||
## Knowledge Gaps
|
||||
- **3927 isolated node(s):** `ALLOWED_ROLES`, `Pricing`, `ImageCropModalProps`, `TenantInsurance`, `CoverageRow` (+3922 more)
|
||||
These have ≤1 connection - possible missing edges or undocumented components.
|
||||
- **140 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
|
||||
- **138 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 654`, `Community 655`, `Community 15`, `Community 20`, `Community 22`, `Community 26`, `Community 164`, `Community 295`, `Community 424`, `Community 300`, `Community 697`, `Community 58`, `Community 59`, `Community 63`, `Community 64`, `Community 75`, `Community 77`, `Community 607`, `Community 225`, `Community 227`, `Community 230`, `Community 104`, `Community 107`, `Community 109`, `Community 121`, `Community 122`, `Community 252`?**
|
||||
_High betweenness centrality (0.029) - this node is a cross-community bridge._
|
||||
- **Why does `ApiTestCase` connect `Community 86` to `Community 352`, `Community 609`, `Community 541`, `Community 707`, `Community 484`, `Community 41`, `Community 618`, `Community 397`, `Community 497`, `Community 594`, `Community 562`, `Community 82`, `Community 565`, `Community 371`, `Community 535`, `Community 573`, `Community 574`, `Community 575`?**
|
||||
- **Why does `BaseController` connect `Community 108` to `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 424`, `Community 169`, `Community 300`, `Community 308`, `Community 697`, `Community 58`, `Community 59`, `Community 63`, `Community 64`, `Community 75`, `Community 77`, `Community 607`, `Community 225`, `Community 227`, `Community 230`, `Community 104`, `Community 107`, `Community 109`, `Community 245`, `Community 121`, `Community 122`, `Community 252`?**
|
||||
_High betweenness centrality (0.030) - this node is a cross-community bridge._
|
||||
- **Why does `Version20260705070546` connect `Community 646` to `Community 399`?**
|
||||
_High betweenness centrality (0.017) - this node is a cross-community bridge._
|
||||
- **Why does `Version20260705070546` connect `Community 646` to `Community 421`?**
|
||||
- **Why does `ApiTestCase` connect `Community 86` to `Community 352`, `Community 609`, `Community 541`, `Community 484`, `Community 535`, `Community 41`, `Community 618`, `Community 397`, `Community 497`, `Community 594`, `Community 562`, `Community 82`, `Community 565`, `Community 371`, `Community 22`, `Community 573`, `Community 574`, `Community 575`?**
|
||||
_High betweenness centrality (0.017) - this node is a cross-community bridge._
|
||||
- **What connects `ALLOWED_ROLES`, `Pricing`, `ImageCropModalProps` to the rest of the system?**
|
||||
_3927 weakly-connected nodes found - possible documentation gaps or missing edges._
|
||||
- **Should `Community 0` be split into smaller, more focused modules?**
|
||||
_Cohesion score 0.05387205387205387 - nodes in this community are weakly interconnected._
|
||||
_Cohesion score 0.05200501253132832 - 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?**
|
||||
|
||||
graphify-out/cache/ast/v0.8.44/22349e84d7bcc71d5c70a286e38f703b30448a5caa66ba9714b8bb805a37f0a3.json
Vendored
+1
File diff suppressed because one or more lines are too long
graphify-out/cache/ast/v0.8.44/6e2891f2f0fa975f1df27ed9fdae31399685c56c6e91da5c5246b82f3e6166d3.json
Vendored
+1
File diff suppressed because one or more lines are too long
graphify-out/cache/ast/v0.8.44/7a5d7ecd883d5bef0bf174cf885ca7fcc8438f14e6f71311f8f2e3fdff69a047.json
Vendored
+1
File diff suppressed because one or more lines are too long
graphify-out/cache/ast/v0.8.44/937dcaa8618c78e6ac393fe1f6ef06bfa398cc5c392fb469be504d05bd8384ba.json
Vendored
+1
File diff suppressed because one or more lines are too long
graphify-out/cache/ast/v0.8.44/a6c7a952cde6271304b2dae10c16c2d173c832dfb130cefd3e1fb946237ee8b3.json
Vendored
+1
File diff suppressed because one or more lines are too long
graphify-out/cache/ast/v0.8.44/bb677fe6041e10d486539f4125654adbad48125481c892c44ded8f61452409ec.json
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_hamed_pj_my_pj_clinic_pro_clinicpro_migrations_version20260707202553_php", "label": "Version20260707202553.php", "file_type": "code", "source_file": "migrations/Version20260707202553.php", "source_location": "L1"}, {"id": "migrations_version20260707202553_version20260707202553", "label": "Version20260707202553", "file_type": "code", "source_file": "migrations/Version20260707202553.php", "source_location": "L13"}, {"id": "abstractmigration", "label": "AbstractMigration", "file_type": "code", "source_file": "", "source_location": ""}, {"id": "migrations_version20260707202553_version20260707202553_getdescription", "label": ".getDescription()", "file_type": "code", "source_file": "migrations/Version20260707202553.php", "source_location": "L15"}, {"id": "migrations_version20260707202553_version20260707202553_up", "label": ".up()", "file_type": "code", "source_file": "migrations/Version20260707202553.php", "source_location": "L20"}, {"id": "schema", "label": "Schema", "file_type": "code", "source_file": "migrations/Version20260707202553.php", "source_location": "L20"}, {"id": "migrations_version20260707202553_version20260707202553_down", "label": ".down()", "file_type": "code", "source_file": "migrations/Version20260707202553.php", "source_location": "L26"}], "edges": [{"source": "users_hamed_pj_my_pj_clinic_pro_clinicpro_migrations_version20260707202553_php", "target": "schema", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "migrations/Version20260707202553.php", "source_location": "L7", "weight": 1.0}, {"source": "users_hamed_pj_my_pj_clinic_pro_clinicpro_migrations_version20260707202553_php", "target": "abstractmigration", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "migrations/Version20260707202553.php", "source_location": "L8", "weight": 1.0}, {"source": "users_hamed_pj_my_pj_clinic_pro_clinicpro_migrations_version20260707202553_php", "target": "migrations_version20260707202553_version20260707202553", "relation": "contains", "confidence": "EXTRACTED", "source_file": "migrations/Version20260707202553.php", "source_location": "L13", "weight": 1.0}, {"source": "migrations_version20260707202553_version20260707202553", "target": "abstractmigration", "relation": "inherits", "confidence": "EXTRACTED", "source_file": "migrations/Version20260707202553.php", "source_location": "L13", "weight": 1.0}, {"source": "migrations_version20260707202553_version20260707202553", "target": "migrations_version20260707202553_version20260707202553_getdescription", "relation": "method", "confidence": "EXTRACTED", "source_file": "migrations/Version20260707202553.php", "source_location": "L15", "weight": 1.0}, {"source": "migrations_version20260707202553_version20260707202553", "target": "migrations_version20260707202553_version20260707202553_up", "relation": "method", "confidence": "EXTRACTED", "source_file": "migrations/Version20260707202553.php", "source_location": "L20", "weight": 1.0}, {"source": "migrations_version20260707202553_version20260707202553_up", "target": "schema", "relation": "references", "confidence": "EXTRACTED", "source_file": "migrations/Version20260707202553.php", "source_location": "L20", "weight": 1.0, "context": "parameter_type"}, {"source": "migrations_version20260707202553_version20260707202553", "target": "migrations_version20260707202553_version20260707202553_down", "relation": "method", "confidence": "EXTRACTED", "source_file": "migrations/Version20260707202553.php", "source_location": "L26", "weight": 1.0}, {"source": "migrations_version20260707202553_version20260707202553_down", "target": "schema", "relation": "references", "confidence": "EXTRACTED", "source_file": "migrations/Version20260707202553.php", "source_location": "L26", "weight": 1.0, "context": "parameter_type"}], "raw_calls": [{"caller_nid": "migrations_version20260707202553_version20260707202553_up", "callee": "addSql", "is_member_call": true, "source_file": "/Users/hamed/pj/my_pj/clinic_pro/clinicpro/migrations/Version20260707202553.php", "source_location": "L23", "receiver": null}, {"caller_nid": "migrations_version20260707202553_version20260707202553_down", "callee": "addSql", "is_member_call": true, "source_file": "/Users/hamed/pj/my_pj/clinic_pro/clinicpro/migrations/Version20260707202553.php", "source_location": "L29", "receiver": null}]}
|
||||
graphify-out/cache/ast/v0.8.44/e6a7bc771a3d4c785af5c6b7db13dca677e1953b2cfb26e604cb353c2e5a6bd4.json
Vendored
+1
File diff suppressed because one or more lines are too long
Vendored
+1
-1
File diff suppressed because one or more lines are too long
+910
-705
File diff suppressed because it is too large
Load Diff
+23
-18
@@ -360,8 +360,8 @@
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"assets/admin/pages/SmsPage.tsx": {
|
||||
"mtime": 1783237919.164836,
|
||||
"ast_hash": "315c9186b87f6f9fab6d42cc72407fbc",
|
||||
"mtime": 1783456019.0330083,
|
||||
"ast_hash": "0da4f817e6e93c284de56b39a6cefdb1",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"assets/admin/pages/SmsWalletPage.tsx": {
|
||||
@@ -400,8 +400,8 @@
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"assets/admin/types/index.ts": {
|
||||
"mtime": 1783236968.6643784,
|
||||
"ast_hash": "ae716d8c32e4747984bba610dac11fe9",
|
||||
"mtime": 1783456035.9569273,
|
||||
"ast_hash": "576af13ec86ba70117b1a421e6044513",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"assets/app.js": {
|
||||
@@ -810,8 +810,8 @@
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"src/Admin/Controller/AdminApiController.php": {
|
||||
"mtime": 1783010796.434586,
|
||||
"ast_hash": "dd608da59b6af600e7a755b63ad0973a",
|
||||
"mtime": 1783455997.6031876,
|
||||
"ast_hash": "b17487b206b1483b616160fabb15f429",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"src/Admin/Controller/AdminController.php": {
|
||||
@@ -1615,8 +1615,8 @@
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"src/Sms/Entity/SmsLog.php": {
|
||||
"mtime": 1783012949.94825,
|
||||
"ast_hash": "38a0149a5bffac7b9079a0628ee8a268",
|
||||
"mtime": 1783455929.8241177,
|
||||
"ast_hash": "0a5a6cbc16c855f816775cd9ccd7624c",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"src/Sms/Entity/SmsMessageTemplate.php": {
|
||||
@@ -1700,8 +1700,8 @@
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"src/Sms/Service/SmsService.php": {
|
||||
"mtime": 1783422449.654906,
|
||||
"ast_hash": "2ecc3be9f619c38c0b629ea31a5e1d03",
|
||||
"mtime": 1783455940.747217,
|
||||
"ast_hash": "213ecde89c4b26796a9f5e03817827e7",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"src/Sms/Service/SmsTextResolver.php": {
|
||||
@@ -2340,8 +2340,8 @@
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"docs/api/admin.md": {
|
||||
"mtime": 1783010796.4335458,
|
||||
"ast_hash": "9ea60f062cfff03f17720e9931e1c262",
|
||||
"mtime": 1783456077.2420146,
|
||||
"ast_hash": "696cb26081d025472722594dfdc32152",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"docs/api/appointment-settings.md": {
|
||||
@@ -2440,8 +2440,8 @@
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"docs/api/sms.md": {
|
||||
"mtime": 1783422271.8648708,
|
||||
"ast_hash": "c9074f705b1ecb69fff198b4de732136",
|
||||
"mtime": 1783456091.000156,
|
||||
"ast_hash": "e334c0fdbd22436a5ab549bbe972ac3f",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"docs/api/specialty.md": {
|
||||
@@ -3245,8 +3245,8 @@
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"docker-compose.yml": {
|
||||
"mtime": 1782647901.237114,
|
||||
"ast_hash": "660297f246a6e4ee3ea0115c5f69bb90",
|
||||
"mtime": 1783423988.4158766,
|
||||
"ast_hash": "48e25fb1dd10344609d90029ce6775f0",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"docs/DEPLOY.md": {
|
||||
@@ -3640,8 +3640,8 @@
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"tests/Sms/SmsServiceLookupOnlyTest.php": {
|
||||
"mtime": 1783422346.6194532,
|
||||
"ast_hash": "9438dc12e73d86d85511144e7cc66a1a",
|
||||
"mtime": 1783456125.4436045,
|
||||
"ast_hash": "15769369cfd4970b7671b23a7cf1c9f2",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
".claude/prompt/clinic-pro-promo-video.md": {
|
||||
@@ -3718,5 +3718,10 @@
|
||||
"mtime": 1783423233.682262,
|
||||
"ast_hash": "21ec0778cfc1438f1f8a55c8c0adf55f",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"migrations/Version20260707202553.php": {
|
||||
"mtime": 1783455961.508537,
|
||||
"ast_hash": "4605818ccef5ca2f2827aff768ae5279",
|
||||
"semantic_hash": ""
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace DoctrineMigrations;
|
||||
|
||||
use Doctrine\DBAL\Schema\Schema;
|
||||
use Doctrine\Migrations\AbstractMigration;
|
||||
|
||||
/**
|
||||
* Auto-generated Migration: Please modify to your needs!
|
||||
*/
|
||||
final class Version20260707202553 extends AbstractMigration
|
||||
{
|
||||
public function getDescription(): string
|
||||
{
|
||||
return '';
|
||||
}
|
||||
|
||||
public function up(Schema $schema): void
|
||||
{
|
||||
// this up() migration is auto-generated, please modify it to your needs
|
||||
$this->addSql('ALTER TABLE sms_logs ADD template_code VARCHAR(100) DEFAULT NULL');
|
||||
}
|
||||
|
||||
public function down(Schema $schema): void
|
||||
{
|
||||
// this down() migration is auto-generated, please modify it to your needs
|
||||
$this->addSql('ALTER TABLE sms_logs DROP template_code');
|
||||
}
|
||||
}
|
||||
@@ -1466,7 +1466,7 @@ class AdminApiController extends BaseController
|
||||
$tag = trim((string) $request->query->get('tag', ''));
|
||||
|
||||
$qb = $this->em->createQueryBuilder()
|
||||
->select('s.uuid, s.mobile, s.message, s.provider, s.success, s.tag, s.createdAt')
|
||||
->select('s.uuid, s.mobile, s.message, s.provider, s.success, s.tag, s.templateCode, s.createdAt')
|
||||
->from(SmsLog::class, 's')
|
||||
->orderBy('s.createdAt', 'DESC');
|
||||
|
||||
@@ -1486,6 +1486,7 @@ class AdminApiController extends BaseController
|
||||
'status' => $l['success'] ? 'sent' : 'failed',
|
||||
'provider' => $l['provider'],
|
||||
'tag' => $l['tag'],
|
||||
'template' => $l['templateCode'],
|
||||
'sent_at' => date('c', (int) $l['createdAt']),
|
||||
'created_at' => date('c', (int) $l['createdAt']),
|
||||
], $rows);
|
||||
|
||||
@@ -58,6 +58,10 @@ class SmsLog
|
||||
#[ORM\Column(name: 'template_uuid', type: 'string', length: 36, nullable: true)]
|
||||
private ?string $templateUuid = null;
|
||||
|
||||
// نام تمپلت VerifyLookup کاوهنگار که این پیامک با آن ارسال شده (مثلاً clinicpro-otp)؛ null اگر ارسال نشده.
|
||||
#[ORM\Column(name: 'template_code', type: 'string', length: 100, nullable: true)]
|
||||
private ?string $templateCode = null;
|
||||
|
||||
#[ORM\Column(type: 'string', length: 30, options: ['default' => self::TAG_GLOBAL])]
|
||||
private string $tag = self::TAG_GLOBAL;
|
||||
|
||||
@@ -76,6 +80,8 @@ class SmsLog
|
||||
}
|
||||
|
||||
public function setTemplateUuid(?string $v): self { $this->templateUuid = $v; return $this; }
|
||||
public function setTemplateCode(?string $v): self { $this->templateCode = $v; return $this; }
|
||||
public function getTemplateCode(): ?string { return $this->templateCode; }
|
||||
public function getTag(): string { return $this->tag; }
|
||||
public function setTag(string $v): self { $this->tag = $v; return $this; }
|
||||
|
||||
@@ -88,6 +94,7 @@ class SmsLog
|
||||
'provider' => $this->provider,
|
||||
'success' => $this->success,
|
||||
'template_uuid' => $this->templateUuid,
|
||||
'template_code' => $this->templateCode,
|
||||
'tag' => $this->tag,
|
||||
'created_at' => $this->createdAt,
|
||||
];
|
||||
|
||||
@@ -97,6 +97,7 @@ class SmsService
|
||||
|
||||
$log = new SmsLog($msg->mobile, $msg->message, $provider->getName(), $success, $msg->tag);
|
||||
if ($msg->templateUuid) $log->setTemplateUuid($msg->templateUuid);
|
||||
if ($msg->templateCode) $log->setTemplateCode($msg->templateCode);
|
||||
$this->logRepo->save($log);
|
||||
|
||||
return $success;
|
||||
|
||||
@@ -71,7 +71,10 @@ class SmsServiceLookupOnlyTest extends TestCase
|
||||
$this->kavenegar->expects($this->once())->method('sendTemplate')
|
||||
->with('09120000000', 'clinicpro-otp', ['token' => '1234'])
|
||||
->willReturn(true);
|
||||
$this->logRepo->expects($this->once())->method('save');
|
||||
|
||||
$captured = null;
|
||||
$this->logRepo->expects($this->once())->method('save')
|
||||
->willReturnCallback(function (SmsLog $log) use (&$captured) { $captured = $log; });
|
||||
|
||||
$msg = new SendSmsMessage(
|
||||
'09120000000', 'code 1234', 'kavenegar',
|
||||
@@ -79,6 +82,8 @@ class SmsServiceLookupOnlyTest extends TestCase
|
||||
);
|
||||
|
||||
$this->assertTrue($this->service->sendNow($msg));
|
||||
// template بهکاررفته باید در SmsLog ثبت شود تا در پنل ادمین دیده شود.
|
||||
$this->assertSame('clinicpro-otp', $captured->toArray()['template_code']);
|
||||
}
|
||||
|
||||
public function testDispatchTemplateForTagWithoutTemplateDoesNotEnqueueAndLogsFailure(): void
|
||||
|
||||
Reference in New Issue
Block a user