add schedule rescheduling

This commit is contained in:
Yisroel Baum 2026-08-19 22:44:14 +03:00
parent b8eeb093d3
commit 7576ccaf09
Signed by: yisroelbaum
GPG key ID: 0FA60884F75520A9
9 changed files with 314 additions and 5 deletions

View file

@ -11,9 +11,11 @@ use App\Schedule\UseCases\CreateSchedule\CreateSchedule;
use App\Schedule\UseCases\CreateSchedule\CreateScheduleRequest;
use App\Schedule\UseCases\GetSchedule\GetSchedule;
use App\Schedule\UseCases\GetSchedule\GetScheduleRequest;
use App\Schedule\UseCases\ListSchedules\ListSchedules;
use App\Schedule\UseCases\ListAssignmentsForDate\ListAssignmentsForDate;
use App\Schedule\UseCases\ListAssignmentsForDate\ListAssignmentsForDateRequest;
use App\Schedule\UseCases\ListSchedules\ListSchedules;
use App\Schedule\UseCases\RescheduleSchedule\RescheduleSchedule;
use App\Schedule\UseCases\RescheduleSchedule\RescheduleScheduleRequest;
use App\Schedule\UseCases\SetAssignmentCompletion\SetAssignmentCompletion;
use App\Schedule\UseCases\SetAssignmentCompletion\SetAssignmentCompletionRequest;
use App\Shared\Http\RequestInput;
@ -27,6 +29,7 @@ class ScheduleController extends Controller
private CreateSchedule $createSchedule,
private ListSchedules $listSchedules,
private GetSchedule $getSchedule,
private RescheduleSchedule $rescheduleSchedule,
private ListAssignmentsForDate $listAssignmentsForDate,
private SetAssignmentCompletion $setAssignmentCompletion,
) {}
@ -100,6 +103,39 @@ class ScheduleController extends Controller
]);
}
public function update(Request $request, int $scheduleId): JsonResponse
{
$input = new RequestInput($request);
try {
$schedule = $this->rescheduleSchedule->execute(
new RescheduleScheduleRequest(
scheduleId: $scheduleId,
user: $this->user($request),
startDate: $input->string('startDate'),
targetDate: $input->string('targetDate'),
workloadPlacement: $input->string(
'workloadPlacement',
),
),
);
} catch (BadRequestException $exception) {
return new JsonResponse(
['error' => $exception->getMessage()],
400,
);
} catch (NotFoundException $exception) {
return new JsonResponse(
['error' => $exception->getMessage()],
404,
);
}
return new JsonResponse([
'schedule' => $this->detailPayload($schedule),
]);
}
public function assignments(Request $request): JsonResponse
{
$input = new RequestInput($request);
@ -206,15 +242,23 @@ class ScheduleController extends Controller
);
}
$days = [];
$includedDates = [];
$date = $schedule->getStartDate();
while ($date <= $schedule->getTargetDate()) {
$formattedDate = $date->format('Y-m-d');
$includedDates[$date->format('Y-m-d')] = true;
$date = $date->modify('+1 day');
}
foreach (array_keys($assignmentsByDate) as $assignmentDate) {
$includedDates[$assignmentDate] = true;
}
ksort($includedDates);
$days = [];
foreach (array_keys($includedDates) as $formattedDate) {
$days[] = [
'date' => $formattedDate,
'assignments' => $assignmentsByDate[$formattedDate] ?? [],
];
$date = $date->modify('+1 day');
}
return $days;