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:
hamed
2026-07-08 00:03:33 +03:30
parent 2982eaa7e3
commit a2c809b7de
21 changed files with 1092 additions and 840 deletions
+1
View File
@@ -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) },
];
+1
View File
@@ -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;
}
+2
View File
@@ -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).
---
+2
View File
@@ -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
-4
View File
@@ -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
View File
@@ -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?**
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_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}]}
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
+910 -705
View File
File diff suppressed because it is too large Load Diff
+23 -18
View File
@@ -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": ""
}
}
+31
View File
@@ -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');
}
}
+2 -1
View File
@@ -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);
+7
View File
@@ -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,
];
+1
View File
@@ -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;
+6 -1
View File
@@ -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