# 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;
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}) {
$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;
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};
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
{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 {
{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 {
$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;
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;
}