From aed57b523eb64d40d8dedc87cc8992d255b71c24 Mon Sep 17 00:00:00 2001 From: Alexander Blanchard Date: Thu, 3 Apr 2025 10:15:18 +0000 Subject: [PATCH] Bug 38633: Prevent holidays from being ignored If weekly repeatable holidays are set, Koha ignores these days when other holidays are set using the Holidays repeated yearly on a range option. To test: 1) Navigate to Tools > Calendar 2) Click on a weekend date on the calendar to open the Add New Holiday option 3) Give your holiday a title and select Holiday repeated every same day of the week 4) Click on the calendar again and set a holiday from 20 December 2021 to 06 January 2022 5) Give your holiday a title 6) Select Holidays repeated yearly on a range and click save 7) Using the calendar, navigate forwards to December 2024 and note that there are days that should be highlighted in the holdiay period that are not highlighted 8) Apply Patch 9) Run the reset_all command 10) Repeat the steps above 11) Notice that now when you click forwards through the calendar, all of the dates for your holidays repeated yearly on a range are still selected --- C4/Calendar.pm | 8 ++++++-- misc/cronjobs/staticfines.pl | 2 +- t/db_dependent/Holidays.t | 11 +++++++---- tools/exceptionHolidays.pl | 8 ++++---- tools/newHolidays.pl | 10 +++++----- 5 files changed, 23 insertions(+), 16 deletions(-) diff --git a/C4/Calendar.pm b/C4/Calendar.pm index e8b75a25d0..d5c64034c1 100644 --- a/C4/Calendar.pm +++ b/C4/Calendar.pm @@ -688,7 +688,7 @@ sub delete_exception_holiday_range { =head2 isHoliday - $isHoliday = isHoliday($day, $month $year); + $isHoliday = isHoliday($day, $month $year, $is_range_holiday_creation); C<$day> Is the day to check whether if is a holiday or not. @@ -696,10 +696,14 @@ C<$month> Is the month to check whether if is a holiday or not. C<$year> Is the year to check whether if is a holiday or not. +C<$is_range_holiday_creation> When set to 1, skips checks for existing holidays, ensuring the range includes all applicable holidays + =cut sub isHoliday { - my ( $self, $day, $month, $year ) = @_; + my ( $self, $day, $month, $year, $is_range_holiday_creation ) = @_; + + return 0 if $is_range_holiday_creation; # FIXME - date strings are stored in non-padded metric format. should change to iso. $month = $month + 0; diff --git a/misc/cronjobs/staticfines.pl b/misc/cronjobs/staticfines.pl index 2d1895c251..599ce0b100 100755 --- a/misc/cronjobs/staticfines.pl +++ b/misc/cronjobs/staticfines.pl @@ -181,7 +181,7 @@ for ( my $i = 0 ; $i < scalar(@$data) ; $i++ ) { $calendars{$branchcode} = C4::Calendar->new( branchcode => $branchcode ); } $calendar = $calendars{$branchcode}; - my $isHoliday = $calendar->isHoliday( $tday, $tmonth, $tyear ); + my $isHoliday = $calendar->isHoliday( $tday, $tmonth, $tyear, 0 ); # Reassing datedue_days if -delay specified in commandline $bigdebug and warn "Using commandline supplied delay : $delay" if ($delay); diff --git a/t/db_dependent/Holidays.t b/t/db_dependent/Holidays.t index 3095475fed..8118438c99 100755 --- a/t/db_dependent/Holidays.t +++ b/t/db_dependent/Holidays.t @@ -234,18 +234,21 @@ subtest 'copy_to_branch' => sub { my $calendar2 = C4::Calendar->new( branchcode => $branch2 ); my $exceptions = $calendar2->get_exception_holidays; - is( $calendar2->isHoliday( $sunday->day, $sunday->month, $sunday->year ), 1, "Weekday holiday copied to branch 2" ); is( - $calendar2->isHoliday( $day_month->day, $day_month->month, $day_month->year ), 1, + $calendar2->isHoliday( $sunday->day, $sunday->month, $sunday->year, 0 ), 1, + "Weekday holiday copied to branch 2" + ); + is( + $calendar2->isHoliday( $day_month->day, $day_month->month, $day_month->year, 0 ), 1, "Day/month holiday copied to branch 2" ); is( - $calendar2->isHoliday( $future_date->day, $future_date->month, $future_date->year ), 1, + $calendar2->isHoliday( $future_date->day, $future_date->month, $future_date->year, 0 ), 1, "Single holiday copied to branch 2" ); is( ( grep { $_->{date} eq "9999-12-30" } values %$exceptions ), 1, "Exception holiday copied to branch 2" ); is( - $calendar2->isHoliday( $past_date->day, $past_date->month, $past_date->year ), 0, + $calendar2->isHoliday( $past_date->day, $past_date->month, $past_date->year, 0 ), 0, "Don't copy past single holidays" ); is( ( grep { $_->{date} eq "2020-03-09" } values %$exceptions ), 0, "Don't copy past exception holidays " ); diff --git a/tools/exceptionHolidays.pl b/tools/exceptionHolidays.pl index e00b26bc8d..7a2340a38e 100755 --- a/tools/exceptionHolidays.pl +++ b/tools/exceptionHolidays.pl @@ -93,7 +93,7 @@ sub edit_holiday { } } elsif ( $showoperation eq 'cud-edit' ) { if ( $holidaytype eq 'weekday' ) { - my $isHoliday = $calendar->isHoliday( $day, $month, $year ); + my $isHoliday = $calendar->isHoliday( $day, $month, $year, 0 ); if ($isHoliday) { $calendar->ModWeekdayholiday( weekday => $weekday, @@ -108,7 +108,7 @@ sub edit_holiday { ); } } elsif ( $holidaytype eq 'daymonth' ) { - my $isHoliday = $calendar->isHoliday( $day, $month, $year ); + my $isHoliday = $calendar->isHoliday( $day, $month, $year, 0 ); if ($isHoliday) { $calendar->ModDaymonthholiday( day => $day, @@ -125,7 +125,7 @@ sub edit_holiday { ); } } elsif ( $holidaytype eq 'ymd' ) { - my $isHoliday = $calendar->isHoliday( $day, $month, $year ); + my $isHoliday = $calendar->isHoliday( $day, $month, $year, 0 ); if ($isHoliday) { $calendar->ModSingleholiday( day => $day, @@ -144,7 +144,7 @@ sub edit_holiday { ); } } elsif ( $holidaytype eq 'exception' ) { - my $isHoliday = $calendar->isHoliday( $day, $month, $year ); + my $isHoliday = $calendar->isHoliday( $day, $month, $year, 0 ); if ($isHoliday) { $calendar->ModExceptionholiday( day => $day, diff --git a/tools/newHolidays.pl b/tools/newHolidays.pl index 9cca4a9bc9..7a55be7387 100755 --- a/tools/newHolidays.pl +++ b/tools/newHolidays.pl @@ -89,7 +89,7 @@ sub add_holiday { # if not, we need it. $weekday = &Date::Calc::Day_of_Week( $year, $month, $day ) % 7 unless ($weekday); } - unless ( $calendar->isHoliday( $day, $month, $year ) ) { + unless ( $calendar->isHoliday( $day, $month, $year, 0 ) ) { $calendar->insert_week_day_holiday( weekday => $weekday, title => $title, @@ -97,7 +97,7 @@ sub add_holiday { ); } } elsif ( $newoperation eq 'repeatable' ) { - unless ( $calendar->isHoliday( $day, $month, $year ) ) { + unless ( $calendar->isHoliday( $day, $month, $year, 0 ) ) { $calendar->insert_day_month_holiday( day => $day, month => $month, @@ -106,7 +106,7 @@ sub add_holiday { ); } } elsif ( $newoperation eq 'holiday' ) { - unless ( $calendar->isHoliday( $day, $month, $year ) ) { + unless ( $calendar->isHoliday( $day, $month, $year, 0 ) ) { $calendar->insert_single_holiday( day => $day, month => $month, @@ -121,7 +121,7 @@ sub add_holiday { foreach my $date (@holiday_list) { unless ( $calendar->isHoliday( - $date->{local_c}->{day}, $date->{local_c}->{month}, $date->{local_c}->{year} + $date->{local_c}->{day}, $date->{local_c}->{month}, $date->{local_c}->{year}, 0 ) ) { @@ -140,7 +140,7 @@ sub add_holiday { foreach my $date (@holiday_list) { unless ( $calendar->isHoliday( - $date->{local_c}->{day}, $date->{local_c}->{month}, $date->{local_c}->{year} + $date->{local_c}->{day}, $date->{local_c}->{month}, $date->{local_c}->{year}, 1 ) ) { -- 2.39.5