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