Explorar el Código

tela de logs de importacoes

Gustavo Zanatta hace 1 mes
padre
commit
6937c11c22

+ 1 - 1
app/Http/Controllers/AssociadoImportController.php

@@ -22,7 +22,7 @@ class AssociadoImportController extends Controller
 
         Cache::put($importId, ['status' => 'pending'], now()->addDay());
 
-        SyncAssociadosJob::dispatch($filePath, $importId);
+        SyncAssociadosJob::dispatch($filePath, $importId, auth()->id());
 
         return $this->successResponse(
             payload: ['import_id' => $importId],

+ 21 - 0
app/Http/Controllers/ImportLogController.php

@@ -0,0 +1,21 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Models\ImportLog;
+use Illuminate\Http\JsonResponse;
+
+class ImportLogController extends Controller
+{
+    public function index(string $type): JsonResponse
+    {
+        $perPage = (int) request('per_page', 10);
+
+        $logs = ImportLog::where('type', $type)
+            ->with('user:id,name')
+            ->orderByDesc('imported_at')
+            ->paginate($perPage);
+
+        return $this->successResponse(payload: $logs);
+    }
+}

+ 2 - 2
app/Http/Controllers/PartnerImportController.php

@@ -23,7 +23,7 @@ class PartnerImportController extends Controller
 
         Cache::put($importId, ['status' => 'pending'], now()->addDay());
 
-        SyncParceirosJob::dispatch($filePath, $importId);
+        SyncParceirosJob::dispatch($filePath, $importId, auth()->id());
 
         return $this->successResponse(
             payload: ['import_id' => $importId],
@@ -42,7 +42,7 @@ class PartnerImportController extends Controller
 
         Cache::put($importId, ['status' => 'pending'], now()->addDay());
 
-        SyncConveniosMedicosJob::dispatch($filePath, $importId);
+        SyncConveniosMedicosJob::dispatch($filePath, $importId, auth()->id());
 
         return $this->successResponse(
             payload: ['import_id' => $importId],

+ 14 - 0
app/Jobs/BaseImportJob.php

@@ -2,6 +2,7 @@
 
 namespace App\Jobs;
 
+use App\Models\ImportLog;
 use Illuminate\Bus\Queueable;
 use Illuminate\Contracts\Queue\ShouldQueue;
 use Illuminate\Foundation\Bus\Dispatchable;
@@ -22,6 +23,7 @@ abstract class BaseImportJob implements ShouldQueue
     public function __construct(
         protected string $filePath,
         protected string $importId,
+        protected int $userId,
     ) {}
 
     public function handle(): void
@@ -31,6 +33,16 @@ abstract class BaseImportJob implements ShouldQueue
         try {
             $stats = $this->runSync($this->filePath);
 
+            ImportLog::create([
+                'type'        => $this->getImportType(),
+                'user_id'     => $this->userId,
+                'total'       => $stats['total'] ?? 0,
+                'created'     => $stats['created'] ?? 0,
+                'updated'     => $stats['updated'] ?? 0,
+                'inactivated' => $stats['inactivated'] ?? 0,
+                'imported_at' => now(),
+            ]);
+
             Cache::put($this->importId, [
                 'status' => 'completed',
                 'stats'  => $stats,
@@ -52,6 +64,8 @@ abstract class BaseImportJob implements ShouldQueue
 
     abstract protected function runSync(string $filePath): array;
 
+    abstract protected function getImportType(): string;
+
     private function cleanupFile(): void
     {
         Storage::delete($this->filePath);

+ 5 - 0
app/Jobs/SyncAssociadosJob.php

@@ -6,6 +6,11 @@ use App\Services\AssociadoImportService;
 
 class SyncAssociadosJob extends BaseImportJob
 {
+    protected function getImportType(): string
+    {
+        return 'associado';
+    }
+
     protected function runSync(string $filePath): array
     {
         return app(AssociadoImportService::class)->syncFromExcel($filePath);

+ 12 - 1
app/Jobs/SyncConveniosMedicosJob.php

@@ -6,8 +6,19 @@ use App\Services\ConveniosMedicosImportService;
 
 class SyncConveniosMedicosJob extends BaseImportJob
 {
+    protected function getImportType(): string
+    {
+        return 'convenio';
+    }
+
     protected function runSync(string $filePath): array
     {
-        return app(ConveniosMedicosImportService::class)->syncFromExcel($filePath);
+        $stats = app(ConveniosMedicosImportService::class)->syncFromExcel($filePath);
+
+        $stats['created']     = $stats['partners_created'];
+        $stats['updated']     = $stats['partners_updated'];
+        $stats['inactivated'] = $stats['partners_inactivated'];
+
+        return $stats;
     }
 }

+ 5 - 0
app/Jobs/SyncParceirosJob.php

@@ -6,6 +6,11 @@ use App\Services\ParceirosImportService;
 
 class SyncParceirosJob extends BaseImportJob
 {
+    protected function getImportType(): string
+    {
+        return 'parceiro';
+    }
+
     protected function runSync(string $filePath): array
     {
         return app(ParceirosImportService::class)->syncFromExcel($filePath);

+ 28 - 0
app/Models/ImportLog.php

@@ -0,0 +1,28 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\Relations\BelongsTo;
+
+class ImportLog extends Model
+{
+    protected $fillable = [
+        'type',
+        'user_id',
+        'total',
+        'created',
+        'updated',
+        'inactivated',
+        'imported_at',
+    ];
+
+    protected $casts = [
+        'imported_at' => 'datetime',
+    ];
+
+    public function user(): BelongsTo
+    {
+        return $this->belongsTo(User::class);
+    }
+}

+ 5 - 2
app/Services/AssociadoImportService.php

@@ -58,8 +58,10 @@ class AssociadoImportService
                     $changed = true;
                 }
 
-                $user->expiry_date = $expiryDate;
-                $changed = true;
+                if ($user->expiry_date?->toDateString() !== $expiryDate) {
+                    $user->expiry_date = $expiryDate;
+                    $changed = true;
+                }
 
                 if ($changed) {
                     $user->save();
@@ -95,6 +97,7 @@ class AssociadoImportService
             ]);
 
         return [
+            'total'       => $rows->count(),
             'created'     => $created,
             'updated'     => $updated,
             'inactivated' => $inactivated,

+ 14 - 4
app/Services/ConveniosMedicosImportService.php

@@ -124,14 +124,18 @@ class ConveniosMedicosImportService
         $importedPartnerIds = [];
 
         foreach ($clinicGroups as $clinicName => $clinicData) {
-            [$partner, $isNew] = $this->upsertPartner($clinicName, [
+            [$partner, $isNew, $wasModified] = $this->upsertPartner($clinicName, [
                 'phone'       => $clinicData['phone'],
                 'address'     => $clinicData['address'],
                 'category_id' => $convMedicaCategory->id,
             ], 'agreement');
 
             $importedPartnerIds[] = $partner->id;
-            $isNew ? $stats['partners_created']++ : $stats['partners_updated']++;
+            if ($isNew) {
+                $stats['partners_created']++;
+            } elseif ($wasModified) {
+                $stats['partners_updated']++;
+            }
 
             $processedServiceIds = [];
 
@@ -186,14 +190,18 @@ class ConveniosMedicosImportService
         }
 
         foreach ($labRows as $labData) {
-            [$partner, $isNew] = $this->upsertPartner($labData['name'], [
+            [$partner, $isNew, $wasModified] = $this->upsertPartner($labData['name'], [
                 'phone'       => $labData['phone'],
                 'address'     => $labData['address'],
                 'category_id' => $labCategory->id,
             ], 'agreement');
 
             $importedPartnerIds[] = $partner->id;
-            $isNew ? $stats['partners_created']++ : $stats['partners_updated']++;
+            if ($isNew) {
+                $stats['partners_created']++;
+            } elseif ($wasModified) {
+                $stats['partners_updated']++;
+            }
         }
 
         if (!empty($importedPartnerIds)) {
@@ -206,6 +214,8 @@ class ConveniosMedicosImportService
                 ->update(['status' => PartnerAgreementStatusEnum::INACTIVE]);
         }
 
+        $stats['total'] = $rows->count();
+
         return $stats;
     }
 }

+ 7 - 2
app/Services/ParceirosImportService.php

@@ -55,14 +55,18 @@ class ParceirosImportService
                 continue;
             }
 
-            [$partner, $isNew] = $this->upsertPartner($col0, [
+            [$partner, $isNew, $wasModified] = $this->upsertPartner($col0, [
                 'description' => $col1 ?: null,
                 'phone'       => $col2 ?: null,
                 'category_id' => $currentCategoryId,
             ], 'partner');
 
             $importedPartnerIds[] = $partner->id;
-            $isNew ? $created++ : $updated++;
+            if ($isNew) {
+                $created++;
+            } elseif ($wasModified) {
+                $updated++;
+            }
         }
 
         $inactivated = 0;
@@ -74,6 +78,7 @@ class ParceirosImportService
         }
 
         return [
+            'total'       => $rows->count(),
             'created'     => $created,
             'updated'     => $updated,
             'inactivated' => $inactivated,

+ 11 - 3
app/Traits/ImportsPartners.php

@@ -19,16 +19,24 @@ trait ImportsPartners
             ->first();
 
         if ($partner) {
+            $wasModified = false;
+
             if ($partner->trashed()) {
                 $partner->restore();
+                $wasModified = true;
             }
 
-            $partner->update(array_merge($data, [
+            $partner->fill(array_merge($data, [
                 'type'   => $type,
                 'status' => PartnerAgreementStatusEnum::ACTIVE,
             ]));
 
-            return [$partner->fresh(), false];
+            if ($partner->isDirty()) {
+                $partner->save();
+                $wasModified = true;
+            }
+
+            return [$partner, false, $wasModified];
         }
 
         $user = $this->findOrCreateUser($companyName);
@@ -40,7 +48,7 @@ trait ImportsPartners
             'status'       => PartnerAgreementStatusEnum::ACTIVE,
         ]));
 
-        return [$partner, true];
+        return [$partner, true, true];
     }
 
     private function findOrCreateUser(string $companyName): User

+ 28 - 0
database/migrations/2026_06_18_000001_create_import_logs_table.php

@@ -0,0 +1,28 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    public function up(): void
+    {
+        Schema::create('import_logs', function (Blueprint $table) {
+            $table->id();
+            $table->string('type');
+            $table->foreignId('user_id')->nullable()->constrained('users')->nullOnDelete();
+            $table->unsignedInteger('total')->default(0);
+            $table->unsignedInteger('created')->default(0);
+            $table->unsignedInteger('updated')->default(0);
+            $table->unsignedInteger('inactivated')->default(0);
+            $table->timestamp('imported_at');
+            $table->timestamps();
+        });
+    }
+
+    public function down(): void
+    {
+        Schema::dropIfExists('import_logs');
+    }
+};

+ 8 - 0
routes/authRoutes/import_log.php

@@ -0,0 +1,8 @@
+<?php
+
+use App\Http\Controllers\ImportLogController;
+use Illuminate\Support\Facades\Route;
+
+Route::controller(ImportLogController::class)->prefix('import-logs')->group(function () {
+    Route::get('/{type}', 'index');
+});