PagarmeOrderRequestData.php 3.8 KB

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