| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- <?php
- namespace App\Services\Pagarme;
- use App\Data\Pagarme\Anticipation\BulkAnticipationRequestData;
- use App\Data\Pagarme\Anticipation\BulkAnticipationResponseData;
- use App\Data\Pagarme\Order\OrderRequestData;
- use App\Models\Payment;
- use App\Services\Pagarme\Concerns\SendsPagarmeRequests;
- use Illuminate\Support\Facades\Log;
- use Throwable;
- class PagarmeAnticipationService
- {
- use SendsPagarmeRequests;
- public function createBulkAnticipation(Payment $payment): ?BulkAnticipationResponseData
- {
- $provider = $payment->provider()->first();
- if (! $provider) {
- return null;
- }
- $recipientId = $provider->recipient_id;
- if (empty($recipientId)) {
- return null;
- }
- $providerSplit = $payment->splits()
- ->where('provider_id', $payment->provider_id)
- ->first();
- if (! $providerSplit) {
- return null;
- }
- $requestedAmount = OrderRequestData::amountInCents((float) $providerSplit->gross_amount);
- if ($requestedAmount <= 0) {
- return null;
- }
- try {
- $response = BulkAnticipationResponseData::fromArray($this->pagarmeRequest(
- method: 'POST',
- path: "/recipients/{$recipientId}/bulk_anticipations",
- payload: new BulkAnticipationRequestData(
- paymentDate: $this->getAnticipationPaymentDate(),
- timeframe: 'start',
- requestedAmount: $requestedAmount,
- automaticTransfer: false,
- ),
- idempotencyKey: "bulk-ant-{$payment->id}-{$payment->provider_id}",
- errorMessage: 'Erro ao criar antecipacao no Pagar.me.',
- ));
- $response->requireId();
- return $response;
- } catch (Throwable $e) {
- Log::channel('pagarme')->warning('Falha ao criar antecipacao no Pagar.me.', [
- 'payment_id' => $payment->id,
- 'provider_id' => $payment->provider_id,
- 'recipient_id' => $recipientId,
- 'requested_amount' => $requestedAmount,
- 'error' => $e->getMessage(),
- ]);
- return null;
- }
- }
- private function getAnticipationPaymentDate(): string
- {
- $now = now()->timezone('America/Sao_Paulo');
- if ($now->hour < 11) {
- return $now->toISOString();
- }
- $nextBusinessDay = $now->copy()->addDay();
- while ($nextBusinessDay->isWeekend()) {
- $nextBusinessDay->addDay();
- }
- return $nextBusinessDay->startOfDay()->toISOString();
- }
- }
|