import BaseEntity from '../../common/entities/BaseEntity'; import EventProduct from '../../EventProduct/entity/EventProduct'; import PromoCodeUseTypes from '../enums/PromoCodeUseTypes'; import PromoCodeProductTypes from '../enums/PromoCodeLimitedToProductTypes'; import PromoCodeDiscountTypes from '../enums/PromoCodeDiscountTypes'; import DiscountPercentage from '../../common/entities/DiscountPercentage'; import PromoCodeTeamOptions from '../enums/PromoCodeTeamOptions'; import Money from '../../common/entities/Money'; import Currency from '../../common/entities/Currency'; export default class PromoCode extends BaseEntity { private _code: string = ''; private _used: number; private _supply: number; private _discount_type: PromoCodeDiscountTypes = PromoCodeDiscountTypes.TYPE_FIXED; private _discount_amount: any; private _discount: Money = new Money(new Currency('GBP', 'L', 2), 0); private _discount_percentage: DiscountPercentage = new DiscountPercentage(0, 0); private _value: number; private _end_date: string; private _max_seats: number; private _min_seats: number; private _start_date: string; private _team: PromoCodeTeamOptions = PromoCodeTeamOptions.TEAM_MARKETING; private _number_of_usages: number; private _number_of_max_usages: number; private _number_of_promo_codes: number; private _use_type: PromoCodeUseTypes; private _product_type: PromoCodeProductTypes; private _associated_events: Array = []; get code(): string { return this._code; } set code(value: string) { this._code = value; } get used(): number { return this._used; } set used(value: number) { this._used = value; } get supply(): number { return this._supply; } set supply(value: number) { this._supply = value; } get discount_type(): PromoCodeDiscountTypes { return this._discount_type; } set discount_type(value: PromoCodeDiscountTypes) { this._discount_type = value; } get discount(): Money { return this._discount; } set discount(value: Money) { this._discount = value; } get discount_amount(): any { return this._discount_amount; } set discount_amount(value: any) { this._discount_amount = value; } get discount_percentage(): DiscountPercentage { return this._discount_percentage; } set discount_percentage(value: DiscountPercentage) { this._discount_percentage = value; } get end_date(): string { return this._end_date; } set end_date(value: string) { this._end_date = value; } get max_seats(): number { return this._max_seats; } set max_seats(value: number) { this._max_seats = value; } get min_seats(): number { return this._min_seats; } set min_seats(value: number) { this._min_seats = value; } get start_date(): string { return this._start_date; } set start_date(value: string) { this._start_date = value; } get team(): PromoCodeTeamOptions { return this._team; } set team(value: PromoCodeTeamOptions) { this._team = value; } get number_of_usages(): number { return this._number_of_usages; } set number_of_usages(value: number) { this._number_of_usages = value; } get number_of_max_usages(): number { return this._number_of_max_usages; } set number_of_max_usages(value: number) { this._number_of_max_usages = value; } get number_of_promo_codes(): number { return this._number_of_promo_codes; } set number_of_promo_codes(value: number) { this._number_of_promo_codes = value; } get use_type(): PromoCodeUseTypes { return this._use_type; } set use_type(value: PromoCodeUseTypes) { this._use_type = value; } get product_type(): PromoCodeProductTypes { return this._product_type; } set product_type(value: PromoCodeProductTypes) { this._product_type = value; } get associated_events(): Array { return this._associated_events; } set associated_events(value: Array) { this._associated_events = value; } private isFixedAmount() { return this.discount_type === PromoCodeDiscountTypes.TYPE_FIXED; } private isPercentageDiscount() { return this.discount_type === PromoCodeDiscountTypes.TYPE_PERCENTAGE; } isUseTypeUnique() { return this.use_type === PromoCodeUseTypes.UNIQUE; } isUseTypeFirstTime() { return this.use_type === PromoCodeUseTypes.FIRST_TIME; } isUseTypeGeneric() { return this.use_type === PromoCodeUseTypes.GENERIC_MULTIPLE_USE; } get value() { if(this.isFixedAmount()) { this._value = this.discount.amount; } else if(this.isPercentageDiscount()) { this._value = this.discount_percentage.value; } return this._value; } set value(value: number) { this._value = value; if(this.isFixedAmount()) { this.discount.amount = value; } else if(this.isPercentageDiscount()) { this.discount_percentage.value = value; } } }