PaymentController.php 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  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. use Illuminate\Support\Facades\Log;
  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 payServicePackage(PayServicePackageRequest $request, int $servicePackageId): JsonResponse
  51. {
  52. $validated = $request->validated();
  53. try {
  54. $item = $this->service->payServicePackage(
  55. servicePackageId: $servicePackageId,
  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 (PaymentMissingDataException $e) {
  64. return response()->json([
  65. 'message' => $e->getMessage(),
  66. 'error' => 'missing_payment_data',
  67. ], 422);
  68. } catch (PaymentFailedException) {
  69. return $this->errorResponse(message: __('messages.payment_not_confirmed'), code: 422);
  70. } catch (PaymentException) {
  71. return $this->errorResponse(message: __('messages.payment_error'), code: 422);
  72. }
  73. return $this->successResponse(
  74. payload: new PaymentResource($item),
  75. message: $item->status->message(),
  76. code: 201,
  77. );
  78. }
  79. //
  80. public function getServicePackagePix(ServicePackage $servicePackage): JsonResponse
  81. {
  82. if ($servicePackage->client?->user_id !== Auth::id()) {
  83. abort(403);
  84. }
  85. try {
  86. $item = $this->service->getOrCreateServicePackagePixPayment($servicePackage);
  87. } catch (PaymentMissingDataException $e) {
  88. return response()->json([
  89. 'message' => $e->getMessage(),
  90. 'error' => 'missing_payment_data',
  91. ], 422);
  92. }
  93. return $this->successResponse(payload: new PaymentResource($item));
  94. }
  95. //
  96. public function payScheduleProposal(PayServicePackageRequest $request, ScheduleProposal $proposal): JsonResponse
  97. {
  98. $validated = $request->validated();
  99. try {
  100. $item = $this->service->payScheduleProposal(
  101. proposalId: $proposal->id,
  102. paymentMethod: data_get($validated, 'payment_method'),
  103. clientPaymentMethodId: data_get($validated, 'client_payment_method_id'),
  104. options: [
  105. 'phone' => data_get($validated, 'phone'),
  106. 'card_id' => data_get($validated, 'card_id'),
  107. ],
  108. );
  109. } catch (PaymentMissingDataException $e) {
  110. return response()->json([
  111. 'message' => $e->getMessage(),
  112. 'error' => 'missing_payment_data',
  113. ], 422);
  114. } catch (PaymentFailedException) {
  115. return $this->errorResponse(message: __('messages.payment_not_confirmed'), code: 422);
  116. } catch (PaymentException) {
  117. return $this->errorResponse(message: __('messages.payment_error'), code: 422);
  118. }
  119. return $this->successResponse(
  120. payload: new PaymentResource($item),
  121. message: $item->status->message(),
  122. code: 201,
  123. );
  124. }
  125. //
  126. public function getScheduleProposalPix(ScheduleProposal $proposal): JsonResponse
  127. {
  128. if ($proposal->schedule?->client?->user_id !== Auth::id()) {
  129. abort(403);
  130. }
  131. try {
  132. $item = $this->service->getOrCreateScheduleProposalPixPayment($proposal);
  133. } catch (PaymentMissingDataException $e) {
  134. return response()->json([
  135. 'message' => $e->getMessage(),
  136. 'error' => 'missing_payment_data',
  137. ], 422);
  138. }
  139. return $this->successResponse(payload: new PaymentResource($item));
  140. }
  141. public function platformFees(): JsonResponse
  142. {
  143. return $this->successResponse(payload: $this->service->platformFees());
  144. }
  145. }