lastTransaction(); if (! $transaction) { return null; } if (in_array($transaction->status, ['authorized_pending_capture', 'captured', 'partial_capture'], true)) { return $transaction->createdAt; } return null; } public function failureCode(): ?string { $transaction = $this->lastTransaction(); if (! $transaction) { return null; } return $this->filledValue($transaction->gatewayResponse['code'] ?? null); } public function failureMessage(): ?string { $transaction = $this->lastTransaction(); if (! $transaction) { return null; } $acquirerMessage = $this->filledValue($transaction->acquirerMessage); if ($acquirerMessage) { return $acquirerMessage; } $gatewayErrors = $transaction->gatewayResponse['errors'] ?? []; if (! is_array($gatewayErrors) || empty($gatewayErrors)) { return null; } $message = collect($gatewayErrors) ->pluck('message') ->filter() ->implode('; ') ?: null; if ($message && str_contains($message, 'Sem ambiente configurado')) { return 'Pix não esta habilitado ou configurado neste ambiente do Pagar.me.'; } return $message; } public function firstCharge(): ?OrderChargeResponseData { return $this->charges[0] ?? null; } public function gatewayEntityLabel(): string { $charge = $this->firstCharge(); return $charge?->id ? 'charge' : 'order'; } public function gatewayEntityReference(): ?string { $charge = $this->firstCharge(); return $charge?->id ?? $this->id; } public function gatewayOperationLabel(): string { $charge = $this->firstCharge(); $transaction = $this->lastTransaction(); return $transaction?->id ? 'transaction' : ($charge?->id ? 'charge' : 'order'); } public function gatewayOperationReference(): ?string { $charge = $this->firstCharge(); $transaction = $this->lastTransaction(); return $transaction?->id ?? $charge?->id ?? $this->id; } public function lastTransaction(): ?OrderTransactionResponseData { return $this->firstCharge()?->transaction(); } public function paymentStatus(): PaymentStatusEnum { $charge = $this->firstCharge(); $transaction = $this->lastTransaction(); $status = strtolower((string) ($transaction?->status ?: $charge?->status)); return match ($status) { 'captured', 'paid', 'overpaid' => PaymentStatusEnum::PAID, 'authorized_pending_capture', 'waiting_capture' => PaymentStatusEnum::AUTHORIZED, '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, default => PaymentStatusEnum::PENDING, }; } public function paidAt(): ?string { return $this->firstCharge()?->paidAt; } public function requireId(): string { if (! $this->id) { throw new \RuntimeException('Pagar.me order creation returned an empty id.'); } return $this->id; } // 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) => OrderItemResponseData::fromArray($item), ), customer: ! empty($customer) ? CustomerResponseData::fromArray($customer) : null, charges: static::arrMap($payload, 'charges', static fn (array $charge) => OrderChargeResponseData::fromArray($charge), ), checkouts: static::arrMap($payload, 'checkouts', static fn (array $checkout) => OrderCheckoutResponseData::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 [ 'id' => $this->id, 'code' => $this->code, 'amount' => $this->amount, 'currency' => $this->currency, 'closed' => $this->closed, 'items' => array_map( static fn (OrderItemResponseData $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' => array_map( static fn (OrderChargeResponseData $charge) => $charge->toArray(), $this->charges, ), 'checkouts' => array_map( static fn (OrderCheckoutResponseData $checkout) => $checkout->toArray(), $this->checkouts, ), 'metadata' => $this->metadata, ]; } // private function filledValue(mixed $value): ?string { if ($value === null || $value === '' || $value === []) { return null; } return (string) $value; } }