PaymentController.php 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Exceptions\PaymentFailedException;
  4. use App\Exceptions\PaymentException;
  5. use App\Exceptions\PaymentMissingDataException;
  6. use App\Http\Requests\PayServicePackageRequest;
  7. use App\Http\Requests\PaymentRequest;
  8. use App\Http\Resources\PaymentResource;
  9. use App\Models\ScheduleProposal;
  10. use App\Models\ServicePackage;
  11. use App\Services\PaymentService;
  12. use Illuminate\Http\JsonResponse;
  13. use Illuminate\Support\Facades\Auth;
  14. class PaymentController extends Controller
  15. {
  16. public function __construct(
  17. protected PaymentService $service,
  18. ) {}
  19. public function index(): JsonResponse
  20. {
  21. $items = $this->service->getAll();
  22. return $this->successResponse(payload: PaymentResource::collection($items));
  23. }
  24. public function store(PaymentRequest $request): JsonResponse
  25. {
  26. $item = $this->service->create($request->validated());
  27. return $this->successResponse(
  28. payload: new PaymentResource($item),
  29. message: $item->status->message(),
  30. code: 201,
  31. );
  32. }
  33. public function show(int $id): JsonResponse
  34. {
  35. $item = $this->service->findById($id);
  36. return $this->successResponse(payload: new PaymentResource($item));
  37. }
  38. public function update(PaymentRequest $request, int $id): JsonResponse
  39. {
  40. $item = $this->service->update($id, $request->validated());
  41. return $this->successResponse(payload: new PaymentResource($item), message: __('messages.updated'));
  42. }
  43. public function destroy(int $id): JsonResponse
  44. {
  45. $this->service->delete($id);
  46. return $this->successResponse(message: __('messages.deleted'), code: 204);
  47. }
  48. //
  49. public function payServicePackage(PayServicePackageRequest $request, int $servicePackageId): JsonResponse
  50. {
  51. $validated = $request->validated();
  52. try {
  53. $item = $this->service->payServicePackage(
  54. servicePackageId: $servicePackageId,
  55. paymentMethod: data_get($validated, 'payment_method'),
  56. clientPaymentMethodId: data_get($validated, 'client_payment_method_id'),
  57. options: [
  58. 'phone' => data_get($validated, 'phone'),
  59. 'card_id' => data_get($validated, 'card_id'),
  60. ],
  61. );
  62. } catch (PaymentMissingDataException $e) {
  63. return response()->json([
  64. 'message' => $e->getMessage(),
  65. 'error' => 'missing_payment_data',
  66. ], 422);
  67. } catch (PaymentFailedException) {
  68. return $this->errorResponse(message: __('messages.payment_not_confirmed'), code: 422);
  69. } catch (PaymentException) {
  70. return $this->errorResponse(message: __('messages.payment_error'), code: 422);
  71. }
  72. return $this->successResponse(
  73. payload: new PaymentResource($item),
  74. message: $item->status->message(),
  75. code: 201,
  76. );
  77. }
  78. //
  79. public function getServicePackagePix(ServicePackage $servicePackage): JsonResponse
  80. {
  81. if ($servicePackage->client?->user_id !== Auth::id()) {
  82. abort(403);
  83. }
  84. try {
  85. $item = $this->service->getOrCreateServicePackagePixPayment($servicePackage);
  86. } catch (PaymentMissingDataException $e) {
  87. return response()->json([
  88. 'message' => $e->getMessage(),
  89. 'error' => 'missing_payment_data',
  90. ], 422);
  91. }
  92. return $this->successResponse(payload: new PaymentResource($item));
  93. }
  94. //
  95. public function payScheduleProposal(PayServicePackageRequest $request, ScheduleProposal $proposal): JsonResponse
  96. {
  97. $validated = $request->validated();
  98. try {
  99. $item = $this->service->payScheduleProposal(
  100. proposalId: $proposal->id,
  101. paymentMethod: data_get($validated, 'payment_method'),
  102. clientPaymentMethodId: data_get($validated, 'client_payment_method_id'),
  103. options: [
  104. 'phone' => data_get($validated, 'phone'),
  105. 'card_id' => data_get($validated, 'card_id'),
  106. ],
  107. );
  108. } catch (PaymentMissingDataException $e) {
  109. return response()->json([
  110. 'message' => $e->getMessage(),
  111. 'error' => 'missing_payment_data',
  112. ], 422);
  113. } catch (PaymentFailedException) {
  114. return $this->errorResponse(message: __('messages.payment_not_confirmed'), code: 422);
  115. } catch (PaymentException) {
  116. return $this->errorResponse(message: __('messages.payment_error'), code: 422);
  117. }
  118. return $this->successResponse(
  119. payload: new PaymentResource($item),
  120. message: $item->status->message(),
  121. code: 201,
  122. );
  123. }
  124. //
  125. public function getScheduleProposalPix(ScheduleProposal $proposal): JsonResponse
  126. {
  127. if ($proposal->schedule?->client?->user_id !== Auth::id()) {
  128. abort(403);
  129. }
  130. try {
  131. $item = $this->service->getOrCreateScheduleProposalPixPayment($proposal);
  132. } catch (PaymentMissingDataException $e) {
  133. return response()->json([
  134. 'message' => $e->getMessage(),
  135. 'error' => 'missing_payment_data',
  136. ], 422);
  137. }
  138. return $this->successResponse(payload: new PaymentResource($item));
  139. }
  140. public function platformFees(): JsonResponse
  141. {
  142. return $this->successResponse(payload: $this->service->platformFees());
  143. }
  144. }