void DateTimeTextMatchPlugin::lookForDateRanges( const QRegExp& regExp, const QString& format, int dateCap, int rangeEndCap, int yearCap, bool forceCurrentYear )
{
//    kDebug() << regExp.pattern() << format;
    int pos = 0;
    while ( ( pos = regExp.indexIn( m_text, pos ) ) != -1 ) {
        QDate startDate = m_enLocale.toDate( regExp.cap( dateCap ), format );
        if ( startDate.isValid() ) {
            if ( yearCap > 0 && regExp.cap( yearCap ).length() ) {
                startDate = QDate( regExp.cap( yearCap ).toInt(), startDate.month(), startDate.day() );
            }
            else if ( forceCurrentYear ) {
                startDate = QDate( QDate::currentDate().year(), startDate.month(), startDate.day() );
            }
            kDebug() << regExp.cap( dateCap ) << regExp.cap( rangeEndCap );
            QDate endDate( startDate.year(), startDate.month(), regExp.cap( rangeEndCap ).toInt() );
            kDebug() << "Found date range" << startDate << endDate;

            m_dateRanges.insert( pos, qMakePair( qMakePair( startDate, endDate ), regExp.matchedLength() ) );
        }
        else {
            kDebug() << "Failed to parse date range" << regExp.cap( 0 );
        }

        pos += regExp.matchedLength();
    }
}
Exemple #2
0
void Task::processTemplate() {
    Template* temp = readTemplate(*_templateName);
    std::vector<string> subtasks = temp->subTaskList();
    int subId = 1;
    for (std::vector<string>::iterator iterSub = subtasks.begin(); iterSub != subtasks.end(); iterSub++) {
        string subtask = *iterSub;
        int posPar = subtask.find('(');
        int posFin = subtask.find(')');

        string tempSub = subtask.substr(posPar + 1, posFin - posPar - 1);
        string subTaskName = subtask.substr(0, posPar);

        Task* sub = new Task(_project);
        std::stringstream ssId;
        ssId << *id() << "." << subId++;
        sub->setId(new string(ssId.str()));
        sub->setDuration(Duration(1, 0, 0));
        sub->setEndDate(endDate());
        sub->setShortDescription(new string(subTaskName));
        sub->setStartDate(startDate());
        sub->setStatus(status());
        sub->setTemplateName(new string(tempSub));

        _project->addTask(sub);
        if (errorOcurred()) {
            return;
        }
        sub->processTemplate();
    }
}
WriMoImp* wrimoimp::WriMoImpTest::getNovemberImp()
{
	Date startDate(CalendarYear::NOVEMBER, 1, 2015);
	Date endDate(CalendarYear::NOVEMBER, 30, 2015);

	return new WriMoImp(startDate, endDate);
}
QString CSmfCredMgrClientSymbian::storeRSAKeysL(const QString KeyLabel,
		const QString keydata, const QDateTime Validity)
	{
	RDebug::Printf("Sending store RSA key message to server");

	TPtrC labelPtr(qt_QString2TPtrC(KeyLabel));
	TPtr dataPtr((qt_QString2HBufC(keydata)->Des()));

	QDateTime CurrentTime = QDateTime::currentDateTime();
	TTimeIntervalSeconds duration(CurrentTime.secsTo(Validity));

	TTime startDate;
	startDate.UniversalTime();

	TTime endDate(startDate);
	endDate += duration;

	CSmfRsaKeyParameters* storeRSAKeysparams = CSmfRsaKeyParameters::NewL(
			labelPtr, startDate, endDate, (dataPtr.Collapse()));
	CleanupStack::PushL(storeRSAKeysparams);

	CBufFlat* buf = CBufFlat::NewL(KMinBufSize);
	CleanupStack::PushL(buf);
	RBufWriteStream stream(*buf);
	CleanupClosePushL(stream);

	storeRSAKeysparams->ExternalizeL(stream);
	stream.CommitL();

	TPtr8 bufPtr = buf->Ptr(0);

	TIpcArgs args;
	args.Set(0, &bufPtr);

	CleanupStack::PopAndDestroy(&stream);

	HBufC8* retBuf = HBufC8::NewLC(KSHA1HashLengthBytes);
	TPtr8 retBufPtr(retBuf->Des());
	args.Set(1, &retBufPtr);

	iSession.RequestService(ESmfStoreRSAKey, args);

	RDebug::Printf("SMF: Message completed");

	TBuf<KSHA1HashLengthBytes> key;
	key.Copy(retBufPtr);

	QString RetString(qt_TDesC2QString(key));

	CleanupStack::Pop(retBuf);
	CleanupStack::PopAndDestroy(buf);
	CleanupStack::PopAndDestroy(storeRSAKeysparams);

	RDebug::Printf("-In storeAuthDataL()");
	
	return (RetString);

	}
