From 741e36795f4466305bac86570e3df33053033033 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. --- 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