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

100% Statements 62/62
50% Branches 1/2
100% Functions 1/1
100% Lines 62/62

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 631x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 2x 2x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 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';
 
export const datesBusinessDaysTo = new AmaliaFunctionDefault<[number, number]>({
  name: AmaliaFunctionKeys.businessDaysTo,
  category: AmaliaFunctionCategory.DATES,
  nbParamsRequired: 2,
  description: 'Count the number of business days between 2 dates (both dates are included)',
 
  exec: (startDate: number, endDate: number): number =>
    startDate < endDate
      ? Math.abs(dayjs(startDate, 'X').businessDiff(dayjs(endDate, 'X').endOf('day')))
      : Math.abs(dayjs(endDate, 'X').businessDiff(dayjs(startDate, 'X').endOf('day'))),
 
  params: [
    {
      name: 'startDate',
      description:
        'Start of the interval: 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: 'endDate',
      description:
        'End of the interval: 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 5',
      formula: 'businessDaysTo(toDate("2023-05-01"), toDate("2023-05-05"))' as AmaliaFormula,
      result: 5,
    },
    {
      desc: 'Returns 8',
      formula: 'businessDaysTo(toDate("2023-04-23"), toDate("2023-05-03"))' as AmaliaFormula,
      result: 8,
    },
    {
      desc: 'Returns the number of business days between the statement start date and end date.',
      formula: 'businessDaysTo(statementPeriod.startDate, statementPeriod.endDate)' as AmaliaFormula,
    },
    {
      desc: 'Returns the number of business days between Close Date and the statement end date.',
      formula: 'businessDaysTo(opportunity.closeDate, statementPeriod.endDate)' as AmaliaFormula,
    },
  ],
});