Version: 0.9
Type: Function
Category: Calendars/Dates
License: GNU General Public License
Description: Takes a date, and advance it to the next X business days. If the date falls on weekend, then it'll advance from the next Monday. For example, you have 3 processing days for all orders: Given Order Date: 2002-12-31 Script will return Ship date: 2003-1-3 @param $orderDate the starting date in the form YYYY-MM-DD or YYYY/MM/DD
<?php
/**
By Maresa Nirwan (mnirwan@microshell.com)
written: 2002-11-17
Ver: 0.9
Takes a date, and advance it to the next $ORDER_PROCESSING_DAYS business days.
If the date falls on weekend, then it'll advance from the next Monday.
For example, you have 3 processing days for all orders:
Given Order Date: 2002-12-31
Script will return Ship date: 2003-1-3
@param $orderDate the starting date in the form YYYY-MM-DD or YYYY/MM/DD
*/
function generateShipDate ($orderDate = "")
{
/**
If you don't have global config file, use this instead
$ORDER_PROCESSING_DAYS = X;
where X is the number of business days
*/
global $ORDER_PROCESSING_DAYS;
if ($orderDate == "")
$orderDate = date("Y-m-d");
if (strpos($orderDate, "-"))
$charDelim = "-";
else if (strpos($orderDate, "/"))
$charDelim = "/";
list($year, $month, $date) = explode($charDelim, $orderDate);
/**
Change 1990 to earliest year you want
*/
if ($year <= 1990 || $month <= 0 || $month > 12 || $date <= 0 || $date > 31)
{
$year = date("Y");
$month = date("m");
$date = date("d");
}
$a=(int)((14-$month) / 12);
$y=$year-$a;
$m=$month + (12*$a) - 2;
/**
The following line will return days in week as follows:
0 = Sunday
1 = Monday
...
6 = Saturday
*/
$dayName=($date + $y + (int)($y/4) - (int)($y/100) + (int)($y/400) + (int)((31*$m)/12)) % 7;
/**
If the date falls on weekend, add 1 or 2 days to $ORDER_PROCESSING_DAYS
because we don't consider weekend as business day.
Add 1 to $ORDER_PROCESSING_DAYS if the date is a Sunday
Add 2 to $ORDER_PROCESSING_DAYS if the date is a Saturday
*/
if ($dayName == 6)
{
$processingDays = $ORDER_PROCESSING_DAYS + 2;
$dayName = 1;
}
else if ($dayName == 0)
{
$processingDays = $ORDER_PROCESSING_DAYS + 1;
$dayName = 1;
}
else
$processingDays = $ORDER_PROCESSING_DAYS;
$actualProcessingDays = $processingDays + ((int)(($processingDays - 1) / 5)) * 2;
$date = $date + $actualProcessingDays;
do
{
switch ($month)
{
case 4:
case 6:
case 9:
case 11:
$maxDaysInMonth = 30;
break;
case 2: // February Check
if (($year/4)==(floor($year/4)))
{
if (($year/100)==(floor($year/100)))
{
if (($year==1600) or ($year==2000) or ($year==2400))
$maxDaysInMonth = 29;
else
$maxDaysInMonth = 28;
} else
$maxDaysInMonth = 29;
} else
$maxDaysInMonth = 28;
break;
default:
$maxDaysInMonth = 31;
}
if ($date <= $maxDaysInMonth)
break;
else
{
$date = $date - $maxDaysInMonth;
if ($month == 12)
{
$month = 1;
$year++;
}
else
$month++;
}
} while ($date > $maxDaysInMonth);
return "$year-$month-$date";
}
?>