OrderRequestData.php 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. <?php
  2. namespace App\Data\Pagarme\Request\OrderRequestData;
  3. use App\Data\Pagarme\PagarmeData;
  4. use App\Data\Pagarme\Request\CustomerRequestData\CustomerRequestData as CustomerData;
  5. use App\Data\Pagarme\Request\OrderRequestData\OrderPaymentData\OrderCreditCardData;
  6. use App\Data\Pagarme\Request\OrderRequestData\OrderPaymentData\OrderPaymentData;
  7. use App\Data\Pagarme\Request\OrderRequestData\OrderPaymentData\OrderPixData\OrderPixData;
  8. use App\Data\Pagarme\Request\OrderRequestData\OrderPaymentData\OrderSplitData\OrderSplitData;
  9. use App\Models\PaymentSplit;
  10. use Illuminate\Support\Collection;
  11. final readonly class OrderRequestData extends PagarmeData
  12. {
  13. /**
  14. * @param OrderItemData[] $items
  15. * @param OrderPaymentData[] $payments
  16. */
  17. public function __construct(
  18. public string $code,
  19. public array $items,
  20. public array $payments,
  21. public array $metadata,
  22. public ?string $customerId = null,
  23. public ?string $channel = null,
  24. public bool $closed = true,
  25. public ?CustomerData $customer = null,
  26. ) {
  27. self::requireFilled($this->code, 'code');
  28. if (empty($this->items)) {
  29. throw new \InvalidArgumentException('items nao pode estar vazio.');
  30. }
  31. if (empty($this->payments)) {
  32. throw new \InvalidArgumentException('payments nao pode estar vazio.');
  33. }
  34. if (! $this->customerId && ! $this->customer) {
  35. throw new \InvalidArgumentException('customer ou customer_id e obrigatorio.');
  36. }
  37. }
  38. //
  39. public static function amountInCents(float $amount): int
  40. {
  41. return (int) round($amount * 100);
  42. }
  43. /**
  44. * @param OrderSplitData[]|null $split
  45. */
  46. public static function creditCardPaymentMethod(OrderCreditCardData $creditCard, ?array $split = null): OrderPaymentData
  47. {
  48. return OrderPaymentData::creditCard($creditCard, $split);
  49. }
  50. /**
  51. * @param OrderSplitData[]|null $split
  52. */
  53. public static function pixPaymentMethod(OrderPixData $pix, ?array $split = null): OrderPaymentData
  54. {
  55. return OrderPaymentData::pix($pix, $split);
  56. }
  57. /**
  58. * @param Collection<PaymentSplit> $transfers
  59. * @return OrderSplitData[]
  60. */
  61. public static function splitFromTransfers(Collection $transfers): array
  62. {
  63. return $transfers
  64. ->filter(fn (PaymentSplit $split) => ! empty($split->gateway_transfer_target_reference))
  65. ->map(function (PaymentSplit $split) {
  66. return new OrderSplitData(
  67. amount: self::amountInCents((float) $split->gross_amount),
  68. recipientId: $split->gateway_transfer_target_reference,
  69. type: 'flat',
  70. options: null,
  71. );
  72. })
  73. ->values()
  74. ->all();
  75. }
  76. //
  77. public function toArray(): array
  78. {
  79. return $this->filterFilledRecursive([
  80. 'code' => $this->code,
  81. 'items' => $this->items,
  82. 'payments' => $this->payments,
  83. 'closed' => $this->closed,
  84. 'metadata' => $this->metadata,
  85. 'customer_id' => $this->customerId,
  86. 'channel' => $this->channel,
  87. 'customer' => $this->customer,
  88. ]);
  89. }
  90. }