ScheduleController.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Http\Requests\ScheduleRequest;
  4. use App\Http\Resources\ScheduleResource;
  5. use App\Services\ScheduleService;
  6. use Illuminate\Http\JsonResponse;
  7. use Illuminate\Http\Request;
  8. use Illuminate\Support\Arr;
  9. class ScheduleController extends Controller
  10. {
  11. protected $scheduleService;
  12. public function __construct(ScheduleService $scheduleService)
  13. {
  14. $this->scheduleService = $scheduleService;
  15. }
  16. public function index(): JsonResponse
  17. {
  18. $schedules = $this->scheduleService->getAll();
  19. return $this->successResponse(
  20. ScheduleResource::collection($schedules),
  21. );
  22. }
  23. public function store(ScheduleRequest $request): JsonResponse
  24. {
  25. try {
  26. $validated = $request->validated();
  27. $schedules = $this->scheduleService->createSingleOrMultiple(
  28. Arr::except($validated, ['date', 'dates']),
  29. $this->scheduleItems($validated),
  30. );
  31. return $this->successResponse(
  32. payload: ScheduleResource::collection($schedules),
  33. message: count($schedules).' '.__('schedules.schedules_created'),
  34. code: 201,
  35. );
  36. } catch (\Exception $e) {
  37. return $this->errorResponse($e->getMessage(), 422);
  38. }
  39. }
  40. private function scheduleItems(array $data): array
  41. {
  42. if (! empty($data['dates'])) {
  43. return array_map(
  44. fn (string $date) => ['date' => $date],
  45. $data['dates'],
  46. );
  47. }
  48. return [
  49. ['date' => $data['date']],
  50. ];
  51. }
  52. public function show(string $id): JsonResponse
  53. {
  54. $schedule = $this->scheduleService->getById($id);
  55. return $this->successResponse(
  56. new ScheduleResource($schedule),
  57. );
  58. }
  59. public function update(ScheduleRequest $request, string $id): JsonResponse
  60. {
  61. try {
  62. $schedule = $this->scheduleService->update($id, $request->validated());
  63. return $this->successResponse(
  64. payload: new ScheduleResource($schedule),
  65. message: __('messages.updated'),
  66. );
  67. } catch (\Exception $e) {
  68. return $this->errorResponse($e->getMessage(), 422);
  69. }
  70. }
  71. public function destroy(string $id): JsonResponse
  72. {
  73. $this->scheduleService->delete($id);
  74. return $this->successResponse(
  75. message: __('messages.deleted'),
  76. code: 204,
  77. );
  78. }
  79. //
  80. public function clientProviderBlocks(Request $request): JsonResponse
  81. {
  82. $validated = $request->validate([
  83. 'client_id' => 'required|integer|exists:clients,id',
  84. 'provider_id' => 'required|integer|exists:providers,id',
  85. ]);
  86. $blocks = $this->scheduleService->getClientProviderBlocks(
  87. (int) $validated['client_id'],
  88. (int) $validated['provider_id'],
  89. );
  90. return $this->successResponse(payload: $blocks);
  91. }
  92. public function groupedByClient(): JsonResponse
  93. {
  94. $grouped = $this->scheduleService->getSchedulesDefaultGroupedByClient();
  95. return $this->successResponse($grouped);
  96. }
  97. public function finished(): JsonResponse
  98. {
  99. $schedules = $this->scheduleService->getFinished();
  100. return $this->successResponse(
  101. ScheduleResource::collection($schedules),
  102. );
  103. }
  104. //
  105. public function cancelWithReason(string $id, Request $request): JsonResponse
  106. {
  107. try {
  108. $validated = $request->validate([
  109. 'cancel_text' => 'required|string|min:5|max:1000',
  110. ]);
  111. $schedule = $this->scheduleService->cancelWithReason((int) $id, $validated['cancel_text']);
  112. return $this->successResponse(
  113. payload: new ScheduleResource($schedule),
  114. message: __('messages.updated'),
  115. );
  116. } catch (\Exception $e) {
  117. return $this->errorResponse($e->getMessage(), 422);
  118. }
  119. }
  120. public function updateStatus(string $id, ScheduleRequest $request): JsonResponse
  121. {
  122. try {
  123. $validated = $request->validate([
  124. 'status' => 'required|in:pending,accepted,rejected,paid,cancelled,started,finished',
  125. ]);
  126. $schedule = $this->scheduleService->updateStatus($id, $validated['status']);
  127. return $this->successResponse(
  128. payload: new ScheduleResource($schedule),
  129. message: __('messages.updated'),
  130. );
  131. } catch (\Exception $e) {
  132. return $this->errorResponse($e->getMessage(), 422);
  133. }
  134. }
  135. //
  136. }