From: Kyle Huckins Date: Fri, 3 Aug 2018 17:04:41 +0000 (+0000) Subject: lp1777675 inventory date support SQL table addition X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=bbcd751fb2bfdf24b04180b39c4f4d54619e213f;p=working%2FEvergreen.git lp1777675 inventory date support SQL table addition - Remove inventory date and inventory workstation columns from asset.copy table. - Create new table asset.last_copy_inventory containing inventory date and inventory workstation columns. - Add code to do_checkin subroutine to update last_copy_inventory table on checkin. - Update Holdings view, Checkins table, copy buckets, and item detail grid and lists to display new inventory date and workstation information. - Add Update Inventory action to Item Status detail and list views. Signed-off-by: Kyle Huckins Changes to be committed: modified: Open-ILS/examples/fm_IDL.xml modified: Open-ILS/src/perlmods/lib/OpenILS/Application/Circ.pm modified: Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm modified: Open-ILS/src/sql/Pg/040.schema.asset.sql modified: Open-ILS/src/sql/Pg/800.fkeys.sql deleted: Open-ILS/src/sql/Pg/upgrade/XXXX-create-inventory-workstation-and-date-columns.sql new file: Open-ILS/src/sql/Pg/upgrade/XXXX-create-inventory-workstation-and-date.sql modified: Open-ILS/src/templates/staff/cat/bucket/copy/t_pending.tt2 modified: Open-ILS/src/templates/staff/cat/bucket/copy/t_view.tt2 modified: Open-ILS/src/templates/staff/cat/catalog/t_holdings.tt2 modified: Open-ILS/src/templates/staff/cat/item/index.tt2 modified: Open-ILS/src/templates/staff/cat/item/t_list.tt2 modified: Open-ILS/src/templates/staff/cat/item/t_summary_pane.tt2 modified: Open-ILS/src/templates/staff/circ/checkin/t_checkin.tt2 modified: Open-ILS/src/templates/staff/circ/checkin/t_checkin_table.tt2 modified: Open-ILS/web/js/ui/default/staff/cat/bucket/copy/app.js modified: Open-ILS/web/js/ui/default/staff/cat/item/app.js modified: Open-ILS/web/js/ui/default/staff/cat/services/holdings.js modified: Open-ILS/web/js/ui/default/staff/circ/checkin/app.js modified: Open-ILS/web/js/ui/default/staff/circ/services/circ.js modified: Open-ILS/web/js/ui/default/staff/circ/services/item.js Signed-off-by: Kathy Lussier Conflicts: Open-ILS/web/js/ui/default/staff/circ/services/item.js --- diff --git a/Open-ILS/examples/fm_IDL.xml b/Open-ILS/examples/fm_IDL.xml index 258bc527db..72f66a6709 100644 --- a/Open-ILS/examples/fm_IDL.xml +++ b/Open-ILS/examples/fm_IDL.xml @@ -7384,11 +7384,10 @@ SELECT usr, + - - @@ -7412,11 +7411,11 @@ SELECT usr, + - @@ -7434,6 +7433,27 @@ SELECT usr, + + + + + + + + + + + + + + + + + + + + + diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ.pm index 3a59bf93aa..047feeb58b 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ.pm @@ -370,6 +370,34 @@ sub new_set_circ_lost { return 1; } +__PACKAGE__->register_method( + method => "update_last_copy_inventory", + api_name => "open-ils.circ.circulation.update_last_copy_inventory"); + +sub update_last_copy_inventory { + my( $self, $conn, $auth, $args ) = @_; + my $e = new_editor(authtoken=>$auth, xact=>1); + return $e->die_event unless $e->checkauth; + + my $copies = $$args{copy_list}; + foreach my $copy (@$copies) { + my $existing_alci = $e->search_asset_last_copy_inventory({copy => $copy})->[0]; + + if($existing_alci) { + $existing_alci->inventory_date('now'); + $existing_alci->inventory_workstation($e->requestor->wsid); + $e->update_asset_last_copy_inventory($existing_alci) or return $e->die_event; + } else { + my $alci = Fieldmapper::asset::last_copy_inventory->new; + $alci->inventory_date('now'); + $alci->inventory_workstation($e->requestor->wsid); + $alci->copy($copy); + $e->create_asset_last_copy_inventory($alci) or return $e->die_event; + } + } + $e->commit; + return 1; +} __PACKAGE__->register_method( method => "set_circ_claims_returned", diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm index 03cb3813af..c3de5b74ba 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Circulate.pm @@ -412,7 +412,8 @@ my @AUTOLOAD_FIELDS = qw/ remote_hold backdate reservation - inv_update + do_inventory_update + last_copy_inventory copy copy_id copy_barcode @@ -2660,10 +2661,19 @@ sub do_checkin { $self->dont_change_lost_zero($dont_change_lost_zero); } - if ($self->inv_update) { - $self->copy->inventory_date('now'); - $self->copy->inventory_workstation($self->editor->requestor->wsid); + my $last_copy_inventory = Fieldmapper::asset::last_copy_inventory->new; + + if ($self->do_inventory_update) { + $last_copy_inventory->inventory_date('now'); + $last_copy_inventory->inventory_workstation($self->editor->requestor->wsid); + $last_copy_inventory->copy($self->copy->id()); + } else { + my $alci = $self->editor->search_asset_last_copy_inventory( + {copy => $self->copy->id} + ); + $last_copy_inventory = $alci->[0] } + $self->last_copy_inventory($last_copy_inventory); if( $self->checkin_check_holds_shelf() ) { $self->bail_on_events(OpenILS::Event->new('NO_CHANGE')); @@ -3945,6 +3955,22 @@ sub checkin_flesh_events { ); } + if ($self->last_copy_inventory) { + # flesh some workstation fields before returning + $self->last_copy_inventory->inventory_workstation( + $self->editor->retrieve_actor_workstation([$self->last_copy_inventory->inventory_workstation]) + ); + } + + if($self->last_copy_inventory && !$self->last_copy_inventory->id) { + my $alci = $self->editor->search_asset_last_copy_inventory( + {copy => $self->last_copy_inventory->copy} + ); + if($alci->[0]) { + $self->last_copy_inventory->id($alci->[0]->id); + } + } + for my $evt (@{$self->events}) { my $payload = {}; @@ -3958,6 +3984,8 @@ sub checkin_flesh_events { $payload->{patron} = $self->patron; $payload->{reservation} = $self->reservation unless (not $self->reservation or $self->reservation->cancel_time); + $payload->{last_copy_inventory} = $self->last_copy_inventory; + if ($self->do_inventory_update) { $payload->{do_inventory_update} = 1; } $evt->{payload} = $payload; } diff --git a/Open-ILS/src/sql/Pg/040.schema.asset.sql b/Open-ILS/src/sql/Pg/040.schema.asset.sql index d4a7dd5432..374a1ec06f 100644 --- a/Open-ILS/src/sql/Pg/040.schema.asset.sql +++ b/Open-ILS/src/sql/Pg/040.schema.asset.sql @@ -102,9 +102,7 @@ CREATE TABLE asset.copy ( status_changed_time TIMESTAMP WITH TIME ZONE, active_date TIMESTAMP WITH TIME ZONE, mint_condition BOOL NOT NULL DEFAULT TRUE, - cost NUMERIC(8,2), - inventory_workstation INT REFERENCES actor.workstation (id) DEFERRABLE INITIALLY DEFERRED, - inventory_date TIMESTAMP WITH TIME ZONE DEFAULT NOW() + cost NUMERIC(8,2) ); CREATE UNIQUE INDEX copy_barcode_key ON asset.copy (barcode) WHERE deleted = FALSE OR deleted IS FALSE; CREATE INDEX cp_cn_idx ON asset.copy (call_number); @@ -122,6 +120,14 @@ CREATE TABLE asset.copy_part_map ( ); CREATE UNIQUE INDEX copy_part_map_cp_part_idx ON asset.copy_part_map (target_copy, part); +CREATE TABLE asset.last_copy_inventory ( + id SERIAL PRIMARY KEY, + inventory_workstation INTEGER REFERENCES actor.workstation (id) DEFERRABLE INITIALLY DEFERRED, + inventory_date TIMESTAMP WITH TIME ZONE DEFAULT NOW(), + copy BIGINT NOT NULL +); +CREATE INDEX last_copy_inventory_copy_idx ON asset.last_copy_inventory (copy); + CREATE TABLE asset.opac_visible_copies ( id BIGSERIAL primary key, copy_id BIGINT, -- copy id diff --git a/Open-ILS/src/sql/Pg/800.fkeys.sql b/Open-ILS/src/sql/Pg/800.fkeys.sql index c396119c55..50d7927289 100644 --- a/Open-ILS/src/sql/Pg/800.fkeys.sql +++ b/Open-ILS/src/sql/Pg/800.fkeys.sql @@ -169,6 +169,18 @@ BEGIN END; $f$ LANGUAGE PLPGSQL VOLATILE COST 50; +CREATE OR REPLACE FUNCTION evergreen.asset_last_copy_inventory_copy_inh_fkey() RETURNS TRIGGER AS $f$ +BEGIN + PERFORM 1 FROM asset.copy WHERE id = NEW.copy; + IF NOT FOUND THEN + RAISE foreign_key_violation USING MESSAGE = FORMAT( + $$Referenced asset.copy id not found, copy:%s$$, NEW.copy + ); + END IF; + RETURN NEW; +END; +$f$ LANGUAGE PLPGSQL VOLATILE COST 50; + CREATE CONSTRAINT TRIGGER inherit_asset_copy_alert_copy_fkey AFTER UPDATE OR INSERT ON asset.copy_alert DEFERRABLE FOR EACH ROW EXECUTE PROCEDURE evergreen.asset_copy_alert_copy_inh_fkey(); @@ -177,6 +189,10 @@ CREATE CONSTRAINT TRIGGER inherit_asset_copy_tag_copy_map_copy_fkey AFTER UPDATE OR INSERT ON asset.copy_tag_copy_map DEFERRABLE FOR EACH ROW EXECUTE PROCEDURE evergreen.asset_copy_tag_copy_map_copy_inh_fkey(); +CREATE CONSTRAINT TRIGGER inherit_asset_last_copy_inventory_copy_fkey + AFTER UPDATE OR INSERT ON asset.last_copy_inventory + DEFERRABLE FOR EACH ROW EXECUTE PROCEDURE evergreen.asset_last_copy_inventory_copy_inh_fkey(); + ALTER TABLE asset.copy_note ADD CONSTRAINT asset_copy_note_creator_fkey FOREIGN KEY (creator) REFERENCES actor.usr (id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED; ALTER TABLE asset.call_number ADD CONSTRAINT asset_call_number_owning_lib_fkey FOREIGN KEY (owning_lib) REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED; diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX-create-inventory-workstation-and-date-columns.sql b/Open-ILS/src/sql/Pg/upgrade/XXXX-create-inventory-workstation-and-date-columns.sql deleted file mode 100644 index 1d03b933b7..0000000000 --- a/Open-ILS/src/sql/Pg/upgrade/XXXX-create-inventory-workstation-and-date-columns.sql +++ /dev/null @@ -1,9 +0,0 @@ -BEGIN; - -SELECT evergreen.upgrade_deps_block_check('XXXX', :eg_version); - -ALTER TABLE asset.copy - ADD COLUMN inventory_workstation INT REFERENCES actor.workstation (id) DEFERRABLE INITIALLY DEFERRED, - ADD COLUMN inventory_date TIMESTAMP WITH TIME ZONE DEFAULT NOW(); - -COMMIT; \ No newline at end of file diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX-create-inventory-workstation-and-date.sql b/Open-ILS/src/sql/Pg/upgrade/XXXX-create-inventory-workstation-and-date.sql new file mode 100644 index 0000000000..b4dcdf8c33 --- /dev/null +++ b/Open-ILS/src/sql/Pg/upgrade/XXXX-create-inventory-workstation-and-date.sql @@ -0,0 +1,29 @@ +BEGIN; + +SELECT evergreen.upgrade_deps_block_check('XXXX', :eg_version); + +CREATE TABLE asset.last_copy_inventory ( + id SERIAL PRIMARY KEY, + inventory_workstation INTEGER REFERENCES actor.workstation (id) DEFERRABLE INITIALLY DEFERRED, + inventory_date TIMESTAMP WITH TIME ZONE DEFAULT NOW(), + copy BIGINT NOT NULL +); +CREATE INDEX last_copy_inventory_copy_idx ON asset.last_copy_inventory (copy); + +CREATE OR REPLACE FUNCTION evergreen.asset_last_copy_inventory_copy_inh_fkey() RETURNS TRIGGER AS $f$ +BEGIN + PERFORM 1 FROM asset.copy WHERE id = NEW.copy; + IF NOT FOUND THEN + RAISE foreign_key_violation USING MESSAGE = FORMAT( + $$Referenced asset.copy id not found, copy:%s$$, NEW.copy + ); + END IF; + RETURN NEW; +END; +$f$ LANGUAGE PLPGSQL VOLATILE COST 50; + +CREATE CONSTRAINT TRIGGER inherit_asset_last_copy_inventory_copy_fkey + AFTER UPDATE OR INSERT ON asset.last_copy_inventory + DEFERRABLE FOR EACH ROW EXECUTE PROCEDURE evergreen.asset_last_copy_inventory_copy_inh_fkey(); + +COMMIT; \ No newline at end of file diff --git a/Open-ILS/src/templates/staff/cat/bucket/copy/t_pending.tt2 b/Open-ILS/src/templates/staff/cat/bucket/copy/t_pending.tt2 index 2396333289..321139b701 100644 --- a/Open-ILS/src/templates/staff/cat/bucket/copy/t_pending.tt2 +++ b/Open-ILS/src/templates/staff/cat/bucket/copy/t_pending.tt2 @@ -58,5 +58,7 @@ {{item['call_number.record.simple_record.title']}} + + diff --git a/Open-ILS/src/templates/staff/cat/bucket/copy/t_view.tt2 b/Open-ILS/src/templates/staff/cat/bucket/copy/t_view.tt2 index fb7d3d1a84..b49bc22061 100644 --- a/Open-ILS/src/templates/staff/cat/bucket/copy/t_view.tt2 +++ b/Open-ILS/src/templates/staff/cat/bucket/copy/t_view.tt2 @@ -43,5 +43,7 @@ {{item['call_number.record.simple_record.title']}} + + diff --git a/Open-ILS/src/templates/staff/cat/catalog/t_holdings.tt2 b/Open-ILS/src/templates/staff/cat/catalog/t_holdings.tt2 index 73cfd06f74..a4b8712629 100644 --- a/Open-ILS/src/templates/staff/cat/catalog/t_holdings.tt2 +++ b/Open-ILS/src/templates/staff/cat/catalog/t_holdings.tt2 @@ -123,8 +123,8 @@ {{item['copy_alert_count']}} - - + + diff --git a/Open-ILS/src/templates/staff/cat/item/index.tt2 b/Open-ILS/src/templates/staff/cat/item/index.tt2 index df5ed04ee6..c66174260f 100644 --- a/Open-ILS/src/templates/staff/cat/item/index.tt2 +++ b/Open-ILS/src/templates/staff/cat/item/index.tt2 @@ -32,6 +32,10 @@ "[% l('One or more items could not be transferred. Override?') %]"; s.OVERRIDE_TRANSFER_COPIES_TO_MARKED_VOLUME_BODY = "[% l('Reason(s) include: [_1]', '{{evt_desc}}') %]"; + s.SUCCESS_UPDATE_INVENTORY = + "[% l('Updated most recent inventory data for selected items.') %]"; + s.FAIL_UPDATE_INVENTORY = + "[% l('Failed to update recent inventory data for selected items.')%]" }]) [% END %] @@ -84,6 +88,7 @@
  • [% l('Check In Items') %]
  • [% l('Renew Items') %]
  • [% l('Cancel Transit') %]
  • +
  • [% l('Update Inventory') %]
  • [% l('Mark') %]

  • [% l('Item as Damaged') %]
  • diff --git a/Open-ILS/src/templates/staff/cat/item/t_list.tt2 b/Open-ILS/src/templates/staff/cat/item/t_list.tt2 index 62788d7f39..0cd7b1686a 100644 --- a/Open-ILS/src/templates/staff/cat/item/t_list.tt2 +++ b/Open-ILS/src/templates/staff/cat/item/t_list.tt2 @@ -27,6 +27,8 @@ label="[% l('Renew Items') %]"> + @@ -135,8 +137,8 @@ {{item['copy_alert_count']}} - - + + diff --git a/Open-ILS/src/templates/staff/cat/item/t_summary_pane.tt2 b/Open-ILS/src/templates/staff/cat/item/t_summary_pane.tt2 index 85cb8aaabc..a37271134b 100644 --- a/Open-ILS/src/templates/staff/cat/item/t_summary_pane.tt2 +++ b/Open-ILS/src/templates/staff/cat/item/t_summary_pane.tt2 @@ -178,10 +178,10 @@
    [% l('Inventory Date') %]
    -
    {{copy.inventory_date() | date:egDateAndTimeFormat}}
    +
    {{last_copy_inventory.inventory_date() | date:egDateAndTimeFormat}}
    [% l('Inventory Workstation') %]
    -
    {{copy.inventory_workstation().name()}}
    +
    {{last_copy_inventory.inventory_workstation().name()}}
    diff --git a/Open-ILS/src/templates/staff/circ/checkin/t_checkin.tt2 b/Open-ILS/src/templates/staff/circ/checkin/t_checkin.tt2 index ec7b1a73a2..30d996bb4f 100644 --- a/Open-ILS/src/templates/staff/circ/checkin/t_checkin.tt2 +++ b/Open-ILS/src/templates/staff/circ/checkin/t_checkin.tt2 @@ -41,6 +41,9 @@
    [% l('Manual Floating Active') %]
    +
    + [% l('Update Inventory') %] +
    @@ -75,13 +78,6 @@ -
    - - -
    -
    @@ -238,6 +234,16 @@ [% l('Manual Floating Active') %] +
  • + + + + [% l('Update Inventory') %] + +
  • diff --git a/Open-ILS/src/templates/staff/circ/checkin/t_checkin_table.tt2 b/Open-ILS/src/templates/staff/circ/checkin/t_checkin_table.tt2 index 8f98584233..ff9b23407d 100644 --- a/Open-ILS/src/templates/staff/circ/checkin/t_checkin_table.tt2 +++ b/Open-ILS/src/templates/staff/circ/checkin/t_checkin_table.tt2 @@ -121,5 +121,7 @@ + + diff --git a/Open-ILS/web/js/ui/default/staff/cat/bucket/copy/app.js b/Open-ILS/web/js/ui/default/staff/cat/bucket/copy/app.js index 3208a42303..ba19f95705 100644 --- a/Open-ILS/web/js/ui/default/staff/cat/bucket/copy/app.js +++ b/Open-ILS/web/js/ui/default/staff/cat/bucket/copy/app.js @@ -215,6 +215,16 @@ angular.module('egCatCopyBuckets', return deferred.promise; } + // apply last inventory data to fetched bucket items + service.fetchRecentInventoryData = function(copy) { + return egCore.pcrud.search('alci', + {copy: copy.id}, + {flesh: 2, flesh_fields: {alci: ['inventory_workstation']}} + ).then(function(alci) { + return alci; + }); + } + return service; }]) @@ -390,6 +400,14 @@ function($scope, $routeParams, bucketSvc , egGridDataProvider, egCore) { return null; }, allItemsRetrieved : function() { + angular.forEach($scope.gridControls.allItems(), function(copy) { + bucketSvc.fetchRecentInventoryData(copy).then(function(alci) { + if (alci) { + copy._last_inventory_date = alci.inventory_date(); + copy._last_inventory_workstation = alci.inventory_workstation().name(); + } + }); + }); $scope.context.selectPendingBC = true; } } @@ -517,6 +535,16 @@ function($scope, $q , $routeParams , $timeout , $window , $uibModal , bucketSvc setQuery : function(q) { if (q) query = q; return query; + }, + allItemsRetrieved : function() { + angular.forEach($scope.gridControls.allItems(), function(copy) { + bucketSvc.fetchRecentInventoryData(copy).then(function(alci) { + if (alci) { + copy._last_inventory_date = alci.inventory_date(); + copy._last_inventory_workstation = alci.inventory_workstation().name(); + } + }); + }); } }; diff --git a/Open-ILS/web/js/ui/default/staff/cat/item/app.js b/Open-ILS/web/js/ui/default/staff/cat/item/app.js index cededcde68..24178d75ef 100644 --- a/Open-ILS/web/js/ui/default/staff/cat/item/app.js +++ b/Open-ILS/web/js/ui/default/staff/cat/item/app.js @@ -104,6 +104,13 @@ function($scope , $location , $timeout , egCore , egGridDataProvider , itemSvc) itemSvc.requestItems([$scope.args.copyId]); } + $scope.update_inventory = function() { + itemSvc.updateInventory([$scope.args.copyId], null) + .then(function(res) { + $timeout(function() { location.href = location.href; }, 1000); + }); + } + $scope.attach_to_peer_bib = function() { itemSvc.attach_to_peer_bib([{ id : $scope.args.copyId, @@ -236,10 +243,10 @@ function($scope , $location , $timeout , egCore , egGridDataProvider , itemSvc) .controller('ListCtrl', ['$scope','$q','$routeParams','$location','$timeout','$window','egCore', 'egGridDataProvider','egItem','egUser','$uibModal','egCirc','egConfirmDialog', - 'egProgressDialog', + 'egProgressDialog', 'ngToast', function($scope , $q , $routeParams , $location , $timeout , $window , egCore , egGridDataProvider , itemSvc , egUser , $uibModal , egCirc , egConfirmDialog, - egProgressDialog) { + egProgressDialog, ngToast) { var copyId = []; var cp_list = $routeParams.idList; @@ -385,6 +392,18 @@ function($scope , $q , $routeParams , $location , $timeout , $window , egCore , itemSvc.add_copies_to_bucket(copy_list); } + $scope.update_inventory = function() { + var copy_list = gatherSelectedHoldingsIds(); + itemSvc.updateInventory(copy_list, $scope.gridControls.allItems()).then(function(res) { + if (res) { + $scope.gridControls.allItems(res); + ngToast.create(egCore.strings.SUCCESS_UPDATE_INVENTORY); + } else { + ngToast.warning(egCore.strings.FAIL_UPDATE_INVENTORY); + } + }); + } + $scope.need_one_selected = function() { var items = $scope.gridControls.selectedItems(); if (items.length == 1) return false; @@ -591,6 +610,9 @@ function($scope , $q , $location , $routeParams , $timeout , $window , egCore , // regardless of whether it matches the current item. if (!barcode && itemSvc.copy && itemSvc.copy.id() == copyId) { $scope.copy = itemSvc.copy; + if (itemSvc.last_copy_inventory && itemSvc.last_copy_inventory.copy() == copyId) { + $scope.last_copy_inventory = itemSvc.last_copy_inventory; + } $scope.copy_alert_count = itemSvc.copy.copy_alerts().filter(function(aca) { return !aca.ack_time(); }).length; @@ -623,9 +645,11 @@ function($scope , $q , $location , $routeParams , $timeout , $window , egCore , var copy = res.copy; itemSvc.copy = copy; + if (res.last_copy_inventory) itemSvc.last_copy_inventory = res.last_copy_inventory; $scope.copy = copy; + $scope.last_copy_inventory = res.last_copy_inventory; $scope.copy_alert_count = copy.copy_alerts().filter(function(aca) { return !aca.ack_time(); }).length; diff --git a/Open-ILS/web/js/ui/default/staff/cat/services/holdings.js b/Open-ILS/web/js/ui/default/staff/cat/services/holdings.js index b4fb738524..9c0f4cae28 100644 --- a/Open-ILS/web/js/ui/default/staff/cat/services/holdings.js +++ b/Open-ILS/web/js/ui/default/staff/cat/services/holdings.js @@ -124,6 +124,19 @@ function(egCore , $q) { } }); + //create a virtual field for displaying most recent inventory data + angular.forEach(svc.copies, function(cp) { + egCore.pcrud.search('alci', + {copy: cp.id}, + {flesh: 2, flesh_fields: {alci: ['inventory_workstation']}} + ).then(function(alci) { + if (alci) { + cp._last_inventory_workstation = alci.inventory_workstation().name(); + cp._last_inventory_date = alci.inventory_date(); + } + }); + }); + // create virtual field for copy alert count angular.forEach(svc.copies, function (cp) { if (cp.copy_alerts) cp.copy_alert_count = cp.copy_alerts.length; diff --git a/Open-ILS/web/js/ui/default/staff/circ/checkin/app.js b/Open-ILS/web/js/ui/default/staff/circ/checkin/app.js index 103a8e06b3..fa77290fb6 100644 --- a/Open-ILS/web/js/ui/default/staff/circ/checkin/app.js +++ b/Open-ILS/web/js/ui/default/staff/circ/checkin/app.js @@ -86,6 +86,7 @@ function($scope , $q , $window , $location , $timeout , egCore , checkinSvc , eg } else { modifiers.push('noop'); // AKA suppress holds and transits modifiers.push('auto_print_holds_transits'); + modifiers.push('do_inventory_update'); } // set modifiers from stored preferences @@ -160,14 +161,17 @@ function($scope , $q , $window , $location , $timeout , egCore , checkinSvc , eg params.retarget_mode = 'retarget'; } } + if ($scope.modifiers.do_inventory_update) params.do_inventory_update = true; egCore.hatch.setItem('circ.checkin.strict_barcode', $scope.strict_barcode); + egCore.hatch.setItem('circ.checkin.do_inventory_update', $scope.modifiers.do_inventory_update); var options = { check_barcode : $scope.strict_barcode, no_precat_alert : $scope.modifiers.no_precat_alert, auto_print_holds_transits : $scope.modifiers.auto_print_holds_transits, - suppress_popups : suppress_popups + suppress_popups : suppress_popups, + do_inventory_update : $scope.modifiers.do_inventory_update }; return {params : params, options: options}; @@ -196,7 +200,6 @@ function($scope , $q , $window , $location , $timeout , egCore , checkinSvc , eg // track the item in the grid before sending the request checkinSvc.checkins.unshift(row_item); - egCirc.checkin(params, options).then( function(final_resp) { diff --git a/Open-ILS/web/js/ui/default/staff/circ/services/circ.js b/Open-ILS/web/js/ui/default/staff/circ/services/circ.js index 6be7dc4707..465eaba6d1 100644 --- a/Open-ILS/web/js/ui/default/staff/circ/services/circ.js +++ b/Open-ILS/web/js/ui/default/staff/circ/services/circ.js @@ -300,6 +300,7 @@ function($uibModal , $q , egCore , egAlertDialog , egConfirmDialog, egAddCopyAl data.record = payload.record; data.acp = payload.copy; data.acn = payload.volume ? payload.volume : payload.copy ? payload.copy.call_number() : null; + data.alci = egCore.idl.toHash(payload.last_copy_inventory, true); data.au = payload.patron; data.transit = payload.transit; data.status = payload.status; @@ -309,8 +310,16 @@ function($uibModal , $q , egCore , egAlertDialog , egConfirmDialog, egAddCopyAl data.isbn = final_resp.evt[0].isbn; data.route_to = final_resp.evt[0].route_to; + if (payload.circ) data.duration = payload.circ.duration(); if (payload.circ) data.circ_lib = payload.circ.circ_lib(); + if (payload.do_inventory_update) { + if (payload.last_copy_inventory.id()) { + egCore.pcrud.update(payload.last_copy_inventory); + } else { + egCore.pcrud.create(payload.last_copy_inventory); + } + } // for checkin, the mbts lives on the main circ if (payload.circ && payload.circ.billable_transaction()) @@ -1463,11 +1472,12 @@ function($uibModal , $q , egCore , egAlertDialog , egConfirmDialog, egAddCopyAl var final_resp = {evt : evt, params : params, options : options}; - var copy, hold, transit; + var copy, hold, transit, last_copy_inventory; if (evt[0].payload) { copy = evt[0].payload.copy; hold = evt[0].payload.hold; transit = evt[0].payload.transit; + last_copy_inventory = evt[0].payload.last_copy_inventory; } // track the barcode regardless of whether it's valid diff --git a/Open-ILS/web/js/ui/default/staff/circ/services/item.js b/Open-ILS/web/js/ui/default/staff/circ/services/item.js index 11e2fcb5ba..e780236b2f 100644 --- a/Open-ILS/web/js/ui/default/staff/circ/services/item.js +++ b/Open-ILS/web/js/ui/default/staff/circ/services/item.js @@ -13,10 +13,11 @@ function(egCore , egCirc , $uibModal , $q , $timeout , $window , egConfirmDialog }; service.flesh = { - flesh : 3, + flesh : 4, flesh_fields : { acp : ['call_number','location','status','location','floating','circ_modifier', 'age_protect','circ_lib','copy_alerts', 'editor', 'inventory_workstation'], + 'age_protect','circ_lib','copy_alerts', 'editor'], acn : ['record','prefix','suffix','label_class'], bre : ['simple_record','creator','editor'] }, @@ -45,6 +46,13 @@ function(egCore , egCirc , $uibModal , $q , $timeout , $window , egConfirmDialog limit : 1 } + service.inventoryFlesh = { + flesh : 2, + flesh_fields : { + alci : ['inventory_workstation'] + } + } + //Retrieve separate copy, aacs, and accs information service.getCopy = function(barcode, id) { if (barcode) { @@ -66,6 +74,11 @@ function(egCore , egCirc , $uibModal , $q , $timeout , $window , egConfirmDialog service.circFlesh).then(function(circ) {return circ}); } + service.getInventory = function(id) { + return egCore.pcrud.search('alci', {copy : id }, + service.inventoryFlesh).then(function(alci) {return alci}); + } + service.getSummary = function(id) { return circ_summary = egCore.net.request( 'open-ils.circ', @@ -100,18 +113,29 @@ function(egCore , egCirc , $uibModal , $q , $timeout , $window , egConfirmDialog }); } + var fetchInventory = function(copy) { + return service.getInventory(copy.id()) + .then(function(alci) { + if (alci) { + copyData.last_copy_inventory = alci; + return copyData; + } + }); + } + return fetchCopy(barcode, id).then(function(res) { if(!res.copy) { return $q.when(); } - - return fetchCirc(copyData.copy).then(function(res) { - if (copyData.circ) { - return fetchSummary(copyData.circ).then(function() { + return fetchInventory(copyData.copy).then(function(invRes) { + return fetchCirc(copyData.copy).then(function(res) { + if (copyData.circ) { + return fetchSummary(copyData.circ).then(function() { + return copyData; + }); + } else { return copyData; - }); - } else { - return copyData; - } + } + }); }); }); @@ -122,6 +146,7 @@ function(egCore , egCirc , $uibModal , $q , $timeout , $window , egConfirmDialog var copy; var circ; var circ_summary; + var last_copy_inventory; var lastRes = {}; return service.retrieveCopyData(barcode, id) @@ -158,6 +183,10 @@ function(egCore , egCirc , $uibModal , $q , $timeout , $window , egConfirmDialog flatCopy._circ_summary.checkout_workstation : ''; } + if (copyData.last_copy_inventory) { + flatCopy._last_copy_inventory = egCore.idl.toHash(copyData.last_copy_inventory, true); + flatCopy._last_copy_inventory._inventory_workstation_name = copyData.last_copy_inventory.inventory_workstation().name(); + } flatCopy.index = service.index++; flatCopy.copy_alert_count = copyData.copy.copy_alerts().filter(function(aca) { return !aca.ack_time(); @@ -188,6 +217,7 @@ function(egCore , egCirc , $uibModal , $q , $timeout , $window , egConfirmDialog return lastRes = { copy : copyData.copy, + last_copy_inventory : copyData.last_copy_inventory, index : flatCopy.index } }); @@ -195,6 +225,33 @@ function(egCore , egCirc , $uibModal , $q , $timeout , $window , egConfirmDialog } + service.updateInventory = function(copy_list, all_items, refresh) { + if (copy_list.length == 0) return; + return egCore.net.request( + 'open-ils.circ', + 'open-ils.circ.circulation.update_last_copy_inventory', + egCore.auth.token(), {copy_list: copy_list} + ).then(function(res) { + if (res) { + if (all_items) angular.forEach(copy_list, function(copy) { + angular.forEach(all_items, function(item) { + if (copy == item.id) { + egCore.pcrud.search('alci', {copy: copy}, + {flesh: 1, flesh_fields: + {alci: ['inventory_workstation']} + }).then(function(alci) { + item._last_copy_inventory.inventory_date = alci.inventory_date(); + item._last_copy_inventory._inventory_workstation_name = + alci.inventory_workstation().name(); + }); + } + }); + }); + return all_items || res; + } + }); + } + service.add_copies_to_bucket = function(copy_list) { if (copy_list.length == 0) return;