Avoid a possible bug in selection list deletion
authorLebbeous Fogle-Weekley <lebbeous@esilibrary.com>
Thu, 6 Oct 2011 22:06:22 +0000 (18:06 -0400)
committerBill Erickson <berick@esilibrary.com>
Wed, 26 Oct 2011 21:15:49 +0000 (17:15 -0400)
This particularly matters for the "ephemeral," unnamed selection list that
Acquisitions General Search uses to hold bib records represented as
lineitems, as that list is deleted for the next run of that kind of
search.

It's possible to get lineitems onto that list that are in a state
other than "new".  Code that deletes this list first deletes the
lineitems that belong to it, but that code formerly assumed that there
are two types of lineitems. "new" ones (that should be deleted) and ones
that belong to purchase orders (that should be deatched).  That doesn't
necessarily cover all possible lineitems on the picklist, so deletion
ultimately fails.

This fixes that.

[update: now this bugfix incorporates a bugfix, the need for which was
detected by Ben Shum. See LP #869581]

Signed-off-by: Lebbeous Fogle-Weekley <lebbeous@esilibrary.com>
Signed-off-by: Bill Erickson <berick@esilibrary.com>
Open-ILS/src/perlmods/lib/OpenILS/Application/Acq/Order.pm

index 7313cc1..8e478ca 100644 (file)
@@ -855,7 +855,13 @@ sub delete_picklist {
     $picklist = $mgr->editor->retrieve_acq_picklist($picklist) unless ref $picklist;
 
     # delete all 'new' lineitems
-    my $li_ids = $mgr->editor->search_acq_lineitem({picklist => $picklist->id, state => 'new'}, {idlist => 1});
+    my $li_ids = $mgr->editor->search_acq_lineitem(
+        {
+            picklist => $picklist->id,
+            "-or" => {state => "new", purchase_order => undef}
+        },
+        {idlist => 1}
+    );
     for my $li_id (@$li_ids) {
         my $li = $mgr->editor->retrieve_acq_lineitem($li_id);
         return 0 unless delete_lineitem($mgr, $li);