Weeks Within two dates:

PHOTO EMBED

Fri Feb 23 2024 14:25:12 GMT+0000 (Coordinated Universal Time)

Saved by @mdfaizi

let CheckDateLieWithin2Dates = (checkdate, from, to) => {
    /* Instead of comparing the dates directly, compare the getTime() value of the date. The getTime() function returns the number of milliseconds since Jan 1, 1970 as an integer-- should be trivial to determine if one integer falls between two other integers.
     */
    var checkdate = new Date(checkdate);
    var from = new Date(from);
    var to = new Date(to);

    if (
      checkdate.getTime() <= to.getTime() &&
      checkdate.getTime() >= from.getTime()
    ) {
      //log.debug("date lies inside");
      return true;
    } else {
      //log.debug("date lies outside");
      return false;
    }
  };

  let startAndEndDateOfWeek = (wkDate) => {
    var curr = new Date(wkDate); // get current date
    log.debug("curr.getDate()", curr.getDate());
    log.debug("curr.getDay()", curr.getDay());
    var first = curr.getDate() - (curr.getDay() - 1); //to make monday first day -1

    /**first can be - negative value also it means last month */
    log.debug(first);
    //setDate() method sets the day of the month for a specified date according to local time.In simple adds /subtract the days to the date.
    //setDate() can handle negative values also and also more than 31 value also.
    var firstday = new Date(curr.setDate(first)); //
    log.debug("first date", firstday);
    var firstDay_no = firstday.getDate();
    log.debug("firstDay_no", firstDay_no);
    var last = firstDay_no + 6; // last day is the first day no + 6
    log.debug("last", last);
    var lastday = new Date(curr.setDate(last)); //

    log.debug("last date", lastday);

    return {
      start: firstday,
      end: lastday,
    };
  };

  let findAllWeeksBetween2dates = (startDate, EndDate) => {
    var startDate = new Date(startDate);
    var EndDate = new Date(EndDate);

    var weeks = {};

    var startDate_of_1st_week = startDate;

    var i = 0;
    while (true) {
      weeks[i] = [startDate_of_1st_week];

      var endDateof1stWeek = startAndEndDateOfWeek(startDate_of_1st_week);
      var endDateof1stWeek = endDateof1stWeek.end;

      if (endDateof1stWeek >= EndDate) {
        weeks[i].push(EndDate);
        break;
      }

      weeks[i].push(endDateof1stWeek);
      var date = new Date(endDateof1stWeek);

      // add a day
      var secondWeekStartDate = date.setDate(date.getDate() + 1);
      var secondWeekStartDate = new Date(secondWeekStartDate);

      startDate_of_1st_week = secondWeekStartDate;

      i += 1;
    }

    log.debug("weeks before formating=", weeks);
    //format all dates in weeks object to MM/DD/YYYY using format module.
    for (var key in weeks) {
      for (var i = 0; i < weeks[key].length; i++) {
        var date = new Date(weeks[key][i]);
        var formattedDate = format.format({
          value: date,
          type: format.Type.DATE,
        });
        weeks[key][i] = formattedDate;
      }
    }

    log.debug("weeks after formating=", weeks);

    return weeks;
  };

  /**CONSOLIDATED FORMATING OF JSON OBJECT WEEKLY  ADDED 04/05/2023*/
  let WeeklyConsolidatedJson = (sampleData,period_starting_date,period_ending_date) => {
    var start_end_dates_of_all_week = findAllWeeksBetween2dates(
      period_starting_date,
      period_ending_date
    );

    log.debug("start_end_dates_of_all_week", start_end_dates_of_all_week);
    var newJson = {};
    const names = [...new Set(Object.keys(sampleData))]; //...new Set( ) is used for removing duplicate names from the resultant array.

    for (i in names) {
      newJson[names[i]] = {};
    }
    log.debug(" newJson[n] = {};", newJson);

    for (weekNo in start_end_dates_of_all_week) {
      var start_end_dates_of_week = start_end_dates_of_all_week[weekNo];
      var start_date_of_week = start_end_dates_of_week[0];
      var end_date_of_week = start_end_dates_of_week[1];

      for (var empName in sampleData) {
        if (sampleData.hasOwnProperty(empName)) {
          var val = sampleData[empName];
          log.debug("empName", empName);
          log.debug("val", val);
          //iterate val

          //iterate val

          var json_wk_ST = {};
          json_wk_ST[end_date_of_week + "-ST"] = {
            billeddate_formatted: end_date_of_week.toString(),
            employee: "",
            TimesheetType: "Straight Time",
            quantity: 0,
            rate: 0,
            amount: 0,
          };

          var json_wk_OT = {};
          json_wk_OT[end_date_of_week + "-OT"] = {
            billeddate_formatted: end_date_of_week.toString(),
            employee: "",
            TimesheetType: "Over Time",
            quantity: 0,
            rate: 0,
            amount: 0,
          };

          var json_wk_DT = {};
          json_wk_DT[end_date_of_week + "-DT"] = {
            billeddate_formatted: end_date_of_week.toString(),
            employee: "",
            TimesheetType: "Double Time",
            quantity: 0,
            rate: 0,
            amount: 0,
          };

          

          for (var key1 in val) {
            if (val.hasOwnProperty(key1)) {
              var val1 = val[key1];
              log.debug("key1", key1);
              log.debug("val1", val1);

              var billeddate_formatted = val1.billeddate_formatted;
              var employee = val1.employee;
              var TimesheetType = val1.TimesheetType;
              var quantity = val1.quantity;
              var rate = val1.rate;
              var amount = val1.amount;

              if (
                CheckDateLieWithin2Dates(
                  billeddate_formatted,
                  start_date_of_week,
                  end_date_of_week
                ) &&
                TimesheetType == "1"
              ) {
                log.debug("inside ST");

                //employee name and rate also need to be added in the json object.And would be same for each timesheet Type.
                json_wk_ST[end_date_of_week + "-ST"].employee = employee;
                json_wk_ST[end_date_of_week + "-ST"].rate = rate;

                json_wk_ST[end_date_of_week + "-ST"].amount =
                  Number(json_wk_ST[end_date_of_week + "-ST"].amount) +
                  Number(amount);
                json_wk_ST[end_date_of_week + "-ST"].quantity =
                  Number(json_wk_ST[end_date_of_week + "-ST"].quantity) +
                  Number(quantity);
              }

              if (
                CheckDateLieWithin2Dates(
                  billeddate_formatted,
                  start_date_of_week,
                  end_date_of_week
                ) &&
                TimesheetType == "2"
              ) {
                log.debug("inside OT");
                json_wk_OT[end_date_of_week + "-OT"].employee = employee;
                json_wk_OT[end_date_of_week + "-OT"].rate = rate;
                json_wk_OT[end_date_of_week + "-OT"].amount =
                  Number(json_wk_OT[end_date_of_week + "-OT"].amount) +
                  Number(amount);
                json_wk_OT[end_date_of_week + "-OT"].quantity =
                  Number(json_wk_OT[end_date_of_week + "-OT"].quantity) +
                  Number(quantity);
              }

              if (
                CheckDateLieWithin2Dates(
                  billeddate_formatted,
                  start_date_of_week,
                  end_date_of_week
                ) &&
                TimesheetType == "3"
              ) {
                log.debug("inside DT");
                json_wk_DT[end_date_of_week + "-DT"].employee = employee;
                json_wk_DT[end_date_of_week + "-DT"].rate = rate;
                json_wk_DT[end_date_of_week + "-DT"].amount =
                  Number(json_wk_DT[end_date_of_week + "-DT"].amount) +
                  Number(amount);
                json_wk_DT[end_date_of_week + "-DT"].quantity =
                  Number(json_wk_DT[end_date_of_week + "-DT"].quantity) +
                  Number(quantity);
              }

             
            }
          }

          //check if amount and quantity is 0 then dont add it to newJson
          if (
            Number(json_wk_ST[end_date_of_week + "-ST"].amount) != 0 &&
            Number(json_wk_ST[end_date_of_week + "-ST"].quantity) != 0
          ) {
            newJson[empName][end_date_of_week + "-ST"] =
              json_wk_ST[end_date_of_week + "-ST"];
          }

          if (
            Number(json_wk_OT[end_date_of_week + "-OT"].amount) != 0 &&
            Number(json_wk_OT[end_date_of_week + "-OT"].quantity) != 0
          ) {
            newJson[empName][end_date_of_week + "-OT"] =
              json_wk_OT[end_date_of_week + "-OT"];
          }

          if (
            Number(json_wk_DT[end_date_of_week + "-DT"].amount) != 0 &&
            Number(json_wk_DT[end_date_of_week + "-DT"].quantity) != 0
          ) {
            newJson[empName][end_date_of_week + "-DT"] =
              json_wk_DT[end_date_of_week + "-DT"];
          }

          
        }
      }
    }

    log.debug("newJson=", newJson);

    return newJson;
  };
content_copyCOPY