MoneyStrategy

MoneyStrategy

Package: @vendure/core File: money-strategy.ts
v2.0.0

The MoneyStrategy defines how monetary values are stored and manipulated. The MoneyStrategy is defined in EntityOptions:

Example

const config: VendureConfig = {
  entityOptions: {
    moneyStrategy: new MyCustomMoneyStrategy(),
  }
};

Range

The DefaultMoneyStrategy uses an int field in the database, which puts an effective limit of ~21.4 million on any stored value. For certain use cases (e.g. business sales with very high amounts, or currencies with very large denominations), this may cause issues. In this case, you can use the BigIntMoneyStrategy which will use the bigint type to store monetary values, giving an effective upper limit of over 9 quadrillion.

Precision & rounding

Both the DefaultMoneyStrategy and BigIntMoneyStrategy store monetary values as integers, representing the price in the minor units of the currency (i.e. cents in USD or pennies in GBP).

In certain use-cases, it may be required that fractions of a cent or penny be supported. In this case, the solution would be to define a custom MoneyStrategy which uses a non-integer data type for storing the value in the database, and defines a round() implementation which allows decimal places to be kept.

Signature

interface MoneyStrategy extends InjectableStrategy {
  readonly moneyColumnOptions: ColumnOptions;
  round(value: number, quantity?: number): number;
}

Extends

Members

moneyColumnOptions

property
type:
ColumnOptions
Defines the TypeORM column used to store monetary values.

round

method
type:
(value: number, quantity?: number) => number

Defines the logic used to round monetary values. For instance, the default behavior in the DefaultMoneyStrategy is to round the value, then multiply.

return Math.round(value) * quantity;

However, it may be desirable to instead round only after the unit amount has been multiplied. In this case you can define a custom strategy with logic like this:

return Math.round(value * quantity);