Bug 19475: Don't copy holiday if it already exists in target calendar
authorEmmi Takkinen <emmi.takkinen@outlook.com>
Wed, 4 Mar 2020 11:54:34 +0000 (13:54 +0200)
committerMartin Renvoize <martin.renvoize@ptfs-europe.com>
Fri, 3 Apr 2020 13:26:33 +0000 (14:26 +0100)
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 <black23@gmail.com>
Signed-off-by: Fridolin Somers <fridolin.somers@biblibre.com>
Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>

C4/Calendar.pm
t/db_dependent/Holidays.t

index 321aad7..76c498f 100644 (file)
@@ -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;
 }
index 11a0ce1..0364870 100755 (executable)
@@ -317,4 +317,4 @@ subtest 'copy_to_branch' => sub {
 
     $schema->storage->txn_rollback;
 
-}
+};