OrderRequestData.php 3.4 KB

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