Browse Source

feat: add endpoint de payment methods + mocks de teste dos requests do pagarme

Gustavo Mantovani 3 tuần trước cách đây
mục cha
commit
0e6ccb5718

+ 28 - 12
app/Http/Controllers/ProviderController.php

@@ -51,16 +51,6 @@ class ProviderController extends Controller
         );
     }
 
-    public function updateBankAccount(ProviderBankAccountRequest $request, int $id): JsonResponse
-    {
-        $item = $this->service->updateBankAccount($id, $request->validated()['recipient_default_bank_account']);
-
-        return $this->successResponse(
-            payload: new ProviderResource($item),
-            message: __('messages.updated'),
-        );
-    }
-
     public function destroy(int $id): JsonResponse
     {
         $this->service->delete($id);
@@ -71,20 +61,32 @@ class ProviderController extends Controller
         );
     }
 
+    //
+
     public function pending(Request $request): JsonResponse
     {
-        $page = $request->integer('page', 1);
+        $page    = $request->integer('page', 1);
         $perPage = $request->integer('per_page', 10);
+
         $paginated = $this->service->getPending($page, $perPage);
 
         return $this->successResponse(payload: [
             'data'  => ProviderResource::collection($paginated->items()),
             'total' => $paginated->total(),
             'from'  => $paginated->firstItem() ?? 0,
-            'to'    => $paginated->lastItem() ?? 0,
+            'to'    => $paginated->lastItem()  ?? 0,
         ]);
     }
 
+    public function paymentMethods(int $id): JsonResponse
+    {
+        return $this->successResponse(
+            payload: $this->service->getPaymentMethods($id),
+        );
+    }
+
+    //
+
     public function approve(int $id): JsonResponse
     {
         $item = $this->service->approve($id);
@@ -105,6 +107,8 @@ class ProviderController extends Controller
         );
     }
 
+    //
+
     public function register(RegisterProviderRequest $request): JsonResponse
     {
         $result = $this->service->register($request->validated());
@@ -117,4 +121,16 @@ class ProviderController extends Controller
             code: 201,
         );
     }
+
+    //
+
+    public function updateBankAccount(ProviderBankAccountRequest $request, int $id): JsonResponse
+    {
+        $item = $this->service->updateBankAccount($id, $request->validated()['recipient_default_bank_account']);
+
+        return $this->successResponse(
+            payload: new ProviderResource($item),
+            message: __('messages.updated'),
+        );
+    }
 }

+ 16 - 0
app/Services/Pagarme/Concerns/MocksPagarmeRequests.php

@@ -0,0 +1,16 @@
+<?php
+
+namespace App\Services\Pagarme\Concerns;
+
+trait MocksPagarmeRequests
+{
+    protected function shouldMockPagarmeRequest(): bool
+    {
+        return app()->environment('local', 'development');
+    }
+
+    protected function mockPagarmeId(string $prefix, string|int $value): string
+    {
+        return $prefix.'_local_'.abs(crc32((string) $value));
+    }
+}

+ 37 - 0
app/Services/Pagarme/PagarmeAnticipationService.php

@@ -8,6 +8,7 @@ use App\Data\Pagarme\Anticipation\BulkAnticipationRequestData;
 use App\Data\Pagarme\Anticipation\BulkAnticipationResponseData;
 use App\Data\Pagarme\Order\OrderRequestData;
 use App\Models\Payment;
+use App\Services\Pagarme\Concerns\MocksPagarmeRequests;
 use App\Services\Pagarme\Concerns\SendsPagarmeRequests;
 use Illuminate\Support\Facades\Http;
 use Illuminate\Support\Facades\Log;
