var dataQry = QueryNew("temp"); /* TODO: Determine if we need to filter the buildRecurrenceDateTimeQuery during the build process */ var dateTimeQry = application.ptCalendar.calEventRecurrenceService.buildRecurrenceDateTimeQuery( eventID=arguments.eventID ,recurrenceID=arguments.recurrenceID ,removeExceptions=arguments.removeExceptions ); /*startDate=arguments.startDate ,enddate=arguments.enddate*/ SELECT * FROM dateTimeQry WHERE 1 = 1 AND calEventID = AND recurrenceID = AND CAST( dateTimeQry.eventDate AS DATE ) BETWEEN CAST( AS DATE ) AND CAST( AS DATE ) AND CAST( dateTimeQry.eventDate AS DATE ) >= CAST( AS DATE ) AND dtHashID = ORDER BY eventDate, AllDay DESC, StartTime // Get the data from the Recurrence Properties VIEW var dataQry = QueryNew("temp"); // Get the dateTime field for the query columns var dateTimeColNameStruct = application.ptCalendar.calEventDateTimeDAO.getDateTimeQueryColumnListStruct(); var newQryColList = dateTimeColNameStruct.columnNames; var newQryDataTypes = dateTimeColNameStruct.dataTypes; var newQry = QueryNew(newQryColList,newQryDataTypes); var datetimeQry = QueryNew("temp"); var rcItm = 1; var dtItm = 1; var c = 1; var recID = ""; var temp = ""; var qRowCnt = 0; var createQryRow = true; var startDateCheck = 0; var endDateCheck = 0; // None of the following feilds are required for the getRecurrenceQuery method: // recurrenceID - Creates the standardize date/time query from the returned record // eventID - Creates the standardize date/time query from the returned record (ready if event are allow to have multiple recurrence records) // StartDate - if a startDate is passed in the pass it to the getRecurrenceQuery to set the experationDate and only get back records // that have not expired (rangeEndDate is not passed) and all the records that have a rangeQuantity // EndDate - Not used in the getRecurrenceQuery ... at this time dataQry = application.ptCalendar.calEventRecurrenceDAO.getRecurrenceQuery( recurrenceID=arguments.recurrenceID ,eventID=arguments.eventID ,startDate=arguments.startDate ,endDate=arguments.endDate ); // Loop over the records in the recurrence properties query for ( rcItm=1; rcItm LTE dataQry.RecordCount; rcItm=rcItm+1 ) { // set the recID to the current uniqueID from the recurrence properties recID = dataQry["uniqueID"][rcItm]; // build out the dates/time query set for ONE recurrence properties record datetimeQry = application.ptCalendar.calEventRecurrenceService.buildRecurrenceDateTimeQueryByID( recurrenceID=recID ,removeExceptions=arguments.removeExceptions ); // Loop over the generated data/time records query for ( dtItm=1; dtItm LTE datetimeQry.RecordCount; dtItm=dtItm+1 ) { // Allow all rows to be created unless a startdate and enddate or startdate were provided createQryRow = true; // Filter row creation by the startDate and endDate if ( LEN(TRIM(arguments.startDate)) AND LEN(TRIM(arguments.endDate)) ) { startDateCheck = DateCompare(datetimeQry["eventdate"][dtItm],arguments.startDate); endDateCheck = DateCompare(datetimeQry["eventdate"][dtItm],arguments.endDate); if ( startDateCheck GTE 0 AND endDateCheck LTE 0 ) createQryRow = true; else createQryRow = false; } // Filter row creation by the startDate only else if ( LEN(TRIM(arguments.startDate)) ) { startDateCheck = DateCompare(datetimeQry["eventdate"][dtItm],arguments.startDate); if ( startDateCheck GTE 0 ) createQryRow = true; else createQryRow = false; } // Before creating the next query row make sure the createQryRow is true (does the new record have valid date) if ( createQryRow ) { temp = QueryAddRow( newQry ); qRowCnt = qRowCnt + 1; for ( c=1; c LTE ListLen(newQryColList); c=c+1) { colName = ListGetAt(newQryColList,c); if ( StructKeyExists(datetimeQry,colName) AND LEN(TRIM(datetimeQry[ colName ][ dtItm ])) ) { temp = QuerySetCell(newQry, colName, datetimeQry[ colName ][ dtItm ], qRowCnt); //newQry[ colName ][ qRowCnt ] = datetimeQry[ colName ][ dtItm ]; } else { temp = QuerySetCell(newQry, colName, "", qRowCnt); //newQry[ colName ][ qRowCnt ] = ""; } } } } } return newQry; var recurrenceQry = QueryNew("temp"); var dataQry = QueryNew("temp"); var rowDataStruct = StructNew(); var dateDataArray = ArrayNew(1); var newDateArray = ArrayNew(1); var recurrenceData = StructNew(); var exclHashIDlist = ""; // Get the recurrence data for the passed in recurrenceID if ( LEN(TRIM(arguments.recurrenceID)) ) { // Get the recurrence data by the recurrenceID (uniqueID) recurrenceQry = application.ptCalendar.calEventRecurrenceDAO.getRecurrenceQuery(recurrenceID=arguments.recurrenceID); } // if data exists process it and build recurrence date/time query if ( recurrenceQry.RecordCount ) { // Get the data from the first row of the query as a structure recurrenceData = application.ptCalendar.data.queryRowToStruct(query=recurrenceQry,rowNum=1); // Build a clean tmpData struct from recurrenceData values //recurrenceData = application.ptCalendar.recurrenceBuilderService.buildCleanRecurrenceData(rowDataStruct); // Excluded HashID list if ( StructKeyExists(recurrenceData,"excludedDThashIDlist") AND LEN(TRIM(recurrenceData.excludedDThashIDlist)) ) exclHashIDlist = recurrenceData.excludedDThashIDlist; // Build Event Date array based on patternType switch(recurrenceData.patternType) { case "Daily": dateDataArray = createDailyDateTimeArray(recurrenceData); break; case "Weekly": dateDataArray = createWeeklyDateTimeArray(recurrenceData); break; case "Monthly": dateDataArray = createMonthlyDateTimeArray(recurrenceData); break; case "Yearly": dateDataArray = createYearlyDateTimeArray(recurrenceData); break; } // Send the dateDataArray to the createDateTimeQueryFromDates to build the Query dataQry = createDateTimeQueryFromDates( recurrenceData=recurrenceData ,dateArray=dateDataArray ,startDate=arguments.startDate ,endDate=arguments.endDate ,appdebug=arguments.appdebug ); } SELECT * FROM dataQry WHERE var currData = arguments.recurrenceData; var newDateArray = arguments.dateArray; // Get the dateTime fields for the query columns var dateTimeColNameStruct = application.ptCalendar.calEventDateTimeDAO.getDateTimeQueryColumnListStruct(); var dateTimeQryColList = dateTimeColNameStruct.columnNames; var dateTimeQryDataTypes = dateTimeColNameStruct.dataTypes; var dataQry = QueryNew(dateTimeQryColList,dateTimeQryDataTypes); var itm = 1; var x = 1; var h = 1; var dummyDate = getTimeDummyDate(); var dummyDayBeginTime = getDayBeginTime(); var dummyDayEndTime = getDayEndTime(); var csEventDateTimeStamp = ""; var endDateTimeStamp = ""; var startDateCheck = 0; var endDateCheck = 0; var temp = QueryNew("temp"); var createQryRow = false; var qRowCnt = 0; var recurrenceID = ""; var calEventID = ""; var recurStartTime = ""; var recurEndTime = ""; var recurAllDay = ""; //var exclHashIDlist = ""; // Extra fields for debugging recurrence patterns var debugQueryFields = "EventDateFull,EVENTDATETIMESTAMP"; var debugQueryDataTypes = "varchar,date"; // Add the extra date/time field names and dataTypes for better visualization of the converted data if ( arguments.appdebug ) { for ( x=1; x LTE ListLen(debugQueryFields); x=x+1 ) { dateTimeQryColList = ListAppend(dateTimeQryColList,ListGetAt(debugQueryFields,x)); dateTimeQryDataTypes = ListAppend(dateTimeQryDataTypes,ListGetAt(debugQueryDataTypes,x)); dataQry = QueryNew(dateTimeQryColList,dateTimeQryDataTypes); } } // Set the recurrenceID column to the the recurrence records uniqueID if ( StructKeyExists(currData,"uniqueID") ) recurrenceID = currData.uniqueID; // Set the calEventID column to the the recurrence records calEventID if ( StructKeyExists(currData,"calEventID") ) calEventID = currData.calEventID; // Set the recurAllDay, recurStartTime and recurEndTime based on the recurAllDay value if ( StructKeyExists(currData,"recurAllDay") AND currData.recurAllDay EQ 1 ) { recurAllDay = 1; recurStartTime = ""; recurEndTime = ""; } else { recurAllDay = ""; if ( StructKeyExists(currData,"recurStartTime") ) { recurStartTime = application.ptCalendar.date.csDateFormat(dummyDate,currData.recurStartTime); if ( StructKeyExists(currData,"recurEndTime") AND LEN(TRIM(currData.recurEndTime)) ) recurEndTime = application.ptCalendar.date.csDateFormat(dummyDate,currData.recurEndTime); } } // Moved this FILTER up to the buildRecurrenceDateTimeQueryByID) // Excluded HashID list //if ( StructKeyExists(currData,"excludedDThashIDlist") AND LEN(TRIM(currData.excludedDThashIDlist)) ) //exclHashIDlist = currData.excludedDThashIDlist; // Create Query records from newDateArray for ( itm=1; itm LTE ArrayLen(newDateArray); itm=itm+1 ) { // Format the date as CS dateTime stamps for the start of the date and for the end of the day csEventDateTimeStamp = application.ptCalendar.date.csDateFormat(newDateArray[itm],dummyDayBeginTime); endDateTimeStamp = application.ptCalendar.date.csDateFormat(newDateArray[itm],dummyDayEndTime); // Allow all rows to be created unless a startdate and enddate or startdate were provided... then do filtering createQryRow = true; // Filter row creation by the startDate and endDate if ( LEN(TRIM(arguments.startDate)) AND LEN(TRIM(arguments.endDate)) ) { startDateCheck = DateCompare(csEventDateTimeStamp,arguments.startDate); endDateCheck = DateCompare(endDateTimeStamp,arguments.endDate); if ( startDateCheck GTE 0 AND endDateCheck LTE 0 ) createQryRow = true; else createQryRow = false; } // Filter row creation by the startDate only else if ( LEN(TRIM(arguments.startDate)) ) { startDateCheck = DateCompare(csEventDateTimeStamp,arguments.startDate); if ( startDateCheck GTE 0 ) createQryRow = true; else createQryRow = false; } // NOTE: Moved the following FILTER up to the buildRecurrenceDateTimeQueryByID // - Should be faster do a NOT IN in a QofQs instead of LOOPING over the validateHashID method // Filter row creation by the excluded dtHashID list in the Recurrence Properties list /* if ( LEN(TRIM(exclHashIDlist)) ) { createQryRow = true; for ( h=1; h LTE ListLen(exclHashIDlist); h=h+1 ) { // Check to see if the any of the HashIDs in the list match the current values for the event date/time record // - if an ID is found to not generate the row in the query hashIDcheck = application.ptCalendar.validateHashID(ListGetAt(exclHashIDlist,h), calEventID, recurrenceID, csEventDateTimeStamp, recurStartTime, recurEndTime, recurAllDay); if ( hashIDcheck ) { createQryRow = false; break; } } } */ // Before creating the next query row make sure the createQryRow is true (does the new record have valid date) if ( createQryRow ) { temp = QueryAddRow( dataQry ); qRowCnt = qRowCnt + 1; // Set the dateTimeID column to a new UUID (currData DOES NOT have a dateTimeID to pass in) // TODO: May not be needed since this value is only valid if using the Events Cache value otherwise it updates every time //temp = QuerySetCell( dataQry, "dateTimeID", CreateUUID(), qRowCnt ); // IMPORTANT: DO NOT GIVE RECURRENCE DATETIME RECORDS A DATETIMEID untill are recurrence exceptions and are moved to the DateTime Element // But they need to have the column in the Query for standarized data format for the UNION of Recurrence DateTime and Static DateTime records temp = QuerySetCell( dataQry, "dateTimeID", "", qRowCnt ); // Generate the HashID from specific fields are not dynamic (ie. do not use 'dateTimeID') // - This value should be unique and static even if calling directly and not using the Events Cache newHashID = application.ptCalendar.buildHashID(calEventID, recurrenceID, csEventDateTimeStamp, recurStartTime, recurEndTime, recurAllDay); temp = QuerySetCell( dataQry, "dtHashID", newHashID, qRowCnt ); // Set the recurrenceID column to the recurrence records ( aka. the uniqueID) temp = QuerySetCell( dataQry, "recurrenceID", recurrenceID, qRowCnt ); // Set the calEventID column to the recurrence records calEventID value temp = QuerySetCell( dataQry, "calEventID", calEventID, qRowCnt ); // Set the eventDate column to the csEventDateTimeStamp value temp = QuerySetCell( dataQry, "eventDate", csEventDateTimeStamp, qRowCnt ); // Set the startTime column to the recurStartTime value temp = QuerySetCell( dataQry, "startTime", recurStartTime, qRowCnt ); // Set the endTime column to the recurEndTime value temp = QuerySetCell( dataQry, "endTime", recurEndTime, qRowCnt ); // Set the allDay column to the recurAllDay value temp = QuerySetCell( dataQry, "allDay", recurAllDay, qRowCnt ); // Add in the extra date/time fields (ie, a full data/time stamp for better visualization of the converted recurrence pattern) if ( arguments.appdebug ) { temp = QuerySetCell( dataQry, "EVENTDATEFULL", DateFormat(csEventDateTimeStamp,"full"), qRowCnt ); temp = QuerySetCell( dataQry, "EVENTDATETIMESTAMP", csEventDateTimeStamp, qRowCnt ); } } } return dataQry; var tmpData = arguments.recurrenceData; var newDate = ""; var dateArray = ArrayNew(1); var itm = 1; var r = 1; var errorMsg = ""; var errorData = StructNew(); try { // Make sure we are only processing daily recurrence data if ( tmpData.patternType EQ "Daily") { // daily - pattern options if ( tmpData.patternOption EQ "EveryXDays" ) { // Add the Start Date as the first date in the recurrence newDate = tmpData.rangeStartDate; if ( application.ptCalendar.date.IsRealDate(newDate) ) ArrayAppend(dateArray,newDate); // If no patternDayQty is defined the make the event everyday of the week if ( NOT IsNumeric(tmpData.patternDayQty) OR tmpData.patternDayQty LT 1 ) tmpData.patternDayQty = 1; // Create the date Array based on the Range End Type if ( application.ptCalendar.date.IsRealDate(newDate) AND tmpData.rangeEndType EQ "EndDate" AND application.ptCalendar.date.IsRealDate(tmpData.rangeEndDate) ) { // End Date while ( newDate LT tmpData.rangeEndDate ) { newDate = DateAdd("d",tmpData.patternDayQty,newDate); // Make sure the dates added to the date array are not greater than the enddate if ( newDate LTE tmpData.rangeEndDate ) ArrayAppend(dateArray,newDate); } } else if ( application.ptCalendar.date.IsRealDate(newDate) AND tmpData.rangeEndType EQ "EndQuantity" AND IsNumeric(tmpData.rangeQuantity) ) { // End Quantity while ( ArrayLen(dateArray) LT tmpData.rangeQuantity ) { newDate = DateAdd("d",tmpData.patternDayQty,newDate); ArrayAppend(dateArray,newDate); } } } else if ( tmpData.patternOption EQ "EveryWeekday" ) { // Add the Start Date as the first date in the recurrence newDate = tmpData.rangeStartDate; if ( application.ptCalendar.date.IsRealDate(newDate) AND DayOfWeek(newDate) GT 1 AND DayOfWeek(newDate) LT 7 ) ArrayAppend(dateArray,newDate); // Create the date Array based on the Range End Type if ( application.ptCalendar.date.IsRealDate(newDate) AND tmpData.rangeEndType EQ "EndDate" AND application.ptCalendar.date.IsRealDate(tmpData.rangeEndDate) ) { // End Date while (newDate LT tmpData.rangeEndDate) { newDate = DateAdd("d",1,newDate); if ( DayOfWeek(newDate) GT 1 AND DayOfWeek(newDate) LT 7 ) ArrayAppend(dateArray,newDate); } } else if ( application.ptCalendar.date.IsRealDate(newDate) AND tmpData.rangeEndType EQ "EndQuantity" AND IsNumeric(tmpData.rangeQuantity) ) { // End Quantity while ( ArrayLen(dateArray) LT tmpData.rangeQuantity ) { newDate = DateAdd("d",1,newDate); if ( DayOfWeek(newDate) GT 1 AND DayOfWeek(newDate) LT 7 ) ArrayAppend(dateArray,newDate);; } } } } //END - createDailyDateTimeArray } catch ( any e ) { errorMsg = "Error: Unable to create the Daily DateTime Array"; errorData.data = arguments.recurrenceData; errorData.details = e; doErrorLogging("calEventRecurrenceService-Daily","createDailyDateTimeArray",errorData,errorMsg,"ptCalendar"); } return dateArray; var tmpData = arguments.recurrenceData; var newDate = ""; var fowDate = ""; var dateArray = ArrayNew(1); var itm = 1; var r = 1; var w = 1; var errorMsg = ""; var errorData = StructNew(); try { // Make sure we are only processing weekly recurrence data if ( tmpData.patternType EQ "Weekly") { // weekly - pattern options // 1) Set the Start Date // 2) Find the first of the week date (from the start date) // 3) Find the First selected Day after the select start date // 4) Loop over rangeQuantity or rangeEndDate // - Loop over the Days of the Week inside the rangeEndType // Set the start date ... but it may not be the start of the dateArray series newDate = tmpData.rangeStartDate; if ( LEN(TRIM(newDate)) AND application.ptCalendar.date.IsRealDate(newDate) ) { // Get the First of the Week date from the Start Date fowDate = application.ptCalendar.date.firstDayOfWeek(newDate); // set the First of the Week date as the newDate newDate = fowDate; // Create the date Array based on the Range End Type if ( tmpData.rangeEndType EQ "EndDate" AND LEN(TRIM(tmpData.rangeEndDate)) ) { // End Date while (newDate LT tmpData.rangeEndDate) { // Loop over the days of the current week for ( w=1; w LTE 7; w=w+1 ) { // if the day is a selected day of the week and is greater than or equal to the start date add it to the array if ( ListFindNoCase(tmpData.patternDOW,DayOfWeek(newDate)) AND newDate GTE tmpData.rangeStartDate AND newDate LTE tmpData.rangeEndDate ) { // Add this Date to the dateArray arrayAppend(dateArray,newDate); } // Create the date for the next day of the week newDate = DateAdd("d",1,newDate); } // Get the next First of the Week date from the last First of the Week date fowDate = application.ptCalendar.date.getNextFirstOfWeekDate(inDate=fowDate,addQty=tmpData.patternWeekQty); // set the next First of the Week date as the newDate for the next loop pass newDate = fowDate; } } else if ( tmpData.rangeEndType EQ "EndQuantity" AND LEN(TRIM(tmpData.rangeQuantity)) ) { // End Quantity while ( ArrayLen(dateArray) LT tmpData.rangeQuantity ) { // loop over each day of the current week for ( w=1; w LTE 7; w=w+1 ) { // if the day is a selected day of the week and is greater than or equal to the start date add it to the array if ( ListFindNoCase(tmpData.patternDOW,DayOfWeek(newDate)) AND newDate GTE tmpData.rangeStartDate ) { // Add this Date to the dateArra arrayAppend(dateArray,newDate); } // Create the date for the next day of the week newDate = DateAdd("d",1,newDate); } // Get the next First of the Week date from the last First of the Week date fowDate = application.ptCalendar.date.getNextFirstOfWeekDate(inDate=fowDate,addQty=tmpData.patternWeekQty); // set the next First of the Week date as the newDate for the next loop pass newDate = fowDate; } } } } //END - createWeeklyDateTimeArray } catch ( any e ) { errorMsg = "Error: Unable to create the Weekly DateTime Array"; errorData.data = arguments.recurrenceData; errorData.details = e; doErrorLogging("calEventRecurrenceService-Weekly","createWeeklyDateTimeArray",errorData,errorMsg,"ptCalendar"); } return dateArray; var tmpData = arguments.recurrenceData; var dateArray = ArrayNew(1); var newDate = ""; var fomDate = ""; var lomDate = ""; var errorMsg = ""; var errorData = StructNew(); try { // Make sure we are only processing Monthly recurrence data if ( tmpData.patternType EQ "Monthly") { // Set the start date... but it may not be the start of the dateArray series newDate = tmpData.rangeStartDate; // monthly - pattern options if ( tmpData.patternOption EQ "MonthlyDayX" ) { // Create the date for the first occurrence if ( LEN(TRIM(tmpData.patternMonthlyDayNumber)) ) newDate = CreateDate(Year(newDate),Month(newDate),tmpData.patternMonthlyDayNumber); else newDate = CreateDate(Year(newDate),Month(newDate),1); // Create the date Array based on the Range End Type if ( tmpData.rangeEndType EQ "EndDate" AND LEN(TRIM(tmpData.rangeEndDate)) ) { // End Date while ( newDate LTE tmpData.rangeEndDate ) { if ( newDate GTE tmpData.rangeStartDate ) //AND newDate LT tmpData.rangeEndDate ArrayAppend(dateArray,newDate); // Create the date for the next month newDate = DateAdd("m",tmpData.patternMonthQty,newDate); } } else if ( tmpData.rangeEndType EQ "EndQuantity" AND LEN(TRIM(tmpData.rangeQuantity)) ) { // End Quantity while ( ArrayLen(dateArray) LT tmpData.rangeQuantity ) { if ( newDate GTE tmpData.rangeStartDate ) ArrayAppend(dateArray,newDate); // Create the date for the next month newDate = DateAdd("m",tmpData.patternMonthQty,newDate); } } } else if ( tmpData.patternOption EQ "MonthlyXY" ) { // Monthly on the XY pattern date creation if ( tmpData.patternMonthlyDayOrdinal EQ "first" ) { // Get the Last day of the month for the selected start date fomDate = application.ptCalendar.date.firstOfMonth(Month(newDate),Year(newDate)); // set the Frist of the Month date as the newDate newDate = fomDate; // Create the date Array based on first of the month dates and the Range End Type if ( tmpData.rangeEndType EQ "EndDate" AND LEN(TRIM(tmpData.rangeEndDate)) ) { // End Date while ( newDate LTE tmpData.rangeEndDate ) { if ( newDate GTE tmpData.rangeStartDate ) //AND newDate LT tmpData.rangeEndDate ArrayAppend(dateArray,newDate); // Create the date for the next month newDate = DateAdd("m",tmpData.patternMonthQty,newDate); newDate = application.ptCalendar.date.firstOfMonth(Month(newDate),Year(newDate)); } } else if ( tmpData.rangeEndType EQ "EndQuantity" AND LEN(TRIM(tmpData.rangeQuantity)) ) { // End Quantity while ( ArrayLen(dateArray) LT tmpData.rangeQuantity ) { if ( newDate GTE tmpData.rangeStartDate ) ArrayAppend(dateArray,newDate); // Create the date for the next month newDate = DateAdd("m",tmpData.patternMonthQty,newDate); newDate = application.ptCalendar.date.firstOfMonth(Month(newDate),Year(newDate)); } } } else if ( tmpData.patternMonthlyDayOrdinal EQ "last" ) { // Get the Last day of the month for the selected start date lomDate = application.ptCalendar.date.lastOfMonth(Month(newDate),Year(newDate)); // set the Last of the Month date as the newDate newDate = lomDate; // Create the date Array based on last of the month dates and the Range End Type if ( tmpData.rangeEndType EQ "EndDate" AND LEN(TRIM(tmpData.rangeEndDate)) ) { // End Date while ( newDate LTE tmpData.rangeEndDate ) { if ( newDate GTE tmpData.rangeStartDate ) //AND newDate LT tmpData.rangeEndDate ArrayAppend(dateArray,newDate); // Create the date for the next month newDate = DateAdd("m",tmpData.patternMonthQty,newDate); newDate = application.ptCalendar.date.lastOfMonth(Month(newDate),Year(newDate)); } } else if ( tmpData.rangeEndType EQ "EndQuantity" AND LEN(TRIM(tmpData.rangeQuantity)) ) { // End Quantity while ( ArrayLen(dateArray) LT tmpData.rangeQuantity ) { if ( newDate GTE tmpData.rangeStartDate ) ArrayAppend(dateArray,newDate); // Create the date for the next month newDate = DateAdd("m",tmpData.patternMonthQty,newDate); newDate = application.ptCalendar.date.lastOfMonth(Month(newDate),Year(newDate)); } } } } } //END - createMonthlyDateTimeArray } catch ( any e ) { errorMsg = "Error: Unable to create the Monthly DateTime Array"; errorData.data = arguments.recurrenceData; errorData.details = e; doErrorLogging("calEventRecurrenceService-Monthly","createMonthlyDateTimeArray",errorData,errorMsg,"ptCalendar"); } return dateArray; var tmpData = arguments.recurrenceData; var dateArray = ArrayNew(1); var newDate = ""; var errorMsg = ""; var errorData = StructNew(); try { // Make sure we are only processing Yearly recurrence data if ( tmpData.patternType EQ "Yearly") { // Set the start date... but it may not be the start of the dateArray series newDate = tmpData.rangeStartDate; // yearly - pattern options if ( tmpData.patternOption EQ "YearlyXY" ) { // Create the date for the first occurrence if ( LEN(TRIM(tmpData.patternYearlyMonth)) AND LEN(TRIM(tmpData.patternYearlyDayNumber)) ) newDate = CreateDate(Year(newDate),tmpData.patternYearlyMonth,tmpData.patternYearlyDayNumber); // Create the date Array based on the Range End Type if ( tmpData.rangeEndType EQ "EndDate" AND LEN(TRIM(tmpData.rangeEndDate)) ) { // End Date while ( newDate LTE tmpData.rangeEndDate ) { if ( newDate GTE tmpData.rangeStartDate ) //AND newDate LT tmpData.rangeEndDate ArrayAppend(dateArray,newDate); // Create the date for the next year newDate = DateAdd("yyyy",tmpData.patternYearQty,newDate); } } else if ( tmpData.rangeEndType EQ "EndQuantity" AND LEN(TRIM(tmpData.rangeQuantity)) ) { // End Quantity while ( ArrayLen(dateArray) LT tmpData.rangeQuantity ) { if ( newDate GTE tmpData.rangeStartDate ) ArrayAppend(dateArray,newDate); // Create the date for the next year newDate = DateAdd("yyyy",tmpData.patternYearQty,newDate); } } } else if ( tmpData.patternOption EQ "YearlyXYofZ" ) { // Yearly on the XY of the Z pattern date creation if ( tmpData.patternYearlyDayOrdinal EQ "first" ) { // set the Frist of the Month date as the newDate newDate = application.ptCalendar.date.firstOfMonth(tmpData.patternYearlyWeekDayMonth,Year(newDate)); } else if ( tmpData.patternYearlyDayOrdinal EQ "last" ) { // Get the Last day of the month for the selected start date newDate = application.ptCalendar.date.lastOfMonth(tmpData.patternYearlyWeekDayMonth,Year(newDate)); } // make sure the first newDate is greater than the rangeStartDate if ( newDate LT tmpData.rangeStartDate ) { newDate = application.ptCalendar.date.getNextYearOrdinalDayDate( inYear=Year(newDate) ,inMonth=Month(newDate) ,inDay=Day(newDate) ,ordinalDay=tmpData.patternYearlyDayOrdinal ,addQty=1 ); } // Create the date Array based on the Range End Type if ( tmpData.rangeEndType EQ "EndDate" AND LEN(TRIM(tmpData.rangeEndDate)) ) { // End Date while ( newDate LTE tmpData.rangeEndDate ) { if ( newDate GTE tmpData.rangeStartDate ) //AND newDate LT tmpData.rangeEndDate ArrayAppend(dateArray,newDate); // Create the date for the next X year(s) newDate = application.ptCalendar.date.getNextYearOrdinalDayDate( inYear=Year(newDate) ,inMonth=Month(newDate) ,inDay=Day(newDate) ,ordinalDay=tmpData.patternYearlyDayOrdinal ,addQty=tmpData.patternYearQty ); /* // Create the date for the next year newDate = DateAdd("yyyy",tmpData.patternYearQty,newDate); // before the next loop make sure the next years date is either the first or the last of the month if ( tmpData.patternYearlyDayOrdinal EQ "first" ) { // set the First of the Month date as the newDate newDate = application.ptCalendar.date.firstOfMonth(tmpData.patternYearlyWeekDayMonth,Year(newDate)); } else if ( tmpData.patternYearlyDayOrdinal EQ "last" ) { // set the Last of the Month date as the newDate newDate = application.ptCalendar.date.lastOfMonth(tmpData.patternYearlyWeekDayMonth,Year(newDate)); } */ } } else if ( tmpData.rangeEndType EQ "EndQuantity" AND LEN(TRIM(tmpData.rangeQuantity)) ) { // End Quantity while ( ArrayLen(dateArray) LT tmpData.rangeQuantity ) { if ( newDate GTE tmpData.rangeStartDate ) ArrayAppend(dateArray,newDate); // Create the date for the next X year(s) newDate = application.ptCalendar.date.getNextYearOrdinalDayDate( inYear=Year(newDate) ,inMonth=Month(newDate) ,inDay=Day(newDate) ,ordinalDay=tmpData.patternYearlyDayOrdinal ,addQty=tmpData.patternYearQty ); /* // Create the date for the next year newDate = DateAdd("yyyy",tmpData.patternYearQty,newDate); // before the next loop make sure the next years date is either the first or the last of the month if ( tmpData.patternYearlyDayOrdinal EQ "first" ) { // set the First of the Month date as the newDate newDate = application.ptCalendar.date.firstOfMonth(tmpData.patternYearlyWeekDayMonth,Year(newDate)); } else if ( tmpData.patternYearlyDayOrdinal EQ "last" ) { // set the Last of the Month date as the newDate newDate = application.ptCalendar.date.lastOfMonth(tmpData.patternYearlyWeekDayMonth,Year(newDate)); } */ } } } } //END - createYearlyDateTimeArray } catch ( any e ) { errorMsg = "Error: Unable to create the Yearly DateTime Array"; errorData.data = arguments.recurrenceData; errorData.details = e; doErrorLogging("calEventRecurrenceService-Yearly","createYearlyDateTimeArray",errorData,errorMsg,"ptCalendar"); } return dateArray; var dataArray = ArrayNew(1); var retStatusStruct = StructNew(); var copyStatusStruct = StructNew(); var dataValues = StructNew(); var newData = ""; var itm = 1; if ( LEN(TRIM(arguments.srcUUIDlist)) ) dataArray = application.ptCalendar.recurrenceBuilderDAO.getRecurrence(uniqueID=TRIM(arguments.srcUUIDlist)); for ( itm = 1; itm LTE ArrayLen(dataArray); itm=itm+1 ) { // Reset the dataValues struct dataValues = StructNew(); if ( StructKeyExists(dataArray[itm],"values") ) { // Copy all the values of the existing source record to the destination struct dataValues = dataArray[itm].values; // Update the calEventID of the Destination record with arguments.calEventID from the newly create event dataValues.calEventID = arguments.calEventID; // Create a New UniqueID for the new Destination Record dataValues.uniqueID = CreateUUID(); // Process the CCAPI call to create the new records copyStatusStruct = application.ptCalendar.recurrenceBuilderDAO.recurrenceCCAPI(dataValues); // If the CCAPI create the newEvent record set the newEventID in the return struct if ( copyStatusStruct["CONTENTUPDATED"] IS true ) { // Add the copy status for this iteration to the return struct retStatusStruct[dataValues.uniqueID] = copyStatusStruct; retStatusStruct[dataValues.uniqueID]["calEventID"] = arguments.calEventID; retStatusStruct[dataValues.uniqueID]["newRecurrenceD"] = dataValues.uniqueID; } else { retStatusStruct[dataValues.uniqueID]["msg"] = "failed"; retStatusStruct[dataValues.uniqueID]["CONTENTUPDATED"] = false; retStatusStruct[dataValues.uniqueID]["calEventID"] = arguments.calEventID; retStatusStruct[dataValues.uniqueID]["newRecurrenceD"] = ""; // TODO: Log CCAPI content create failure } } else { // TODO: Log recurrence get issues } } return retStatusStruct; var retStatusStruct = StructNew(); var dataValues = StructNew(); var status = ""; var dataArray = StructNew(); var recurrenceData = StructNew(); retStatusStruct['MSG'] = "failed"; retStatusStruct['CONTENTUPDATED'] = false; retStatusStruct['STATUS'] = status; // Get the Element Record Data for the passed in FeedID dataArray = application.ptCalendar.recurrenceBuilderDAO.getRecurrence( uniqueID=TRIM(arguments.recurrenceID) ); if ( ArrayLen(dataArray) ) recurrenceData = dataArray[1]; if ( StructKeyExists(recurrenceData,"values") ) { // Copy existing values and dataPageID to the dataValues struct dataValues = recurrenceData.values; dataValues.dataPageID = recurrenceData.PageID; if ( StructKeyExists(recurrenceData.values,"excludedDThashIDlist") ) { if ( ListFindNoCase(recurrenceData.values.excludedDThashIDlist,arguments.hashID) EQ 0 ) { dataValues.excludedDThashIDlist = ListAppend(recurrenceData.values.excludedDThashIDlist,arguments.hashID); status = "updated"; } } else { dataValues.excludedDThashIDlist = arguments.hashID; status = "updated"; } } if ( status EQ "updated" ) { // Call the CCAPI to update the element retStatusStruct = application.ptCalendar.recurrenceBuilderDAO.recurrenceCCAPI(dataValues); } if ( retStatusStruct['CONTENTUPDATED'] IS true ) { retStatusStruct['MSG'] = 'success'; retStatusStruct['STATUS'] = status; } return retStatusStruct; var retStatusStruct = StructNew(); var dataValues = StructNew(); var status = ""; var dataArray = StructNew(); var recurrenceData = StructNew(); var idPos = 0; retStatusStruct['MSG'] = "failed"; retStatusStruct['CONTENTUPDATED'] = false; retStatusStruct['STATUS'] = status; // Get the Element Record Data for the passed in FeedID dataArray = application.ptCalendar.recurrenceBuilderDAO.getRecurrence( uniqueID=TRIM(arguments.recurrenceID) ); if ( ArrayLen(dataArray) ) recurrenceData = dataArray[1]; if ( StructKeyExists(recurrenceData,"values") ) { // Copy existing values and dataPageID to the dataValues struct dataValues = recurrenceData.values; dataValues.dataPageID = recurrenceData.PageID; if ( LEN(TRIM(arguments.hashID)) ) { if ( StructKeyExists(recurrenceData.values,"excludedDThashIDlist") ) { idPos = ListFindNoCase(recurrenceData.values.excludedDThashIDlist,arguments.hashID); if ( idPos ) { dataValues.excludedDThashIDlist = ListDeleteAt(recurrenceData.values.excludedDThashIDlist,idPos); status = "removed"; } } } else { dataValues.excludedDThashIDlist = ""; status = "removedAll"; } } if ( status EQ "removed" OR status EQ "removedAll") { // Call the CCAPI to update the element retStatusStruct = application.ptCalendar.recurrenceBuilderDAO.recurrenceCCAPI(dataValues); } if ( retStatusStruct['CONTENTUPDATED'] IS true ) { retStatusStruct['MSG'] = 'success'; retStatusStruct['STATUS'] = status; } return retStatusStruct;