custom/plugins/MasterFFLCheckout/src/Subscriber/CheckoutSubscriber.php line 81

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace MasterFFL\Checkout\Subscriber;
  3. use Shopware\Core\Checkout\Order\OrderEvents;
  4. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  5. use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenEvent;
  6. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  7. use Symfony\Component\HttpFoundation\RequestStack;
  8. use Psr\Log\LoggerInterface;
  9. class CheckoutSubscriber implements EventSubscriberInterface
  10. {
  11.     private EntityRepositoryInterface $orderRepository;
  12.     private RequestStack $requestStack;
  13.     private LoggerInterface $logger;
  14.     public function __construct(
  15.         EntityRepositoryInterface $orderRepository,
  16.         RequestStack $requestStack,
  17.         LoggerInterface $logger
  18.     ) {
  19.         $this->orderRepository $orderRepository;
  20.         $this->requestStack $requestStack;
  21.         $this->logger $logger;
  22.     }
  23.     public static function getSubscribedEvents(): array
  24.     {
  25.         return [
  26.             'checkout.order.placed' => 'onOrderPlaced',
  27.             OrderEvents::ORDER_WRITTEN_EVENT => 'onOrderWritten'
  28.         ];
  29.     }
  30.     public function onOrderPlaced($event): void
  31.     {
  32.         try {
  33.             $request $this->requestStack->getCurrentRequest();
  34.             if (!$request) {
  35.                 $this->logger->warning('FFL: No request found in onOrderPlaced');
  36.                 return;
  37.             }
  38.             $session $request->getSession();
  39.             
  40.             // Check for FFL dealer info in multiple session keys
  41.             $fflDealerInfo $session->get('ffl_dealer_info');
  42.             $fflDealerAddress $session->get('ffl_dealer_address');
  43.             
  44.             $this->logger->info('FFL: Order placed, checking for FFL data', [
  45.                 'ffl_dealer_info' => $fflDealerInfo 'Present' 'Not found',
  46.                 'ffl_dealer_address' => $fflDealerAddress 'Present' 'Not found'
  47.             ]);
  48.             
  49.             if ($fflDealerInfo || $fflDealerAddress) {
  50.                 $orderId method_exists($event'getOrderId') ? $event->getOrderId() : $event->getOrder()->getId();
  51.                 $dealerData $fflDealerInfo ? ($fflDealerInfo['dealerData'] ?? $fflDealerInfo) : $fflDealerAddress;
  52.                 
  53.                 $this->updateOrderWithFFLData($orderId$dealerData$event->getContext());
  54.                 
  55.                 // Keep FFL data in session for order confirmation page
  56.                 $session->set('order_ffl_dealer'$dealerData);
  57.                 
  58.                 $this->logger->info('FFL: Order updated with FFL data', [
  59.                     'orderId' => $orderId,
  60.                     'dealerId' => $dealerData['dealerId'] ?? 'unknown'
  61.                 ]);
  62.             } else {
  63.                 $this->logger->info('FFL: No FFL data found for order');
  64.             }
  65.         } catch (\Exception $e) {
  66.             $this->logger->error('FFL: Error processing FFL order on placement', [
  67.                 'error' => $e->getMessage(),
  68.                 'trace' => $e->getTraceAsString()
  69.             ]);
  70.         }
  71.     }
  72.     public function onOrderWritten(EntityWrittenEvent $event): void
  73.     {
  74.         try {
  75.             $request $this->requestStack->getCurrentRequest();
  76.             if (!$request) return;
  77.             $session $request->getSession();
  78.             $fflData $session->get('ffl_dealer_info') ?: $session->get('ffl_dealer_address');
  79.             if (!$fflData) return;
  80.             foreach ($event->getWriteResults() as $writeResult) {
  81.                 $payload $writeResult->getPayload();
  82.                 
  83.                 if ($writeResult->getOperation() === 'insert') {
  84.                     $orderId $payload['id'];
  85.                     $dealerData is_array($fflData) && isset($fflData['dealerData']) ? $fflData['dealerData'] : $fflData;
  86.                     
  87.                     $this->updateOrderWithFFLData($orderId$dealerData$event->getContext());
  88.                     
  89.                     $this->logger->info('FFL: Order written event processed', [
  90.                         'orderId' => $orderId
  91.                     ]);
  92.                 }
  93.             }
  94.         } catch (\Exception $e) {
  95.             $this->logger->error('FFL: Error in onOrderWritten', [
  96.                 'error' => $e->getMessage()
  97.             ]);
  98.         }
  99.     }
  100.     private function updateOrderWithFFLData(string $orderId, array $fflData$context): void
  101.     {
  102.         try {
  103.             $customFields = [
  104.                 'is_ffl_order' => true,
  105.                 'ffl_dealer_id' => $fflData['dealerId'] ?? '',
  106.                 'ffl_dealer_name' => $fflData['firstName'] ?? $fflData['company'] ?? '',
  107.                 'ffl_dealer_company' => $fflData['company'] ?? '',
  108.                 'ffl_dealer_street' => $fflData['street'] ?? '',
  109.                 'ffl_dealer_city' => $fflData['city'] ?? '',
  110.                 'ffl_dealer_state' => $fflData['regionCode'] ?? '',
  111.                 'ffl_dealer_zipcode' => $fflData['zipcode'] ?? '',
  112.                 'ffl_dealer_phone' => $fflData['phoneNumber'] ?? $fflData['telephone'] ?? '',
  113.                 'ffl_processing_date' => date('Y-m-d H:i:s')
  114.             ];
  115.             $this->orderRepository->update([
  116.                 [
  117.                     'id' => $orderId,
  118.                     'customFields' => $customFields
  119.                 ]
  120.             ], $context);
  121.             $this->logger->info('FFL: Order custom fields updated', [
  122.                 'orderId' => $orderId,
  123.                 'dealerId' => $fflData['dealerId'] ?? 'unknown'
  124.             ]);
  125.         } catch (\Exception $e) {
  126.             $this->logger->error('FFL: Error updating order with FFL data', [
  127.                 'orderId' => $orderId,
  128.                 'error' => $e->getMessage()
  129.             ]);
  130.         }
  131.     }
  132. }