소스 검색

refactor: responses do pagarme

Gustavo Mantovani 1 주 전
부모
커밋
bc04676059
22개의 변경된 파일367개의 추가작업 그리고 378개의 파일을 삭제
  1. 62 0
      app/Data/Pagarme/PagarmeResponseData.php
  2. 2 0
      app/Data/Pagarme/Request/PagarmeCardRequestData/PagarmeCardBillingAddressData.php
  3. 2 0
      app/Data/Pagarme/Request/PagarmeOrderRequestData/PagarmeOrderPaymentData/PagarmeOrderPaymentData.php
  4. 18 16
      app/Data/Pagarme/Response/PagarmeCardResponseData.php
  5. 19 1
      app/Data/Pagarme/Response/PagarmeCustomerResponseData/PagarmeCustomerAddressResponseData.php
  6. 14 1
      app/Data/Pagarme/Response/PagarmeCustomerResponseData/PagarmeCustomerPhonesResponseData/PagarmeCustomerPhonesResponseData.php
  7. 12 1
      app/Data/Pagarme/Response/PagarmeCustomerResponseData/PagarmeCustomerPhonesResponseData/PagarmePhoneResponseData.php
  8. 27 6
      app/Data/Pagarme/Response/PagarmeCustomerResponseData/PagarmeCustomerResponseData.php
  9. 21 1
      app/Data/Pagarme/Response/PagarmeOrderResponseData/PagarmeOrderChargeResponseData/PagarmeOrderChargeResponseData.php
  10. 15 1
      app/Data/Pagarme/Response/PagarmeOrderResponseData/PagarmeOrderChargeResponseData/PagarmeOrderTransactionResponseData.php
  11. 12 1
      app/Data/Pagarme/Response/PagarmeOrderResponseData/PagarmeOrderCheckoutResponseData.php
  12. 15 1
      app/Data/Pagarme/Response/PagarmeOrderResponseData/PagarmeOrderItemResponseData.php
  13. 37 6
      app/Data/Pagarme/Response/PagarmeOrderResponseData/PagarmeOrderResponseData.php
  14. 18 1
      app/Data/Pagarme/Response/PagarmeRecipientResponseData/PagarmeRecipientBankAccountResponseData.php
  15. 22 11
      app/Data/Pagarme/Response/PagarmeRecipientResponseData/PagarmeRecipientResponseData.php
  16. 16 9
      app/Data/Pagarme/Response/PagarmeTransferResponseData.php
  17. 4 25
      app/Services/Pagarme/PagarmeCardService.php
  18. 2 56
      app/Services/Pagarme/PagarmeCustomerService.php
  19. 3 133
      app/Services/Pagarme/PagarmePaymentService.php
  20. 3 33
      app/Services/Pagarme/PagarmeRecipientService.php
  21. 39 51
      app/Services/Pagarme/PagarmeTransferService.php
  22. 4 24
      app/Services/ProviderWithdrawalService.php

+ 62 - 0
app/Data/Pagarme/PagarmeResponseData.php

@@ -0,0 +1,62 @@
+<?php
+
+namespace App\Data\Pagarme;
+
+abstract readonly class PagarmeResponseData
+{
+    abstract public static function fromArray(array $payload): static;
+
+    abstract public function toArray(): array;
+
+    //
+
+    protected static function arrArray(array $payload, string $key): array
+    {
+        if (! array_key_exists($key, $payload) || ! is_array($payload[$key])) {
+            return [];
+        }
+
+        return $payload[$key];
+    }
+
+    protected static function arrBool(array $payload, string $key): ?bool
+    {
+        if (! array_key_exists($key, $payload)) {
+            return null;
+        }
+
+        $value = $payload[$key];
+
+        return $value !== null && $value !== '' ? (bool) $value : null;
+    }
+
+    protected static function arrGet(array $payload, int|string $key, mixed $default = null): mixed
+    {
+        return array_key_exists($key, $payload) ? $payload[$key] : $default;
+    }
+
+    protected static function arrInt(array $payload, string $key): ?int
+    {
+        if (! array_key_exists($key, $payload)) {
+            return null;
+        }
+
+        return (int) $payload[$key];
+    }
+
+    protected static function arrMap(array $payload, string $key, callable $fn): array
+    {
+        return array_map($fn, static::arrArray($payload, $key));
+    }
+
+    protected static function arrString(array $payload, string $key): ?string
+    {
+        if (! array_key_exists($key, $payload)) {
+            return null;
+        }
+
+        $value = $payload[$key];
+
+        return $value !== null && $value !== '' ? (string) $value : null;
+    }
+}

+ 2 - 0
app/Data/Pagarme/Request/PagarmeCardRequestData/PagarmeCardBillingAddressData.php

@@ -43,6 +43,8 @@ final readonly class PagarmeCardBillingAddressData extends PagarmeData
         );
     }
 
