* Refactor holidayModel::getActualWorkingDays, and modify its unit test.
This commit is contained in:
+14
-27
@@ -184,6 +184,7 @@ class holidayModel extends model
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取实际工作日。
|
||||
* Get actual working days.
|
||||
*
|
||||
* @param string $begin
|
||||
@@ -191,40 +192,32 @@ class holidayModel extends model
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getActualWorkingDays($begin, $end)
|
||||
public function getActualWorkingDays(string $begin, string $end): array
|
||||
{
|
||||
if(empty($begin) or empty($end) or $begin == '0000-00-00' or $end == '0000-00-00') return array();
|
||||
|
||||
$actualDays = array();
|
||||
$currentDay = $begin;
|
||||
if(empty($begin) || empty($end) || $begin == '0000-00-00' || $end == '0000-00-00') return array();
|
||||
|
||||
/* Get holidays, working days and weekend days .*/
|
||||
$holidays = $this->getHolidays($begin, $end);
|
||||
$workingDays = $this->getWorkingDays($begin, $end);
|
||||
$weekend = isset($this->config->project->weekend) ? $this->config->project->weekend : 2;
|
||||
|
||||
/* When the start date and end date are the same. */
|
||||
$actualDays = array();
|
||||
if($begin == $end)
|
||||
{
|
||||
if(in_array($begin, $workingDays)) return $actualDays[] = $begin;
|
||||
if(in_array($begin, $holidays)) return $actualDays;
|
||||
if(in_array($begin, $workingDays)) return array($begin);
|
||||
if(in_array($begin, $holidays)) return array();
|
||||
|
||||
$w = date('w', strtotime($begin));
|
||||
if($weekend == 2)
|
||||
{
|
||||
if($w == 0 or $w == 6) return $actualDays;
|
||||
}
|
||||
else
|
||||
{
|
||||
if($w == 0) return $actualDays;
|
||||
}
|
||||
if($w == 0 || ($weekend == 2 && $w == 6)) return array();
|
||||
|
||||
$actualDays[] = $begin;
|
||||
return $actualDays;
|
||||
return array($begin);
|
||||
}
|
||||
|
||||
for($i = 0; $currentDay < $end; $i ++)
|
||||
/* Process actual working days. */
|
||||
for($i = 0, $currentDay = $begin; $currentDay < $end; $i ++)
|
||||
{
|
||||
$currentDay = date('Y-m-d', strtotime("$begin + $i days"));
|
||||
$currentDay = date('Y-m-d', strtotime("{$begin} + {$i} days"));
|
||||
$w = date('w', strtotime($currentDay));
|
||||
|
||||
if(in_array($currentDay, $workingDays))
|
||||
@@ -234,14 +227,8 @@ class holidayModel extends model
|
||||
}
|
||||
|
||||
if(in_array($currentDay, $holidays)) continue;
|
||||
if($weekend == 2)
|
||||
{
|
||||
if($w == 0 or $w == 6) continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if($w == 0) continue;
|
||||
}
|
||||
if($w == 0 || ($weekend == 2 && $w == 6)) continue;
|
||||
|
||||
$actualDays[] = $currentDay;
|
||||
}
|
||||
|
||||
|
||||
@@ -177,15 +177,18 @@ class holidayTest
|
||||
}
|
||||
|
||||
/**
|
||||
* Test getActualWorkingDays method.
|
||||
* 测试获取实际工作日。
|
||||
* Test get actual working days.
|
||||
*
|
||||
* @param string $begin
|
||||
* @param string $end
|
||||
* @access public
|
||||
* @return int
|
||||
* @return int|array
|
||||
*/
|
||||
public function getActualWorkingDaysTest($begin, $end)
|
||||
public function getActualWorkingDaysTest(string $begin, string $end): int|array
|
||||
{
|
||||
$begin = $begin ? date('Y-m-d', strtotime($begin)) : '0000-00-00';
|
||||
$end = $end ? date('Y-m-d', strtotime($end)) : '';
|
||||
$objects = $this->objectModel->getActualWorkingDays($begin, $end);
|
||||
|
||||
if(dao::isError()) return dao::getError();
|
||||
|
||||
@@ -2,6 +2,10 @@
|
||||
<?php
|
||||
include dirname(__FILE__, 5) . '/test/lib/init.php';
|
||||
include dirname(__FILE__, 2) . '/holiday.class.php';
|
||||
|
||||
zdTable('holiday')->gen(50);
|
||||
zdTable('user')->gen(1);
|
||||
|
||||
su('admin');
|
||||
|
||||
/**
|
||||
@@ -10,22 +14,18 @@ title=测试 holidayModel->getActualWorkingDays();
|
||||
cid=1
|
||||
pid=1
|
||||
|
||||
查询2022-04-01到2022-04-10的实际工作日 >> 8
|
||||
查询2022-04-06到2022-04-12的实际工作日 >> 7
|
||||
查询2022-05-10到2022-05-10的实际工作日 >> 9
|
||||
查询2022-05-10到2022-05-10的实际工作日 >> 1
|
||||
查询2022-05-13到2022-05-13的实际工作日 >> 1
|
||||
查询2022-05-14到2022-05-14的实际工作日 >> 0
|
||||
测试传入0000-00-00的情况 >> 0
|
||||
|
||||
*/
|
||||
|
||||
$holiday = new holidayTest();
|
||||
$begin = array('-14 day', '-7 day', '+7 day', '+14 day', '');
|
||||
$end = array('+7 day', '+14 day', '');
|
||||
|
||||
r($holiday->getActualWorkingDaysTest('2022-04-01', '2022-04-10')) && p() && e('8'); //查询2022-04-01到2022-04-10的实际工作日
|
||||
r($holiday->getActualWorkingDaysTest('2022-04-06', '2022-04-12')) && p() && e('7'); //查询2022-04-06到2022-04-12的实际工作日
|
||||
r($holiday->getActualWorkingDaysTest('2022-05-10', '2022-05-20')) && p() && e('9'); //查询2022-05-10到2022-05-10的实际工作日
|
||||
r($holiday->getActualWorkingDaysTest('2022-04-06', '2022-04-06')) && p() && e('1'); //查询2022-05-10到2022-05-10的实际工作日
|
||||
r($holiday->getActualWorkingDaysTest('2022-05-13', '2022-05-13')) && p() && e('1'); //查询2022-05-13到2022-05-13的实际工作日
|
||||
r($holiday->getActualWorkingDaysTest('2022-05-14', '2022-05-14')) && p() && e('0'); //查询2022-05-14到2022-05-14的实际工作日
|
||||
r($holiday->getActualWorkingDaysTest('0000-00-00', '0000-00-00')) && p() && e('0'); //测试传入0000-00-00的情况
|
||||
r($holiday->getActualWorkingDaysTest($begin[0], $end[0])) && p() && e('19'); // 返回处于 14天前 到 7天后 之间的实际工作日。
|
||||
r($holiday->getActualWorkingDaysTest($begin[0], $end[1])) && p() && e('24'); // 返回处于 14天前 到 14天后 之间的实际工作日。
|
||||
r($holiday->getActualWorkingDaysTest($begin[1], $end[0])) && p() && e('13'); // 返回处于 7天前 到 7天后 之间的实际工作日。
|
||||
r($holiday->getActualWorkingDaysTest($begin[1], $end[1])) && p() && e('18'); // 返回处于 7天前 到 14天后 之间的实际工作日。
|
||||
r($holiday->getActualWorkingDaysTest($begin[2], $end[0])) && p() && e('0'); // 测试开始和结束日期相同的实际工作日。
|
||||
r($holiday->getactualworkingdaystest($begin[3], $end[0])) && p() && e('0'); // 测试当结束日期小于开始日期时。
|
||||
r($holiday->getactualworkingdaystest($begin[4], $end[0])) && p() && e('0'); // 测试输入开始日期为空。
|
||||
r($holiday->getactualworkingdaystest($begin[0], $end[2])) && p() && e('0'); // 测试输入结束日期为空。
|
||||
r($holiday->getactualworkingdaystest($begin[4], $end[2])) && p() && e('0'); // 测试输入开始和结束日期为空。
|
||||
|
||||
Reference in New Issue
Block a user