import { DIGITAL_PRODUCT_CODES, EPAPER_CODE, PRINT_PRODUCT_CODES, STANDARD_AND_PREMIUM_DIGITAL_PRODUCT_CODES, EMAIL_NEWSLETTER_DIGITAL_PRODUCT_CODES, FT_EDIT_PRODUCT_CODE } from '../static-data/product-codes'; import { Amount } from '../types/offer'; import { Subscription, OfferData, StepUpData } from '../types/subscription'; import { SubscriptionFutureRatePlan, SubscriptionRatePlan } from './subscription'; export class UserSubscription { public status: string; public term: string; public fulfilmentOption: string; public productCodes: Array; public productName: string; public productType: string; public number: string; public startDate: string; public createdDate: string; public renewalDate: string; public endDate: string; public price: Amount; public trialEndDate: string; public trialPrice: Amount; public isOutOfTerm: boolean; public isSingleTerm: boolean; public source: string; public offer: OfferData; public stepUp: StepUpData; public ratePlan: SubscriptionRatePlan; public futureRatePlan: SubscriptionFutureRatePlan; public hasFrozenPrice: boolean; public availableActions: Array = []; public history: Array<{}> = []; constructor(subscription: Subscription) { this.status = subscription.status; this.term = subscription.term; this.fulfilmentOption = subscription.fulfilmentOption && subscription.fulfilmentOption.toUpperCase(); this.productCodes = (subscription.productCodes || []).map((code: string) => code.toUpperCase()); this.productName = subscription.productName; this.productType = subscription.productType; this.number = subscription.reference; this.startDate = subscription.startDate; this.createdDate = subscription.createdDate; this.renewalDate = subscription.renewalDate; this.endDate = subscription.endDate; this.price = subscription.price; this.trialEndDate = subscription.trialEndDate; this.trialPrice = subscription.trialPrice; this.isOutOfTerm = subscription.isOutOfTerm; this.isSingleTerm = subscription.isSingleTerm; this.source = subscription.source; this.offer = subscription.offer; this.stepUp = subscription.stepUp; this.ratePlan = subscription.ratePlan; this.futureRatePlan = subscription.futureRatePlan; this.hasFrozenPrice = subscription.hasFrozenPrice; this.availableActions = subscription.availableActions || []; this.history = subscription.history || []; } /** * Determines if the user subscription is for a digital product * @returns True if productCodes contains only a P1, P2, P3, NS1, or NP1 productCode */ public get isDigitalProduct(): boolean { if (this.productCodes.length > 1) { return false; } return this.productCodes.some(code => DIGITAL_PRODUCT_CODES.includes(code)); } /** * Determines if the user subscription is for a standard product * @returns True if productCodes contains a P1 productCode */ public get isStandardProduct(): boolean { return this.productCodes.includes('P1'); } /** * Determines if the user subscription is for a premium product * @returns True if productCodes contains a P2 productCode */ public get isPremiumProduct(): boolean { return this.productCodes.includes('P2'); } /** * Determines if the user subscription is for a print product * @returns True if productCodes contains only a N6D, N5D or NWE productCode */ public get isPrintProduct(): boolean { if (this.productCodes.length > 1) { return false; } return this.productCodes.some(code => PRINT_PRODUCT_CODES.includes(code)); } /** * Determines if the user subscription is for a bundle product * @returns True if productCodes contains one digital and one print productcodes */ public get isBundleProduct(): boolean { if (this.productCodes.length !== 2) { return false; } return this.productCodes.some(code => PRINT_PRODUCT_CODES.includes(code)) && this.productCodes.some(code => STANDARD_AND_PREMIUM_DIGITAL_PRODUCT_CODES.includes(code)); } /** * Determines if the user subscription is for an ePaper bundle product * @returns True if productCodes contains one ePaper and one print productcodes */ public get isEpaperBundleProduct(): boolean { if (this.productCodes.length !== 2) { return false; } return this.productCodes.some(code => PRINT_PRODUCT_CODES.includes(code)) && this.productCodes.some(code => EPAPER_CODE === code); } /** * Determines if the user subscription is for the ePaper * @returns True if productCodes contains only the EP productCode */ public get isEpaperProduct(): boolean { return this.productCodes.includes(EPAPER_CODE); } /** * Determines if the user subscription is for the FT Edit * @returns True if productCodes contains the P3 productCode */ public get isFTEditProduct(): boolean { return this.productCodes.includes(FT_EDIT_PRODUCT_CODE); } /** * Determines if the user subscription is a print product that is only for the weekend * @returns True if productCodes contains a print productCode of NWE */ public get isWeekendOnlyProduct(): boolean { return this.productCodes.includes('NWE'); } /** * Determines if the user subscription is a print product that is only for the weekdays * @returns True if productCodes contains a print productCode of N5D */ public get isWeekdayOnlyProduct(): boolean { return this.productCodes.includes('N5D'); } /** * Determines if the user subscription is a print product that is for the weekday and weekend * @returns True if productCodes contains a print productCode of N6D */ public get isWeekdayWeekendProduct(): boolean { return this.productCodes.includes('N6D'); } /** * Determines if the user subscription contains a print subscription * @returns True if productCodes contains a print productCode. * Works for bundle and print only */ public get isPrintTypeProduct(): boolean { return this.productCodes.some(code => PRINT_PRODUCT_CODES.includes(code)); } /** * Determines if the user subscription contains a digital subscription * @returns True if productCodes contains a digital productCode. * Works for bundle and digital only */ public get isDigitalTypeProduct(): boolean { return this.productCodes.some(code => DIGITAL_PRODUCT_CODES.includes(code)); } /** * Determines if the user subscription is a home delivery * @returns True if fulfilmentOption is HD */ public get isHomeDelivery(): boolean { if (!this.isPrintTypeProduct) { return false; } return this.fulfilmentOption === 'HD'; } /** * Determines if the user subscription is a paper voucher * @returns True if fulfilmentOption is PV */ public get isPaperVoucher(): boolean { if (!this.isPrintTypeProduct) { return false; } return this.fulfilmentOption === 'PV'; } /** * Determines if the user subscription is for a print product * @returns True if productCodes contains only a N6D, N5D or NWE productCode */ public get isNewsletterOnlyProduct(): boolean { if (this.productCodes.length > 1) { return false; } return this.productCodes.some(code => EMAIL_NEWSLETTER_DIGITAL_PRODUCT_CODES.includes(code)); } /** * Method to retrieve a print product code * @returns print product code of N6D, N5D, NwE or undefined if the product is not print */ public get getPrintProductCode(): string | undefined { return this.productCodes.find(code => PRINT_PRODUCT_CODES.includes(code)); } /** * Method to retrieve a digital product code * @returns digital product code of P1, P2, P3 or undefined if the product is not digital */ public get getDigitalProductCode(): string | undefined { return this.productCodes.find(code => DIGITAL_PRODUCT_CODES.includes(code)); } }