|
|
@@ -18,6 +18,7 @@ use App\Data\Pagarme\Order\Parts\Request\SplitOptionsData;
|
|
|
use App\Enums\PaymentSplitStatusEnum;
|
|
|
use App\Enums\PaymentStatusEnum;
|
|
|
use App\Models\Address;
|
|
|
+use App\Models\Cart;
|
|
|
use App\Models\Client;
|
|
|
use App\Models\Payment;
|
|
|
use App\Models\PaymentSplit;
|
|
|
@@ -32,7 +33,7 @@ class PagarmePaymentService
|
|
|
use FormatsPagarmeData;
|
|
|
use SendsPagarmeRequests;
|
|
|
|
|
|
- public function calculatePaymentAmounts(float $serviceAmount, string $paymentMethod): array
|
|
|
+ public function calculatePaymentAmounts(float $serviceAmount, string $paymentMethod, ?Schedule $schedule = null): array
|
|
|
{
|
|
|
if ($serviceAmount <= 0) {
|
|
|
throw new \InvalidArgumentException('Valor do servico precisa ser maior que zero.');
|
|
|
@@ -42,9 +43,7 @@ class PagarmePaymentService
|
|
|
throw new \InvalidArgumentException('Forma de pagamento invalida.');
|
|
|
}
|
|
|
|
|
|
- $platformFeeRate = $paymentMethod === 'credit_card'
|
|
|
- ? (float) config('services.pagarme.platform_credit_card_fee_rate')
|
|
|
- : (float) config('services.pagarme.platform_pix_fee_rate');
|
|
|
+ $platformFeeRate = $this->platformFeeRate($paymentMethod, $schedule);
|
|
|
|
|
|
$platformFee = round($serviceAmount * $platformFeeRate, 2);
|
|
|
$grossAmount = round($serviceAmount + $platformFee, 2);
|
|
|
@@ -63,11 +62,31 @@ class PagarmePaymentService
|
|
|
public function platformFeeRates(): array
|
|
|
{
|
|
|
return [
|
|
|
- 'pix' => (float) config('services.pagarme.platform_pix_fee_rate'),
|
|
|
- 'credit_card' => (float) config('services.pagarme.platform_credit_card_fee_rate'),
|
|
|
+ 'pix' => (float) config('services.pagarme.platform_pix_fee_rate'),
|
|
|
+ 'credit_card' => (float) config('services.pagarme.platform_credit_card_fee_rate'),
|
|
|
+ 'cart_min_3_schedules' => (float) config('services.pagarme.platform_cart_min_3_schedules_fee_rate'),
|
|
|
];
|
|
|
}
|
|
|
|
|
|
+ private function platformFeeRate(string $paymentMethod, ?Schedule $schedule = null): float
|
|
|
+ {
|
|
|
+ if ($schedule && $this->scheduleBelongsToCartWithAtLeastThreeItems($schedule)) {
|
|
|
+ return (float) config('services.pagarme.platform_cart_min_3_schedules_fee_rate');
|
|
|
+ }
|
|
|
+
|
|
|
+ return $paymentMethod === 'credit_card'
|
|
|
+ ? (float) config('services.pagarme.platform_credit_card_fee_rate')
|
|
|
+ : (float) config('services.pagarme.platform_pix_fee_rate');
|
|
|
+ }
|
|
|
+
|
|
|
+ private function scheduleBelongsToCartWithAtLeastThreeItems(Schedule $schedule): bool
|
|
|
+ {
|
|
|
+ return Cart::query()
|
|
|
+ ->whereHas('items', fn ($query) => $query->where('schedule_id', $schedule->id))
|
|
|
+ ->whereHas('items', null, '>=', 3)
|
|
|
+ ->exists();
|
|
|
+ }
|
|
|
+
|
|
|
public function processPayment(
|
|
|
Payment $payment,
|
|
|
Schedule $schedule,
|