ScheduleController.php 5.2 KB

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