Forráskód Böngészése

feat: :sparkles: crud provider blocked days

crud provider blocked days
Gustavo Zanatta 1 hónapja
szülő
commit
06f906395c

+ 10 - 0
app/Enums/BlockedPeriodEnum.php

@@ -0,0 +1,10 @@
+<?php
+
+namespace App\Enums;
+
+enum BlockedPeriodEnum: string
+{
+    case MORNING = 'morning';
+    case AFTERNOON = 'afternoon';
+    case ALL = 'all';
+}

+ 67 - 0
app/Http/Controllers/ProviderBlockedDayController.php

@@ -0,0 +1,67 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Http\Requests\ProviderBlockedDayRequest;
+use App\Http\Resources\ProviderBlockedDayResource;
+use App\Services\ProviderBlockedDayService;
+use Illuminate\Http\JsonResponse;
+use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
+use Illuminate\Support\Facades\Log;
+
+class ProviderBlockedDayController extends Controller
+{
+    public function __construct(
+        private readonly ProviderBlockedDayService $service
+    ) {}
+
+    public function index(int $providerId): JsonResponse
+    {
+        $blockedDays = $this->service->getByProvider($providerId);
+        return $this->successResponse(
+            payload: ProviderBlockedDayResource::collection($blockedDays),
+        );
+    }
+
+    public function show(int $id): JsonResponse
+    {
+        $blockedDay = $this->service->findById($id);
+        abort_if(!$blockedDay, 404);
+        return $this->successResponse(
+            payload: new ProviderBlockedDayResource($blockedDay),
+        );
+    }
+
+    public function store(ProviderBlockedDayRequest $request): JsonResponse
+    {
+        $blockedDay = $this->service->create($request->validated());
+        return $this->successResponse(
+            payload: new ProviderBlockedDayResource($blockedDay),
+            message: __("messages.created"),
+            code: 201,
+        );
+    }
+
+    public function update(ProviderBlockedDayRequest $request, int $id): JsonResponse
+    {
+        $blockedDay = $this->service->findById($id);
+        
+        $blockedDay = $this->service->update($blockedDay, $request->validated());
+        return $this->successResponse(
+            payload: new ProviderBlockedDayResource($blockedDay),
+            message: __("messages.updated"),
+        );
+    }
+
+    public function destroy(int $id): JsonResponse
+    {
+        $blockedDay = $this->service->findById($id);
+        abort_if(!$blockedDay, 404);
+        
+        $this->service->delete($blockedDay);
+        return $this->successResponse(
+            message: __("messages.deleted"),
+            code: 204,
+        );
+    }
+}

+ 37 - 0
app/Http/Requests/ProviderBlockedDayRequest.php

@@ -0,0 +1,37 @@
+<?php
+
+namespace App\Http\Requests;
+
+use App\Enums\BlockedPeriodEnum;
+use Illuminate\Foundation\Http\FormRequest;
+use Illuminate\Validation\Rule;
+
+class ProviderBlockedDayRequest extends FormRequest
+{
+    public function authorize(): bool
+    {
+        return true;
+    }
+
+    public function rules(): array
+    {
+        $rules = [
+            'provider_id' => ['sometimes', 'exists:providers,id'],
+            'date' => ['sometimes', 'date', 'after_or_equal:today'],
+            'period' => ['sometimes', Rule::in([BlockedPeriodEnum::MORNING->value, BlockedPeriodEnum::AFTERNOON->value, BlockedPeriodEnum::ALL->value])],
+            'reason' => ['nullable', 'string'],
+            'init_hour' => ['nullable', 'date_format:H:i'],
+            'end_hour' => ['nullable', 'date_format:H:i'],
+        ];
+
+        if($this->isMethod('POST')) {
+            $rules['provider_id' ] = ['required','exists:providers,id'];
+            $rules['date'] = ['required', 'date', 'after_or_equal:today'];
+            $rules['period'] = ['required', Rule::in([BlockedPeriodEnum::MORNING->value, BlockedPeriodEnum::AFTERNOON->value, BlockedPeriodEnum::ALL->value])];
+            $rules['init_hour'] = ['required', 'date_format:H:i'];
+            $rules['end_hour'] = ['required', 'date_format:H:i'];
+        }
+
+        return $rules;
+    }
+}

+ 24 - 0
app/Http/Resources/ProviderBlockedDayResource.php

@@ -0,0 +1,24 @@
+<?php
+
+namespace App\Http\Resources;
+
+use Illuminate\Http\Request;
+use Illuminate\Http\Resources\Json\JsonResource;
+
+class ProviderBlockedDayResource extends JsonResource
+{
+    public function toArray(Request $request): array
+    {
+        return [
+            'id' => $this->id,
+            'provider_id' => $this->provider_id,
+            'date' => $this->date?->format('Y-m-d'),
+            'period' => $this->period?->value,
+            'reason' => $this->reason,
+            'init_hour' => $this->init_hour,
+            'end_hour' => $this->end_hour,
+            'created_at' => $this->created_at,
+            'updated_at' => $this->updated_at,
+        ];
+    }
+}

