From ebcccf33963a803e7a58c75a15afe3c488c6a7fc Mon Sep 17 00:00:00 2001 From: Emmi Takkinen Date: Wed, 4 Mar 2020 13:54:34 +0200 Subject: [PATCH] Bug 19475: Don't copy holiday if it already exists in target calendar Calendars copy tool created duplicate values to database. Holidays in target calendar weren't checked before inserting new holidays. This patch fixes this. To test: 1. Add holidays for branch A 2. Copy branch A calendar to branch B 3. Repeat copy to branch B => Check database, branch B has now duplicate holidays 4. Delete holidays from branches A and B 5. Apply patch 6. Repeat steps 1-3 => Check database, no duplicates Sponsored-by: Koha-Suomi Oy Signed-off-by: Michal Denar --- C4/Calendar.pm | 38 ++++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/C4/Calendar.pm b/C4/Calendar.pm index 321aad76d5..76c498ffaa 100644 --- a/C4/Calendar.pm +++ b/C4/Calendar.pm @@ -690,14 +690,36 @@ sub copy_to_branch { my $today = sprintf ISO_DATE_FORMAT, $y,$m,$d; my $wdh = $self->get_week_days_holidays; - $target_calendar->insert_week_day_holiday( weekday => $_, %{ $wdh->{$_} } ) - foreach keys %$wdh; - $target_calendar->insert_day_month_holiday(%$_) - foreach values %{ $self->get_day_month_holidays }; - $target_calendar->insert_exception_holiday(%$_) - foreach grep { $_->{date} gt $today } values %{ $self->get_exception_holidays }; - $target_calendar->insert_single_holiday(%$_) - foreach grep { $_->{date} gt $today } values %{ $self->get_single_holidays }; + my $target_wdh = $target_calendar->get_week_days_holidays; + foreach my $key (keys %$wdh) { + unless (grep { $_ eq $key } keys %$target_wdh) { + $target_calendar->insert_week_day_holiday( weekday => $key, %{ $wdh->{$key} } ) + } + } + + my $dmh = $self->get_day_month_holidays; + my $target_dmh = $target_calendar->get_day_month_holidays; + foreach my $values (values %$dmh) { + unless (grep { $_->{day} eq $values->{day} && $_->{month} eq $values->{month} } values %$target_dmh) { + $target_calendar->insert_day_month_holiday(%{ $values }); + } + } + + my $exception_holidays = $self->get_exception_holidays; + my $target_exceptions = $target_calendar->get_exception_holidays; + foreach my $values ( grep {$_->{date} gt $today} values %{ $exception_holidays }) { + unless ( grep { $_->{date} eq $values->{date} } values %$target_exceptions) { + $target_calendar->insert_exception_holiday(%{ $values }); + } + } + + my $single_holidays = $self->get_single_holidays; + my $target_singles = $target_calendar->get_single_holidays; + foreach my $values ( grep {$_->{date} gt $today} values %{ $single_holidays }) { + unless ( grep { $_->{date} eq $values->{date} } values %$target_singles){ + $target_calendar->insert_single_holiday(%{ $values }); + } + } return 1; } -- 2.11.0