Bladeren bron

refactor: taxas

Gustavo Mantovani 2 dagen geleden
bovenliggende
commit
e987358a56
53 gewijzigde bestanden met toevoegingen van 331 en 252 verwijderingen
  1. 1 1
      app/Data/Pagarme/Anticipation/BulkAnticipationRequestData.php
  2. 1 1
      app/Data/Pagarme/Anticipation/BulkAnticipationResponseData.php
  3. 3 2
      app/Data/Pagarme/Card/CardRequestData.php
  4. 1 1
      app/Data/Pagarme/Card/CardResponseData.php
  5. 2 2
      app/Data/Pagarme/Card/Parts/Request/BillingAddressData.php
  6. 5 4
      app/Data/Pagarme/Customer/CustomerRequestData.php
  7. 6 5
      app/Data/Pagarme/Customer/CustomerResponseData.php
  8. 2 2
      app/Data/Pagarme/Customer/Parts/Request/AddressData.php
  9. 2 2
      app/Data/Pagarme/Customer/Parts/Request/PhoneData.php
  10. 3 3
      app/Data/Pagarme/Customer/Parts/Request/PhonesData.php
  11. 2 2
      app/Data/Pagarme/Customer/Parts/Response/AddressData.php
  12. 2 2
      app/Data/Pagarme/Customer/Parts/Response/PhoneData.php
  13. 6 6
      app/Data/Pagarme/Customer/Parts/Response/PhonesData.php
  14. 19 18
      app/Data/Pagarme/Order/OrderRequestData.php
  15. 17 15
      app/Data/Pagarme/Order/OrderResponseData.php
  16. 2 2
      app/Data/Pagarme/Order/Parts/Request/CreditCardData.php
  17. 2 2
      app/Data/Pagarme/Order/Parts/Request/ItemData.php
  18. 9 11
      app/Data/Pagarme/Order/Parts/Request/PaymentData.php
  19. 2 2
      app/Data/Pagarme/Order/Parts/Request/PixAdditionalInformationData.php
  20. 3 3
      app/Data/Pagarme/Order/Parts/Request/PixData.php
  21. 3 3
      app/Data/Pagarme/Order/Parts/Request/SplitData.php
  22. 2 2
      app/Data/Pagarme/Order/Parts/Request/SplitOptionsData.php
  23. 5 5
      app/Data/Pagarme/Order/Parts/Response/ChargeData.php
  24. 2 2
      app/Data/Pagarme/Order/Parts/Response/CheckoutData.php
  25. 2 2
      app/Data/Pagarme/Order/Parts/Response/ItemData.php
  26. 2 2
      app/Data/Pagarme/Order/Parts/Response/TransactionData.php
  27. 1 1
      app/Data/Pagarme/Recipient/BankAccountUpdateRequestData.php
  28. 2 2
      app/Data/Pagarme/Recipient/Parts/Request/AddressData.php
  29. 2 2
      app/Data/Pagarme/Recipient/Parts/Request/AutomaticAnticipationSettingsData.php
  30. 2 2
      app/Data/Pagarme/Recipient/Parts/Request/BankAccountData.php
  31. 2 2
      app/Data/Pagarme/Recipient/Parts/Request/PhoneData.php
  32. 17 0
      app/Data/Pagarme/Recipient/Parts/Request/PhoneNumbersData.php
  33. 4 5
      app/Data/Pagarme/Recipient/Parts/Request/RegisterInformationData.php
  34. 2 2
      app/Data/Pagarme/Recipient/Parts/Request/TransferSettingsData.php
  35. 2 2
      app/Data/Pagarme/Recipient/Parts/Response/BankAccountData.php
  36. 9 6
      app/Data/Pagarme/Recipient/RecipientRequestData.php
  37. 4 3
      app/Data/Pagarme/Recipient/RecipientResponseData.php
  38. 0 17
      app/Data/Pagarme/Request/RecipientRequestData/RecipientRegisterInformationData/RecipientPhoneNumbersData/RecipientPhoneNumbersData.php
  39. 1 1
      app/Data/Pagarme/Transfer/TransferRequestData.php
  40. 1 1
      app/Data/Pagarme/Transfer/TransferResponseData.php
  41. 5 0
      app/Http/Controllers/ProviderWithdrawalController.php
  42. 2 2
      app/Http/Controllers/WebhookController.php
  43. 1 2
      app/Jobs/FinishScheduleJob.php
  44. 10 10
      app/Services/Pagarme/PagarmeAnticipationService.php
  45. 4 4
      app/Services/Pagarme/PagarmeCardService.php
  46. 12 12
      app/Services/Pagarme/PagarmeCustomerService.php
  47. 76 27
      app/Services/Pagarme/PagarmePaymentService.php
  48. 20 20
      app/Services/Pagarme/PagarmeRecipientService.php
  49. 2 2
      app/Services/Pagarme/PagarmeTransferService.php
  50. 10 15
      app/Services/PaymentService.php
  51. 27 7
      app/Services/ProviderWithdrawalService.php
  52. 6 3
      config/services.php
  53. 1 0
      routes/authRoutes/provider.php

+ 1 - 1
app/Data/Pagarme/Request/BulkAnticipationRequestData.php → app/Data/Pagarme/Anticipation/BulkAnticipationRequestData.php

@@ -1,6 +1,6 @@
 <?php
 
-namespace App\Data\Pagarme\Request;
+namespace App\Data\Pagarme\Anticipation;
 
 use App\Data\Pagarme\PagarmeData;
 

+ 1 - 1
app/Data/Pagarme/Response/BulkAnticipationResponseData.php → app/Data/Pagarme/Anticipation/BulkAnticipationResponseData.php

@@ -1,6 +1,6 @@
 <?php
 
-namespace App\Data\Pagarme\Response;
+namespace App\Data\Pagarme\Anticipation;
 
 use App\Data\Pagarme\PagarmeResponseData;
 

+ 3 - 2
app/Data/Pagarme/Request/CardRequestData/CardRequestData.php → app/Data/Pagarme/Card/CardRequestData.php

@@ -1,8 +1,9 @@
 <?php
 
-namespace App\Data\Pagarme\Request\CardRequestData;
+namespace App\Data\Pagarme\Card;
 
 use App\Data\Pagarme\PagarmeData;
+use App\Data\Pagarme\Card\Parts\Request\BillingAddressData;
 
 final readonly class CardRequestData extends PagarmeData
 {
@@ -10,7 +11,7 @@ final readonly class CardRequestData extends PagarmeData
         public string  $token,
         public ?string $label = null,
 
-        public ?CardBillingAddressData $billingAddress = null,
+        public ?BillingAddressData $billingAddress = null,
     ) {
         self::requireFilled($this->token, 'token');
     }

+ 1 - 1
app/Data/Pagarme/Response/CardResponseData.php → app/Data/Pagarme/Card/CardResponseData.php

@@ -1,6 +1,6 @@
 <?php
 
-namespace App\Data\Pagarme\Response;
+namespace App\Data\Pagarme\Card;
 
 use App\Data\Pagarme\PagarmeResponseData;
 

+ 2 - 2
app/Data/Pagarme/Request/CardRequestData/CardBillingAddressData.php → app/Data/Pagarme/Card/Parts/Request/BillingAddressData.php

@@ -1,11 +1,11 @@
 <?php
 
-namespace App\Data\Pagarme\Request\CardRequestData;
+namespace App\Data\Pagarme\Card\Parts\Request;
 
 use App\Data\Pagarme\PagarmeData;
 use App\Models\Address;
 
