Skip to content

Price API

Currencies

To manage currencies, use CurrencyServiceInterface.

To access a currency object by its code, use CurrencyServiceInterface::getCurrencyByCode. To access a whole list of currencies, use CurrencyServiceInterface::findCurrencies.

1
2
3
4
5
6
7
8
        $currency = $this->currencyService->getCurrencyByCode($currencyCode);
        $output->writeln('Currency ID: ' . $currency->getId());

        $currencies = $this->currencyService->findCurrencies();

        foreach ($currencies as $currency) {
            $output->writeln('Currency ' . $currency->getId() . ' with code ' . $currency->getCode());
        }

To create a new currency, use CurrencyServiceInterface::createCurrency() and provide it with a CurrencyCreateStruct with code, number of fractional digits and a flag indicating if the currency is enabled:

1
2
3
        $currencyCreateStruct = new CurrencyCreateStruct($newCurrencyCode, 2, true);

        $this->currencyService->createCurrency($currencyCreateStruct);

Prices

To manage prices, use ProductPriceService.

To retrieve the price of a product in the currency for the current context, use Product::getPrice():

1
2
3
        $productPrice = $product->getPrice();

        $output->writeln('Price for ' . $product->getName() . ' is ' . $productPrice);

To retrieve the price of a product in a specific currency, use ProductPriceService::getPriceByProductAndCurrency:

1
2
3
        $productPrice = $this->productPriceService->getPriceByProductAndCurrency($product, $currency);

        $output->writeln('Price for ' . $product->getName() . ' in ' . $currencyCode . ' is ' . $productPrice);

To get all prices (in different currencies) for a given product, use ProductPriceService::findPricesByProductCode:

1
2
3
4
5
6
        $prices = $this->productPriceService->findPricesByProductCode($productCode)->getPrices();

        $output->writeln('All prices for ' . $product->getName() . ':');
        foreach ($prices as $price) {
            $output->writeln((string) $price);
        }

To load price definitions that match given criteria, use ProductPriceServiceInterface::findPrices:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
use Ibexa\Contracts\ProductCatalog\Values\Price\PriceQuery;
use Ibexa\Contracts\ProductCatalog\Values\Price\Query\Criterion\Currency as CurrencyCriterion;
use Ibexa\Contracts\ProductCatalog\Values\Price\Query\Criterion\CustomerGroup;
use Ibexa\Contracts\ProductCatalog\Values\Price\Query\Criterion\LogicalOr;

// ...
        $priceCriteria = [
            new CurrencyCriterion($this->currencyService->getCurrencyByCode('USD')),
            new CustomerGroup('customer_group_1'),
            new Product('ergo_desk'),
        ];

        $priceQuery = new PriceQuery(new LogicalOr(...$priceCriteria));
        $prices = $this->productPriceService->findPrices($priceQuery);

        $output->writeln(sprintf('Found %d prices with provided criteria', $prices->getTotalCount()));

You can also use ProductPriceService to create or modify existing prices. For example, to create a new price for a given currency, use ProductPriceService::createProductPrice and provide it with a ProductPriceCreateStruct object:

1
2
3
4
5
        $productPrice = $product->getPrice();

        $output->writeln('Price for ' . $product->getName() . ' is ' . $productPrice);

        $productPrice = $this->productPriceService->getPriceByProductAndCurrency($product, $currency);

Note

Prices operate using the Money library. That is why all amounts are provided in the smallest unit. For example, for euro 50000 refers to 50000 cents, equal to 500 euros.

Resolve prices

To display a product price on a product page or in the cart, you must calculate its value based on a base price and the context. Context contains information about any price modifiers that may apply to a specific customer group. To determine the final price, or resolve the price, use the PriceResolverInterface service, which uses the following logic:

  1. Checks whether a price exists for the product and currency, returns null if no such price exists.
  2. Verifies whether a customer group-related modifier exists:
    1. If yes, it returns a custom price that is valid for the selected customer group.
    2. If not, it returns a base product price in the selected currency.

To resolve a price of a product in the currency for the current context, use either PriceResolverInterface::resolvePrice() or PriceResolverInterface::resolvePrices():

1
2
3
4
5
6
7
8
use Ibexa\Contracts\ProductCatalog\PriceResolverInterface;
use Ibexa\Contracts\ProductCatalog\Values\Price\PriceContext;

// ...
        $context = new PriceContext($currency);
        $price = $this->priceResolver->resolvePrice($product, $context);

        $output->writeln('Price in ' . $currency->getCode() . ' for ' . $product->getName() . ' is ' . $price);

VAT

To get information about the VAT categories and rates configured in the system, use VatServiceInterface. VAT is configured per region, so you also need to use RegionServiceInterface to get the relevant region object.

1
        $region = $this->regionService->getRegion('poland');

To get information about all VAT categories configured for the selected region, use VatServiceInterface::getVatCategories():

1
2
3
4
5
        $vatCategories = $this->vatService->getVatCategories($region);

        foreach ($vatCategories as $category) {
            $output->writeln($category->getIdentifier() . ': ' . $category->getVatValue());
        }

To get a single VAT category, use VatServiceInterface::getVatCategoryByIdentifier() and provide it with the region object and the identifier of the VAT category:

1
        $vatCategory = $this->vatService->getVatCategoryByIdentifier($region, 'reduced');