Gustavo Mantovani пре 2 дана
родитељ
комит
8571eaaa5d

+ 5 - 0
app/Http/Controllers/PaymentController.php

@@ -72,6 +72,11 @@ class PaymentController extends Controller
         );
     }
 
+    public function platformFees(): JsonResponse
+    {
+        return $this->successResponse(payload: $this->service->platformFees());
+    }
+
     public function getSchedulePix(Schedule $schedule): JsonResponse
     {
         if ($schedule->client?->user_id !== Auth::id()) {

+ 30 - 12
app/Jobs/FinishScheduleJob.php

@@ -4,6 +4,7 @@ namespace App\Jobs;
 
 use App\Models\Address;
 use App\Models\Client;
+use App\Models\Payment;
 use App\Models\Provider;
 use App\Models\Schedule;
 use App\Models\User;
@@ -36,6 +37,7 @@ class FinishScheduleJob implements ShouldQueue
             }
 
             Log::channel('schedule_end_jobs')->info('Verificando status do agendamento id: '.$schedule->id);
+
             Log::channel('schedule_end_jobs')->info('Status do agendamento: '.$schedule->status);
 
             if ($schedule->status !== 'started') {
@@ -43,7 +45,9 @@ class FinishScheduleJob implements ShouldQueue
             }
 
             Log::channel('schedule_end_jobs')->info('Verificando data');
+
             Log::channel('schedule_end_jobs')->info('Data do agendamento: '.$date_cleaned);
+
             Log::channel('schedule_end_jobs')->info('Data atual: '.now()->toDateString());
 
             if ($date_cleaned > now()->toDateString()) {
@@ -51,7 +55,9 @@ class FinishScheduleJob implements ShouldQueue
             }
 
             Log::channel('schedule_end_jobs')->info('Verificando horário');
+
             Log::channel('schedule_end_jobs')->info('Horário do agendamento: '.$schedule->end_time);
+
             Log::channel('schedule_end_jobs')->info('Horário atual: '.now()->toTimeString());
 
             $end_date_time = Carbon::parse($date_cleaned.' '.$schedule->end_time);
@@ -82,7 +88,19 @@ class FinishScheduleJob implements ShouldQueue
 
             $serviceAmount = (float) $schedule->total_amount;
 
-            $serviceFee = round($serviceAmount * (float) config('services.pagarme.platform_fee_rate'), 2);
+            $payment = Payment::query()
+                ->where('schedule_id', $schedule->id)
+                ->whereIn('status', ['paid', 'authorized'])
+                ->latest('id')
+                ->first();
+
+            $paymentMethod = $payment?->payment_method ?? 'pix';
+
+            $platformFeeRate = $paymentMethod === 'credit_card'
+                ? (float) config('services.pagarme.platform_credit_card_fee_rate')
+                : (float) config('services.pagarme.platform_pix_fee_rate');
+
+            $serviceFee = round($serviceAmount * $platformFeeRate, 2);
 
             $finalAmount = $serviceAmount + $serviceFee;
 
@@ -91,17 +109,17 @@ class FinishScheduleJob implements ShouldQueue
             $address = Address::find($schedule->address_id);
 
             $emailService->sendEmailReceipt(
-                email: $email_cliente,
-                schedule: $schedule,
-                client_name: $schedule->client->user->name,
-                service_date: $schedule->date,
-                start_time: $schedule->start_time,
-                end_time: $schedule->end_time,
-                address: $address->address.', '.$address->number.($address->has_complement ? ', '.$address->complement : '').' - '.$address->district.', '.$address->city->name.'/'.$address->state->code,
-                total_amount: $serviceAmount,
-                service_fee: $serviceFee,
-                final_amount: $finalAmount,
-                payment_method: 'PIX'
+                email:          $email_cliente,
+                schedule:       $schedule,
+                client_name:    $schedule->client->user->name,
+                service_date:   $schedule->date,
+                start_time:     $schedule->start_time,
+                end_time:       $schedule->end_time,
+                address:        $address->address.', '.$address->number.($address->has_complement ? ', '.$address->complement : '').' - '.$address->district.', '.$address->city->name.'/'.$address->state->code,
+                total_amount:   $serviceAmount,
+                service_fee:    $serviceFee,
+                final_amount:   $finalAmount,
+                payment_method: $paymentMethod === 'credit_card' ? 'Cartão de crédito' : 'PIX'
             );
         } catch (\Exception $e) {
             Log::channel('schedule_end_jobs')->error('Erro ao finalizar agendamento id: '.$this->scheduleId.'. Erro: '.$e->getMessage());

+ 2 - 0
app/Jobs/StartScheduleJob.php

@@ -23,6 +23,7 @@ class StartScheduleJob implements ShouldQueue
     {
         try {
             $schedule = Schedule::find($this->scheduleId);
+
             $date_cleaned = Carbon::parse($schedule->date)->format('Y-m-d');
 
             if (! $schedule) {
@@ -43,6 +44,7 @@ class StartScheduleJob implements ShouldQueue
             if ($date_cleaned > now()->toDateString()) {
                 return;
             }
+
             Log::channel('schedule_start_jobs')->info('Verificando horário');
             Log::channel('schedule_start_jobs')->info('Horário do agendamento: '.$schedule->start_time);
             Log::channel('schedule_start_jobs')->info('Horário atual: '.now()->toTimeString());

+ 20 - 26
app/Services/Pagarme/PagarmePaymentService.php

@@ -37,8 +37,6 @@ class PagarmePaymentService
 
     public function calculatePaymentAmounts(float $serviceAmount, string $paymentMethod): array
     {
-        $installments = 1;
-
         if ($serviceAmount <= 0) {
             throw new \InvalidArgumentException('Valor do servico precisa ser maior que zero.');
         }
@@ -47,35 +45,29 @@ class PagarmePaymentService
             throw new \InvalidArgumentException('Forma de pagamento invalida.');
         }
 
-        $platformFeeRate = (float) config('services.pagarme.platform_fee_rate', 0.11);
-
-        $anticipationFeeRate = $paymentMethod === 'credit_card'
-            ? (float) config('services.pagarme.anticipation_fee_rate', 0.0311)
-            : 0.0;
+        $platformFeeRate = $paymentMethod === 'credit_card'
+            ? (float) config('services.pagarme.platform_credit_card_fee_rate', 0.11)
+            : (float) config('services.pagarme.platform_pix_fee_rate', 0.11);
 
-        $anticipationFeeRate = $anticipationFeeRate * $installments;
-
-        if ($anticipationFeeRate >= 1) {
-            throw new \InvalidArgumentException('Taxa de antecipacao invalida para calcular valor do pagamento.');
-        }
-
-        $platformFee        = round($serviceAmount * $platformFeeRate, 2);
-        $desiredSplitAmount = round($serviceAmount + $platformFee, 2);
-
-        $grossAmount = $anticipationFeeRate > 0
-            ? $this->roundMoneyUp($desiredSplitAmount / (1 - $anticipationFeeRate))
-            : $desiredSplitAmount;
+        $platformFee = round($serviceAmount * $platformFeeRate, 2);
+        $grossAmount = round($serviceAmount + $platformFee, 2);
 
         if ($platformFee > 0 && empty(config('services.pagarme.platform_recipient_id'))) {
             throw new \InvalidArgumentException('PAGARME_PLATFORM_RECIPIENT_ID precisa estar configurado para receber a taxa da plataforma no split.');
         }
 
         return [
-            'service_amount'                  => round($serviceAmount, 2),
-            'platform_fee_amount'             => $platformFee,
-            'desired_split_amount'            => $desiredSplitAmount,
-            'anticipation_fee_amount'         => round($grossAmount - $desiredSplitAmount, 2),
-            'gross_amount'                    => $grossAmount,
+            'service_amount'      => round($serviceAmount, 2),
+            'platform_fee_amount' => $platformFee,
+            'gross_amount'        => $grossAmount,
+        ];
+    }
+
+    public function platformFeeRates(): array
+    {
+        return [
+            'pix'         => (float) config('services.pagarme.platform_pix_fee_rate', 0.11),
+            'credit_card' => (float) config('services.pagarme.platform_credit_card_fee_rate', 0.11),
         ];
     }
 
@@ -227,7 +219,8 @@ class PagarmePaymentService
     {
         $order = OrderResponseData::fromArray($orderResponse);
 
-        $newStatus      = $order->paymentStatus();
+        $newStatus = $order->paymentStatus();
+
         $failureCode    = null;
         $failureMessage = null;
 
@@ -237,7 +230,8 @@ class PagarmePaymentService
         }
 
         $gatewayFeeCents = $order->lastTransaction()?->cost ?? 0;
-        $gatewayFee      = $gatewayFeeCents > 0 ? round($gatewayFeeCents / 100, 2) : 0;
+
+        $gatewayFee = $gatewayFeeCents > 0 ? round($gatewayFeeCents / 100, 2) : 0;
 
         $payment->forceFill([
             'gateway_provider'            => 'pagarme',

+ 7 - 3
app/Services/PaymentService.php

@@ -63,6 +63,11 @@ class PaymentService
         return $model->delete();
     }
 
+    public function platformFees(): array
+    {
+        return $this->pagarmePaymentService->platformFeeRates();
+    }
+
     //
 
     public function payAcceptedSchedule(
@@ -185,9 +190,8 @@ class PaymentService
             'expires_at'               => $paymentMethod === 'pix' ? Carbon::now()->addMinutes(30) : null,
 
             'metadata' => [
-                'service_amount'   => number_format($amounts['service_amount'], 2, '.', ''),
-                'platform_fee'     => number_format($amounts['platform_fee_amount'], 2, '.', ''),
-                'anticipation_fee' => number_format($amounts['anticipation_fee_amount'], 2, '.', ''),
+                'service_amount' => number_format($amounts['service_amount'], 2, '.', ''),
+                'platform_fee'   => number_format($amounts['platform_fee_amount'], 2, '.', ''),
             ],
         ]);
 

+ 7 - 6
app/Services/ProviderWithdrawalService.php

@@ -95,6 +95,7 @@ class ProviderWithdrawalService
             }
 
             $paymentTransferFeeAmount = $this->paymentTransferFeeAmount();
+
             $netAmount = max(0, round($available - $paymentTransferFeeAmount, 2));
 
             if ($netAmount <= 0) {
@@ -108,14 +109,14 @@ class ProviderWithdrawalService
             $bankAccount = $provider->recipient_default_bank_account;
 
             $withdrawal = ProviderWithdrawal::create([
-                'provider_id'     => $provider->id,
-                'recipient_id'    => $provider->recipient_id,
-                'idempotency_key' => $idempotencyKey,
+                'provider_id'        => $provider->id,
+                'recipient_id'       => $provider->recipient_id,
+                'idempotency_key'    => $idempotencyKey,
                 'gross_amount'       => $available,
                 'gateway_fee_amount' => $paymentTransferFeeAmount,
                 'net_amount'         => $netAmount,
-                'status'          => ProviderWithdrawalStatusEnum::PENDING_TRANSFER,
-                'bank_account'    => $bankAccount,
+                'status'             => ProviderWithdrawalStatusEnum::PENDING_TRANSFER,
+                'bank_account'       => $bankAccount,
 
                 'metadata' => [
                     'provider_id'                  => $provider->id,
@@ -268,7 +269,7 @@ class ProviderWithdrawalService
 
     private function paymentTransferFeeAmount(): float
     {
-        return round((float) config('services.pagarme.transfer_fee_amount', 3.67), 2);
+        return round((float) config('services.pagarme.transfer_fee_amount'), 2);
     }
 
 }

+ 4 - 5
config/services.php

@@ -47,11 +47,10 @@ return [
         'webhook_password'      => env('PAGARME_WEBHOOK_PASSWORD'),
         'platform_recipient_id' => env('PAGARME_PLATFORM_RECIPIENT_ID'),
 
-        'pix_disable_split'              => env('PAGARME_PIX_DISABLE_SPLIT', false),
-        'platform_fee_rate'              => env('PAGARME_PLATFORM_FEE_RATE', 0.11),
-        'credit_card_upfront_fee_rate'   => env('PAGARME_CREDIT_CARD_UPFRONT_FEE_RATE', 0.0389),
-        'anticipation_fee_rate'          => env('PAGARME_ANTICIPATION_FEE_RATE', 0.0311),
-        'transfer_fee_amount'            => env('PAGARME_TRANSFER_FEE_AMOUNT', 3.67),
+        'pix_disable_split'             => env('PAGARME_PIX_DISABLE_SPLIT', false),
+        'platform_pix_fee_rate'         => env('PAGARME_PLATFORM_PIX_FEE_RATE', 0.11),
+        'platform_credit_card_fee_rate' => env('PAGARME_PLATFORM_CREDIT_CARD_FEE_RATE', 0.1457),
+        'transfer_fee_amount'           => env('PAGARME_TRANSFER_FEE_AMOUNT', 3.67),
     ],
 
 ];

+ 2 - 0
routes/authRoutes/payment.php

@@ -6,6 +6,8 @@ use App\Http\Controllers\PaymentController;
 Route::get('/payment',  [PaymentController::class, 'index'])->middleware('permission:payment,view');
 Route::post('/payment', [PaymentController::class, 'store'])->middleware('permission:payment,add');
 
+Route::get('/payment/platform-fees', [PaymentController::class, 'platformFees'])->middleware('permission:config.schedule,view');
+
 Route::get('/payment/schedule/{schedule}/pix',  [PaymentController::class, 'getSchedulePix'])->middleware('permission:config.schedule,view');
 Route::post('/payment/schedule/{schedule}/pay', [PaymentController::class, 'paySchedule'])->middleware('permission:config.schedule,edit');