my($mgr, $li_id, $skip_complete_check) = @_;
my $li = $mgr->editor->retrieve_acq_lineitem($li_id) or return 0;
+ return 0 unless $li->state eq 'on-order' or $li->state eq 'cancelled'; # sic
+
my $lid_ids = $mgr->editor->search_acq_lineitem_detail(
{lineitem => $li_id, recv_time => undef}, {idlist => 1});
__PACKAGE__->register_method(
+ method => 'receive_lineitem_batch_api',
+ api_name => 'open-ils.acq.lineitem.receive.batch',
+ signature => {
+ desc => 'Mark lineitems as received',
+ params => [
+ {desc => 'Authentication token', type => 'string'},
+ {desc => 'lineitem ID list', type => 'array'}
+ ],
+ return => {desc =>
+ q/On success, stream of objects describing changes to LIs and
+ possibly PO; onerror, Event. Any event, even after lots of other
+ objects, should mean general failure of whole batch operation./
+ }
+ }
+);
+
+sub receive_lineitem_batch_api {
+ my ($self, $conn, $auth, $li_idlist) = @_;
+
+ return unless ref $li_idlist eq 'ARRAY' and @$li_idlist;
+
+ my $e = new_editor(xact => 1, authtoken => $auth);
+ return $e->die_event unless $e->checkauth;
+
+ my $mgr = new OpenILS::Application::Acq::BatchManager(
+ editor => $e, conn => $conn
+ );
+
+ for my $li_id (map { int $_ } @$li_idlist) {
+ my $li = $e->retrieve_acq_lineitem([
+ $li_id, {
+ flesh => 1,
+ flesh_fields => { jub => ['purchase_order'] }
+ }
+ ]) or return $e->die_event;
+
+ return $e->die_event unless $e->allowed(
+ 'RECEIVE_PURCHASE_ORDER', $li->purchase_order->ordering_agency
+ );
+
+ receive_lineitem($mgr, $li_id) or return $e->die_event;
+ $mgr->respond;
+ }
+
+ $e->commit or return $e->die_event;
+ $mgr->respond_complete;
+ $mgr->run_post_response_hooks;
+}
+
+__PACKAGE__->register_method(
method => 'rollback_receive_po_api',
api_name => 'open-ils.acq.purchase_order.receive.rollback'
);
$e->commit and return $result or return $e->die_event;
}
+__PACKAGE__->register_method(
+ method => 'rollback_receive_lineitem_batch_api',
+ api_name => 'open-ils.acq.lineitem.receive.rollback.batch',
+ signature => {
+ desc => 'Mark a list of lineitems as Un-received',
+ params => [
+ {desc => 'Authentication token', type => 'string'},
+ {desc => 'lineitem ID list', type => 'array'}
+ ],
+ return => {desc =>
+ q/on success, a stream of objects describing changes to LI and
+ possibly PO; on error, Event. Any event means all previously
+ returned objects indicate changes that didn't really happen./
+ }
+ }
+);
+
+sub rollback_receive_lineitem_batch_api {
+ my ($self, $conn, $auth, $li_idlist) = @_;
+
+ return unless ref $li_idlist eq 'ARRAY' and @$li_idlist;
+
+ my $e = new_editor(xact => 1, authtoken => $auth);
+ return $e->die_event unless $e->checkauth;
+
+ my $mgr = new OpenILS::Application::Acq::BatchManager(
+ editor => $e, conn => $conn
+ );
+
+ for my $li_id (map { int $_ } @$li_idlist) {
+ my $li = $e->retrieve_acq_lineitem([
+ $li_id, {
+ "flesh" => 1,
+ "flesh_fields" => {"jub" => ["purchase_order"]}
+ }
+ ]);
+
+ my $po = $li->purchase_order;
+
+ return $e->die_event unless
+ $e->allowed('RECEIVE_PURCHASE_ORDER', $po->ordering_agency);
+
+ $li = rollback_receive_lineitem($mgr, $li_id) or return $e->die_event;
+
+ my $result = {"li" => {$li->id => {"state" => $li->state}}};
+ if ($po->state eq "received") { # should happen first time, not after
+ $po->state("on-order");
+ $po = update_purchase_order($mgr, $po) or return $e->die_event;
+ }
+ $result->{"po"} = describe_affected_po($e, $po);
+
+ $mgr->respond(%$result);
+ }
+
+ $e->commit or return $e->die_event;
+ $mgr->respond_complete;
+ $mgr->run_post_response_hooks;
+}
+
__PACKAGE__->register_method(
method => 'set_lineitem_price_api',
)
);
+ # XXX LFW Some users are calling for lineitems not to be cancelable
+ # if they're in any of these states:
+ # new, selector-ready, order-ready, pending-order
+ #
+ # Sounds reasonable to me, but would enforcing that now break any existing
+ # (if unusual?) workflows?
+
$li->state("cancelled");
$li->cancel_reason($cancel_reason->id);
this.batchLinkInvoice();
break;
- case 'receive_po':
- this.receivePO();
+ case 'receive_lineitems':
+ this.receiveSelectedLineitems();
break;
- case 'rollback_receive_po':
- this.rollbackPoReceive();
+ case 'rollback_receive_lineitems':
+ this.rollbackReceiveLineitems();
break;
case 'create_assets':
acqLitLinkInvoiceDialog.show();
};
- this.receivePO = function() {
- if (!this.isPO) return;
+ this.receiveSelectedLineitems = function() {
+ var li_list = this.getSelected();
+
+ for (var i = 0; i < li_list.length; i++) {
+ var li = li_list[i];
- for (var id in this.liCache) {
- /* assumption: liCache reflects exactly the
- * set of LIs that belong to our PO */
- if (this.liCache[id].state() != "received" &&
- !this.checkLiAlerts(id)) return;
+ if (li.state() != "received" &&
+ !this.checkLiAlerts(li.id())) return;
}
this.show('acq-lit-progress-numbers');
+
var self = this;
fieldmapper.standardRequest(
- ['open-ils.acq', 'open-ils.acq.purchase_order.receive'],
+ ['open-ils.acq', 'open-ils.acq.lineitem.receive.batch'],
{ async: true,
- params: [this.authtoken, this.isPO],
+ params: [
+ this.authtoken,
+ li_list.map(function(li) { return li.id(); })
+ ],
onresponse : function(r) {
var resp = openils.Util.readResponse(r);
self._updateProgressNumbers(resp, true);
},
}
);
- }
+ };
this.issueReceive = function(obj, rollback) {
var part =
}
};
- this.rollbackPoReceive = function() {
- if(!this.isPO) return;
- if(!confirm(localeStrings.ROLLBACK_PO_RECEIVE_CONFIRM)) return;
+ this.rollbackReceiveLineitems = function() {
+ if (!confirm(localeStrings.ROLLBACK_LI_RECEIVE_CONFIRM)) return;
+
this.show('acq-lit-progress-numbers');
var self = this;
+
fieldmapper.standardRequest(
- ['open-ils.acq', 'open-ils.acq.purchase_order.receive.rollback'],
+ ['open-ils.acq', 'open-ils.acq.lineitem.receive.rollback.batch'],
{ async: true,
- params: [this.authtoken, this.isPO],
+ params: [this.authtoken, this.getSelected(false, null, true)],
onresponse : function(r) {
var resp = openils.Util.readResponse(r);
self._updateProgressNumbers(resp, true);
},
}
);
- }
+ };
this._updateProgressNumbers = function(resp, reloadOnComplete, onComplete) {
this.vlAgent.handleResponse(resp,