Explorar o código

feat: adiciona holiday

ebagabee hai 2 semanas
pai
achega
2443ab2c32

+ 3 - 2
app/Http/Controllers/HolidayController.php

@@ -6,6 +6,7 @@
 use App\Http\Requests\HolidayRequest;
 use App\Http\Resources\HolidayResource;
 use Illuminate\Http\JsonResponse;
+use Illuminate\Support\Facades\Auth;
 
 class HolidayController extends Controller
 {
@@ -15,13 +16,13 @@ public function __construct(
 
     public function index(): JsonResponse
     {
-        $items = $this->service->getAll();
+        $items = $this->service->getAll(Auth::user());
         return $this->successResponse(payload: HolidayResource::collection($items));
     }
 
     public function store(HolidayRequest $request): JsonResponse
     {
-        $item = $this->service->create($request->validated());
+        $item = $this->service->create(Auth::user(), $request->validated());
         return $this->successResponse(payload: new HolidayResource($item), message: __('messages.created'), code: 201);
     }
 

+ 11 - 17
app/Http/Requests/HolidayRequest.php

@@ -9,26 +9,20 @@ class HolidayRequest extends FormRequest
     public function rules(): array
     {
         $rules = [
-            // Add your validation rules here
-            //'field' => 'sometimes|string|max:255',
+            'description' => 'required|string|max:255',
+            'holiday_date' => 'required|date_format:Y-m-d',
         ];
 
-        // Different rules for creation
-        //if ($this->isMethod('POST')) {
-            // Make fields required if needed
-            // $rules['field'] = 'required|string|max:255';
-        //}
-
         return $rules;
     }
 
-    /**
-    * Add custom messages when needed
-    * public function messages(): array
-    * {
-    *   return [
-    *        'field.required' => __('message.algo'),
-    *    ];
-    * }
-    */
+    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.',
+        ];
+    }
 }

+ 6 - 19
app/Http/Resources/HolidayResource.php

@@ -2,7 +2,6 @@
 
 namespace App\Http\Resources;
 
-use Carbon\Carbon;
 use Illuminate\Http\Request;
 use Illuminate\Http\Resources\Json\JsonResource;
 use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
@@ -10,27 +9,15 @@
 
 class HolidayResource extends JsonResource
 {
-    /**
-     * Transform the resource into an array.
-     *
-     * @return array<string, mixed>
-     */
     public function toArray(Request $request): array
     {
         return [
-            'id' => $this->id,
-            'name' => $this->name,
-            'created_at' => Carbon::parse($this->created_at)->format('Y-m-d H:i:s'),
-            'updated_at' => Carbon::parse($this->updated_at)->format('Y-m-d H:i:s'),
-            // Add your fields here
-
-            // Conditional fields
-            // $this->mergeWhen($request->user()?->isAdmin(), [
-            //     'internal_notes' => $this->internal_notes,
-            // ]),
-
-            // Relationships
-            // 'user' => new UserResource($this->whenLoaded('user')),
+            'id'           => $this->id,
+            'unit_id'      => $this->unit_id,
+            'holiday_date' => $this->holiday_date?->format('Y-m-d'),
+            'description'  => $this->description,
+            'created_at'   => $this->created_at?->format('Y-m-d H:i:s'),
+            'updated_at'   => $this->updated_at?->format('Y-m-d H:i:s'),
         ];
     }
 

+ 16 - 15
app/Models/Holiday.php

@@ -4,34 +4,35 @@
 
 use Illuminate\Database\Eloquent\Factories\HasFactory;
 use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\Relations\BelongsTo;
+use Illuminate\Database\Eloquent\SoftDeletes;
 
 /**
  * @property int $id
+ * @property int $unit_id
+ * @property string $holiday_date
+ * @property string $description
  * @property \Carbon\Carbon $created_at
  * @property \Carbon\Carbon $updated_at
+ * @property \Carbon\Carbon|null $deleted_at
  */
 class Holiday extends Model
 {
-    use HasFactory;
+    use HasFactory, SoftDeletes;
 
     protected $table = 'holidays';
 
-    protected $guarded = [
-        'id', // Add more fields that shouldn't be edited here
-    ];
+    protected $guarded = ['id'];
 
     protected $casts = [
-        'created_at' => 'datetime',
-        'updated_at' => 'datetime',
-        // Add your casts here (e.g., 'is_active' => 'boolean')
+        'holiday_date' => 'date',
+        'created_at'   => 'datetime',
+        'updated_at'   => 'datetime',
+        'deleted_at'   => 'datetime',
     ];
 
-    // Relationships
-
-    // Business Logic Methods
-
-    // Custom Finders
-
-    // Query Scopes
-
+    public function unit(): BelongsTo
+    {
+        return $this->belongsTo(Unit::class);
+    }
 }

+ 16 - 5
app/Services/HolidayService.php

@@ -3,13 +3,17 @@
 namespace App\Services;
 
 use App\Models\Holiday;
+use App\Models\User;
 use Illuminate\Database\Eloquent\Collection;
 
 class HolidayService
 {
-    public function getAll(): Collection
+    public function getAll(User $user): Collection
     {
-        return Holiday::orderBy('created_at', 'desc')
+        $unitId = $this->resolveUnitId($user);
+
+        return Holiday::where('unit_id', $unitId)
+            ->orderBy('holiday_date', 'asc')
             ->get();
     }
 
@@ -18,9 +22,11 @@ public function findById(int $id): ?Holiday
         return Holiday::find($id);
     }
 
-    public function create(array $data): Holiday
+    public function create(User $user, array $data): Holiday
     {
-        return Holiday::create($data);
+        $unitId = $this->resolveUnitId($user);
+
+        return Holiday::create(array_merge($data, ['unit_id' => $unitId]));
     }
 
     public function update(int $id, array $data): ?Holiday
@@ -46,5 +52,10 @@ public function delete(int $id): bool
         return $model->delete();
     }
 
-    // Add custom business logic methods here
+    private function resolveUnitId(User $user): int
+    {
+        $unit = $user->units()->first();
+        abort_if(!$unit, 403, 'Usuário sem unidade associada.');
+        return $unit->id;
+    }
 }