CoreShop Product Price Calculation
CoreShop uses multiple Price Calculators to determine the correct price for a product. Per default following Calculators are used
- Price Rule Calculator which uses Prices from Catalog Price Rules and Specific Price Rules
 - Store Product Price Calculator
 
These two are only the default implementations, if you need a custom Calculator, you need to implement the Interface
CoreShop\Component\Product\Calculator\ProductPriceCalculatorInterface and register your service with the tag
coreshop.product.price_calculator, a type attribute and a priority
What prices does CoreShop calculate?
CoreShop Price Calculation consists of 3 different prices:
- Retail Price: Base Price without any discounts
 - Discount Price: Special Price for promotions. Needs to return a price smaller than retail price, otherwise retail price is valid
 - Discount: Discount from promotions
 - Price: Retail Price or Discount Price (if available) minus discount rules
 
The default is always to use store values prices.
Calculator Service
If you want to calculate the Price for a Product, you need to use a special service to do that. There are two options:
1: coreshop.product.price_calculator which calculates prices without any tax regards.
2: coreshop.product.taxed_price_calculator which calculates prices with tax or without. (recommended one to use)
Templating
If you want to calculate the price within a Template, you can do so by using the filter coreshop_product_price
{{ (product|coreshop_product_price(true)) }}
Custom Price Calculator Example
Our Example Service will take the Property "price" - 1 as Product Price and -1 as Discount, therefore the price stays the same. This example is only a show-case of how to add a new calculator.
CoreShop Price calculation always depends on a context. The context per default consists of following values:
- Store
 - Country
 - Currency
 - Customer (if logged in)
 - Cart
 
<?php
namespace AppBundle\CoreShop\Product;
use CoreShop\Component\Product\Calculator\ProductPriceCalculatorInterface;
use CoreShop\Component\Product\Model\ProductInterface;
final class CustomPriceCalculator implements ProductPriceCalculatorInterface
{
    /**
     * Used to determine a retail price
     */
    public function getPrice(ProductInterface $subject, array $context, bool $withDiscount = true): int
    {
        $price = $this->getRetailPrice($subject, $context);
        return $withDiscount ? $this->getDiscount($subject, $price) : $price;
    }
    /**
     * Used to determine a retail price
     */
    public function getRetailPrice(ProductInterface $subject, array $context): int
    {
        return $subject->getStorePrice($context['store']);
    }
    /**
     * Used to determine a discount
     */
    public function getDiscount(ProductInterface $subject, array $context, int $price): int
    {
        return 0;
    }
    /**
     * Used to determine a discounted price
     */
    public function getDiscountPrice(ProductInterface $subject, array $context): int
    {
        return 0;
    }
}
Now we need to register our service to the container and add the calculator tag:
app.coreshop.product.price_calculator.custom:
    class: AppBundle\CoreShop\Product\CustomPriceCalculator
    tags:
      - { name: coreshop.product.price_calculator, type: custom, priority: 1 }
CoreShop now uses our service for all Product Price Calculations.