Skip to content
Snippets Groups Projects
reportRanges.ts 3.62 KiB
Newer Older
  • Learn to ignore specific revisions
  • import * as monthUtils from 'loot-core/src/shared/months';
    
    import { type SyncedPrefs } from 'loot-core/types/prefs';
    
    
    export function validateStart(
      earliest: string,
      start: string,
      end: string,
      interval?: string,
    
      firstDayOfWeekIdx?: SyncedPrefs['firstDayOfWeekIdx'],
    
    ): [string, string] {
    
      let addDays;
      let dateStart;
      switch (interval) {
        case 'Monthly':
          dateStart = start + '-01';
          addDays = 180;
          break;
        case 'Yearly':
          dateStart = start + '-01-01';
          addDays = 1095;
          break;
        case 'Daily':
          dateStart = start;
          addDays = 6;
          break;
        default:
          dateStart = start;
          addDays = 180;
          break;
      }
    
      if (end < start) {
        end = monthUtils.addDays(dateStart, addDays);
      }
      return boundedRange(
        earliest,
        dateStart,
        interval ? end : monthUtils.monthFromDate(end),
        interval,
    
      );
    }
    
    export function validateEnd(
      earliest: string,
      start: string,
      end: string,
      interval?: string,
    
      firstDayOfWeekIdx?: SyncedPrefs['firstDayOfWeekIdx'],
    
    ): [string, string] {
    
      let subDays;
      let dateEnd;
      switch (interval) {
        case 'Monthly':
    
    Neil's avatar
    Neil committed
          dateEnd = monthUtils.getMonthEnd(end + '-01');
    
          subDays = 180;
          break;
        case 'Yearly':
          dateEnd = end + '-12-31';
          subDays = 1095;
          break;
        case 'Daily':
          dateEnd = end;
          subDays = 6;
          break;
        default:
          dateEnd = end;
          subDays = 180;
          break;
      }
    
      if (start > end) {
        start = monthUtils.subDays(dateEnd, subDays);
      }
      return boundedRange(
        earliest,
        interval ? start : monthUtils.monthFromDate(start),
        dateEnd,
        interval,
    
      );
    }
    
    export function validateRange(earliest: string, start: string, end: string) {
      const latest = monthUtils.currentDay();
      if (end > latest) {
        end = latest;
      }
      if (start < earliest) {
        start = earliest;
      }
      return [start, end];
    }
    
    function boundedRange(
      earliest: string,
      start: string,
      end: string,
      interval?: string,
    
      firstDayOfWeekIdx?: SyncedPrefs['firstDayOfWeekIdx'],
    
    ): [string, string] {
    
      let latest;
      switch (interval) {
    
        case 'Daily':
          latest = monthUtils.currentDay();
          break;
        case 'Weekly':
          latest = monthUtils.currentWeek(firstDayOfWeekIdx);
          break;
    
        case 'Monthly':
    
    Neil's avatar
    Neil committed
          latest = monthUtils.getMonthEnd(monthUtils.currentDay());
    
          break;
        case 'Yearly':
          latest = monthUtils.currentDay();
          break;
        default:
    
          latest = monthUtils.currentMonth();
    
          break;
      }
    
      if (end > latest) {
        end = latest;
      }
      if (start < earliest) {
        start = earliest;
      }
      return [start, end];
    }
    
    
    export function getSpecificRange(
      offset: number,
      addNumber: number | null,
      type?: string,
    
      firstDayOfWeekIdx?: SyncedPrefs['firstDayOfWeekIdx'],
    
      const currentDay = monthUtils.currentDay();
    
    Neil's avatar
    Neil committed
      const currentWeek = monthUtils.currentWeek(firstDayOfWeekIdx);
    
    
      let dateStart = monthUtils.subMonths(currentDay, offset) + '-01';
      let dateEnd = monthUtils.getMonthEnd(
    
    Neil's avatar
    Neil committed
        monthUtils.addMonths(dateStart, addNumber === null ? offset : addNumber) +
          '-01',
      );
    
      if (type === 'Week') {
    
    Neil's avatar
    Neil committed
        dateStart = monthUtils.subWeeks(currentWeek, offset);
    
        dateEnd = monthUtils.getWeekEnd(
          monthUtils.addWeeks(dateStart, addNumber === null ? offset : addNumber),
          firstDayOfWeekIdx,
        );
      }
    
    
      return [dateStart, dateEnd];
    }
    
    export function getFullRange(start: string) {
      const end = monthUtils.currentMonth();
      return [start, end];
    }
    
    export function getLatestRange(offset: number) {
      const end = monthUtils.currentMonth();
      const start = monthUtils.subMonths(end, offset);
      return [start, end];
    }