AppointmentController.php 4.5 KB

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