variables.eventDetailsCEName = getEventDetailsCEName();
variables.eventDetailsViewName = getCEViewName(variables.eventDetailsCEName);
variables.eventDateTimeCEName = getEventDateTimeCEName();
variables.eventDateTimeViewName = getCEViewName(variables.eventDateTimeCEName);
var dataQry = QueryNew("temp");
arguments.startDate = TRIM(arguments.startDate);
arguments.endDate = TRIM(arguments.endDate);
arguments.eventID = TRIM(arguments.eventID);
arguments.dateTimeID = TRIM(arguments.dateTimeID);
arguments.hashID = TRIM(arguments.hashID);
if ( LEN(arguments.eventID) NEQ 0 )
{
if ( arguments.useCache )
{
// Get the events from the eventsCache based on a date range
dataQry = application.ptCalendar.calEventsCacheController.getEventsByEventID(eventID=arguments.eventID);
}
else
dataQry = getEventsByEventID(eventID=arguments.eventID);
}
else if ( LEN(arguments.hashID) NEQ 0 )
{
if ( arguments.useCache )
{
// Get the events from the eventsCache based on a date range
dataQry = application.ptCalendar.calEventsCacheController.getEventsByHashID(hashID=arguments.hashID);
}
else
dataQry = getEventsByHashID(hashID=arguments.hashID);
}
else if ( LEN(arguments.dateTimeID) NEQ 0 )
{
if ( arguments.useCache )
{
// Get the events from the eventsCache based on a date range
dataQry = application.ptCalendar.calEventsCacheController.getEventsByDateTimeID(dateTimeID=arguments.dateTimeID);
}
else
dataQry = getEventsByDateTimeID(dateTimeID=arguments.dateTimeID);
}
else if ( LEN(arguments.startdate) NEQ 0 )
{
// Check if future or past dates cache limits are set, and if we need to not use cache to get back non-cached data
// - NOTE - see solution below, using the "re-query with cache disabled" to return non-cacued data for all cases
// - DISABLED - getting back NO results is better that VERY SLOW results
/* if ( arguments.useCache )
{
var dateTimeStamp = Now();
var futureYears = getCacheMaxFutureYears();
var pastYears = getCacheMaxPastYears();
var pastMonths = 0;
var futureMonths = 0;
var startCacheDate = "";
var endCacheDate = "";
// Calculate the Cache start and enddates
if ( IsNumeric(pastYears) AND pastYears GT 0 )
{
pastMonths = Round(pastYears * 12);
startCacheDate = DateAdd("m",-(pastMonths),dateTimeStamp);
// Make sure we have the first day of the month for the past limit
startCacheDate = application.ptCalendar.date.firstOfMonth(inMonth=Month(startCacheDate),inYear=Year(startCacheDate));
if ( arguments.startDate LT startCacheDate )
arguments.useCache = false;
}
if ( LEN(arguments.endDate) NEQ 0 )
{
if ( IsNumeric(futureYears) AND futureYears GT 0 )
{
futureMonths = Round(futureYears * 12);
endCacheDate = DateAdd("m",futureMonths,dateTimeStamp);
// Make sure we have the last day of the month for the future limit
endCacheDate = application.ptCalendar.date.lastOfMonth(inMonth=Month(endCacheDate),inYear=Year(endCacheDate));
if ( arguments.endDate GT endCacheDate )
arguments.useCache = false;
}
}
}*/
if ( arguments.useCache )
{
// Get Events from the eventsCache based on a date range
dataQry = application.ptCalendar.calEventsCacheController.getEventsByDateRange(
startDate = arguments.startDate
,endDate = arguments.endDate
);
}
else
{
// Get Events based on a date range
dataQry = getEventsByDateRange(
startDate = arguments.startDate
,endDate = arguments.endDate
);
}
}
else
{
if ( arguments.useCache )
{
// Get Events from the eventsCache
dataQry = application.ptCalendar.calEventsCacheController.getEvents();
}
else
{
// Get Events
dataQry = getEventsUnion();
}
}
// Check if future or past dates cache limits are set, and if we need to run the events query again to get non-cached data
// - DISABLED - getting back NO results is better that VERY SLOW results
/*
var futureYears = getCacheMaxFutureYears();
var pastYears = getCacheMaxPastYears();
// if useCache=true ... but no data is returned... try again with useCache=false
if ( arguments.useCache AND dataQry.RecordCount EQ 0 AND (futureYears NEQ 0 OR pastYears NEQ 0) )
{
arguments.useCache = false;
dataQry = getEvents(argumentCollection=arguments);
}
*/
return dataQry;
var dataQry = QueryNew("tmp");
var dateTimeQry = application.ptCalendar.calEventDetailsDAO.getEventDetailsDateTimeJoinQuery(
startDate=TRIM(arguments.startDate)
,enddate=TRIM(arguments.enddate)
,eventID=TRIM(arguments.eventID)
,dateTimeID=TRIM(arguments.dateTimeID)
,hashID=TRIM(arguments.hashID)
);
var recurrenceQry = application.ptCalendar.calEventDetailsDAO.getEventDetailsRecurrenceJoinQuery(
startDate=TRIM(arguments.startDate)
,enddate=TRIM(arguments.enddate)
,eventID=TRIM(arguments.eventID)
,dateTimeID=TRIM(arguments.dateTimeID)
,hashID=TRIM(arguments.hashID)
);
SELECT *
FROM dateTimeQry
WHERE dateTimeID =
UNION ALL
SELECT *
FROM recurrenceQry
WHERE dateTimeID =
ORDER BY EVENTDATE ASC, ALLDAY DESC, STARTTIME ASC
errorMsg = "calEventsDAO.getEventsUnion() Query of Queries failed. If using ACF 2018 or ACF 2021 please request and install the QofQ patch from Adobe Support (cfsup@adobe.com) or apply ACF updates greater than 2018 Update 13 or 2021 Update 3.";
// Must use the CommonSpot logger here, Using the ADF to log errors breaks this this function is called during an ADF reset
Server.CommonSpot.addLogEntry(errorMsg,CFCatch);
//application.ADF.log.addLogEntry(message=errorMsg,CFCatch=cfcatch,useDatePrefix=true,wantAllStacks=false);
return getEventsUnion(startDate=TRIM(arguments.startDate),endDate=TRIM(arguments.endDate));
return getEventsUnion(eventID=TRIM(arguments.eventID));
return getEventsUnion(hashID=TRIM(arguments.hashID));
return getEventsUnion(dateTimeID=TRIM(arguments.dateTimeID));
var retStruct = StructNew();
var elementName = getEventDateTimeCEName();
var dateTimeFieldStruct = application.ptCalendar.getViewColumnStruct(ceName=elementName,useQueryDataTypes=arguments.useQueryDatatypes);
var colNameStruct = StructNew();
var key = "";
var keyVal = "";
var x = 1;
var xFld = "";
var xVal = "";
var extraFields = "recurrenceID";
var extraDataTypes = "nvarchar"; // ntext, nvarchar, varchar
var fieldExceptionList = "pageID,controlID,formID";
// Make sure we have at least one valid column from the dateTime VIEW
if ( StructKeyExists(dateTimeFieldStruct,"uniqueID") ) {
// Add the dateTimeFieldStruct fields to the colNameStruct
for (key in dateTimeFieldStruct) {
if ( !ListFindNoCase(fieldExceptionList,key) ) {
// if needed convert the values to CF Query DataTypes
if ( arguments.useQueryDatatypes )
keyVal = application.ptCalendar.convertSQLDataTypeToQueryDataType(dateTimeFieldStruct[key]);
else
keyVal = dateTimeFieldStruct[key];
// Convert the uniqueID field to a dateTimeID field
if ( key EQ "uniqueID" )
retStruct["dateTimeID"] = keyVal;
else
retStruct[key] = keyVal;
}
}
// Loop over the extra fields and dataTypes to be used for the Query Columns
if ( ListLen(extraFields) EQ ListLEN(extraDataTypes) ) {
for ( x=1;x LTE ListLen(extraFields);x=x+1 ) {
xFld = ListGetAt(extraFields,x);
// if needed convert the values to CF Query DataTypes
if ( arguments.useQueryDatatypes )
xVal = application.ptCalendar.convertSQLDataTypeToQueryDataType(ListGetAt(extraDataTypes,x));
else
xVal = ListGetAt(extraDataTypes,x);
retStruct[xFld] = xVal;
}
}
}
return retStruct;
var retStruct = StructNew();
var dateTimeFieldStruct = getDateTimeColumnStruct(useQueryDataTypes=true);
var colNameList = "";
var dataTypeList = "";
var key = "";
// Make sure we have populated structure from dateTime VIEW table
if ( NOT StructIsEmpty(dateTimeFieldStruct) ) {
// Create the list of Column Name to be used for query columns
colNameList = StructKeyList(dateTimeFieldStruct);
// Create the list of DataTypes to be used for query columns
for ( key in dateTimeFieldStruct ) {
dataTypeList = ListAppend(dataTypeList,dateTimeFieldStruct[key]);
}
// Build the query column/datatype struct
retStruct.columnNames = colNameList;
retStruct.dataTypes = dataTypeList;
}
return retStruct;
return getDateTimeColumnStruct(useQueryDataTypes=false);
var retData = {};
var cacheProcessType = "delete";
var deleteItemsList = application.ptCalendar.calEventDetailsService.deleteEventDetailsByEventID(eventID=arguments.eventID);
// Check to see if any Recurrence records were deleted
retData.status = false;
retData.deleteDetails = 'Error: Event Details Delete Failed!';
retData.deleteDetailsList = deleteItemsList;
retData.deleteDateTime = false;
retData.deleteRecurrence = false;
retData.cacheStatus = false;
if ( ListLen(deleteItemsList) )
{
retData.status = true;
retData.deleteDetails = "Event Details have been deleted!";
retData.deleteDateTime = application.ptCalendar.dateTimeBuilderController.processEventDateTimeDelete(parentID=arguments.eventID);
retData.deleteRecurrence = application.ptCalendar.recurrenceBuilderController.processEventRecurrenceDelete(parentID=arguments.eventID);
retData.cacheStatus = application.ptCalendar.calEventsCacheController.processEventCacheByEventID(eventID=arguments.eventID,process=cacheProcessType);
// Reset the Far Dates data struct
application.ptCalendar.calEventsService.resetFarEventDates();
}
return retData;
var cacheStatus = getEventCacheStatus();
var eventsQry = QueryNew('tmp');
var farDates = initFarDatesStruct();
var minQry = QueryNew('tmp');
var maxQry = QueryNew('tmp');
var minPastDates = {};
var maxFutureDates = {};
var yearPad = variables.farDateDefaults.yearPad;
var minDate = DateFormat(DateAdd('yyyy',-(ABS(yearPad)),Now()),'yyyy-mm-dd');
var maxDate = DateFormat(DateAdd('yyyy',ABS(yearPad),Now()),'yyyy-mm-dd');
// Can NOT force enable cache if no cache exists!
if ( cacheStatus EQ false OR !StructKeyExists(application,'ptCalendarCache') )
arguments.useCache = false;
try
{
eventsQry = getEvents(useCache=arguments.useCache);
// If cached is enable, but empty get the events without cache
// - DO NOT USE - could cause performance issue with large numbers of events
//if ( arguments.useCache AND eventsQry.RecordCount EQ 0 )
// eventsQry = getEvents(useCache=false);
if ( eventsQry.RecordCount )
{
minQry = queryExecute(
"SELECT MIN(eventDate) AS minDate FROM eventsQry",
{ },
{ dbtype="query", maxrows=1 }
);
if ( minQry.RecordCount )
minDate = minQry.minDate[1];
maxQry = queryExecute(
"SELECT MAX(eventDate) AS maxDate FROM eventsQry",
{ },
{ dbtype="query", maxrows=1 }
);
if ( maxQry.RecordCount )
maxDate = maxQry.maxDate[1];
}
// Set the farDates Struct
// - minPast Event Date
if ( IsDate(minDate) )
{
farDates['minPastEventDate'] = DateFormat(minDate,'yyyy-mm-dd') & ' 00:00:00';
farDates['minPastEventYear'] = Year(farDates.minPastEventDate);
farDates['minPastEventMonth'] = Month(farDates.minPastEventDate);
farDates['minPastEventMonthDate'] = application.ptCalendar.date.firstOfMonth(inMonth=farDates.minPastEventMonth,inYear=farDates.minPastEventYear);
farDates['minPastEventWeekDate'] = DateFormat(application.ptCalendar.date.firstDayOfWeek(inDate=farDates.minPastEventDate),'yyyy-mm-dd') & ' 00:00:00';
}
else
{
minPastDates = getFarDatesMinPastDefaults();
structAppend(farDates, minPastDates, true);
}
// - maxFuture Event Date
if ( IsDate(maxDate) )
{
farDates['maxFutureEventDate'] = DateFormat(maxDate,'yyyy-mm-dd') & ' 23:59:59';
farDates['maxFutureEventYear'] = Year(farDates.maxFutureEventDate);
farDates['maxFutureEventMonth'] = Month(farDates.maxFutureEventDate);
farDates['maxFutureEventMonthDate'] = application.ptCalendar.date.lastOfMonth(inMonth=farDates.maxFutureEventMonth,inYear=farDates.maxFutureEventYear);
farDates['maxFutureEventWeekDate'] = DateFormat(application.ptCalendar.date.lastDayOfWeek(inDate=farDates.maxFutureEventDate),'yyyy-mm-dd') & ' 23:59:59';
}
else
{
maxFutureDates = getFarDatesMaxFutureDefaults();
structAppend(farDates, maxFutureDates, true);
}
// Add the farDates to the application.ptCalendar object
application.ptCalendar['farDates'] = farDates;
}
catch(any ex)
{
// Log error message since sometimes called from a CFTHREAD
application.ADF.log.addLogEntry(message='Error occurred in command calEventsDAO.setFarEventDates (#DateTimeFormat(Now(),"short")#): #ex.message#',CFCatch=ex,forceStackTrace=true,useDatePrefix=true);
// #Server.CommonSpot.UDF.util.structToText(farDates)#'
}