From e5c8a8f0936eb0b5276c6b390107714793a99776 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 --- 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