Prechádzať zdrojové kódy

multi datas no agendamento

Gustavo Zanatta 3 týždňov pred
rodič
commit
7ef08a4bd7

+ 20 - 1
app/Http/Controllers/ScheduleController.php

@@ -27,7 +27,26 @@ class ScheduleController extends Controller
     public function store(ScheduleRequest $request): JsonResponse
     {
         try {
-            $schedule = $this->scheduleService->create($request->validated());
+            $validated = $request->validated();
+            
+            if (isset($validated['schedules']) && is_array($validated['schedules']) && count($validated['schedules']) > 0) {
+                $baseData = [
+                    'client_id' => $validated['client_id'],
+                    'provider_id' => $validated['provider_id'],
+                    'address_id' => $validated['address_id'],
+                    'schedule_type' => $validated['schedule_type'] ?? 'default',
+                    'status' => $validated['status'] ?? 'pending',
+                ];
+                
+                $schedules = $this->scheduleService->createMultiple($baseData, $validated['schedules']);
+                return $this->successResponse(
+                    payload: ScheduleResource::collection($schedules),
+                    message: count($schedules) . " " . __("schedules.schedules_created"),
+                    code: 201,
+                );
+            }
+            
+            $schedule = $this->scheduleService->create($validated);
             return $this->successResponse(
                 payload: new ScheduleResource($schedule),
                 message: __("messages.created"),

+ 45 - 6
app/Http/Requests/ScheduleRequest.php

@@ -17,7 +17,15 @@ class ScheduleRequest extends FormRequest
             'client_id' => 'sometimes|required|exists:clients,id',
             'provider_id' => 'sometimes|required|exists:providers,id',
             'address_id' => 'sometimes|required|exists:addresses,id',
-            'date' => 'sometimes|required|date',
+            'date' => 'nullable|date|after_or_equal:today',
+            'dates' => 'nullable|array',
+            'dates.*' => 'date|after_or_equal:today',
+            'schedules' => 'nullable|array',
+            'schedules.*.date' => 'required|date|after_or_equal:today',
+            'schedules.*.period_type' => 'required|in:2,4,6,8',
+            'schedules.*.start_time' => 'required|date_format:H:i',
+            'schedules.*.end_time' => 'required|date_format:H:i|after:schedules.*.start_time',
+            'schedules.*.total_amount' => 'required|numeric|min:0',
             'period_type' => 'sometimes|required|in:2,4,6,8',
             'schedule_type' => 'sometimes|in:default,custom',
             'start_time' => 'sometimes|required|date_format:H:i:s',
@@ -30,10 +38,18 @@ class ScheduleRequest extends FormRequest
             $rules['client_id'] = 'required|exists:clients,id';
             $rules['provider_id'] = 'required|exists:providers,id';
             $rules['address_id'] = 'required|exists:addresses,id';
-            $rules['date'] = 'required|date';
-            $rules['period_type'] = 'required|in:2,4,6,8';
-            $rules['start_time'] = 'required|date_format:H:i';
-            $rules['end_time'] = 'required|date_format:H:i|after:start_time';
+            $rules['date'] = 'required_without_all:dates,schedules|nullable|date|after_or_equal:today';
+            $rules['dates'] = 'nullable|array';
+            $rules['dates.*'] = 'date|after_or_equal:today';
+            $rules['schedules'] = 'nullable|array|min:1';
+            $rules['schedules.*.date'] = 'required|date|after_or_equal:today';
+            $rules['schedules.*.period_type'] = 'required|in:2,4,6,8';
+            $rules['schedules.*.start_time'] = 'required|date_format:H:i';
+            $rules['schedules.*.end_time'] = 'required|date_format:H:i|after:schedules.*.start_time';
+            $rules['schedules.*.total_amount'] = 'required|numeric|min:0';
+            $rules['period_type'] = 'required_without:schedules|in:2,4,6,8';
+            $rules['start_time'] = 'required_without:schedules|date_format:H:i';
+            $rules['end_time'] = 'required_without:schedules|date_format:H:i|after:start_time';
             $rules['status'] = 'in:pending';
         }
 
@@ -49,16 +65,39 @@ class ScheduleRequest extends FormRequest
             'provider_id.exists' => 'Prestador não encontrado.',
             'address_id.required' => 'O endereço é obrigatório.',
             'address_id.exists' => 'Endereço não encontrado.',
-            'date.required' => 'A data é obrigatória.',
+            'date.required_without_all' => 'A data é obrigatória quando não há múltiplas datas ou agendamentos.',
             'date.date' => 'Data inválida.',
+            'date.after_or_equal' => 'A data deve ser hoje ou futura.',
+            'dates.array' => 'Datas devem ser um array.',
+            'dates.*.date' => 'Uma das datas é inválida.',
+            'dates.*.after_or_equal' => 'Todas as datas devem ser hoje ou futuras.',
+            'schedules.array' => 'Agendamentos devem ser um array.',
+            'schedules.min' => 'É necessário pelo menos um agendamento.',
+            'schedules.*.date.required' => 'A data do agendamento é obrigatória.',
+            'schedules.*.date.date' => 'Data do agendamento inválida.',
+            'schedules.*.date.after_or_equal' => 'A data do agendamento deve ser hoje ou futura.',
+            'schedules.*.period_type.required' => 'O período do agendamento é obrigatório.',
+            'schedules.*.period_type.in' => 'Período do agendamento inválido.',
+            'schedules.*.start_time.required' => 'O horário de início do agendamento é obrigatório.',
+            'schedules.*.start_time.date_format' => 'Formato de horário de início inválido.',
+            'schedules.*.end_time.required' => 'O horário de término do agendamento é obrigatório.',
+            'schedules.*.end_time.date_format' => 'Formato de horário de término inválido.',
+            'schedules.*.end_time.after' => 'O horário de término deve ser após o horário de início.',
+            'schedules.*.total_amount.required' => 'O valor total do agendamento é obrigatório.',
+            'schedules.*.total_amount.numeric' => 'O valor total deve ser numérico.',
+            'schedules.*.total_amount.min' => 'O valor total deve ser maior ou igual a zero.',
             'period_type.required' => 'O período é obrigatório.',
+            'period_type.required_without' => 'O período é obrigatório quando não há agendamentos múltiplos.',
             'period_type.in' => 'Período inválido.',
             'start_time.required' => 'O horário de início é obrigatório.',
+            'start_time.required_without' => 'O horário de início é obrigatório quando não há agendamentos múltiplos.',
             'start_time.date_format' => 'Formato de horário inválido.',
             'end_time.required' => 'O horário de término é obrigatório.',
+            'end_time.required_without' => 'O horário de término é obrigatório quando não há agendamentos múltiplos.',
             'end_time.date_format' => 'Formato de horário inválido.',
             'end_time.after' => 'O horário de término deve ser após o horário de início.',
             'status.in' => 'Status inválido.',
         ];
     }
 }
