vendor/shopware/core/Checkout/Cart/Processor.php line 67

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Shopware\Core\Checkout\Cart;
  3. use Shopware\Core\Checkout\Cart\Hook\CartHook;
  4. use Shopware\Core\Checkout\Cart\Price\AmountCalculator;
  5. use Shopware\Core\Checkout\Cart\Transaction\TransactionProcessor;
  6. use Shopware\Core\Framework\Feature;
  7. use Shopware\Core\Framework\Log\Package;
  8. use Shopware\Core\Framework\Script\Execution\ScriptExecutor;
  9. use Shopware\Core\Profiling\Profiler;
  10. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  11. #[Package('checkout')]
  12. class Processor
  13. {
  14.     private Validator $validator;
  15.     private AmountCalculator $amountCalculator;
  16.     private TransactionProcessor $transactionProcessor;
  17.     /**
  18.      * @var CartProcessorInterface[]
  19.      */
  20.     private $processors;
  21.     /**
  22.      * @var CartDataCollectorInterface[]
  23.      */
  24.     private $collectors;
  25.     private ScriptExecutor $executor;
  26.     /**
  27.      * @internal
  28.      */
  29.     public function __construct(
  30.         Validator $validator,
  31.         AmountCalculator $amountCalculator,
  32.         TransactionProcessor $transactionProcessor,
  33.         iterable $processors,
  34.         iterable $collectors,
  35.         ScriptExecutor $executor
  36.     ) {
  37.         $this->validator $validator;
  38.         $this->amountCalculator $amountCalculator;
  39.         $this->transactionProcessor $transactionProcessor;
  40.         $this->processors $processors;
  41.         $this->collectors $collectors;
  42.         $this->executor $executor;
  43.     }
  44.     public function process(Cart $originalSalesChannelContext $contextCartBehavior $behavior): Cart
  45.     {
  46.         return Profiler::trace('cart::process', function () use ($original$context$behavior) {
  47.             $cart = new Cart($original->getName(), $original->getToken());
  48.             $cart->setCustomerComment($original->getCustomerComment());
  49.             $cart->setAffiliateCode($original->getAffiliateCode());
  50.             $cart->setCampaignCode($original->getCampaignCode());
  51.             $cart->setBehavior($behavior);
  52.             $cart->addState(...$original->getStates());
  53.             // move data from previous calculation into new cart
  54.             $cart->setData($original->getData());
  55.             $this->runProcessors($original$cart$context$behavior);
  56.             if ($behavior->hookAware()) {
  57.                 $this->executor->execute(new CartHook($cart$context));
  58.             }
  59.             $this->calculateAmount($context$cart);
  60.             $cart->addErrors(
  61.                 ...$this->validator->validate($cart$context)
  62.             );
  63.             $cart->setTransactions(
  64.                 $this->transactionProcessor->process($cart$context)
  65.             );
  66.             $cart->setRuleIds($context->getRuleIds());
  67.             return $cart;
  68.         }, 'cart');
  69.     }
  70.     private function runProcessors(Cart $originalCart $cartSalesChannelContext $contextCartBehavior $behavior): void
  71.     {
  72.         if ($original->getLineItems()->count() <= 0
  73.             && (Feature::isActive('v6.5.0.0') || Feature::isActive('PERFORMANCE_TWEAKS'))
  74.         ) {
  75.             $cart->addErrors(...array_values($original->getErrors()->getPersistent()->getElements()));
  76.             $cart->setExtensions($original->getExtensions());
  77.             return;
  78.         }
  79.         // enrich cart with all required data
  80.         foreach ($this->collectors as $collector) {
  81.             $collector->collect($cart->getData(), $original$context$behavior);
  82.         }
  83.         $cart->addErrors(...array_values($original->getErrors()->getPersistent()->getElements()));
  84.         $cart->setExtensions($original->getExtensions());
  85.         $this->calculateAmount($context$cart);
  86.         // start processing, cart will be filled step by step with line items of original cart
  87.         foreach ($this->processors as $processor) {
  88.             $processor->process($cart->getData(), $original$cart$context$behavior);
  89.             $this->calculateAmount($context$cart);
  90.         }
  91.     }
  92.     private function calculateAmount(SalesChannelContext $contextCart $cart): void
  93.     {
  94.         $amount $this->amountCalculator->calculate(
  95.             $cart->getLineItems()->getPrices(),
  96.             $cart->getDeliveries()->getShippingCosts(),
  97.             $context
  98.         );
  99.         $cart->setPrice($amount);
  100.     }
  101. }