每当有人取消预订时,我都试图将资金退还给客户。由于我根据取消时间有不同的退款百分比,因此请考虑有人提前多长时间取消预订。
当前,主要有两个数据数组:
1)TimeMeta:这是预留时隙的数组。
$time_meta = array([
[
'id' => '9',
'start_date' => '2019-06-19',
'end_date' => '2019-06-19',
'start_time' => '08:00:00',
'end_time' => '09:00:00'
],
[
'id' => '10',
'start_date' => '2019-06-20',
'end_date' => '2019-06-20',
'start_time' => '08:00:00',
'end_time' => '09:00:00'
],
[
'id' => '11',
'start_date' => '2019-06-21',
'end_date' => '2019-06-20',
'start_time' => '08:00:00',
'end_time' => '09:00:00'
],
[
'id' => '12',
'start_date' => '2019-06-22',
'end_date' => '2019-06-20',
'start_time' => '08:00:00',
'end_time' => '09:00:00'
],
[
'id' => '13',
'start_date' => '2019-06-23',
'end_date' => '2019-06-23',
'start_time' => '08:00:00',
'end_time' => '09:00:00'
]
])
2)根据小时数退款价值
$refunds = array([
[
'before_hours' => '12',
'refund_percent' => '50'
],
[
'before_hours' => '24',
'refund_percent' => '70'
],
[
'before_hours' => '48',
'refund_percent' => '90'
]
])
到目前为止,我可以如下计算当前日期时间和保留日期时间之间的差值
foreach($time_meta as $ik => $iv){
$start_datetime = $iv->start_date->format('Y-m-d').' '.$iv->start_time;
$start_datetime = \Carbon\Carbon::parse($start_datetime);
$diff = $now->diffInHours($start_datetime,false);
// NEED CODE HERE TO DETERMINE THE EXACT REFUND PERCENT
// ACCORDING TO TIME DIFFERENCE BETWEEN NOW AND THE BOOKED DATE
}
现在,我想找到最匹配的退款百分比。因此,例如,如果用户尝试在23小时之前取消预订事件,则退款百分比应仅为50%,因为12小时仅比refund
数组中的23小时小。
测试用例
11 hrs before = (should not be refund) as lowest value is 12 hours before
23 hrs before = (should be refund as) 12 hours before
24 hrs before = (should be refund as) 24 hours before
46 hrs before = (should be refund as) 24 hours before
48 hrs before = (should be refund as) 48 hours before
此外,如果活动日期已经过去,那么在这种情况下,$diff
的值为负,这意味着通过日期不会退款。
答案 0 :(得分:0)
在TimeMeta数组中,它包含子数组,并且子数组包含多个保留时间数组,这需要嵌套的foreach循环。 所以TimeMeta数组可能是以下
$time_meta = [
[
'id' => '9',
'start_date' => '2019-06-19',
'end_date' => '2019-06-19',
'start_time' => '08:00:00',
'end_time' => '09:00:00'
],
[
'id' => '10',
'start_date' => '2019-06-20',
'end_date' => '2019-06-20',
'start_time' => '08:00:00',
'end_time' => '09:00:00'
],
[
'id' => '11',
'start_date' => '2019-06-21',
'end_date' => '2019-06-20',
'start_time' => '08:00:00',
'end_time' => '09:00:00'
],
[
'id' => '12',
'start_date' => '2019-06-22',
'end_date' => '2019-06-20',
'start_time' => '08:00:00',
'end_time' => '09:00:00'
],
[
'id' => '13',
'start_date' => '2019-06-23',
'end_date' => '2019-06-23',
'start_time' => '08:00:00',
'end_time' => '09:00:00'
]
];
和退款数组可能如下。
$refunds = [
[
'before_hours' => '12',
'refund_percent' => '50'
],
[
'before_hours' => '24',
'refund_percent' => '70'
],
[
'before_hours' => '48',
'refund_percent' => '90'
]
];
在TimeMeta数组中,start_date和start_time格式是正确的日期和时间格式,因此无需转换格式'Y-m-d'。
尝试以下代码,
foreach($time_meta as $data)
{
$start_datetime = $data['start_date']." ".$data['start_time'];
$start_datetime = \Carbon\Carbon::parse($start_datetime);
$diff = \Carbon::now()->diffInHours($start_datetime, false);
// NEED CODE HERE TO DETERMINE THE EXACT REFUND PERCENT
// ACCORDING TO TIME DIFFERENCE BETWEEN NOW AND THE BOOKED DATE
$refund_per = 0;
if($diff > 0)
{
foreach($refunds as $re)
{
$hr = $re['before_hours'];
if($diff < intval($hr))
{
break;
}
else if($diff == intval($hr))
{
$refund_per = $re['refund_percent'];
break;
}
$refund_per = $re['refund_percent'];
}
}
if($refund_per != 0)
{
echo "STARTING DATE :".$start_datetime." REFUND PERCENTAGE :".$refund_per ."<BR>";
}
else
{
echo "STARTING DATE :".$start_datetime." NO REFUND <BR>";
}
}
如果在退款数组中按升序排列'before_hours'值,此示例代码将正常工作。