Jelajahi Sumber

refactor: order response data

Gustavo Mantovani 1 Minggu lalu
induk
melakukan
08cdbcce83

+ 1 - 0
app/Data/Pagarme/Request/CardRequestData/CardRequestData.php

@@ -9,6 +9,7 @@ final readonly class CardRequestData extends PagarmeData
     public function __construct(
         public string  $token,
         public ?string $label = null,
+
         public ?CardBillingAddressData $billingAddress = null,
     ) {
         self::requireFilled($this->token, 'token');

+ 1 - 0
app/Data/Pagarme/Request/CustomerRequestData/CustomerRequestData.php

@@ -14,6 +14,7 @@ final readonly class CustomerRequestData extends PagarmeData
         public string $type,
         public string $documentType,
         public string $code,
+
         public ?CustomerAddressRequestData $address = null,
         public ?CustomerPhonesRequestData  $phones  = null,
     ) {

+ 4 - 1
app/Data/Pagarme/Request/OrderRequestData/OrderPaymentData/OrderPaymentData.php

@@ -12,8 +12,11 @@ final readonly class OrderPaymentData extends PagarmeData
 
     public function __construct(
         public string $paymentMethod,
-        public ?OrderCreditCardData $creditCard = null, public ?OrderPixData $pix = null,
+
         public ?array $split = null,
+
+        public ?OrderCreditCardData $creditCard = null,
+        public ?OrderPixData        $pix        = null,
     ) {
         self::requireIn($this->paymentMethod, ['credit_card', 'pix'], 'payments.payment_method');
 

+ 1 - 0
app/Data/Pagarme/Request/OrderRequestData/OrderPaymentData/OrderSplitData.php

@@ -10,6 +10,7 @@ final readonly class OrderSplitData extends PagarmeData
         public int    $amount,
         public string $recipientId,
         public string $type = 'flat',
+
         public ?OrderSplitOptionsData $options = null,
     ) {
         self::requirePositiveInt($this->amount, 'split.amount');

+ 3 - 1
app/Data/Pagarme/Request/RecipientRequestData/RecipientRegisterInformationData/RecipientRegisterInformationData.php

@@ -15,7 +15,9 @@ final readonly class RecipientRegisterInformationData extends PagarmeData
         public ?string $birthdate,
         public int     $monthlyIncome,
         public string  $professionalOccupation,
-        public RecipientPhoneNumbersData $phoneNumbers, public RecipientAddressData $address,
+
+        public RecipientPhoneNumbersData $phoneNumbers,
+        public RecipientAddressData      $address,
     ) {
         self::requireFilled($this->name, 'register_information.name');
         self::requireFilled($this->email, 'register_information.email');

+ 4 - 3
app/Data/Pagarme/Request/RecipientRequestData/RecipientRequestData.php

@@ -9,9 +9,10 @@ final readonly class RecipientRequestData extends PagarmeData
 {
     public function __construct(
         public string $code,
-        public RecipientRegisterInformationData $registerInformation,
-        public RecipientBankAccountData         $defaultBankAccount,
-        public RecipientTransferSettingsData    $transferSettings,
+
+        public RecipientRegisterInformationData           $registerInformation,
+        public RecipientBankAccountData                   $defaultBankAccount,
+        public RecipientTransferSettingsData              $transferSettings,
         public RecipientAutomaticAnticipationSettingsData $automaticAnticipationSettings,
     ) {
         self::requireFilled($this->code, 'code');

+ 1 - 0
app/Data/Pagarme/Response/OrderResponseData/OrderChargeResponseData/OrderChargeResponseData.php

@@ -13,6 +13,7 @@ final readonly class OrderChargeResponseData extends PagarmeResponseData
         public ?string $currency,
         public ?string $paidAt,
         public ?string $createdAt,
+
         public ?OrderTransactionResponseData $lastTransaction,
     ) {}
 

+ 60 - 3
app/Data/Pagarme/Response/OrderResponseData/OrderResponseData.php

@@ -57,7 +57,13 @@ final readonly class OrderResponseData extends PagarmeResponseData
             return null;
         }
 
-        return $this->filledValue($transaction->gatewayResponse['code'] ?? null);
+        $code = $this->filledValue($transaction->gatewayResponse['code'] ?? null);
+
+        if ($code === null || $this->isMisleadingFailureCode($code)) {
+            return $this->filledValue($transaction->status);
+        }
+
+        return $code;
     }
 
     public function failureMessage(): ?string
@@ -70,14 +76,14 @@ final readonly class OrderResponseData extends PagarmeResponseData
 
         $acquirerMessage = $this->filledValue($transaction->acquirerMessage);
 
-        if ($acquirerMessage) {
+        if ($acquirerMessage && ! $this->isMisleadingAcquirerMessage($acquirerMessage)) {
             return $acquirerMessage;
         }
 
         $gatewayErrors = $transaction->gatewayResponse['errors'] ?? [];
 
         if (! is_array($gatewayErrors) || empty($gatewayErrors)) {
-            return null;
+            return $this->failureMessageFromStatus($transaction->status);
         }
 
         $message = collect($gatewayErrors)
@@ -241,6 +247,57 @@ final readonly class OrderResponseData extends PagarmeResponseData
 
     //
 
+    private function isMisleadingFailureCode(string $code): bool
+    {
+        // filtra para nao incluir codigos http que nao sao de erro
+
+        if (preg_match('/^[1-5]\d{2}$/', $code)) {
+            return true;
+        }
+
+        $lower = mb_strtolower($code);
+
+        $successCodes = ['00', '0', 'approved', 'success'];
+
+        return in_array($lower, $successCodes, true);
+    }
+
+    private function isMisleadingAcquirerMessage(string $message): bool
+    {
+        $lower = mb_strtolower($message);
+
+        $successPatterns = [
+            'aprovada',
+            'aprovado',
+            'autorizada',
+            'autorizado',
+            'authorized',
+            'sucesso',
+        ];
+
+        foreach ($successPatterns as $pattern) {
+            if (str_contains($lower, $pattern)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    //
+
+    private function failureMessageFromStatus(?string $status): ?string
+    {
+        return match (strtolower((string) $status)) {
+            'not_authorized' => 'Transação não autorizada pela operadora do cartão.',
+            'with_error'     => 'Erro ao processar a transação.',
+            'failed'         => 'Transação falhou.',
+            'underpaid'      => 'Valor pago inferior ao esperado.',
+            'chargedback'    => 'Transação sofreu chargeback.',
+            default          => null,
+        };
+    }
+
     private function filledValue(mixed $value): ?string
     {
         if ($value === null || $value === '' || $value === []) {