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