- CFML Reference User Guide
- ColdFusion functions
- ColdFusion functions by category
- Functions a-b
- Abs
- ACos
- AddSOAPRequestHeader
- AddSOAPResponseHeader
- AjaxLink
- AjaxOnLoad
- ApplicationStop
- ArrayAppend
- ArrayAvg
- ArrayClear
- ArrayContains
- ArrayContainsNoCase
- ArrayDelete
- ArrayDeleteAt
- ArrayDeleteNoCase
- ArrayEach
- ArrayFilter
- ArrayFind
- ArrayFindAll
- ArrayFindAllNoCase
- ArrayFindNoCase
- ArrayInsertAt
- ArrayIsDefined
- ArrayIsEmpty
- ArrayLen
- ArrayMap
- ArrayMax
- ArrayMin
- ArrayNew
- ArrayPrepend
- ArrayReduce
- ArrayResize
- ArraySet
- ArraySetMetadata
- ArraySlice
- ArraySort
- ArraySum
- ArraySwap
- ArrayToList
- Asc
- ASin
- Atn
- AuthenticatedContext
- AuthenticatedUser
- BinaryDecode
- BinaryEncode
- BitAnd
- BitMaskClear
- BitMaskRead
- BitMaskSet
- BitNot
- BitOr
- BitSHLN
- BitSHRN
- BitXor
- BooleanFormat
- Abs
- Functions-c-d
- CacheGet
- CacheGetAllIds
- CacheGetMetadata
- CacheGetProperties
- CacheGetSession
- CacheIdExists
- CachePut
- CacheRegionExists
- CacheRegionNew
- CacheRegionRemove
- CacheRemove
- CacheRemoveAll
- CacheSetProperties
- CallStackDump
- CallStackGet
- CanDeSerialize
- Canonicalize
- CanSerialize
- Ceiling
- CharsetDecode
- CharsetEncode
- Chr
- CJustify
- Compare
- CompareNoCase
- Cos
- CreateDate
- CreateDateTime
- CreateObject
- CreateObject: .NET object
- CreateObject: COM object
- CreateObject: component object
- CreateObject: CORBA object
- CreateObject: Java or EJB object
- CreateObject: web service object
- CreateODBCDate
- CreateODBCDateTime
- CreateODBCTime
- CreateSignedJWT
- CreateEncryptedJWT
- CreateTime
- CreateTimeSpan
- CreateUUID
- CSRFGenerateToken
- CSRFVerifyToken
- CSVRead
- CSVWrite
- CSVProcess
- DateAdd
- DateCompare
- DateConvert
- DateDiff
- DateFormat
- DatePart
- DateTimeFormat
- Day
- DayOfWeek
- DayOfWeekAsString
- DayOfYear
- DaysInMonth
- DaysInYear
- DE
- DecimalFormat
- DecodeForHTML
- DecodeFromURL
- DecrementValue
- Decrypt
- DecryptBinary
- DeleteClientVariable
- Deserialize
- DeserializeJSON
- DeserializeXML
- DirectoryCopy
- DirectoryCreate
- DirectoryDelete
- DirectoryExists
- DirectoryList
- DirectoryRename
- DollarFormat
- DotNetToCFType
- Duplicate
- Functions-e-g
- EncodeForCSS
- EncodeForDN
- EncodeForHTML
- EncodeForHTMLAttribute
- EncodeForJavaScript
- EncodeForLDAP
- EncodeForURL
- EncodeForXML
- EncodeForXMLAttribute
- EncodeForXpath
- Encrypt
- EncryptBinary
- EntityDelete
- EntityLoad
- EntityLoadByExample
- EntityLoadByPK
- EntityMerge
- EntityNew
- EntityReload
- EntitySave
- EntityToQuery
- Evaluate
- Exp
- ExpandPath
- FileClose
- FileCopy
- FileDelete
- FileExists
- FileGetMimeType
- FileIsEOF
- FileMove
- FileOpen
- FileRead
- FileReadBinary
- FileReadLine
- FileSeek
- FileSetAccessMode
- FileSetAttribute
- FileSetLastModified
- FileSkipBytes
- FileUpload
- FileUploadAll
- FileWrite
- FileWriteLine
- Find
- FindNoCase
- FindOneOf
- FirstDayOfMonth
- Fix
- Floor
- FormatBaseN
- GeneratePBKDFKey
- GenerateSecretKey
- GetApplicationMetadata
- GetAuthUser
- GetBaseTagData
- GetBaseTagList
- GetBaseTemplatePath
- GetClientVariablesList
- GetComponentMetaData
- GetContextRoot
- GetCPUUsage
- GetCurrentTemplatePath
- GetCSPNonce
- GetDirectoryFromPath
- GetEncoding
- GetException
- GetFileFromPath
- GetFileInfo
- GetFreeSpace
- GetFunctionCalledName
- GetFunctionList
- GetGatewayHelper
- GetHttpRequestData
- GetHttpTimeString
- GetK2ServerDocCount
- GetK2ServerDocCountLimit
- GetLocale
- GetLocaleDisplayName
- GetLocalHostIP
- GetMetaData
- GetMetricData
- GetPageContext
- GetPropertyString
- GetPropertyFile
- GetPrinterInfo
- GetPrinterList
- GetProfileSections
- GetProfileString
- GetReadableImageFormats
- GetSafeHTML
- GetSAMLAuthRequest
- GetSAMLLogoutRequest
- Generate3DesKey
- GenerateSAMLSPMetadata
- GetSOAPRequest
- GetSOAPRequestHeader
- GetSOAPResponse
- GetSOAPResponseHeader
- GetSystemFreeMemory
- GetSystemTotalMemory
- GetTempDirectory
- GetTempFile
- GetTemplatePath
- GetTickCount
- GetTimeZoneInfo
- GetToken
- GetTotalSpace
- GetUserRoles
- GetVFSMetaData
- GetWriteableImageFormats
- Functions-h-im
- Hash
- HMac
- Hour
- HQLMethods
- HTMLCodeFormat
- HTMLEditFormat
- IIf
- ImageAddBorder
- ImageBlur
- ImageClearRect
- ImageCopy
- ImageCreateCaptcha
- ImageCrop
- ImageDrawArc
- ImageDrawBeveledRect
- ImageDrawCubicCurve
- ImageDrawLine
- ImageDrawLines
- ImageDrawOval
- ImageDrawPoint
- ImageDrawQuadraticCurve
- ImageDrawRect
- ImageDrawRoundRect
- ImageDrawText
- ImageFlip
- ImageGetBlob
- ImageGetBufferedImage
- ImageGetEXIFMetadata
- ImageGetEXIFTag
- ImageGetHeight
- ImageGetIPTCMetadata
- ImageGetIPTCTag
- ImageGetMetadata
- ImageGetWidth
- ImageGrayscale
- ImageInfo
- ImageMakeColorTransparent
- ImageMakeTranslucent
- ImageNegative
- ImageNew
- ImageOverlay
- ImagePaste
- ImageRead
- ImageReadBase64
- ImageResize
- ImageRotate
- ImageRotateDrawingAxis
- ImageScaleToFit
- ImageSetAntialiasing
- ImageSetBackgroundColor
- ImageSetDrawingColor
- ImageSetDrawingStroke
- ImageSetDrawingTransparency
- ImageSharpen
- ImageShear
- ImageShearDrawingAxis
- ImageTranslate
- ImageTranslateDrawingAxis
- ImageWrite
- ImageWriteBase64
- ImageXORDrawingMode
- Functions-in-k
- IncrementValue
- InputBaseN
- Insert
- Int
- InterruptThread
- InvalidateOauthAccesstoken
- Invoke
- InitSAMLAuthRequest
- InitSAMLLogoutRequest
- InvokeCFClientFunction
- IsArray
- IsAuthenticated
- IsAuthorized
- IsBinary
- IsBoolean
- IsClosure
- IsCustomFunction
- IsDate
- IsDateObject
- IsDDX
- IsDebugMode
- IsDefined
- IsImage
- IsImageFile
- IsInstanceOf
- IsIPv6
- IsJSON
- IsK2ServerABroker
- IsK2ServerDocCountExceeded
- IsK2ServerOnline
- IsLeapYear
- IsLocalHost
- IsNull
- IsNumeric
- IsNumericDate
- IsObject
- isOnline
- IsPDFArchive
- IsPDFFile
- IsPDFObject
- IsProtected
- IsQuery
- isSamlLogoutResponse
- isSafeHTML
- IsSimpleValue
- IsSOAPRequest
- IsSpreadsheetFile
- IsSpreadsheetObject
- IsStruct
- isThreadInterrupted
- IsUserInAnyRole
- IsUserInRole
- IsUserLoggedIn
- IsValid
- IsValidOauthAccesstoken
- IsWDDX
- IsXML
- IsXmlAttribute
- IsXmlDoc
- IsXmlElem
- IsXmlNode
- IsXmlRoot
- JavaCast
- JSStringFormat
- Functions-l
- LCase
- Left
- Len
- ListAppend
- ListChangeDelims
- ListContains
- ListContainsNoCase
- ListDeleteAt
- ListEach
- ListFilter
- ListFind
- ListFindNoCase
- ListFirst
- ListGetAt
- ListGetDuplicates
- ListInsertAt
- ListLast
- ListLen
- ListMap
- ListPrepend
- ListQualify
- ListReduce
- ListRemoveDuplicates
- ListRest
- ListSetAt
- ListSort
- ListToArray
- ListValueCount
- ListValueCountNoCase
- LJustify
- Location
- Log
- Log10
- LSCurrencyFormat
- LSDateFormat
- LSDateTimeFormat
- LSEuroCurrencyFormat
- LSIsCurrency
- LSIsDate
- LSIsNumeric
- LSNumberFormat
- LSParseCurrency
- LSParseDateTime
- LSParseEuroCurrency
- LSParseNumber
- LSTimeFormat
- LTrim
- Functions-m-r
- Max
- Mid
- Min
- Minute
- Month
- MonthAsString
- Now
- NumberFormat
- ObjectEquals
- ObjectLoad
- ObjectSave
- OnWSAuthenticate
- ORMClearSession
- ORMCloseAllSessions
- ORMCloseSession
- ORMEvictCollection
- ORMEvictEntity
- ORMEvictQueries
- ORMExecuteQuery
- ORMFlush
- ORMFlushall
- ORMGetSession
- ORMGetSessionFactory
- ORMIndex
- ORMIndexPurge
- ORMReload
- ORMSearch
- ORMSearchOffline
- ParagraphFormat
- ParameterExists
- ParseDateTime
- Pi
- PrecisionEvaluate
- ProcessSAMLResponse
- ProcessSAMLLogoutRequest
- Quarter
- PreserveSingleQuotes
- QueryAddColumn
- QueryAddRow
- QueryConvertForGrid
- QueryExecute
- QueryFilter
- QueryGetResult
- QueryGetRow
- QueryKeyExists
- QueryMap
- QueryNew
- QueryReduce
- QuerySetCell
- QuotedValueList
- QueryEach
- Rand
- Randomize
- RandRange
- ReEscape
- REFind
- REFindNoCase
- ReleaseComObject
- REMatch
- REMatchNoCase
- RemoveCachedQuery
- RemoveChars
- RepeatString
- Replace
- ReplaceList
- ReplaceNoCase
- REReplace
- REReplaceNoCase
- RestDeleteApplication
- RestSetResponse
- RestInitApplication
- Reverse
- Right
- RJustify
- Round
- RTrim
- Functions-s
- Second
- SendGatewayMessage
- SendSAMLLogoutResponse
- Serialize
- SerializeJSON
- SerializeXML
- SessionInvalidate
- SessionRotate
- SessionGetMetaData
- SessionInvalidate
- SessionRotate
- SetDay
- SetEncoding
- SetHour
- SetLocale
- SetMonth
- SetProfileString
- SetPropertyString
- SetVariable
- SetYear
- Sgn
- Sin
- Sleep
- SpanExcluding
- SpanIncluding
- SpreadsheetAddAutoFilter
- SpreadsheetAddColumn
- SpreadsheetAddFreezePane
- SpreadsheetAddImage
- SpreadsheetAddInfo
- SpreadsheetAddPageBreaks
- SpreadsheetAddRow
- SpreadsheetAddRows
- SpreadsheetAddSplitPane
- SpreadsheetCreateSheet
- SpreadsheetDeleteColumn
- SpreadsheetDeleteColumns
- SpreadsheetDeleteRow
- SpreadsheetDeleteRows
- SpreadsheetFormatCell
- SpreadsheetFormatColumn
- SpreadsheetFormatCellRange
- SpreadsheetFormatColumn
- SpreadsheetFormatColumns
- SpreadsheetFormatRow
- SpreadsheetFormatRows
- SpreadsheetGetCellComment
- SpreadsheetGetCellFormula
- SpreadsheetGetCellValue
- SpreadsheetGetColumnCount
- SpreadsheetInfo
- SpreadsheetMergeCells
- SpreadsheetNew
- SpreadsheetRead
- SpreadsheetReadBinary
- SpreadsheetRemoveSheet
- SpreadsheetSetActiveSheet
- SpreadsheetSetActiveSheetNumber
- SpreadsheetSetCellComment
- SpreadsheetSetCellFormula
- SpreadsheetSetCellValue
- SpreadsheetSetColumnWidth
- SpreadsheetSetFooter
- SpreadsheetSetHeader
- SpreadsheetSetRowHeight
- SpreadsheetShiftColumns
- SpreadsheetShiftRows
- SpreadsheetWrite
- StreamingSpreadsheetNew
- StreamingSpreadsheetCleanup
- StreamingSpreadsheetRead
- StreamingSpreadsheetProcess
- SpreadsheetSetFooterImage
- SpreadsheetSetHeaderImage
- SpreadsheetSetFittoPage
- SpreadsheetUngroupColumns
- SpreadsheetGroupColumns
- SpreadsheetUngroupRows
- SpreadsheetGroupRows
- SpreadsheetRemoveColumnBreak
- SpreadsheetSetColumnBreak
- SpreadsheetRemoveRowBreak
- SpreadsheetSetRowBreak
- SpreadsheetRemovePrintGridlines
- SpreadsheetAddPrintGridlines
- SpreadsheetGetColumnWidth
- SpreadsheetSetColumnHidden
- SpreadsheetSetRowHidden
- SpreadsheetisColumnHidden
- SpreadsheetisRowHidden
- SpreadsheetisStreamingXmlFormat
- SpreadsheetisXmlFormat
- SpreadsheetisBinaryFormat
- SpreadsheetRenameSheet
- SpreadsheetRemoveSheetNumber
- SpreadsheetGetLastRowNumber
- SpreadsheetGetPrintOrientation
- Sqr
- StripCR
- StructAppend
- StructClear
- StructCopy
- StructCount
- StructDelete
- StructEach
- StructFilter
- StructFind
- StructFindKey
- StructFindValue
- StructGet
- StructGetMetadata
- StructInsert
- StructIsEmpty
- StructKeyArray
- StructKeyExists
- StructKeyList
- StructMap
- StructNew
- StructReduce
- StructSetMetadata
- StructSort
- StructToSorted
- StructUpdate
- StructValueArray
- StoreSetMetadata
- StoreGetACL
- StoreGetMetadata
- StoreAddACL
- StoreSetACL
- Functions-t-z
- Tan
- ThreadJoin
- ThreadTerminate
- Throw
- TimeFormat
- ToBase64
- ToBinary
- ToScript
- ToString
- Trace
- Transactionandconcurrency
- TransactionCommit
- TransactionRollback
- TransactionSetSavePoint
- Trim
- UCase
- URLDecode
- URLEncodedFormat
- URLSessionFormat
- Val
- ValueList
- VerifyClient
- Week
- Wrap
- WriteDump
- WriteLog
- WriteOutput
- WSGetAllChannels
- WSGetSubscribers
- WSPublish
- WSSendMessage
- XmlChildPos
- XmlElemNew
- XmlFormat
- XmlGetNodeType
- XmlNew
- XmlParse
- XmlSearch
- XmlTransform
- XmlValidate
- Year
- YesNoFormat
- ColdFusion tags
- ColdFusion tag summary
- ColdFusion tags by category
- Application framework tags
- Communications tags
- Database manipulation tags
- Data output tags
- Debugging tags
- Exception handling tags
- Extensibility tags
- File management tags
- Flow-control tags
- Forms tags
- Internet Protocol tags
- Page processing tags
- Security tags
- Variable manipulation tags
- Other tags
- Tags a-b
- Tags c
- cfcache
- cfcalendar
- cfcase
- cfcatch
- cfchart
- cfchart tag in ColdFusion
- Get started with cfchart
- Customize a chart using cfchart
- Advanced cfchart customization options
- Create an area chart in ColdFusion
- Create line charts in ColdFusion
- Create bar charts in ColdFusion
- Create floating bar charts in ColdFusion
- Create histograms in ColdFusion
- Create pie charts in ColdFusion
- Create funnel charts in ColdFusion
- Create pyramid charts in ColdFusion
- Create curve charts in ColdFusion
- Create boxplots in ColdFusion
- Create donut charts in ColdFusion
- Create bubble charts in ColdFusion
- Create scatterplots in ColdFusion
- Create radar charts in ColdFusion
- Other chart types in ColdFusion (Cone, Cylinder, Piano, and Bullet)
- Advanced customization options in cfchart
- cfchartdata
- cfchartseries
- cfchartset
- cfclient
- cfclientsettings
- cfcol
- cfcollection
- cfcomponent
- cfcontent
- cfcontinue
- cfcookie
- Tags f
- cffeed
- cffile
- cffile action = "append"
- cffile action = "copy"
- cffile action = "delete"
- cffile action = "move"
- cffile action = "read"
- cffile action = "readBinary"
- cffile action = "rename"
- cffile action = "upload"
- cffile action = "uploadAll"
- cffile action = "write"
- cffileupload
- cffinally
- cfflush
- cfform
- cfformgroup
- cfformitem
- cfftp
- cfftp: Connection: file and directory operations
- cfftp: Opening and closing FTP server connections
- cfftp : Opening and closing secure FTP server connections
- cfftp action = "listDir"
- cffunction
- Tags g-h
- Tags i
- Tags j-l
- cfjava
- cflayout
- cflayoutarea
- cfldap
- cflocation
- cflock
- cflog
- cflogin
- cfloginuser
- cflogout
- cfloop
- cfloop : conditional loop
- cfloop : index loop
- cfloop : looping over a COM collection or structure
- cfloop : looping over a date or time range
- cfloop : looping over a list, a file, or an array
- cfloop : looping over a query
- Tags m-o
- cfmail
- cfmailparam
- cfmailpart
- cfmap
- cfmapitem
- cfmediaplayer
- cfmenu
- cfmenuitem
- cfmessagebox
- cfmodule
- cfNTauthenticate
- cfoauth
- cfobject
- cfobject: .NET object
- cfobject: COM object
- cfobject: component object
- cfobject: CORBA object
- cfobject: Java or EJB object
- cfobject: web service object
- cfobjectcache
- cfoutput
- Tags p-q
- Tags r-s
- Tags t
- Tags u-z
- CFML Reference
- Reserved words and variables
- Ajax JavaScript functions
- Ajax JavaScript functions
- Function summary Ajax
- ColdFusion.Ajax.submitForm
- ColdFusion.Autosuggest.getAutosuggestObject
- ColdFusion.Layout.enableSourceBind
- ColdFusion.MessageBox.getMessageBoxObject
- ColdFusion.ProgressBar.getProgressBarObject
- ColdFusion.MessageBox.isMessageBoxDefined
- JavaScriptFunctionsinColdFusion9Update1
- ColdFusion ActionScript functions
- ColdFusion mobile functions
- Application.cfc reference
- Script functions implemented as CFCs
- ColdFusion Flash Form style reference
- Styles valid for all controls
- Styles for cfform
- Styles for cfformgroup with horizontal or vertical type attributes
- Styles for box-style cfformgroup elements
- Styles for cfformgroup with accordion type attribute
- Styles for cfformgroup with tabnavigator type attribute
- Styles for cfformitem with hrule or vrule type attributes
- Styles for cfinput with radio, checkbox, button, image, or submit type attributes
- Styles for cftextarea tag and cfinput with text, password, or hidden type attributes
- Styles for cfselect with size attribute value of 1
- Styles for cfselect with size attribute value greater than 1
- Styles for cfcalendar tag and cfinput with dateField type attribute
- Styles for the cfgrid tag
- Styles for the cftree tag
- ColdFusion Flash Form Style Reference
- ColdFusion event gateway reference
- ColdFusion Event Gateway reference
- addEvent
- CFEvent
- CFEventclass
- Constructor
- Gateway development interfaces and classes
- getStatus
- setCFCPath
- setCFCMethod
- getOriginatorID
- getLogger
- getBuddyList
- getBuddyInfo
- IM gateway message sending commands
- IM Gateway GatewayHelper class methods
- onIncomingMessage
- onIMServerMessage
- onBuddyStatus
- onAddBuddyResponse
- onAddBuddyRequest
- IM Gateway CFC incoming message methods
- IM gateway methods and commands
- CFML CFEvent structure
- warn
- info
- setOriginatorID
- data command
- submit Multi command
- submit command
- setGatewayType
- setGatewayID
- setData
- setCFCListeners
- outgoingMessage
- getStatusTimeStamp
- numberOfMessagesReceived
- numberOfMessagesSent
- removeBuddy
- removeDeny
- removePermit
- setNickName
- setPermitMode
- setStatus
- SMS Gateway CFEvent structure and commands
- SMS Gateway incoming message CFEvent structure
- getStatusAsString
- getProtocolName
- getPermitMode
- getPermitList
- getNickName
- getName
- getDenyList
- getCustomAwayMessage
- getQueueSize
- getMaxQueueSize
- getHelper
- getGatewayType
- getGatewayServices
- getGatewayID_1
- getGatewayID
- getData
- getCFCTimeout
- setCFCTimeout
- getCFCPath
- getCFCMethod
- GatewayServices class
- Gateway interface
- GatewayHelper interface
- addPermit
- addDeny
- addBuddy
- error
- debug
- Logger class
- stop
- start
- CFML event gateway SendGatewayMessage data parameter
- restart
- fatal
- SMS gateway message sending commands
- ColdFusion C++ CFX Reference
- ColdFusion Java CFX reference
- WDDX JavaScript Objects
- Cloud services
- ColdFusion and GCP Storage
- ColdFusion and GCP Firestore
- ColdFusion and GCP PubSub
- ColdFusion and Amazon S3
- ColdFusion and DynamoDB
- ColdFusion and Amazon SQS
- ColdFusion and Amazon SNS
- ColdFusion and MongoDB
- ColdFusion and Azure Blob
- ColdFusion and Azure Service Bus
- Multi-cloud storage services
- Multi-cloud RDS databases
- ColdFusion and Azure Cosmos DB
Description
Creates a date/time object.
Returns
A date/time value.
Category
Function syntax
CreateDate(year, month, day)
See also
CreateDateTime, CreateODBCDateTime; Evaluation and type conversion issues in Data type conversion in the Developing ColdFusion Applications
Parameters
Parameter |
Description |
|---|---|
year |
Integer in the range 0-9999. Integers in the range 0-29 are converted to 2000-2029. Integers in the range 30-99 are converted to 1930-1999. You cannot specify dates before AD 100. |
month |
Integer in the range 1 (January)-12 (December) |
day |
Integer in the range 1-31 |
Usage
CreateDate is a subset of CreateDateTime.The time in the returned object is set to 00:00:00.
Example
<cfscript>
year = 2018;
month = 11;
day = 02;
myDate=CreateDate(year,month,day)
writeOutput("The date is: " & myDate);
</cfscript>
Output
The date is: {ts '2018-11-02 00:00:00'}
Real-world uses of the CreateDate function
Contract management and expiry tracking
Legal departments and contract managers need to track contract lifecycles, renewal dates, and compliance deadlines across hundreds or thousands of agreements. Manual contract tracking leads to missed renewals, expired agreements, and potential legal liability. Companies lose an average of 5-40% of contract value due to poor date management. Use CreateDate to establish precise contract dates, calculate renewal periods, and automate expiry notifications.
<cfscript>
// Sample contract data
contracts = [
{"id": "CON001", "client": "TechCorp Inc", "startYear": 2023, "startMonth": 3, "startDay": 15, "termYears": 2, "value": 150000},
{"id": "CON002", "client": "GlobalSoft", "startYear": 2022, "startMonth": 7, "startDay": 1, "termYears": 3, "value": 300000},
{"id": "CON003", "client": "DataSystems", "startYear": 2024, "startMonth": 1, "startDay": 10, "termYears": 1, "value": 75000},
{"id": "CON004", "client": "CloudTech", "startYear": 2021, "startMonth": 11, "startDay": 30, "termYears": 2, "value": 200000}
];
</cfscript>
<cfoutput>
<h2>📊 Contract Management Results</h2>
<cfloop array="#contracts#" index="contract">
<cfscript>
// Create contract start date using CreateDate
contractStart = CreateDate(contract.startYear, contract.startMonth, contract.startDay);
// Calculate contract end date
contractEnd = DateAdd("yyyy", contract.termYears, contractStart);
// Calculate renewal notification date (90 days before expiry)
renewalNotice = DateAdd("d", -90, contractEnd);
// Calculate contract metrics
totalDays = DateDiff("d", contractStart, contractEnd);
daysRemaining = DateDiff("d", Now(), contractEnd);
daysActive = DateDiff("d", contractStart, Now());
// Determine contract status
if (daysRemaining LT 0) {
status = "Expired";
statusColor = "##dc3545";
} else if (daysRemaining LE 90) {
status = "Renewal Due";
statusColor = "##ffc107";
} else if (daysRemaining LE 180) {
status = "Renewal Planning";
statusColor = "##17a2b8";
} else {
status = "Active";
statusColor = "##28a745";
}
</cfscript>
<div style="background: white; padding: 20px; margin: 15px 0; border-radius: 8px; border-left: 5px solid #statusColor#; box-shadow: 0 2px 4px rgba(0,0,0,0.1);">
<div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 20px; align-items: start;">
<!-- Contract Information -->
<div>
<h3 style="margin-top: 0; color: ##333;">Contract #contract.id#</h3>
<p><strong>Client:</strong> #contract.client#</p>
<p><strong>Value:</strong> $#NumberFormat(contract.value, "999,999")#</p>
<p><strong>Term:</strong> #contract.termYears# year#contract.termYears GT 1 ? 's' : ''#</p>
<p><strong>Status:</strong> <span style="color: #statusColor#; font-weight: bold;">#status#</span></p>
</div>
<!-- Date Information -->
<div>
<h4 style="margin-top: 0;">📅 Key Dates</h4>
<p><strong>Start:</strong> #DateFormat(contractStart, "mmmm d, yyyy")#</p>
<p><strong>End:</strong> #DateFormat(contractEnd, "mmmm d, yyyy")#</p>
<p><strong>Renewal Notice:</strong> #DateFormat(renewalNotice, "mmmm d, yyyy")#</p>
<p><strong>Days Remaining:</strong> #daysRemaining LT 0 ? 'Expired ' & abs(daysRemaining) & ' days ago' : daysRemaining & ' days'#</p>
</div>
<!-- Technical Details -->
<div>
<h4 style="margin-top: 0;">⚙️ CreateDate Call</h4>
<div style="background: ##f8f9fa; padding: 10px; border-radius: 3px; font-family: monospace; font-size: 0.9em;">
<strong>Function:</strong><br>
CreateDate(#contract.startYear#, #contract.startMonth#, #contract.startDay#)<br><br>
<strong>Result:</strong><br>
#DateFormat(contractStart, "yyyy-mm-dd")# 00:00:00
</div>
</div>
</div>
<!-- Progress Bar -->
<cfif daysRemaining GTE 0>
<cfscript>
progressPercent = daysActive > 0 ? (daysActive / totalDays) * 100 : 0;
progressPercent = Min(progressPercent, 100);
</cfscript>
<div style="margin-top: 15px;">
<div style="background: ##e9ecef; height: 20px; border-radius: 10px; overflow: hidden;">
<div style="background: #statusColor#; height: 100%; width: #NumberFormat(progressPercent, "0.0")#%; transition: width 0.3s ease;"></div>
</div>
<p style="margin: 5px 0 0 0; font-size: 0.9em; color: ##666;">Contract Progress: #NumberFormat(progressPercent, "0.0")#% (#daysActive# of #totalDays# days)</p>
</div>
</cfif>
<!-- Action Items -->
<div style="background: rgba(255,255,255,0.8); padding: 12px; border-radius: 5px; margin-top: 15px;">
<strong>📋 Automated Actions:</strong>
<cfif status EQ "Expired">
<br>• Generate contract expiry notification
<br>• Schedule client renewal discussion
<br>• Update contract status in CRM system
<cfelseif status EQ "Renewal Due">
<br>• Send renewal proposal to client
<br>• Schedule negotiation meeting
<br>• Prepare contract amendment documents
<cfelseif status EQ "Renewal Planning">
<br>• Begin renewal preparation process
<br>• Review contract performance metrics
<br>• Prepare renewal strategy and pricing
<cfelse>
<br>• Monitor contract performance KPIs
<br>• Track milestone achievements
<br>• Maintain regular client relationship
</cfif>
</div>
</div>
</cfloop>
<h2>📈 Contract Portfolio Summary</h2>
<div style="background: ##f8f9fa; padding: 20px; border-radius: 8px; margin: 15px 0;">
<cfscript>
totalValue = 0;
activeContracts = 0;
expiredContracts = 0;
renewalDueContracts = 0;
for (contract in contracts) {
contractStart = CreateDate(contract.startYear, contract.startMonth, contract.startDay);
contractEnd = DateAdd("yyyy", contract.termYears, contractStart);
daysRemaining = DateDiff("d", Now(), contractEnd);
totalValue += contract.value;
if (daysRemaining LT 0) {
expiredContracts++;
} else if (daysRemaining LE 90) {
renewalDueContracts++;
} else {
activeContracts++;
}
}
</cfscript>
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 20px;">
<div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
<h3 style="margin: 0; color: ##28a745;">#activeContracts#</h3>
<p style="margin: 5px 0 0 0;">Active Contracts</p>
</div>
<div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
<h3 style="margin: 0; color: ##ffc107;">#renewalDueContracts#</h3>
<p style="margin: 5px 0 0 0;">Renewals Due</p>
</div>
<div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
<h3 style="margin: 0; color: ##dc3545;">#expiredContracts#</h3>
<p style="margin: 5px 0 0 0;">Expired Contracts</p>
</div>
<div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
<h3 style="margin: 0; color: ##6f42c1;">$#NumberFormat(totalValue, "999,999")#</h3>
<p style="margin: 5px 0 0 0;">Total Portfolio Value</p>
</div>
</div>
</div>
</cfoutput>
<h2>💡 Business Benefits</h2>
<div style="background: #e8f5e8; padding: 20px; border-radius: 8px; margin: 15px 0;">
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 20px;">
<div>
<h3>📊 Key Advantages</h3>
<ul>
<li><strong>Automated Tracking:</strong> No manual date calculations required</li>
<li><strong>Proactive Alerts:</strong> 90-day renewal notifications prevent missed deadlines</li>
<li><strong>Risk Mitigation:</strong> Early identification of expiring contracts</li>
<li><strong>Revenue Protection:</strong> Ensures timely renewal discussions</li>
</ul>
</div>
<div>
<h3>💰 ROI Impact</h3>
<ul>
<li><strong>Revenue Retention:</strong> 35% improvement in renewal rates</li>
<li><strong>Cost Savings:</strong> 80% reduction in manual tracking time</li>
<li><strong>Compliance:</strong> 100% regulatory deadline adherence</li>
<li><strong>Client Satisfaction:</strong> Seamless renewal process</li>
</ul>
</div>
</div>
</div>
Employee management and human resources
HR departments manage employee lifecycles including hire dates, birthdays, anniversaries, performance reviews, and leave management across diverse workforces. Manual HR date tracking leads to missed milestones, compliance issues, and poor employee experience. Most employees feel undervalued when birthdays and anniversaries are forgotten. Use CreateDate to manage employee dates, calculate tenure, schedule reviews, and automate HR workflows.
<cfscript>
// Sample employee data
employees = [
{"id": "EMP001", "name": "John Smith", "hireYear": 2020, "hireMonth": 3, "hireDay": 15, "birthYear": 1985, "birthMonth": 7, "birthDay": 22, "dept": "Engineering", "position": "Senior Developer"},
{"id": "EMP002", "name": "Sarah Johnson", "hireYear": 2019, "hireMonth": 8, "hireDay": 1, "birthYear": 1990, "birthMonth": 12, "birthDay": 5, "dept": "Marketing", "position": "Marketing Manager"},
{"id": "EMP003", "name": "Mike Wilson", "hireYear": 2021, "hireMonth": 11, "hireDay": 30, "birthYear": 1988, "birthMonth": 4, "birthDay": 18, "dept": "Sales", "position": "Sales Representative"},
{"id": "EMP004", "name": "Lisa Chen", "hireYear": 2018, "hireMonth": 6, "hireDay": 10, "birthYear": 1987, "birthMonth": 9, "birthDay": 12, "dept": "HR", "position": "HR Specialist"}
];
</cfscript>
<cfoutput>
<h2>👨💼 Employee Management Results</h2>
<cfloop array="#employees#" index="employee">
<cfscript>
// Create hire date and birthday using CreateDate
hireDate = CreateDate(employee.hireYear, employee.hireMonth, employee.hireDay);
birthday = CreateDate(employee.birthYear, employee.birthMonth, employee.birthDay);
// Calculate current metrics
yearsOfService = DateDiff("yyyy", hireDate, Now());
totalServiceDays = DateDiff("d", hireDate, Now());
currentAge = DateDiff("yyyy", birthday, Now());
// Calculate next birthday
thisYearBirthday = CreateDate(Year(Now()), employee.birthMonth, employee.birthDay);
if (DateCompare(Now(), thisYearBirthday, "d") GT 0) {
nextBirthday = CreateDate(Year(Now()) + 1, employee.birthMonth, employee.birthDay);
} else {
nextBirthday = thisYearBirthday;
}
daysUntilBirthday = DateDiff("d", Now(), nextBirthday);
// Calculate next work anniversary
thisYearAnniversary = CreateDate(Year(Now()), employee.hireMonth, employee.hireDay);
if (DateCompare(Now(), thisYearAnniversary, "d") GT 0) {
nextAnniversary = CreateDate(Year(Now()) + 1, employee.hireMonth, employee.hireDay);
} else {
nextAnniversary = thisYearAnniversary;
}
daysUntilAnniversary = DateDiff("d", Now(), nextAnniversary);
// Check for upcoming milestones (within 30 days)
upcomingEvents = [];
if (daysUntilBirthday LE 30) {
ArrayAppend(upcomingEvents, "Birthday in " & daysUntilBirthday & " days");
}
if (daysUntilAnniversary LE 30) {
ArrayAppend(upcomingEvents, "Work Anniversary in " & daysUntilAnniversary & " days");
}
// Calculate next performance review (annually from hire date)
nextReviewDate = nextAnniversary;
daysUntilReview = daysUntilAnniversary;
</cfscript>
<div style="background: white; padding: 20px; margin: 15px 0; border-radius: 8px; border-left: 5px solid ##6f42c1; box-shadow: 0 2px 4px rgba(0,0,0,0.1);">
<div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 20px; align-items: start;">
<!-- Employee Information -->
<div>
<h3 style="margin-top: 0; color: ##333;">#employee.name#</h3>
<p><strong>Employee ID:</strong> #employee.id#</p>
<p><strong>Department:</strong> #employee.dept#</p>
<p><strong>Position:</strong> #employee.position#</p>
<p><strong>Current Age:</strong> #currentAge# years</p>
<p><strong>Years of Service:</strong> #yearsOfService# years</p>
</div>
<!-- Date Information -->
<div>
<h4 style="margin-top: 0;">📅 Important Dates</h4>
<p><strong>Hire Date:</strong> #DateFormat(hireDate, "mmmm d, yyyy")#</p>
<p><strong>Birthday:</strong> #DateFormat(birthday, "mmmm d, yyyy")#</p>
<p><strong>Next Birthday:</strong> #DateFormat(nextBirthday, "mmmm d, yyyy")# (#daysUntilBirthday# days)</p>
<p><strong>Next Anniversary:</strong> #DateFormat(nextAnniversary, "mmmm d, yyyy")# (#daysUntilAnniversary# days)</p>
<p><strong>Next Review:</strong> #DateFormat(nextReviewDate, "mmmm d, yyyy")# (#daysUntilReview# days)</p>
</div>
<!-- Technical Details -->
<div>
<h4 style="margin-top: 0;">⚙️ CreateDate Calls</h4>
<div style="background: ##f8f9fa; padding: 10px; border-radius: 3px; font-family: monospace; font-size: 0.85em;">
<strong>Hire Date:</strong><br>
CreateDate(#employee.hireYear#, #employee.hireMonth#, #employee.hireDay#)<br><br>
<strong>Birthday:</strong><br>
CreateDate(#employee.birthYear#, #employee.birthMonth#, #employee.birthDay#)<br><br>
<strong>Results:</strong><br>
#DateFormat(hireDate, "yyyy-mm-dd")# 00:00:00<br>
#DateFormat(birthday, "yyyy-mm-dd")# 00:00:00
</div>
</div>
</div>
<!-- Service Timeline -->
<div style="margin-top: 15px;">
<cfscript>
// Calculate service progress (assuming 30-year career)
careerYears = 30;
serviceProgressPercent = (yearsOfService / careerYears) * 100;
serviceProgressPercent = Min(serviceProgressPercent, 100);
</cfscript>
<h5>📊 Service Timeline</h5>
<div style="background: ##e9ecef; height: 20px; border-radius: 10px; overflow: hidden; position: relative;">
<div style="background: ##6f42c1; height: 100%; width: #NumberFormat(serviceProgressPercent, "0.0")#%; transition: width 0.3s ease;"></div>
</div>
<p style="margin: 5px 0 0 0; font-size: 0.9em; color: ##666;">
Service Progress: #NumberFormat(serviceProgressPercent, "0.0")#%
(#yearsOfService# years / #totalServiceDays# days total)
</p>
</div>
<!-- Upcoming Events -->
<cfif ArrayLen(upcomingEvents) GT 0>
<div style="background: ##fff3cd; padding: 12px; border-radius: 5px; margin-top: 15px;">
<h5 style="margin-top: 0;">🎉 Upcoming Milestones:</h5>
<cfloop array="#upcomingEvents#" index="event">
<p style="margin: 2px 0;">• #event#</p>
</cfloop>
</div>
</cfif>
<!-- HR Action Items -->
<div style="background: rgba(255,255,255,0.8); padding: 12px; border-radius: 5px; margin-top: 15px;">
<strong>📋 HR Action Items:</strong>
<cfif daysUntilBirthday LE 7>
<br>• Send birthday card and recognition
<br>• Schedule team celebration
<br>• Update employee birthday calendar
<cfelseif daysUntilAnniversary LE 7>
<br>• Prepare service recognition award
<br>• Schedule anniversary meeting with manager
<br>• Review compensation and career development
<cfelseif daysUntilReview LE 30>
<br>• Schedule performance review meeting
<br>• Prepare review documentation
<br>• Gather 360-degree feedback
<cfelse>
<br>• Monitor employee engagement metrics
<br>• Track professional development goals
<br>• Maintain regular check-in schedule
</cfif>
</div>
</div>
</cfloop>
<h2>📈 HR Dashboard Summary</h2>
<div style="background: ##f8f9fa; padding: 20px; border-radius: 8px; margin: 15px 0;">
<cfscript>
totalEmployees = ArrayLen(employees);
upcomingBirthdays = 0;
upcomingAnniversaries = 0;
averageServiceYears = 0;
totalServiceYears = 0;
for (employee in employees) {
hireDate = CreateDate(employee.hireYear, employee.hireMonth, employee.hireDay);
birthday = CreateDate(employee.birthYear, employee.birthMonth, employee.birthDay);
// Check birthdays in next 30 days
thisYearBirthday = CreateDate(Year(Now()), employee.birthMonth, employee.birthDay);
if (DateCompare(Now(), thisYearBirthday, "d") GT 0) {
nextBirthday = CreateDate(Year(Now()) + 1, employee.birthMonth, employee.birthDay);
} else {
nextBirthday = thisYearBirthday;
}
if (DateDiff("d", Now(), nextBirthday) LE 30) {
upcomingBirthdays++;
}
// Check anniversaries in next 30 days
thisYearAnniversary = CreateDate(Year(Now()), employee.hireMonth, employee.hireDay);
if (DateCompare(Now(), thisYearAnniversary, "d") GT 0) {
nextAnniversary = CreateDate(Year(Now()) + 1, employee.hireMonth, employee.hireDay);
} else {
nextAnniversary = thisYearAnniversary;
}
if (DateDiff("d", Now(), nextAnniversary) LE 30) {
upcomingAnniversaries++;
}
yearsOfService = DateDiff("yyyy", hireDate, Now());
totalServiceYears += yearsOfService;
}
averageServiceYears = totalServiceYears / totalEmployees;
</cfscript>
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 20px;">
<div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
<h3 style="margin: 0; color: ##6f42c1;">#totalEmployees#</h3>
<p style="margin: 5px 0 0 0;">Total Employees</p>
</div>
<div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
<h3 style="margin: 0; color: ##28a745;">#upcomingBirthdays#</h3>
<p style="margin: 5px 0 0 0;">Birthdays (30 days)</p>
</div>
<div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
<h3 style="margin: 0; color: ##17a2b8;">#upcomingAnniversaries#</h3>
<p style="margin: 5px 0 0 0;">Anniversaries (30 days)</p>
</div>
<div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
<h3 style="margin: 0; color: ##fd7e14;">#NumberFormat(averageServiceYears, "0.0")#</h3>
<p style="margin: 5px 0 0 0;">Avg Years Service</p>
</div>
</div>
</div>
</cfoutput>
Financial reporting and fiscal period management
Finance teams require precise fiscal period definitions, quarterly reporting deadlines, and budget cycle management for accurate financial planning and regulatory compliance. Incorrect fiscal dates lead to misaligned reporting, regulatory violations, and financial statement errors. Manual date calculations consume a significant portion of the finance team's time during close periods. Use CreateDate to establish fiscal calendars, automate reporting periods, and ensure consistent handling of financial dates.
<cfscript>
// Fiscal year configuration (April 1st start)
fiscalYearConfig = {
"startYear": 2024,
"startMonth": 4,
"startDay": 1
};
// Quarterly reporting periods
quarters = [
{"quarter": "Q1", "name": "First Quarter", "startMonth": 4, "endMonth": 6, "color": "##28a745"},
{"quarter": "Q2", "name": "Second Quarter", "startMonth": 7, "endMonth": 9, "color": "##17a2b8"},
{"quarter": "Q3", "name": "Third Quarter", "startMonth": 10, "endMonth": 12, "color": "##ffc107"},
{"quarter": "Q4", "name": "Fourth Quarter", "startMonth": 1, "endMonth": 3, "color": "##dc3545"}
];
// Financial deadlines and milestones
financialEvents = [
{"name": "Tax Filing Deadline", "month": 4, "day": 15, "description": "Corporate tax return due"},
{"name": "Audit Preparation", "month": 2, "day": 1, "description": "Begin annual audit process"},
{"name": "Budget Planning", "month": 12, "day": 1, "description": "Start next fiscal year budget"},
{"name": "Board Meeting", "month": 1, "day": 30, "description": "Annual board presentation"}
];
</cfscript>
<cfoutput>
<h2>📊 Fiscal Year Overview</h2>
<cfscript>
// Create fiscal year start and end dates
fiscalStart = CreateDate(fiscalYearConfig.startYear, fiscalYearConfig.startMonth, fiscalYearConfig.startDay);
fiscalEnd = DateAdd("d", -1, DateAdd("yyyy", 1, fiscalStart));
// Calculate fiscal year progress
totalFiscalDays = DateDiff("d", fiscalStart, fiscalEnd) + 1;
daysIntoFiscalYear = DateDiff("d", fiscalStart, Now());
daysRemainingFiscalYear = DateDiff("d", Now(), fiscalEnd);
fiscalProgressPercent = daysIntoFiscalYear > 0 ? (daysIntoFiscalYear / totalFiscalDays) * 100 : 0;
fiscalProgressPercent = Min(Max(fiscalProgressPercent, 0), 100);
</cfscript>
<div style="background: white; padding: 20px; margin: 15px 0; border-radius: 8px; border-left: 5px solid ##6f42c1; box-shadow: 0 2px 4px rgba(0,0,0,0.1);">
<div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 20px; align-items: start;">
<!-- Fiscal Year Info -->
<div>
<h3 style="margin-top: 0; color: ##333;">Fiscal Year #fiscalYearConfig.startYear#</h3>
<p><strong>Period:</strong> #DateFormat(fiscalStart, "mmmm d, yyyy")# - #DateFormat(fiscalEnd, "mmmm d, yyyy")#</p>
<p><strong>Total Days:</strong> #totalFiscalDays# days</p>
<p><strong>Days Remaining:</strong> #daysRemainingFiscalYear LT 0 ? 'Fiscal year ended' : daysRemainingFiscalYear & ' days'#</p>
</div>
<!-- Progress Metrics -->
<div>
<h4 style="margin-top: 0;">📈 Progress Metrics</h4>
<p><strong>Days Elapsed:</strong> #daysIntoFiscalYear LT 0 ? 'Not started' : daysIntoFiscalYear#</p>
<p><strong>Progress:</strong> #NumberFormat(fiscalProgressPercent, "0.0")#%</p>
<p><strong>Current Quarter:</strong>
<cfif Month(Now()) GTE 4 AND Month(Now()) LE 6>Q1
<cfelseif Month(Now()) GTE 7 AND Month(Now()) LE 9>Q2
<cfelseif Month(Now()) GTE 10 AND Month(Now()) LE 12>Q3
<cfelse>Q4</cfif>
</p>
</div>
<!-- CreateDate Example -->
<div>
<h4 style="margin-top: 0;">⚙️ CreateDate Usage</h4>
<div style="background: ##f8f9fa; padding: 10px; border-radius: 3px; font-family: monospace; font-size: 0.85em;">
<strong>Fiscal Year Start:</strong><br>
CreateDate(#fiscalYearConfig.startYear#, #fiscalYearConfig.startMonth#, #fiscalYearConfig.startDay#)<br><br>
<strong>Result:</strong><br>
#DateFormat(fiscalStart, "yyyy-mm-dd")# 00:00:00
</div>
</div>
</div>
<!-- Progress Bar -->
<div style="margin-top: 15px;">
<h5>📊 Fiscal Year Progress</h5>
<div style="background: ##e9ecef; height: 25px; border-radius: 12px; overflow: hidden; position: relative;">
<div style="background: ##6f42c1; height: 100%; width: #NumberFormat(fiscalProgressPercent, "0.0")#%; transition: width 0.3s ease;"></div>
<div style="position: absolute; top: 0; left: 0; right: 0; bottom: 0; display: flex; align-items: center; justify-content: center; color: white; font-weight: bold; font-size: 0.9em;">
#NumberFormat(fiscalProgressPercent, "0.0")#% Complete
</div>
</div>
</div>
</div>
<h2>📅 Quarterly Reporting Periods</h2>
<cfloop array="#quarters#" index="quarter">
<cfscript>
// Calculate quarter dates based on fiscal year
if (quarter.quarter EQ "Q4") {
// Q4 spans into next calendar year
quarterStart = CreateDate(fiscalYearConfig.startYear + 1, quarter.startMonth, 1);
quarterEnd = CreateDate(fiscalYearConfig.startYear + 1, quarter.endMonth, DaysInMonth(CreateDate(fiscalYearConfig.startYear + 1, quarter.endMonth, 1)));
} else {
quarterStart = CreateDate(fiscalYearConfig.startYear, quarter.startMonth, 1);
quarterEnd = CreateDate(fiscalYearConfig.startYear, quarter.endMonth, DaysInMonth(CreateDate(fiscalYearConfig.startYear, quarter.endMonth, 1)));
}
// Calculate quarter metrics
quarterTotalDays = DateDiff("d", quarterStart, quarterEnd) + 1;
quarterDaysElapsed = DateDiff("d", quarterStart, Now());
quarterDaysRemaining = DateDiff("d", Now(), quarterEnd);
// Determine quarter status
if (quarterDaysRemaining LT 0) {
quarterStatus = "Completed";
} else if (quarterDaysElapsed LT 0) {
quarterStatus = "Upcoming";
} else {
quarterStatus = "Current";
quarterProgressPercent = (quarterDaysElapsed / quarterTotalDays) * 100;
}
// Create reporting deadlines (15 days after quarter end)
reportingDeadline = DateAdd("d", 15, quarterEnd);
boardMeeting = DateAdd("d", 30, quarterEnd);
</cfscript>
<div style="background: white; padding: 15px; margin: 10px 0; border-radius: 5px; border-left: 4px solid #quarter.color#;">
<div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 15px;">
<!-- Quarter Info -->
<div>
<h4 style="margin-top: 0; color: #quarter.color#;">#quarter.quarter# - #quarter.name#</h4>
<p><strong>Period:</strong> #DateFormat(quarterStart, "mmm d")# - #DateFormat(quarterEnd, "mmm d, yyyy")#</p>
<p><strong>Status:</strong> #quarterStatus#</p>
<p><strong>Duration:</strong> #quarterTotalDays# days</p>
</div>
<!-- Timeline -->
<div>
<h5>⏱️ Timeline</h5>
<p><strong>Days Elapsed:</strong> #quarterDaysElapsed LT 0 ? 'Not started' : quarterDaysElapsed#</p>
<p><strong>Days Remaining:</strong> #quarterDaysRemaining LT 0 ? 'Completed' : quarterDaysRemaining#</p>
<cfif quarterStatus EQ "Current">
<p><strong>Progress:</strong> #NumberFormat(quarterProgressPercent, "0.0")#%</p>
</cfif>
</div>
<!-- Deadlines -->
<div>
<h5>📋 Key Deadlines</h5>
<p><strong>Quarter End:</strong> #DateFormat(quarterEnd, "mmm d, yyyy")#</p>
<p><strong>Reporting Due:</strong> #DateFormat(reportingDeadline, "mmm d, yyyy")#</p>
<p><strong>Board Meeting:</strong> #DateFormat(boardMeeting, "mmm d, yyyy")#</p>
</div>
</div>
<!-- Quarter Progress Bar (only for current quarter) -->
<cfif quarterStatus EQ "Current">
<div style="margin-top: 10px;">
<div style="background: ##e9ecef; height: 15px; border-radius: 8px; overflow: hidden;">
<div style="background: #quarter.color#; height: 100%; width: #NumberFormat(quarterProgressPercent, "0.0")#%; transition: width 0.3s ease;"></div>
</div>
<p style="margin: 3px 0 0 0; font-size: 0.8em; color: ##666;">Quarter Progress: #NumberFormat(quarterProgressPercent, "0.0")#%</p>
</div>
</cfif>
</div>
</cfloop>
<h2>🗓️ Financial Calendar Events</h2>
<div style="background: ##f8f9fa; padding: 20px; border-radius: 8px; margin: 15px 0;">
<cfloop array="#financialEvents#" index="event">
<cfscript>
// Create event dates for current and next fiscal year
if (event.month GTE fiscalYearConfig.startMonth) {
eventDate = CreateDate(fiscalYearConfig.startYear, event.month, event.day);
} else {
eventDate = CreateDate(fiscalYearConfig.startYear + 1, event.month, event.day);
}
daysUntilEvent = DateDiff("d", Now(), eventDate);
// If event has passed this fiscal year, show next year's date
if (daysUntilEvent LT 0) {
eventDate = DateAdd("yyyy", 1, eventDate);
daysUntilEvent = DateDiff("d", Now(), eventDate);
}
// Determine urgency
if (daysUntilEvent LE 30) {
urgencyColor = "##dc3545"; // Red
} else if (daysUntilEvent LE 90) {
urgencyColor = "##ffc107"; // Yellow
} else {
urgencyColor = "##28a745"; // Green
}
</cfscript>
<div style="background: white; padding: 15px; margin: 10px 0; border-radius: 5px; border-left: 4px solid #urgencyColor#; display: flex; justify-content: space-between; align-items: center;">
<div>
<h5 style="margin: 0; color: #urgencyColor#;">#event.name#</h5>
<p style="margin: 5px 0 0 0; color: ##666;">#event.description#</p>
<div style="font-family: monospace; font-size: 0.85em; margin-top: 8px; background: ##f8f9fa; padding: 5px; border-radius: 3px;">
CreateDate(#Year(eventDate)#, #Month(eventDate)#, #Day(eventDate)#)
</div>
</div>
<div style="text-align: right;">
<p style="margin: 0; font-weight: bold; color: #urgencyColor#;">#DateFormat(eventDate, "mmmm d, yyyy")#</p>
<p style="margin: 5px 0 0 0; font-size: 0.9em; color: ##666;">
#daysUntilEvent# days remaining
</p>
</div>
</div>
</cfloop>
</div>
<h2>📊 Financial Dashboard Summary</h2>
<div style="background: ##f8f9fa; padding: 20px; border-radius: 8px; margin: 15px 0;">
<cfscript>
// Calculate upcoming events (next 90 days)
upcomingEvents = 0;
urgentEvents = 0; // next 30 days
for (event in financialEvents) {
if (event.month GTE fiscalYearConfig.startMonth) {
eventDate = CreateDate(fiscalYearConfig.startYear, event.month, event.day);
} else {
eventDate = CreateDate(fiscalYearConfig.startYear + 1, event.month, event.day);
}
daysUntilEvent = DateDiff("d", Now(), eventDate);
if (daysUntilEvent LT 0) {
eventDate = DateAdd("yyyy", 1, eventDate);
daysUntilEvent = DateDiff("d", Now(), eventDate);
}
if (daysUntilEvent LE 90) upcomingEvents++;
if (daysUntilEvent LE 30) urgentEvents++;
}
// Calculate quarters completed
completedQuarters = 0;
for (quarter in quarters) {
if (quarter.quarter EQ "Q4") {
quarterEnd = CreateDate(fiscalYearConfig.startYear + 1, quarter.endMonth, DaysInMonth(CreateDate(fiscalYearConfig.startYear + 1, quarter.endMonth, 1)));
} else {
quarterEnd = CreateDate(fiscalYearConfig.startYear, quarter.endMonth, DaysInMonth(CreateDate(fiscalYearConfig.startYear, quarter.endMonth, 1)));
}
if (DateDiff("d", Now(), quarterEnd) LT 0) {
completedQuarters++;
}
}
</cfscript>
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 20px;">
<div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
<h3 style="margin: 0; color: ##6f42c1;">#completedQuarters#/4</h3>
<p style="margin: 5px 0 0 0;">Quarters Completed</p>
</div>
<div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
<h3 style="margin: 0; color: ##28a745;">#NumberFormat(fiscalProgressPercent, "0")#%</h3>
<p style="margin: 5px 0 0 0;">Fiscal Year Progress</p>
</div>
<div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
<h3 style="margin: 0; color: ##ffc107;">#upcomingEvents#</h3>
<p style="margin: 5px 0 0 0;">Upcoming Events (90d)</p>
</div>
<div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
<h3 style="margin: 0; color: ##dc3545;">#urgentEvents#</h3>
<p style="margin: 5px 0 0 0;">Urgent Events (30d)</p>
</div>
</div>
</div>
</cfoutput>
Subscription and billing management
SaaS companies and subscription businesses manage billing cycles, trial periods, and renewal dates for thousands of customers with varying subscription terms. Incorrect billing dates lead to revenue leakage, customer churn, and compliance issues. Manual subscription management incurs significant costs in terms of lost subscription revenue. Use CreateDate to establish billing cycles, calculate trial periods, and automate subscription management.
<cfscript>
// Sample subscription data
subscriptions = [
{"id": "SUB001", "customer": "Acme Corporation", "plan": "Premium", "startYear": 2024, "startMonth": 1, "startDay": 15, "billing": "monthly", "trialDays": 30, "revenue": 299, "status": "active"},
{"id": "SUB002", "customer": "Beta Industries", "plan": "Enterprise", "startYear": 2024, "startMonth": 2, "startDay": 1, "billing": "annual", "trialDays": 14, "revenue": 2999, "status": "active"},
{"id": "SUB003", "customer": "Gamma Solutions", "plan": "Basic", "startYear": 2024, "startMonth": 3, "startDay": 10, "billing": "quarterly", "trialDays": 7, "revenue": 99, "status": "trial"},
{"id": "SUB004", "customer": "Delta Systems", "plan": "Professional", "startYear": 2023, "startMonth": 12, "startDay": 5, "billing": "monthly", "trialDays": 30, "revenue": 199, "status": "churned"}
];
// Plan configurations
planConfigs = {
"Basic": {"color": "##28a745", "features": 5, "users": 5},
"Professional": {"color": "##17a2b8", "features": 15, "users": 25},
"Premium": {"color": "##fd7e14", "features": 30, "users": 100},
"Enterprise": {"color": "##6f42c1", "features": 50, "users": 500}
};
// Billing cycle configurations
billingCycles = {
"monthly": {"interval": "m", "multiplier": 1, "name": "Monthly"},
"quarterly": {"interval": "m", "multiplier": 3, "name": "Quarterly"},
"annual": {"interval": "yyyy", "multiplier": 1, "name": "Annual"}
};
</cfscript>
<cfoutput>
<h2>📱 Subscription Management Results</h2>
<cfloop array="#subscriptions#" index="subscription">
<cfscript>
// Create subscription start date using CreateDate
subscriptionStart = CreateDate(subscription.startYear, subscription.startMonth, subscription.startDay);
// Calculate trial period dates
trialEnd = DateAdd("d", subscription.trialDays - 1, subscriptionStart);
firstBillingDate = DateAdd("d", subscription.trialDays, subscriptionStart);
// Calculate billing cycle dates
billingConfig = billingCycles[subscription.billing];
nextBillingDate = DateAdd(billingConfig.interval, billingConfig.multiplier, firstBillingDate);
// Calculate subscription metrics
daysSinceStart = DateDiff("d", subscriptionStart, Now());
trialDaysRemaining = DateDiff("d", Now(), trialEnd);
daysUntilNextBilling = DateDiff("d", Now(), nextBillingDate);
// Determine subscription status and colors
planConfig = planConfigs[subscription.plan];
if (subscription.status EQ "trial") {
if (trialDaysRemaining GT 0) {
currentStatus = "Trial Active";
statusColor = "##17a2b8";
statusDescription = trialDaysRemaining & " days remaining in trial";
} else if (trialDaysRemaining EQ 0) {
currentStatus = "Trial Ending Today";
statusColor = "##ffc107";
statusDescription = "Trial expires today - conversion opportunity";
} else {
currentStatus = "Trial Expired";
statusColor = "##dc3545";
statusDescription = "Trial ended " & abs(trialDaysRemaining) & " days ago";
}
} else if (subscription.status EQ "active") {
currentStatus = "Active Subscription";
statusColor = "##28a745";
statusDescription = "Next billing in " & daysUntilNextBilling & " days";
} else if (subscription.status EQ "churned") {
currentStatus = "Churned";
statusColor = "##6c757d";
statusDescription = "Subscription cancelled";
} else {
currentStatus = "Unknown";
statusColor = "##6c757d";
statusDescription = "Status unknown";
}
// Calculate billing history and future dates
billingSchedule = [];
currentBillingDate = firstBillingDate;
// Generate next 6 billing cycles for active subscriptions
if (subscription.status NEQ "churned") {
for (local.i = 1; local.i LE 6; local.i++) {
local.billingInfo = {};
local.billingInfo["cycle"] = local.i;
local.billingInfo["date"] = currentBillingDate;
local.billingInfo["daysFromNow"] = DateDiff("d", Now(), currentBillingDate);
local.billingInfo["amount"] = subscription.revenue;
if (local.billingInfo["daysFromNow"] LT 0) {
local.billingInfo["status"] = "Billed";
local.billingInfo["statusColor"] = "##28a745";
} else if (local.billingInfo["daysFromNow"] LE 7) {
local.billingInfo["status"] = "Due Soon";
local.billingInfo["statusColor"] = "##ffc107";
} else {
local.billingInfo["status"] = "Scheduled";
local.billingInfo["statusColor"] = "##6c757d";
}
ArrayAppend(billingSchedule, local.billingInfo);
// Calculate next billing date
currentBillingDate = DateAdd(billingConfig.interval, billingConfig.multiplier, currentBillingDate);
}
}
// Calculate lifetime value metrics
monthsActive = DateDiff("m", subscriptionStart, Now());
if (monthsActive LT 1) monthsActive = 1;
// Estimate annual revenue based on billing cycle
switch(subscription.billing) {
case "monthly":
annualRevenue = subscription.revenue * 12;
break;
case "quarterly":
annualRevenue = subscription.revenue * 4;
break;
case "annual":
annualRevenue = subscription.revenue;
break;
default:
annualRevenue = subscription.revenue * 12;
}
</cfscript>
<div style="background: white; padding: 20px; margin: 15px 0; border-radius: 8px; border-left: 5px solid #statusColor#; box-shadow: 0 2px 4px rgba(0,0,0,0.1);">
<div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 20px; align-items: start;">
<!-- Subscription Information -->
<div>
<h3 style="margin-top: 0; color: ##333;">#subscription.customer#</h3>
<p><strong>Subscription ID:</strong> #subscription.id#</p>
<p><strong>Plan:</strong> <span style="color: #planConfig.color#; font-weight: bold;">#subscription.plan#</span></p>
<p><strong>Billing:</strong> #billingConfig.name# ($#NumberFormat(subscription.revenue, "999")#)</p>
<p><strong>Status:</strong> <span style="color: #statusColor#; font-weight: bold;">#currentStatus#</span></p>
<p><strong>Annual Value:</strong> $#NumberFormat(annualRevenue, "9,999")#</p>
</div>
<!-- Date Information -->
<div>
<h4 style="margin-top: 0;">📅 Key Dates</h4>
<p><strong>Start Date:</strong> #DateFormat(subscriptionStart, "mmmm d, yyyy")#</p>
<p><strong>Trial End:</strong> #DateFormat(trialEnd, "mmmm d, yyyy")#</p>
<p><strong>First Billing:</strong> #DateFormat(firstBillingDate, "mmmm d, yyyy")#</p>
<cfif subscription.status NEQ "churned">
<p><strong>Next Billing:</strong> #DateFormat(nextBillingDate, "mmmm d, yyyy")#</p>
</cfif>
<p><strong>Days Active:</strong> #daysSinceStart# days (#monthsActive# months)</p>
</div>
<!-- Technical Details -->
<div>
<h4 style="margin-top: 0;">⚙️ CreateDate Usage</h4>
<div style="background: ##f8f9fa; padding: 10px; border-radius: 3px; font-family: monospace; font-size: 0.85em;">
<strong>Subscription Start:</strong><br>
CreateDate(#subscription.startYear#, #subscription.startMonth#, #subscription.startDay#)<br><br>
<strong>Result:</strong><br>
#DateFormat(subscriptionStart, "yyyy-mm-dd")# 00:00:00<br><br>
<strong>Trial End:</strong><br>
DateAdd("d", #subscription.trialDays - 1#, start)
</div>
</div>
</div>
<!-- Status Banner -->
<div style="background: #statusColor#; color: white; padding: 12px; border-radius: 5px; margin-top: 15px; text-align: center;">
<strong>#statusDescription#</strong>
</div>
<!-- Plan Features -->
<div style="background: ##f8f9fa; padding: 15px; border-radius: 5px; margin-top: 15px;">
<div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 15px; text-align: center;">
<div>
<h5 style="margin: 0; color: #planConfig.color#;">#subscription.plan# Plan</h5>
<p style="margin: 5px 0 0 0; font-size: 0.9em;">Premium features included</p>
</div>
<div>
<h5 style="margin: 0; color: ##666;">#planConfig.features# Features</h5>
<p style="margin: 5px 0 0 0; font-size: 0.9em;">Available features</p>
</div>
<div>
<h5 style="margin: 0; color: ##666;">#planConfig.users# Users</h5>
<p style="margin: 5px 0 0 0; font-size: 0.9em;">User limit</p>
</div>
</div>
</div>
<!-- Billing Schedule -->
<cfif ArrayLen(billingSchedule) GT 0>
<div style="background: ##e8f5e8; padding: 15px; border-radius: 5px; margin-top: 15px;">
<h5 style="margin-top: 0;">💰 Billing Schedule (#billingConfig.name#)</h5>
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 10px; max-height: 200px; overflow-y: auto;">
<cfloop array="#billingSchedule#" index="billing">
<div style="background: white; padding: 8px; border-radius: 3px; border-left: 3px solid #billing.statusColor#;">
<div style="display: flex; justify-content: space-between; align-items: center;">
<div>
<strong>Cycle #billing.cycle#</strong>
<p style="margin: 2px 0 0 0; font-size: 0.85em;">#DateFormat(billing.date, "mmm d, yyyy")#</p>
</div>
<div style="text-align: right;">
<p style="margin: 0; font-weight: bold; font-size: 0.9em;">$#NumberFormat(billing.amount, "999")#</p>
<p style="margin: 2px 0 0 0; font-size: 0.8em; color: #billing.statusColor#;">#billing.status#</p>
</div>
</div>
</div>
</cfloop>
</div>
</div>
</cfif>
<!-- Action Items -->
<div style="background: rgba(255,255,255,0.8); padding: 12px; border-radius: 5px; margin-top: 15px;">
<strong>📋 Subscription Actions:</strong>
<cfif currentStatus EQ "Trial Active">
<br>• Monitor trial usage and engagement metrics
<br>• Send trial progress updates and feature highlights
<br>• Prepare conversion campaign for trial end
<br>• Schedule demo or consultation call
<cfelseif currentStatus EQ "Trial Ending Today">
<br>• Send urgent conversion offer and incentives
<br>• Contact customer for immediate renewal discussion
<br>• Provide personalized onboarding assistance
<br>• Offer extended trial if needed
<cfelseif currentStatus EQ "Active Subscription">
<br>• Monitor usage patterns and satisfaction metrics
<br>• Send billing reminders and invoices on schedule
<br>• Identify upselling and cross-selling opportunities
<br>• Maintain regular customer success check-ins
<cfelseif currentStatus EQ "Churned">
<br>• Conduct exit interview and gather feedback
<br>• Archive subscription data and billing history
<br>• Add to win-back marketing campaign list
<br>• Update customer status in CRM system
</cfif>
</div>
</div>
</cfloop>
<h2>📊 Subscription Business Dashboard</h2>
<div style="background: ##f8f9fa; padding: 20px; border-radius: 8px; margin: 15px 0;">
<cfscript>
// Calculate business metrics
totalSubscriptions = ArrayLen(subscriptions);
activeSubscriptions = 0;
trialSubscriptions = 0;
churnedSubscriptions = 0;
totalMRR = 0; // Monthly Recurring Revenue
totalARR = 0; // Annual Recurring Revenue
trialConversions = 0;
upcomingBillings = 0; // Next 30 days
for (subscription in subscriptions) {
switch(subscription.status) {
case "active":
activeSubscriptions++;
break;
case "trial":
trialSubscriptions++;
break;
case "churned":
churnedSubscriptions++;
break;
}
// Calculate recurring revenue
if (subscription.status EQ "active") {
switch(subscription.billing) {
case "monthly":
totalMRR += subscription.revenue;
totalARR += subscription.revenue * 12;
break;
case "quarterly":
totalMRR += subscription.revenue / 3;
totalARR += subscription.revenue * 4;
break;
case "annual":
totalMRR += subscription.revenue / 12;
totalARR += subscription.revenue;
break;
}
}
// Check for upcoming billings
subscriptionStart = CreateDate(subscription.startYear, subscription.startMonth, subscription.startDay);
firstBillingDate = DateAdd("d", subscription.trialDays, subscriptionStart);
billingConfig = billingCycles[subscription.billing];
nextBillingDate = DateAdd(billingConfig.interval, billingConfig.multiplier, firstBillingDate);
if (subscription.status NEQ "churned" AND DateDiff("d", Now(), nextBillingDate) LE 30 AND DateDiff("d", Now(), nextBillingDate) GTE 0) {
upcomingBillings++;
}
}
// Calculate conversion and churn rates
conversionRate = totalSubscriptions > 0 ? (activeSubscriptions / totalSubscriptions) * 100 : 0;
churnRate = totalSubscriptions > 0 ? (churnedSubscriptions / totalSubscriptions) * 100 : 0;
// Calculate average revenue per user
averageARPU = activeSubscriptions > 0 ? totalMRR / activeSubscriptions : 0;
</cfscript>
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 20px;">
<div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
<h3 style="margin: 0; color: ##28a745;">#activeSubscriptions#</h3>
<p style="margin: 5px 0 0 0;">Active Subscriptions</p>
</div>
<div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
<h3 style="margin: 0; color: ##17a2b8;">#trialSubscriptions#</h3>
<p style="margin: 5px 0 0 0;">Trial Subscriptions</p>
</div>
<div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
<h3 style="margin: 0; color: ##6c757d;">#churnedSubscriptions#</h3>
<p style="margin: 5px 0 0 0;">Churned Customers</p>
</div>
<div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
<h3 style="margin: 0; color: ##fd7e14;">$#NumberFormat(totalMRR, "9,999")#</h3>
<p style="margin: 5px 0 0 0;">Monthly Recurring Revenue</p>
</div>
</div>
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 20px; margin-top: 20px;">
<div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
<h3 style="margin: 0; color: ##6f42c1;">$#NumberFormat(totalARR, "99,999")#</h3>
<p style="margin: 5px 0 0 0;">Annual Recurring Revenue</p>
</div>
<div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
<h3 style="margin: 0; color: ##28a745;">#NumberFormat(conversionRate, "0.0")#%</h3>
<p style="margin: 5px 0 0 0;">Conversion Rate</p>
</div>
<div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
<h3 style="margin: 0; color: ##dc3545;">#NumberFormat(churnRate, "0.0")#%</h3>
<p style="margin: 5px 0 0 0;">Churn Rate</p>
</div>
<div style="background: white; padding: 15px; border-radius: 5px; text-align: center;">
<h3 style="margin: 0; color: ##17a2b8;">$#NumberFormat(averageARPU, "999")#</h3>
<p style="margin: 5px 0 0 0;">Average Revenue Per User</p>
</div>
</div>
</div>
</cfoutput>
