From 7a930dd6d6c61f3bfc503e717ad41239eb4c60d4 Mon Sep 17 00:00:00 2001 From: Andrew Isherwood Date: Tue, 26 Mar 2019 14:43:34 +0000 Subject: [PATCH] Bug 15260: Fix calculation of add amount In a sequence of closed days, we should take into account the nature of each closed day as we encounter it in order to calculate the amount to add to reach the next potential closed date. We are now doing this. Sponsored-by: Cheshire West and Chester and Cheshire East Councils Sponsored-by: Newcastle City Council Sponsored-by: Sefton Council Signed-off-by: Liz Rea --- Koha/Calendar.pm | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/Koha/Calendar.pm b/Koha/Calendar.pm index 3aa7eb31f5..47c1728575 100644 --- a/Koha/Calendar.pm +++ b/Koha/Calendar.pm @@ -217,14 +217,9 @@ sub addDays { if ( $self->is_holiday($base_date) ) { my $dow = $base_date->day_of_week; my $days = $days_duration->in_units('days'); - my $push_amt = ( - # We're using Dayweek useDaysMode option - $self->{days_mode} eq 'Dayweek' && - # It's period based on weeks - $days % 7 == 0 && - # It's not a permanently closed day - !$self->{weekly_closed_days}->[$dow] == 1 - ) ? 7 : 1; + # Is it a period based on weeks + my $push_amt = $days_duration % 7 == 0 ? + $self->get_push_amt($base_date) : 1; if ( $days_duration->is_negative() ) { $base_date = $self->prev_open_days($base_date, $push_amt); } else { @@ -237,6 +232,18 @@ sub addDays { return $base_date; } +sub get_push_amt { + my ( $self, $base_date) = @_; + + my $dow = $base_date->day_of_week; + return ( + # We're using Dayweek useDaysMode option + $self->{days_mode} eq 'Dayweek' && + # It's not a permanently closed day + !$self->{weekly_closed_days}->[$dow] == 1 + ) ? 7 : 1; +} + sub is_holiday { my ( $self, $dt ) = @_; @@ -285,7 +292,8 @@ sub next_open_days { $base_date->add(days => $to_add); while ($self->is_holiday($base_date)) { - $base_date->add(days => $to_add); + my $add_next = $self->get_push_amt($base_date); + $base_date->add(days => $add_next); } return $base_date; } @@ -301,7 +309,8 @@ sub prev_open_days { $base_date->add(days => $to_sub); while ($self->is_holiday($base_date)) { - $base_date->add(days => $to_sub); + my $sub_next = $self->get_push_amt($base_date); + $base_date->add(days => $sub_next); } return $base_date; -- 2.11.0