Exemple #1
0
// http://www.codeproject.com/KB/dotnet/HolidayCalculator.aspx
//==============================================================================================
Date GetDateByMonthWeekWeekday(int year, int month, int week, int weekday) {
	Date workDate(year, month, 1); // Calculate first

	while (DayOfWeek(workDate) != weekday) {
		workDate+= 1;
	}
	
	Date result;
	if (week == 1) {
		result = workDate;
	}
	else {
		int addDays = (week * 7) - 7;
		int day = workDate.day + addDays;
		if (day > LastDayOfMonth(workDate).day) {
			day = day - 7;
		}
		result = Date(workDate.year, workDate.month, day);
	}
	
	return result;
}
Exemple #2
0
void CDailyOpsAB::OnChangeDate() 
{
//
//  Cycle through the entries for this operator
//
  LVITEM  LVI;
  CString s;
  CTime  time = CTime::GetCurrentTime();
  long   thisDate;
  long   startDate;
  long   year, month, day;
  char   lastName[DRIVERS_LASTNAME_LENGTH + 1];
  char   firstName[DRIVERS_FIRSTNAME_LENGTH + 1];
  char   badgeNumber[DRIVERS_BADGENUMBER_LENGTH + 1];
  int    iItem = 0;
  int    rcode2;

//
//  Clear the control
//
  pListCtrlLIST->DeleteAllItems();
//
//  Get the date
//
//  Date
//
  COleVariant v;

  v = pDTPickerDATE->GetYear();
  year = v.lVal;
  v = pDTPickerDATE->GetMonth();
  month = v.lVal;
  v = pDTPickerDATE->GetDay();
  day = v.lVal;

//
//  Database verify 11-Jan-07
//
  thisDate = year * 10000 + month * 100 + day;
  startDate = (year - 1) * 10000 + month * 100 + day;
  DAILYOPSKey1.recordTypeFlag = DAILYOPS_FLAG_ABSENCE;
  DAILYOPSKey1.pertainsToDate = startDate;
  DAILYOPSKey1.pertainsToTime = NO_TIME;
  DAILYOPSKey1.recordFlags = 0;
  rcode2 = btrieve(B_GETGREATER, TMS_DAILYOPS, &DAILYOPS, &DAILYOPSKey1, 1);
  while(rcode2 == 0 &&
        (DAILYOPS.recordTypeFlag & DAILYOPS_FLAG_ABSENCE) &&
         DAILYOPS.pertainsToDate <= thisDate)
  {
    if(thisDate >= DAILYOPS.pertainsToDate &&
          thisDate <= DAILYOPS.DOPS.Absence.untilDate &&
          (DAILYOPS.recordFlags & DAILYOPS_FLAG_ABSENCEREGISTER))
    {
      if(!ANegatedRecord(DAILYOPS.recordID, 1))
      {
//
//  Date/time of entry
//
        LVI.mask = LVIF_TEXT | LVIF_PARAM;
        LVI.iItem = iItem;
        LVI.iSubItem = 0;
        sprintf(tempString, "%s", ctime(&DAILYOPS.entryDateAndTime));
        LVI.pszText = tempString;
        LVI.lParam = DAILYOPS.recordID;
        LVI.iItem = pListCtrlLIST->InsertItem(&LVI);
//
//  Operator
//
        LVI.mask = LVIF_TEXT;
        LVI.iItem = iItem;
        LVI.iSubItem = 1;
        DRIVERSKey0.recordID = DAILYOPS.DRIVERSrecordID;
        rcode2 = btrieve(B_GETEQUAL, TMS_DRIVERS, &DRIVERS, &DRIVERSKey0, 0);
        if(rcode2 != 0)
        {
          strcpy(tempString, "Driver not found");
        }
        else
        {
          strncpy(badgeNumber, DRIVERS.badgeNumber, DRIVERS_BADGENUMBER_LENGTH);
          trim(badgeNumber, DRIVERS_BADGENUMBER_LENGTH);
          strncpy(lastName, DRIVERS.lastName, DRIVERS_LASTNAME_LENGTH);
          trim(lastName, DRIVERS_LASTNAME_LENGTH);
          strncpy(firstName, DRIVERS.firstName, DRIVERS_FIRSTNAME_LENGTH);
          trim(firstName, DRIVERS_FIRSTNAME_LENGTH);
          strcpy(tempString, badgeNumber);
          strcat(tempString, " - ");
          strcat(tempString, lastName);
          strcat(tempString, ", ");
          strcat(tempString, firstName);
        }
        LVI.pszText = tempString;
        LVI.iItem = pListCtrlLIST->SetItem(&LVI);
//
//  Reason
//
        LVI.mask = LVIF_TEXT;
        LVI.iItem = iItem;
        LVI.iSubItem = 2;
        if(DAILYOPS.DOPS.Absence.reasonIndex == NO_RECORD)
        {
          strcpy(tempString, "Assignment cleared manually");
        }
        else
        {
          strcpy(tempString, m_AbsenceReasons[DAILYOPS.DOPS.Absence.reasonIndex].szText);
        }
        LVI.pszText = tempString;
        LVI.iItem = pListCtrlLIST->SetItem(&LVI);
//
//  From Date and time
//
        GetYMD(DAILYOPS.pertainsToDate, &year, &month, &day);
        LVI.mask = LVIF_TEXT;
        LVI.iItem = iItem;
        LVI.iSubItem = 3;
        sprintf(tempString, "%02ld-%s-%04ld at %s",
              day, szMonth[month - 1], year, Tchar(DAILYOPS.pertainsToTime));
        LVI.pszText = tempString;
        LVI.iItem = pListCtrlLIST->SetItem(&LVI);
//
//  To Date and time
//
        GetYMD(DAILYOPS.DOPS.Absence.untilDate, &year, &month, &day);
        LVI.mask = LVIF_TEXT;
        LVI.iItem = iItem;
        LVI.iSubItem = 4;
        sprintf(tempString, "%02ld-%s-%04ld at %s",
              day, szMonth[month - 1], year, Tchar(DAILYOPS.DOPS.Absence.untilTime));
        LVI.pszText = tempString;
        LVI.iItem = pListCtrlLIST->SetItem(&LVI);
//
//  Set up the next row
//
        iItem++;
      }
    }
    rcode2 = btrieve(B_GETNEXT, TMS_DAILYOPS, &DAILYOPS, &DAILYOPSKey1, 1);
  }
//
//  Display operators with an off day?
//
  if(m_bAutomatic || !pButtonSHOWOFF->GetCheck())
  {
    return;
  }
  GetYMD(thisDate, &year, &month, &day);
//
//  Get the list of drivers and assume they're not working
//
  long DRIVERSrecordIDs[500];
  int  numDrivers = 0;

  rcode2 = btrieve(B_GETFIRST, TMS_DRIVERS, &DRIVERS, &DRIVERSKey2, 2);
  while(rcode2 == 0)
  {
    if(ConsideringThisDriverType(DRIVERS.DRIVERTYPESrecordID))
    {
      DRIVERSrecordIDs[numDrivers] = DRIVERS.recordID;
      numDrivers++;
    }
    rcode2 = btrieve(B_GETNEXT, TMS_DRIVERS, &DRIVERS, &DRIVERSKey2, 2);
  }
//
//  Eliminate those who are working sometime today
//
  CTime workDate(year, month, day, 0, 0, 0);
  int nI, nJ;
  int indexToRoster[7] = {6, 0, 1, 2, 3, 4, 5};
  int today = indexToRoster[workDate.GetDayOfWeek() - 1];

  ROSTERKey1.DIVISIONSrecordID = m_DailyOpsROSTERDivisionInEffect;
  ROSTERKey1.rosterNumber = NO_RECORD;
  rcode2 = btrieve(B_GETGREATER, TMS_ROSTER, &ROSTER, &ROSTERKey1, 1);
  while(rcode2 == 0 &&
        ROSTER.DIVISIONSrecordID == m_DailyOpsROSTERDivisionInEffect)
  {
    if(ROSTER.DRIVERSrecordID != NO_RECORD && ROSTER.WEEK[m_RosterWeek].RUNSrecordIDs[today] != NO_RECORD)
    {
      for(nI = 0; nI < numDrivers; nI++)
      {
        if(DRIVERSrecordIDs[nI] != NO_RECORD)
        {
          if(ROSTER.DRIVERSrecordID == DRIVERSrecordIDs[nI])
          {
            DRIVERSrecordIDs[nI] = NO_RECORD;
            break;
          }
        }
      }
    }
    rcode2 = btrieve(B_GETNEXT, TMS_ROSTER, &ROSTER, &ROSTERKey1, 1);
  }
//
//  Eliminate those that are already marked as absent
//
  int numItems = pListCtrlLIST->GetItemCount();

  for(nI = 0; nI < numItems; nI++)
  {
//
//  Determine the operator
//
    DAILYOPSKey0.recordID = pListCtrlLIST->GetItemData(nI);
    rcode2 = btrieve(B_GETEQUAL,TMS_DAILYOPS, &DAILYOPS, &DAILYOPSKey0, 0);
    if(rcode2 == 0)
    {
      for(nJ = 0; nJ < numDrivers; nJ++)
      {
        if(DRIVERSrecordIDs[nJ] != NO_RECORD)
        {
          if(DRIVERSrecordIDs[nJ] == DAILYOPS.DRIVERSrecordID)
          {
            DRIVERSrecordIDs[nJ] = NO_RECORD;
            break;
          }
        }
      }
    }
  }
//
//  Spit out those that remain on the list
//
  for(nI = 0; nI < numDrivers; nI++)
  {
    if(DRIVERSrecordIDs[nI] == NO_RECORD)
    {
      continue;
    }
//
//  Date/time of entry
//
    LVI.mask = LVIF_TEXT | LVIF_PARAM;
    LVI.iItem = iItem;
    LVI.iSubItem = 0;
    LVI.pszText = "";
    LVI.lParam = NO_RECORD;
    LVI.iItem = pListCtrlLIST->InsertItem(&LVI);
//
//  Operator
//
    LVI.mask = LVIF_TEXT;
    LVI.iItem = iItem;
    LVI.iSubItem = 1;
    DRIVERSKey0.recordID = DRIVERSrecordIDs[nI];
    rcode2 = btrieve(B_GETEQUAL, TMS_DRIVERS, &DRIVERS, &DRIVERSKey0, 0);
    if(rcode2 != 0)
    {
      strcpy(tempString, "Driver not found");
    }
    else
    {
      strncpy(badgeNumber, DRIVERS.badgeNumber, DRIVERS_BADGENUMBER_LENGTH);
      trim(badgeNumber, DRIVERS_BADGENUMBER_LENGTH);
      strncpy(lastName, DRIVERS.lastName, DRIVERS_LASTNAME_LENGTH);
      trim(lastName, DRIVERS_LASTNAME_LENGTH);
      strncpy(firstName, DRIVERS.firstName, DRIVERS_FIRSTNAME_LENGTH);
      trim(firstName, DRIVERS_FIRSTNAME_LENGTH);
      strcpy(tempString, badgeNumber);
      strcat(tempString, " - ");
      strcat(tempString, lastName);
      strcat(tempString, ", ");
      strcat(tempString, firstName);
    }
    LVI.pszText = tempString;
    LVI.iItem = pListCtrlLIST->SetItem(&LVI);
//
//  Reason
//
    LVI.mask = LVIF_TEXT;
    LVI.iItem = iItem;
    LVI.iSubItem = 2;
    strcpy(tempString, "Day Off");
    LVI.pszText = tempString;
    LVI.iItem = pListCtrlLIST->SetItem(&LVI);
//
//  Set up the next row
//
    iItem++;
  }
}