vendor/shopware/core/Checkout/Cart/Price/NetPriceCalculator.php line 10

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Shopware\Core\Checkout\Cart\Price;
  3. use Shopware\Core\Checkout\Cart\Price\Struct\CalculatedPrice;
  4. use Shopware\Core\Checkout\Cart\Price\Struct\ListPrice;
  5. use Shopware\Core\Checkout\Cart\Price\Struct\QuantityPriceDefinition;
  6. use Shopware\Core\Checkout\Cart\Tax\TaxCalculator;
  7. class NetPriceCalculator
  8. {
  9.     /**
  10.      * @var TaxCalculator
  11.      */
  12.     private $taxCalculator;
  13.     /**
  14.      * @var PriceRoundingInterface
  15.      */
  16.     private $priceRounding;
  17.     /**
  18.      * @var ReferencePriceCalculator
  19.      */
  20.     private $referencePriceCalculator;
  21.     public function __construct(
  22.         TaxCalculator $taxCalculator,
  23.         PriceRoundingInterface $priceRounding,
  24.         ReferencePriceCalculator $referencePriceCalculator
  25.     ) {
  26.         $this->taxCalculator $taxCalculator;
  27.         $this->priceRounding $priceRounding;
  28.         $this->referencePriceCalculator $referencePriceCalculator;
  29.     }
  30.     public function calculate(QuantityPriceDefinition $definition): CalculatedPrice
  31.     {
  32.         $unitPrice $this->getUnitPrice($definition);
  33.         $taxRules $definition->getTaxRules();
  34.         $calculatedTaxes $this->taxCalculator->calculateNetTaxes(
  35.             $unitPrice,
  36.             $definition->getTaxRules()
  37.         );
  38.         foreach ($calculatedTaxes as $tax) {
  39.             $total $this->priceRounding->round($tax->getTax() * $definition->getQuantity(), $definition->getPrecision());
  40.             $tax->setTax($total);
  41.             $tax->setPrice($tax->getPrice() * $definition->getQuantity());
  42.         }
  43.         $price $this->priceRounding->round(
  44.             $unitPrice $definition->getQuantity(),
  45.             $definition->getPrecision()
  46.         );
  47.         return new CalculatedPrice(
  48.             $unitPrice,
  49.             $price,
  50.             $calculatedTaxes,
  51.             $taxRules,
  52.             $definition->getQuantity(),
  53.             $this->referencePriceCalculator->calculate($price$definition),
  54.             $this->calculateListPrice($unitPrice$definition)
  55.         );
  56.     }
  57.     private function getUnitPrice(QuantityPriceDefinition $definition): float
  58.     {
  59.         //item price already calculated?
  60.         if ($definition->isCalculated()) {
  61.             return $definition->getPrice();
  62.         }
  63.         return $this->priceRounding->round(
  64.             $definition->getPrice(),
  65.             $definition->getPrecision()
  66.         );
  67.     }
  68.     private function calculateListPrice(float $unitPriceQuantityPriceDefinition $definition): ?ListPrice
  69.     {
  70.         if (!$definition->getListPrice()) {
  71.             return null;
  72.         }
  73.         $listPrice $definition->getListPrice();
  74.         if (!$definition->isCalculated()) {
  75.             $listPrice $this->priceRounding->round($definition->getListPrice(), $definition->getPrecision());
  76.         }
  77.         return ListPrice::createFromUnitPrice($unitPrice$listPrice);
  78.     }
  79. }