// -----------------------------------------------------------------------------
// CPIMEventPropertyConverter::ConvertRepeatRulePropertyL
// Inserts RRULE proprety from a vEvent to a PIM Event Item as a repeat rule
// -----------------------------------------------------------------------------
//
void CPIMEventPropertyConverter::ConvertRepeatRulePropertyL(
    const CPIMParserProperty& aProperty, // property to convert
    CPIMEventItem& aItem) // item to insert the field to
{
    JELOG2(EPim);
    if (aProperty.Name().CompareF(KVersitTokenRRULE) != 0)
    {
        // Some unsupported recurrence data (i.e. EXRULE)
        return;
    }
    MPIMRepeatRuleData* repeatRule = aItem.GetRepeat();

    CParserPropertyValueRecurrence* propertyValue =
        static_cast<CParserPropertyValueRecurrence*>(aProperty.Value());
    CVersitRecurrence* value = propertyValue->Value();
    switch (value->iRepeatType)
    {
    case CVersitRecurrence::EDaily:
    {
        repeatRule->SetIntL(EPIMRepeatRuleFrequency, EPIMRepeatRuleDaily);
        break;
    }
    case CVersitRecurrence::EWeekly:
    {
        repeatRule->SetIntL(EPIMRepeatRuleFrequency, EPIMRepeatRuleWeekly);
        repeatRule->SetIntL(EPIMRepeatRuleInterval, value->iInterval);
        break;
    }
    case CVersitRecurrence::EMonthlyByPos:
    case CVersitRecurrence::EMonthlyByDay:
    {
        repeatRule->SetIntL(EPIMRepeatRuleFrequency, EPIMRepeatRuleMonthly);
        break;
    }
    case CVersitRecurrence::EYearlyByMonth:
    case CVersitRecurrence::EYearlyByDay:
    {
        repeatRule->SetIntL(EPIMRepeatRuleFrequency, EPIMRepeatRuleYearly);
        break;
    }
    default:
    {
        // unknown frequency
        return;
    }
    }

    TVersitDateTime* versitEndDate = value->iEndDate;
    if (versitEndDate)
    {
        TPIMDate endDate(versitEndDate->iDateTime);
        repeatRule->SetDateL(EPIMRepeatRuleEnd, endDate);
    }

    aItem.SetRepeating(ETrue);
}
QDate DailyRecurrence::nextOccurrence(const QDate &date, bool include_equals) const {
	const KCalendarSystem *calSys = KGlobal::locale()->calendar();
	if(include_equals) {
		if(date == startDate()) return date;
	}
	QDate nextdate = date;
	if(!include_equals) nextdate = calSys->addDays(nextdate, 1);
	if(!endDate().isNull() && nextdate > endDate()) return QDate();
	if(nextdate <= startDate()) return firstOccurrence();
	if(i_frequency != 1) {
		int days = startDate().daysTo(nextdate);
		if(days % i_frequency != 0) {
			nextdate = calSys->addDays(nextdate, i_frequency - (days % i_frequency));
		}
	}
	if(!endDate().isNull() && nextdate > endDate()) return QDate();
	if(hasException(nextdate)) return nextOccurrence(nextdate);
	return nextdate;
}
QDate YearlyRecurrence::prevOccurrence(const QDate &date, bool include_equals) const {
	const KCalendarSystem *calSys = KGlobal::locale()->calendar();
	if(!include_equals) {
		if(date > endDate()) return lastOccurrence();
	}
	QDate prevdate = date;
	if(!include_equals) prevdate = calSys->addDays(prevdate, -1);
	if(prevdate < startDate()) return QDate();
	if(prevdate == startDate()) return startDate();
	if(i_frequency != 1) {
		int i = (calSys->year(prevdate) - calSys->year(startDate())) % i_frequency;
		if(i != 0) {
			prevdate = calSys->addYears(prevdate, - i);
		}
	}
	if(calSys->year(prevdate) == calSys->year(startDate())) return startDate();
	if(i_dayofyear > 0) {
		if(calSys->dayOfYear(prevdate) < i_dayofyear) {
			prevdate = calSys->addYears(prevdate, -i_frequency);
			if(calSys->year(prevdate) == calSys->year(startDate())) return startDate();
		}
		if(i_dayofyear > calSys->daysInYear(prevdate)) {
			do {
				prevdate = calSys->addYears(prevdate, -i_frequency);
				if(calSys->year(prevdate) <= calSys->year(startDate())) return startDate();
			} while(i_dayofyear > calSys->daysInYear(prevdate));
		}
		prevdate = calSys->addDays(prevdate, i_dayofyear - calSys->dayOfYear(prevdate));
	} else {
		int day = i_dayofmonth;
		if(i_dayofweek > 0) day = get_day_in_month(calSys->year(prevdate), i_month, i_week, i_dayofweek);
		if(day <= 0 || calSys->month(prevdate) < i_month || (calSys->month(prevdate) == i_month && calSys->day(prevdate) < day)) {
			do {
				prevdate = calSys->addYears(prevdate, -i_frequency);
				if(i_dayofweek > 0) day = get_day_in_month(calSys->year(prevdate), i_month, i_week, i_dayofweek);
				if(calSys->year(prevdate) == calSys->year(startDate())) return startDate();
			} while(day <= 0);
		}
		if(i_dayofweek <= 0) {
			calSys->setYMD(prevdate, calSys->year(prevdate), i_month, 1);
			if(day > calSys->daysInMonth(prevdate)) {
				do {
					prevdate = calSys->addYears(prevdate, -i_frequency);
					calSys->setYMD(prevdate, calSys->year(prevdate), i_month, 1);
					if(calSys->year(prevdate) <= calSys->year(startDate())) return startDate();
				} while(day > calSys->daysInMonth(prevdate));
			}
		}
		calSys->setYMD(prevdate, calSys->year(prevdate), i_month, day);
	}
	if(prevdate < startDate()) return QDate();
	if(hasException(prevdate)) return prevOccurrence(prevdate);
	return prevdate;
}
QDate WeeklyRecurrence::nextOccurrence(const QDate &date, bool include_equals) const {
	const KCalendarSystem *calSys = KGlobal::locale()->calendar();
	if(!include_equals) {
		if(date < startDate()) return firstOccurrence();
	} else {
		if(date <= startDate()) return firstOccurrence();
	}
	QDate nextdate = date;
	if(!include_equals) nextdate = calSys->addDays(nextdate, 1);
	if(!endDate().isNull() && nextdate > endDate()) return QDate();
	if(i_frequency != 1 && calSys->weekNumber(nextdate) != calSys->weekNumber(startDate())) {
		int i = weeks_between_dates(startDate(), nextdate) % i_frequency;
		if(i != 0) {
			nextdate = calSys->addDays(nextdate, (i_frequency - i) * 7 - (calSys->dayOfWeek(nextdate) - 1));
		}
	}
	int dow = calSys->dayOfWeek(nextdate);
	int i = dow;
	for(; i <= 7; i++) {
		if(b_daysofweek[i - 1]) {
			break;
		}
	}
	if(i > 7) {
		for(i = 1; i <= 7; i++) {
			if(b_daysofweek[i - 1]) {
				break;
			}
		}
		if(i > 7) return QDate();
	}
	if(i < dow) {
		nextdate = calSys->addDays(nextdate, (i_frequency * 7) + i - dow);
	} else if(i > dow) {
		nextdate = calSys->addDays(nextdate, i - dow);
	}
	if(!endDate().isNull() && nextdate > endDate()) return QDate();
	if(hasException(nextdate)) return nextOccurrence(nextdate);
	return nextdate;
}
Exemple #9
0
	//=============================================================================
	// Compare two DateTimes  and calculate the elapsed time
	//==============================================================================
	PeriodData TimeComparer::Compare(const DateTime& start, const DateTime& end)
	{
		PeriodData pd;
		//Convert both DateTime to ISO for comparison
		PartialDateTime endDate(end);
		PartialDateTime startDate(start);

		if (calmath::ExtractTime(endDate.GetFixed()) < calmath::ExtractTime(startDate.GetFixed()))
		{
			endDate = PartialDateTime(start);
			startDate = PartialDateTime(end);
		}

		pd.elapsedHours = endDate.GetHour() - startDate.GetHour();
		pd.elapsedMinutes = endDate.GetMinute() - startDate.GetMinute();
		pd.elapsedSeconds = endDate.GetSecond() - startDate.GetSecond();
		pd.elapsedMilliseconds = endDate.GetMilliSecond() - startDate.GetMilliSecond();


		//borrow to avoid negatives
		if (pd.elapsedMilliseconds < 0)
		{
			pd.elapsedSeconds -= 1;
			pd.elapsedMilliseconds += 1000;
		}

		if (pd.elapsedSeconds < 0)
		{
			pd.elapsedMinutes -= 1;
			pd.elapsedSeconds += 60;
		}

		if (pd.elapsedMinutes < 0)
		{
			pd.elapsedHours -= 1;
			pd.elapsedMinutes += 60;
		}

		// set unused date fields
		pd.elapsedYears = 0;
		pd.elapsedMonths = 0;
		pd.elapsedWeeks = 0;
		pd.elapsedDays = 0;

		return pd;
	}
	//=============================================================================
	// Compare two DateTimes  and calculate the elapsed time
	//==============================================================================
	PeriodData YearWeekDayComparer::Compare(const DateTime& start, const DateTime& end)
	{
		PeriodData pd;
		//Convert both DateTime to ISO for comparison
		PartialDateTime endDate(end);
		PartialDateTime startDate(start);

		SwapPositiveElapsed(startDate, endDate);

		CalcBaseDateDiff(pd, startDate, endDate);

		if (pd.elapsedMonths< 0 || (pd.elapsedMonths == 0 && pd.elapsedDays < 0))
		{
			//Need to move years back 1
			pd.elapsedYears -= 1;

		}

		//We create a PartialDateTime for the last full year then count remaining days and weeks
		PartialDateTime pDt(startDate.GetYear() + pd.elapsedYears, startDate.GetMonth(), 1, CalType::CalType_ISO);
		//we set to first of month in case the start date is on a leap year
		FixedDateTime intermediateDT = calmath::ExtractDate(pDt.GetFixed());
		if (startDate.GetMonth() == 2 && startDate.GetDay() == 29)
		{
			if (pDt.IsLeapYear())
				intermediateDT += (29 - 1);
			else
				intermediateDT += (28 - 1);
		}
		else
			intermediateDT += (startDate.GetDay() - 1);

		//Find diffrence in days
		pd.elapsedDays = static_cast<int>(calmath::ExtractDate(endDate.GetFixed()) - intermediateDT);
		pd.elapsedWeeks = pd.elapsedDays / 7;
		pd.elapsedDays = pd.elapsedDays % 7;

		// set elapsed months to unused
		SetUnusedDateFields(pd, false, true, false, false);
		// set time to unused
		SetUnusedTimeFields(pd, true, true, true, true);

		return pd;
	}
