PagarmeAnticipationService.php 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. <?php
  2. namespace App\Services\Pagarme;
  3. use App\Data\Pagarme\Anticipation\BulkAnticipationRequestData;
  4. use App\Data\Pagarme\Anticipation\BulkAnticipationResponseData;
  5. use App\Data\Pagarme\Order\OrderRequestData;
  6. use App\Models\Payment;
  7. use App\Services\Pagarme\Concerns\SendsPagarmeRequests;
  8. use Illuminate\Support\Facades\Log;
  9. use Throwable;
  10. class PagarmeAnticipationService
  11. {
  12. use SendsPagarmeRequests;
  13. public function createBulkAnticipation(Payment $payment): ?BulkAnticipationResponseData
  14. {
  15. $provider = $payment->provider()->first();
  16. if (! $provider) {
  17. return null;
  18. }
  19. $recipientId = $provider->recipient_id;
  20. if (empty($recipientId)) {
  21. return null;
  22. }
  23. $providerSplit = $payment->splits()
  24. ->where('provider_id', $payment->provider_id)
  25. ->first();
  26. if (! $providerSplit) {
  27. return null;
  28. }
  29. $requestedAmount = OrderRequestData::amountInCents((float) $providerSplit->gross_amount);
  30. if ($requestedAmount <= 0) {
  31. return null;
  32. }
  33. try {
  34. $response = BulkAnticipationResponseData::fromArray($this->pagarmeRequest(
  35. method: 'POST',
  36. path: "/recipients/{$recipientId}/bulk_anticipations",
  37. payload: new BulkAnticipationRequestData(
  38. paymentDate: $this->getAnticipationPaymentDate(),
  39. timeframe: 'start',
  40. requestedAmount: $requestedAmount,
  41. automaticTransfer: false,
  42. ),
  43. idempotencyKey: "bulk-ant-{$payment->id}-{$payment->provider_id}",
  44. errorMessage: 'Erro ao criar antecipacao no Pagar.me.',
  45. ));
  46. $response->requireId();
  47. return $response;
  48. } catch (Throwable $e) {
  49. Log::channel('pagarme')->warning('Falha ao criar antecipacao no Pagar.me.', [
  50. 'payment_id' => $payment->id,
  51. 'provider_id' => $payment->provider_id,
  52. 'recipient_id' => $recipientId,
  53. 'requested_amount' => $requestedAmount,
  54. 'error' => $e->getMessage(),
  55. ]);
  56. return null;
  57. }
  58. }
  59. private function getAnticipationPaymentDate(): string
  60. {
  61. $now = now()->timezone('America/Sao_Paulo');
  62. if ($now->hour < 11) {
  63. return $now->toISOString();
  64. }
  65. $nextBusinessDay = $now->copy()->addDay();
  66. while ($nextBusinessDay->isWeekend()) {
  67. $nextBusinessDay->addDay();
  68. }
  69. return $nextBusinessDay->startOfDay()->toISOString();
  70. }
  71. }