src/EventSubscriber/Payment/OrderPaymentCompletedSubscriber.php line 38
<?phpdeclare(strict_types=1);namespace App\EventSubscriber\Payment;use App\Entity\Geographical\Address;use App\Entity\Payment\Payment;use App\Message\CompleteOrderRequest;use App\OrderStates;use App\Processor\Order\CompleteOrderProcessorInterface;use App\Repository\CustomerRepository;use App\Repository\Order\OrderRepository;use ApiPlatform\Api\IriConverterInterface;use Doctrine\ORM\EntityManagerInterface;use Symfony\Component\EventDispatcher\EventSubscriberInterface;use Symfony\Component\Workflow\Event\Event;use Symfony\Component\Workflow\Registry;use Webmozart\Assert\Assert;/*** When a Stripe payment completes for an order (direct or complement),* transition the order to in_production and debit credits for complement.* If the payment was created via direct-intent (no order yet), create the order from payload first.*/final class OrderPaymentCompletedSubscriber implements EventSubscriberInterface{public function __construct(private Registry $workflowRegistry,private OrderRepository $orderRepository,private CustomerRepository $customerRepository,private CompleteOrderProcessorInterface $completeOrderProcessor,private IriConverterInterface $iriConverter,private EntityManagerInterface $entityManager,) {}public function onPaymentCompleted(Event $event): void{/** @var Payment $payment */$payment = $event->getSubject();Assert::isInstanceOf($payment, Payment::class);if (!$payment->isOrderPayment()) {return;}$order = $payment->getOrder();if ($order === null) {$details = $payment->getDetails();$payload = $details['order_payload'] ?? null;if (!\is_array($payload)) {return;}$address = $this->iriConverter->getResourceFromIri((string) $payload['address']);Assert::isInstanceOf($address, Address::class);$completeOrderRequest = new CompleteOrderRequest(name: $payload['name'] ?? '',address: $address,quantity: $payload['quantity'] ?? 1,photosCount: $payload['photosCount'] ?? 0,mattePaper: $payload['mattePaper'] ?? false,withFrame: $payload['withFrame'] ?? false,isFromCode: $payload['isFromCode'] ?? false,paymentMode: $payload['paymentMode'] ?? 'direct',sharedEventCode: isset($payload['sharedEventCode']) ? (string) $payload['sharedEventCode'] : null,);$order = $this->completeOrderProcessor->processOrderAfterPayment($completeOrderRequest);$payment->setOrder($order);$this->entityManager->flush();}if ($payment->getPaymentType() === 'order_complement' && $payment->getCreditsToDebit() > 0) {$customer = $order->getCustomer();if ($customer !== null) {$customer->setCredits($customer->getCredits() - $payment->getCreditsToDebit());$this->customerRepository->add($customer);}}$orderWorkflow = $this->workflowRegistry->get($order, 'order');if ($orderWorkflow->can($order, OrderStates::TRANSITION_PAYMENT_CONFIRMED)) {$orderWorkflow->apply($order, OrderStates::TRANSITION_PAYMENT_CONFIRMED);$this->orderRepository->add($order);}}public static function getSubscribedEvents(): array{return ['workflow.payment.enter.completed' => ['onPaymentCompleted', -10], // after PaymentAddCreditsSubscriber];}}