Vandelay copy overlay call number merge user/berick/vandelay-copy-overlay-cn-merge
authorBill Erickson <berick@esilibrary.com>
Wed, 4 Sep 2013 18:55:57 +0000 (14:55 -0400)
committerBill Erickson <berick@esilibrary.com>
Wed, 4 Sep 2013 19:05:09 +0000 (15:05 -0400)
When overlaying a copy, if the copy brings with it a new call number
which collides with an existing call number AND said copy is the only
copy linked to its (old) call number, merge the copy's (old) call
number into the (new) existing call number, i.e. the one we collided
with.

Signed-off-by: Bill Erickson <berick@esilibrary.com>
Open-ILS/src/perlmods/lib/OpenILS/Application/Vandelay.pm

index e7dbde7..c8b87b2 100644 (file)
@@ -22,6 +22,7 @@ use OpenILS::Application::AppUtils;
 use OpenILS::Application::Cat::BibCommon;
 use OpenILS::Application::Cat::AuthCommon;
 use OpenILS::Application::Cat::AssetCommon;
+use OpenILS::Application::Cat::Merge;
 my $U = 'OpenILS::Application::AppUtils';
 
 # A list of LDR/06 values from http://loc.gov/marc
@@ -1699,16 +1700,47 @@ sub import_record_asset_list_impl {
                     })->[0]->{count};
 
                     if ($count == 1) {
-                        # if this is the only copy attached to this 
-                        # callnumber, just update the callnumber
 
-                        $logger->info("vl: updating callnumber label in copy overlay");
-
-                        $copy->call_number->label($item->call_number);
-                        if (!$e->update_asset_call_number($copy->call_number)) {
-                            $$report_args{evt} = $e->die_event;
-                            respond_with_status($report_args);
-                            next;
+                        my $evol = $e->search_asset_call_number({
+                            id => {'<>' => $copy->call_number->id},
+                            label => $item->call_number,
+                            owning_lib => $copy->call_number->owning_lib,
+                            record => $copy->call_number->record,
+                            prefix => $copy->call_number->prefix,
+                            suffix => $copy->call_number->suffix,
+                            deleted => 'f'
+                        })->[0];
+
+                        if ($evol) {
+                            # call number for overlayed copy changed to a
+                            # label already in use by another call number.
+                            # merge the old CN into the new CN
+                            
+                            $logger->info(
+                                "vl: moving copy to new call number ".
+                                $item->call_number);
+
+                            my ($mvol, $err) = 
+                                OpenILS::Application::Cat::Merge(
+                                    $e, [$copy->call_number], $evol);
+
+                            if (!$mvol) {
+                                $$report_args{evt} = $err;
+                                respond_with_status($report_args);
+                                next;
+                            }
+
+                        } else {
+                            $logger->info(
+                                "vl: updating copy call number label".
+                                $item->call_number);
+
+                            $copy->call_number->label($item->call_number);
+                            if (!$e->update_asset_call_number($copy->call_number)) {
+                                $$report_args{evt} = $e->die_event;
+                                respond_with_status($report_args);
+                                next;
+                            }
                         }
 
                     } else {