@@ -15,6 +16,7 @@ use Throwable;
 
 class PagarmeAnticipationService
 {
+    use MocksPagarmeRequests;
     use SendsPagarmeRequests;
 
     public function createBulkAnticipation(
@@ -92,6 +94,24 @@ class PagarmeAnticipationService
         }
 
         try {
+            if ($this->shouldMockPagarmeRequest()) {
+                return new BulkAnticipationResponseData(
+                    id:                $this->mockPagarmeId('ba', "{$payment->id}-{$payment->provider_id}"),
+                    status:            'pending',
+                    amount:            $requestedAmount,
+                    fee:               0,
+                    fraudCoverageFee:  0,
+                    anticipationFee:   0,
+                    automaticTransfer: false,
+                    type:              'full',
+                    timeframe:         'start',
+                    paymentDate:       $paymentDate,
+                    createdAt:         now()->toISOString(),
+                    updatedAt:         now()->toISOString(),
+                    anticipationTax:   ['mocked' => true],
+                );
+            }
+
             $response = BulkAnticipationResponseData::fromArray($this->pagarmeRequest(
                 method: 'POST',
                 path:   "/recipients/{$recipientId}/bulk_anticipations",
@@ -142,6 +162,23 @@ class PagarmeAnticipationService
     private function fetchAnticipationLimits(string $recipientId, string $paymentDate): ?BulkAnticipationLimitsResponseData
     {
         try {
+            if ($this->shouldMockPagarmeRequest()) {
+                return new BulkAnticipationLimitsResponseData(
+                    maximum: new AnticipationLimitData(
+                        amount:           100000000,
+                        anticipationFee:  0,
+                        fee:              0,
+                        fraudCoverageFee: 0,
+                    ),
+                    minimum: new AnticipationLimitData(
+                        amount:           1,
+                        anticipationFee:  0,
+                        fee:              0,
+                        fraudCoverageFee: 0,
+                    ),
+                );
+            }
+
             $secretKey = config('services.pagarme.secret_key');
 
             if (empty($secretKey)) {

+ 14 - 0
app/Services/Pagarme/PagarmeCardService.php

@@ -7,10 +7,12 @@ use App\Data\Pagarme\Card\CardResponseData;
 use App\Data\Pagarme\Card\Parts\Request\BillingAddressData;
 use App\Models\Address;
 use App\Models\ClientPaymentMethod;
+use App\Services\Pagarme\Concerns\MocksPagarmeRequests;
 use App\Services\Pagarme\Concerns\SendsPagarmeRequests;
 
 class PagarmeCardService
 {
+    use MocksPagarmeRequests;
     use SendsPagarmeRequests;
 
     public function __construct(
@@ -30,6 +32,18 @@ class PagarmeCardService
             []
         );
 
+        if ($this->shouldMockPagarmeRequest()) {
+            $cardId = $this->mockPagarmeId('card', $paymentMethod->id);
+
+            $paymentMethod->forceFill([
+                'gateway_card_id'  => $cardId,
+                'brand'            => $paymentMethod->brand            ?: 'visa',
+                'last_four_digits' => $paymentMethod->last_four_digits ?: '1111',
+            ])->save();
+
+            return $cardId;
+        }
+
         $cardData = CardResponseData::fromArray($this->pagarmeRequest(
             method: 'POST',
             path:   "/customers/{$customerId}/cards",

+ 13 - 0
app/Services/Pagarme/PagarmeCustomerService.php

@@ -9,11 +9,13 @@ use App\Data\Pagarme\Customer\Parts\Request\PhoneData;
 use App\Data\Pagarme\Customer\Parts\Request\PhonesData;
 use App\Models\Client;
 use App\Services\Pagarme\Concerns\FormatsPagarmeData;
+use App\Services\Pagarme\Concerns\MocksPagarmeRequests;
 use App\Services\Pagarme\Concerns\SendsPagarmeRequests;
 
 class PagarmeCustomerService
 {
     use FormatsPagarmeData;
+    use MocksPagarmeRequests;
     use SendsPagarmeRequests;
 
     public function createCustomerForClient(Client $client, array $data): ?string
@@ -34,6 +36,17 @@ class PagarmeCustomerService
         $address = $this->buildAddressData($data);
         $phones  = $this->buildPhones($client->user?->phone ?? $data['phone'] ?? null);
 
+        if ($this->shouldMockPagarmeRequest()) {
+            $customerId = $this->mockPagarmeId('cus', $client->id);
+
+            $client->forceFill([
+                'gateway_customer_id'   => $customerId,
+                'gateway_customer_code' => $code,
+            ])->save();
+
+            return $customerId;
+        }
+
         $customerRequest = new CustomerRequestData(
             name:         $name,
             email:        (string) $email,

+ 171 - 71
app/Services/Pagarme/PagarmePaymentService.php

@@ -24,6 +24,7 @@ use App\Models\Payment;
 use App\Models\PaymentSplit;
 use App\Models\Schedule;
 use App\Services\Pagarme\Concerns\FormatsPagarmeData;
+use App\Services\Pagarme\Concerns\MocksPagarmeRequests;
 use App\Services\Pagarme\Concerns\SendsPagarmeRequests;
 use Illuminate\Support\Facades\Log;
 use Illuminate\Support\Str;
@@ -31,6 +32,7 @@ use Illuminate\Support\Str;
 class PagarmePaymentService
 {
     use FormatsPagarmeData;
+    use MocksPagarmeRequests;
     use SendsPagarmeRequests;
 
     public function calculatePaymentAmounts(float $serviceAmount, string $paymentMethod, ?Schedule $schedule = null): array
@@ -220,6 +222,18 @@ class PagarmePaymentService
             channel:    $options['channel']     ?? null,
         );
 
+        if ($this->shouldMockPagarmeRequest()) {
+            $order = OrderResponseData::fromArray(
+                $this->mockOrderResponse($payment, $requestData, $paymentMethod),
+            );
+
+            $order->requireId();
+
+            $this->saveExternalCustomerId($payment, $order);
+
+            return $order->toArray();
+        }
+
         $order = OrderResponseData::fromArray($this->pagarmeRequest(
             method:         'POST',
             path:           '/orders',
@@ -293,6 +307,90 @@ class PagarmePaymentService
 
     //
 
+    private function mockOrderResponse(
+        Payment $payment, OrderRequestData $requestData, PaymentData $paymentMethod,
+    ): array {
+        $payload = $requestData->toArray();
+
+        $now = now()->toISOString();
+
+        $orderId       = $this->mockPagarmeId('or', $payment->id);
+        $chargeId      = $this->mockPagarmeId('ch', $payment->id);
+        $transactionId = $this->mockPagarmeId('tran', $payment->id);
+
+        $amount = array_sum(array_map(
+            static fn (array $item): int => ((int) ($item['amount'] ?? 0)) * ((int) ($item['quantity'] ?? 1)),
+            $payload['items'] ?? [],
+        ));
+
+        $isCreditCard = $paymentMethod->paymentMethod === 'credit_card';
+
+        $chargeStatus      = $isCreditCard ? 'paid'     : 'pending';
+        $transactionStatus = $isCreditCard ? 'captured' : 'waiting_payment';
+
+        $transaction = [
+            'id'         => $transactionId,
+            'status'     => $transactionStatus,
+            'amount'     => $amount,
+            'cost'       => 0,
+            'created_at' => $now,
+
+            'acquirer_message' => $isCreditCard ? 'Transacao mockada aprovada.' : null,
+
+            'gateway_response' => [
+                'code'    => $isCreditCard ? '00' : 'mock_waiting_payment',
+                'message' => 'Pagar.me mock local.',
+            ],
+        ];
+
+        if (! $isCreditCard) {
+            $transaction['qr_code']     = '00020101021226880014br.gov.bcb.pix2566mock.local/pix/'.$payment->id;
+            $transaction['qr_code_url'] = url("/mock/pix/{$payment->id}");
+            $transaction['expires_at']  = now()->addMinutes(30)->toISOString();
+        }
+
+        return [
+            'id'       => $orderId,
+            'code'     => $requestData->code,
+            'amount'   => $amount,
+            'currency' => 'BRL',
+            'closed'   => true,
+            'status'   => $chargeStatus,
+            'items'    => $payload['items'] ?? [],
+            'customer' => $this->mockCustomerResponse($requestData),
+
+            'charges' => [[
+                'id'         => $chargeId,
+                'status'     => $chargeStatus,
+                'amount'     => $amount,
+                'currency'   => 'BRL',
+                'paid_at'    => $isCreditCard ? $now : null,
+                'created_at' => $now,
+                'expires_at' => $isCreditCard ? null : now()->addMinutes(30)->toISOString(),
+
+                'last_transaction' => $transaction,
+            ]],
+
+            'checkouts'  => [],
+            'metadata'   => array_merge($requestData->metadata, ['mocked' => true]),
+            'created_at' => $now,
+            'updated_at' => $now,
+            'closed_at'  => $now,
+        ];
+    }
+
+    private function mockCustomerResponse(OrderRequestData $requestData): array
+    {
+        $customer = $requestData->customer?->toArray() ?? [];
+
+        return array_merge($customer, [
+            'id'         => $requestData->customerId ?: $this->mockPagarmeId('cus', $customer['code'] ?? $requestData->code),
+            'delinquent' => false,
+        ]);
+    }
+
+    //
+
     private function buildCustomer(Schedule $schedule, array $options = []): CustomerRequestData
     {
         $client  = $schedule->client;
@@ -388,6 +486,79 @@ class PagarmePaymentService
         )];
     }
 
+    private function buildPhonePayload(?string $phone): ?array
+    {
+        $digits = $this->digits($phone);
+
+        if (strlen($digits) < 10) {
+            return null;
+        }
+
+        if (str_starts_with($digits, '55')) {
+            $digits = substr($digits, 2);
+        }
+
+        return [
+            'country_code' => '55',
+            'area_code'    => substr($digits, 0, 2),
+            'number'       => substr($digits, 2),
+        ];
+    }
+
+    private function buildSplit(Payment $payment, array $options): array
+    {
+        $transfers = PaymentSplit::query()
+            ->where('payment_id', $payment->id)
+            ->get();
+
+        $split = OrderRequestData::splitFromTransfers($transfers);
+
+        $platformRecipientId = config('services.pagarme.platform_recipient_id');
+
+        if (empty($platformRecipientId)) {
+            return $split;
+        }
+
+        $orderAmountCents = OrderRequestData::amountInCents((float) $payment->gross_amount);
+
+        $providerTotalCents = array_sum(array_map(
+            static fn (SplitData $s) => $s->amount,
+            $split,
+        ));
+
+        $platformAmountCents = $orderAmountCents - $providerTotalCents;
+
+        if ($platformAmountCents > 0) {
+            $split[] = new SplitData(
+                amount:      $platformAmountCents,
+                recipientId: $platformRecipientId,
+                type:        'flat',
+
+                options: new SplitOptionsData(
+                    chargeProcessingFee: true,
+                    chargeRemainderFee:  true,
+                    liable:              true,
+                ),
+            );
+        }
+
+        return $split;
+    }
+
+    //
+
+    private function isMisleadingGatewayCode(mixed $code): bool
+    {
+        if ($code === null || $code === '') {
+            return false;
+        }
+
+        $code = mb_strtolower((string) $code);
+
+        return preg_match('/^[1-2]\d{2}$/', $code) === 1
+            || in_array($code, ['00', '0', 'approved', 'success'], true);
+    }
+
     private function logCreditCardOrderResult(Payment $payment, array $orderResponse, string $source): void
     {
         $order       = OrderResponseData::fromArray($orderResponse);
@@ -446,82 +617,11 @@ class PagarmePaymentService
         return $gatewayResponse;
     }
 
-    private function isMisleadingGatewayCode(mixed $code): bool
-    {
-        if ($code === null || $code === '') {
-            return false;
-        }
-
-        $code = mb_strtolower((string) $code);
-
-        return preg_match('/^[1-2]\d{2}$/', $code) === 1
-            || in_array($code, ['00', '0', 'approved', 'success'], true);
-    }
-
-    private function buildPhonePayload(?string $phone): ?array
-    {
-        $digits = $this->digits($phone);
-
-        if (strlen($digits) < 10) {
-            return null;
-        }
-
-        if (str_starts_with($digits, '55')) {
-            $digits = substr($digits, 2);
-        }
-
-        return [
-            'country_code' => '55',
-            'area_code'    => substr($digits, 0, 2),
-            'number'       => substr($digits, 2),
-        ];
-    }
-
     private function roundMoneyUp(float $amount): float
     {
         return ceil($amount * 100) / 100;
     }
 
-    private function buildSplit(Payment $payment, array $options): array
-    {
-        $transfers = PaymentSplit::query()
-            ->where('payment_id', $payment->id)
-            ->get();
-
-        $split = OrderRequestData::splitFromTransfers($transfers);
-
-        $platformRecipientId = config('services.pagarme.platform_recipient_id');
-
-        if (empty($platformRecipientId)) {
-            return $split;
-        }
-
-        $orderAmountCents = OrderRequestData::amountInCents((float) $payment->gross_amount);
-
-        $providerTotalCents = array_sum(array_map(
-            static fn (SplitData $s) => $s->amount,
-            $split,
-        ));
-
-        $platformAmountCents = $orderAmountCents - $providerTotalCents;
-
-        if ($platformAmountCents > 0) {
-            $split[] = new SplitData(
-                amount:      $platformAmountCents,
-                recipientId: $platformRecipientId,
-                type:        'flat',
-
-                options: new SplitOptionsData(
-                    chargeProcessingFee: true,
-                    chargeRemainderFee:  true,
-                    liable:              true,
-                ),
-            );
-        }
-
-        return $split;
-    }
-
     // evita criacao duplicada de payment
 
     private function idempotencyKey(Payment $payment): string

+ 42 - 0
app/Services/Pagarme/PagarmeRecipientService.php

@@ -14,11 +14,13 @@ use App\Data\Pagarme\Recipient\RecipientRequestData;
 use App\Data\Pagarme\Recipient\RecipientResponseData;
 use App\Models\Provider;
 use App\Services\Pagarme\Concerns\FormatsPagarmeData;
+use App\Services\Pagarme\Concerns\MocksPagarmeRequests;
 use App\Services\Pagarme\Concerns\SendsPagarmeRequests;
 
 class PagarmeRecipientService
 {
     use FormatsPagarmeData;
+    use MocksPagarmeRequests;
     use SendsPagarmeRequests;
 
     public function createRecipientForProvider(Provider $provider, array $data): string
@@ -83,6 +85,38 @@ class PagarmeRecipientService
 
         $bankAccountData = $payload->defaultBankAccount->toArray();
 
+        if ($this->shouldMockPagarmeRequest()) {
+            $recipientId = $this->mockPagarmeId('re', $provider->id);
+
+            $provider->forceFill([
+                'recipient_id'                   => $recipientId,
+                'recipient_name'                 => $data['recipient_name'],
+                'recipient_email'                => $data['recipient_email'],
+                'recipient_description'          => $data['recipient_description'] ?? '',
+                'recipient_document'             => $data['recipient_document'],
+                'recipient_type'                 => $payload->registerInformation->type,
+                'recipient_code'                 => $recipientCode,
+                'recipient_payment_mode'         => $paymentMode,
+                'recipient_default_bank_account' => $bankAccountData,
+
+                'recipient_transfer_settings' => [
+                    'transfer_enabled'  => false,
+                    'transfer_interval' => 'daily',
+                    'transfer_day'      => 0,
+                ],
+
+                'recipient_automatic_anticipation_settings' => [
+                    'enabled' => true,
+                    'type'    => 'full',
+                    'delay'   => 1,
+                ],
+
+                'recipient_metadata' => array_merge($metadata, ['mocked' => true]),
+            ])->save();
+
+            return $recipientId;
+        }
+
         $raw = $this->pagarmeRequest(
             method:         'POST',
             path:           '/recipients',
@@ -138,6 +172,14 @@ class PagarmeRecipientService
             type:              $bankAccountData['type'],
         );
 
+        if ($this->shouldMockPagarmeRequest()) {
+            $provider->forceFill([
+                'recipient_default_bank_account' => $payload->toArray()['bank_account'],
+            ])->save();
+
+            return $provider->fresh();
+        }
+
         $this->pagarmeRequest(
             method:         'PATCH',
             path:           "/recipients/{$provider->recipient_id}/default-bank-account",

+ 14 - 2
app/Services/Pagarme/PagarmeTransferService.php

@@ -6,11 +6,13 @@ use App\Data\Pagarme\Transfer\TransferRequestData;
 use App\Data\Pagarme\Transfer\TransferResponseData;
 use App\Models\Provider;
 use App\Models\ProviderWithdrawal;
+use App\Services\Pagarme\Concerns\MocksPagarmeRequests;
 use App\Services\Pagarme\Concerns\SendsPagarmeRequests;
 use Carbon\Carbon;
 
 class PagarmeTransferService
 {
+    use MocksPagarmeRequests;
     use SendsPagarmeRequests;
 
     public function createTransfer(int $amountInCents, string $recipientId, string $idempotencyKey): TransferResponseData
@@ -56,6 +58,16 @@ class PagarmeTransferService
 
     public function getRecipientBalance(string $recipientId): array
     {
+        if ($this->shouldMockPagarmeRequest()) {
+            return [
+                'recipient_id' => $recipientId,
+                'available'    => ['amount' => 100000],
+                'waiting_funds'=> ['amount' => 0],
+                'transferred'  => ['amount' => 0],
+                'mocked'       => true,
+            ];
+        }
+
         return $this->pagarmeRequest(
             method:         'GET',
             path:           "/recipients/{$recipientId}/balance",
@@ -69,12 +81,12 @@ class PagarmeTransferService
 
     private function mockTransferId(string $idempotencyKey): string
     {
-        return (string) abs(crc32($idempotencyKey));
+        return $this->mockPagarmeId('tr', $idempotencyKey);
     }
 
     private function shouldMockTransferRequest(): bool
     {
-        return app()->environment('local', 'development');
+        return $this->shouldMockPagarmeRequest();
     }
 
     //

+ 23 - 0
app/Services/ProviderService.php

@@ -291,6 +291,29 @@ class ProviderService
         return $provider->fresh(['user', 'profileMedia']);
     }
 
+    public function getPaymentMethods(int $id): array
+    {
+        $provider = Provider::find($id);
+
+        if (! $provider || empty($provider->recipient_default_bank_account)) {
+            return [];
+        }
+
+        $bankAccount = $provider->recipient_default_bank_account;
+
+        return [[
+            'id'                              => $provider->id,
+            'provider_id'                     => $provider->id,
+            'account_type'                    => 'bank_account',
+            'pix_key'                         => $bankAccount['pix_key'] ?? null,
+            'bank_account_type'               => $bankAccount['type'] ?? null,
+            'agency'                          => $bankAccount['branch_number'] ?? null,
+            'account'                         => $bankAccount['account_number'] ?? null,
+            'digit'                           => $bankAccount['account_check_digit'] ?? null,
+            'recipient_default_bank_account'  => $bankAccount,
+        ]];
+    }
+
     private function buildRecipientDataFromProvider(Provider $provider, array $bankAccountData): array
     {
         $address = $provider->addresses->first();

+ 1 - 1
routes/authRoutes/payment.php

@@ -1,7 +1,7 @@
 <?php
 
-use Illuminate\Support\Facades\Route;
 use App\Http\Controllers\PaymentController;
+use Illuminate\Support\Facades\Route;
 
 Route::get('/payment',  [PaymentController::class, 'index'])->middleware('permission:payment,view');
 Route::post('/payment', [PaymentController::class, 'store'])->middleware('permission:payment,add');

+ 1 - 1
routes/authRoutes/payment_split.php

@@ -1,7 +1,7 @@
 <?php
 
-use Illuminate\Support\Facades\Route;
 use App\Http\Controllers\PaymentSplitController;
+use Illuminate\Support\Facades\Route;
 
 Route::get('/payment-split',         [PaymentSplitController::class, 'index'])->middleware('permission:payment-split,view');
 Route::post('/payment-split',        [PaymentSplitController::class, 'store'])->middleware('permission:payment-split,add');

+ 3 - 2
routes/authRoutes/provider.php

@@ -1,10 +1,10 @@
 <?php
 
-use Illuminate\Support\Facades\Route;
 use App\Http\Controllers\ProviderController;
 use App\Http\Controllers\ProviderWithdrawalController;
+use Illuminate\Support\Facades\Route;
 
-Route::get('/provider/pending',            [ProviderController::class, 'pending'])->middleware('permission:config.provider,view');
+Route::get('/provider/pending',                   [ProviderController::class, 'pending'])->middleware('permission:config.provider,view');
 Route::patch('/provider/{id}/approve',            [ProviderController::class, 'approve'])->middleware('permission:config.provider,edit');
 Route::patch('/provider/{id}/reject',             [ProviderController::class, 'reject'])->middleware('permission:config.provider,edit');
 Route::get('/provider/payment-splits',            [ProviderWithdrawalController::class, 'splits'])->middleware('permission:config.provider,view');
@@ -14,6 +14,7 @@ Route::get('/provider/withdrawals/fees',          [ProviderWithdrawalController:
 Route::get('/provider/withdrawals',               [ProviderWithdrawalController::class, 'index'])->middleware('permission:config.provider,view');
 Route::post('/provider/withdrawals',              [ProviderWithdrawalController::class, 'store'])->middleware('permission:config.provider,edit');
 Route::get('/provider/withdrawals/{id}',          [ProviderWithdrawalController::class, 'show'])->middleware('permission:config.provider,view');
+Route::get('/provider/payment-methods/{id}',      [ProviderController::class, 'paymentMethods'])->middleware('permission:config.provider,view');
 Route::get('/provider',                           [ProviderController::class, 'index'])->middleware('permission:config.provider,view');
 Route::post('/provider',                          [ProviderController::class, 'store'])->middleware('permission:config.provider,add');
 Route::get('/provider/{id}',                      [ProviderController::class, 'show'])->middleware('permission:config.provider,view');

+ 7 - 7
routes/authRoutes/user.php

@@ -3,11 +3,11 @@
 use App\Http\Controllers\UserController;
 use Illuminate\Support\Facades\Route;
 
-Route::get('/user/me',      [UserController::class, 'me']);
+Route::get('/user/me',               [UserController::class, 'me']);
 Route::match(['put', 'post'], '/me', [UserController::class, 'updateMe'])->middleware('permission:config.user,edit');
-Route::get('/user',         [UserController::class, 'index'])->middleware('permission:config.user,view');
-Route::post('/user',        [UserController::class, 'store'])->middleware('permission:config.user,add');
-Route::get('/user/{id}',    [UserController::class, 'show'])->middleware('permission:config.user,view');
-Route::put('/user/{id}',    [UserController::class, 'update'])->middleware('permission:config.user,edit');
-Route::delete('/user/{id}', [UserController::class, 'destroy'])->middleware('permission:config.user,delete');
-Route::get('/user-types',   [UserController::class, 'getUserTypes'])->middleware('permission:config.user,view');
+Route::get('/user',                  [UserController::class, 'index'])->middleware('permission:config.user,view');
+Route::post('/user',                 [UserController::class, 'store'])->middleware('permission:config.user,add');
+Route::get('/user/{id}',             [UserController::class, 'show'])->middleware('permission:config.user,view');
+Route::put('/user/{id}',             [UserController::class, 'update'])->middleware('permission:config.user,edit');
+Route::delete('/user/{id}',          [UserController::class, 'destroy'])->middleware('permission:config.user,delete');
+Route::get('/user-types',            [UserController::class, 'getUserTypes'])->middleware('permission:config.user,view');