تعداد جست‌وجوی بازبینی‌شده. * * @var array */ private const REVIEWED = [ // AppointmentController دیگر جست‌وجوی بازبینی‌نشده ندارد: assertServicesMatchContext // حذف شد و مسیر ثبت نوبت هم مثل مسیر اسلات از ServiceBookingCalculator رد می‌شود، // که خودش مالکیت محیط را می‌سنجد و پایین‌تر شمرده می‌شود. // TenantOwnershipChecker::belongsToPair() روی هر uuid، پیش از هر بررسی دیگر 'src/Appointment/Service/ServiceBookingCalculator.php' => 2, // TenantOwnershipChecker روی بخش/سرویس/پرسنل و فهرست سرویس‌ها 'src/Appointment/Controller/MyAppointmentsController.php' => 1, // ownsSession / getEntityType روی صورتحساب، پرونده و مطالبه 'src/Billing/Controller/BillingController.php' => 3, // ownsSection ×۹ و مقایسهٔ مستقیم جفت ×۳ (پکیج، کالا، پرسنل) 'src/ClinicService/Controller/ClinicServiceController.php' => 8, 'src/Discount/Controller/DiscountController.php' => 1, // قرارداد بیمه با جفت، و سرویس با getSection()->getEntityType() 'src/Insurance/Controller/InsuranceController.php' => 5, // ownedItem() / ownedPackage() 'src/Inventory/Controller/InventoryController.php' => 2, 'src/Inventory/Service/InventoryService.php' => 1, // ownsRecord ×۳۳ و دو پرداختِ لنگرخورده به مراجعهٔ بررسی‌شده 'src/Patient/Controller/PatientController.php' => 35, // TenantOwnershipChecker در هر سه حلقه (قیمت‌گذاری، ساخت، ویرایش) + کالا 'src/Patient/Service/PatientService.php' => 5, // ownsStaff() 'src/Staff/Controller/StaffController.php' => 2, ]; private function projectDir(): string { return dirname(__DIR__, 2); } /** @return array */ private function countLookups(): array { $pattern = '/->(' . implode('|', self::TENANT_REPOSITORY_VARIABLES) . ')->findByUuid\(/'; $counts = []; $files = new \RecursiveIteratorIterator( new \RecursiveDirectoryIterator($this->projectDir() . '/src', \FilesystemIterator::SKIP_DOTS), ); foreach ($files as $file) { if ($file->getExtension() !== 'php') { continue; } $found = preg_match_all($pattern, (string) file_get_contents($file->getPathname())); if ($found > 0) { $relative = str_replace($this->projectDir() . '/', '', $file->getPathname()); $counts[$relative] = $found; } } ksort($counts); return $counts; } public function testNoUnreviewedTenantLookupExists(): void { $actual = $this->countLookups(); $expected = self::REVIEWED; ksort($expected); self::assertSame($expected, $actual, <<<'MSG' جست‌وجوی «uuid از درخواست → موجودیت محیط‌دار» تغییر کرده. برای هر مورد تازه ثابت کن محیطش بررسی می‌شود (ownsRecord/ownsSection/ ownedItem، TenantOwnershipChecker، یا لنگر به ریشهٔ بررسی‌شده) و بعد عدد همان فایل را در REVIEWED به‌روز کن. اگر عدد کم شده، فقط عدد را کم کن. MSG); } }