Exemple #11
0
float student::calcAmountOwed(){
    boost::gregorian::date currentDate(student::firstEntryDate());
    boost::gregorian::date endDate(studentBill[student::numberEntries()-1].getDate());
    float monthTotal=0.0;
    float overallTotal=0.0;
    for(int index=0; index<student::numberEntries();){
        bool currentEntryInMonth = entryInMonth(studentBill[index],currentDate);
        if(currentEntryInMonth == true){
            monthTotal += studentBill[index].getAmount(); 
            index++;
        }
        else {
            currentDate = startOfNextMonth(currentDate);
            overallTotal = monthTotal+overallTotal+(overallTotal*.01);
            monthTotal=0.0;
        }
    }
    return (overallTotal=monthTotal+overallTotal+(overallTotal*.01));
}  
Exemple #12
0
QDate DailyRecurrence::prevOccurrence(const QDate &date, bool include_equals) const {
	const KCalendarSystem *calSys = KGlobal::locale()->calendar();
	if(!include_equals) {
		if(date > endDate()) return lastOccurrence();
	}
	QDate prevdate = date;
	if(!include_equals) prevdate = calSys->addDays(prevdate, -1);
	if(prevdate < startDate()) return QDate();
	if(prevdate == startDate()) return startDate();
	if(i_frequency != 1) {
		int days = startDate().daysTo(prevdate);
		if(days % i_frequency != 0) {
			prevdate = calSys->addDays(prevdate, -(days % i_frequency));
		}
	}
	if(prevdate < startDate()) return QDate();
	if(hasException(prevdate)) return prevOccurrence(prevdate);
	return prevdate;
}
Exemple #13
0
QDate WeeklyRecurrence::prevOccurrence(const QDate &date, bool include_equals) const {
	const KCalendarSystem *calSys = KGlobal::locale()->calendar();
	if(!include_equals) {
		if(date > endDate()) return lastOccurrence();
	}
	QDate prevdate = date;
	if(!include_equals) prevdate = calSys->addDays(prevdate, -1);
	if(prevdate < startDate()) return QDate();
	if(prevdate == startDate()) return startDate();
	if(i_frequency != 1 && calSys->weekNumber(prevdate) != calSys->weekNumber(startDate())) {
		int i = weeks_between_dates(startDate(), prevdate) % i_frequency;
		if(i != 0) {
			prevdate = calSys->addDays(prevdate, -(i * 7) + 7 - calSys->dayOfWeek(prevdate));
		}
	}
	int dow_s = calSys->dayOfWeek(startDate());
	bool s_week = calSys->weekNumber(prevdate) == calSys->weekNumber(startDate());
	int dow = calSys->dayOfWeek(prevdate);
	int i = dow;
	for(; i <= 7; i++) {
		if(b_daysofweek[i - 1] || (s_week && dow_s == i)) {
			break;
		}
	}
	if(i > 7) {
		for(i = 1; i <= 7; i++) {
			if(b_daysofweek[i - 1] || (s_week && dow_s == i)) {
				break;
			}
		}
		if(i > 7) return QDate();
	}
	if(i > dow) {
		prevdate = calSys->addDays(prevdate, -(i_frequency * 7) + dow - i);
	} else if(i < dow) {
		prevdate = calSys->addDays(prevdate, dow - i);
	}
	if(prevdate < startDate()) return QDate();
	if(hasException(prevdate)) return prevOccurrence(prevdate);
	return prevdate;
}
ReadingPlanWizardDatesPage::ReadingPlanWizardDatesPage(wxWizard *parent) : wxWizardPageSimple(parent)
{
  wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );
  wxBoxSizer *topDatesizer = new wxBoxSizer( wxHORIZONTAL );
  wxBoxSizer *startDatesizer = new wxBoxSizer( wxVERTICAL );
  wxBoxSizer *endDatesizer = new wxBoxSizer( wxVERTICAL );
  wxGridSizer *weekdaysSizer = new wxGridSizer(2,4,2,10);

  m_calStart = new wxCalendarCtrl(this, ID_CalendarCtrlStart ,
                                  wxDateTime(wxDefaultDateTime).SetToCurrent(),
                                  wxDefaultPosition,
                                  wxDefaultSize,
                                  wxCAL_SUNDAY_FIRST |
                                  wxCAL_SHOW_HOLIDAYS |
                                  wxRAISED_BORDER );
  wxDateTime endDate(wxDefaultDateTime);
  endDate.SetToCurrent();
  endDate.Add(wxDateSpan(1,0,0,-1));
  m_calEnd = new wxCalendarCtrl(this, ID_CalendarCtrlEnd,
                                endDate,
                                wxDefaultPosition,
                                wxDefaultSize,
                                wxCAL_SUNDAY_FIRST |
                                wxCAL_SHOW_HOLIDAYS |
                                wxRAISED_BORDER );
