All files / utils quarterUtilities.js

100% Statements 44/44
100% Branches 14/14
100% Functions 7/7
100% Lines 44/44

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 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 9734x   34x   34x             34x 12246x           34x 1x     34x 4x           34x 21480x 2x   21478x 21478x 2x   21476x 21476x 4x   21472x     34x 788x 1x   787x 1x   786x 786x 2x   784x     34x 10740x 10736x 10736x 10736x 8018x   2718x     34x 390x 390x 390x 390x 390x       10732x 10732x         390x                          
const quarters = ["WINTER", "SPRING", "SUMMER", "FALL"];
 
const shortQuarters = ["W", "S", "M", "F"];
 
const qtrNumToQuarter = {
  1: "WINTER",
  2: "SPRING",
  3: "SUMMER",
  4: "FALL",
};
 
const yyyyqToQyy = (yyyyq) => {
  return `${shortQuarters[parseInt(yyyyq.charAt(4)) - 1]}${yyyyq.substring(
    2,
    4,
  )}`;
};
 
const toFormat = (quarter, year) => {
  return year.toString() + parseInt(quarter).toString();
};
 
const fromFormat = (format) => {
  return `${quarters[parseInt(format.charAt(4)) - 1]} ${format.substring(
    0,
    4,
  )}`;
};
 
const fromNumericYYYYQ = (yyyyqInt) => {
  if (typeof yyyyqInt != "number") {
    throw new Error("param should be a number");
  }
  const yyyyqStr = yyyyqInt.toString();
  if (yyyyqStr.length !== 5) {
    throw new Error("param should be five digits");
  }
  const qStr = yyyyqStr.substring(4, 5);
  if (!(qStr in qtrNumToQuarter)) {
    throw new Error("param should end in 1,2,3 or 4");
  }
  return yyyyqStr;
};
 
const toNumericYYYYQ = (yyyyqStr) => {
  if (typeof yyyyqStr !== "string") {
    throw new Error("param should be a string");
  }
  if (yyyyqStr.length !== 5) {
    throw new Error("param should be five digits");
  }
  const qStr = yyyyqStr.substring(4, 5);
  if (!(qStr in qtrNumToQuarter)) {
    throw new Error("param should end in 1,2,3 or 4");
  }
  return parseInt(yyyyqStr);
};
 
const nextQuarter = (yyyyqInt) => {
  const _yyyyqStr = fromNumericYYYYQ(yyyyqInt); // just for type/format checking
  const qInt = yyyyqInt % 10;
  const yyyyInt = Math.floor(yyyyqInt / 10);
  if (qInt < 4) {
    return yyyyqInt + 1;
  }
  return (yyyyInt + 1) * 10 + 1;
};
 
const quarterRange = (beginYYYYQStr, endYYYYQStr) => {
  let quarterList = [];
  const beginYYYYQInt = toNumericYYYYQ(beginYYYYQStr);
  const endYYYYQInt = toNumericYYYYQ(endYYYYQStr);
  for (
    let yyyyqInt = beginYYYYQInt;
    yyyyqInt <= endYYYYQInt;
    yyyyqInt = nextQuarter(yyyyqInt)
  ) {
    const yyyyqStr = fromNumericYYYYQ(yyyyqInt);
    quarterList.push({
      yyyyq: yyyyqStr,
      qyy: yyyyqToQyy(yyyyqStr),
    });
  }
  return quarterList;
};
 
export {
  fromFormat,
  toFormat,
  yyyyqToQyy,
  fromNumericYYYYQ,
  toNumericYYYYQ,
  nextQuarter,
  quarterRange,
  qtrNumToQuarter,
};