From 5d7d7af00c19b63818daa5bd55e81bcc8b6c6e8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Fri, 22 May 2026 15:57:48 +0300 Subject: [PATCH] =?UTF-8?q?feat(pd):=20pd=5Fprocessing=5Flog=20'deleted'?= =?UTF-8?q?=20on=20report=20file=20destroy=20(152-=D0=A4=D0=97)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/Api/ReportJobController.php | 15 ++++++- .../Feature/Pd/ReportFileDeletePdLogTest.php | 42 +++++++++++++++++++ 2 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 app/tests/Feature/Pd/ReportFileDeletePdLogTest.php diff --git a/app/app/Http/Controllers/Api/ReportJobController.php b/app/app/Http/Controllers/Api/ReportJobController.php index e038ee07..291cc738 100644 --- a/app/app/Http/Controllers/Api/ReportJobController.php +++ b/app/app/Http/Controllers/Api/ReportJobController.php @@ -8,6 +8,7 @@ use App\Http\Controllers\Controller; use App\Jobs\GenerateReportJob; use App\Models\ReportJob; use App\Models\User; +use App\Services\Pd\PdAuditLogger; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Carbon; @@ -305,12 +306,12 @@ class ReportJobController extends Controller /** * DELETE /api/reports/jobs/{id} — удалить terminal job + файл. */ - public function destroy(Request $request, int $id): JsonResponse + public function destroy(Request $request, int $id, PdAuditLogger $pdLog): JsonResponse { /** @var User $user */ $user = $request->user(); - return DB::transaction(function () use ($user, $id): JsonResponse { + return DB::transaction(function () use ($user, $id, $request, $pdLog): JsonResponse { DB::statement('SET LOCAL app.current_tenant_id = '.(int) $user->tenant_id); $job = ReportJob::query() @@ -335,6 +336,16 @@ class ReportJobController extends Controller if ($job->file_path !== null) { Storage::disk('local')->delete($job->file_path); + $pdLog->record( + action: 'deleted', + subjectType: 'lead', + subjectId: null, + purpose: 'report_file_'.$job->id, + tenantId: (int) $job->tenant_id, + actorTenantUserId: (int) $user->id, + actorAdminUserId: null, + ip: $request->ip(), + ); } $job->delete(); diff --git a/app/tests/Feature/Pd/ReportFileDeletePdLogTest.php b/app/tests/Feature/Pd/ReportFileDeletePdLogTest.php new file mode 100644 index 00000000..68409a27 --- /dev/null +++ b/app/tests/Feature/Pd/ReportFileDeletePdLogTest.php @@ -0,0 +1,42 @@ +tenant = Tenant::factory()->create(); + $this->user = User::factory()->create(['tenant_id' => $this->tenant->id]); + $this->actingAs($this->user); + DB::statement('SET app.current_tenant_id = '.(int) $this->tenant->id); +}); + +it('writes pd deleted when a report file is destroyed', function () { + $job = ReportJob::create([ + 'tenant_id' => $this->tenant->id, + 'user_id' => $this->user->id, + 'type' => 'deals_export', + 'parameters' => ['format' => 'csv', 'date_from' => '2026-04-01', 'date_to' => '2026-04-30'], + 'status' => ReportJob::STATUS_DONE, + 'file_path' => 'reports/'.(int) $this->tenant->id.'/test.csv', + ]); + + $this->deleteJson("/api/reports/jobs/{$job->id}")->assertOk(); + + $pd = DB::table('pd_processing_log') + ->where('action', 'deleted') + ->orderByDesc('id') + ->first(); + + expect($pd)->not->toBeNull() + ->and($pd->subject_type)->toBe('lead') + ->and($pd->purpose)->toBe('report_file_'.$job->id) + ->and((int) $pd->actor_tenant_user_id)->toBe($this->user->id) + ->and((int) $pd->tenant_id)->toBe((int) $this->tenant->id); +});