All files / utils quarterUtilities.jsx

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 9736x   36x   36x             36x 36410x           36x 1x     36x 4x           36x 67358x 2x   67356x 67356x 2x   67354x 67354x 4x   67350x     36x 1704x 1x   1703x 1x   1702x 1702x 2x   1700x     36x 33679x 33679x 33679x 33679x 25115x   8560x     36x 848x 848x 848x 848x 848x       33671x 33671x         848x                          
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,
};