ticket_id = $ticket_id; $this->requested_n_days_before_summit = $requested_n_days_before_summit; } /** * @param IBuildDefaultPaymentGatewayProfileStrategy $default_payment_gateway_strategy * @param ISummitAttendeeTicketRepository $repository * @param ITransactionService $tx_service * @throws \Exception */ public function handle( IBuildDefaultPaymentGatewayProfileStrategy $default_payment_gateway_strategy, ISummitAttendeeTicketRepository $repository, ITransactionService $tx_service ) { $tx_service->transaction(function () use ($default_payment_gateway_strategy, $repository) { $ticket = $repository->getByIdExclusiveLock($this->ticket_id); if (is_null($ticket) || !$ticket instanceof SummitAttendeeTicket || !$ticket->isRefundRequested()) return; $order = $ticket->getOrder(); $summit = $order->getSummit(); $payment_gateway = $summit->getPaymentGateWayPerApp ( IPaymentConstants::ApplicationTypeRegistration, $default_payment_gateway_strategy ); if (is_null($payment_gateway)) { Log::warning(sprintf("Payment configuration is not set for summit %s", $summit->getId())); return; } $policy = $summit->getRefundPolicyForRefundRequest($this->requested_n_days_before_summit); if (is_null($policy)) return; $rate = $policy->getRefundRate(); if ($rate <= 0) return; $amount_2_refund = ($rate / 100.00) * $ticket->getFinalAmount(); if (!$order->hasPaymentInfo()) { Log::warning(sprintf("order %s has not payment info ", $order->getId())); return; } try { $payment_gateway->refundPayment( $order->getPaymentGatewayCartId(), $amount_2_refund, $ticket->getCurrency() ); } catch (\Exception $ex) { Log::warning($ex); return; } $ticket->refund($amount_2_refund); }); } }