+

+ 28 - 4
app/Services/ScheduleService.php

@@ -37,6 +37,30 @@ class ScheduleService
         return Schedule::create($data);
     }
 
+    public function createMultiple(array $baseData, array $schedules)
+    {
+        foreach ($schedules as $schedule) {
+            $validationData = array_merge($baseData, $schedule);
+            try {
+                $this->validateProviderAvailability($validationData);
+            } catch (\Exception $e) {
+                throw new \Exception("Prestador não disponível para a data " . Carbon::parse($schedule['date'])->format('d/m/Y') . ": " . $e->getMessage());
+            }
+        }
+
+        $createdSchedules = [];
+        
+        foreach ($schedules as $schedule) {
+            $scheduleData = array_merge($baseData, $schedule, [
+                'code' => str_pad(random_int(0, 9999), 4, '0', STR_PAD_LEFT),
+            ]);
+            
+            $createdSchedules[] = Schedule::create($scheduleData);
+        }
+
+        return $createdSchedules;
+    }
+
     public function update($id, array $data)
     {
         $schedule = Schedule::findOrFail($id);
@@ -67,10 +91,10 @@ class ScheduleService
     private function calculateAmount(Provider $provider, string $periodType): float
     {
         $hourlyRates = [
-            '2' => $provider->value_2_hours ?? 0,
-            '4' => $provider->value_4_hours ?? 0,
-            '6' => $provider->value_6_hours ?? 0,
-            '8' => $provider->value_8_hours ?? 0,
+            '2' => $provider->daily_price_2h ?? 0,
+            '4' => $provider->daily_price_4h ?? 0,
+            '6' => $provider->daily_price_6h ?? 0,
+            '8' => $provider->daily_price_8h ?? 0,
         ];
 
         return $hourlyRates[$periodType] ?? 0;

+ 5 - 0
lang/en/schedules.php

@@ -0,0 +1,5 @@
+<?php
+
+return [
+    'schedules_created' => 'schedules created successfully',
+];

+ 5 - 0
lang/es/schedules.php

@@ -0,0 +1,5 @@
+<?php
+
+return [
+    'schedules_created' => 'agendamientos creados con éxito',
+];

+ 5 - 0
lang/pt/schedules.php

@@ -0,0 +1,5 @@
+<?php
+
+return [
+    'schedules_created' => 'agendamentos criados com sucesso',
+];