Calendar category report:

- Fix weekend and holidays don't for multidays events
This commit is contained in:
Hadi Nategh 2016-11-16 18:54:29 +01:00
parent 76f5a91c75
commit 2d100f082d

View File

@ -90,10 +90,11 @@ class calendar_category_report extends calendar_ui{
foreach ($events as &$event) foreach ($events as &$event)
{ {
$categories = explode(',', $event['category']); $categories = explode(',', $event['category']);
if (!in_array($cat_id, $categories) || ($weekend && self::isWeekend($event['start'])) || (!$holidays && $this->isHoliday($event['start']))) continue; if (!in_array($cat_id, $categories)) continue;
// processing day as timestamp // processing day as timestamp
$day_timestamp = strtotime($day_index); $day_timestamp = strtotime($day_index);
// week number // week number
$week_number = date('W', $day_timestamp); $week_number = date('W', $day_timestamp);
@ -101,10 +102,28 @@ class calendar_category_report extends calendar_ui{
// check if multidays event starts before start range // check if multidays event starts before start range
$is_over_range_event = $day_timestamp< $event['end'] && $start_range > $event['start']; $is_over_range_event = $day_timestamp< $event['end'] && $start_range > $event['start'];
$is_multiple_days_event = $event['start']< $day_timestamp && $day_timestamp< $event['end'];
if (($weekend && self::isWeekend($day_timestamp)) || (!$holidays && $this->isHoliday($day_timestamp)))
{
// calculate reduction of holidays or weekend amounts from
// multidays event
if ($is_multiple_days_event)
{
$day_diff_to_end = $event['end'] - $day_timestamp;
$reduction_amount = $day_diff_to_end > 86400? 86400: $day_diff_to_end;
$events_log['reductions'][$event['owner']][$cat_id] = $events_log['reductions'][$event['owner']][$cat_id] + $reduction_amount;
}
continue;
}
// Mark multidays event as counted after the first day of event, therefore // Mark multidays event as counted after the first day of event, therefore
// we can procced calculating the amount of the event via the first day // we can procced calculating the amount of the event via the first day
// and mark as counted for the rest of the days to avoid miscalculation. // and mark as counted for the rest of the days to avoid miscalculation.
if ($event['start']< $day_timestamp && $day_timestamp< $event['end']) if ($event['start']< $day_timestamp && $day_timestamp< $event['end'] &&
($events_log[$week_number][$event['id']]['counted'] ||
$events_log[$previous_week_number][$event['id']]['counted']))
{ {
$events_log[$week_number][$event['id']]['counted'] = true; $events_log[$week_number][$event['id']]['counted'] = true;
} }
@ -136,6 +155,7 @@ class calendar_category_report extends calendar_ui{
{ {
$amount = $event['end'] - $event['start']; $amount = $event['end'] - $event['start'];
} }
$events_log[$week_number][$event['id']]['counted'] = true;
} }
// store day // store day
$day[$event['owner']][$cat_id][$event['id']] = array ( $day[$event['owner']][$cat_id][$event['id']] = array (
@ -330,7 +350,9 @@ class calendar_category_report extends calendar_ui{
$cats_row = array(); $cats_row = array();
foreach ($categories as $cat_id) foreach ($categories as $cat_id)
{ {
$cats_row [$cat_id] = ceil($cats_data[$cat_id]['amount']? $cats_data[$cat_id]['amount'] / $cats_data[$cat_id]['unit']: 0); $cats_row [$cat_id] = ceil($cats_data[$cat_id]['amount']?
($cats_data[$cat_id]['amount'] - $events_log['reductions'][$user_id][$cat_id]) /
$cats_data[$cat_id]['unit']: 0);
} }
// printout each row into file // printout each row into file
fputcsv($fp, array_values(array(Api\Accounts::id2name($user_id, 'account_fullname')) + $cats_row)); fputcsv($fp, array_values(array(Api\Accounts::id2name($user_id, 'account_fullname')) + $cats_row));