AppointmentController.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Http\Requests\AppointmentApproveRequest;
  4. use App\Http\Requests\AppointmentRequest;
  5. use App\Http\Resources\AppointmentResource;
  6. use App\Services\AppointmentService;
  7. use App\Enums\AppointmentStatusEnum;
  8. use App\Enums\UserStatusEnum;
  9. use Illuminate\Http\JsonResponse;
  10. use Illuminate\Http\Request;
  11. use Illuminate\Support\Facades\Auth;
  12. class AppointmentController extends Controller
  13. {
  14. public function __construct(protected AppointmentService $service) {}
  15. public function index(): JsonResponse
  16. {
  17. $items = $this->service->getAll();
  18. return $this->successResponse(payload: AppointmentResource::collection($items));
  19. }
  20. public function myAppointments(): JsonResponse
  21. {
  22. $items = $this->service->getAllByUser(Auth::id());
  23. return $this->successResponse(payload: AppointmentResource::collection($items));
  24. }
  25. public function partnerAppointments(): JsonResponse
  26. {
  27. $items = $this->service->getAllByPartnerUser(Auth::id());
  28. return $this->successResponse(payload: AppointmentResource::collection($items));
  29. }
  30. public function getByUser(int $id): JsonResponse
  31. {
  32. $items = $this->service->getAllByUser($id);
  33. return $this->successResponse(payload: AppointmentResource::collection($items));
  34. }
  35. public function store(AppointmentRequest $request): JsonResponse
  36. {
  37. $data = $request->validated();
  38. $authUser = Auth::user();
  39. $creatingForOther = isset($data['user_id']) && (int) $data['user_id'] !== $authUser->id;
  40. if ($creatingForOther) {
  41. $data['status'] = AppointmentStatusEnum::CONFIRMADO;
  42. $data['auto_approved'] = true;
  43. } elseif ($authUser->status === UserStatusEnum::ACTIVE) {
  44. $data['status'] = AppointmentStatusEnum::CONFIRMADO;
  45. $data['auto_approved'] = true;
  46. }
  47. $item = $this->service->create($data);
  48. if ($creatingForOther) {
  49. $this->service->notifyCreation($item);
  50. }
  51. return $this->successResponse(
  52. payload: new AppointmentResource($item),
  53. message: __('messages.created'),
  54. code: 201,
  55. );
  56. }
  57. public function show(int $id): JsonResponse
  58. {
  59. $item = $this->service->findById($id);
  60. return $this->successResponse(payload: new AppointmentResource($item));
  61. }
  62. public function update(AppointmentRequest $request, int $id): JsonResponse
  63. {
  64. $item = $this->service->update($id, $request->validated(), Auth::id());
  65. return $this->successResponse(
  66. payload: new AppointmentResource($item),
  67. message: __('messages.updated'),
  68. );
  69. }
  70. public function destroy(int $id): JsonResponse
  71. {
  72. $this->service->delete($id);
  73. return $this->successResponse(message: __('messages.deleted'), code: 204);
  74. }
  75. public function getAdminCounters(): JsonResponse
  76. {
  77. return $this->successResponse(payload: $this->service->getAdminCounters());
  78. }
  79. public function getAdminAppointmentsPaginated(Request $request): JsonResponse
  80. {
  81. $filters = $request->only(['status', 'search']);
  82. $perPage = (int) $request->input('per_page', 10);
  83. $paginator = $this->service->getAllPaginated($filters, $perPage);
  84. $items = collect($paginator->items())->map(fn($a) => [
  85. 'id' => $a->id,
  86. 'order_number' => $a->order_number,
  87. 'registration' => $a->user?->registration,
  88. 'user_name' => $a->user?->name,
  89. 'partner_name' => $a->partnerAgreement?->trade_name ?? $a->partnerAgreement?->company_name,
  90. 'service_name' => $a->partnerAgreementService?->name,
  91. 'requested_at' => $a->requested_at?->format('d/m/Y'),
  92. 'status' => $a->status?->value,
  93. ]);
  94. return $this->successResponse(payload: [
  95. 'data' => $items,
  96. 'total' => $paginator->total(),
  97. 'per_page' => $paginator->perPage(),
  98. 'current_page' => $paginator->currentPage(),
  99. 'from' => $paginator->firstItem(),
  100. 'to' => $paginator->lastItem(),
  101. ]);
  102. }
  103. public function approve(AppointmentApproveRequest $request, int $id): JsonResponse
  104. {
  105. $item = $this->service->approve($id, $request->date, $request->time, Auth::id());
  106. return $this->successResponse(payload: new AppointmentResource($item), message: __('messages.updated'));
  107. }
  108. public function reject(int $id): JsonResponse
  109. {
  110. $item = $this->service->reject($id);
  111. return $this->successResponse(payload: new AppointmentResource($item), message: __('messages.updated'));
  112. }
  113. public function approveByPartner(AppointmentApproveRequest $request, int $id): JsonResponse
  114. {
  115. $item = $this->service->approveByPartner($id, Auth::id(), $request->date, $request->time);
  116. if (!$item) return $this->errorResponse(message: __('messages.not_found'), code: 404);
  117. return $this->successResponse(payload: new AppointmentResource($item), message: __('messages.updated'));
  118. }
  119. public function rejectByPartner(int $id): JsonResponse
  120. {
  121. $item = $this->service->rejectByPartner($id, Auth::id());
  122. if (!$item) return $this->errorResponse(message: __('messages.not_found'), code: 404);
  123. return $this->successResponse(payload: new AppointmentResource($item), message: __('messages.updated'));
  124. }
  125. }