src/Core/System/SalesChannel/SalesChannelContext.php line 24

  1. <?php declare(strict_types=1);
  2. namespace Shopware\Core\System\SalesChannel;
  3. use Shopware\Core\Checkout\Cart\CartException;
  4. use Shopware\Core\Checkout\Cart\Delivery\Struct\ShippingLocation;
  5. use Shopware\Core\Checkout\Cart\Tax\Struct\TaxRule;
  6. use Shopware\Core\Checkout\Cart\Tax\Struct\TaxRuleCollection;
  7. use Shopware\Core\Checkout\Customer\Aggregate\CustomerGroup\CustomerGroupEntity;
  8. use Shopware\Core\Checkout\Customer\CustomerEntity;
  9. use Shopware\Core\Checkout\Payment\PaymentMethodEntity;
  10. use Shopware\Core\Checkout\Shipping\ShippingMethodEntity;
  11. use Shopware\Core\Framework\Context;
  12. use Shopware\Core\Framework\DataAbstractionLayer\Pricing\CashRoundingConfig;
  13. use Shopware\Core\Framework\Log\Package;
  14. use Shopware\Core\Framework\Struct\StateAwareTrait;
  15. use Shopware\Core\Framework\Struct\Struct;
  16. use Shopware\Core\System\Currency\CurrencyEntity;
  17. use Shopware\Core\System\SalesChannel\Exception\ContextPermissionsLockedException;
  18. use Shopware\Core\System\Tax\Exception\TaxNotFoundException;
  19. use Shopware\Core\System\Tax\TaxCollection;
  20. #[Package('core')]
  21. class SalesChannelContext extends Struct
  22. {
  23.     use StateAwareTrait;
  24.     /**
  25.      * Unique token for context, e.g. stored in session or provided in request headers
  26.      *
  27.      * @var string
  28.      */
  29.     protected $token;
  30.     /**
  31.      * @var CustomerGroupEntity
  32.      */
  33.     protected $currentCustomerGroup;
  34.     /**
  35.      * @var CurrencyEntity
  36.      */
  37.     protected $currency;
  38.     /**
  39.      * @var SalesChannelEntity
  40.      */
  41.     protected $salesChannel;
  42.     /**
  43.      * @var TaxCollection
  44.      */
  45.     protected $taxRules;
  46.     /**
  47.      * @var CustomerEntity|null
  48.      */
  49.     protected $customer;
  50.     /**
  51.      * @var PaymentMethodEntity
  52.      */
  53.     protected $paymentMethod;
  54.     /**
  55.      * @var ShippingMethodEntity
  56.      */
  57.     protected $shippingMethod;
  58.     /**
  59.      * @var ShippingLocation
  60.      */
  61.     protected $shippingLocation;
  62.     /**
  63.      * @var mixed[]
  64.      */
  65.     protected $permissions = [];
  66.     /**
  67.      * @var bool
  68.      */
  69.     protected $permisionsLocked false;
  70.     /**
  71.      * @var Context
  72.      */
  73.     protected $context;
  74.     /**
  75.      * @internal
  76.      *
  77.      * @param array<string, string[]> $areaRuleIds
  78.      */
  79.     public function __construct(
  80.         Context $baseContext,
  81.         string $token,
  82.         private ?string $domainId,
  83.         SalesChannelEntity $salesChannel,
  84.         CurrencyEntity $currency,
  85.         CustomerGroupEntity $currentCustomerGroup,
  86.         TaxCollection $taxRules,
  87.         PaymentMethodEntity $paymentMethod,
  88.         ShippingMethodEntity $shippingMethod,
  89.         ShippingLocation $shippingLocation,
  90.         ?CustomerEntity $customer,
  91.         private CashRoundingConfig $itemRounding,
  92.         private CashRoundingConfig $totalRounding,
  93.         protected array $areaRuleIds = []
  94.     ) {
  95.         $this->currentCustomerGroup $currentCustomerGroup;
  96.         $this->currency $currency;
  97.         $this->salesChannel $salesChannel;
  98.         $this->taxRules $taxRules;
  99.         $this->customer $customer;
  100.         $this->paymentMethod $paymentMethod;
  101.         $this->shippingMethod $shippingMethod;
  102.         $this->shippingLocation $shippingLocation;
  103.         $this->token $token;
  104.         $this->context $baseContext;
  105.     }
  106.     public function getCurrentCustomerGroup(): CustomerGroupEntity
  107.     {
  108.         return $this->currentCustomerGroup;
  109.     }
  110.     public function getCurrency(): CurrencyEntity
  111.     {
  112.         return $this->currency;
  113.     }
  114.     public function getSalesChannel(): SalesChannelEntity
  115.     {
  116.         return $this->salesChannel;
  117.     }
  118.     public function getTaxRules(): TaxCollection
  119.     {
  120.         return $this->taxRules;
  121.     }
  122.     /**
  123.      * Get the tax rules depend on the customer billing address
  124.      * respectively the shippingLocation if there is no customer
  125.      */
  126.     public function buildTaxRules(string $taxId): TaxRuleCollection
  127.     {
  128.         $tax $this->taxRules->get($taxId);
  129.         if ($tax === null || $tax->getRules() === null) {
  130.             throw new TaxNotFoundException($taxId);
  131.         }
  132.         if ($tax->getRules()->first() !== null) {
  133.             // NEXT-21735 - This is covered randomly
  134.             // @codeCoverageIgnoreStart
  135.             return new TaxRuleCollection([
  136.                 new TaxRule($tax->getRules()->first()->getTaxRate(), 100),
  137.             ]);
  138.             // @codeCoverageIgnoreEnd
  139.         }
  140.         return new TaxRuleCollection([
  141.             new TaxRule($tax->getTaxRate(), 100),
  142.         ]);
  143.     }
  144.     public function getCustomer(): ?CustomerEntity
  145.     {
  146.         return $this->customer;
  147.     }
  148.     public function getPaymentMethod(): PaymentMethodEntity
  149.     {
  150.         return $this->paymentMethod;
  151.     }
  152.     public function getShippingMethod(): ShippingMethodEntity
  153.     {
  154.         return $this->shippingMethod;
  155.     }
  156.     public function getShippingLocation(): ShippingLocation
  157.     {
  158.         return $this->shippingLocation;
  159.     }
  160.     public function getContext(): Context
  161.     {
  162.         return $this->context;
  163.     }
  164.     /**
  165.      * @return string[]
  166.      */
  167.     public function getRuleIds(): array
  168.     {
  169.         return $this->getContext()->getRuleIds();
  170.     }
  171.     /**
  172.      * @param array<string> $ruleIds
  173.      */
  174.     public function setRuleIds(array $ruleIds): void
  175.     {
  176.         $this->getContext()->setRuleIds($ruleIds);
  177.     }
  178.     /**
  179.      * @internal
  180.      *
  181.      * @return array<string, string[]>
  182.      */
  183.     public function getAreaRuleIds(): array
  184.     {
  185.         return $this->areaRuleIds;
  186.     }
  187.     /**
  188.      * @internal
  189.      *
  190.      * @param string[] $areas
  191.      *
  192.      * @return string[]
  193.      */
  194.     public function getRuleIdsByAreas(array $areas): array
  195.     {
  196.         $ruleIds = [];
  197.         foreach ($areas as $area) {
  198.             if (empty($this->areaRuleIds[$area])) {
  199.                 continue;
  200.             }
  201.             $ruleIds array_unique(array_merge($ruleIds$this->areaRuleIds[$area]));
  202.         }
  203.         return array_values($ruleIds);
  204.     }
  205.     /**
  206.      * @internal
  207.      *
  208.      * @param array<string, string[]> $areaRuleIds
  209.      */
  210.     public function setAreaRuleIds(array $areaRuleIds): void
  211.     {
  212.         $this->areaRuleIds $areaRuleIds;
  213.     }
  214.     public function lockRules(): void
  215.     {
  216.         $this->getContext()->lockRules();
  217.     }
  218.     public function lockPermissions(): void
  219.     {
  220.         $this->permisionsLocked true;
  221.     }
  222.     public function getToken(): string
  223.     {
  224.         return $this->token;
  225.     }
  226.     public function getTaxState(): string
  227.     {
  228.         return $this->context->getTaxState();
  229.     }
  230.     public function setTaxState(string $taxState): void
  231.     {
  232.         $this->context->setTaxState($taxState);
  233.     }
  234.     public function getTaxCalculationType(): string
  235.     {
  236.         return $this->getSalesChannel()->getTaxCalculationType();
  237.     }
  238.     /**
  239.      * @return mixed[]
  240.      */
  241.     public function getPermissions(): array
  242.     {
  243.         return $this->permissions;
  244.     }
  245.     /**
  246.      * @param mixed[] $permissions
  247.      */
  248.     public function setPermissions(array $permissions): void
  249.     {
  250.         if ($this->permisionsLocked) {
  251.             throw new ContextPermissionsLockedException();
  252.         }
  253.         $this->permissions array_filter($permissions);
  254.     }
  255.     public function getApiAlias(): string
  256.     {
  257.         return 'sales_channel_context';
  258.     }
  259.     public function hasPermission(string $permission): bool
  260.     {
  261.         return \array_key_exists($permission$this->permissions) && (bool) $this->permissions[$permission];
  262.     }
  263.     public function getSalesChannelId(): string
  264.     {
  265.         return $this->getSalesChannel()->getId();
  266.     }
  267.     public function addState(string ...$states): void
  268.     {
  269.         $this->context->addState(...$states);
  270.     }
  271.     public function removeState(string $state): void
  272.     {
  273.         $this->context->removeState($state);
  274.     }
  275.     public function hasState(string ...$states): bool
  276.     {
  277.         return $this->context->hasState(...$states);
  278.     }
  279.     /**
  280.      * @return string[]
  281.      */
  282.     public function getStates(): array
  283.     {
  284.         return $this->context->getStates();
  285.     }
  286.     public function getDomainId(): ?string
  287.     {
  288.         return $this->domainId;
  289.     }
  290.     public function setDomainId(?string $domainId): void
  291.     {
  292.         $this->domainId $domainId;
  293.     }
  294.     /**
  295.      * @return string[]
  296.      */
  297.     public function getLanguageIdChain(): array
  298.     {
  299.         return $this->context->getLanguageIdChain();
  300.     }
  301.     public function getLanguageId(): string
  302.     {
  303.         return $this->context->getLanguageId();
  304.     }
  305.     public function getVersionId(): string
  306.     {
  307.         return $this->context->getVersionId();
  308.     }
  309.     public function considerInheritance(): bool
  310.     {
  311.         return $this->context->considerInheritance();
  312.     }
  313.     public function getTotalRounding(): CashRoundingConfig
  314.     {
  315.         return $this->totalRounding;
  316.     }
  317.     public function setTotalRounding(CashRoundingConfig $totalRounding): void
  318.     {
  319.         $this->totalRounding $totalRounding;
  320.     }
  321.     public function getItemRounding(): CashRoundingConfig
  322.     {
  323.         return $this->itemRounding;
  324.     }
  325.     public function setItemRounding(CashRoundingConfig $itemRounding): void
  326.     {
  327.         $this->itemRounding $itemRounding;
  328.     }
  329.     public function getCurrencyId(): string
  330.     {
  331.         return $this->getCurrency()->getId();
  332.     }
  333.     public function ensureLoggedIn(bool $allowGuest true): void
  334.     {
  335.         if ($this->customer === null) {
  336.             throw CartException::customerNotLoggedIn();
  337.         }
  338.         if (!$allowGuest && $this->customer->getGuest()) {
  339.             throw CartException::customerNotLoggedIn();
  340.         }
  341.     }
  342.     public function getCustomerId(): ?string
  343.     {
  344.         return $this->customer $this->customer->getId() : null;
  345.     }
  346. }