//  m_calStart->Hide();
//  m_calEnd->Hide();

  m_strStart = new wxStaticText(this, -1, _("Start Date:"), wxDefaultPosition, wxDefaultSize, wxST_NO_AUTORESIZE);
  m_strEnd = new wxStaticText(this, -1, _("End Date:"), wxDefaultPosition, wxDefaultSize, wxST_NO_AUTORESIZE);

  m_strEnd->SetMinSize(wxSize(m_calEnd->GetSize().GetWidth(), m_strEnd->GetSize().GetHeight()));
  m_strStart->SetMinSize(wxSize(m_calStart->GetSize().GetWidth(), m_strStart->GetSize().GetHeight()));

  startDatesizer->Add(m_strStart, 0);
  startDatesizer->Add(m_calStart, 1, wxEXPAND);
//  startDatesizer->SetSizeHints(this);
//  
  endDatesizer->Add(m_strEnd, 0);
  endDatesizer->Add(m_calEnd, 1, wxEXPAND);
  topDatesizer->Add(startDatesizer, 1, wxEXPAND, 10);
  topDatesizer->Add(15,5);
  topDatesizer->Add(endDatesizer, 1, wxEXPAND, 10);

//  SetSizer( topDatesizer );
//  topDatesizer->SetSizeHints(this);

  
  
  
  m_statBox = new wxStaticBox(this, -1, _("Days of Week"));
  wxStaticBoxSizer* statsizer = new wxStaticBoxSizer(m_statBox, wxHORIZONTAL);
  m_ckSunday = new wxCheckBox(this, ID_CheckCtrlSun, _("Sunday"), wxDefaultPosition, wxSize(-1,-1));
  m_ckSunday->SetValue(true);
  m_ckMonday = new wxCheckBox(this, ID_CheckCtrlMon, _("Monday"), wxDefaultPosition, wxSize(-1,-1));
  m_ckMonday->SetValue(true);
  m_ckTuesday = new wxCheckBox(this, ID_CheckCtrlTue, _("Tuesday"), wxDefaultPosition, wxSize(-1,-1));
  m_ckTuesday->SetValue(true);
  m_ckWednesday = new wxCheckBox(this, ID_CheckCtrlWed, _("Wednesday"), wxDefaultPosition, wxSize(-1,-1));
  m_ckWednesday->SetValue(true);
  m_ckThursday = new wxCheckBox(this, ID_CheckCtrlThu, _("Thursday"), wxDefaultPosition, wxSize(-1,-1));
  m_ckThursday->SetValue(true);
  m_ckFriday = new wxCheckBox(this, ID_CheckCtrlFri, _("Friday"), wxDefaultPosition, wxSize(-1,-1));
  m_ckFriday->SetValue(true);
  m_ckSaturday = new wxCheckBox(this, ID_CheckCtrlSat, _("Saturday"), wxDefaultPosition, wxSize(-1,-1));
  m_ckSaturday->SetValue(true);

  weekdaysSizer->Add(m_ckSunday);
  weekdaysSizer->Add(m_ckMonday);
  weekdaysSizer->Add(m_ckTuesday);
  weekdaysSizer->Add(m_ckWednesday);
  weekdaysSizer->Add(m_ckThursday);
  weekdaysSizer->Add(m_ckFriday);
  weekdaysSizer->Add(m_ckSaturday);
  statsizer->Add(weekdaysSizer);

  m_lblDayTotal = new wxStaticText(this, ID_TextCtrlTotal, _("Total Days:") + wxString(wxT(" 0")),wxDefaultPosition, wxSize(-1,-1));

  m_dateBegin = (RPDate)(&m_calStart->GetDate());
  m_dateEnd = (RPDate)(&m_calEnd->GetDate());
  m_dayFlags = SUNDAY | MONDAY | TUESDAY | WEDNESDAY | THURSDAY | FRIDAY | SATURDAY;
  UpdateDays();
  topsizer->Add(topDatesizer,1);
  topsizer->Add(5,15);
  topsizer->Add(statsizer,0);
  topsizer->Add(5,5);
  topsizer->Add(m_lblDayTotal,0);
  SetSizer( topsizer );
  topsizer->SetSizeHints(this);

}
Exemple #15
0
RcppExport SEXP xbrlProcessContexts(SEXP epaDoc) {
  xmlDocPtr doc = (xmlDocPtr) R_ExternalPtrAddr(epaDoc);

  xmlXPathContextPtr context = xmlXPathNewContext(doc);
  xmlXPathObjectPtr context_res = xmlXPathEvalExpression((xmlChar*) "//*[local-name()='context']", context);
  xmlNodeSetPtr context_nodeset = context_res->nodesetval;
  int context_nodeset_ln = context_nodeset->nodeNr;
  xmlXPathFreeContext(context);

  CharacterVector contextId(context_nodeset_ln);
  CharacterVector scheme(context_nodeset_ln);
  CharacterVector identifier(context_nodeset_ln);
  CharacterVector startDate(context_nodeset_ln);
  CharacterVector endDate(context_nodeset_ln);
  CharacterVector dimension1(context_nodeset_ln);
  CharacterVector value1(context_nodeset_ln);
  CharacterVector dimension2(context_nodeset_ln);
  CharacterVector value2(context_nodeset_ln);
  CharacterVector dimension3(context_nodeset_ln);
  CharacterVector value3(context_nodeset_ln);
  CharacterVector dimension4(context_nodeset_ln);
  CharacterVector value4(context_nodeset_ln);

  for (int i=0; i < context_nodeset_ln; i++) {
    xmlNodePtr context_node = context_nodeset->nodeTab[i];
    xmlChar *tmp_str;
    if ((tmp_str = xmlGetProp(context_node, (xmlChar*) "id"))) { 
      contextId[i] = (char *) tmp_str;
      xmlFree(tmp_str);
    } else {
      contextId[i] = NA_STRING;
    }
    scheme[i] = identifier[i] = startDate[i] = endDate[i] =
      dimension1[i] = value1[i] = dimension2[i] = value2[i] =
      dimension3[i] = value3[i] = dimension4[i] = value4[i] = NA_STRING;
    xmlNodePtr child_node = context_node->xmlChildrenNode;
    while (child_node) {
      if (!xmlStrcmp(child_node->name, (xmlChar*) "entity")) {
	xmlNodePtr gchild_node = child_node->xmlChildrenNode;
	while (gchild_node) {
	  if (!xmlStrcmp(gchild_node->name, (xmlChar*) "identifier")) {
	    if ((tmp_str = xmlGetProp(gchild_node, (xmlChar*) "scheme"))) { 
	      scheme[i] = (char *) tmp_str;
	      xmlFree(tmp_str);
	    }
	    if ((tmp_str = xmlNodeListGetString(doc, gchild_node->xmlChildrenNode, 1))) {
	      identifier[i] = (char *) tmp_str;
	      xmlFree(tmp_str);
	    }
	  } else if (!xmlStrcmp(gchild_node->name, (xmlChar*) "segment")) {
	    xmlNodePtr ggchild_node = gchild_node->xmlChildrenNode;
	    int dimn = 1;
	    while (ggchild_node) {
	      if (!xmlStrcmp(ggchild_node->name, (xmlChar*) "explicitMember")) {
		if ((tmp_str = xmlGetProp(ggchild_node, (xmlChar*) "dimension"))) {
		  if (dimn == 1)
		    dimension1[i] = (char *) tmp_str;
		  else if (dimn == 2)
		    dimension2[i] = (char *) tmp_str;
		  else if (dimn == 3)
		    dimension3[i] = (char *) tmp_str;
		  else if (dimn == 4)
		    dimension4[i] = (char *) tmp_str;
		  xmlFree(tmp_str);
		}
		if ((tmp_str = xmlNodeListGetString(doc, ggchild_node->xmlChildrenNode, 1))) {
		  if (dimn == 1)
		    value1[i] = (char *) tmp_str;
		  else if (dimn == 2)
		    value2[i] = (char *) tmp_str;
		  else if (dimn == 3)
		    value3[i] = (char *) tmp_str;
		  else if (dimn == 4)
		    value4[i] = (char *) tmp_str;
		  xmlFree(tmp_str);
		}
		dimn++;
	      }
	      ggchild_node = ggchild_node->next;
	    }
	  }
	  gchild_node = gchild_node->next;
	}
      } else if (!xmlStrcmp(child_node->name, (xmlChar*) "period")) {
	xmlNodePtr gchild_node = child_node->xmlChildrenNode;
	while (gchild_node) {
	  if (!xmlStrcmp(gchild_node->name, (xmlChar*) "startDate")) {
	    if ((tmp_str = xmlNodeListGetString(doc, gchild_node->xmlChildrenNode, 1))) {
	      startDate[i] = (char *) tmp_str;
	      xmlFree(tmp_str);
	    }
	  } else if (!xmlStrcmp(gchild_node->name, (xmlChar*) "endDate")) {
	    if ((tmp_str = xmlNodeListGetString(doc, gchild_node->xmlChildrenNode, 1))) {
	      endDate[i] = (char *) tmp_str;
	      xmlFree(tmp_str);
	    }
	  } else if (!xmlStrcmp(gchild_node->name, (xmlChar*) "instant")) {
	    if ((tmp_str = xmlNodeListGetString(doc, gchild_node->xmlChildrenNode, 1))) {
	      endDate[i] = (char *) tmp_str;
	      xmlFree(tmp_str);
	    }
	  }
	  gchild_node = gchild_node->next;
	}
      }
      child_node = child_node->next;
    }
  }
  xmlXPathFreeObject(context_res);

  return DataFrame::create(Named("contextId")=contextId,
			   Named("scheme")=scheme,
			   Named("identifier")=identifier,
			   Named("startDate")=startDate,
			   Named("endDate")=endDate,
			   Named("dimension1")=dimension1,
			   Named("value1")=value1,
			   Named("dimension2")=dimension2,
			   Named("value2")=value2,
			   Named("dimension3")=dimension3,
			   Named("value3")=value3,
			   Named("dimension4")=dimension4,
			   Named("value4")=value4);
}
int ChartItemModel::rowCount( const QModelIndex &/*parent */) const
{
    return startDate().daysTo( endDate() ) + 1;
}
Exemple #17
0
QDate YearlyRecurrence::nextOccurrence(const QDate &date, bool include_equals) const {
	const KCalendarSystem *calSys = KGlobal::locale()->calendar();
	if(!include_equals) {
		if(date < startDate()) return firstOccurrence();
	} else {
		if(date <= startDate()) return firstOccurrence();
	}
	QDate nextdate = date;
	if(!include_equals) nextdate = calSys->addDays(nextdate, 1);
	if(!endDate().isNull() && nextdate > endDate()) return QDate();
	if(calSys->year(nextdate) == calSys->year(startDate())) {
		nextdate = calSys->addYears(nextdate, i_frequency);
		calSys->setYMD(nextdate, calSys->year(nextdate), 1, 1);
	} else if(i_frequency != 1) {
		int i = (calSys->year(nextdate) - calSys->year(startDate())) % i_frequency;
		if(i != 0) {
			nextdate = calSys->addYears(nextdate, i_frequency - i);
			calSys->setYMD(nextdate, calSys->year(nextdate), 1, 1);
		}
	}
	if(i_dayofyear > 0) {
		if(calSys->dayOfYear(nextdate) > i_dayofyear) {
			nextdate = calSys->addYears(nextdate, i_frequency);
		}
		if(i_dayofyear > calSys->daysInYear(nextdate)) {
			int i = 10;
			do {
				if(i == 0) return QDate();
				nextdate = calSys->addYears(nextdate, i_frequency);
				i--;
			} while(i_dayofyear > calSys->daysInYear(nextdate));
		}
		nextdate = calSys->addDays(nextdate, i_dayofyear - calSys->dayOfYear(nextdate));
	} else {
		int day = i_dayofmonth;
		if(i_dayofweek > 0) day = get_day_in_month(calSys->year(nextdate), i_month, i_week, i_dayofweek);
		if(day == 0 || calSys->month(nextdate) > i_month || (calSys->month(nextdate) == i_month && calSys->day(nextdate) > day)) {
			do {
				nextdate = calSys->addYears(nextdate, i_frequency);
				day = get_day_in_month(calSys->year(nextdate), i_month, i_week, i_dayofweek);
				if(!endDate().isNull() && calSys->year(nextdate) > calSys->year(endDate())) return QDate();
			} while(day == 0);
		}
		if(i_dayofweek <= 0) {
			calSys->setYMD(nextdate, calSys->year(nextdate), i_month, 1);
			if(day > calSys->daysInMonth(nextdate)) {
				int i = 10;
				do {
					if(i == 0) return QDate();
					nextdate = calSys->addYears(nextdate, i_frequency);
					calSys->setYMD(nextdate, calSys->year(nextdate), i_month, 1);
					i--;
				} while(day > calSys->daysInMonth(nextdate));
			}
		}
		calSys->setYMD(nextdate, calSys->year(nextdate), i_month, day);
	}
	if(!endDate().isNull() && nextdate > endDate()) return QDate();
	if(hasException(nextdate)) return nextOccurrence(nextdate);
	return nextdate;
}
int main(int argc, char *argv[])
{
    // make sure that each time you run your application, a valid access token is provided
    if (argc < 2 || argc > 3) {
        std::cerr << "Usage: ./<executable_name> \"<access_token>\" [\"<Extension_identifier\"]" << std::endl;
        std::cerr << "	example: ./democallcosts \"1|V_pmPvEm25-HrqAzERx_nvJbBvNs~q3F|1|D~nbBUf87k~7I12F79T-nJnHU12Y.4Aq\"" << std::endl;
        exit(EXIT_FAILURE);
    }

    // We will make a Call report, so we need a Report object
    ReportProxy *report = new ReportProxy;
    if (NULL == report) {
        std::cerr << "Failed creating a Report object" << std::endl;
        exit(EXIT_FAILURE);
    }

    // Authentication Data - passed from command line
    std::string accessToken(argv[1]);

    // filling in the header with the user credentials
    report->soap->header = new SOAP_ENV__Header;
    if (NULL == report->soap->header) {
        std::cerr << "Failed creating a SOAP_ENV__Header object" << std::endl;
        exit(EXIT_FAILURE);
    }
    report->soap->header->ns3__serverInfo = NULL;
    report->soap->header->ns3__userCredentials = new _ns3__userCredentials;
    if (NULL == report->soap->header->ns3__userCredentials) {
        std::cerr << "Failed creating an _ns3__userCredentials  object" << std::endl;
        exit(EXIT_FAILURE);
    }
    report->soap->header->ns3__userCredentials->accessToken = accessToken;

    // creating 2 objects for the request and for the response
    _ns20__CallCosts *request = new _ns20__CallCosts;
    if (NULL == request) {
        std::cerr << "Failed creating a CallReport object" << std::endl;
        exit(EXIT_FAILURE);
    }

    _ns20__CallCostsResponse response;

    // User ID - passed from the command line or randomly generated
    std::string parentID;

    if (3 == argc) {
        // User ID was passed from command line
        std::string temp(argv[2]);
        parentID = temp;
    } else {
        // random extension ID
        std::cout << "No extension ID was provided, will randomly generate one" << std::endl;

        // getting all extensions

        // we need an Extension object
        ExtensionProxy *extension = new ExtensionProxy;
        if (NULL == extension) {
            std::cerr << "Failed creating an Extension object" << std::endl;
            exit(EXIT_FAILURE);
        }

        // filling in the header with the user credentials
        extension->soap->header = new SOAP_ENV__Header;
        if (NULL == extension->soap->header) {
            std::cerr << "Failed creating a SOAP_ENV__Header object" << std::endl;
            exit(EXIT_FAILURE);
        }
        extension->soap->header->ns3__serverInfo = NULL;
        extension->soap->header->ns3__userCredentials = new _ns3__userCredentials;
        if (NULL == extension->soap->header->ns3__userCredentials) {
            std::cerr << "Failed creating a _ns3__userCredentials object" << std::endl;
            exit(EXIT_FAILURE);
        }
        extension->soap->header->ns3__userCredentials->accessToken = accessToken;

        // creating 2 objects for the request and for the response
        _ns13__GetExtensions *extRequest = new _ns13__GetExtensions;
        if (NULL == extRequest) {
            std::cerr << "Failed creating a _ns13__GetExtensions object" << std::endl;
            exit(EXIT_FAILURE);
        }

        _ns13__GetExtensionsResponse extResponse;

        // making the request for getting extensions and getting the response
        int errCodeExt = extension->GetExtensions(extRequest, extResponse);
        if (SOAP_OK == errCodeExt) {
            // no error
            std::cout << "OK retrieving extensions" << std::endl;

            if (0 == extResponse.extension.size()) {
               // no extensions exist
                std::cerr << "No extensions are defined" << std::endl;
                exit(EXIT_FAILURE);
            }

            // found extensions

            // randomly choosing an extension
            srand(time(NULL));
            int randomIndex = rand() % extResponse.extension.size();

            // getting the id of the user
            std::string randomID = *extResponse.extension.at(randomIndex)->identifier;
            std::cout << "Using random extension identifier " << randomID << std::endl;
            parentID = randomID;

        } else {
            // error found
            soap *s = new soap;
            if (NULL == s) {
                std::cerr << "Failed creating a soap object" << std::endl;
                exit(EXIT_FAILURE);
            }
            s->error = errCodeExt;
            soap_print_fault(s, stderr);
            delete s;
        }
    }

    request->__CallCosts_sequence = new __ns20__CallCosts_sequence;
    if (NULL == request->__CallCosts_sequence) {
        std::cerr << "Failed creating a __ns20__CallCosts_sequence" << std::endl;
        exit(EXIT_FAILURE);
    }

    request->__CallCosts_sequence->ns21__userIdentifier = &parentID;

    //get current date for the endDate parameter of the interval for the report
    time_t the_time = time(NULL);
    struct tm *a_time = localtime(&the_time);
    char *end_date = (char*)malloc(12 * sizeof(char));
    if (NULL == end_date) {
        std::cerr << "Failed creating string for end_date" << std::endl;
        exit(EXIT_FAILURE);
    }
    sprintf(end_date, "%d-%02d-%d", a_time->tm_year + 1900, a_time->tm_mon + 1, a_time->tm_mday);

    // information about the call report(interval)
    std::string startDate(START_DATE);
    std::string endDate(end_date);

    free(end_date);

    request->__CallCosts_sequence->ns21__interval = new _ns21__interval;
    if (NULL == request->__CallCosts_sequence->ns21__interval) {
        std::cerr << "Failed creating a _ns21__interval object" << std::endl;
        exit(EXIT_FAILURE);
    }

    // filling in the information about the call report (interval)
    request->__CallCosts_sequence->ns21__interval->startDate = &startDate;
    request->__CallCosts_sequence->ns21__interval->endDate = &endDate;

    // making the request and getting the response
    int errCode = report->CallCosts(request, response);
    if (SOAP_OK == errCode) {
        // no error
        std::cout << "OK retrieving call costs" << std::endl;

        std::cout << *response.ns21__totalCalls << " calls have been made between " << startDate << " and " << endDate;
        std::cout << " with a total cost of " << *response.ns21__cost << " " << *response.ns21__currency << std::endl;

    } else {
        // error found
        soap *s = new soap;
        if (NULL == s) {
            std::cerr << "Failed creating a soap object" << std::endl;
            exit(EXIT_FAILURE);
        }
        s->error = errCode;
        soap_print_fault(s, stderr);
        std::cerr << "Please check the log files for more information" << std::endl;
        delete s;
    }

    delete request->__CallCosts_sequence->ns21__interval;
    delete request->__CallCosts_sequence;
    request->~_ns20__CallCosts();
    delete request;

    return 0;
}
Exemple #19
0
bool DateRange::operator==(DateRange const& other) const
{
   return m_startDate == other.m_startDate && endDate() == other.endDate();
}
bool RecurrenceWidget::save(bool externaltxn, RecurrenceChangePolicy cp, QString *message)
{
  if (! message)
    message = new QString();

  if (DEBUG)
    qDebug("%s::save(%d, %d, %p) entered with id %d type %s",
           qPrintable(objectName()), externaltxn, cp, message, _parentId,
           qPrintable(_parentType));

  if (! modified())
    return true;

  if (_parentId < 0 || _parentType.isEmpty())
  {
    *message = tr("Could not save Recurrence information. The "
                  "parent object/event has not been set.");
    if (! externaltxn)
      QMessageBox::warning(this, tr("Missing Data"), *message);
    else
      qWarning("%s", qPrintable(*message));
    return false;
  }

  if (! externaltxn && cp == NoPolicy)
  {
    cp = getChangePolicy();
    if (cp == NoPolicy)
      return false;
  }
  else if (externaltxn && cp == NoPolicy)
  {
    *message = tr("You must choose how open events are to be handled");
    qWarning("%s", qPrintable(*message));
    return false;
  }

  XSqlQuery rollbackq;
  if (! externaltxn)
  {
    XSqlQuery beginq("BEGIN;");
    rollbackq.prepare("ROLLBACK;");
  }

  XSqlQuery recurq;
  if (isRecurring())
  {
    if (_id > 0)
    {
      if (cp == ChangeFuture)
      {
        XSqlQuery futureq;
        futureq.prepare("SELECT splitRecurrence(:parent_id, :parent_type,"
                        "                       :splitdate) AS newrecurid;");
        futureq.bindValue(":parent_id",   _parentId);
        futureq.bindValue(":parent_type", _parentType);
        futureq.bindValue(":splitdate",   startDate());
        futureq.exec();
        if (futureq.first())
        {
          int result = futureq.value("newrecurid").toInt();
          if (result > 0)
          {
            _id = result;
            futureq.prepare("SELECT recur_parent_id"
                            "  FROM recur"
                            " WHERE recur_id=:recur_id;");
            futureq.bindValue(":recur_id", _id);
            futureq.exec();
            if (futureq.first())
              _parentId = futureq.value("recur_parent_id").toInt();
          }
          else if (result < 0)
          {
            *message = storedProcErrorLookup("splitRecurrence", result);
            if (! externaltxn)
            {
              rollbackq.exec();
              QMessageBox::warning(this, tr("Processing Error"), *message);
            }
            else
              qWarning("%s", qPrintable(*message));
            return false;
          }
        }
        // one check for potentially 2 queries
        if (futureq.lastError().type() != QSqlError::NoError)
        {
          *message = futureq.lastError().text();
          if (! externaltxn)
          {
            rollbackq.exec();
            QMessageBox::warning(this, tr("Database Error"), *message);
          }
          else
            qWarning("%s", qPrintable(*message));
          return false;
        }
      }

      recurq.prepare("UPDATE recur SET"
                     "  recur_parent_id=:recur_parent_id,"
                     "  recur_parent_type=UPPER(:recur_parent_type),"
                     "  recur_period=:recur_period,"
                     "  recur_freq=:recur_freq,"
                     "  recur_start=:recur_start,"
                     "  recur_end=:recur_end,"
                     "  recur_max=:recur_max"
                     " WHERE (recur_id=:recurid)"
                     " RETURNING recur_id;");
      recurq.bindValue(":recurid", _id);
    }
    else
    {
      recurq.prepare("INSERT INTO recur ("
                     "  recur_parent_id,  recur_parent_type,"
                     "  recur_period,     recur_freq,"
                     "  recur_start,      recur_end,"
                     "  recur_max"
                     ") VALUES ("
                     "  :recur_parent_id, UPPER(:recur_parent_type),"
                     "  :recur_period,    :recur_freq,"
                     "  :recur_start,     :recur_end,"
                     "  :recur_max"
                     ") RETURNING recur_id;");
    }

    recurq.bindValue(":recur_parent_id",   _parentId);
    recurq.bindValue(":recur_parent_type", _parentType);
    recurq.bindValue(":recur_period",      periodCode());
    recurq.bindValue(":recur_freq",        frequency());
    recurq.bindValue(":recur_start",       startDateTime());
    if (endDate() < _eot.date())
      recurq.bindValue(":recur_end",       endDateTime());
    recurq.bindValue(":recur_max",         max());
    recurq.exec();
    if (recurq.first())
    {
      _id = recurq.value("recur_id").toInt();
      _prevParentId      = _parentId;
      _prevParentType    = _parentType;
      _prevEndDateTime   = endDateTime();
      _prevFrequency     = frequency();
      _prevMax           = max();
      _prevPeriod        = period();
      _prevRecurring     = isRecurring();
      _prevStartDateTime = startDateTime();
    }
  }
  else // ! isRecurring()
  {
    recurq.prepare("DELETE FROM recur"
                   " WHERE ((recur_parent_id=:recur_parent_id)"
                   "    AND (UPPER(recur_parent_type)=UPPER(:recur_parent_type)));");
    recurq.bindValue(":recur_parent_id",   _parentId);
    recurq.bindValue(":recur_parent_type", _parentType);
    recurq.exec();
  }

  if (recurq.lastError().type() != QSqlError::NoError)
  {
    *message = recurq.lastError().text();
    if (! externaltxn)
    {
      rollbackq.exec();
      QMessageBox::warning(this, tr("Database Error"), *message);
    }
    else
      qWarning("%s", qPrintable(*message));
    return false;
  }

  if (cp == ChangeFuture)
  {
    int procresult = -1;
    QString procname = "deleteOpenRecurringItems";
    XSqlQuery cfq;
    cfq.prepare("SELECT deleteOpenRecurringItems(:parentId, :parentType,"
                "                                :splitdate, false) AS result;");
    cfq.bindValue(":parentId",   _parentId);
    cfq.bindValue(":parentType", _parentType);
    cfq.bindValue(":splitdate",  startDate());
    cfq.exec();
    if (cfq.first())
    {
      procresult = cfq.value("result").toInt();
      if (procresult >= 0)
      {
        QString procname = "createOpenRecurringItems";
        cfq.prepare("SELECT createRecurringItems(:parentId, :parentType)"
                    "       AS result;");
        cfq.bindValue(":parentId",   _parentId);
        cfq.bindValue(":parentType", _parentType);
        cfq.exec();
        if (cfq.first())
          procresult = cfq.value("result").toInt();
      }
    }

    // error handling for either 1 or 2 queries so not elseif
    // check cfq.lastError() first to avoid misreporting db errs as -1
    if (cfq.lastError().type() != QSqlError::NoError)
    {
      *message = cfq.lastError().text();
      if (! externaltxn)
      {
        rollbackq.exec();
        QMessageBox::critical(this, tr("Database Error"), *message);
      }
      else
        qWarning("%s", qPrintable(*message));
      return false;
    }
    else if (procresult < 0)
    {
      *message = storedProcErrorLookup(procname, procresult);
      if (! externaltxn)
      {
        rollbackq.exec();
        QMessageBox::critical(this, tr("Processing Error"), *message);
      }
      else
        qWarning("%s", qPrintable(*message));
      return false;
    }
  }

  if (! externaltxn)
    XSqlQuery commitq("COMMIT;");
  return true;
}
Exemple #21
0
QDate MonthlyRecurrence::prevOccurrence(const QDate &date, bool include_equals) const {
	const KCalendarSystem *calSys = KGlobal::locale()->calendar();
	if(!include_equals) {
		if(date > endDate()) return lastOccurrence();
	}
	QDate prevdate = date;
	if(!include_equals) prevdate = calSys->addDays(prevdate, -1);
	if(prevdate < startDate()) return QDate();
	if(prevdate == startDate()) return startDate();
	int prevday = -1;
	if(i_frequency != 1 && calSys->month(prevdate) != calSys->month(startDate())) {
		int i = months_between_dates(startDate(), prevdate) % i_frequency;
		if(i != 0) {
			if(i > 1) prevday = 1;
			else prevday = calSys->day(prevdate);
			prevdate = calSys->addMonths(prevdate, -i);
			calSys->setYMD(prevdate, calSys->year(prevdate), calSys->month(prevdate), calSys->daysInMonth(prevdate));
		}
	}
	if(calSys->month(prevdate) == calSys->month(startDate())) return startDate();
	int day = i_day;
	if(i_dayofweek > 0) day = get_day_in_month(prevdate, i_week, i_dayofweek);
	else if(i_day < 1) day = calSys->daysInMonth(prevdate) + i_day;
	if(wh_weekendhandling == WEEKEND_HANDLING_BEFORE) {
		QDate date;
		calSys->setYMD(date, calSys->year(prevdate), calSys->month(prevdate), day);
		int wday = calSys->dayOfWeek(date);
		if(wday == 6) day -= 1;
		else if(wday == 7) day -= 2;
		if(day <= 0) {
			prevdate = calSys->addMonths(prevdate, -1);
			day = calSys->daysInMonth(prevdate) + day;
		}
	} else if(wh_weekendhandling == WEEKEND_HANDLING_AFTER) {
		QDate date;
		calSys->setYMD(date, calSys->year(prevdate), calSys->month(prevdate), day);
		int wday = calSys->dayOfWeek(date);
		if(wday == 6) day += 2;
		else if(wday == 7) day += 1;
		if(day > calSys->daysInMonth(prevdate) && prevday > 0 && prevday >= day - calSys->daysInMonth(prevdate)) {
			day -= calSys->daysInMonth(prevdate);
			prevdate = calSys->addMonths(prevdate, 1);
			calSys->setYMD(prevdate, calSys->year(prevdate), calSys->month(prevdate), day);
		}
	}
	if(day <= 0 || calSys->day(prevdate) < day) {
		do {
			if(i_frequency > 1) prevday = 1;
			else prevday = calSys->day(prevdate);
			prevdate = calSys->addMonths(prevdate, -i_frequency);
			if(calSys->month(prevdate) == calSys->month(startDate())) return startDate();
			if(calSys->month(prevdate) < calSys->month(startDate())) return QDate();
			day = i_day;
			if(i_dayofweek > 0) day = get_day_in_month(prevdate, i_week, i_dayofweek);
			else if(i_day < 1) day = calSys->daysInMonth(prevdate) + i_day;
			if(wh_weekendhandling == WEEKEND_HANDLING_BEFORE) {
				QDate date;
				calSys->setYMD(date, calSys->year(prevdate), calSys->month(prevdate), day);
				int wday = calSys->dayOfWeek(date);
				if(wday == 6) day -= 1;
				else if(wday == 7) day -= 2;
				if(day <= 0) {
					prevdate = calSys->addMonths(prevdate, -1);
					day = calSys->daysInMonth(prevdate) + day;
				}
			} else if(wh_weekendhandling == WEEKEND_HANDLING_AFTER) {
				QDate date;
				calSys->setYMD(date, calSys->year(prevdate), calSys->month(prevdate), day);
				int wday = calSys->dayOfWeek(date);
				if(wday == 6) day += 2;
				else if(wday == 7) day += 1;
				if(day > calSys->daysInMonth(prevdate) && prevday > 0 && prevday >= day - calSys->daysInMonth(prevdate)) {
					day -= calSys->daysInMonth(prevdate);
					prevdate = calSys->addMonths(prevdate, 1);
					calSys->setYMD(prevdate, calSys->year(prevdate), calSys->month(prevdate), day);
				} else {
					calSys->setYMD(prevdate, calSys->year(prevdate), calSys->month(prevdate), calSys->daysInMonth(prevdate));
				}
			}
		} while(day <= 0 || day > calSys->daysInMonth(prevdate));
	}
	calSys->setYMD(prevdate, calSys->year(prevdate), calSys->month(prevdate), day);
	if(prevdate < startDate()) return QDate();
	if(hasException(prevdate)) return prevOccurrence(prevdate);
	return prevdate;
}