import { isNil } from 'lodash' import { isAfter } from 'date-fns' import { AddonStatus } from './addon.enum' export class Addon { // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types static build = (data: any): Addon => { return new Addon({ id: data.id.toString(), addonId: data.addon_id.toString(), purchaseId: data.purchase_id.toString(), createdAt: !isNil(data.created_at) ? new Date(data.created_at) : null, updatedAt: !isNil(data.updated_at) ? new Date(data.updated_at) : null, expiresAt: !isNil(data.expires_at) ? new Date(data.expires_at) : null, cancelledAt: !isNil(data.cancelled_at) ? new Date(data.cancelled_at) : null, freeDaysExpiredAt: !isNil(data.free_days_expired_at) ? new Date(data.free_days_expired_at) : null, originalPrice: !isNil(data.original_price) ? +data.original_price : null, origin: data.origin, subscribeLocationId: data.subscribe_location_id, freeDays: data.free_days, }) } id?: string addonId?: string addonCode?: string purchaseId?: string createdAt?: Date updatedAt?: Date expiresAt?: Date cancelledAt?: Date freeDaysExpiredAt?: Date originalPrice?: number origin?: string subscribeLocationId?: number freeDays?: number documentNumber?: string email?: string constructor(args?: Partial) { Object.assign(this, args) } get hasExpiresAt(): boolean { return !isNil(this.expiresAt) } get hasFreeDaysExpiredAt(): boolean { return !isNil(this.freeDaysExpiredAt) } get hasCancelledAt(): boolean { return !isNil(this.cancelledAt) } get isInTrial(): boolean { return this.hasFreeDaysExpiredAt && isAfter(this.freeDaysExpiredAt, new Date()) } get isInCancellation(): boolean { return this.hasExpiresAt && isAfter(this.expiresAt, new Date()) } get isTrialExpired(): boolean { return this.hasFreeDaysExpiredAt && !isAfter(this.freeDaysExpiredAt, new Date()) } get isCancelled(): boolean { return this.hasExpiresAt && !isAfter(this.expiresAt, new Date()) } get isActive(): boolean { return !this.isCancelled && !this.isInTrial } get isAlive(): boolean { return this.status !== AddonStatus.CANCELLED } get status(): AddonStatus { if (this.isInCancellation) return AddonStatus.IN_CANCELLATION else if (this.isInTrial) return AddonStatus.TRIAL else if (this.isCancelled) return AddonStatus.CANCELLED else if (this.isActive) return AddonStatus.ACTIVE else return null } }