PagarmeCustomerService.php 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <?php
  2. namespace App\Services\Pagarme;
  3. use App\Data\Pagarme\Request\PagarmeCustomerRequestData\PagarmeCustomerRequestData;
  4. use App\Data\Pagarme\Response\PagarmeCustomerResponseData\PagarmeCustomerResponseData;
  5. use App\Models\Client;
  6. use App\Services\Pagarme\Concerns\SendsPagarmeRequests;
  7. use Illuminate\Support\Str;
  8. class PagarmeCustomerService
  9. {
  10. use SendsPagarmeRequests;
  11. public function createCustomerForClient(Client $client, array $data): ?string
  12. {
  13. if (! empty($client->external_customer_id)) {
  14. return $client->external_customer_id;
  15. }
  16. $client->loadMissing('user');
  17. $name = $client->user?->name ?? $data['name'] ?? 'Cliente';
  18. $email = $client->user?->email ?? $data['email'] ?? null;
  19. $code = $this->ensureCustomerCode($client);
  20. $customerData = PagarmeCustomerResponseData::fromArray($this->pagarmeRequest(
  21. method: 'POST',
  22. path: '/customers',
  23. payload: PagarmeCustomerRequestData::fromPayload(
  24. name: $name,
  25. email: $email,
  26. document: $client->document ?? $data['document'] ?? null,
  27. code: $code,
  28. addressData: $data,
  29. phone: $client->user?->phone ?? $data['phone'] ?? null,
  30. ),
  31. idempotencyKey: $this->idempotencyKey($client->id),
  32. errorMessage: 'Erro ao criar cliente no Pagar.me.',
  33. ));
  34. $customerId = $customerData->requireId();
  35. $client->forceFill([
  36. 'external_customer_id' => $customerId,
  37. 'external_customer_code' => $code,
  38. ])->save();
  39. return $customerId;
  40. }
  41. // evita criacao duplicada de customer
  42. private function idempotencyKey(int $clientId, string $suffix = 'customer'): string
  43. {
  44. return "client-{$clientId}-{$suffix}";
  45. }
  46. private function ensureCustomerCode(Client $client): string
  47. {
  48. if (! empty($client->external_customer_code)) {
  49. return $client->external_customer_code;
  50. }
  51. $code = 'client-'.(string) Str::uuid();
  52. $client->forceFill(['external_customer_code' => $code])->save();
  53. return $code;
  54. }
  55. }