-final readonly class CardBillingAddressData extends PagarmeData
+final readonly class BillingAddressData extends PagarmeData
 {
     public function __construct(
         public string  $line1,

+ 5 - 4
app/Data/Pagarme/Request/CustomerRequestData/CustomerRequestData.php → app/Data/Pagarme/Customer/CustomerRequestData.php

@@ -1,9 +1,10 @@
 <?php
 
-namespace App\Data\Pagarme\Request\CustomerRequestData;
+namespace App\Data\Pagarme\Customer;
 
 use App\Data\Pagarme\PagarmeData;
-use App\Data\Pagarme\Request\CustomerRequestData\CustomerPhonesRequestData\CustomerPhonesRequestData;
+use App\Data\Pagarme\Customer\Parts\Request\AddressData;
+use App\Data\Pagarme\Customer\Parts\Request\PhonesData;
 
 final readonly class CustomerRequestData extends PagarmeData
 {
@@ -15,8 +16,8 @@ final readonly class CustomerRequestData extends PagarmeData
         public string $documentType,
         public string $code,
 
-        public ?CustomerAddressRequestData $address = null,
-        public ?CustomerPhonesRequestData  $phones  = null,
+        public ?AddressData $address = null,
+        public ?PhonesData  $phones  = null,
     ) {
         self::requireFilled($this->name, 'name');
         self::requireFilled($this->email, 'email');

+ 6 - 5
app/Data/Pagarme/Response/CustomerResponseData/CustomerResponseData.php → app/Data/Pagarme/Customer/CustomerResponseData.php

@@ -1,8 +1,9 @@
 <?php
 
-namespace App\Data\Pagarme\Response\CustomerResponseData;
+namespace App\Data\Pagarme\Customer;
 
-use App\Data\Pagarme\Response\CustomerResponseData\CustomerPhonesResponseData\CustomerPhonesResponseData;
+use App\Data\Pagarme\Customer\Parts\Response\AddressData;
+use App\Data\Pagarme\Customer\Parts\Response\PhonesData;
 use App\Data\Pagarme\PagarmeResponseData;
 
 final readonly class CustomerResponseData extends PagarmeResponseData
@@ -17,7 +18,7 @@ final readonly class CustomerResponseData extends PagarmeResponseData
         public ?string $type,
         public ?bool   $delinquent,
 
-        public ?CustomerAddressResponseData $address, public CustomerPhonesResponseData $phones,
+        public ?AddressData $address, public PhonesData $phones,
 
         public ?string $createdAt = null,
         public ?string $updatedAt = null,
@@ -49,9 +50,9 @@ final readonly class CustomerResponseData extends PagarmeResponseData
             type:         static::arrString($payload, 'type'),
             delinquent:   static::arrBool($payload, 'delinquent'),
 
-            address: ! empty($address) ? CustomerAddressResponseData::fromArray($address) : null,
+            address: ! empty($address) ? AddressData::fromArray($address) : null,
 
-            phones:    CustomerPhonesResponseData::fromArray($phones),
+            phones:    PhonesData::fromArray($phones),
             createdAt: static::arrString($payload, 'created_at'),
             updatedAt: static::arrString($payload, 'updated_at'),
         );

+ 2 - 2
app/Data/Pagarme/Request/CustomerRequestData/CustomerAddressRequestData.php → app/Data/Pagarme/Customer/Parts/Request/AddressData.php

@@ -1,10 +1,10 @@
 <?php
 
-namespace App\Data\Pagarme\Request\CustomerRequestData;
+namespace App\Data\Pagarme\Customer\Parts\Request;
 
 use App\Data\Pagarme\PagarmeData;
 
-final readonly class CustomerAddressRequestData extends PagarmeData
+final readonly class AddressData extends PagarmeData
 {
     public function __construct(
         public ?string $line1,

+ 2 - 2
app/Data/Pagarme/Request/CustomerRequestData/CustomerPhonesRequestData/CustomerPhoneData.php → app/Data/Pagarme/Customer/Parts/Request/PhoneData.php

@@ -1,10 +1,10 @@
 <?php
 
-namespace App\Data\Pagarme\Request\CustomerRequestData\CustomerPhonesRequestData;
+namespace App\Data\Pagarme\Customer\Parts\Request;
 
 use App\Data\Pagarme\PagarmeData;
 
-final readonly class CustomerPhoneData extends PagarmeData
+final readonly class PhoneData extends PagarmeData
 {
     public function __construct(
         public string $countryCode,

+ 3 - 3
app/Data/Pagarme/Request/CustomerRequestData/CustomerPhonesRequestData/CustomerPhonesRequestData.php → app/Data/Pagarme/Customer/Parts/Request/PhonesData.php

@@ -1,13 +1,13 @@
 <?php
 
-namespace App\Data\Pagarme\Request\CustomerRequestData\CustomerPhonesRequestData;
+namespace App\Data\Pagarme\Customer\Parts\Request;
 
 use App\Data\Pagarme\PagarmeData;
 
-final readonly class CustomerPhonesRequestData extends PagarmeData
+final readonly class PhonesData extends PagarmeData
 {
     public function __construct(
-        public ?CustomerPhoneData $mobilePhone = null,
+        public ?PhoneData $mobilePhone = null,
     ) {}
 
     public function toArray(): array

+ 2 - 2
app/Data/Pagarme/Response/CustomerResponseData/CustomerAddressResponseData.php → app/Data/Pagarme/Customer/Parts/Response/AddressData.php

@@ -1,10 +1,10 @@
 <?php
 
-namespace App\Data\Pagarme\Response\CustomerResponseData;
+namespace App\Data\Pagarme\Customer\Parts\Response;
 
 use App\Data\Pagarme\PagarmeResponseData;
 
-final readonly class CustomerAddressResponseData extends PagarmeResponseData
+final readonly class AddressData extends PagarmeResponseData
 {
     public function __construct(
         public ?string $id,

+ 2 - 2
app/Data/Pagarme/Response/CustomerResponseData/CustomerPhonesResponseData/PhoneResponseData.php → app/Data/Pagarme/Customer/Parts/Response/PhoneData.php

@@ -1,10 +1,10 @@
 <?php
 
-namespace App\Data\Pagarme\Response\CustomerResponseData\CustomerPhonesResponseData;
+namespace App\Data\Pagarme\Customer\Parts\Response;
 
 use App\Data\Pagarme\PagarmeResponseData;
 
-final readonly class PhoneResponseData extends PagarmeResponseData
+final readonly class PhoneData extends PagarmeResponseData
 {
     public function __construct(
         public ?string $countryCode,

+ 6 - 6
app/Data/Pagarme/Response/CustomerResponseData/CustomerPhonesResponseData/CustomerPhonesResponseData.php → app/Data/Pagarme/Customer/Parts/Response/PhonesData.php

@@ -1,14 +1,14 @@
 <?php
 
-namespace App\Data\Pagarme\Response\CustomerResponseData\CustomerPhonesResponseData;
+namespace App\Data\Pagarme\Customer\Parts\Response;
 
 use App\Data\Pagarme\PagarmeResponseData;
 
-final readonly class CustomerPhonesResponseData extends PagarmeResponseData
+final readonly class PhonesData extends PagarmeResponseData
 {
     public function __construct(
-        public ?PhoneResponseData $homePhone,
-        public ?PhoneResponseData $mobilePhone,
+        public ?PhoneData $homePhone,
+        public ?PhoneData $mobilePhone,
     ) {}
 
     public static function fromArray(array $payload): static
@@ -17,8 +17,8 @@ final readonly class CustomerPhonesResponseData extends PagarmeResponseData
         $mobile = static::arrArray($payload, 'mobile_phone');
 
         return new self(
-            homePhone:   ! empty($home)   ? PhoneResponseData::fromArray($home)   : null,
-            mobilePhone: ! empty($mobile) ? PhoneResponseData::fromArray($mobile) : null,
+            homePhone:   ! empty($home)   ? PhoneData::fromArray($home)   : null,
+            mobilePhone: ! empty($mobile) ? PhoneData::fromArray($mobile) : null,
         );
     }
 

+ 19 - 18
app/Data/Pagarme/Request/OrderRequestData/OrderRequestData.php → app/Data/Pagarme/Order/OrderRequestData.php

@@ -1,22 +1,23 @@
 <?php
 
-namespace App\Data\Pagarme\Request\OrderRequestData;
+namespace App\Data\Pagarme\Order;
 
+use App\Data\Pagarme\Customer\CustomerRequestData as CustomerData;
 use App\Data\Pagarme\PagarmeData;
-use App\Data\Pagarme\Request\CustomerRequestData\CustomerRequestData as CustomerData;
-use App\Data\Pagarme\Request\OrderRequestData\OrderPaymentData\OrderCreditCardData;
-use App\Data\Pagarme\Request\OrderRequestData\OrderPaymentData\OrderPaymentData;
-use App\Data\Pagarme\Request\OrderRequestData\OrderPaymentData\OrderPixData\OrderPixData;
-use App\Data\Pagarme\Request\OrderRequestData\OrderPaymentData\OrderSplitData\OrderSplitData;
-use App\Data\Pagarme\Request\OrderRequestData\OrderPaymentData\OrderSplitData\OrderSplitOptionsData;
+use App\Data\Pagarme\Order\Parts\Request\CreditCardData;
+use App\Data\Pagarme\Order\Parts\Request\ItemData;
+use App\Data\Pagarme\Order\Parts\Request\PaymentData;
+use App\Data\Pagarme\Order\Parts\Request\PixData;
+use App\Data\Pagarme\Order\Parts\Request\SplitData;
+use App\Data\Pagarme\Order\Parts\Request\SplitOptionsData;
 use App\Models\PaymentSplit;
 use Illuminate\Support\Collection;
 
 final readonly class OrderRequestData extends PagarmeData
 {
     /**
-     * @param  OrderItemData[]  $items
-     * @param  OrderPaymentData[]  $payments
+     * @param  ItemData[]  $items
+     * @param  PaymentData[]  $payments
      */
     public function __construct(
         public string  $code,
@@ -52,36 +53,36 @@ final readonly class OrderRequestData extends PagarmeData
     }
 
     /**
-     * @param  OrderSplitData[]|null  $split
+     * @param  SplitData[]|null  $split
      */
-    public static function creditCardPaymentMethod(OrderCreditCardData $creditCard, ?array $split = null): OrderPaymentData
+    public static function creditCardPaymentMethod(CreditCardData $creditCard, ?array $split = null): PaymentData
     {
-        return OrderPaymentData::creditCard($creditCard, $split);
+        return PaymentData::creditCard($creditCard, $split);
     }
 
     /**
-     * @param  OrderSplitData[]|null  $split
+     * @param  SplitData[]|null  $split
      */
-    public static function pixPaymentMethod(OrderPixData $pix, ?array $split = null): OrderPaymentData
+    public static function pixPaymentMethod(PixData $pix, ?array $split = null): PaymentData
     {
-        return OrderPaymentData::pix($pix, $split);
+        return PaymentData::pix($pix, $split);
     }
 
     /**
      * @param  Collection<PaymentSplit>  $transfers
-     * @return OrderSplitData[]
+     * @return SplitData[]
      */
     public static function splitFromTransfers(Collection $transfers): array
     {
         return $transfers
             ->filter(fn (PaymentSplit $split) => ! empty($split->gateway_transfer_target_reference))
             ->map(function (PaymentSplit $split) {
-                return new OrderSplitData(
+                return new SplitData(
                     amount:      self::amountInCents((float) $split->gross_amount),
                     recipientId: $split->gateway_transfer_target_reference,
                     type:        'flat',
 
-                    options: new OrderSplitOptionsData(
+                    options: new SplitOptionsData(
                         chargeProcessingFee: false,
                         chargeRemainderFee:  false,
                         liable:              false,

+ 17 - 15
app/Data/Pagarme/Response/OrderResponseData/OrderResponseData.php → app/Data/Pagarme/Order/OrderResponseData.php

@@ -1,17 +1,19 @@
 <?php
 
-namespace App\Data\Pagarme\Response\OrderResponseData;
+namespace App\Data\Pagarme\Order;
 
-use App\Data\Pagarme\Response\CustomerResponseData\CustomerResponseData;
-use App\Data\Pagarme\Response\OrderResponseData\OrderChargeResponseData\OrderChargeResponseData;
-use App\Data\Pagarme\Response\OrderResponseData\OrderChargeResponseData\OrderTransactionResponseData;
+use App\Data\Pagarme\Customer\CustomerResponseData;
+use App\Data\Pagarme\Order\Parts\Response\ChargeData;
+use App\Data\Pagarme\Order\Parts\Response\CheckoutData;
+use App\Data\Pagarme\Order\Parts\Response\ItemData;
+use App\Data\Pagarme\Order\Parts\Response\TransactionData;
 use App\Data\Pagarme\PagarmeResponseData;
 use App\Enums\PaymentStatusEnum;
 
 /**
- * @param  OrderItemResponseData[]  $items
- * @param  OrderChargeResponseData[]  $charges
- * @param  OrderCheckoutResponseData[]  $checkouts
+ * @param  ItemData[]  $items
+ * @param  ChargeData[]  $charges
+ * @param  CheckoutData[]  $checkouts
  */
 final readonly class OrderResponseData extends PagarmeResponseData
 {
@@ -98,7 +100,7 @@ final readonly class OrderResponseData extends PagarmeResponseData
         return $message;
     }
 
-    public function firstCharge(): ?OrderChargeResponseData
+    public function firstCharge(): ?ChargeData
     {
         return $this->charges[0] ?? null;
     }
@@ -133,7 +135,7 @@ final readonly class OrderResponseData extends PagarmeResponseData
         return $transaction?->id ?? $charge?->id ?? $this->id;
     }
 
-    public function lastTransaction(): ?OrderTransactionResponseData
+    public function lastTransaction(): ?TransactionData
     {
         return $this->firstCharge()?->transaction();
     }
@@ -189,7 +191,7 @@ final readonly class OrderResponseData extends PagarmeResponseData
             status:   static::arrString($payload, 'status'),
 
             items: static::arrMap($payload, 'items',
-                static fn (array $item) => OrderItemResponseData::fromArray($item),
+                static fn (array $item) => ItemData::fromArray($item),
             ),
 
             customer: ! empty($customer)
@@ -197,11 +199,11 @@ final readonly class OrderResponseData extends PagarmeResponseData
                 : null,
 
             charges: static::arrMap($payload, 'charges',
-                static fn (array $charge) => OrderChargeResponseData::fromArray($charge),
+                static fn (array $charge) => ChargeData::fromArray($charge),
             ),
 
             checkouts: static::arrMap($payload, 'checkouts',
-                static fn (array $checkout) => OrderCheckoutResponseData::fromArray($checkout),
+                static fn (array $checkout) => CheckoutData::fromArray($checkout),
             ),
 
             metadata:  static::arrArray($payload, 'metadata'),
@@ -221,7 +223,7 @@ final readonly class OrderResponseData extends PagarmeResponseData
             'closed'   => $this->closed,
 
             'items' => array_map(
-                static fn (OrderItemResponseData $item) => $item->toArray(),
+                static fn (ItemData $item) => $item->toArray(),
                 $this->items,
             ),
 
@@ -232,12 +234,12 @@ final readonly class OrderResponseData extends PagarmeResponseData
             'closed_at'  => $this->closedAt,
 
             'charges' => array_map(
-                static fn (OrderChargeResponseData $charge) => $charge->toArray(),
+                static fn (ChargeData $charge) => $charge->toArray(),
                 $this->charges,
             ),
 
             'checkouts' => array_map(
-                static fn (OrderCheckoutResponseData $checkout) => $checkout->toArray(),
+                static fn (CheckoutData $checkout) => $checkout->toArray(),
                 $this->checkouts,
             ),
 

+ 2 - 2
app/Data/Pagarme/Request/OrderRequestData/OrderPaymentData/OrderCreditCardData.php → app/Data/Pagarme/Order/Parts/Request/CreditCardData.php

@@ -1,10 +1,10 @@
 <?php
 
-namespace App\Data\Pagarme\Request\OrderRequestData\OrderPaymentData;
+namespace App\Data\Pagarme\Order\Parts\Request;
 
 use App\Data\Pagarme\PagarmeData;
 
-final readonly class OrderCreditCardData extends PagarmeData
+final readonly class CreditCardData extends PagarmeData
 {
     public function __construct(
         public string  $cardId,

+ 2 - 2
app/Data/Pagarme/Request/OrderRequestData/OrderItemData.php → app/Data/Pagarme/Order/Parts/Request/ItemData.php

@@ -1,10 +1,10 @@
 <?php
 
-namespace App\Data\Pagarme\Request\OrderRequestData;
+namespace App\Data\Pagarme\Order\Parts\Request;
 
 use App\Data\Pagarme\PagarmeData;
 
-final readonly class OrderItemData extends PagarmeData
+final readonly class ItemData extends PagarmeData
 {
     public function __construct(
         public string  $code,

+ 9 - 11
app/Data/Pagarme/Request/OrderRequestData/OrderPaymentData/OrderPaymentData.php → app/Data/Pagarme/Order/Parts/Request/PaymentData.php

@@ -1,23 +1,21 @@
 <?php
 
-namespace App\Data\Pagarme\Request\OrderRequestData\OrderPaymentData;
+namespace App\Data\Pagarme\Order\Parts\Request;
 
 use App\Data\Pagarme\PagarmeData;
-use App\Data\Pagarme\Request\OrderRequestData\OrderPaymentData\OrderPixData\OrderPixData;
-use App\Data\Pagarme\Request\OrderRequestData\OrderPaymentData\OrderSplitData\OrderSplitData;
 
-final readonly class OrderPaymentData extends PagarmeData
+final readonly class PaymentData extends PagarmeData
 {
     /**
-     * @param  OrderSplitData[]|null  $split
+     * @param  SplitData[]|null  $split
      */
     public function __construct(
         public string $paymentMethod,
 
         public ?array $split = null,
 
-        public ?OrderCreditCardData $creditCard = null,
-        public ?OrderPixData        $pix        = null,
+        public ?CreditCardData $creditCard = null,
+        public ?PixData        $pix        = null,
     ) {
         self::requireIn($this->paymentMethod, ['credit_card', 'pix'], 'payments.payment_method');
 
@@ -31,9 +29,9 @@ final readonly class OrderPaymentData extends PagarmeData
     }
 
     /**
-     * @param  OrderSplitData[]|null  $split
+     * @param  SplitData[]|null  $split
      */
-    public static function creditCard(OrderCreditCardData $creditCard, ?array $split = null): self
+    public static function creditCard(CreditCardData $creditCard, ?array $split = null): self
     {
         return new self(
             paymentMethod: 'credit_card',
@@ -43,9 +41,9 @@ final readonly class OrderPaymentData extends PagarmeData
     }
 
     /**
-     * @param  OrderSplitData[]|null  $split
+     * @param  SplitData[]|null  $split
      */
-    public static function pix(OrderPixData $pix, ?array $split = null): self
+    public static function pix(PixData $pix, ?array $split = null): self
     {
         return new self(
             paymentMethod: 'pix',

+ 2 - 2
app/Data/Pagarme/Request/OrderRequestData/OrderPaymentData/OrderPixData/OrderPixAdditionalInformationData.php → app/Data/Pagarme/Order/Parts/Request/PixAdditionalInformationData.php

@@ -1,10 +1,10 @@
 <?php
 
-namespace App\Data\Pagarme\Request\OrderRequestData\OrderPaymentData\OrderPixData;
+namespace App\Data\Pagarme\Order\Parts\Request;
 
 use App\Data\Pagarme\PagarmeData;
 
-final readonly class OrderPixAdditionalInformationData extends PagarmeData
+final readonly class PixAdditionalInformationData extends PagarmeData
 {
     public function __construct(
         public string $name,

+ 3 - 3
app/Data/Pagarme/Request/OrderRequestData/OrderPaymentData/OrderPixData/OrderPixData.php → app/Data/Pagarme/Order/Parts/Request/PixData.php

@@ -1,13 +1,13 @@
 <?php
 
-namespace App\Data\Pagarme\Request\OrderRequestData\OrderPaymentData\OrderPixData;
+namespace App\Data\Pagarme\Order\Parts\Request;
 
 use App\Data\Pagarme\PagarmeData;
 
-final readonly class OrderPixData extends PagarmeData
+final readonly class PixData extends PagarmeData
 {
     /**
-     * @param  OrderPixAdditionalInformationData[]|null  $additionalInformation
+     * @param  PixAdditionalInformationData[]|null  $additionalInformation
      */
 
     public function __construct(

+ 3 - 3
app/Data/Pagarme/Request/OrderRequestData/OrderPaymentData/OrderSplitData/OrderSplitData.php → app/Data/Pagarme/Order/Parts/Request/SplitData.php

@@ -1,17 +1,17 @@
 <?php
 
-namespace App\Data\Pagarme\Request\OrderRequestData\OrderPaymentData\OrderSplitData;
+namespace App\Data\Pagarme\Order\Parts\Request;
 
 use App\Data\Pagarme\PagarmeData;
 
-final readonly class OrderSplitData extends PagarmeData
+final readonly class SplitData extends PagarmeData
 {
     public function __construct(
         public int    $amount,
         public string $recipientId,
         public string $type = 'flat',
 
-        public ?OrderSplitOptionsData $options = null,
+        public ?SplitOptionsData $options = null,
     ) {
         self::requirePositiveInt($this->amount, 'split.amount');
         self::requireFilled($this->recipientId, 'split.recipient_id');

+ 2 - 2
app/Data/Pagarme/Request/OrderRequestData/OrderPaymentData/OrderSplitData/OrderSplitOptionsData.php → app/Data/Pagarme/Order/Parts/Request/SplitOptionsData.php

@@ -1,10 +1,10 @@
 <?php
 
-namespace App\Data\Pagarme\Request\OrderRequestData\OrderPaymentData\OrderSplitData;
+namespace App\Data\Pagarme\Order\Parts\Request;
 
 use App\Data\Pagarme\PagarmeData;
 
-final readonly class OrderSplitOptionsData extends PagarmeData
+final readonly class SplitOptionsData extends PagarmeData
 {
     public function __construct(
         public bool $chargeProcessingFee = false,

+ 5 - 5
app/Data/Pagarme/Response/OrderResponseData/OrderChargeResponseData/OrderChargeResponseData.php → app/Data/Pagarme/Order/Parts/Response/ChargeData.php

@@ -1,10 +1,10 @@
 <?php
 
-namespace App\Data\Pagarme\Response\OrderResponseData\OrderChargeResponseData;
+namespace App\Data\Pagarme\Order\Parts\Response;
 
 use App\Data\Pagarme\PagarmeResponseData;
 
-final readonly class OrderChargeResponseData extends PagarmeResponseData
+final readonly class ChargeData extends PagarmeResponseData
 {
     public function __construct(
         public ?string $id,
@@ -15,10 +15,10 @@ final readonly class OrderChargeResponseData extends PagarmeResponseData
         public ?string $createdAt,
         public ?string $expiresAt = null,
 
-        public ?OrderTransactionResponseData $lastTransaction,
+        public ?TransactionData $lastTransaction,
     ) {}
 
-    public function transaction(): ?OrderTransactionResponseData
+    public function transaction(): ?TransactionData
     {
         return $this->lastTransaction;
     }
@@ -37,7 +37,7 @@ final readonly class OrderChargeResponseData extends PagarmeResponseData
             expiresAt: static::arrString($payload, 'expires_at'),
 
             lastTransaction: ! empty($transaction)
-                ? OrderTransactionResponseData::fromArray($transaction)
+                ? TransactionData::fromArray($transaction)
                 : null,
         );
     }

+ 2 - 2
app/Data/Pagarme/Response/OrderResponseData/OrderCheckoutResponseData.php → app/Data/Pagarme/Order/Parts/Response/CheckoutData.php

@@ -1,10 +1,10 @@
 <?php
 
-namespace App\Data\Pagarme\Response\OrderResponseData;
+namespace App\Data\Pagarme\Order\Parts\Response;
 
 use App\Data\Pagarme\PagarmeResponseData;
 
-final readonly class OrderCheckoutResponseData extends PagarmeResponseData
+final readonly class CheckoutData extends PagarmeResponseData
 {
     public function __construct(
         public ?string $id,

+ 2 - 2
app/Data/Pagarme/Response/OrderResponseData/OrderItemResponseData.php → app/Data/Pagarme/Order/Parts/Response/ItemData.php

@@ -1,10 +1,10 @@
 <?php
 
-namespace App\Data\Pagarme\Response\OrderResponseData;
+namespace App\Data\Pagarme\Order\Parts\Response;
 
 use App\Data\Pagarme\PagarmeResponseData;
 
-final readonly class OrderItemResponseData extends PagarmeResponseData
+final readonly class ItemData extends PagarmeResponseData
 {
     public function __construct(
         public ?string $id,

+ 2 - 2
app/Data/Pagarme/Response/OrderResponseData/OrderChargeResponseData/OrderTransactionResponseData.php → app/Data/Pagarme/Order/Parts/Response/TransactionData.php

@@ -1,10 +1,10 @@
 <?php
 
-namespace App\Data\Pagarme\Response\OrderResponseData\OrderChargeResponseData;
+namespace App\Data\Pagarme\Order\Parts\Response;
 
 use App\Data\Pagarme\PagarmeResponseData;
 
-final readonly class OrderTransactionResponseData extends PagarmeResponseData
+final readonly class TransactionData extends PagarmeResponseData
 {
     public function __construct(
         public ?string $id,

+ 1 - 1
app/Data/Pagarme/Request/BankAccountUpdateRequestData.php → app/Data/Pagarme/Recipient/BankAccountUpdateRequestData.php

@@ -1,6 +1,6 @@
 <?php
 
-namespace App\Data\Pagarme\Request;
+namespace App\Data\Pagarme\Recipient;
 
 use App\Data\Pagarme\PagarmeData;
 

+ 2 - 2
app/Data/Pagarme/Request/RecipientRequestData/RecipientRegisterInformationData/RecipientAddressData.php → app/Data/Pagarme/Recipient/Parts/Request/AddressData.php

@@ -1,10 +1,10 @@
 <?php
 
-namespace App\Data\Pagarme\Request\RecipientRequestData\RecipientRegisterInformationData;
+namespace App\Data\Pagarme\Recipient\Parts\Request;
 
 use App\Data\Pagarme\PagarmeData;
 
-final readonly class RecipientAddressData extends PagarmeData
+final readonly class AddressData extends PagarmeData
 {
     public function __construct(
         public string  $street,

+ 2 - 2
app/Data/Pagarme/Request/RecipientRequestData/RecipientAutomaticAnticipationSettingsData.php → app/Data/Pagarme/Recipient/Parts/Request/AutomaticAnticipationSettingsData.php

@@ -1,10 +1,10 @@
 <?php
 
-namespace App\Data\Pagarme\Request\RecipientRequestData;
+namespace App\Data\Pagarme\Recipient\Parts\Request;
 
 use App\Data\Pagarme\PagarmeData;
 
-final readonly class RecipientAutomaticAnticipationSettingsData extends PagarmeData
+final readonly class AutomaticAnticipationSettingsData extends PagarmeData
 {
     public function __construct(
         public bool $enabled,

+ 2 - 2
app/Data/Pagarme/Request/RecipientRequestData/RecipientBankAccountData.php → app/Data/Pagarme/Recipient/Parts/Request/BankAccountData.php

@@ -1,10 +1,10 @@
 <?php
 
-namespace App\Data\Pagarme\Request\RecipientRequestData;
+namespace App\Data\Pagarme\Recipient\Parts\Request;
 
 use App\Data\Pagarme\PagarmeData;
 
-final readonly class RecipientBankAccountData extends PagarmeData
+final readonly class BankAccountData extends PagarmeData
 {
     public function __construct(
         public string  $holderName,

+ 2 - 2
app/Data/Pagarme/Request/RecipientRequestData/RecipientRegisterInformationData/RecipientPhoneNumbersData/RecipientPhoneData.php → app/Data/Pagarme/Recipient/Parts/Request/PhoneData.php

@@ -1,10 +1,10 @@
 <?php
 
-namespace App\Data\Pagarme\Request\RecipientRequestData\RecipientRegisterInformationData\RecipientPhoneNumbersData;
+namespace App\Data\Pagarme\Recipient\Parts\Request;
 
 use App\Data\Pagarme\PagarmeData;
 
-final readonly class RecipientPhoneData extends PagarmeData
+final readonly class PhoneData extends PagarmeData
 {
     public function __construct(
         public string $ddd,

+ 17 - 0
app/Data/Pagarme/Recipient/Parts/Request/PhoneNumbersData.php

@@ -0,0 +1,17 @@
+<?php
+
+namespace App\Data\Pagarme\Recipient\Parts\Request;
+
+use App\Data\Pagarme\PagarmeData;
+
+final readonly class PhoneNumbersData extends PagarmeData
+{
+    public function __construct(
+        public PhoneData $phone,
+    ) {}
+
+    public function toArray(): array
+    {
+        return [$this->phone->toArray()];
+    }
+}

+ 4 - 5
app/Data/Pagarme/Request/RecipientRequestData/RecipientRegisterInformationData/RecipientRegisterInformationData.php → app/Data/Pagarme/Recipient/Parts/Request/RegisterInformationData.php

@@ -1,11 +1,10 @@
 <?php
 
-namespace App\Data\Pagarme\Request\RecipientRequestData\RecipientRegisterInformationData;
+namespace App\Data\Pagarme\Recipient\Parts\Request;
 
 use App\Data\Pagarme\PagarmeData;
-use App\Data\Pagarme\Request\RecipientRequestData\RecipientRegisterInformationData\RecipientPhoneNumbersData\RecipientPhoneNumbersData;
 
-final readonly class RecipientRegisterInformationData extends PagarmeData
+final readonly class RegisterInformationData extends PagarmeData
 {
     public function __construct(
         public string  $name,
@@ -16,8 +15,8 @@ final readonly class RecipientRegisterInformationData extends PagarmeData
         public int     $monthlyIncome,
         public string  $professionalOccupation,
 
-        public RecipientPhoneNumbersData $phoneNumbers,
-        public RecipientAddressData      $address,
+        public PhoneNumbersData $phoneNumbers,
+        public AddressData      $address,
     ) {
         self::requireFilled($this->name, 'register_information.name');
         self::requireFilled($this->email, 'register_information.email');

+ 2 - 2
app/Data/Pagarme/Request/RecipientRequestData/RecipientTransferSettingsData.php → app/Data/Pagarme/Recipient/Parts/Request/TransferSettingsData.php

@@ -1,10 +1,10 @@
 <?php
 
-namespace App\Data\Pagarme\Request\RecipientRequestData;
+namespace App\Data\Pagarme\Recipient\Parts\Request;
 
 use App\Data\Pagarme\PagarmeData;
 
-final readonly class RecipientTransferSettingsData extends PagarmeData
+final readonly class TransferSettingsData extends PagarmeData
 {
     public function __construct(
         public bool   $transferEnabled,

+ 2 - 2
app/Data/Pagarme/Response/RecipientResponseData/RecipientBankAccountResponseData.php → app/Data/Pagarme/Recipient/Parts/Response/BankAccountData.php

@@ -1,10 +1,10 @@
 <?php
 
-namespace App\Data\Pagarme\Response\RecipientResponseData;
+namespace App\Data\Pagarme\Recipient\Parts\Response;
 
 use App\Data\Pagarme\PagarmeResponseData;
 
-final readonly class RecipientBankAccountResponseData extends PagarmeResponseData
+final readonly class BankAccountData extends PagarmeResponseData
 {
     public function __construct(
         public ?string $holderName,

+ 9 - 6
app/Data/Pagarme/Request/RecipientRequestData/RecipientRequestData.php → app/Data/Pagarme/Recipient/RecipientRequestData.php

@@ -1,19 +1,22 @@
 <?php
 
-namespace App\Data\Pagarme\Request\RecipientRequestData;
+namespace App\Data\Pagarme\Recipient;
 
 use App\Data\Pagarme\PagarmeData;
-use App\Data\Pagarme\Request\RecipientRequestData\RecipientRegisterInformationData\RecipientRegisterInformationData;
+use App\Data\Pagarme\Recipient\Parts\Request\AutomaticAnticipationSettingsData;
+use App\Data\Pagarme\Recipient\Parts\Request\BankAccountData;
+use App\Data\Pagarme\Recipient\Parts\Request\RegisterInformationData;
+use App\Data\Pagarme\Recipient\Parts\Request\TransferSettingsData;
 
 final readonly class RecipientRequestData extends PagarmeData
 {
     public function __construct(
         public string $code,
 
-        public RecipientRegisterInformationData           $registerInformation,
-        public RecipientBankAccountData                   $defaultBankAccount,
-        public RecipientTransferSettingsData              $transferSettings,
-        public RecipientAutomaticAnticipationSettingsData $automaticAnticipationSettings,
+        public RegisterInformationData           $registerInformation,
+        public BankAccountData                   $defaultBankAccount,
+        public TransferSettingsData              $transferSettings,
+        public AutomaticAnticipationSettingsData $automaticAnticipationSettings,
     ) {
         self::requireFilled($this->code, 'code');
     }

+ 4 - 3
app/Data/Pagarme/Response/RecipientResponseData/RecipientResponseData.php → app/Data/Pagarme/Recipient/RecipientResponseData.php

@@ -1,8 +1,9 @@
 <?php
 
-namespace App\Data\Pagarme\Response\RecipientResponseData;
+namespace App\Data\Pagarme\Recipient;
 
 use App\Data\Pagarme\PagarmeResponseData;
+use App\Data\Pagarme\Recipient\Parts\Response\BankAccountData;
 
 final readonly class RecipientResponseData extends PagarmeResponseData
 {
@@ -14,7 +15,7 @@ final readonly class RecipientResponseData extends PagarmeResponseData
         public ?string $type,
         public ?string $status,
 
-        public ?RecipientBankAccountResponseData $defaultBankAccount = null,
+        public ?BankAccountData $defaultBankAccount = null,
 
         public ?string $createdAt = null,
         public ?string $updatedAt = null,
@@ -44,7 +45,7 @@ final readonly class RecipientResponseData extends PagarmeResponseData
             status:   static::arrString($payload, 'status'),
 
             defaultBankAccount: ! empty($bankAccount)
-                ? RecipientBankAccountResponseData::fromArray($bankAccount)
+                ? BankAccountData::fromArray($bankAccount)
                 : null,
 
             createdAt: static::arrString($payload, 'created_at'),

+ 0 - 17
app/Data/Pagarme/Request/RecipientRequestData/RecipientRegisterInformationData/RecipientPhoneNumbersData/RecipientPhoneNumbersData.php

@@ -1,17 +0,0 @@
-<?php
-
-namespace App\Data\Pagarme\Request\RecipientRequestData\RecipientRegisterInformationData\RecipientPhoneNumbersData;
-
-use App\Data\Pagarme\PagarmeData;
-
-final readonly class RecipientPhoneNumbersData extends PagarmeData
-{
-    public function __construct(
-        public RecipientPhoneData $phone,
-    ) {}
-
-    public function toArray(): array
-    {
-        return [$this->phone->toArray()];
-    }
-}

+ 1 - 1
app/Data/Pagarme/Request/TransferRequestData.php → app/Data/Pagarme/Transfer/TransferRequestData.php

@@ -1,6 +1,6 @@
 <?php
 
-namespace App\Data\Pagarme\Request;
+namespace App\Data\Pagarme\Transfer;
 
 use App\Data\Pagarme\PagarmeData;
 

+ 1 - 1
app/Data/Pagarme/Response/TransferResponseData.php → app/Data/Pagarme/Transfer/TransferResponseData.php

@@ -1,6 +1,6 @@
 <?php
 
-namespace App\Data\Pagarme\Response;
+namespace App\Data\Pagarme\Transfer;
 
 use App\Data\Pagarme\PagarmeResponseData;
 

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

@@ -36,6 +36,11 @@ class ProviderWithdrawalController extends Controller
         ]);
     }
 
+    public function fees(): JsonResponse
+    {
+        return $this->successResponse(payload: $this->service->getWithdrawalFees());
+    }
+
     public function splits(): JsonResponse
     {
         $provider = $this->resolveProvider();

+ 2 - 2
app/Http/Controllers/WebhookController.php

@@ -27,7 +27,7 @@ class WebhookController extends Controller
 
     private function validPagarmeCredentials(Request $request): bool
     {
-        $configuredUser = config('services.pagarme.webhook_user');
+        $configuredUser     = config('services.pagarme.webhook_user');
         $configuredPassword = config('services.pagarme.webhook_password');
 
         if (empty($configuredUser) || empty($configuredPassword)) {
@@ -41,7 +41,7 @@ class WebhookController extends Controller
 
     private function validBasicAuthCredentials(Request $request, string $configuredUser, string $configuredPassword): bool
     {
-        $receivedUser = $request->getUser();
+        $receivedUser     = $request->getUser();
         $receivedPassword = $request->getPassword();
 
         return is_string($receivedUser)

+ 1 - 2
app/Jobs/FinishScheduleJob.php

@@ -82,8 +82,7 @@ class FinishScheduleJob implements ShouldQueue
 
             $serviceAmount = (float) $schedule->total_amount;
 
-            $serviceFee = ($serviceAmount * (float) config('services.pagarme.platform_fee_rate', 0.11))
-                + (float) config('services.pagarme.transfer_fee_amount', 3.67);
+            $serviceFee = round($serviceAmount * (float) config('services.pagarme.platform_fee_rate'), 2);
 
             $finalAmount = $serviceAmount + $serviceFee;
 

+ 10 - 10
app/Services/Pagarme/PagarmeAnticipationService.php

@@ -2,9 +2,9 @@
 
 namespace App\Services\Pagarme;
 
-use App\Data\Pagarme\Request\BulkAnticipationRequestData;
-use App\Data\Pagarme\Request\OrderRequestData\OrderRequestData;
-use App\Data\Pagarme\Response\BulkAnticipationResponseData;
+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\SendsPagarmeRequests;
 use Illuminate\Support\Facades\Log;
@@ -48,9 +48,9 @@ class PagarmeAnticipationService
                 path:   "/recipients/{$recipientId}/bulk_anticipations",
 
                 payload: new BulkAnticipationRequestData(
-                    paymentDate:      now()->toISOString(),
-                    timeframe:        'start',
-                    requestedAmount:  $requestedAmount,
+                    paymentDate:       now()->toISOString(),
+                    timeframe:         'start',
+                    requestedAmount:   $requestedAmount,
                     automaticTransfer: false,
                 ),
 
@@ -63,11 +63,11 @@ class PagarmeAnticipationService
             return $response;
         } catch (Throwable $e) {
             Log::channel('pagarme')->warning('Falha ao criar antecipacao no Pagar.me.', [
-                'payment_id'    => $payment->id,
-                'provider_id'   => $payment->provider_id,
-                'recipient_id'  => $recipientId,
+                'payment_id'       => $payment->id,
+                'provider_id'      => $payment->provider_id,
+                'recipient_id'     => $recipientId,
                 'requested_amount' => $requestedAmount,
-                'error'         => $e->getMessage(),
+                'error'            => $e->getMessage(),
             ]);
 
             return null;

+ 4 - 4
app/Services/Pagarme/PagarmeCardService.php

@@ -2,9 +2,9 @@
 
 namespace App\Services\Pagarme;
 
-use App\Data\Pagarme\Request\CardRequestData\CardBillingAddressData;
-use App\Data\Pagarme\Request\CardRequestData\CardRequestData;
-use App\Data\Pagarme\Response\CardResponseData;
+use App\Data\Pagarme\Card\CardRequestData;
+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\SendsPagarmeRequests;
@@ -38,7 +38,7 @@ class PagarmeCardService
                 token: $paymentMethod->token,
                 label: $paymentMethod->card_name,
 
-                billingAddress: CardBillingAddressData::fromAddress(
+                billingAddress: BillingAddressData::fromAddress(
                     Address::query()
                         ->with(['city.state', 'state'])
                         ->where('source', 'client')

+ 12 - 12
app/Services/Pagarme/PagarmeCustomerService.php

@@ -2,11 +2,11 @@
 
 namespace App\Services\Pagarme;
 
-use App\Data\Pagarme\Request\CustomerRequestData\CustomerAddressRequestData;
-use App\Data\Pagarme\Request\CustomerRequestData\CustomerPhonesRequestData\CustomerPhoneData;
-use App\Data\Pagarme\Request\CustomerRequestData\CustomerPhonesRequestData\CustomerPhonesRequestData;
-use App\Data\Pagarme\Request\CustomerRequestData\CustomerRequestData;
-use App\Data\Pagarme\Response\CustomerResponseData\CustomerResponseData;
+use App\Data\Pagarme\Customer\CustomerRequestData;
+use App\Data\Pagarme\Customer\CustomerResponseData;
+use App\Data\Pagarme\Customer\Parts\Request\AddressData;
+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\SendsPagarmeRequests;
@@ -24,7 +24,7 @@ class PagarmeCustomerService
 
         $client->loadMissing('user');
 
-        $name  = $client->user?->name ?? $data['name'] ?? 'Cliente';
+        $name  = $client->user?->name  ?? $data['name']  ?? 'Cliente';
         $email = $client->user?->email ?? $data['email'] ?? null;
         $code  = $client->ensureGatewayCode();
 
@@ -66,7 +66,7 @@ class PagarmeCustomerService
 
     //
 
-    private function buildAddressData(array $data): CustomerAddressRequestData
+    private function buildAddressData(array $data): AddressData
     {
         $line1Parts = array_filter([
             (string) ($data['number'] ?? '0'),
@@ -74,7 +74,7 @@ class PagarmeCustomerService
             (string) ($data['district'] ?? ''),
         ], static fn ($value) => $value !== '');
 
-        return new CustomerAddressRequestData(
+        return new AddressData(
             line1:   implode(', ', $line1Parts),
             line2:   (string) ($data['complement'] ?? $data['instructions'] ?? ''),
             zipCode: $this->digits($data['zip_code'] ?? null),
@@ -84,12 +84,12 @@ class PagarmeCustomerService
         );
     }
 
-    private function buildPhones(?string $phone): CustomerPhonesRequestData
+    private function buildPhones(?string $phone): PhonesData
     {
         $digits = $this->digits($phone);
 
         if ($digits === '') {
-            return new CustomerPhonesRequestData;
+            return new PhonesData;
         }
 
         $areaCode = substr($digits, 0, 2);
@@ -100,8 +100,8 @@ class PagarmeCustomerService
             $number   = $digits;
         }
 
-        return new CustomerPhonesRequestData(
-            mobilePhone: new CustomerPhoneData(
+        return new PhonesData(
+            mobilePhone: new PhoneData(
                 countryCode: '55',
                 areaCode:    $areaCode,
                 number:      $number,

+ 76 - 27
app/Services/Pagarme/PagarmePaymentService.php

@@ -2,19 +2,19 @@
 
 namespace App\Services\Pagarme;
 
-use App\Data\Pagarme\Request\CustomerRequestData\CustomerAddressRequestData;
-use App\Data\Pagarme\Request\CustomerRequestData\CustomerPhonesRequestData\CustomerPhoneData;
-use App\Data\Pagarme\Request\CustomerRequestData\CustomerPhonesRequestData\CustomerPhonesRequestData;
-use App\Data\Pagarme\Request\CustomerRequestData\CustomerRequestData;
-use App\Data\Pagarme\Request\OrderRequestData\OrderItemData;
-use App\Data\Pagarme\Request\OrderRequestData\OrderPaymentData\OrderCreditCardData;
-use App\Data\Pagarme\Request\OrderRequestData\OrderPaymentData\OrderPaymentData;
-use App\Data\Pagarme\Request\OrderRequestData\OrderPaymentData\OrderPixData\OrderPixAdditionalInformationData;
-use App\Data\Pagarme\Request\OrderRequestData\OrderPaymentData\OrderPixData\OrderPixData;
-use App\Data\Pagarme\Request\OrderRequestData\OrderPaymentData\OrderSplitData\OrderSplitData;
-use App\Data\Pagarme\Request\OrderRequestData\OrderPaymentData\OrderSplitData\OrderSplitOptionsData;
-use App\Data\Pagarme\Request\OrderRequestData\OrderRequestData;
-use App\Data\Pagarme\Response\OrderResponseData\OrderResponseData;
+use App\Data\Pagarme\Customer\CustomerRequestData;
+use App\Data\Pagarme\Customer\Parts\Request\AddressData;
+use App\Data\Pagarme\Customer\Parts\Request\PhoneData;
+use App\Data\Pagarme\Customer\Parts\Request\PhonesData;
+use App\Data\Pagarme\Order\OrderRequestData;
+use App\Data\Pagarme\Order\OrderResponseData;
+use App\Data\Pagarme\Order\Parts\Request\CreditCardData;
+use App\Data\Pagarme\Order\Parts\Request\ItemData;
+use App\Data\Pagarme\Order\Parts\Request\PaymentData;
+use App\Data\Pagarme\Order\Parts\Request\PixAdditionalInformationData;
+use App\Data\Pagarme\Order\Parts\Request\PixData;
+use App\Data\Pagarme\Order\Parts\Request\SplitData;
+use App\Data\Pagarme\Order\Parts\Request\SplitOptionsData;
 use App\Enums\PaymentSplitStatusEnum;
 use App\Enums\PaymentStatusEnum;
 use App\Models\Address;
@@ -35,6 +35,50 @@ class PagarmePaymentService
         private readonly PagarmeAnticipationService $anticipationService,
     ) {}
 
+    public function calculatePaymentAmounts(float $serviceAmount, string $paymentMethod): array
+    {
+        $installments = 1;
+
+        if ($serviceAmount <= 0) {
+            throw new \InvalidArgumentException('Valor do servico precisa ser maior que zero.');
+        }
+
+        if (! in_array($paymentMethod, ['credit_card', 'pix'], true)) {
+            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;
+
+        $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;
+
+        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,
+        ];
+    }
+
     public function processPayment(
         Payment  $payment,
         Schedule $schedule,
@@ -55,9 +99,9 @@ class PagarmePaymentService
         $orderOptions = array_merge(['split' => $split], $pixOptions);
 
         if ($paymentMethod === 'credit_card') {
-            $creditCard = new OrderCreditCardData(
+            $creditCard = new CreditCardData(
                 cardId:              $cardId,
-                installments:        1,
+                installments:        $payment->installments,
                 statementDescriptor: Str::limit((string) config('app.name', 'SOFTPAR'), 13, ''),
                 operationType:       'auth_and_capture',
             );
@@ -75,11 +119,11 @@ class PagarmePaymentService
             return $result;
         }
 
-        $pixData = new OrderPixData(
+        $pixData = new PixData(
             expiresIn: 1800,
 
             additionalInformation: [
-                new OrderPixAdditionalInformationData(
+                new PixAdditionalInformationData(
                     name:  'Agendamento',
                     value: (string) $schedule->id,
                 ),
@@ -99,7 +143,7 @@ class PagarmePaymentService
         Payment             $payment,
         array               $items,
         CustomerRequestData $customer,
-        OrderCreditCardData $creditCard,
+        CreditCardData      $creditCard,
         array               $options = []
     ): array {
         return $this->createOrder(
@@ -120,7 +164,7 @@ class PagarmePaymentService
         Payment             $payment,
         array               $items,
         CustomerRequestData $customer,
-        OrderPixData        $pix,
+        PixData             $pix,
         array               $options = []
     ): array {
         return $this->createOrder(
@@ -141,7 +185,7 @@ class PagarmePaymentService
         Payment             $payment,
         array               $items,
         CustomerRequestData $customer,
-        OrderPaymentData    $paymentMethod,
+        PaymentData         $paymentMethod,
         array               $options = []
     ): array {
         $metadata = array_merge([
@@ -275,7 +319,7 @@ class PagarmePaymentService
             }
         }
 
-        $customerAddress = new CustomerAddressRequestData(
+        $customerAddress = new AddressData(
             line1:   $line1,
             line2:   $address->complement ?: $address->instructions,
             zipCode: $zipCode,
@@ -287,8 +331,8 @@ class PagarmePaymentService
         $customerPhones = null;
 
         if ($phone) {
-            $customerPhones = new CustomerPhonesRequestData(
-                mobilePhone: new CustomerPhoneData(
+            $customerPhones = new PhonesData(
+                mobilePhone: new PhoneData(
                     countryCode: $phone['country_code'],
                     areaCode:    $phone['area_code'],
                     number:      $phone['number'],
@@ -313,7 +357,7 @@ class PagarmePaymentService
         $description = $schedule->customSchedule?->serviceType?->description
             ?? "Servico {$schedule->id}";
 
-        return [new OrderItemData(
+        return [new ItemData(
             code:        "schedule-{$schedule->id}",
             amount:      OrderRequestData::amountInCents($grossAmount),
             quantity:    1,
@@ -340,6 +384,11 @@ class PagarmePaymentService
         ];
     }
 
+    private function roundMoneyUp(float $amount): float
+    {
+        return ceil($amount * 100) / 100;
+    }
+
     private function buildSplit(Payment $payment, array $options): array
     {
         $transfers = PaymentSplit::query()
@@ -357,19 +406,19 @@ class PagarmePaymentService
         $orderAmountCents = OrderRequestData::amountInCents((float) $payment->gross_amount);
 
         $providerTotalCents = array_sum(array_map(
-            static fn (OrderSplitData $s) => $s->amount,
+            static fn (SplitData $s) => $s->amount,
             $split,
         ));
 
         $platformAmountCents = $orderAmountCents - $providerTotalCents;
 
         if ($platformAmountCents > 0) {
-            $split[] = new OrderSplitData(
+            $split[] = new SplitData(
                 amount:      $platformAmountCents,
                 recipientId: $platformRecipientId,
                 type:        'flat',
 
-                options: new OrderSplitOptionsData(
+                options: new SplitOptionsData(
                     chargeProcessingFee: true,
                     chargeRemainderFee:  true,
                     liable:              true,

+ 20 - 20
app/Services/Pagarme/PagarmeRecipientService.php

@@ -2,16 +2,16 @@
 
 namespace App\Services\Pagarme;
 
-use App\Data\Pagarme\Request\BankAccountUpdateRequestData;
-use App\Data\Pagarme\Request\RecipientRequestData\RecipientAutomaticAnticipationSettingsData;
-use App\Data\Pagarme\Request\RecipientRequestData\RecipientBankAccountData;
-use App\Data\Pagarme\Request\RecipientRequestData\RecipientRegisterInformationData\RecipientAddressData;
-use App\Data\Pagarme\Request\RecipientRequestData\RecipientRegisterInformationData\RecipientPhoneNumbersData\RecipientPhoneData;
-use App\Data\Pagarme\Request\RecipientRequestData\RecipientRegisterInformationData\RecipientPhoneNumbersData\RecipientPhoneNumbersData;
-use App\Data\Pagarme\Request\RecipientRequestData\RecipientRegisterInformationData\RecipientRegisterInformationData;
-use App\Data\Pagarme\Request\RecipientRequestData\RecipientRequestData;
-use App\Data\Pagarme\Request\RecipientRequestData\RecipientTransferSettingsData;
-use App\Data\Pagarme\Response\RecipientResponseData\RecipientResponseData;
+use App\Data\Pagarme\Recipient\BankAccountUpdateRequestData;
+use App\Data\Pagarme\Recipient\Parts\Request\AddressData;
+use App\Data\Pagarme\Recipient\Parts\Request\AutomaticAnticipationSettingsData;
+use App\Data\Pagarme\Recipient\Parts\Request\BankAccountData;
+use App\Data\Pagarme\Recipient\Parts\Request\PhoneData;
+use App\Data\Pagarme\Recipient\Parts\Request\PhoneNumbersData;
+use App\Data\Pagarme\Recipient\Parts\Request\RegisterInformationData;
+use App\Data\Pagarme\Recipient\Parts\Request\TransferSettingsData;
+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\SendsPagarmeRequests;
@@ -33,7 +33,7 @@ class PagarmeRecipientService
 
         $addressParts = $this->extractAddressParts($data);
 
-        $registerInformation = new RecipientRegisterInformationData(
+        $registerInformation = new RegisterInformationData(
             name:                   $data['recipient_name'],
             email:                  $data['recipient_email'],
             document:               $this->digits($data['recipient_document'] ?? null),
@@ -42,11 +42,11 @@ class PagarmeRecipientService
             monthlyIncome:          isset($data['monthly_income']) ? (int) $data['monthly_income'] : 1000,
             professionalOccupation: $data['professional_occupation'] ?? 'autonomo',
 
-            phoneNumbers: new RecipientPhoneNumbersData(
+            phoneNumbers: new PhoneNumbersData(
                 $this->buildRecipientPhone($data['phone'] ?? null),
             ),
 
-            address: new RecipientAddressData(
+            address: new AddressData(
                 street:         $addressParts['street'],
                 complementary:  $addressParts['complementary'],
                 streetNumber:   $addressParts['street_number'],
@@ -68,13 +68,13 @@ class PagarmeRecipientService
             registerInformation: $registerInformation,
             defaultBankAccount:  $defaultBankAccount,
 
-            transferSettings: new RecipientTransferSettingsData(
+            transferSettings: new TransferSettingsData(
                 transferEnabled:  false,
                 transferInterval: 'Daily',
                 transferDay:      0,
             ),
 
-            automaticAnticipationSettings: new RecipientAutomaticAnticipationSettingsData(
+            automaticAnticipationSettings: new AutomaticAnticipationSettingsData(
                 enabled: false,
             ),
         );
@@ -153,9 +153,9 @@ class PagarmeRecipientService
 
     //
 
-    private function buildRecipientBankAccount(array $data): RecipientBankAccountData
+    private function buildRecipientBankAccount(array $data): BankAccountData
     {
-        return new RecipientBankAccountData(
+        return new BankAccountData(
             holderName:        $this->normalizeHolderName($data['holder_name']),
             holderType:        $data['holder_type'],
             holderDocument:    $this->digits($data['holder_document']),
@@ -168,12 +168,12 @@ class PagarmeRecipientService
         );
     }
 
-    private function buildRecipientPhone(?string $phone): RecipientPhoneData
+    private function buildRecipientPhone(?string $phone): PhoneData
     {
         $digits = $this->digits($phone);
 
         if (strlen($digits) < 10) {
-            return new RecipientPhoneData(
+            return new PhoneData(
                 ddd:    '11',
                 number: '999999999',
                 type:   'mobile',
@@ -184,7 +184,7 @@ class PagarmeRecipientService
             $digits = substr($digits, 2);
         }
 
-        return new RecipientPhoneData(
+        return new PhoneData(
             ddd:    substr($digits, 0, 2),
             number: substr($digits, 2),
             type:   'mobile',

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

@@ -2,8 +2,8 @@
 
 namespace App\Services\Pagarme;
 
-use App\Data\Pagarme\Request\TransferRequestData;
-use App\Data\Pagarme\Response\TransferResponseData;
+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\SendsPagarmeRequests;

+ 10 - 15
app/Services/PaymentService.php

@@ -162,15 +162,10 @@ class PaymentService
 
         $serviceAmount = (float) $schedule->total_amount;
 
-        $platformFee = round($serviceAmount * (float) config('services.pagarme.platform_fee_rate', 0.11), 2);
-        $transferFee = round((float) config('services.pagarme.transfer_fee_amount', 3.67), 2);
-        $grossAmount = round($serviceAmount + $platformFee + $transferFee, 2);
-
-        $platformRecipientId = config('services.pagarme.platform_recipient_id');
-
-        if ($platformFee > 0 && empty($platformRecipientId)) {
-            throw new \InvalidArgumentException('PAGARME_PLATFORM_RECIPIENT_ID precisa estar configurado para receber a taxa da plataforma no split.');
-        }
+        $amounts = $this->pagarmePaymentService->calculatePaymentAmounts(
+            serviceAmount: $serviceAmount,
+            paymentMethod: $paymentMethod,
+        );
 
         $payment = Payment::create([
             'schedule_id'              => $schedule->id,
@@ -181,18 +176,18 @@ class PaymentService
             'gateway_code'             => 'payment-'.(string) Str::uuid(),
             'payment_method'           => $paymentMethod,
             'status'                   => PaymentStatusEnum::PENDING,
-            'gross_amount'             => $grossAmount,
+            'gross_amount'             => $amounts['gross_amount'],
             'gateway_fee_amount'       => 0,
-            'platform_fee_amount'      => $platformFee,
-            'net_amount'               => $grossAmount,
+            'platform_fee_amount'      => $amounts['platform_fee_amount'],
+            'net_amount'               => $amounts['gross_amount'],
             'currency'                 => 'BRL',
             'installments'             => 1,
             'expires_at'               => $paymentMethod === 'pix' ? Carbon::now()->addMinutes(30) : null,
 
             'metadata' => [
-                'service_amount' => number_format($serviceAmount, 2, '.', ''),
-                'platform_fee'   => number_format($platformFee, 2, '.', ''),
-                'transfer_fee'   => number_format($transferFee, 2, '.', ''),
+                '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, '.', ''),
             ],
         ]);
 

+ 27 - 7
app/Services/ProviderWithdrawalService.php

@@ -19,6 +19,13 @@ class ProviderWithdrawalService
         private readonly PagarmeTransferService $pagarmeTransfer,
     ) {}
 
+    public function getWithdrawalFees(): array
+    {
+        return [
+            'payment_transfer_fee_amount' => $this->paymentTransferFeeAmount(),
+        ];
+    }
+
     public function getAvailableBalance(Provider $provider): float
     {
         $earnings = (float) PaymentSplit::query()
@@ -87,7 +94,14 @@ class ProviderWithdrawalService
                 throw new \RuntimeException('Saldo disponivel insuficiente para saque.');
             }
 
-            $amountInCents = (int) round($available * 100);
+            $paymentTransferFeeAmount = $this->paymentTransferFeeAmount();
+            $netAmount = max(0, round($available - $paymentTransferFeeAmount, 2));
+
+            if ($netAmount <= 0) {
+                throw new \RuntimeException('Saldo disponivel insuficiente para cobrir a taxa de transferencia.');
+            }
+
+            $amountInCents = (int) round($netAmount * 100);
 
             $idempotencyKey = sprintf('withdrawal-%d-%s', $provider->id, now()->timestamp);
 
@@ -97,14 +111,17 @@ class ProviderWithdrawalService
                 'provider_id'     => $provider->id,
                 'recipient_id'    => $provider->recipient_id,
                 'idempotency_key' => $idempotencyKey,
-                'gross_amount'    => $available,
-                'net_amount'      => $available,
+                'gross_amount'       => $available,
+                'gateway_fee_amount' => $paymentTransferFeeAmount,
+                'net_amount'         => $netAmount,
                 'status'          => ProviderWithdrawalStatusEnum::PENDING_TRANSFER,
                 'bank_account'    => $bankAccount,
 
                 'metadata' => [
-                    'provider_id' => $provider->id,
-                    'amount'      => $available,
+                    'provider_id'                  => $provider->id,
+                    'gross_amount'                 => $available,
+                    'payment_transfer_fee_amount'  => $paymentTransferFeeAmount,
+                    'net_amount'                   => $netAmount,
                 ],
             ]);
 
@@ -119,8 +136,6 @@ class ProviderWithdrawalService
                     'transfer_id'        => $transfer->id,
                     'status'             => $transfer->status ?? ProviderWithdrawalStatusEnum::PROCESSING->value,
                     'type'               => $transfer->type,
-                    'gateway_fee_amount' => ($transfer->fee ?? 0) / 100,
-                    'net_amount'         => max(0, $available - ($transfer->fee ?? 0) / 100),
                     'gateway_payload'    => $transfer->toArray(),
                 ])->save();
 
@@ -251,4 +266,9 @@ class ProviderWithdrawalService
         return Carbon::now()->subDays(5)->format('Y-m-d H:i:s');
     }
 
+    private function paymentTransferFeeAmount(): float
+    {
+        return round((float) config('services.pagarme.transfer_fee_amount', 3.67), 2);
+    }
+
 }

+ 6 - 3
config/services.php

@@ -46,9 +46,12 @@ return [
         'webhook_user'          => env('PAGARME_WEBHOOK_USER'),
         '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),
-        'transfer_fee_amount'   => env('PAGARME_TRANSFER_FEE_AMOUNT', 3.67),
+
+        '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),
     ],
 
 ];

+ 1 - 0
routes/authRoutes/provider.php

@@ -10,6 +10,7 @@ Route::patch('/provider/{id}/reject',             [ProviderController::class, 'r
 Route::get('/provider/payment-splits',            [ProviderWithdrawalController::class, 'splits'])->middleware('permission:config.provider,view');
 Route::get('/provider-withdrawals',               [ProviderWithdrawalController::class, 'all'])->middleware('permission:payment,view');
 Route::get('/provider/withdrawals/balance',       [ProviderWithdrawalController::class, 'balance'])->middleware('permission:config.provider,view');
+Route::get('/provider/withdrawals/fees',          [ProviderWithdrawalController::class, 'fees'])->middleware('permission:config.provider,view');
 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');