Whatever message this page gives is out now! Go check it out!
CreateDate(year, month, day)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 |
<cfscript>
year = 2018;
month = 11;
day = 02;
myDate=CreateDate(year,month,day)
writeOutput("The date is: " & myDate);
</cfscript><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><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><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><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>