fix(db): purge insurance config when a doctor/clinic is deleted (H5)

tenant_insurances, entity_insurance_pricing and tenant_service_coverages
reference their owner through a polymorphic (entity_type, entity_id) pair, so no
database FK can cascade their cleanup. Hard-deleting a doctor (DoctorController)
or clinic (AdminApiController) left these rows orphaned.

Add TenantInsuranceCleanupService::purgeForEntity() and call it from both delete
paths — removes coverage (via owning tenant_insurance ids), then tenant
insurances, then pricing.

Residual (separate, lower-freq paths): deleting an insurance category or a
service_item still orphans rows that reference them by id — tracked under the
medium-tier soft-ref findings.

Regression: tests/Insurance/TenantInsuranceCleanupTest.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
hamed
2026-06-28 19:16:10 +03:30
co-authored by Claude Opus 4.8
parent d14ac38da5
commit 4cf6873900
7 changed files with 105 additions and 1 deletions
@@ -4,6 +4,8 @@ namespace App\Doctor\Controller;
use App\Appointment\Repository\WeeklyScheduleRepository;
use App\Auth\Entity\User;
use App\Insurance\Entity\TenantInsurance;
use App\Insurance\Service\TenantInsuranceCleanupService;
use App\Auth\Repository\UserRepository;
use App\Clinic\Entity\Clinic;
use App\Clinic\Repository\ClinicRepository;
@@ -39,6 +41,7 @@ class DoctorController extends BaseController
private readonly UserRepository $userRepo,
private readonly FileValidatorService $fileValidator,
private readonly WeeklyScheduleRepository $scheduleRepo,
private readonly TenantInsuranceCleanupService $insuranceCleanup,
private readonly string $projectDir,
) {}
@@ -369,6 +372,7 @@ class DoctorController extends BaseController
return $this->error(ErrorCodes::ERR_VALIDATION_002, 'دکتر یافت نشد', 404);
}
$this->insuranceCleanup->purgeForEntity(TenantInsurance::TYPE_DOCTOR, $doctor->getId());
$this->doctorRepo->remove($doctor);
return $this->success(['message' => 'دکتر با موفقیت حذف شد']);
}