@vendure/core
Version:
A modern, headless ecommerce framework
75 lines (74 loc) • 3.65 kB
TypeScript
import { RequestContext } from '../../api/common/request-context';
import { PriceCalculationResult } from '../../common/types/common-types';
import { InjectableStrategy } from '../../common/types/injectable-strategy';
import { Order } from '../../entity/order/order.entity';
import { ProductVariant } from '../../entity/product-variant/product-variant.entity';
/**
* @description
* The OrderItemPriceCalculationStrategy defines the listPrice of an OrderLine when adding an item to an Order. By default the
* {@link DefaultOrderItemPriceCalculationStrategy} is used.
*
* :::info
*
* This is configured via the `orderOptions.orderItemPriceCalculationStrategy` property of
* your VendureConfig.
*
* :::
*
* ### When is the strategy invoked ?
* * addItemToOrder (only on the new order line)
* * adjustOrderLine (only on the adjusted order line)
* * setOrderShippingAddress (on all order lines)
* * setOrderBillingAddress (on all order lines)
*
* ### OrderItemPriceCalculationStrategy vs Promotions
* Both the OrderItemPriceCalculationStrategy and Promotions can be used to alter the price paid for a product.
*
* The main difference is when a Promotion is applied, it adds a `discount` line to the Order, and the regular
* price is used for the value of `OrderLine.listPrice` property, whereas
* the OrderItemPriceCalculationStrategy actually alters the value of `OrderLine.listPrice` itself, and does not
* add any discounts to the Order.
*
* Use OrderItemPriceCalculationStrategy if:
*
* * The price calculation is based on the properties of the ProductVariant and any CustomFields
* specified on the OrderLine, for example via a product configurator.
* * The logic is a permanent part of your business requirements.
*
* Use Promotions if:
*
* * You want to implement "discounts" and "special offers"
* * The calculation is not a permanent part of your business requirements.
* * The price depends on dynamic aspects such as quantities and which other
* ProductVariants are in the Order.
* * The configuration of the logic needs to be manipulated via the Admin UI.
*
* ### Example use-cases
*
* A custom OrderItemPriceCalculationStrategy can be used to implement things like:
*
* * A gift-wrapping service, where a boolean custom field is defined on the OrderLine. If `true`,
* a gift-wrapping surcharge would be added to the price.
* * A product-configurator where e.g. various finishes, colors, and materials can be selected and stored
* as OrderLine custom fields (see [the Custom Fields guide](/guides/developer-guide/custom-fields/).
* * Price lists or bulk pricing, where different price bands are stored e.g. in a customField on the ProductVariant, and this
* is used to calculate the price based on the current quantity.
*
* @docsCategory Orders
*/
export interface OrderItemPriceCalculationStrategy extends InjectableStrategy {
/**
* @description
* Receives the ProductVariant to be added to the Order as well as any OrderLine custom fields and returns
* the price for a single unit.
*
* Note: if you have any `relation` type custom fields defined on the OrderLine entity, they will only be
* passed in to this method if they are set to `eager: true`. Otherwise, you can use the {@link EntityHydrator}
* to join the missing relations.
*
* Note: the `quantity` argument was added in v2.0.0
*/
calculateUnitPrice(ctx: RequestContext, productVariant: ProductVariant, orderLineCustomFields: {
[key: string]: any;
}, order: Order, quantity: number): PriceCalculationResult | Promise<PriceCalculationResult>;
}