PagarmeTransferService.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. <?php
  2. namespace App\Services\Pagarme;
  3. use App\Data\Pagarme\Request\TransferRequestData;
  4. use App\Data\Pagarme\Response\TransferResponseData;
  5. use App\Models\Provider;
  6. use App\Models\ProviderWithdrawal;
  7. use App\Services\Pagarme\Concerns\SendsPagarmeRequests;
  8. use Carbon\Carbon;
  9. class PagarmeTransferService
  10. {
  11. use SendsPagarmeRequests;
  12. public function createTransfer(int $amountInCents, string $recipientId, string $idempotencyKey): TransferResponseData
  13. {
  14. if ($this->shouldMockTransferRequest()) {
  15. return $this->mockTransferResponse(
  16. amountInCents: $amountInCents,
  17. recipientId: $recipientId,
  18. idempotencyKey: $idempotencyKey,
  19. );
  20. }
  21. return TransferResponseData::fromArray($this->pagarmeRequest(
  22. method: 'POST',
  23. path: '/transfers',
  24. payload: new TransferRequestData(
  25. amount: $amountInCents,
  26. recipientId: $recipientId,
  27. ),
  28. idempotencyKey: $idempotencyKey,
  29. errorMessage: 'Erro ao criar transferencia (saque) no Pagar.me.',
  30. ));
  31. }
  32. public function getTransfer(string $transferId): TransferResponseData
  33. {
  34. if ($this->shouldMockTransferRequest()) {
  35. return $this->mockTransferLookupResponse($transferId);
  36. }
  37. return TransferResponseData::fromArray($this->pagarmeRequest(
  38. method: 'GET',
  39. path: "/transfers/{$transferId}",
  40. payload: [],
  41. idempotencyKey: "get-transfer-{$transferId}",
  42. errorMessage: 'Erro ao consultar transferencia no Pagar.me.',
  43. ));
  44. }
  45. //
  46. private function shouldMockTransferRequest(): bool
  47. {
  48. return app()->environment('local', 'development');
  49. }
  50. private function mockTransferResponse(int $amountInCents, string $recipientId, string $idempotencyKey): TransferResponseData
  51. {
  52. $provider = Provider::query()->where('recipient_id', $recipientId)->first();
  53. $createdAt = Carbon::now();
  54. return new TransferResponseData(
  55. id: $this->mockTransferId($idempotencyKey),
  56. amount: $amountInCents,
  57. type: 'credito_em_conta',
  58. status: 'pending_transfer',
  59. fee: 0,
  60. fundingDate: null,
  61. fundingEstimatedDate: $createdAt->copy()->addWeekday()->toISOString(),
  62. bankAccount: $provider?->recipient_default_bank_account,
  63. bankResponse: null,
  64. createdAt: $createdAt->toISOString(),
  65. metadata: [
  66. 'mocked' => true,
  67. 'environment' => app()->environment(),
  68. 'recipient_id' => $recipientId,
  69. 'idempotency_key' => $idempotencyKey,
  70. 'provider_id' => $provider?->id,
  71. ],
  72. );
  73. }
  74. private function mockTransferLookupResponse(string $transferId): TransferResponseData
  75. {
  76. $withdrawal = ProviderWithdrawal::query()->where('transfer_id', $transferId)->first();
  77. if ($withdrawal?->gateway_payload) {
  78. return TransferResponseData::fromArray($withdrawal->gateway_payload);
  79. }
  80. $createdAt = Carbon::now();
  81. return new TransferResponseData(
  82. id: $transferId,
  83. amount: $withdrawal ? (int) round((float) $withdrawal->gross_amount * 100) : 0,
  84. type: $withdrawal?->type ?? 'credito_em_conta',
  85. status: $withdrawal?->status?->value ?? 'pending_transfer',
  86. fee: $withdrawal ? (int) round((float) $withdrawal->gateway_fee_amount * 100) : 0,
  87. fundingDate: $withdrawal?->completed_at?->toISOString(),
  88. fundingEstimatedDate: $createdAt->copy()->addWeekday()->toISOString(),
  89. bankAccount: $withdrawal?->bank_account,
  90. bankResponse: $withdrawal?->bank_response,
  91. createdAt: $withdrawal?->created_at?->toISOString() ?? $createdAt->toISOString(),
  92. metadata: $withdrawal?->metadata ?? [
  93. 'mocked' => true,
  94. 'environment' => app()->environment(),
  95. ],
  96. );
  97. }
  98. private function mockTransferId(string $idempotencyKey): string
  99. {
  100. return (string) abs(crc32($idempotencyKey));
  101. }
  102. }