All files / libs/amalia-lang/formula/evaluate/shared/src/functions/dates/months-to index.ts

100% Statements 65/65
100% Branches 1/1
100% Functions 2/2
100% Lines 63/63

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 641x 1x 1x 1x 1x 1x 1x 1x 67x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 68x 1x  
import { AmaliaFunctionCategory, AmaliaFunctionKeys, type AmaliaFormula } from '@amalia/amalia-lang/formula/types';
import { TokenType } from '@amalia/amalia-lang/tokens/types';
import { FormatsEnum } from '@amalia/data-capture/fields/types';
import { dayjs } from '@amalia/ext/dayjs';
 
import { AmaliaFunctionDefault } from '../../AmaliaFunction';
import { type ComputeEngineDayjsInput } from '../dates.types';
 
export const datesMonthsTo = new AmaliaFunctionDefault<[ComputeEngineDayjsInput, ComputeEngineDayjsInput], number>({
  name: AmaliaFunctionKeys.monthsTo,
  category: AmaliaFunctionCategory.DATES,
 
  nbParamsRequired: 2,
  description: 'Return the number of months between two dates (rounded up)',
 
  // https://github.com/moment/moment/issues/3713
  exec: (date1, date2) => Math.ceil(dayjs(date2, 'X').diff(dayjs(date1, 'X'), 'months', true)),
 
  params: [
    {
      name: 'date1',
      description:
        'Date to start counting at: variables, properties, fields, keywords or date with format toDate("YYYY-MM-DD")',
      validTokenTypes: [TokenType.VARIABLE, TokenType.PROPERTY, TokenType.FIELD, TokenType.KEYWORD, TokenType.FUNCTION],
      validTokenValues: {
        [TokenType.FUNCTION]: [AmaliaFunctionKeys.toDate],
      },
      validFormats: [FormatsEnum.date, FormatsEnum['date-time']],
    },
    {
      name: 'date2',
      description:
        'Date to end counting at: variables, properties, fields, keywords or date with format toDate("YYYY-MM-DD")',
      validTokenTypes: [TokenType.VARIABLE, TokenType.PROPERTY, TokenType.FIELD, TokenType.KEYWORD, TokenType.FUNCTION],
      validTokenValues: {
        [TokenType.FUNCTION]: [AmaliaFunctionKeys.toDate],
      },
      validFormats: [FormatsEnum.date, FormatsEnum['date-time']],
    },
  ],
 
  examples: [
    {
      desc: 'Returns 1 (rounded up)',
      formula: 'monthsTo(toDate("2023-05-01"), toDate("2023-05-06"))' as AmaliaFormula,
      result: 1,
    },
    {
      desc: 'Returns 1',
      formula: 'monthsTo(toDate("2023-05-19"), toDate("2023-06-19"))' as AmaliaFormula,
      result: 1,
    },
    {
      desc: 'Returns 8 (rounded up)',
      formula: 'monthsTo(toDate("2023-02-12"), toDate("2023-10-05"))' as AmaliaFormula,
      result: 8,
    },
    {
      desc: 'Returns the number of months between the statement start date and the Close Date rounded up.',
      formula: 'monthsTo(statementPeriod.startDate, opportunity.closeDate)' as AmaliaFormula,
    },
  ],
});