@mx-cartographer/experiences 9.1.4-alpha.mm0 → 9.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +3 -2
- package/dist/{AccountDetailsDrawer-utXjRHSW.mjs → AccountDetailsDrawer-Cq4kiiKD.mjs} +4 -4
- package/dist/{AccountDetailsDrawer-utXjRHSW.mjs.map → AccountDetailsDrawer-Cq4kiiKD.mjs.map} +1 -1
- package/dist/{AccountDetailsHeader-C84CSN2K.mjs → AccountDetailsHeader-BliEZhz7.mjs} +2 -2
- package/dist/{AccountDetailsHeader-C84CSN2K.mjs.map → AccountDetailsHeader-BliEZhz7.mjs.map} +1 -1
- package/dist/DateUtil-CzBmbjmA.mjs +75 -0
- package/dist/{DateUtil-Bl7d7C1W.mjs.map → DateUtil-CzBmbjmA.mjs.map} +1 -1
- package/dist/{EmbeddedCard-CQEnrozC.mjs → EmbeddedCard-DCOQnTz-.mjs} +37 -38
- package/dist/EmbeddedCard-DCOQnTz-.mjs.map +1 -0
- package/dist/{ExportCsvAction-B_8I-Le6.mjs → ExportCsvAction-C-IisDcv.mjs} +2 -2
- package/dist/{ExportCsvAction-B_8I-Le6.mjs.map → ExportCsvAction-C-IisDcv.mjs.map} +1 -1
- package/dist/{ManageIncome-Czs7daKV.mjs → ManageIncome-B_8i71mE.mjs} +7 -7
- package/dist/{ManageIncome-Czs7daKV.mjs.map → ManageIncome-B_8i71mE.mjs.map} +1 -1
- package/dist/{RecurringSettings-CcS5b1xA.mjs → RecurringSettings-hs0YUp83.mjs} +3 -3
- package/dist/{RecurringSettings-CcS5b1xA.mjs.map → RecurringSettings-hs0YUp83.mjs.map} +1 -1
- package/dist/{RecurringTransactionsUtil-CfWviBh1.mjs → RecurringTransactionsUtil-CHWmqvW5.mjs} +2 -2
- package/dist/{RecurringTransactionsUtil-CfWviBh1.mjs.map → RecurringTransactionsUtil-CHWmqvW5.mjs.map} +1 -1
- package/dist/{TransactionDetails-Kmj8GUlD.mjs → TransactionDetails-DT-MQqOB.mjs} +133 -135
- package/dist/TransactionDetails-DT-MQqOB.mjs.map +1 -0
- package/dist/{UserStore-DSnLgiGh.mjs → UserStore-_QQpkbw9.mjs} +7 -5
- package/dist/UserStore-_QQpkbw9.mjs.map +1 -0
- package/dist/accounts/index.es.js +4 -4
- package/dist/budgets/index.es.js +3 -3
- package/dist/cashflow/index.es.js +6 -6
- package/dist/common/index.es.js +1 -1
- package/dist/core/index.es.js +2 -2
- package/dist/core/utils/DateUtil.d.ts +0 -1
- package/dist/debts/index.es.js +1 -1
- package/dist/finstrong/index.es.js +6 -6
- package/dist/insights/index.es.js +2 -2
- package/dist/networth/index.es.js +1 -1
- package/dist/notifications/index.es.js +1 -1
- package/dist/recurringtransactions/index.es.js +5 -5
- package/dist/spending/index.es.js +28 -28
- package/dist/spending/index.es.js.map +1 -1
- package/dist/transactions/index.es.js +25 -25
- package/dist/transactions/index.es.js.map +1 -1
- package/dist/trends/index.es.js +3 -3
- package/package.json +1 -1
- package/dist/DateUtil-Bl7d7C1W.mjs +0 -76
- package/dist/EmbeddedCard-CQEnrozC.mjs.map +0 -1
- package/dist/TransactionDetails-Kmj8GUlD.mjs.map +0 -1
- package/dist/UserStore-DSnLgiGh.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RecurringTransactionsUtil-CfWviBh1.mjs","sources":["../src/core/types/RepeatingTransaction.ts","../src/core/utils/RecurringTransactionsUtil.ts"],"sourcesContent":["import { Account } from './Account'\nimport { Transaction, TransactionType } from './Transaction'\n\nexport enum Frequency {\n Unknown = 0,\n EveryWeek = 1,\n EveryOtherWeek = 2,\n EveryMonth = 3,\n EveryOtherMonth = 4,\n EveryQuarter = 5,\n EveryOtherQuarter = 6,\n EveryYear = 7,\n TwiceAMonth = 8,\n}\n\nexport enum RecurrenceStatus {\n Paid = 0,\n Missed = 1,\n Upcoming = 2,\n}\n\nexport enum RecurrenceType {\n Expense = 0,\n Income = 1,\n}\n\nexport enum RepeatingType {\n Unknown = 0,\n Subscription = 1,\n Bill = 2,\n Income = 3,\n Transfer = 4,\n}\n\nexport interface RepeatingTransaction {\n // API fields\n guid: string\n account_guid: string\n created_by: number\n member_guid: string\n merchant_guid: string\n user_guid: string\n description: string\n amount: number\n predicted_occurs_on: string\n transaction_type: TransactionType\n recurrence_type: Frequency\n recurrence_day: number\n repeating_transaction_type: RepeatingType\n second_recurrence_day?: number\n\n // UI fields\n account?: Account\n transactions: Transaction[]\n}\n\nexport interface Recurrence {\n accountGuid: string\n amount: number\n categoryGuid: string\n expectedDate: Date\n frequency: Frequency\n institutionGuid: string\n institutionName: string\n merchantGuid: string\n name: string\n occurredOnDate?: Date\n recurrenceDay: number\n repeatingTransactionGuid: string\n secondRecurrenceDay?: number\n status: RecurrenceStatus\n type: RecurrenceType\n transaction?: Transaction\n}\n","import { addDays } from 'date-fns/addDays'\nimport { addMonths } from 'date-fns/addMonths'\nimport { addQuarters } from 'date-fns/addQuarters'\nimport { addWeeks } from 'date-fns/addWeeks'\nimport { addYears } from 'date-fns/addYears'\nimport { differenceInDays } from 'date-fns/differenceInDays'\nimport { formatISO } from 'date-fns/formatISO'\nimport { fromUnixTime } from 'date-fns/fromUnixTime'\nimport { getUnixTime } from 'date-fns/getUnixTime'\nimport { isAfter } from 'date-fns/isAfter'\nimport { isBefore } from 'date-fns/isBefore'\nimport { isSameDay } from 'date-fns/isSameDay'\nimport { lastDayOfMonth } from 'date-fns/lastDayOfMonth'\nimport { nextDay } from 'date-fns/nextDay'\nimport { parseISO } from 'date-fns/parseISO'\nimport { setDate } from 'date-fns/setDate'\nimport { setDay } from 'date-fns/setDay'\nimport { setDayOfYear } from 'date-fns/setDayOfYear'\nimport { startOfToday } from 'date-fns/startOfToday'\nimport { subDays } from 'date-fns/subDays'\nimport { subMonths } from 'date-fns/subMonths'\nimport { subQuarters } from 'date-fns/subQuarters'\nimport { subWeeks } from 'date-fns/subWeeks'\nimport { subYears } from 'date-fns/subYears'\n\nimport type { Day } from 'date-fns/types'\n\nimport { DATE_FORMATS_INTL, formatDate } from '../constants'\nimport {\n type Account,\n type DateRange,\n type Recurrence,\n type RecurringCopy,\n type RepeatingTransaction,\n type Transaction,\n RecurrenceType,\n RecurrenceStatus,\n RepeatingType,\n Frequency,\n} from '../types'\n\nimport {\n getNextBiMonthlyDate,\n getNextBiQuarterlyDate,\n getNextBiWeeklyDate,\n getNextMonthlyDate,\n getNextQuarterlyDate,\n getNextTwiceMonthlyDate,\n getNextWeeklyDate,\n getNextYearlyDate,\n getTwiceMonthlyDates,\n} from './DateUtil'\nimport { formatOrdinal } from './NumberFormatting'\nimport { buildDynamicCopy } from './Localization'\n\nexport type GroupedRecurrence = {\n recurrences: Recurrence[]\n id: string\n date: Date\n}\n\nexport const buildInstitutionName = (account?: Account) => {\n if (!account) return ''\n\n let name = account.user_name || account.feed_name || ''\n if (account.account_number) {\n name = `${name} *${account.account_number}`\n }\n return name\n}\n\nconst buildRepeatingRecurrences = (\n repeatingTransaction: RepeatingTransaction,\n dateRange: DateRange,\n) => {\n const recurrences: Recurrence[] = []\n\n const isYearly = repeatingTransaction.recurrence_type === Frequency.EveryYear\n\n const pastTransaction = repeatingTransaction.transactions.find(\n (t) => t.repeating_transaction_guid === repeatingTransaction.guid,\n )\n\n /*\n Since past transactions for yearly recurrences can be outside the 90 day data range, we need to display them\n even if there is no past transaction to match to. This will display it without a category, but that's the\n tradeoff until we impove our transactions service to return past transactions for all recurring transactions.\n */\n if (!isYearly && !pastTransaction) return []\n\n const occursOn = parseISO(repeatingTransaction.predicted_occurs_on)\n const baseRecurrence: Recurrence = {\n accountGuid: repeatingTransaction.account?.guid || '',\n amount: repeatingTransaction.amount,\n categoryGuid: pastTransaction?.category_guid || '',\n expectedDate: occursOn,\n frequency: repeatingTransaction.recurrence_type,\n institutionGuid: repeatingTransaction.account?.institution_guid || '',\n institutionName: buildInstitutionName(repeatingTransaction.account),\n merchantGuid: repeatingTransaction.merchant_guid,\n name: repeatingTransaction.description,\n recurrenceDay: repeatingTransaction.recurrence_day,\n repeatingTransactionGuid: repeatingTransaction.guid,\n secondRecurrenceDay: repeatingTransaction.second_recurrence_day,\n status: RecurrenceStatus.Upcoming,\n type:\n repeatingTransaction.repeating_transaction_type === RepeatingType.Income\n ? RecurrenceType.Income\n : RecurrenceType.Expense,\n transaction: undefined,\n }\n\n const startDate = dateRange.start\n const endDate = dateRange.end\n\n switch (repeatingTransaction.recurrence_type) {\n case Frequency.EveryWeek:\n recurrences.push(...getWeeklyRecurrences(baseRecurrence, startDate, endDate))\n break\n case Frequency.EveryOtherWeek:\n recurrences.push(...getBiWeeklyRecurrences(baseRecurrence, startDate, endDate))\n break\n case Frequency.TwiceAMonth:\n recurrences.push(...getTwiceMonthlyRecurrences(baseRecurrence, startDate, endDate))\n break\n case Frequency.EveryMonth:\n recurrences.push(...getMonthlyRecurrences(baseRecurrence, startDate, endDate))\n break\n case Frequency.EveryOtherMonth:\n recurrences.push(...getBiMonthlyRecurrences(baseRecurrence, startDate, endDate))\n break\n case Frequency.EveryQuarter:\n recurrences.push(...getQuarterlyRecurrences(baseRecurrence, startDate, endDate))\n break\n case Frequency.EveryOtherQuarter:\n recurrences.push(...getBiQuarterlyRecurrences(baseRecurrence, startDate, endDate))\n break\n case Frequency.EveryYear:\n recurrences.push(...getYearlyRecurrences(baseRecurrence, startDate, endDate))\n break\n }\n\n // Track which transactions have already been matched to avoid double-counting\n const matchedTransactionGuids = new Set<string>()\n\n for (const recurrence of recurrences) {\n // First, try to find a manually linked transaction (any date)\n const linkedTransactions = repeatingTransaction.transactions.filter(\n (t) =>\n t.repeating_transaction_guid === repeatingTransaction.guid &&\n !matchedTransactionGuids.has(t.guid),\n )\n\n const transaction =\n linkedTransactions.find(\n (t) =>\n t.date > getUnixTime(subDays(recurrence.expectedDate, 5)) &&\n t.date < getUnixTime(addDays(recurrence.expectedDate, 5)),\n ) ||\n (isBefore(recurrence.expectedDate, startOfToday())\n ? linkedTransactions.reduce<Transaction | undefined>((closest, t) => {\n const dist = Math.abs(t.date - getUnixTime(recurrence.expectedDate))\n const closestDist = closest\n ? Math.abs(closest.date - getUnixTime(recurrence.expectedDate))\n : Infinity\n return dist < closestDist ? t : closest\n }, undefined)\n : undefined)\n\n if (transaction) {\n matchedTransactionGuids.add(transaction.guid)\n recurrence.transaction = transaction\n recurrence.status = RecurrenceStatus.Paid\n recurrence.occurredOnDate = fromUnixTime(transaction.date)\n } else if (isBefore(recurrence.expectedDate, subDays(startOfToday(), 3))) {\n recurrence.status = RecurrenceStatus.Missed\n }\n }\n\n return recurrences\n}\n\nconst getWeeklyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const activities: Recurrence[] = []\n\n // Add recurrence for each week for the current month and next month\n let nextDate = nextDay(startDate, baseRecurrence.recurrenceDay as Day)\n while (isBefore(nextDate, endDate)) {\n activities.push({ ...baseRecurrence, expectedDate: nextDate })\n nextDate = nextDay(nextDate, baseRecurrence.recurrenceDay as Day)\n }\n\n return activities\n}\n\nconst getBiWeeklyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const recurrences: Recurrence[] = []\n\n // Determine the first occurrence of the bi-weekly recurrence within the date range\n let nextDate = baseRecurrence.expectedDate\n if (isBefore(nextDate, startDate)) {\n while (isBefore(nextDate, startDate)) {\n nextDate = addWeeks(nextDate, 2)\n }\n } else {\n while (isAfter(nextDate, startDate) || isSameDay(nextDate, startDate)) {\n nextDate = subWeeks(nextDate, 2)\n }\n nextDate = addWeeks(nextDate, 2)\n }\n\n while (isBefore(nextDate, endDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate: nextDate })\n nextDate = addDays(nextDate, 14)\n }\n\n return recurrences\n}\n\nconst getTwiceMonthlyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const recurrences: Recurrence[] = []\n\n let firstOccurrence = setDate(startDate, baseRecurrence.recurrenceDay)\n\n while (isBefore(firstOccurrence, endDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate: firstOccurrence })\n firstOccurrence = addMonths(firstOccurrence, 1)\n }\n\n let secondOccurrence =\n baseRecurrence.secondRecurrenceDay && baseRecurrence.secondRecurrenceDay < 28\n ? setDate(startDate, baseRecurrence.secondRecurrenceDay)\n : lastDayOfMonth(startDate)\n\n while (isBefore(secondOccurrence, endDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate: secondOccurrence })\n secondOccurrence = addMonths(secondOccurrence, 1)\n }\n\n return recurrences\n}\n\nconst getMonthlyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const recurrences: Recurrence[] = []\n\n let expectedDate = setDate(startDate, baseRecurrence.recurrenceDay)\n\n // Add current month's repeating transaction recurrence\n recurrences.push({ ...baseRecurrence, expectedDate })\n\n expectedDate = addMonths(expectedDate, 1)\n while (isBefore(expectedDate, endDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate })\n expectedDate = addMonths(expectedDate, 1)\n }\n\n return recurrences\n}\n\nconst getBiMonthlyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const recurrences: Recurrence[] = []\n\n const occursOn = baseRecurrence.expectedDate\n let nextDate = isBefore(occursOn, endDate) ? occursOn : subMonths(occursOn, 2)\n while (isBefore(nextDate, endDate)) {\n if (isAfter(nextDate, startDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate: nextDate })\n }\n nextDate = addMonths(nextDate, 2)\n }\n\n return recurrences\n}\n\nconst getQuarterlyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const recurrences: Recurrence[] = []\n\n const occursOn = baseRecurrence.expectedDate\n let nextDate = isBefore(occursOn, endDate) ? occursOn : subQuarters(occursOn, 1)\n while (isBefore(nextDate, endDate)) {\n if (isAfter(nextDate, startDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate: nextDate })\n }\n nextDate = addQuarters(nextDate, 1)\n }\n\n return recurrences\n}\n\nconst getBiQuarterlyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const recurrences: Recurrence[] = []\n\n const occursOn = baseRecurrence.expectedDate\n let nextDate = isBefore(occursOn, endDate) ? occursOn : subQuarters(occursOn, 2)\n while (isBefore(nextDate, endDate)) {\n if (isAfter(nextDate, startDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate: nextDate })\n }\n nextDate = addQuarters(nextDate, 2)\n }\n\n return recurrences\n}\n\nconst getYearlyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const recurrences: Recurrence[] = []\n\n const occursOn = baseRecurrence.expectedDate\n let nextDate = isBefore(occursOn, endDate) ? occursOn : subYears(occursOn, 1)\n while (isBefore(nextDate, endDate)) {\n if (isAfter(nextDate, startDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate: nextDate })\n }\n nextDate = addYears(nextDate, 1)\n }\n\n return recurrences\n}\n\nexport const buildAllRecurrences = (\n repeatingTransactions: RepeatingTransaction[],\n dateRange: DateRange,\n) => {\n const recurrences: Recurrence[] = []\n\n for (const repeatingTransaction of repeatingTransactions) {\n const activity = buildRepeatingRecurrences(repeatingTransaction, dateRange)\n recurrences.push(...activity)\n }\n\n return recurrences.sort(\n (a, b) =>\n getUnixTime(a.occurredOnDate || a.expectedDate) -\n getUnixTime(b.occurredOnDate || b.expectedDate),\n )\n}\n\nexport const augmentRepeatingTransactions = (\n accounts: Account[],\n repeatingTransactions: RepeatingTransaction[],\n transactions: Transaction[],\n) => {\n const augmentedRepeatingTransactions: RepeatingTransaction[] = []\n\n for (const repeatingTransaction of repeatingTransactions) {\n const relatedTransactions = transactions.filter(\n (t) => t.repeating_transaction_guid === repeatingTransaction.guid,\n )\n\n if (transactions.length > 0) {\n augmentedRepeatingTransactions.push({\n ...repeatingTransaction,\n account: accounts.find((account) => account.guid === repeatingTransaction.account_guid),\n transactions: relatedTransactions,\n })\n }\n }\n\n return augmentedRepeatingTransactions\n}\n\nexport const groupRecurrencesByDate = (recurrences: Recurrence[]): GroupedRecurrence[] => {\n return recurrences.reduce((groupedRecurrences: GroupedRecurrence[], recurrence) => {\n const dateString = formatISO(recurrence.expectedDate, { representation: 'date' })\n const existingGroup = groupedRecurrences.find(\n (group) => group.date.toString() === recurrence.expectedDate.toString(),\n )\n\n if (existingGroup) {\n existingGroup.recurrences.push(recurrence)\n } else {\n groupedRecurrences.push({\n date: recurrence.expectedDate,\n id: `date-${dateString}`,\n recurrences: [recurrence],\n })\n }\n\n return groupedRecurrences\n }, [])\n}\n\nexport const getFrequencyLabel = (\n copy: RecurringCopy,\n repeatingTransaction: RepeatingTransaction,\n showOrdinal: boolean,\n) => {\n const nextWeekday = nextDay(startOfToday(), repeatingTransaction.recurrence_day as Day)\n const nextAnnualDate = setDayOfYear(startOfToday(), repeatingTransaction.recurrence_day)\n const firstDateOrdinal = formatOrdinal(repeatingTransaction.recurrence_day)\n const secondDateOrdinal = repeatingTransaction.second_recurrence_day\n ? formatOrdinal(repeatingTransaction.second_recurrence_day)\n : ''\n\n let frequencyLabel = showOrdinal\n ? buildDynamicCopy(copy.monthly_ordinal, firstDateOrdinal)\n : copy.monthly\n\n switch (repeatingTransaction.recurrence_type) {\n case Frequency.EveryQuarter:\n frequencyLabel = showOrdinal\n ? buildDynamicCopy(copy.quarterly_ordinal, firstDateOrdinal)\n : copy.quarterly\n break\n case Frequency.EveryWeek:\n frequencyLabel = showOrdinal\n ? buildDynamicCopy(\n copy.weekly_ordinal,\n formatDate(nextWeekday, DATE_FORMATS_INTL.DAY_OF_WEEK),\n )\n : copy.weekly\n break\n case Frequency.EveryYear:\n frequencyLabel = showOrdinal\n ? buildDynamicCopy(\n copy.anually_ordinal,\n formatDate(nextAnnualDate, DATE_FORMATS_INTL.MONTH_DAY),\n )\n : copy.anually\n break\n case Frequency.EveryOtherWeek:\n frequencyLabel = showOrdinal\n ? buildDynamicCopy(\n copy.every_other_week_ordinal,\n formatDate(nextWeekday, DATE_FORMATS_INTL.DAY_OF_WEEK),\n )\n : copy.every_other_week\n break\n case Frequency.EveryOtherMonth:\n frequencyLabel = showOrdinal\n ? buildDynamicCopy(copy.every_other_month_ordinal, firstDateOrdinal)\n : copy.every_other_month\n break\n case Frequency.EveryOtherQuarter:\n frequencyLabel = showOrdinal\n ? buildDynamicCopy(copy.every_other_quarter_ordinal, firstDateOrdinal)\n : copy.every_other_quarter\n break\n case Frequency.TwiceAMonth:\n frequencyLabel = showOrdinal\n ? buildDynamicCopy(copy.twice_a_month_ordinal, firstDateOrdinal, secondDateOrdinal)\n : copy.twice_a_month\n break\n }\n\n return frequencyLabel as string\n}\n\nexport const getNextPaymentDate = (\n frequency: Frequency,\n date: Date,\n recurrenceDay?: number,\n secondRecurrenceDay?: number,\n) => {\n let baseDate = date\n\n // Apply user selected recurrenceDay based on frequency type\n if (recurrenceDay !== undefined) {\n if (frequency === Frequency.EveryWeek || frequency === Frequency.EveryOtherWeek) {\n baseDate = setDay(date, recurrenceDay)\n } else if (frequency === Frequency.EveryYear) {\n baseDate = setDayOfYear(date, recurrenceDay)\n } else {\n baseDate = setDate(date, recurrenceDay)\n }\n }\n\n let nextDate = baseDate\n\n switch (frequency) {\n case Frequency.EveryWeek:\n nextDate = getNextWeeklyDate(baseDate)\n break\n case Frequency.EveryOtherWeek:\n nextDate = getNextBiWeeklyDate(baseDate)\n break\n case Frequency.TwiceAMonth:\n nextDate = getNextTwiceMonthlyDate(\n recurrenceDay ?? baseDate.getDate(),\n secondRecurrenceDay ?? 28,\n )\n break\n case Frequency.EveryMonth:\n nextDate = getNextMonthlyDate(baseDate)\n break\n case Frequency.EveryOtherMonth:\n nextDate = getNextBiMonthlyDate(baseDate)\n break\n case Frequency.EveryQuarter:\n nextDate = getNextQuarterlyDate(baseDate)\n break\n case Frequency.EveryOtherQuarter:\n nextDate = getNextBiQuarterlyDate(baseDate)\n break\n case Frequency.EveryYear:\n nextDate = getNextYearlyDate(baseDate)\n break\n }\n\n return nextDate\n}\n\nexport const getNextUpcomingDate = (\n recurringTransaction: RepeatingTransaction,\n recurrences: Recurrence[],\n): Date => {\n const nextUpcoming = recurrences.find(\n (r) =>\n r.repeatingTransactionGuid === recurringTransaction.guid &&\n r.status === RecurrenceStatus.Upcoming,\n )\n if (nextUpcoming) return nextUpcoming.expectedDate\n\n const isPaidNearDate = (date: Date) =>\n recurrences.some(\n (r) =>\n r.repeatingTransactionGuid === recurringTransaction.guid &&\n r.status === RecurrenceStatus.Paid &&\n Math.abs(differenceInDays(r.expectedDate, date)) <= 5,\n )\n\n const frequencyAdvancers: Partial<Record<Frequency, (d: Date) => Date>> = {\n [Frequency.EveryWeek]: (d) => addWeeks(d, 1),\n [Frequency.EveryOtherWeek]: (d) => addWeeks(d, 2),\n [Frequency.TwiceAMonth]: (d) => {\n const candidates = getTwiceMonthlyDates(\n recurringTransaction.recurrence_day,\n recurringTransaction.second_recurrence_day ?? 28,\n )\n return candidates.find((c) => isAfter(c, d)) ?? candidates[candidates.length - 1]\n },\n [Frequency.EveryMonth]: (d) => addMonths(d, 1),\n [Frequency.EveryOtherMonth]: (d) => addMonths(d, 2),\n [Frequency.EveryQuarter]: (d) => addMonths(d, 3),\n [Frequency.EveryOtherQuarter]: (d) => addMonths(d, 6),\n [Frequency.EveryYear]: (d) => addYears(d, 1),\n }\n\n const baseNext = getNextPaymentDate(\n recurringTransaction.recurrence_type,\n parseISO(recurringTransaction.predicted_occurs_on),\n recurringTransaction.recurrence_day,\n recurringTransaction.second_recurrence_day,\n )\n\n if (!isPaidNearDate(baseNext)) return baseNext\n\n const advance = frequencyAdvancers[recurringTransaction.recurrence_type]\n return advance ? advance(baseNext) : baseNext\n}\n"],"names":["Frequency","RecurrenceStatus","RecurrenceType","RepeatingType","buildInstitutionName","account","name","buildRepeatingRecurrences","repeatingTransaction","dateRange","recurrences","isYearly","pastTransaction","t","occursOn","parseISO","baseRecurrence","startDate","endDate","getWeeklyRecurrences","getBiWeeklyRecurrences","getTwiceMonthlyRecurrences","getMonthlyRecurrences","getBiMonthlyRecurrences","getQuarterlyRecurrences","getBiQuarterlyRecurrences","getYearlyRecurrences","matchedTransactionGuids","recurrence","linkedTransactions","transaction","getUnixTime","subDays","addDays","isBefore","startOfToday","closest","dist","closestDist","fromUnixTime","activities","nextDate","nextDay","addWeeks","isAfter","isSameDay","subWeeks","firstOccurrence","setDate","addMonths","secondOccurrence","lastDayOfMonth","expectedDate","subMonths","subQuarters","addQuarters","subYears","addYears","buildAllRecurrences","repeatingTransactions","activity","a","b","augmentRepeatingTransactions","accounts","transactions","augmentedRepeatingTransactions","relatedTransactions","groupRecurrencesByDate","groupedRecurrences","dateString","formatISO","existingGroup","group","getFrequencyLabel","copy","showOrdinal","nextWeekday","nextAnnualDate","setDayOfYear","firstDateOrdinal","formatOrdinal","secondDateOrdinal","frequencyLabel","buildDynamicCopy","formatDate","DATE_FORMATS_INTL","getNextPaymentDate","frequency","date","recurrenceDay","secondRecurrenceDay","baseDate","setDay","getNextWeeklyDate","getNextBiWeeklyDate","getNextTwiceMonthlyDate","getNextMonthlyDate","getNextBiMonthlyDate","getNextQuarterlyDate","getNextBiQuarterlyDate","getNextYearlyDate","getNextUpcomingDate","recurringTransaction","nextUpcoming","r","isPaidNearDate","differenceInDays","frequencyAdvancers","d","candidates","getTwiceMonthlyDates","c","baseNext","advance"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RecurringTransactionsUtil-CHWmqvW5.mjs","sources":["../src/core/types/RepeatingTransaction.ts","../src/core/utils/RecurringTransactionsUtil.ts"],"sourcesContent":["import { Account } from './Account'\nimport { Transaction, TransactionType } from './Transaction'\n\nexport enum Frequency {\n Unknown = 0,\n EveryWeek = 1,\n EveryOtherWeek = 2,\n EveryMonth = 3,\n EveryOtherMonth = 4,\n EveryQuarter = 5,\n EveryOtherQuarter = 6,\n EveryYear = 7,\n TwiceAMonth = 8,\n}\n\nexport enum RecurrenceStatus {\n Paid = 0,\n Missed = 1,\n Upcoming = 2,\n}\n\nexport enum RecurrenceType {\n Expense = 0,\n Income = 1,\n}\n\nexport enum RepeatingType {\n Unknown = 0,\n Subscription = 1,\n Bill = 2,\n Income = 3,\n Transfer = 4,\n}\n\nexport interface RepeatingTransaction {\n // API fields\n guid: string\n account_guid: string\n created_by: number\n member_guid: string\n merchant_guid: string\n user_guid: string\n description: string\n amount: number\n predicted_occurs_on: string\n transaction_type: TransactionType\n recurrence_type: Frequency\n recurrence_day: number\n repeating_transaction_type: RepeatingType\n second_recurrence_day?: number\n\n // UI fields\n account?: Account\n transactions: Transaction[]\n}\n\nexport interface Recurrence {\n accountGuid: string\n amount: number\n categoryGuid: string\n expectedDate: Date\n frequency: Frequency\n institutionGuid: string\n institutionName: string\n merchantGuid: string\n name: string\n occurredOnDate?: Date\n recurrenceDay: number\n repeatingTransactionGuid: string\n secondRecurrenceDay?: number\n status: RecurrenceStatus\n type: RecurrenceType\n transaction?: Transaction\n}\n","import { addDays } from 'date-fns/addDays'\nimport { addMonths } from 'date-fns/addMonths'\nimport { addQuarters } from 'date-fns/addQuarters'\nimport { addWeeks } from 'date-fns/addWeeks'\nimport { addYears } from 'date-fns/addYears'\nimport { differenceInDays } from 'date-fns/differenceInDays'\nimport { formatISO } from 'date-fns/formatISO'\nimport { fromUnixTime } from 'date-fns/fromUnixTime'\nimport { getUnixTime } from 'date-fns/getUnixTime'\nimport { isAfter } from 'date-fns/isAfter'\nimport { isBefore } from 'date-fns/isBefore'\nimport { isSameDay } from 'date-fns/isSameDay'\nimport { lastDayOfMonth } from 'date-fns/lastDayOfMonth'\nimport { nextDay } from 'date-fns/nextDay'\nimport { parseISO } from 'date-fns/parseISO'\nimport { setDate } from 'date-fns/setDate'\nimport { setDay } from 'date-fns/setDay'\nimport { setDayOfYear } from 'date-fns/setDayOfYear'\nimport { startOfToday } from 'date-fns/startOfToday'\nimport { subDays } from 'date-fns/subDays'\nimport { subMonths } from 'date-fns/subMonths'\nimport { subQuarters } from 'date-fns/subQuarters'\nimport { subWeeks } from 'date-fns/subWeeks'\nimport { subYears } from 'date-fns/subYears'\n\nimport type { Day } from 'date-fns/types'\n\nimport { DATE_FORMATS_INTL, formatDate } from '../constants'\nimport {\n type Account,\n type DateRange,\n type Recurrence,\n type RecurringCopy,\n type RepeatingTransaction,\n type Transaction,\n RecurrenceType,\n RecurrenceStatus,\n RepeatingType,\n Frequency,\n} from '../types'\n\nimport {\n getNextBiMonthlyDate,\n getNextBiQuarterlyDate,\n getNextBiWeeklyDate,\n getNextMonthlyDate,\n getNextQuarterlyDate,\n getNextTwiceMonthlyDate,\n getNextWeeklyDate,\n getNextYearlyDate,\n getTwiceMonthlyDates,\n} from './DateUtil'\nimport { formatOrdinal } from './NumberFormatting'\nimport { buildDynamicCopy } from './Localization'\n\nexport type GroupedRecurrence = {\n recurrences: Recurrence[]\n id: string\n date: Date\n}\n\nexport const buildInstitutionName = (account?: Account) => {\n if (!account) return ''\n\n let name = account.user_name || account.feed_name || ''\n if (account.account_number) {\n name = `${name} *${account.account_number}`\n }\n return name\n}\n\nconst buildRepeatingRecurrences = (\n repeatingTransaction: RepeatingTransaction,\n dateRange: DateRange,\n) => {\n const recurrences: Recurrence[] = []\n\n const isYearly = repeatingTransaction.recurrence_type === Frequency.EveryYear\n\n const pastTransaction = repeatingTransaction.transactions.find(\n (t) => t.repeating_transaction_guid === repeatingTransaction.guid,\n )\n\n /*\n Since past transactions for yearly recurrences can be outside the 90 day data range, we need to display them\n even if there is no past transaction to match to. This will display it without a category, but that's the\n tradeoff until we impove our transactions service to return past transactions for all recurring transactions.\n */\n if (!isYearly && !pastTransaction) return []\n\n const occursOn = parseISO(repeatingTransaction.predicted_occurs_on)\n const baseRecurrence: Recurrence = {\n accountGuid: repeatingTransaction.account?.guid || '',\n amount: repeatingTransaction.amount,\n categoryGuid: pastTransaction?.category_guid || '',\n expectedDate: occursOn,\n frequency: repeatingTransaction.recurrence_type,\n institutionGuid: repeatingTransaction.account?.institution_guid || '',\n institutionName: buildInstitutionName(repeatingTransaction.account),\n merchantGuid: repeatingTransaction.merchant_guid,\n name: repeatingTransaction.description,\n recurrenceDay: repeatingTransaction.recurrence_day,\n repeatingTransactionGuid: repeatingTransaction.guid,\n secondRecurrenceDay: repeatingTransaction.second_recurrence_day,\n status: RecurrenceStatus.Upcoming,\n type:\n repeatingTransaction.repeating_transaction_type === RepeatingType.Income\n ? RecurrenceType.Income\n : RecurrenceType.Expense,\n transaction: undefined,\n }\n\n const startDate = dateRange.start\n const endDate = dateRange.end\n\n switch (repeatingTransaction.recurrence_type) {\n case Frequency.EveryWeek:\n recurrences.push(...getWeeklyRecurrences(baseRecurrence, startDate, endDate))\n break\n case Frequency.EveryOtherWeek:\n recurrences.push(...getBiWeeklyRecurrences(baseRecurrence, startDate, endDate))\n break\n case Frequency.TwiceAMonth:\n recurrences.push(...getTwiceMonthlyRecurrences(baseRecurrence, startDate, endDate))\n break\n case Frequency.EveryMonth:\n recurrences.push(...getMonthlyRecurrences(baseRecurrence, startDate, endDate))\n break\n case Frequency.EveryOtherMonth:\n recurrences.push(...getBiMonthlyRecurrences(baseRecurrence, startDate, endDate))\n break\n case Frequency.EveryQuarter:\n recurrences.push(...getQuarterlyRecurrences(baseRecurrence, startDate, endDate))\n break\n case Frequency.EveryOtherQuarter:\n recurrences.push(...getBiQuarterlyRecurrences(baseRecurrence, startDate, endDate))\n break\n case Frequency.EveryYear:\n recurrences.push(...getYearlyRecurrences(baseRecurrence, startDate, endDate))\n break\n }\n\n // Track which transactions have already been matched to avoid double-counting\n const matchedTransactionGuids = new Set<string>()\n\n for (const recurrence of recurrences) {\n // First, try to find a manually linked transaction (any date)\n const linkedTransactions = repeatingTransaction.transactions.filter(\n (t) =>\n t.repeating_transaction_guid === repeatingTransaction.guid &&\n !matchedTransactionGuids.has(t.guid),\n )\n\n const transaction =\n linkedTransactions.find(\n (t) =>\n t.date > getUnixTime(subDays(recurrence.expectedDate, 5)) &&\n t.date < getUnixTime(addDays(recurrence.expectedDate, 5)),\n ) ||\n (isBefore(recurrence.expectedDate, startOfToday())\n ? linkedTransactions.reduce<Transaction | undefined>((closest, t) => {\n const dist = Math.abs(t.date - getUnixTime(recurrence.expectedDate))\n const closestDist = closest\n ? Math.abs(closest.date - getUnixTime(recurrence.expectedDate))\n : Infinity\n return dist < closestDist ? t : closest\n }, undefined)\n : undefined)\n\n if (transaction) {\n matchedTransactionGuids.add(transaction.guid)\n recurrence.transaction = transaction\n recurrence.status = RecurrenceStatus.Paid\n recurrence.occurredOnDate = fromUnixTime(transaction.date)\n } else if (isBefore(recurrence.expectedDate, subDays(startOfToday(), 3))) {\n recurrence.status = RecurrenceStatus.Missed\n }\n }\n\n return recurrences\n}\n\nconst getWeeklyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const activities: Recurrence[] = []\n\n // Add recurrence for each week for the current month and next month\n let nextDate = nextDay(startDate, baseRecurrence.recurrenceDay as Day)\n while (isBefore(nextDate, endDate)) {\n activities.push({ ...baseRecurrence, expectedDate: nextDate })\n nextDate = nextDay(nextDate, baseRecurrence.recurrenceDay as Day)\n }\n\n return activities\n}\n\nconst getBiWeeklyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const recurrences: Recurrence[] = []\n\n // Determine the first occurrence of the bi-weekly recurrence within the date range\n let nextDate = baseRecurrence.expectedDate\n if (isBefore(nextDate, startDate)) {\n while (isBefore(nextDate, startDate)) {\n nextDate = addWeeks(nextDate, 2)\n }\n } else {\n while (isAfter(nextDate, startDate) || isSameDay(nextDate, startDate)) {\n nextDate = subWeeks(nextDate, 2)\n }\n nextDate = addWeeks(nextDate, 2)\n }\n\n while (isBefore(nextDate, endDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate: nextDate })\n nextDate = addDays(nextDate, 14)\n }\n\n return recurrences\n}\n\nconst getTwiceMonthlyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const recurrences: Recurrence[] = []\n\n let firstOccurrence = setDate(startDate, baseRecurrence.recurrenceDay)\n\n while (isBefore(firstOccurrence, endDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate: firstOccurrence })\n firstOccurrence = addMonths(firstOccurrence, 1)\n }\n\n let secondOccurrence =\n baseRecurrence.secondRecurrenceDay && baseRecurrence.secondRecurrenceDay < 28\n ? setDate(startDate, baseRecurrence.secondRecurrenceDay)\n : lastDayOfMonth(startDate)\n\n while (isBefore(secondOccurrence, endDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate: secondOccurrence })\n secondOccurrence = addMonths(secondOccurrence, 1)\n }\n\n return recurrences\n}\n\nconst getMonthlyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const recurrences: Recurrence[] = []\n\n let expectedDate = setDate(startDate, baseRecurrence.recurrenceDay)\n\n // Add current month's repeating transaction recurrence\n recurrences.push({ ...baseRecurrence, expectedDate })\n\n expectedDate = addMonths(expectedDate, 1)\n while (isBefore(expectedDate, endDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate })\n expectedDate = addMonths(expectedDate, 1)\n }\n\n return recurrences\n}\n\nconst getBiMonthlyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const recurrences: Recurrence[] = []\n\n const occursOn = baseRecurrence.expectedDate\n let nextDate = isBefore(occursOn, endDate) ? occursOn : subMonths(occursOn, 2)\n while (isBefore(nextDate, endDate)) {\n if (isAfter(nextDate, startDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate: nextDate })\n }\n nextDate = addMonths(nextDate, 2)\n }\n\n return recurrences\n}\n\nconst getQuarterlyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const recurrences: Recurrence[] = []\n\n const occursOn = baseRecurrence.expectedDate\n let nextDate = isBefore(occursOn, endDate) ? occursOn : subQuarters(occursOn, 1)\n while (isBefore(nextDate, endDate)) {\n if (isAfter(nextDate, startDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate: nextDate })\n }\n nextDate = addQuarters(nextDate, 1)\n }\n\n return recurrences\n}\n\nconst getBiQuarterlyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const recurrences: Recurrence[] = []\n\n const occursOn = baseRecurrence.expectedDate\n let nextDate = isBefore(occursOn, endDate) ? occursOn : subQuarters(occursOn, 2)\n while (isBefore(nextDate, endDate)) {\n if (isAfter(nextDate, startDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate: nextDate })\n }\n nextDate = addQuarters(nextDate, 2)\n }\n\n return recurrences\n}\n\nconst getYearlyRecurrences = (baseRecurrence: Recurrence, startDate: Date, endDate: Date) => {\n const recurrences: Recurrence[] = []\n\n const occursOn = baseRecurrence.expectedDate\n let nextDate = isBefore(occursOn, endDate) ? occursOn : subYears(occursOn, 1)\n while (isBefore(nextDate, endDate)) {\n if (isAfter(nextDate, startDate)) {\n recurrences.push({ ...baseRecurrence, expectedDate: nextDate })\n }\n nextDate = addYears(nextDate, 1)\n }\n\n return recurrences\n}\n\nexport const buildAllRecurrences = (\n repeatingTransactions: RepeatingTransaction[],\n dateRange: DateRange,\n) => {\n const recurrences: Recurrence[] = []\n\n for (const repeatingTransaction of repeatingTransactions) {\n const activity = buildRepeatingRecurrences(repeatingTransaction, dateRange)\n recurrences.push(...activity)\n }\n\n return recurrences.sort(\n (a, b) =>\n getUnixTime(a.occurredOnDate || a.expectedDate) -\n getUnixTime(b.occurredOnDate || b.expectedDate),\n )\n}\n\nexport const augmentRepeatingTransactions = (\n accounts: Account[],\n repeatingTransactions: RepeatingTransaction[],\n transactions: Transaction[],\n) => {\n const augmentedRepeatingTransactions: RepeatingTransaction[] = []\n\n for (const repeatingTransaction of repeatingTransactions) {\n const relatedTransactions = transactions.filter(\n (t) => t.repeating_transaction_guid === repeatingTransaction.guid,\n )\n\n if (transactions.length > 0) {\n augmentedRepeatingTransactions.push({\n ...repeatingTransaction,\n account: accounts.find((account) => account.guid === repeatingTransaction.account_guid),\n transactions: relatedTransactions,\n })\n }\n }\n\n return augmentedRepeatingTransactions\n}\n\nexport const groupRecurrencesByDate = (recurrences: Recurrence[]): GroupedRecurrence[] => {\n return recurrences.reduce((groupedRecurrences: GroupedRecurrence[], recurrence) => {\n const dateString = formatISO(recurrence.expectedDate, { representation: 'date' })\n const existingGroup = groupedRecurrences.find(\n (group) => group.date.toString() === recurrence.expectedDate.toString(),\n )\n\n if (existingGroup) {\n existingGroup.recurrences.push(recurrence)\n } else {\n groupedRecurrences.push({\n date: recurrence.expectedDate,\n id: `date-${dateString}`,\n recurrences: [recurrence],\n })\n }\n\n return groupedRecurrences\n }, [])\n}\n\nexport const getFrequencyLabel = (\n copy: RecurringCopy,\n repeatingTransaction: RepeatingTransaction,\n showOrdinal: boolean,\n) => {\n const nextWeekday = nextDay(startOfToday(), repeatingTransaction.recurrence_day as Day)\n const nextAnnualDate = setDayOfYear(startOfToday(), repeatingTransaction.recurrence_day)\n const firstDateOrdinal = formatOrdinal(repeatingTransaction.recurrence_day)\n const secondDateOrdinal = repeatingTransaction.second_recurrence_day\n ? formatOrdinal(repeatingTransaction.second_recurrence_day)\n : ''\n\n let frequencyLabel = showOrdinal\n ? buildDynamicCopy(copy.monthly_ordinal, firstDateOrdinal)\n : copy.monthly\n\n switch (repeatingTransaction.recurrence_type) {\n case Frequency.EveryQuarter:\n frequencyLabel = showOrdinal\n ? buildDynamicCopy(copy.quarterly_ordinal, firstDateOrdinal)\n : copy.quarterly\n break\n case Frequency.EveryWeek:\n frequencyLabel = showOrdinal\n ? buildDynamicCopy(\n copy.weekly_ordinal,\n formatDate(nextWeekday, DATE_FORMATS_INTL.DAY_OF_WEEK),\n )\n : copy.weekly\n break\n case Frequency.EveryYear:\n frequencyLabel = showOrdinal\n ? buildDynamicCopy(\n copy.anually_ordinal,\n formatDate(nextAnnualDate, DATE_FORMATS_INTL.MONTH_DAY),\n )\n : copy.anually\n break\n case Frequency.EveryOtherWeek:\n frequencyLabel = showOrdinal\n ? buildDynamicCopy(\n copy.every_other_week_ordinal,\n formatDate(nextWeekday, DATE_FORMATS_INTL.DAY_OF_WEEK),\n )\n : copy.every_other_week\n break\n case Frequency.EveryOtherMonth:\n frequencyLabel = showOrdinal\n ? buildDynamicCopy(copy.every_other_month_ordinal, firstDateOrdinal)\n : copy.every_other_month\n break\n case Frequency.EveryOtherQuarter:\n frequencyLabel = showOrdinal\n ? buildDynamicCopy(copy.every_other_quarter_ordinal, firstDateOrdinal)\n : copy.every_other_quarter\n break\n case Frequency.TwiceAMonth:\n frequencyLabel = showOrdinal\n ? buildDynamicCopy(copy.twice_a_month_ordinal, firstDateOrdinal, secondDateOrdinal)\n : copy.twice_a_month\n break\n }\n\n return frequencyLabel as string\n}\n\nexport const getNextPaymentDate = (\n frequency: Frequency,\n date: Date,\n recurrenceDay?: number,\n secondRecurrenceDay?: number,\n) => {\n let baseDate = date\n\n // Apply user selected recurrenceDay based on frequency type\n if (recurrenceDay !== undefined) {\n if (frequency === Frequency.EveryWeek || frequency === Frequency.EveryOtherWeek) {\n baseDate = setDay(date, recurrenceDay)\n } else if (frequency === Frequency.EveryYear) {\n baseDate = setDayOfYear(date, recurrenceDay)\n } else {\n baseDate = setDate(date, recurrenceDay)\n }\n }\n\n let nextDate = baseDate\n\n switch (frequency) {\n case Frequency.EveryWeek:\n nextDate = getNextWeeklyDate(baseDate)\n break\n case Frequency.EveryOtherWeek:\n nextDate = getNextBiWeeklyDate(baseDate)\n break\n case Frequency.TwiceAMonth:\n nextDate = getNextTwiceMonthlyDate(\n recurrenceDay ?? baseDate.getDate(),\n secondRecurrenceDay ?? 28,\n )\n break\n case Frequency.EveryMonth:\n nextDate = getNextMonthlyDate(baseDate)\n break\n case Frequency.EveryOtherMonth:\n nextDate = getNextBiMonthlyDate(baseDate)\n break\n case Frequency.EveryQuarter:\n nextDate = getNextQuarterlyDate(baseDate)\n break\n case Frequency.EveryOtherQuarter:\n nextDate = getNextBiQuarterlyDate(baseDate)\n break\n case Frequency.EveryYear:\n nextDate = getNextYearlyDate(baseDate)\n break\n }\n\n return nextDate\n}\n\nexport const getNextUpcomingDate = (\n recurringTransaction: RepeatingTransaction,\n recurrences: Recurrence[],\n): Date => {\n const nextUpcoming = recurrences.find(\n (r) =>\n r.repeatingTransactionGuid === recurringTransaction.guid &&\n r.status === RecurrenceStatus.Upcoming,\n )\n if (nextUpcoming) return nextUpcoming.expectedDate\n\n const isPaidNearDate = (date: Date) =>\n recurrences.some(\n (r) =>\n r.repeatingTransactionGuid === recurringTransaction.guid &&\n r.status === RecurrenceStatus.Paid &&\n Math.abs(differenceInDays(r.expectedDate, date)) <= 5,\n )\n\n const frequencyAdvancers: Partial<Record<Frequency, (d: Date) => Date>> = {\n [Frequency.EveryWeek]: (d) => addWeeks(d, 1),\n [Frequency.EveryOtherWeek]: (d) => addWeeks(d, 2),\n [Frequency.TwiceAMonth]: (d) => {\n const candidates = getTwiceMonthlyDates(\n recurringTransaction.recurrence_day,\n recurringTransaction.second_recurrence_day ?? 28,\n )\n return candidates.find((c) => isAfter(c, d)) ?? candidates[candidates.length - 1]\n },\n [Frequency.EveryMonth]: (d) => addMonths(d, 1),\n [Frequency.EveryOtherMonth]: (d) => addMonths(d, 2),\n [Frequency.EveryQuarter]: (d) => addMonths(d, 3),\n [Frequency.EveryOtherQuarter]: (d) => addMonths(d, 6),\n [Frequency.EveryYear]: (d) => addYears(d, 1),\n }\n\n const baseNext = getNextPaymentDate(\n recurringTransaction.recurrence_type,\n parseISO(recurringTransaction.predicted_occurs_on),\n recurringTransaction.recurrence_day,\n recurringTransaction.second_recurrence_day,\n )\n\n if (!isPaidNearDate(baseNext)) return baseNext\n\n const advance = frequencyAdvancers[recurringTransaction.recurrence_type]\n return advance ? advance(baseNext) : baseNext\n}\n"],"names":["Frequency","RecurrenceStatus","RecurrenceType","RepeatingType","buildInstitutionName","account","name","buildRepeatingRecurrences","repeatingTransaction","dateRange","recurrences","isYearly","pastTransaction","t","occursOn","parseISO","baseRecurrence","startDate","endDate","getWeeklyRecurrences","getBiWeeklyRecurrences","getTwiceMonthlyRecurrences","getMonthlyRecurrences","getBiMonthlyRecurrences","getQuarterlyRecurrences","getBiQuarterlyRecurrences","getYearlyRecurrences","matchedTransactionGuids","recurrence","linkedTransactions","transaction","getUnixTime","subDays","addDays","isBefore","startOfToday","closest","dist","closestDist","fromUnixTime","activities","nextDate","nextDay","addWeeks","isAfter","isSameDay","subWeeks","firstOccurrence","setDate","addMonths","secondOccurrence","lastDayOfMonth","expectedDate","subMonths","subQuarters","addQuarters","subYears","addYears","buildAllRecurrences","repeatingTransactions","activity","a","b","augmentRepeatingTransactions","accounts","transactions","augmentedRepeatingTransactions","relatedTransactions","groupRecurrencesByDate","groupedRecurrences","dateString","formatISO","existingGroup","group","getFrequencyLabel","copy","showOrdinal","nextWeekday","nextAnnualDate","setDayOfYear","firstDateOrdinal","formatOrdinal","secondDateOrdinal","frequencyLabel","buildDynamicCopy","formatDate","DATE_FORMATS_INTL","getNextPaymentDate","frequency","date","recurrenceDay","secondRecurrenceDay","baseDate","setDay","getNextWeeklyDate","getNextBiWeeklyDate","getNextTwiceMonthlyDate","getNextMonthlyDate","getNextBiMonthlyDate","getNextQuarterlyDate","getNextBiQuarterlyDate","getNextYearlyDate","getNextUpcomingDate","recurringTransaction","nextUpcoming","r","isPaidNearDate","differenceInDays","frequencyAdvancers","d","candidates","getTwiceMonthlyDates","c","baseNext","advance"],"mappings":"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"}
|