+ 33 - 0
app/Models/ProviderBlockedDay.php

@@ -0,0 +1,33 @@
+<?php
+
+namespace App\Models;
+
+use App\Enums\BlockedPeriodEnum;
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\Relations\BelongsTo;
+use Illuminate\Database\Eloquent\SoftDeletes;
+
+class ProviderBlockedDay extends Model
+{
+    use HasFactory, SoftDeletes;
+
+    protected $fillable = [
+        'provider_id',
+        'date',
+        'period',
+        'reason',
+        'init_hour',
+        'end_hour',
+    ];
+
+    protected $casts = [
+        'date' => 'date',
+        'period' => BlockedPeriodEnum::class,
+    ];
+
+    public function provider(): BelongsTo
+    {
+        return $this->belongsTo(Provider::class);
+    }
+}

+ 39 - 0
app/Services/ProviderBlockedDayService.php

@@ -0,0 +1,39 @@
+<?php
+
+namespace App\Services;
+
+use App\Models\ProviderBlockedDay;
+use Illuminate\Database\Eloquent\Collection;
+use Illuminate\Support\Facades\Log;
+
+class ProviderBlockedDayService
+{
+    public function getByProvider(int $providerId): Collection
+    {
+        return ProviderBlockedDay::where('provider_id', $providerId)
+            ->orderBy('date', 'asc')
+            ->orderBy('init_hour', 'asc')
+            ->get();
+    }
+
+    public function findById(int $id): ?ProviderBlockedDay
+    {
+        return ProviderBlockedDay::find($id);
+    }
+
+    public function create(array $data): ProviderBlockedDay
+    {
+        return ProviderBlockedDay::create($data);
+    }
+
+    public function update(ProviderBlockedDay $blockedDay, array $data): ProviderBlockedDay
+    {
+        $blockedDay->update($data);
+        return $blockedDay->fresh();
+    }
+
+    public function delete(ProviderBlockedDay $blockedDay): bool
+    {
+        return $blockedDay->delete();
+    }
+}

+ 36 - 0
database/migrations/2026_02_10_132743_create_provider_blocked_days_table.php

@@ -0,0 +1,36 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     */
+    public function up(): void
+    {
+        Schema::create('provider_blocked_days', function (Blueprint $table) {
+            $table->id();
+            $table->foreignId('provider_id')->constrained('providers')->onDelete('cascade');
+            $table->date('date');
+            $table->enum('period', ['morning', 'afternoon', 'all']);
+            $table->text('reason')->nullable();
+            $table->time('init_hour');
+            $table->time('end_hour');
+            $table->timestamps();
+            $table->softDeletes();
+
+            $table->index('provider_id');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     */
+    public function down(): void
+    {
+        Schema::dropIfExists('provider_blocked_days');
+    }
+};

+ 6 - 0
database/seeders/PermissionSeeder.php

@@ -112,6 +112,12 @@ class PermissionSeeder extends Seeder
                         "bits" => 271,
                         "children" => [],
                     ],
+                    [
+                        "scope" => "config.provider_blocked_day",
+                        "description" => "Configurações de Dias Bloqueados do Prestador",
+                        "bits" => 271,
+                        "children" => [],
+                    ],
                     [
                         "scope" => "config.improvement_type",
                         "description" => "Configurações de Tipos de Melhoria",

+ 1 - 0
database/seeders/UserTypePermissionSeeder.php

@@ -41,6 +41,7 @@ class UserTypePermissionSeeder extends Seeder
                         ['scope' => 'config.provider_services_types', 'bits' => 271],
                         ['scope' => 'config.provider_payment_method', 'bits' => 271],
                         ['scope' => 'config.provider_working_day', 'bits' => 271],
+                        ['scope' => 'config.provider_blocked_day', 'bits' => 271],
                         ['scope' => 'config.improvement_type', 'bits' => 271],
                         ['scope' => 'config.media', 'bits' => 271],
                         ['scope' => 'config.service_type', 'bits' => 271],

+ 10 - 0
routes/authRoutes/provider_blocked_day.php

@@ -0,0 +1,10 @@
+<?php
+
+use App\Http\Controllers\ProviderBlockedDayController;
+use Illuminate\Support\Facades\Route;
+
+Route::get('/provider/blocked-days/{providerId}', [ProviderBlockedDayController::class, 'index'])->middleware('permission:config.provider_blocked_day,view');
+Route::get('/provider/blocked-day/{id}', [ProviderBlockedDayController::class, 'show'])->middleware('permission:config.provider_blocked_day,view');
+Route::post('/provider/blocked-day', [ProviderBlockedDayController::class, 'store'])->middleware('permission:config.provider_blocked_day,add');
+Route::put('/provider/blocked-day/{id}', [ProviderBlockedDayController::class, 'update'])->middleware('permission:config.provider_blocked_day,edit');
+Route::delete('/provider/blocked-day/{id}', [ProviderBlockedDayController::class, 'destroy'])->middleware('permission:config.provider_blocked_day,delete');