PaymentController.php 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Enums\PaymentStatusEnum;
  4. use App\Exceptions\PaymentFailedException;
  5. use App\Exceptions\PaymentException;
  6. use App\Http\Requests\PayScheduleRequest;
  7. use App\Http\Requests\PayServicePackageRequest;
  8. use App\Http\Requests\PaymentRequest;
  9. use App\Http\Resources\PaymentResource;
  10. use App\Models\Schedule;
  11. use App\Services\PaymentService;
  12. use Illuminate\Http\JsonResponse;
  13. use Illuminate\Http\Request;
  14. use Illuminate\Support\Facades\Auth;
  15. class PaymentController extends Controller
  16. {
  17. public function __construct(
  18. protected PaymentService $service,
  19. ) {}
  20. public function index(): JsonResponse
  21. {
  22. $items = $this->service->getAll();
  23. return $this->successResponse(payload: PaymentResource::collection($items));
  24. }
  25. public function store(PaymentRequest $request): JsonResponse
  26. {
  27. $item = $this->service->create($request->validated());
  28. return $this->successResponse(
  29. payload: new PaymentResource($item),
  30. message: $item->status->message(),
  31. code: 201,
  32. );
  33. }
  34. public function show(int $id): JsonResponse
  35. {
  36. $item = $this->service->findById($id);
  37. return $this->successResponse(payload: new PaymentResource($item));
  38. }
  39. public function update(PaymentRequest $request, int $id): JsonResponse
  40. {
  41. $item = $this->service->update($id, $request->validated());
  42. return $this->successResponse(payload: new PaymentResource($item), message: __('messages.updated'));
  43. }
  44. public function destroy(int $id): JsonResponse
  45. {
  46. $this->service->delete($id);
  47. return $this->successResponse(message: __('messages.deleted'), code: 204);
  48. }
  49. //
  50. public function paySchedule(PayScheduleRequest $request, int $scheduleId): JsonResponse
  51. {
  52. $validated = $request->validated();
  53. try {
  54. $item = $this->service->paySchedule(
  55. scheduleId: $scheduleId,
  56. paymentMethod: data_get($validated, 'payment_method'),
  57. clientPaymentMethodId: data_get($validated, 'client_payment_method_id'),
  58. options: [
  59. 'phone' => data_get($validated, 'phone'),
  60. 'card_id' => data_get($validated, 'card_id'),
  61. ],
  62. );
  63. } catch (PaymentFailedException) {
  64. return $this->errorResponse(message: __('messages.payment_not_confirmed'), code: 422);
  65. } catch (PaymentException) {
  66. return $this->errorResponse(message: __('messages.payment_error'), code: 422);
  67. }
  68. return $this->successResponse(
  69. payload: new PaymentResource($item),
  70. message: $item->status->message(),
  71. code: 201,
  72. );
  73. }
  74. public function payServicePackage(PayServicePackageRequest $request, int $servicePackageId): JsonResponse
  75. {
  76. $validated = $request->validated();
  77. try {
  78. $item = $this->service->payServicePackage(
  79. servicePackageId: $servicePackageId,
  80. paymentMethod: data_get($validated, 'payment_method'),
  81. clientPaymentMethodId: data_get($validated, 'client_payment_method_id'),
  82. options: [
  83. 'phone' => data_get($validated, 'phone'),
  84. 'card_id' => data_get($validated, 'card_id'),
  85. ],
  86. );
  87. } catch (PaymentFailedException) {
  88. return $this->errorResponse(message: __('messages.payment_not_confirmed'), code: 422);
  89. } catch (PaymentException) {
  90. return $this->errorResponse(message: __('messages.payment_error'), code: 422);
  91. }
  92. return $this->successResponse(
  93. payload: new PaymentResource($item),
  94. message: $item->status->message(),
  95. code: 201,
  96. );
  97. }
  98. //
  99. public function getSchedulePix(Schedule $schedule): JsonResponse
  100. {
  101. if ($schedule->client?->user_id !== Auth::id()) {
  102. abort(403);
  103. }
  104. $item = $this->service->getOrCreatePixPayment($schedule);
  105. return $this->successResponse(payload: new PaymentResource($item));
  106. }
  107. public function platformFees(): JsonResponse
  108. {
  109. return $this->successResponse(payload: $this->service->platformFees());
  110. }
  111. }