PagarmeBankAccountUpdateRequestData.php 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. <?php
  2. namespace App\Data\Pagarme\Request;
  3. use App\Data\Pagarme\PagarmeData;
  4. use Illuminate\Support\Str;
  5. final readonly class PagarmeBankAccountUpdateRequestData extends PagarmeData
  6. {
  7. public function __construct(
  8. public string $holderName,
  9. public string $holderType,
  10. public string $holderDocument,
  11. public string $bank,
  12. public string $branchNumber,
  13. public ?string $branchCheckDigit,
  14. public string $accountNumber,
  15. public string $accountCheckDigit,
  16. public string $type,
  17. ) {
  18. self::requireFilled($this->holderName, 'bank_account.holder_name');
  19. self::requireIn($this->holderType, ['individual', 'company'], 'bank_account.holder_type');
  20. self::requireFilled($this->holderDocument, 'bank_account.holder_document');
  21. self::requireFilled($this->bank, 'bank_account.bank');
  22. self::requireFilled($this->branchNumber, 'bank_account.branch_number');
  23. self::requireFilled($this->accountNumber, 'bank_account.account_number');
  24. self::requireFilled($this->accountCheckDigit, 'bank_account.account_check_digit');
  25. self::requireFilled($this->type, 'bank_account.type');
  26. }
  27. public static function fromArray(array $payload): self
  28. {
  29. return new self(
  30. holderName: self::normalizeHolderName($payload['holder_name']),
  31. holderType: $payload['holder_type'],
  32. holderDocument: self::digits($payload['holder_document']),
  33. bank: $payload['bank'],
  34. branchNumber: $payload['branch_number'],
  35. branchCheckDigit: $payload['branch_check_digit'] ?? null,
  36. accountNumber: $payload['account_number'],
  37. accountCheckDigit: $payload['account_check_digit'],
  38. type: $payload['type'],
  39. );
  40. }
  41. public function toArray(): array
  42. {
  43. return $this->filterFilledRecursive([
  44. 'bank_account' => [
  45. 'holder_name' => $this->holderName,
  46. 'holder_type' => $this->holderType,
  47. 'holder_document' => $this->holderDocument,
  48. 'bank' => $this->bank,
  49. 'branch_number' => $this->branchNumber,
  50. 'branch_check_digit' => $this->branchCheckDigit,
  51. 'account_number' => $this->accountNumber,
  52. 'account_check_digit' => $this->accountCheckDigit,
  53. 'type' => $this->type,
  54. ],
  55. ]);
  56. }
  57. //
  58. private static function normalizeHolderName(string $holderName): string
  59. {
  60. $holderName = trim(preg_replace('/\s+/', ' ', $holderName) ?? '');
  61. if (Str::length($holderName) < 30) {
  62. return $holderName;
  63. }
  64. $parts = explode(' ', $holderName);
  65. if (count($parts) >= 3) {
  66. $firstName = array_shift($parts);
  67. $lastName = array_pop($parts);
  68. $initials = array_map(
  69. static fn (string $part): string => Str::upper(Str::substr($part, 0, 1)),
  70. $parts
  71. );
  72. $abbreviated = trim($firstName.' '.implode(' ', $initials).' '.$lastName);
  73. if (Str::length($abbreviated) < 30) {
  74. return $abbreviated;
  75. }
  76. $firstAndLast = trim($firstName.' '.$lastName);
  77. if (Str::length($firstAndLast) < 30) {
  78. return $firstAndLast;
  79. }
  80. }
  81. return Str::limit($holderName, 29, '');
  82. }
  83. }