PagarmeRecipientService.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. <?php
  2. namespace App\Services\Pagarme;
  3. use App\Data\Pagarme\Request\PagarmeBankAccountUpdateRequestData;
  4. use App\Data\Pagarme\Request\PagarmeRecipientRequestData\PagarmeRecipientRequestData;
  5. use App\Data\Pagarme\Response\PagarmeRecipientResponseData\PagarmeRecipientResponseData;
  6. use App\Models\Provider;
  7. use App\Services\Pagarme\Concerns\SendsPagarmeRequests;
  8. use Illuminate\Support\Str;
  9. class PagarmeRecipientService
  10. {
  11. use SendsPagarmeRequests;
  12. public function createRecipientForProvider(Provider $provider, array $data): string
  13. {
  14. if (! empty($provider->recipient_id)) {
  15. return $provider->recipient_id;
  16. }
  17. $metadata = $data['recipient_metadata'] ?? [];
  18. $paymentMode = $data['recipient_payment_mode'];
  19. $recipientCode = $this->ensureRecipientCode($provider);
  20. $payload = PagarmeRecipientRequestData::fromPayload($recipientCode, $data);
  21. $bankAccountData = $payload->defaultBankAccount->toArray();
  22. $recipientData = PagarmeRecipientResponseData::fromArray($this->pagarmeRequest(
  23. method: 'POST',
  24. path: '/recipients',
  25. payload: $payload,
  26. idempotencyKey: $this->idempotencyKey($provider->id),
  27. errorMessage: 'Erro ao criar recebedor no Pagar.me.',
  28. ));
  29. $recipientId = $recipientData->requireId();
  30. $provider->forceFill([
  31. 'recipient_id' => $recipientId,
  32. 'recipient_name' => $data['recipient_name'],
  33. 'recipient_email' => $data['recipient_email'],
  34. 'recipient_description' => $data['recipient_description'],
  35. 'recipient_document' => $data['recipient_document'],
  36. 'recipient_type' => $payload->registerInformation->type,
  37. 'recipient_code' => $recipientCode,
  38. 'recipient_payment_mode' => $paymentMode,
  39. 'recipient_default_bank_account' => $bankAccountData,
  40. 'recipient_transfer_settings' => [
  41. 'transfer_enabled' => false,
  42. 'transfer_interval' => 'daily',
  43. 'transfer_day' => 0,
  44. ],
  45. 'recipient_automatic_anticipation_settings' => [
  46. 'enabled' => false,
  47. ],
  48. 'recipient_metadata' => $metadata,
  49. ])->save();
  50. return $recipientId;
  51. }
  52. public function updateDefaultBankAccount(Provider $provider, array $bankAccountData): Provider
  53. {
  54. $payload = PagarmeBankAccountUpdateRequestData::fromArray($bankAccountData);
  55. $recipientData = PagarmeRecipientResponseData::fromArray($this->pagarmeRequest(
  56. method: 'PATCH',
  57. path: "/recipients/{$provider->recipient_id}/default-bank-account",
  58. payload: $payload,
  59. idempotencyKey: $this->idempotencyKey($provider->id, 'default-bank-account-'.sha1(json_encode($payload->toArray()))),
  60. errorMessage: 'Erro ao atualizar conta bancaria do recebedor no Pagar.me.',
  61. ));
  62. $provider->forceFill([
  63. 'recipient_default_bank_account' => $recipientData->defaultBankAccount()?->toArray() ?: $payload->toArray()['bank_account'],
  64. ])->save();
  65. return $provider->fresh();
  66. }
  67. // evita criacao duplica de recipient
  68. private function idempotencyKey(int $providerId, string $suffix = 'recipient'): string
  69. {
  70. return "provider-{$providerId}-{$suffix}";
  71. }
  72. private function ensureRecipientCode(Provider $provider): string
  73. {
  74. if (! empty($provider->recipient_code)) {
  75. return $provider->recipient_code;
  76. }
  77. $recipientCode = 'provider-'.(string) Str::uuid();
  78. $provider->forceFill(['recipient_code' => $recipientCode])->save();
  79. return $recipientCode;
  80. }
  81. }