فهرست منبع

Merge branch 'feature/GINC-GAB-CB002-feriados-base' of Softpar/sfp_api_laravel_ginastica_cerebro into development

Gabriel Alves 1 ماه پیش
والد
کامیت
e66d2fba05

+ 45 - 0
app/Http/Controllers/BaseHolidayController.php

@@ -0,0 +1,45 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Http\Requests\BaseHolidayRequest;
+use App\Http\Resources\BaseHolidayResource;
+use App\Services\BaseHolidayService;
+use Illuminate\Http\JsonResponse;
+
+class BaseHolidayController extends Controller
+{
+    public function __construct(
+        protected BaseHolidayService $service,
+    ) {}
+
+    public function index(): JsonResponse
+    {
+        $items = $this->service->getAll();
+        return $this->successResponse(payload: BaseHolidayResource::collection($items));
+    }
+
+    public function store(BaseHolidayRequest $request): JsonResponse
+    {
+        $item = $this->service->create($request->validated());
+        return $this->successResponse(payload: new BaseHolidayResource($item), message: __('messages.created'), code: 201);
+    }
+
+    public function show(int $id): JsonResponse
+    {
+        $item = $this->service->findById($id);
+        return $this->successResponse(payload: new BaseHolidayResource($item));
+    }
+
+    public function update(BaseHolidayRequest $request, int $id): JsonResponse
+    {
+        $item = $this->service->update($id, $request->validated());
+        return $this->successResponse(payload: new BaseHolidayResource($item), message: __('messages.updated'));
+    }
+
+    public function destroy(int $id): JsonResponse
+    {
+        $this->service->delete($id);
+        return $this->successResponse(message: __('messages.deleted'), code: 204);
+    }
+}

+ 27 - 0
app/Http/Requests/BaseHolidayRequest.php

@@ -0,0 +1,27 @@
+<?php
+
+namespace App\Http\Requests;
+
+use Illuminate\Foundation\Http\FormRequest;
+
+class BaseHolidayRequest extends FormRequest
+{
+    public function rules(): array
+    {
+        return [
+            'description'  => 'required|string|max:255',
+            'holiday_date' => 'required|date_format:Y-m-d',
+            'type'         => 'nullable|string|in:feriado,facultativo',
+        ];
+    }
+
+    public function messages(): array
+    {
+        return [
+            'description.required'      => 'A descrição do feriado é obrigatória.',
+            'description.max'           => 'A descrição deve ter no máximo 255 caracteres.',
+            'holiday_date.required'     => 'A data do feriado é obrigatória.',
+            'holiday_date.date_format'  => 'A data deve estar no formato YYYY-MM-DD.',
+        ];
+    }
+}

+ 32 - 0
app/Http/Resources/BaseHolidayResource.php

@@ -0,0 +1,32 @@
+<?php
+
+namespace App\Http\Resources;
+
+use App\Models\BaseHoliday;
+use Illuminate\Http\Request;
+use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
+use Illuminate\Http\Resources\Json\JsonResource;
+
+class BaseHolidayResource extends JsonResource
+{
+    public function toArray(Request $request): array
+    {
+        return [
+            'id'           => $this->id,
+            'holiday_date' => $this->holiday_date?->format('Y-m-d'),
+            'description'  => $this->description,
+            'type'         => $this->type ?? 'feriado',
+            'created_at'   => $this->created_at?->format('Y-m-d H:i:s'),
+            'updated_at'   => $this->updated_at?->format('Y-m-d H:i:s'),
+        ];
+    }
+
+    /**
+     * @param \Illuminate\Database\Eloquent\Collection<BaseHoliday> $resource
+     * @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection<BaseHolidayResource>
+     */
+    public static function collection($resource): AnonymousResourceCollection
+    {
+        return parent::collection($resource);
+    }
+}

+ 40 - 0
app/Models/BaseHoliday.php

@@ -0,0 +1,40 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\Relations\HasMany;
+use Illuminate\Database\Eloquent\SoftDeletes;
+
+/**
+ * @property int $id
+ * @property \Illuminate\Support\Carbon $holiday_date
+ * @property string $description
+ * @property string $type
+ * @property \Illuminate\Support\Carbon|null $created_at
+ * @property \Illuminate\Support\Carbon|null $updated_at
+ * @property \Illuminate\Support\Carbon|null $deleted_at
+ * @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Holiday> $holidays
+ * @mixin \Eloquent
+ */
+class BaseHoliday extends Model
+{
+    use HasFactory, SoftDeletes;
+
+    protected $table = 'base_holidays';
+
+    protected $guarded = ['id'];
+
+    protected $casts = [
+        'holiday_date' => 'date',
+        'created_at'   => 'datetime',
+        'updated_at'   => 'datetime',
+        'deleted_at'   => 'datetime',
+    ];
+
+    public function holidays(): HasMany
+    {
+        return $this->hasMany(Holiday::class);
+    }
+}

