From bca351113d8226345d9773c2a6a83abfbedfd790 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 Council Sponsored-by: Cheshire East Council Sponsored-by: Newcastle City Council Sponsored-by: Sefton Council Signed-off-by: Liz Rea Signed-off-by: Josef Moravec Signed-off-by: Martin Renvoize --- Koha/Calendar.pm | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/Koha/Calendar.pm b/Koha/Calendar.pm index 3c0d26fa49..9781f69178 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.39.5