ScheduleController.php 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  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. private function scheduleItems(array $data): array
  42. {
  43. if (! empty($data['dates'])) {
  44. return array_map(
  45. fn (string $date) => ['date' => $date],
  46. $data['dates'],
  47. );
  48. }
  49. return [
  50. ['date' => $data['date']],
  51. ];
  52. }
  53. public function show(string $id): JsonResponse
  54. {
  55. $schedule = $this->scheduleService->getById($id);
  56. return $this->successResponse(
  57. new ScheduleResource($schedule),
  58. );
  59. }
  60. public function update(ScheduleRequest $request, string $id): JsonResponse
  61. {
  62. try {
  63. $schedule = $this->scheduleService->update($id, $request->validated());
  64. return $this->successResponse(
  65. payload: new ScheduleResource($schedule),
  66. message: __('messages.updated'),
  67. );
  68. } catch (\Exception $e) {
  69. return $this->errorResponse($e->getMessage(), 422);
  70. }
  71. }
  72. public function destroy(string $id): JsonResponse
  73. {
  74. $this->scheduleService->delete($id);
  75. return $this->successResponse(
  76. message: __('messages.deleted'),
  77. code: 204,
  78. );
  79. }
  80. public function finished(): JsonResponse
  81. {
  82. $schedules = $this->scheduleService->getFinished();
  83. return $this->successResponse(
  84. ScheduleResource::collection($schedules),
  85. );
  86. }
  87. public function groupedByClient(): JsonResponse
  88. {
  89. $grouped = $this->scheduleService->getSchedulesDefaultGroupedByClient();
  90. return $this->successResponse($grouped);
  91. }
  92. public function updateStatus(string $id, ScheduleRequest $request): JsonResponse
  93. {
  94. try {
  95. $validated = $request->validate([
  96. 'status' => 'required|in:pending,accepted,rejected,paid,cancelled,started,finished',
  97. ]);
  98. $schedule = $this->scheduleService->updateStatus($id, $validated['status']);
  99. return $this->successResponse(
  100. payload: new ScheduleResource($schedule),
  101. message: __('messages.updated'),
  102. );
  103. } catch (\Exception $e) {
  104. return $this->errorResponse($e->getMessage(), 422);
  105. }
  106. }
  107. public function cancelWithReason(string $id, Request $request): JsonResponse
  108. {
  109. try {
  110. $validated = $request->validate([
  111. 'cancel_text' => 'required|string|min:5|max:1000',
  112. ]);
  113. $schedule = $this->scheduleService->cancelWithReason((int) $id, $validated['cancel_text']);
  114. return $this->successResponse(
  115. payload: new ScheduleResource($schedule),
  116. message: __('messages.updated'),
  117. );
  118. } catch (\Exception $e) {
  119. return $this->errorResponse($e->getMessage(), 422);
  120. }
  121. }
  122. public function clientProviderBlocks(Request $request): JsonResponse
  123. {
  124. $validated = $request->validate([
  125. 'client_id' => 'required|integer|exists:clients,id',
  126. 'provider_id' => 'required|integer|exists:providers,id',
  127. ]);
  128. $blocks = $this->scheduleService->getClientProviderBlocks(
  129. (int) $validated['client_id'],
  130. (int) $validated['provider_id'],
  131. );
  132. return $this->successResponse(payload: $blocks);
  133. }
  134. public function storeCart(ScheduleRequest $request, ScheduleCartService $cartService): JsonResponse
  135. {
  136. try {
  137. $schedules = $cartService->create($request->validated());
  138. return $this->successResponse(
  139. payload: ScheduleResource::collection($schedules),
  140. message: count($schedules).' '.__('schedules.schedules_created'),
  141. code: 201,
  142. );
  143. } catch (\Exception $e) {
  144. return $this->errorResponse($e->getMessage(), 422);
  145. }
  146. }
  147. }