+    //
+
     public function toArray(): array
     {
         return $this->filterFilledRecursive([

+ 2 - 0
app/Data/Pagarme/Request/PagarmeOrderRequestData/PagarmeOrderPaymentData/PagarmeOrderPaymentData.php

@@ -50,6 +50,8 @@ final readonly class PagarmeOrderPaymentData extends PagarmeData
         );
     }
 
+    //
+
     public function toArray(): array
     {
         $payload = $this->filterFilledRecursive([

+ 18 - 16
app/Data/Pagarme/Response/PagarmeCardResponseData.php

@@ -2,7 +2,7 @@
 
 namespace App\Data\Pagarme\Response;
 
-final readonly class PagarmeCardResponseData
+final readonly class PagarmeCardResponseData extends PagarmeResponseData
 {
     public function __construct(
         public ?string $id,
@@ -18,21 +18,6 @@ final readonly class PagarmeCardResponseData
         public ?string $updatedAt = null,
     ) {}
 
-    public function brand(): ?string
-    {
-        return $this->brand;
-    }
-
-    public function id(): ?string
-    {
-        return $this->id;
-    }
-
-    public function lastFourDigits(): ?string
-    {
-        return $this->lastFourDigits;
-    }
-
     public function requireId(): string
     {
         if (! $this->id) {
@@ -44,6 +29,23 @@ final readonly class PagarmeCardResponseData
 
     //
 
+    public static function fromArray(array $payload): static
+    {
+        return new self(
+            id:             static::arrString($payload, 'id'),
+            firstSixDigits: static::arrString($payload, 'first_six_digits'),
+            lastFourDigits: static::arrString($payload, 'last_four_digits'),
+            brand:          static::arrString($payload, 'brand'),
+            holderName:     static::arrString($payload, 'holder_name'),
+            expMonth:       static::arrInt($payload, 'exp_month'),
+            expYear:        static::arrInt($payload, 'exp_year'),
+            status:         static::arrString($payload, 'status'),
+            type:           static::arrString($payload, 'type'),
+            createdAt:      static::arrString($payload, 'created_at'),
+            updatedAt:      static::arrString($payload, 'updated_at'),
+        );
+    }
+
     public function toArray(): array
     {
         return [

+ 19 - 1
app/Data/Pagarme/Response/PagarmeCustomerResponseData/PagarmeCustomerAddressResponseData.php

@@ -2,7 +2,9 @@
 
 namespace App\Data\Pagarme\Response\PagarmeCustomerResponseData;
 
-final readonly class PagarmeCustomerAddressResponseData
+use App\Data\Pagarme\PagarmeResponseData;
+
+final readonly class PagarmeCustomerAddressResponseData extends PagarmeResponseData
 {
     public function __construct(
         public ?string $id,
@@ -17,6 +19,22 @@ final readonly class PagarmeCustomerAddressResponseData
         public ?string $updatedAt = null,
     ) {}
 
+    public static function fromArray(array $payload): static
+    {
+        return new self(
+            id:        static::arrString($payload, 'id'),
+            line1:     static::arrString($payload, 'line_1'),
+            line2:     static::arrString($payload, 'line_2'),
+            zipCode:   static::arrString($payload, 'zip_code'),
+            city:      static::arrString($payload, 'city'),
+            state:     static::arrString($payload, 'state'),
+            country:   static::arrString($payload, 'country'),
+            status:    static::arrString($payload, 'status'),
+            createdAt: static::arrString($payload, 'created_at'),
+            updatedAt: static::arrString($payload, 'updated_at'),
+        );
+    }
+
     public function toArray(): array
     {
         return [

+ 14 - 1
app/Data/Pagarme/Response/PagarmeCustomerResponseData/PagarmeCustomerPhonesResponseData/PagarmeCustomerPhonesResponseData.php

@@ -2,13 +2,26 @@
 
 namespace App\Data\Pagarme\Response\PagarmeCustomerResponseData\PagarmeCustomerPhonesResponseData;
 
-final readonly class PagarmeCustomerPhonesResponseData
+use App\Data\Pagarme\PagarmeResponseData;
+
+final readonly class PagarmeCustomerPhonesResponseData extends PagarmeResponseData
 {
     public function __construct(
         public ?PagarmePhoneResponseData $homePhone,
         public ?PagarmePhoneResponseData $mobilePhone,
     ) {}
 
+    public static function fromArray(array $payload): static
+    {
+        $home   = static::arrArray($payload, 'home_phone');
+        $mobile = static::arrArray($payload, 'mobile_phone');
+
+        return new self(
+            homePhone:   ! empty($home)   ? PagarmePhoneResponseData::fromArray($home)   : null,
+            mobilePhone: ! empty($mobile) ? PagarmePhoneResponseData::fromArray($mobile) : null,
+        );
+    }
+
     public function toArray(): array
     {
         return array_filter([

+ 12 - 1
app/Data/Pagarme/Response/PagarmeCustomerResponseData/PagarmeCustomerPhonesResponseData/PagarmePhoneResponseData.php

@@ -2,7 +2,9 @@
 
 namespace App\Data\Pagarme\Response\PagarmeCustomerResponseData\PagarmeCustomerPhonesResponseData;
 
-final readonly class PagarmePhoneResponseData
+use App\Data\Pagarme\PagarmeResponseData;
+
+final readonly class PagarmePhoneResponseData extends PagarmeResponseData
 {
     public function __construct(
         public ?string $countryCode,
@@ -10,6 +12,15 @@ final readonly class PagarmePhoneResponseData
         public ?string $number,
     ) {}
 
+    public static function fromArray(array $payload): static
+    {
+        return new self(
+            countryCode: static::arrString($payload, 'country_code'),
+            areaCode:    static::arrString($payload, 'area_code'),
+            number:      static::arrString($payload, 'number'),
+        );
+    }
+
     public function toArray(): array
     {
         return [

+ 27 - 6
app/Data/Pagarme/Response/PagarmeCustomerResponseData/PagarmeCustomerResponseData.php

@@ -3,8 +3,9 @@
 namespace App\Data\Pagarme\Response\PagarmeCustomerResponseData;
 
 use App\Data\Pagarme\Response\PagarmeCustomerResponseData\PagarmeCustomerPhonesResponseData\PagarmeCustomerPhonesResponseData;
+use App\Data\Pagarme\PagarmeResponseData;
 
-final readonly class PagarmeCustomerResponseData
+final readonly class PagarmeCustomerResponseData extends PagarmeResponseData
 {
     public function __construct(
         public ?string                             $id,
@@ -21,11 +22,6 @@ final readonly class PagarmeCustomerResponseData
         public ?string                             $updatedAt = null,
     ) {}
 
-    public function id(): ?string
-    {
-        return $this->id;
-    }
-
     public function requireId(): string
     {
         if (! $this->id) {
@@ -35,6 +31,31 @@ final readonly class PagarmeCustomerResponseData
         return $this->id;
     }
 
+    //
+
+    public static function fromArray(array $payload): static
+    {
+        $address = static::arrArray($payload, 'address');
+        $phones  = static::arrArray($payload, 'phones');
+
+        return new self(
+            id:           static::arrString($payload, 'id'),
+            name:         static::arrString($payload, 'name'),
+            email:        static::arrString($payload, 'email'),
+            code:         static::arrString($payload, 'code'),
+            document:     static::arrString($payload, 'document'),
+            documentType: static::arrString($payload, 'document_type'),
+            type:         static::arrString($payload, 'type'),
+            delinquent:   static::arrBool($payload, 'delinquent'),
+
+            address: ! empty($address) ? PagarmeCustomerAddressResponseData::fromArray($address) : null,
+
+            phones:    PagarmeCustomerPhonesResponseData::fromArray($phones),
+            createdAt: static::arrString($payload, 'created_at'),
+            updatedAt: static::arrString($payload, 'updated_at'),
+        );
+    }
+
     public function toArray(): array
     {
         return [

+ 21 - 1
app/Data/Pagarme/Response/PagarmeOrderResponseData/PagarmeOrderChargeResponseData/PagarmeOrderChargeResponseData.php

@@ -2,7 +2,9 @@
 
 namespace App\Data\Pagarme\Response\PagarmeOrderResponseData\PagarmeOrderChargeResponseData;
 
-final readonly class PagarmeOrderChargeResponseData
+use App\Data\Pagarme\PagarmeResponseData;
+
+final readonly class PagarmeOrderChargeResponseData extends PagarmeResponseData
 {
     public function __construct(
         public ?string                            $id,
@@ -19,6 +21,24 @@ final readonly class PagarmeOrderChargeResponseData
         return $this->lastTransaction;
     }
 
+    public static function fromArray(array $payload): static
+    {
+        $transaction = static::arrArray($payload, 'last_transaction');
+
+        return new self(
+            id:        static::arrString($payload, 'id'),
+            status:    static::arrString($payload, 'status'),
+            amount:    static::arrInt($payload, 'amount'),
+            currency:  static::arrString($payload, 'currency'),
+            paidAt:    static::arrString($payload, 'paid_at'),
+            createdAt: static::arrString($payload, 'created_at'),
+
+            lastTransaction: ! empty($transaction)
+                ? PagarmeOrderTransactionResponseData::fromArray($transaction)
+                : null,
+        );
+    }
+
     public function toArray(): array
     {
         return array_filter([

+ 15 - 1
app/Data/Pagarme/Response/PagarmeOrderResponseData/PagarmeOrderChargeResponseData/PagarmeOrderTransactionResponseData.php

@@ -2,7 +2,9 @@
 
 namespace App\Data\Pagarme\Response\PagarmeOrderResponseData\PagarmeOrderChargeResponseData;
 
-final readonly class PagarmeOrderTransactionResponseData
+use App\Data\Pagarme\PagarmeResponseData;
+
+final readonly class PagarmeOrderTransactionResponseData extends PagarmeResponseData
 {
     public function __construct(
         public ?string $id,
@@ -13,6 +15,18 @@ final readonly class PagarmeOrderTransactionResponseData
         public array   $gatewayResponse,
     ) {}
 
+    public static function fromArray(array $payload): static
+    {
+        return new self(
+            id:              static::arrString($payload, 'id'),
+            status:          static::arrString($payload, 'status'),
+            amount:          static::arrInt($payload, 'amount'),
+            createdAt:       static::arrString($payload, 'created_at'),
+            acquirerMessage: static::arrString($payload, 'acquirer_message'),
+            gatewayResponse: static::arrArray($payload, 'gateway_response'),
+        );
+    }
+
     public function toArray(): array
     {
         return [

+ 12 - 1
app/Data/Pagarme/Response/PagarmeOrderResponseData/PagarmeOrderCheckoutResponseData.php

@@ -2,7 +2,9 @@
 
 namespace App\Data\Pagarme\Response\PagarmeOrderResponseData;
 
-final readonly class PagarmeOrderCheckoutResponseData
+use App\Data\Pagarme\PagarmeResponseData;
+
+final readonly class PagarmeOrderCheckoutResponseData extends PagarmeResponseData
 {
     public function __construct(
         public ?string $id,
@@ -10,6 +12,15 @@ final readonly class PagarmeOrderCheckoutResponseData
         public ?string $url,
     ) {}
 
+    public static function fromArray(array $payload): static
+    {
+        return new self(
+            id:     static::arrString($payload, 'id'),
+            status: static::arrString($payload, 'status'),
+            url:    static::arrString($payload, 'url'),
+        );
+    }
+
     public function toArray(): array
     {
         return [

+ 15 - 1
app/Data/Pagarme/Response/PagarmeOrderResponseData/PagarmeOrderItemResponseData.php

@@ -2,7 +2,9 @@
 
 namespace App\Data\Pagarme\Response\PagarmeOrderResponseData;
 
-final readonly class PagarmeOrderItemResponseData
+use App\Data\Pagarme\PagarmeResponseData;
+
+final readonly class PagarmeOrderItemResponseData extends PagarmeResponseData
 {
     public function __construct(
         public ?string $id,
@@ -13,6 +15,18 @@ final readonly class PagarmeOrderItemResponseData
         public ?string $status,
     ) {}
 
+    public static function fromArray(array $payload): static
+    {
+        return new self(
+            id:          static::arrString($payload, 'id'),
+            code:        static::arrString($payload, 'code'),
+            amount:      static::arrInt($payload, 'amount'),
+            quantity:    static::arrInt($payload, 'quantity'),
+            description: static::arrString($payload, 'description'),
+            status:      static::arrString($payload, 'status'),
+        );
+    }
+
     public function toArray(): array
     {
         return [

+ 37 - 6
app/Data/Pagarme/Response/PagarmeOrderResponseData/PagarmeOrderResponseData.php

@@ -5,6 +5,7 @@ namespace App\Data\Pagarme\Response\PagarmeOrderResponseData;
 use App\Data\Pagarme\Response\PagarmeCustomerResponseData\PagarmeCustomerResponseData;
 use App\Data\Pagarme\Response\PagarmeOrderResponseData\PagarmeOrderChargeResponseData\PagarmeOrderChargeResponseData;
 use App\Data\Pagarme\Response\PagarmeOrderResponseData\PagarmeOrderChargeResponseData\PagarmeOrderTransactionResponseData;
+use App\Data\Pagarme\PagarmeResponseData;
 use App\Enums\PaymentStatusEnum;
 
 /**
@@ -12,7 +13,7 @@ use App\Enums\PaymentStatusEnum;
  * @param  PagarmeOrderChargeResponseData[]  $charges
  * @param  PagarmeOrderCheckoutResponseData[]  $checkouts
  */
-final readonly class PagarmeOrderResponseData
+final readonly class PagarmeOrderResponseData extends PagarmeResponseData
 {
     public function __construct(
         public ?string                      $id,
@@ -124,11 +125,6 @@ final readonly class PagarmeOrderResponseData
         return $transaction?->id ?? $charge?->id ?? $this->id;
     }
 
-    public function id(): ?string
-    {
-        return $this->id;
-    }
-
     public function lastTransaction(): ?PagarmeOrderTransactionResponseData
     {
         return $this->firstCharge()?->transaction();
@@ -172,6 +168,41 @@ final readonly class PagarmeOrderResponseData
 
     //
 
+    public static function fromArray(array $payload): static
+    {
+        $customer = static::arrArray($payload, 'customer');
+
+        return new self(
+            id:       static::arrString($payload, 'id'),
+            code:     static::arrString($payload, 'code'),
+            amount:   static::arrInt($payload, 'amount'),
+            currency: static::arrString($payload, 'currency'),
+            closed:   static::arrBool($payload, 'closed'),
+            status:   static::arrString($payload, 'status'),
+
+            items: static::arrMap($payload, 'items',
+                static fn (array $item) => PagarmeOrderItemResponseData::fromArray($item),
+            ),
+
+            customer: ! empty($customer)
+                ? PagarmeCustomerResponseData::fromArray($customer)
+                : null,
+
+            charges: static::arrMap($payload, 'charges',
+                static fn (array $charge) => PagarmeOrderChargeResponseData::fromArray($charge),
+            ),
+
+            checkouts: static::arrMap($payload, 'checkouts',
+                static fn (array $checkout) => PagarmeOrderCheckoutResponseData::fromArray($checkout),
+            ),
+
+            metadata:  static::arrArray($payload, 'metadata'),
+            createdAt: static::arrString($payload, 'created_at'),
+            updatedAt: static::arrString($payload, 'updated_at'),
+            closedAt:  static::arrString($payload, 'closed_at'),
+        );
+    }
+
     public function toArray(): array
     {
         return [

+ 18 - 1
app/Data/Pagarme/Response/PagarmeRecipientResponseData/PagarmeRecipientBankAccountResponseData.php

@@ -2,7 +2,9 @@
 
 namespace App\Data\Pagarme\Response\PagarmeRecipientResponseData;
 
-final readonly class PagarmeRecipientBankAccountResponseData
+use App\Data\Pagarme\PagarmeResponseData;
+
+final readonly class PagarmeRecipientBankAccountResponseData extends PagarmeResponseData
 {
     public function __construct(
         public ?string $holderName,
@@ -16,6 +18,21 @@ final readonly class PagarmeRecipientBankAccountResponseData
         public ?string $type,
     ) {}
 
+    public static function fromArray(array $payload): static
+    {
+        return new self(
+            holderName:        static::arrString($payload, 'holder_name'),
+            holderType:        static::arrString($payload, 'holder_type'),
+            holderDocument:    static::arrString($payload, 'holder_document'),
+            bank:              static::arrString($payload, 'bank'),
+            branchNumber:      static::arrString($payload, 'branch_number'),
+            branchCheckDigit:  static::arrString($payload, 'branch_check_digit'),
+            accountNumber:     static::arrString($payload, 'account_number'),
+            accountCheckDigit: static::arrString($payload, 'account_check_digit'),
+            type:              static::arrString($payload, 'type'),
+        );
+    }
+
     public function toArray(): array
     {
         return [

+ 22 - 11
app/Data/Pagarme/Response/PagarmeRecipientResponseData/PagarmeRecipientResponseData.php

@@ -2,7 +2,9 @@
 
 namespace App\Data\Pagarme\Response\PagarmeRecipientResponseData;
 
-final readonly class PagarmeRecipientResponseData
+use App\Data\Pagarme\PagarmeResponseData;
+
+final readonly class PagarmeRecipientResponseData extends PagarmeResponseData
 {
     public function __construct(
         public ?string                                  $id,
@@ -16,16 +18,6 @@ final readonly class PagarmeRecipientResponseData
         public ?string                                  $updatedAt          = null,
     ) {}
 
-    public function defaultBankAccount(): ?PagarmeRecipientBankAccountResponseData
-    {
-        return $this->defaultBankAccount;
-    }
-
-    public function id(): ?string
-    {
-        return $this->id;
-    }
-
     public function requireId(): string
     {
         if (! $this->id) {
@@ -37,6 +29,25 @@ final readonly class PagarmeRecipientResponseData
 
     //
 
+    public static function fromArray(array $payload): static
+    {
+        $bankAccount = static::arrArray($payload, 'default_bank_account');
+
+        return new self(
+            id:                 static::arrString($payload, 'id'),
+            name:               static::arrString($payload, 'name'),
+            email:              static::arrString($payload, 'email'),
+            document:           static::arrString($payload, 'document'),
+            type:               static::arrString($payload, 'type'),
+            status:             static::arrString($payload, 'status'),
+            defaultBankAccount: ! empty($bankAccount)
+                ? PagarmeRecipientBankAccountResponseData::fromArray($bankAccount)
+                : null,
+            createdAt:          static::arrString($payload, 'created_at'),
+            updatedAt:          static::arrString($payload, 'updated_at'),
+        );
+    }
+
     public function toArray(): array
     {
         return [

+ 16 - 9
app/Data/Pagarme/Response/PagarmeTransferResponseData.php

@@ -2,7 +2,7 @@
 
 namespace App\Data\Pagarme\Response;
 
-final readonly class PagarmeTransferResponseData
+final readonly class PagarmeTransferResponseData extends PagarmeResponseData
 {
     public function __construct(
         public ?string $id,
@@ -18,18 +18,25 @@ final readonly class PagarmeTransferResponseData
         public ?array  $metadata,
     ) {}
 
-    public function id(): ?string
-    {
-        return $this->id;
-    }
+    //
 
-    public function status(): ?string
+    public static function fromArray(array $payload): static
     {
-        return $this->status;
+        return new self(
+            id:                   static::arrString($payload, 'id'),
+            amount:               static::arrInt($payload, 'amount'),
+            type:                 static::arrString($payload, 'type'),
+            status:               static::arrString($payload, 'status'),
+            fee:                  static::arrInt($payload, 'fee'),
+            fundingDate:          static::arrString($payload, 'funding_date'),
+            fundingEstimatedDate: static::arrString($payload, 'funding_estimated_date'),
+            bankAccount:          static::arrGet($payload, 'bank_account'),
+            bankResponse:         static::arrString($payload, 'bank_response'),
+            createdAt:            static::arrString($payload, 'created_at') ?? static::arrString($payload, 'date_created'),
+            metadata:             static::arrGet($payload, 'metadata'),
+        );
     }
 
-    //
-
     public function toArray(): array
     {
         return [

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

@@ -30,7 +30,7 @@ class PagarmeCardService
             []
         );
 
-        $raw = $this->pagarmeRequest(
+        $cardData = PagarmeCardResponseData::fromArray($this->pagarmeRequest(
             method: 'POST',
             path: "/customers/{$customerId}/cards",
 
@@ -50,40 +50,19 @@ class PagarmeCardService
 
             idempotencyKey: $this->idempotencyKey($paymentMethod),
             errorMessage: 'Erro ao salvar cartao no Pagar.me.',
-        );
-
-        $cardData = $this->buildCardResponse($raw);
+        ));
 
         $cardId = $cardData->requireId();
 
         $paymentMethod->forceFill([
             'gateway_card_id'  => $cardId,
-            'brand'            => $paymentMethod->brand ?: $cardData->brand(),
-            'last_four_digits' => $paymentMethod->last_four_digits ?: $cardData->lastFourDigits(),
+            'brand'            => $paymentMethod->brand ?: $cardData->brand,
+            'last_four_digits' => $paymentMethod->last_four_digits ?: $cardData->lastFourDigits,
         ])->save();
 
         return $cardId;
     }
 
-    //
-
-    private function buildCardResponse(array $raw): PagarmeCardResponseData
-    {
-        return new PagarmeCardResponseData(
-            id:             $raw['id']               ?? null,
-            firstSixDigits: $raw['first_six_digits'] ?? null,
-            lastFourDigits: $raw['last_four_digits'] ?? null,
-            brand:          $raw['brand']            ?? null,
-            holderName:     $raw['holder_name']      ?? null,
-            expMonth:       isset($raw['exp_month']) ? (int) $raw['exp_month'] : null,
-            expYear:        isset($raw['exp_year'])  ? (int) $raw['exp_year']  : null,
-            status:         $raw['status']     ?? null,
-            type:           $raw['type']       ?? null,
-            createdAt:      $raw['created_at'] ?? null,
-            updatedAt:      $raw['updated_at'] ?? null,
-        );
-    }
-
     // evita criacao duplicada de cartao
 
     private function idempotencyKey(ClientPaymentMethod $paymentMethod): string

+ 2 - 56
app/Services/Pagarme/PagarmeCustomerService.php

@@ -6,9 +6,6 @@ use App\Data\Pagarme\Request\PagarmeCustomerRequestData\PagarmeCustomerAddressRe
 use App\Data\Pagarme\Request\PagarmeCustomerRequestData\PagarmeCustomerPhonesRequestData\PagarmeCustomerPhoneData;
 use App\Data\Pagarme\Request\PagarmeCustomerRequestData\PagarmeCustomerPhonesRequestData\PagarmeCustomerPhonesRequestData;
 use App\Data\Pagarme\Request\PagarmeCustomerRequestData\PagarmeCustomerRequestData;
-use App\Data\Pagarme\Response\PagarmeCustomerResponseData\PagarmeCustomerAddressResponseData;
-use App\Data\Pagarme\Response\PagarmeCustomerResponseData\PagarmeCustomerPhonesResponseData\PagarmeCustomerPhonesResponseData;
-use App\Data\Pagarme\Response\PagarmeCustomerResponseData\PagarmeCustomerPhonesResponseData\PagarmePhoneResponseData;
 use App\Data\Pagarme\Response\PagarmeCustomerResponseData\PagarmeCustomerResponseData;
 use App\Models\Client;
 use App\Services\Pagarme\Concerns\SendsPagarmeRequests;
@@ -47,15 +44,13 @@ class PagarmeCustomerService
             phones:       $phones,
         );
 
-        $raw = $this->pagarmeRequest(
+        $customerData = PagarmeCustomerResponseData::fromArray($this->pagarmeRequest(
             method: 'POST',
             path: '/customers',
             payload: $customerRequest,
             idempotencyKey: $this->idempotencyKey($client->id),
             errorMessage: 'Erro ao criar cliente no Pagar.me.',
-        );
-
-        $customerData = $this->buildCustomerResponse($raw);
+        ));
 
         $customerId = $customerData->requireId();
 
@@ -112,55 +107,6 @@ class PagarmeCustomerService
         );
     }
 
-    private function buildCustomerResponse(array $raw): PagarmeCustomerResponseData
-    {
-        return new PagarmeCustomerResponseData(
-            id:           $raw['id']            ?? null,
-            name:         $raw['name']          ?? null,
-            email:        $raw['email']         ?? null,
-            code:         $raw['code']          ?? null,
-            document:     $raw['document']      ?? null,
-            documentType: $raw['document_type'] ?? null,
-            type:         $raw['type']          ?? null,
-            delinquent:   $raw['delinquent']    ?? null,
-
-            address: ! empty($raw['address'])
-                ? new PagarmeCustomerAddressResponseData(
-                    id:        $raw['address']['id']         ?? null,
-                    line1:     $raw['address']['line_1']     ?? null,
-                    line2:     $raw['address']['line_2']     ?? null,
-                    zipCode:   $raw['address']['zip_code']   ?? null,
-                    city:      $raw['address']['city']       ?? null,
-                    state:     $raw['address']['state']      ?? null,
-                    country:   $raw['address']['country']    ?? null,
-                    status:    $raw['address']['status']     ?? null,
-                    createdAt: $raw['address']['created_at'] ?? null,
-                    updatedAt: $raw['address']['updated_at'] ?? null,
-                )
-                : null,
-
-            phones: new PagarmeCustomerPhonesResponseData(
-                homePhone:   ! empty($raw['phones']['home_phone'])
-                    ? new PagarmePhoneResponseData(
-                        countryCode: $raw['phones']['home_phone']['country_code'] ?? null,
-                        areaCode:    $raw['phones']['home_phone']['area_code'] ?? null,
-                        number:      $raw['phones']['home_phone']['number'] ?? null,
-                    )
-                    : null,
-                mobilePhone: ! empty($raw['phones']['mobile_phone'])
-                    ? new PagarmePhoneResponseData(
-                        countryCode: $raw['phones']['mobile_phone']['country_code'] ?? null,
-                        areaCode:    $raw['phones']['mobile_phone']['area_code'] ?? null,
-                        number:      $raw['phones']['mobile_phone']['number'] ?? null,
-                    )
-                    : null,
-            ),
-
-            createdAt: $raw['created_at'] ?? null,
-            updatedAt: $raw['updated_at'] ?? null,
-        );
-    }
-
     private function onlyDigits(?string $value): string
     {
         return preg_replace('/\D+/', '', (string) $value) ?? '';

+ 3 - 133
app/Services/Pagarme/PagarmePaymentService.php

@@ -8,14 +8,6 @@ use App\Data\Pagarme\Request\PagarmeOrderRequestData\PagarmeOrderPaymentData\Pag
 use App\Data\Pagarme\Request\PagarmeOrderRequestData\PagarmeOrderPaymentData\PagarmeOrderPaymentData;
 use App\Data\Pagarme\Request\PagarmeOrderRequestData\PagarmeOrderPaymentData\PagarmeOrderPixData;
 use App\Data\Pagarme\Request\PagarmeOrderRequestData\PagarmeOrderRequestData;
-use App\Data\Pagarme\Response\PagarmeCustomerResponseData\PagarmeCustomerAddressResponseData;
-use App\Data\Pagarme\Response\PagarmeCustomerResponseData\PagarmeCustomerPhonesResponseData\PagarmeCustomerPhonesResponseData;
-use App\Data\Pagarme\Response\PagarmeCustomerResponseData\PagarmeCustomerPhonesResponseData\PagarmePhoneResponseData;
-use App\Data\Pagarme\Response\PagarmeCustomerResponseData\PagarmeCustomerResponseData;
-use App\Data\Pagarme\Response\PagarmeOrderResponseData\PagarmeOrderChargeResponseData\PagarmeOrderChargeResponseData;
-use App\Data\Pagarme\Response\PagarmeOrderResponseData\PagarmeOrderChargeResponseData\PagarmeOrderTransactionResponseData;
-use App\Data\Pagarme\Response\PagarmeOrderResponseData\PagarmeOrderCheckoutResponseData;
-use App\Data\Pagarme\Response\PagarmeOrderResponseData\PagarmeOrderItemResponseData;
 use App\Data\Pagarme\Response\PagarmeOrderResponseData\PagarmeOrderResponseData;
 use App\Enums\PaymentSplitStatusEnum;
 use App\Enums\PaymentStatusEnum;
@@ -93,15 +85,13 @@ class PagarmePaymentService
             channel:    $options['channel'] ?? null,
         );
 
-        $raw = $this->pagarmeRequest(
+        $order = PagarmeOrderResponseData::fromArray($this->pagarmeRequest(
             method: 'POST',
             path: '/orders',
             payload: $requestData,
             idempotencyKey: $this->idempotencyKey($payment),
             errorMessage: 'Erro ao criar pedido de pagamento no Pagar.me.',
-        );
-
-        $order = $this->buildOrderResponse($raw);
+        ));
 
         $order->requireId();
 
@@ -132,7 +122,7 @@ class PagarmePaymentService
 
     public function applyGatewayResponseToPayment(Payment $payment, array $orderResponse): Payment
     {
-        $order = $this->buildOrderResponse($orderResponse);
+        $order = PagarmeOrderResponseData::fromArray($orderResponse);
         $newStatus = $order->paymentStatus();
         $failureCode = null;
         $failureMessage = null;
@@ -170,124 +160,4 @@ class PagarmePaymentService
 
         return $payment->fresh();
     }
-
-    //
-
-    private function buildOrderResponse(array $raw): PagarmeOrderResponseData
-    {
-        return new PagarmeOrderResponseData(
-            id:       $raw['id']   ?? null,
-            code:     $raw['code'] ?? null,
-            amount:   isset($raw['amount']) ? (int) $raw['amount'] : null,
-            currency: $raw['currency'] ?? null,
-            closed:   $raw['closed']   ?? null,
-            status:   $raw['status']   ?? null,
-
-            items: array_map(
-                fn (array $item) => new PagarmeOrderItemResponseData(
-                    id:          $item['id'] ?? null,
-                    code:        $item['code'] ?? null,
-                    amount:      isset($item['amount']) ? (int) $item['amount'] : null,
-                    quantity:    isset($item['quantity']) ? (int) $item['quantity'] : null,
-                    description: $item['description'] ?? null,
-                    status:      $item['status'] ?? null,
-                ),
-                $raw['items'] ?? [],
-            ),
-
-            customer: ! empty($raw['customer'])
-                ? $this->buildCustomerResponse($raw['customer'])
-                : null,
-
-            charges: array_map(
-                fn (array $charge) => $this->buildChargeResponse($charge),
-                $raw['charges'] ?? [],
-            ),
-
-            checkouts: array_map(
-                fn (array $checkout) => new PagarmeOrderCheckoutResponseData(
-                    id:     $checkout['id'] ?? null,
-                    status: $checkout['status'] ?? null,
-                    url:    $checkout['url'] ?? null,
-                ),
-                $raw['checkouts'] ?? [],
-            ),
-
-            metadata:  $raw['metadata']   ?? [],
-            createdAt: $raw['created_at'] ?? null,
-            updatedAt: $raw['updated_at'] ?? null,
-            closedAt:  $raw['closed_at']  ?? null,
-        );
-    }
-
-    private function buildChargeResponse(array $raw): PagarmeOrderChargeResponseData
-    {
-        return new PagarmeOrderChargeResponseData(
-            id:              $raw['id'] ?? null,
-            status:          $raw['status'] ?? null,
-            amount:          isset($raw['amount']) ? (int) $raw['amount'] : null,
-            currency:        $raw['currency'] ?? null,
-            paidAt:          $raw['paid_at'] ?? null,
-            createdAt:       $raw['created_at'] ?? null,
-            lastTransaction: ! empty($raw['last_transaction'])
-                ? new PagarmeOrderTransactionResponseData(
-                    id:              $raw['last_transaction']['id'] ?? null,
-                    status:          $raw['last_transaction']['status'] ?? null,
-                    amount:          isset($raw['last_transaction']['amount']) ? (int) $raw['last_transaction']['amount'] : null,
-                    createdAt:       $raw['last_transaction']['created_at'] ?? null,
-                    acquirerMessage: $raw['last_transaction']['acquirer_message'] ?? null,
-                    gatewayResponse: $raw['last_transaction']['gateway_response'] ?? [],
-                )
-                : null,
-        );
-    }
-
-    private function buildCustomerResponse(array $raw): PagarmeCustomerResponseData
-    {
-        return new PagarmeCustomerResponseData(
-            id:           $raw['id']            ?? null,
-            name:         $raw['name']          ?? null,
-            email:        $raw['email']         ?? null,
-            code:         $raw['code']          ?? null,
-            document:     $raw['document']      ?? null,
-            documentType: $raw['document_type'] ?? null,
-            type:         $raw['type']          ?? null,
-            delinquent:   $raw['delinquent']    ?? null,
-
-            address: ! empty($raw['address'])
-                ? new PagarmeCustomerAddressResponseData(
-                    id:        $raw['address']['id']         ?? null,
-                    line1:     $raw['address']['line_1']     ?? null,
-                    line2:     $raw['address']['line_2']     ?? null,
-                    zipCode:   $raw['address']['zip_code']   ?? null,
-                    city:      $raw['address']['city']       ?? null,
-                    state:     $raw['address']['state']      ?? null,
-                    country:   $raw['address']['country']    ?? null,
-                    status:    $raw['address']['status']     ?? null,
-                    createdAt: $raw['address']['created_at'] ?? null,
-                    updatedAt: $raw['address']['updated_at'] ?? null,
-                )
-                : null,
-
-            phones: new PagarmeCustomerPhonesResponseData(
-                homePhone:   ! empty($raw['phones']['home_phone'])
-                    ? new PagarmePhoneResponseData(
-                        countryCode: $raw['phones']['home_phone']['country_code'] ?? null,
-                        areaCode:    $raw['phones']['home_phone']['area_code'] ?? null,
-                        number:      $raw['phones']['home_phone']['number'] ?? null,
-                    )
-                    : null,
-                mobilePhone: ! empty($raw['phones']['mobile_phone'])
-                    ? new PagarmePhoneResponseData(
-                        countryCode: $raw['phones']['mobile_phone']['country_code'] ?? null,
-                        areaCode:    $raw['phones']['mobile_phone']['area_code'] ?? null,
-                        number:      $raw['phones']['mobile_phone']['number'] ?? null,
-                    )
-                    : null,
-            ),
-
-            createdAt: $raw['created_at'] ?? null,
-            updatedAt: $raw['updated_at'] ?? null,
-        );
-    }
 }

+ 3 - 33
app/Services/Pagarme/PagarmeRecipientService.php

@@ -11,7 +11,6 @@ use App\Data\Pagarme\Request\PagarmeRecipientRequestData\PagarmeRecipientPhoneNu
 use App\Data\Pagarme\Request\PagarmeRecipientRequestData\PagarmeRecipientRegisterInformationData;
 use App\Data\Pagarme\Request\PagarmeRecipientRequestData\PagarmeRecipientRequestData;
 use App\Data\Pagarme\Request\PagarmeRecipientRequestData\PagarmeRecipientTransferSettingsData;
-use App\Data\Pagarme\Response\PagarmeRecipientResponseData\PagarmeRecipientBankAccountResponseData;
 use App\Data\Pagarme\Response\PagarmeRecipientResponseData\PagarmeRecipientResponseData;
 use App\Models\Provider;
 use App\Services\Pagarme\Concerns\SendsPagarmeRequests;
@@ -90,7 +89,7 @@ class PagarmeRecipientService
             errorMessage: 'Erro ao criar recebedor no Pagar.me.',
         );
 
-        $recipientData = $this->buildRecipientResponse($raw);
+        $recipientData = PagarmeRecipientResponseData::fromArray($raw);
 
         $recipientId = $recipientData->requireId();
 
@@ -143,10 +142,10 @@ class PagarmeRecipientService
             errorMessage: 'Erro ao atualizar conta bancaria do recebedor no Pagar.me.',
         );
 
-        $recipientData = $this->buildRecipientResponse($raw);
+        $recipientData = PagarmeRecipientResponseData::fromArray($raw);
 
         $provider->forceFill([
-            'recipient_default_bank_account' => $recipientData->defaultBankAccount()?->toArray() ?: $payload->toArray()['bank_account'],
+            'recipient_default_bank_account' => $recipientData->defaultBankAccount?->toArray() ?: $payload->toArray()['bank_account'],
         ])->save();
 
         return $provider->fresh();
@@ -268,35 +267,6 @@ class PagarmeRecipientService
         return Str::limit($holderName, 29, '');
     }
 
-    private function buildRecipientResponse(array $raw): PagarmeRecipientResponseData
-    {
-        return new PagarmeRecipientResponseData(
-            id:       $raw['id']       ?? null,
-            name:     $raw['name']     ?? null,
-            email:    $raw['email']    ?? null,
-            document: $raw['document'] ?? null,
-            type:     $raw['type']     ?? null,
-            status:   $raw['status']   ?? null,
-
-            defaultBankAccount: ! empty($raw['default_bank_account'])
-                ? new PagarmeRecipientBankAccountResponseData(
-                    holderName:        $raw['default_bank_account']['holder_name']         ?? null,
-                    holderType:        $raw['default_bank_account']['holder_type']         ?? null,
-                    holderDocument:    $raw['default_bank_account']['holder_document']     ?? null,
-                    bank:              $raw['default_bank_account']['bank']                ?? null,
-                    branchNumber:      $raw['default_bank_account']['branch_number']       ?? null,
-                    branchCheckDigit:  $raw['default_bank_account']['branch_check_digit']  ?? null,
-                    accountNumber:     $raw['default_bank_account']['account_number']      ?? null,
-                    accountCheckDigit: $raw['default_bank_account']['account_check_digit'] ?? null,
-                    type:              $raw['default_bank_account']['type']                ?? null,
-                )
-                : null,
-
-            createdAt: $raw['created_at'] ?? null,
-            updatedAt: $raw['updated_at'] ?? null,
-        );
-    }
-
     private function onlyDigits(?string $value): string
     {
         return preg_replace('/\D+/', '', (string) $value) ?? '';

+ 39 - 51
app/Services/Pagarme/PagarmeTransferService.php

@@ -3,6 +3,7 @@
 namespace App\Services\Pagarme;
 
 use App\Data\Pagarme\Request\PagarmeTransferRequestData;
+use App\Data\Pagarme\Response\PagarmeTransferResponseData;
 use App\Models\Provider;
 use App\Models\ProviderWithdrawal;
 use App\Services\Pagarme\Concerns\SendsPagarmeRequests;
@@ -12,7 +13,7 @@ class PagarmeTransferService
 {
     use SendsPagarmeRequests;
 
-    public function createTransfer(int $amountInCents, string $recipientId, string $idempotencyKey): array
+    public function createTransfer(int $amountInCents, string $recipientId, string $idempotencyKey): PagarmeTransferResponseData
     {
         if ($this->shouldMockTransferRequest()) {
             return $this->mockTransferResponse(
@@ -22,31 +23,31 @@ class PagarmeTransferService
             );
         }
 
-        return $this->pagarmeRequest(
+        return PagarmeTransferResponseData::fromArray($this->pagarmeRequest(
             method: 'POST',
             path: '/transfers',
             payload: new PagarmeTransferRequestData(
-                amount: $amountInCents,
+                amount:      $amountInCents,
                 recipientId: $recipientId,
             ),
             idempotencyKey: $idempotencyKey,
             errorMessage: 'Erro ao criar transferencia (saque) no Pagar.me.',
-        );
+        ));
     }
 
-    public function getTransfer(string $transferId): array
+    public function getTransfer(string $transferId): PagarmeTransferResponseData
     {
         if ($this->shouldMockTransferRequest()) {
             return $this->mockTransferLookupResponse($transferId);
         }
 
-        return $this->pagarmeRequest(
+        return PagarmeTransferResponseData::fromArray($this->pagarmeRequest(
             method: 'GET',
             path: "/transfers/{$transferId}",
             payload: [],
             idempotencyKey: "get-transfer-{$transferId}",
             errorMessage: 'Erro ao consultar transferencia no Pagar.me.',
-        );
+        ));
     }
 
     //
@@ -56,71 +57,58 @@ class PagarmeTransferService
         return app()->environment('local', 'development');
     }
 
-    private function mockTransferResponse(int $amountInCents, string $recipientId, string $idempotencyKey): array
+    private function mockTransferResponse(int $amountInCents, string $recipientId, string $idempotencyKey): PagarmeTransferResponseData
     {
-        $provider = Provider::query()
-            ->where('recipient_id', $recipientId)
-            ->first();
-
+        $provider  = Provider::query()->where('recipient_id', $recipientId)->first();
         $createdAt = Carbon::now();
 
-        return [
-            'id'                     => $this->mockTransferId($idempotencyKey),
-            'amount'                 => $amountInCents,
-            'type'                   => 'credito_em_conta',
-            'status'                 => 'pending_transfer',
-            'fee'                    => 0,
-            'funding_date'           => null,
-            'funding_estimated_date' => $createdAt->copy()->addWeekday()->toISOString(),
-            'transaction_id'         => null,
-            'bank_account'           => $provider?->recipient_default_bank_account,
-            'date_created'           => $createdAt->toISOString(),
-            'created_at'             => $createdAt->toISOString(),
-
-            'metadata' => [
+        return new PagarmeTransferResponseData(
+            id:                   $this->mockTransferId($idempotencyKey),
+            amount:               $amountInCents,
+            type:                 'credito_em_conta',
+            status:               'pending_transfer',
+            fee:                  0,
+            fundingDate:          null,
+            fundingEstimatedDate: $createdAt->copy()->addWeekday()->toISOString(),
+            bankAccount:          $provider?->recipient_default_bank_account,
+            bankResponse:         null,
+            createdAt:            $createdAt->toISOString(),
+            metadata: [
                 'mocked'          => true,
                 'environment'     => app()->environment(),
                 'recipient_id'    => $recipientId,
                 'idempotency_key' => $idempotencyKey,
                 'provider_id'     => $provider?->id,
             ],
-
-            'bank_response' => null,
-        ];
+        );
     }
 
-    private function mockTransferLookupResponse(string $transferId): array
+    private function mockTransferLookupResponse(string $transferId): PagarmeTransferResponseData
     {
-        $withdrawal = ProviderWithdrawal::query()
-            ->where('transfer_id', $transferId)
-            ->first();
+        $withdrawal = ProviderWithdrawal::query()->where('transfer_id', $transferId)->first();
 
         if ($withdrawal?->gateway_payload) {
-            return $withdrawal->gateway_payload;
+            return PagarmeTransferResponseData::fromArray($withdrawal->gateway_payload);
         }
 
         $createdAt = Carbon::now();
 
-        return [
-            'id'                     => $transferId,
-            'amount'                 => $withdrawal ? (int) round((float) $withdrawal->gross_amount * 100) : 0,
-            'type'                   => $withdrawal?->type ?? 'credito_em_conta',
-            'status'                 => $withdrawal?->status?->value ?? 'pending_transfer',
-            'fee'                    => $withdrawal ? (int) round((float) $withdrawal->gateway_fee_amount * 100) : 0,
-            'funding_date'           => $withdrawal?->completed_at?->toISOString(),
-            'funding_estimated_date' => $createdAt->copy()->addWeekday()->toISOString(),
-            'transaction_id'         => null,
-            'bank_account'           => $withdrawal?->bank_account,
-            'date_created'           => $withdrawal?->created_at?->toISOString() ?? $createdAt->toISOString(),
-            'created_at'             => $withdrawal?->created_at?->toISOString() ?? $createdAt->toISOString(),
-
-            'metadata' => $withdrawal?->metadata ?? [
+        return new PagarmeTransferResponseData(
+            id:                   $transferId,
+            amount:               $withdrawal ? (int) round((float) $withdrawal->gross_amount * 100) : 0,
+            type:                 $withdrawal?->type ?? 'credito_em_conta',
+            status:               $withdrawal?->status?->value ?? 'pending_transfer',
+            fee:                  $withdrawal ? (int) round((float) $withdrawal->gateway_fee_amount * 100) : 0,
+            fundingDate:          $withdrawal?->completed_at?->toISOString(),
+            fundingEstimatedDate: $createdAt->copy()->addWeekday()->toISOString(),
+            bankAccount:          $withdrawal?->bank_account,
+            bankResponse:         $withdrawal?->bank_response,
+            createdAt:            $withdrawal?->created_at?->toISOString() ?? $createdAt->toISOString(),
+            metadata: $withdrawal?->metadata ?? [
                 'mocked'      => true,
                 'environment' => app()->environment(),
             ],
-
-            'bank_response' => $withdrawal?->bank_response,
-        ];
+        );
     }
 
     private function mockTransferId(string $idempotencyKey): string

+ 4 - 24
app/Services/ProviderWithdrawalService.php

@@ -2,7 +2,6 @@
 
 namespace App\Services;
 
-use App\Data\Pagarme\Response\PagarmeTransferResponseData;
 use App\Enums\PaymentStatusEnum;
 use App\Enums\ProviderWithdrawalStatusEnum;
 use App\Models\PaymentSplit;
@@ -109,21 +108,19 @@ class ProviderWithdrawalService
             ]);
 
             try {
-                $response = $this->pagarmeTransfer->createTransfer(
+                $transfer = $this->pagarmeTransfer->createTransfer(
                     $amountInCents,
                     $provider->recipient_id,
                     $idempotencyKey,
                 );
 
-                $transfer = $this->buildTransferResponse($response);
-
                 $withdrawal->forceFill([
-                    'transfer_id'        => $transfer->id(),
-                    'status'             => $transfer->status() ?? ProviderWithdrawalStatusEnum::PROCESSING->value,
+                    'transfer_id'        => $transfer->id,
+                    'status'             => $transfer->status ?? ProviderWithdrawalStatusEnum::PROCESSING->value,
                     'type'               => $transfer->type,
                     'gateway_fee_amount' => $transfer->fee ?? 0,
                     'net_amount'         => max(0, $available - ($transfer->fee ?? 0) / 100),
-                    'gateway_payload'    => $response,
+                    'gateway_payload'    => $transfer->toArray(),
                 ])->save();
 
                 PaymentSplit::query()
@@ -239,23 +236,6 @@ class ProviderWithdrawalService
             });
     }
 
-    private function buildTransferResponse(array $raw): PagarmeTransferResponseData
-    {
-        return new PagarmeTransferResponseData(
-            id:                   $raw['id']                     ?? null,
-            amount:               $raw['amount']                 ?? null,
-            type:                 $raw['type']                   ?? null,
-            status:               $raw['status']                 ?? null,
-            fee:                  $raw['fee']                    ?? null,
-            fundingDate:          $raw['funding_date']           ?? null,
-            fundingEstimatedDate: $raw['funding_estimated_date'] ?? null,
-            bankAccount:          $raw['bank_account']           ?? null,
-            bankResponse:         $raw['bank_response']          ?? null,
-            createdAt:            $raw['created_at']             ?? $raw['date_created'] ?? null,
-            metadata:             $raw['metadata']               ?? null,
-        );
-    }
-
     private function scheduleEndedAtExpression(): string
     {
         return match (DB::connection()->getDriverName()) {