acq vandelay : ML create po assets 2; cleanup
authorBill Erickson <berick@esilibrary.com>
Thu, 8 Dec 2011 16:52:28 +0000 (11:52 -0500)
committerBill Erickson <berick@esilibrary.com>
Fri, 6 Jan 2012 15:05:32 +0000 (10:05 -0500)
Signed-off-by: Bill Erickson <berick@esilibrary.com>
Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/Order.pm

index 9b33e6d..63abd7f 100644 (file)
@@ -295,9 +295,11 @@ sub delete_lineitem {
 # begins and commit transactions as it goes
 sub create_lineitem_list_assets {
     my($mgr, $li_ids, $vandelay) = @_;
-    return undef if check_import_li_marc_perms($mgr, $li_ids);
 
-    $logger->info("acq-vl: processing recs via Vandelay with args " . Dumper($vandelay));
+    if (check_import_li_marc_perms($mgr, $li_ids)) { # event on error
+        $logger->error("acq-vl: user does not have permission to import acq records");
+        return undef;
+    }
 
     my $res = import_li_bibs_via_vandelay($mgr, $li_ids, $vandelay);
     return undef unless $res;
@@ -313,12 +315,28 @@ sub create_lineitem_list_assets {
     return $res;
 }
 
+sub verify_vandelay_import_args {
+    my $vandelay = shift;
 
-sub import_li_bibs_via_vandelay {
-    my ($mgr, $li_ids, $vandelay) = @_;
-    my $res = {li_ids => []};
-    my $e = $mgr->editor;
-    $e->xact_begin;
+    # we need a queue
+    return 0 unless $vandelay and 
+        ($vandelay->{queue_name} or $vandelay->{existing_queue});
+
+    # no-match import
+    return 1 if $vandelay->{import_no_match} and $vandelay->{bib_source};
+
+    # match-based merge/overlay import
+    return 1 if $vandelay->{merge_profile} and (
+        $vandelay->{auto_overlay_exact} or
+        $vandelay->{auto_overlay_1match} or
+        $vandelay->{auto_overlay_best_match}
+    );
+
+    return 0;
+}
+
+sub find_or_create_vandelay_queue {
+    my ($e, $vandelay) = @_;
 
     my $queue;
     if (my $name = $vandelay->{queue_name}) {
@@ -341,22 +359,51 @@ sub import_li_bibs_via_vandelay {
             $queue->name($name); 
             $queue->owner($e->requestor->id);
             $queue->match_set($vandelay->{match_set} || undef); # avoid ''
-            $queue = $e->create_vandelay_bib_queue($queue) or return $res;
+            $queue = $e->create_vandelay_bib_queue($queue) or return undef;
         }
 
     } else {
-        $queue = $e->retrieve_vandelay_queue($vandelay->{existing_queue})
+        $queue = $e->retrieve_vandelay_bib_queue($vandelay->{existing_queue})
             or return undef;
     }
+    
+    return $queue;
+}
+
+
+sub import_li_bibs_via_vandelay {
+    my ($mgr, $li_ids, $vandelay) = @_;
+    my $res = {li_ids => []};
+    my $e = $mgr->editor;
+    $e->xact_begin;
+
+    my $needs_importing = $e->search_acq_lineitem(
+        {id => $li_ids, eg_bib_id => undef}, 
+        {idlist => 1}
+    );
+
+    if (!@$needs_importing) {
+        $logger->info("acq-vl: all records already imported.  no Vandelay work to do");
+        return {li_ids => $li_ids};
+    }
+
+    # add the already-imported records to the response list
+    push(@{$res->{li_ids}}, grep { $_ != @$needs_importing } @$li_ids);
 
+    $logger->info("acq-vl: processing recs via Vandelay with args: ".Dumper($vandelay));
 
-    return $res unless $queue;
+    if (!verify_vandelay_import_args($vandelay)) {
+        $logger->error("acq-vl: invalid vandelay arguments for acq import");
+        return $res;
+    }
+
+    my $queue = find_or_create_vandelay_queue($e, $vandelay) or return $res;
     $mgr->{args}->{queue} = $queue;
 
     # load the lineitems into the queue for merge processing
     my @vqbr_ids;
     my @lis;
-    for my $li_id (@$li_ids) {
+    for my $li_id (@$needs_importing) {
 
         my $li = $e->retrieve_acq_lineitem($li_id) or return $res;
 
@@ -400,7 +447,7 @@ sub import_li_bibs_via_vandelay {
             next;
         }
 
-        # "imported" here refers to the vqbr, not the 
+        # "imported" refers to the vqbr id, not the 
         # success/failure of the vqbr merge attempt
         next unless $stat->{imported};
 
@@ -415,14 +462,17 @@ sub import_li_bibs_via_vandelay {
             push(@success_lis, $li_id);
             $mgr->add_bib;
             $mgr->respond;
-            $logger->info("acq-vl: acq lineitem $li_id successfully imported");
+            $logger->info("acq-vl: acq lineitem $li_id successfully merged/imported");
         } 
     }
 
     $ses->kill_me;
     $logger->info("acq-vl: successfully imported lineitems [@success_lis]");
 
-    return {queue => $queue, li_ids => \@success_lis};
+    # add the successfully imported lineitems to the already-imported lineitems
+    push (@{$res->{li_ids}}, @success_lis);
+
+    return $res;
 }
 
 # returns event on error, undef on success
@@ -1522,7 +1572,8 @@ __PACKAGE__->register_method(
             {desc => 'The purchase order id', type => 'number'},
         ],
         return => {desc => 'Streams a total versus completed counts object, event on error'}
-    }
+    },
+    max_chunk_count => 1
 );
 
 sub create_po_assets {
@@ -1576,7 +1627,8 @@ __PACKAGE__->register_method(
             {desc => 'purchase_order to create', type => 'object'}
         ],
         return => {desc => 'The purchase order id, Event on failure'}
-    }
+    },
+    max_chunk_count => 1
 );
 
 sub create_purchase_order_api {
@@ -1620,7 +1672,7 @@ sub create_purchase_order_api {
     $e->xact_commit;
 
     if($li_ids and $vandelay) {
-        create_lineitem_list_assets($mgr, $li_ids) or return $e->die_event;
+        create_lineitem_list_assets($mgr, $li_ids, $vandelay) or return $e->die_event;
     }
 
     return $mgr->respond_complete;
@@ -2280,7 +2332,8 @@ sub activate_purchase_order_impl {
     my $vl_resp; # imported li's and the queue the managing queue
     if (!$dry_run) {
         $e->rollback; # read-only thus far
-        $vl_resp = create_lineitem_list_assets($mgr, $li_ids, $vandelay) or return $e->die_event;
+        $vl_resp = create_lineitem_list_assets($mgr, $li_ids, $vandelay)
+            or return OpenILS::Event->new('ACQ_LI_IMPORT_FAILED');
         $e->xact_begin;
     }