vendor/shopware/core/System/SalesChannel/SalesChannelContext.php line 26

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