rwadurian/backend/services/trading-service/src/domain/value-objects/money.vo.ts

69 lines
1.5 KiB
TypeScript

import Decimal from 'decimal.js';
export class Money {
private readonly _value: Decimal;
constructor(value: Decimal | string | number) {
this._value = value instanceof Decimal ? value : new Decimal(value);
if (this._value.isNegative()) {
throw new Error('Money cannot be negative');
}
}
get value(): Decimal {
return this._value;
}
add(other: Money): Money {
return new Money(this._value.plus(other._value));
}
subtract(other: Money): Money {
const result = this._value.minus(other._value);
if (result.isNegative()) {
throw new Error('Insufficient balance');
}
return new Money(result);
}
multiply(factor: Decimal | string | number): Money {
return new Money(this._value.times(factor));
}
divide(divisor: Decimal | string | number): Money {
return new Money(this._value.dividedBy(divisor));
}
isZero(): boolean {
return this._value.isZero();
}
isGreaterThan(other: Money): boolean {
return this._value.greaterThan(other._value);
}
isLessThan(other: Money): boolean {
return this._value.lessThan(other._value);
}
isGreaterThanOrEqual(other: Money): boolean {
return this._value.greaterThanOrEqualTo(other._value);
}
equals(other: Money): boolean {
return this._value.equals(other._value);
}
toFixed(decimals: number = 8): string {
return this._value.toFixed(decimals);
}
toString(): string {
return this._value.toString();
}
static zero(): Money {
return new Money(0);
}
}