import { isAfter, isBefore, parseISO } from 'date-fns'; import { SubscriptionDetails } from '../types/subscription'; import { SubscriptionHistoryModel } from '../models/subscription'; const getPrice = ({ term = 'P1M', price }: SubscriptionDetails): number => { switch (term) { case 'P2Y': return price.value / 24; case 'P1Y': case 'P52W': case 'P364D': return price.value / 12; case 'P91D': case 'P13W': return price.value / 3; case 'P3M': return price.value / 3; case 'P1M': case 'P4W': case 'P28D': default: return price.value; } }; const isSameProduct = (first: Array = [], second: Array = []): boolean => { if (first.length !== second.length) { return false; } const firstSet = new Set(first); return second.every(val => firstSet.has(val)); }; export const ensureDiscount = ({ subscriptionBefore, subscriptionAfter }: SubscriptionHistoryModel): boolean => { if (!subscriptionBefore || !subscriptionAfter) { return false; } const currentPrice = getPrice(subscriptionBefore); const nextPrice = getPrice(subscriptionAfter); return currentPrice > nextPrice && isSameProduct(subscriptionBefore.products, subscriptionAfter.products); }; export const findFutureEvent = (history: Array = [], eventType: string): SubscriptionHistoryModel | undefined => { return history.find(item => { return item.eventType === eventType && isBefore(new Date(), parseISO(item.eventEffectiveDate)); }); }; export const isEventDateAfter = (subscriptionBefore: SubscriptionHistoryModel, subscriptionAfter: SubscriptionHistoryModel): boolean => { if (!subscriptionBefore || !subscriptionAfter) { return false; } return isAfter(parseISO(subscriptionBefore.eventDate), parseISO(subscriptionAfter.eventDate)); }; export const findEvent = (history: Array = [], eventType: string): SubscriptionHistoryModel | undefined => { return history.find(item => item.eventType === eventType); };