PagarmeCustomerService.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. <?php
  2. namespace App\Services\Pagarme;
  3. use App\Data\Pagarme\Request\CustomerRequestData\CustomerAddressRequestData;
  4. use App\Data\Pagarme\Request\CustomerRequestData\CustomerPhonesRequestData\CustomerPhoneData;
  5. use App\Data\Pagarme\Request\CustomerRequestData\CustomerPhonesRequestData\CustomerPhonesRequestData;
  6. use App\Data\Pagarme\Request\CustomerRequestData\CustomerRequestData;
  7. use App\Data\Pagarme\Response\CustomerResponseData\CustomerResponseData;
  8. use App\Models\Client;
  9. use App\Services\Pagarme\Concerns\FormatsPagarmeData;
  10. use App\Services\Pagarme\Concerns\SendsPagarmeRequests;
  11. class PagarmeCustomerService
  12. {
  13. use FormatsPagarmeData;
  14. use SendsPagarmeRequests;
  15. public function createCustomerForClient(Client $client, array $data): ?string
  16. {
  17. if (! empty($client->external_customer_id)) {
  18. return $client->external_customer_id;
  19. }
  20. $client->loadMissing('user');
  21. $name = $client->user?->name ?? $data['name'] ?? 'Cliente';
  22. $email = $client->user?->email ?? $data['email'] ?? null;
  23. $code = $client->ensureGatewayCode();
  24. $document = $this->digits($client->document ?? $data['document'] ?? null);
  25. $documentLen = strlen($document);
  26. $address = $this->buildAddressData($data);
  27. $phones = $this->buildPhones($client->user?->phone ?? $data['phone'] ?? null);
  28. $customerRequest = new CustomerRequestData(
  29. name: $name,
  30. email: (string) $email,
  31. document: $document,
  32. type: $documentLen === 14 ? 'company' : 'individual',
  33. documentType: $documentLen === 14 ? 'CNPJ' : 'CPF',
  34. code: $code,
  35. address: $address,
  36. phones: $phones,
  37. );
  38. $customerData = CustomerResponseData::fromArray($this->pagarmeRequest(
  39. method: 'POST',
  40. path: '/customers',
  41. payload: $customerRequest,
  42. idempotencyKey: $this->idempotencyKey($client->id),
  43. errorMessage: 'Erro ao criar cliente no Pagar.me.',
  44. ));
  45. $customerId = $customerData->requireId();
  46. $client->forceFill([
  47. 'external_customer_id' => $customerId,
  48. 'external_customer_code' => $code,
  49. ])->save();
  50. return $customerId;
  51. }
  52. //
  53. private function buildAddressData(array $data): CustomerAddressRequestData
  54. {
  55. $line1Parts = array_filter([
  56. (string) ($data['number'] ?? '0'),
  57. (string) ($data['address'] ?? ''),
  58. (string) ($data['district'] ?? ''),
  59. ], static fn ($value) => $value !== '');
  60. return new CustomerAddressRequestData(
  61. line1: implode(', ', $line1Parts),
  62. line2: (string) ($data['complement'] ?? $data['instructions'] ?? ''),
  63. zipCode: $this->digits($data['zip_code'] ?? null),
  64. city: (string) ($data['city'] ?? ''),
  65. state: (string) ($data['state'] ?? ''),
  66. country: (string) ($data['country'] ?? 'BR'),
  67. );
  68. }
  69. private function buildPhones(?string $phone): CustomerPhonesRequestData
  70. {
  71. $digits = $this->digits($phone);
  72. if ($digits === '') {
  73. return new CustomerPhonesRequestData;
  74. }
  75. $areaCode = substr($digits, 0, 2);
  76. $number = substr($digits, 2);
  77. if (strlen($digits) <= 2) {
  78. $areaCode = '';
  79. $number = $digits;
  80. }
  81. return new CustomerPhonesRequestData(
  82. mobilePhone: new CustomerPhoneData(
  83. countryCode: '55',
  84. areaCode: $areaCode,
  85. number: $number,
  86. ),
  87. );
  88. }
  89. // evita criacao duplicada de customer
  90. private function idempotencyKey(int $clientId, string $suffix = 'customer'): string
  91. {
  92. return "client-{$clientId}-{$suffix}";
  93. }
  94. }