Move reusable bits of build_invoice_api() into new build_invoice_impl()
authorLebbeous Fogle-Weekley <lebbeous@esilibrary.com>
Wed, 20 Feb 2013 14:41:03 +0000 (09:41 -0500)
committerLebbeous Fogle-Weekley <lebbeous@esilibrary.com>
Wed, 20 Feb 2013 14:41:03 +0000 (09:41 -0500)
This is because we're about to send EDI invoice creation through that
code instead of the separate stuff we had been doing.

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

index 7563e88..708c7df 100644 (file)
@@ -37,55 +37,32 @@ __PACKAGE__->register_method(
     }
 );
 
-sub build_invoice_api {
-    my($self, $conn, $auth, $invoice, $entries, $items) = @_;
-
-    my $e = new_editor(xact => 1, authtoken=>$auth);
-    return $e->die_event unless $e->checkauth;
-    my $evt;
 
-    if(ref $invoice) {
-        if($invoice->isnew) {
-            $invoice->receiver($e->requestor->ws_ou) unless $invoice->receiver;
-            $invoice->recv_method('PPR') unless $invoice->recv_method;
-            $invoice->recv_date('now') unless $invoice->recv_date;
-            $e->create_acq_invoice($invoice) or return $e->die_event;
-        } elsif($invoice->isdeleted) {
-            i$e->delete_acq_invoice($invoice) or return $e->die_event;
-        } else {
-            $e->update_acq_invoice($invoice) or return $e->die_event;
-        }
-    } else {
-        # caller only provided the ID
-        $invoice = $e->retrieve_acq_invoice($invoice) or return $e->die_event;
-    }
+sub build_invoice_impl {
+    my ($e, $invoice, $entries, $items, $do_commit) = @_;
 
-    return $e->die_event unless $e->allowed('CREATE_INVOICE', $invoice->receiver);
+    my $evt;
 
-    if($entries) {
+    if ($entries) {
         for my $entry (@$entries) {
             $entry->invoice($invoice->id);
 
-            if($entry->isnew) {
-
+            if ($entry->isnew) {
                 $e->create_acq_invoice_entry($entry) or return $e->die_event;
                 return $evt if $evt = update_entry_debits($e, $entry);
 
-            } elsif($entry->isdeleted) {
-
-                return $evt if $evt = rollback_entry_debits($e, $entry); 
+            } elsif ($entry->isdeleted) {
+                return $evt if $evt = rollback_entry_debits($e, $entry);
                 $e->delete_acq_invoice_entry($entry) or return $e->die_event;
+            } elsif ($entry->ischanged) {
+                my $orig_entry = $e->retrieve_acq_invoice_entry($entry->id) or
+                    return $e->die_event;
 
-            } elsif($entry->ischanged) {
-
-                my $orig_entry = $e->retrieve_acq_invoice_entry($entry->id) or return $e->die_event;
-
-                if($orig_entry->amount_paid != $entry->amount_paid or 
-                        $entry->phys_item_count != $orig_entry->phys_item_count) {
+                if ($orig_entry->amount_paid != $entry->amount_paid or
+                    $entry->phys_item_count != $orig_entry->phys_item_count) {
 
-                    return $evt if $evt = rollback_entry_debits($e, $orig_entry); 
+                    return $evt if $evt = rollback_entry_debits($e,$orig_entry);
                     return $evt if $evt = update_entry_debits($e, $entry);
-
                 }
 
                 $e->update_acq_invoice_entry($entry) or return $e->die_event;
@@ -93,12 +70,11 @@ sub build_invoice_api {
         }
     }
 
-    if($items) {
+    if ($items) {
         for my $item (@$items) {
             $item->invoice($invoice->id);
 
-            if($item->isnew) {
-
+            if ($item->isnew) {
                 $e->create_acq_invoice_item($item) or return $e->die_event;
 
                 # future: cache item types
@@ -108,45 +84,49 @@ sub build_invoice_api {
                 # prorated items are handled separately
                 unless($U->is_true($item_type->prorate)) {
                     my $debit;
-                    if($item->po_item) {
-                        my $po_item = $e->retrieve_acq_po_item($item->po_item) or return $e->die_event;
-                        $debit = $e->retrieve_acq_fund_debit($po_item->fund_debit) or return $e->die_event;
+                    if ($item->po_item) {
+                        my $po_item = $e->retrieve_acq_po_item($item->po_item)
+                            or return $e->die_event;
+                        $debit = $e->retrieve_acq_fund_debit($po_item->fund_debit)
+                            or return $e->die_event;
                     } else {
                         $debit = Fieldmapper::acq::fund_debit->new;
                         $debit->isnew(1);
                     }
                     _prepare_fund_debit_for_inv_item($debit, $item, $e);
 
-                    if($debit->isnew) {
-                        $e->create_acq_fund_debit($debit) or return $e->die_event;
+                    if ($debit->isnew) {
+                        $e->create_acq_fund_debit($debit)
+                            or return $e->die_event;
                     } else {
-                        $e->update_acq_fund_debit($debit) or return $e->die_event;
+                        $e->update_acq_fund_debit($debit)
+                            or return $e->die_event;
                     }
 
                     $item->fund_debit($debit->id);
                     $e->update_acq_invoice_item($item) or return $e->die_event;
                 }
-
-            } elsif($item->isdeleted) {
-
+            } elsif ($item->isdeleted) {
                 $e->delete_acq_invoice_item($item) or return $e->die_event;
 
-                if($item->po_item and $e->retrieve_acq_po_item($item->po_item)->fund_debit == $item->fund_debit) {
-                    # the debit is attached to the po_item.  instead of deleting it, roll it back 
-                    # to being an encumbrance.  Note: a prorated invoice_item that points to a po_item 
-                    # could point to a different fund_debit.  We can't go back in time to collect all the
-                    # prorated invoice_items (nor is the caller asking us too), so when that happens, 
-                    # just delete the extraneous debit (in the else block).
+                if ($item->po_item and
+                    $e->retrieve_acq_po_item($item->po_item)->fund_debit == $item->fund_debit) {
+                    # the debit is attached to the po_item. instead of
+                    # deleting it, roll it back to being an encumbrance.
+                    # Note: a prorated invoice_item that points to a
+                    # po_item could point to a different fund_debit. We
+                    # can't go back in time to collect all the prorated
+                    # invoice_items (nor is the caller asking us too),
+                    # so when that happens, just delete the extraneous
+                    # debit (in the else block).
                     my $debit = $e->retrieve_acq_fund_debit($item->fund_debit);
                     $debit->encumbrance('t');
                     $e->update_acq_fund_debit($debit) or return $e->die_event;
-                } elsif($item->fund_debit) {
+                } elsif ($item->fund_debit) {
                     $e->delete_acq_fund_debit($e->retrieve_acq_fund_debit($item->fund_debit))
                         or return $e->die_event;
                 }
-
-
-            } elsif($item->ischanged) {
+            } elsif ($item->ischanged) {
                 my $debit;
 
                 if (!$item->fund_debit) {
@@ -177,11 +157,41 @@ sub build_invoice_api {
     }
 
     $invoice = fetch_invoice_impl($e, $invoice->id);
-    $e->commit;
+    if ($do_commit) {
+        $e->commit or return $e->die_event;
+    }
 
     return $invoice;
 }
 
+sub build_invoice_api {
+    my($self, $conn, $auth, $invoice, $entries, $items) = @_;
+
+    my $e = new_editor(xact => 1, authtoken=>$auth);
+    return $e->die_event unless $e->checkauth;
+
+    if(ref $invoice) {
+        if($invoice->isnew) {
+            $invoice->receiver($e->requestor->ws_ou) unless $invoice->receiver;
+            $invoice->recv_method('PPR') unless $invoice->recv_method;
+            $invoice->recv_date('now') unless $invoice->recv_date;
+            $e->create_acq_invoice($invoice) or return $e->die_event;
+        } elsif($invoice->isdeleted) {
+            i$e->delete_acq_invoice($invoice) or return $e->die_event;
+        } else {
+            $e->update_acq_invoice($invoice) or return $e->die_event;
+        }
+    } else {
+        # caller only provided the ID
+        $invoice = $e->retrieve_acq_invoice($invoice) or return $e->die_event;
+    }
+
+    return $e->die_event unless
+        $e->allowed('CREATE_INVOICE', $invoice->receiver);
+
+    return build_invoice_impl($e, $invoice, $entries, $items, 1);
+}
+
 
 sub rollback_entry_debits {
     my($e, $entry) = @_;