PagarmeRecipientBankAccountData.php 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. <?php
  2. namespace App\Data\Pagarme\Request\PagarmeRecipientRequestData;
  3. use App\Data\Pagarme\PagarmeData;
  4. use Illuminate\Support\Str;
  5. final readonly class PagarmeRecipientBankAccountData 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, 'holder_name');
  19. self::requireIn($this->holderType, ['individual', 'company'], 'holder_type');
  20. self::requireFilled($this->holderDocument, 'holder_document');
  21. self::requireFilled($this->bank, 'bank');
  22. self::requireFilled($this->branchNumber, 'branch_number');
  23. self::requireFilled($this->accountNumber, 'account_number');
  24. self::requireFilled($this->accountCheckDigit, 'account_check_digit');
  25. self::requireFilled($this->type, '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. 'holder_name' => $this->holderName,
  45. 'holder_type' => $this->holderType,
  46. 'holder_document' => $this->holderDocument,
  47. 'bank' => $this->bank,
  48. 'branch_number' => $this->branchNumber,
  49. 'branch_check_digit' => $this->branchCheckDigit,
  50. 'account_number' => $this->accountNumber,
  51. 'account_check_digit' => $this->accountCheckDigit,
  52. 'type' => $this->type,
  53. ]);
  54. }
  55. //
  56. private static function normalizeHolderName(string $holderName): string
  57. {
  58. $holderName = trim(preg_replace('/\s+/', ' ', $holderName) ?? '');
  59. if (Str::length($holderName) < 30) {
  60. return $holderName;
  61. }
  62. $parts = explode(' ', $holderName);
  63. if (count($parts) >= 3) {
  64. $firstName = array_shift($parts);
  65. $lastName = array_pop($parts);
  66. $initials = array_map(
  67. static fn (string $part): string => Str::upper(Str::substr($part, 0, 1)),
  68. $parts
  69. );
  70. $abbreviated = trim($firstName.' '.implode(' ', $initials).' '.$lastName);
  71. if (Str::length($abbreviated) < 30) {
  72. return $abbreviated;
  73. }
  74. $firstAndLast = trim($firstName.' '.$lastName);
  75. if (Str::length($firstAndLast) < 30) {
  76. return $firstAndLast;
  77. }
  78. }
  79. return Str::limit($holderName, 29, '');
  80. }
  81. }