+ 7 - 0
app/Models/Holiday.php

@@ -10,6 +10,7 @@
 /**
  * @property int $id
  * @property int $unit_id
+ * @property int|null $base_holiday_id
  * @property \Illuminate\Support\Carbon $holiday_date
  * @property string $description
  * @property \Illuminate\Support\Carbon|null $created_at
@@ -17,6 +18,7 @@
  * @property \Illuminate\Support\Carbon|null $deleted_at
  * @property string $type
  * @property-read \App\Models\Unit $unit
+ * @property-read \App\Models\BaseHoliday|null $baseHoliday
  * @method static \Illuminate\Database\Eloquent\Builder<static>|Holiday newModelQuery()
  * @method static \Illuminate\Database\Eloquent\Builder<static>|Holiday newQuery()
  * @method static \Illuminate\Database\Eloquent\Builder<static>|Holiday onlyTrashed()
@@ -52,4 +54,9 @@ public function unit(): BelongsTo
     {
         return $this->belongsTo(Unit::class);
     }
+
+    public function baseHoliday(): BelongsTo
+    {
+        return $this->belongsTo(BaseHoliday::class);
+    }
 }

+ 61 - 0
app/Services/BaseHolidayService.php

@@ -0,0 +1,61 @@
+<?php
+
+namespace App\Services;
+
+use App\Models\BaseHoliday;
+use App\Models\Holiday;
+use App\Models\Unit;
+use Illuminate\Database\Eloquent\Collection;
+
+class BaseHolidayService
+{
+    public function getAll(): Collection
+    {
+        return BaseHoliday::orderBy('holiday_date', 'asc')->get();
+    }
+
+    public function findById(int $id): ?BaseHoliday
+    {
+        return BaseHoliday::find($id);
+    }
+
+    public function create(array $data): BaseHoliday
+    {
+        $baseHoliday = BaseHoliday::create($data);
+
+        Unit::all()->each(function (Unit $unit) use ($baseHoliday) {
+            Holiday::create([
+                'unit_id'         => $unit->id,
+                'base_holiday_id' => $baseHoliday->id,
+                'holiday_date'    => $baseHoliday->holiday_date,
+                'description'     => $baseHoliday->description,
+                'type'            => $baseHoliday->type,
+            ]);
+        });
+
+        return $baseHoliday;
+    }
+
+    public function update(int $id, array $data): ?BaseHoliday
+    {
+        $model = $this->findById($id);
+
+        if (!$model) {
+            return null;
+        }
+
+        $model->update($data);
+        return $model->fresh();
+    }
+
+    public function delete(int $id): bool
+    {
+        $model = $this->findById($id);
+
+        if (!$model) {
+            return false;
+        }
+
+        return $model->delete();
+    }
+}

+ 27 - 0
database/migrations/2026_05_13_000001_create_base_holidays_table.php

@@ -0,0 +1,27 @@
+<?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('base_holidays', function (Blueprint $table) {
+            $table->id();
+            $table->date('holiday_date');
+            $table->string('description');
+            $table->string('type')->default('feriado');
+            $table->timestamps();
+            $table->softDeletes();
+
+            $table->index('holiday_date');
+        });
+    }
+
+    public function down(): void
+    {
+        Schema::dropIfExists('base_holidays');
+    }
+};

+ 27 - 0
database/migrations/2026_05_13_000002_add_base_holiday_id_to_holidays_table.php

@@ -0,0 +1,27 @@
+<?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::table('holidays', function (Blueprint $table) {
+            $table->foreignId('base_holiday_id')
+                ->nullable()
+                ->after('unit_id')
+                ->constrained('base_holidays')
+                ->nullOnDelete();
+        });
+    }
+
+    public function down(): void
+    {
+        Schema::table('holidays', function (Blueprint $table) {
+            $table->dropForeign(['base_holiday_id']);
+            $table->dropColumn('base_holiday_id');
+        });
+    }
+};

+ 16 - 0
routes/authRoutes/base_holiday.php

@@ -0,0 +1,16 @@
+<?php
+
+use App\Http\Controllers\BaseHolidayController;
+use Illuminate\Support\Facades\Route;
+
+Route::controller(BaseHolidayController::class)->prefix('base-holiday')->group(function () {
+    Route::get('/', 'index');
+
+    Route::post('/', 'store');
+
+    Route::get('/{id}', 'show');
+
+    Route::put('/{id}', 'update');
+
+    Route::delete('/{id}', 'destroy');
+});