|
|
@@ -2,42 +2,45 @@
|
|
|
|
|
|
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\Enums\PaymentStatusEnum;
|
|
|
|
|
|
/**
|
|
|
- * @param array<int, array> $items Itens do pedido (code, amount, quantity, description, etc.)
|
|
|
- * @param array<string, mixed>|null $customer Dados do cliente retornados pela API
|
|
|
- * @param array<int, array> $charges Cobrancas do pedido (status, amount, payment_method, last_transaction, etc.)
|
|
|
- * @param array<int, array> $checkouts Checkouts do pedido
|
|
|
- * @param array<string, mixed> $metadata Metadados retornados pela API
|
|
|
+ * @param PagarmeOrderItemResponseData[] $items
|
|
|
+ * @param PagarmeOrderChargeResponseData[] $charges
|
|
|
+ * @param PagarmeOrderCheckoutResponseData[] $checkouts
|
|
|
*/
|
|
|
final readonly class PagarmeOrderResponseData
|
|
|
{
|
|
|
public function __construct(
|
|
|
- public ?string $id,
|
|
|
- public ?string $code,
|
|
|
- public ?int $amount,
|
|
|
- public ?string $currency,
|
|
|
- public ?bool $closed,
|
|
|
- public ?string $status,
|
|
|
- public array $items,
|
|
|
- public ?array $customer,
|
|
|
- public array $charges,
|
|
|
- public array $checkouts,
|
|
|
- public array $metadata,
|
|
|
- public ?string $createdAt = null,
|
|
|
- public ?string $updatedAt = null,
|
|
|
- public ?string $closedAt = null,
|
|
|
+ public ?string $id,
|
|
|
+ public ?string $code,
|
|
|
+ public ?int $amount,
|
|
|
+ public ?string $currency,
|
|
|
+ public ?bool $closed,
|
|
|
+ public ?string $status,
|
|
|
+ public array $items,
|
|
|
+ public ?PagarmeCustomerResponseData $customer,
|
|
|
+ public array $charges,
|
|
|
+ public array $checkouts,
|
|
|
+ public array $metadata,
|
|
|
+ public ?string $createdAt = null,
|
|
|
+ public ?string $updatedAt = null,
|
|
|
+ public ?string $closedAt = null,
|
|
|
) {}
|
|
|
|
|
|
public function authorizedAt(): ?string
|
|
|
{
|
|
|
$transaction = $this->lastTransaction();
|
|
|
|
|
|
- $transactionStatus = $transaction['status'] ?? null;
|
|
|
+ if (! $transaction) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
|
|
|
- if (in_array($transactionStatus, ['authorized_pending_capture', 'captured', 'partial_capture'], true)) {
|
|
|
- return $this->filledArrayValue($transaction, 'created_at');
|
|
|
+ if (in_array($transaction->status, ['authorized_pending_capture', 'captured', 'partial_capture'], true)) {
|
|
|
+ return $transaction->createdAt;
|
|
|
}
|
|
|
|
|
|
return null;
|
|
|
@@ -45,20 +48,30 @@ final readonly class PagarmeOrderResponseData
|
|
|
|
|
|
public function failureCode(): ?string
|
|
|
{
|
|
|
- return $this->filledArrayValue($this->lastTransaction()['gateway_response'] ?? [], 'code');
|
|
|
+ $transaction = $this->lastTransaction();
|
|
|
+
|
|
|
+ if (! $transaction) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ return $this->filledValue($transaction->gatewayResponse['code'] ?? null);
|
|
|
}
|
|
|
|
|
|
public function failureMessage(): ?string
|
|
|
{
|
|
|
$transaction = $this->lastTransaction();
|
|
|
|
|
|
- $acquirerMessage = $this->filledArrayValue($transaction, 'acquirer_message');
|
|
|
+ if (! $transaction) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ $acquirerMessage = $this->filledValue($transaction->acquirerMessage);
|
|
|
|
|
|
if ($acquirerMessage) {
|
|
|
return $acquirerMessage;
|
|
|
}
|
|
|
|
|
|
- $gatewayErrors = $transaction['gateway_response']['errors'] ?? [];
|
|
|
+ $gatewayErrors = $transaction->gatewayResponse['errors'] ?? [];
|
|
|
|
|
|
if (! is_array($gatewayErrors) || empty($gatewayErrors)) {
|
|
|
return null;
|
|
|
@@ -76,39 +89,39 @@ final readonly class PagarmeOrderResponseData
|
|
|
return $message;
|
|
|
}
|
|
|
|
|
|
- public function firstCharge(): array
|
|
|
+ public function firstCharge(): ?PagarmeOrderChargeResponseData
|
|
|
{
|
|
|
- return $this->charges[0] ?? [];
|
|
|
+ return $this->charges[0] ?? null;
|
|
|
}
|
|
|
|
|
|
public function gatewayEntityLabel(): string
|
|
|
{
|
|
|
- return isset($this->firstCharge()['id']) ? 'charge' : 'order';
|
|
|
+ $charge = $this->firstCharge();
|
|
|
+
|
|
|
+ return $charge?->id ? 'charge' : 'order';
|
|
|
}
|
|
|
|
|
|
public function gatewayEntityReference(): ?string
|
|
|
{
|
|
|
$charge = $this->firstCharge();
|
|
|
|
|
|
- return $charge['id'] ?? $this->id;
|
|
|
+ return $charge?->id ?? $this->id;
|
|
|
}
|
|
|
|
|
|
public function gatewayOperationLabel(): string
|
|
|
{
|
|
|
- $charge = $this->firstCharge();
|
|
|
-
|
|
|
+ $charge = $this->firstCharge();
|
|
|
$transaction = $this->lastTransaction();
|
|
|
|
|
|
- return isset($transaction['id']) ? 'transaction' : (isset($charge['id']) ? 'charge' : 'order');
|
|
|
+ return $transaction?->id ? 'transaction' : ($charge?->id ? 'charge' : 'order');
|
|
|
}
|
|
|
|
|
|
public function gatewayOperationReference(): ?string
|
|
|
{
|
|
|
- $charge = $this->firstCharge();
|
|
|
-
|
|
|
+ $charge = $this->firstCharge();
|
|
|
$transaction = $this->lastTransaction();
|
|
|
|
|
|
- return $transaction['id'] ?? $charge['id'] ?? $this->id;
|
|
|
+ return $transaction?->id ?? $charge?->id ?? $this->id;
|
|
|
}
|
|
|
|
|
|
public function id(): ?string
|
|
|
@@ -116,26 +129,26 @@ final readonly class PagarmeOrderResponseData
|
|
|
return $this->id;
|
|
|
}
|
|
|
|
|
|
- public function lastTransaction(): array
|
|
|
+ public function lastTransaction(): ?PagarmeOrderTransactionResponseData
|
|
|
{
|
|
|
- return $this->firstCharge()['last_transaction'] ?? [];
|
|
|
+ return $this->firstCharge()?->transaction();
|
|
|
}
|
|
|
|
|
|
public function paymentStatus(): PaymentStatusEnum
|
|
|
{
|
|
|
- $charge = $this->firstCharge();
|
|
|
-
|
|
|
+ $charge = $this->firstCharge();
|
|
|
$transaction = $this->lastTransaction();
|
|
|
-
|
|
|
- $status = strtolower((string) (($transaction['status'] ?? null) ?: ($charge['status'] ?? null)));
|
|
|
+ $status = strtolower((string) ($transaction?->status ?: $charge?->status));
|
|
|
|
|
|
return match ($status) {
|
|
|
- 'captured', 'paid', 'overpaid' => PaymentStatusEnum::PAID,
|
|
|
+ 'captured', 'paid', 'overpaid' => PaymentStatusEnum::PAID,
|
|
|
'authorized_pending_capture', 'waiting_capture' => PaymentStatusEnum::AUTHORIZED,
|
|
|
- 'pending', 'waiting_payment' => PaymentStatusEnum::PENDING,
|
|
|
- 'processing' => PaymentStatusEnum::PROCESSING,
|
|
|
+ 'pending', 'waiting_payment' => PaymentStatusEnum::PENDING,
|
|
|
+ 'processing' => PaymentStatusEnum::PROCESSING,
|
|
|
+
|
|
|
'not_authorized', 'with_error', 'failed',
|
|
|
'underpaid', 'chargedback' => PaymentStatusEnum::FAILED,
|
|
|
+
|
|
|
'voided', 'partial_void', 'canceled',
|
|
|
'cancelled', 'refunded', 'partial_refunded',
|
|
|
'partial_canceled' => PaymentStatusEnum::CANCELLED,
|
|
|
@@ -145,7 +158,7 @@ final readonly class PagarmeOrderResponseData
|
|
|
|
|
|
public function paidAt(): ?string
|
|
|
{
|
|
|
- return $this->filledArrayValue($this->firstCharge(), 'paid_at');
|
|
|
+ return $this->firstCharge()?->paidAt;
|
|
|
}
|
|
|
|
|
|
public function requireId(): string
|
|
|
@@ -162,51 +175,81 @@ final readonly class PagarmeOrderResponseData
|
|
|
public static function fromArray(array $payload): self
|
|
|
{
|
|
|
return new self(
|
|
|
- id: $payload['id'] ?? null,
|
|
|
- code: $payload['code'] ?? null,
|
|
|
- amount: isset($payload['amount']) ? (int) $payload['amount'] : null,
|
|
|
- currency: $payload['currency'] ?? null,
|
|
|
- closed: $payload['closed'] ?? null,
|
|
|
- status: $payload['status'] ?? null,
|
|
|
- items: $payload['items'] ?? [],
|
|
|
- customer: ! empty($payload['customer']) ? $payload['customer'] : null,
|
|
|
- charges: $payload['charges'] ?? [],
|
|
|
- checkouts: $payload['checkouts'] ?? [],
|
|
|
- metadata: $payload['metadata'] ?? [],
|
|
|
+ id: $payload['id'] ?? null,
|
|
|
+ code: $payload['code'] ?? null,
|
|
|
+ amount: isset($payload['amount']) ? (int) $payload['amount'] : null,
|
|
|
+ currency: $payload['currency'] ?? null,
|
|
|
+ closed: $payload['closed'] ?? null,
|
|
|
+ status: $payload['status'] ?? null,
|
|
|
+
|
|
|
+ items: array_map(
|
|
|
+ static fn (array $item) => PagarmeOrderItemResponseData::fromArray($item),
|
|
|
+ $payload['items'] ?? [],
|
|
|
+ ),
|
|
|
+
|
|
|
+ customer: ! empty($payload['customer'])
|
|
|
+ ? PagarmeCustomerResponseData::fromArray($payload['customer'])
|
|
|
+ : null,
|
|
|
+
|
|
|
+ charges: array_map(
|
|
|
+ static fn (array $charge) => PagarmeOrderChargeResponseData::fromArray($charge),
|
|
|
+ $payload['charges'] ?? [],
|
|
|
+ ),
|
|
|
+
|
|
|
+ checkouts: array_map(
|
|
|
+ static fn (array $checkout) => PagarmeOrderCheckoutResponseData::fromArray($checkout),
|
|
|
+ $payload['checkouts'] ?? [],
|
|
|
+ ),
|
|
|
+
|
|
|
+ metadata: $payload['metadata'] ?? [],
|
|
|
createdAt: $payload['created_at'] ?? null,
|
|
|
updatedAt: $payload['updated_at'] ?? null,
|
|
|
- closedAt: $payload['closed_at'] ?? null,
|
|
|
+ closedAt: $payload['closed_at'] ?? null,
|
|
|
);
|
|
|
}
|
|
|
|
|
|
public function toArray(): array
|
|
|
{
|
|
|
return [
|
|
|
- 'id' => $this->id,
|
|
|
- 'code' => $this->code,
|
|
|
- 'amount' => $this->amount,
|
|
|
- 'currency' => $this->currency,
|
|
|
- 'closed' => $this->closed,
|
|
|
- 'items' => $this->items,
|
|
|
- 'customer' => $this->customer,
|
|
|
+ 'id' => $this->id,
|
|
|
+ 'code' => $this->code,
|
|
|
+ 'amount' => $this->amount,
|
|
|
+ 'currency' => $this->currency,
|
|
|
+ 'closed' => $this->closed,
|
|
|
+
|
|
|
+ 'items' => array_map(
|
|
|
+ static fn (PagarmeOrderItemResponseData $item) => $item->toArray(),
|
|
|
+ $this->items,
|
|
|
+ ),
|
|
|
+
|
|
|
+ 'customer' => $this->customer?->toArray(),
|
|
|
'status' => $this->status,
|
|
|
'created_at' => $this->createdAt,
|
|
|
'updated_at' => $this->updatedAt,
|
|
|
'closed_at' => $this->closedAt,
|
|
|
- 'charges' => $this->charges,
|
|
|
- 'checkouts' => $this->checkouts,
|
|
|
+
|
|
|
+ 'charges' => array_map(
|
|
|
+ static fn (PagarmeOrderChargeResponseData $charge) => $charge->toArray(),
|
|
|
+ $this->charges,
|
|
|
+ ),
|
|
|
+
|
|
|
+ 'checkouts' => array_map(
|
|
|
+ static fn (PagarmeOrderCheckoutResponseData $checkout) => $checkout->toArray(),
|
|
|
+ $this->checkouts,
|
|
|
+ ),
|
|
|
+
|
|
|
'metadata' => $this->metadata,
|
|
|
];
|
|
|
}
|
|
|
|
|
|
//
|
|
|
|
|
|
- private function filledArrayValue(array $data, string $field): ?string
|
|
|
+ private function filledValue(mixed $value): ?string
|
|
|
{
|
|
|
- if (! array_key_exists($field, $data) || $data[$field] === null || $data[$field] === '' || $data[$field] === []) {
|
|
|
+ if ($value === null || $value === '' || $value === []) {
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
- return (string) $data[$field];
|
|
|
+ return (string) $value;
|
|
|
}
|
|
|
}
|