Browse Source

feat: :sparkles: feat (tabelas) paginacao nas tabelas

foi criada paginacao em todas as tabelas

fase:dev | origin:escopo
Gustavo Zanatta 1 month ago
parent
commit
c6f0e0cbf5

+ 15 - 0
app/Http/Controllers/PartnerAgreementController.php

@@ -10,6 +10,7 @@ use App\Http\Resources\PartnerAgreementResource;
 use App\Services\MediaService;
 use App\Services\PartnerAgreementService;
 use Illuminate\Http\JsonResponse;
+use Illuminate\Http\Request;
 
 class PartnerAgreementController extends Controller
 {
@@ -24,6 +25,20 @@ class PartnerAgreementController extends Controller
         return $this->successResponse(payload: PartnerAgreementResource::collection($items));
     }
 
+    public function indexPaginated(Request $request): JsonResponse
+    {
+        $filters = $request->only(['search', 'expires_in_days', 'created_month']);
+        $perPage = min((int) $request->get('per_page', 10), 100);
+        $paginator = $this->service->getAllPaginated($filters, $perPage);
+
+        return $this->successResponse(payload: [
+            'data'  => PartnerAgreementResource::collection($paginator->items()),
+            'total' => $paginator->total(),
+            'from'  => $paginator->firstItem() ?? 0,
+            'to'    => $paginator->lastItem() ?? 0,
+        ]);
+    }
+
     public function store(PartnerAgreementRequest $request): JsonResponse
     {
         $item = $this->service->create($request->validated());

+ 15 - 0
app/Http/Controllers/UserController.php

@@ -7,6 +7,7 @@ use App\Services\UserService;
 use App\Http\Requests\UserRequest;
 use App\Http\Resources\UserResource;
 use Illuminate\Http\JsonResponse;
+use Illuminate\Http\Request;
 
 class UserController extends Controller
 {
@@ -60,6 +61,20 @@ class UserController extends Controller
         );
     }
 
+    public function indexPaginated(Request $request): JsonResponse
+    {
+        $filters = $request->only(['type', 'status', 'search']);
+        $perPage = min((int) $request->get('per_page', 10), 100);
+        $paginator = $this->service->getAllPaginated($filters, $perPage);
+
+        return $this->successResponse(payload: [
+            'data'  => UserResource::collection($paginator->items()),
+            'total' => $paginator->total(),
+            'from'  => $paginator->firstItem() ?? 0,
+            'to'    => $paginator->lastItem() ?? 0,
+        ]);
+    }
+
     public function getUserTypes(): JsonResponse
     {
         $user_types = $this->service->getUserTypes();

+ 28 - 0
app/Services/PartnerAgreementService.php

@@ -4,6 +4,7 @@ namespace App\Services;
 
 use App\Models\PartnerAgreement;
 use Illuminate\Database\Eloquent\Collection;
+use Illuminate\Pagination\LengthAwarePaginator;
 
 class PartnerAgreementService
 {
@@ -14,6 +15,33 @@ class PartnerAgreementService
             ->get();
     }
 
+    public function getAllPaginated(array $filters = [], int $perPage = 10): LengthAwarePaginator
+    {
+        $query = PartnerAgreement::with(['category', 'city', 'state', 'logo'])
+            ->orderBy('company_name');
+
+        if (!empty($filters['search'])) {
+            $search = $filters['search'];
+            $query->where(function ($q) use ($search) {
+                $q->where('company_name', 'like', "%{$search}%")
+                  ->orWhere('responsible', 'like', "%{$search}%")
+                  ->orWhere('cnpj', 'like', "%{$search}%");
+            });
+        }
+
+        if (!empty($filters['expires_in_days'])) {
+            $days = (int) $filters['expires_in_days'];
+            $query->whereBetween('contract_end', [now()->startOfDay(), now()->addDays($days)->endOfDay()]);
+        }
+
+        if (!empty($filters['created_month']) && $filters['created_month'] === 'current') {
+            $query->whereMonth('created_at', now()->month)
+                  ->whereYear('created_at', now()->year);
+        }
+
+        return $query->paginate($perPage);
+    }
+
     public function findById(int $id): ?PartnerAgreement
     {
         return PartnerAgreement::with(['category', 'city', 'state', 'services', 'logo', 'media'])->find($id);

+ 25 - 0
app/Services/UserService.php

@@ -20,6 +20,31 @@ class UserService
         return User::with(['position', 'sector'])->orderBy("created_at", "desc")->get();
     }
 
+    public function getAllPaginated(array $filters = [], int $perPage = 10): \Illuminate\Pagination\LengthAwarePaginator
+    {
+        $query = User::with(['position', 'sector'])->orderBy('created_at', 'desc');
+
+        if (!empty($filters['type'])) {
+            $query->where('type', $filters['type']);
+        }
+
+        if (!empty($filters['status'])) {
+            $query->where('status', $filters['status']);
+        }
+
+        if (!empty($filters['search'])) {
+            $search = $filters['search'];
+            $query->where(function ($q) use ($search) {
+                $q->where('name', 'like', "%{$search}%")
+                  ->orWhere('email', 'like', "%{$search}%")
+                  ->orWhere('cpf', 'like', "%{$search}%")
+                  ->orWhere('registration', 'like', "%{$search}%");
+            });
+        }
+
+        return $query->paginate($perPage);
+    }
+
     public function findById(int $id): ?User
     {
         return User::find($id);

+ 2 - 0
routes/authRoutes/partner_agreement.php

@@ -6,6 +6,8 @@ use Illuminate\Support\Facades\Route;
 Route::controller(PartnerAgreementController::class)->prefix('partner-agreement')->group(function () {
     Route::get('/', 'index')->middleware('permission:parceiro.convenio,view');
 
+    Route::get('/paginated', 'indexPaginated')->middleware('permission:parceiro.convenio,view');
+
     Route::post('/', 'store')->middleware('permission:parceiro.convenio,add');
 
     Route::get('/{id}', 'show')->middleware('permission:parceiro.convenio,view');

+ 2 - 0
routes/authRoutes/user.php

@@ -8,6 +8,8 @@ Route::controller(UserController::class)->prefix('user')->group(function () {
 
     Route::get('/', 'index')->middleware('permission:config.user,view');
 
+    Route::get('/paginated', 'indexPaginated')->middleware('permission:config.user,view');
+
     Route::post('/', 'store')->middleware('permission:config.user,add');
 
     Route::get('/{id}', 'show')->middleware('permission:config.user,view');