From 373fc3f308118b366428246a28d31a6467674202 Mon Sep 17 00:00:00 2001 From: Kyle Huckins Date: Fri, 15 Sep 2017 21:06:24 +0000 Subject: [PATCH] LP#1659181 Mark Items Damaged Prompt - Add new prompt for marking an item as damaged. - If there is a fee when marking an item as damaged, offer the option to charge as normal, manually bill the patron, or to waive the charge. -Affected interfaces: Holds pull list, Holds Shelf, Patron Holds, Record Holds, Record Holdings, Item Status(List), Item Status(Detail) Signed-off-by: Kyle Huckins Changes to be committed: modified: Open-ILS/src/perlmods/lib/OpenILS/Application/Circ.pm modified: Open-ILS/src/templates/staff/cat/catalog/index.tt2 modified: Open-ILS/src/templates/staff/circ/checkin/index.tt2 modified: Open-ILS/src/templates/staff/circ/holds/index.tt2 new file: Open-ILS/src/templates/staff/circ/share/t_mark_damaged.tt2 modified: Open-ILS/web/js/ui/default/staff/cat/catalog/app.js modified: Open-ILS/web/js/ui/default/staff/cat/item/app.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/holds.js modified: Open-ILS/web/js/ui/default/staff/circ/services/item.js Signed-off-by: Kathy Lussier --- .../perlmods/lib/OpenILS/Application/Circ.pm | 36 ++++++- .../src/templates/staff/cat/catalog/index.tt2 | 1 + .../templates/staff/circ/checkin/index.tt2 | 1 + .../src/templates/staff/circ/holds/index.tt2 | 1 + .../staff/circ/share/t_mark_damaged.tt2 | 53 ++++++++++ .../js/ui/default/staff/cat/catalog/app.js | 15 ++- .../web/js/ui/default/staff/cat/item/app.js | 3 +- .../js/ui/default/staff/circ/checkin/app.js | 13 +-- .../js/ui/default/staff/circ/services/circ.js | 96 ++++++++++++++----- .../ui/default/staff/circ/services/holds.js | 13 ++- .../js/ui/default/staff/circ/services/item.js | 10 +- 11 files changed, 197 insertions(+), 45 deletions(-) create mode 100644 Open-ILS/src/templates/staff/circ/share/t_mark_damaged.tt2 diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ.pm index 280ecddf0b..3a59bf93aa 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Circ.pm @@ -1269,10 +1269,15 @@ __PACKAGE__->register_method( sub mark_item { my( $self, $conn, $auth, $copy_id, $args ) = @_; - my $e = new_editor(authtoken=>$auth, xact =>1); - return $e->die_event unless $e->checkauth; $args ||= {}; + # Items must be checked in before any attempt is made to mark damaged + my $evt = try_checkin($auth, $copy_id) if + ($self->api_name=~ /damaged/ && $args->{handle_checkin}); + return $evt if $evt; + + my $e = new_editor(authtoken=>$auth, xact =>1); + return $e->die_event unless $e->checkauth; my $copy = $e->retrieve_asset_copy([ $copy_id, {flesh => 1, flesh_fields => {'acp' => ['call_number']}}]) @@ -1342,6 +1347,31 @@ sub mark_item { return 1; } +sub try_checkin { + my($auth, $copy_id) = @_; + + my $checkin = $U->simplereq( + 'open-ils.circ', + 'open-ils.circ.checkin.override', + $auth, { + copy_id => $copy_id, + noop => 1 + } + ); + if(ref $checkin ne 'ARRAY') { $checkin = [$checkin]; } + + my $evt_code = $checkin->[0]->{textcode}; + $logger->info("try_checkin() received event: $evt_code"); + + if($evt_code eq 'SUCCESS' || $evt_code eq 'NO_CHANGE') { + $logger->info('try_checkin() successful checkin'); + return undef; + } else { + $logger->warn('try_checkin() un-successful checkin'); + return $checkin; + } +} + sub handle_mark_damaged { my($e, $copy, $owning_lib, $args) = @_; @@ -1422,8 +1452,6 @@ sub handle_mark_damaged { my $evt2 = OpenILS::Utils::Penalty->calculate_penalties($e, $circ->usr->id, $e->requestor->ws_ou); return $evt2 if $evt2; - return undef; - } else { return OpenILS::Event->new('DAMAGE_CHARGE', payload => { diff --git a/Open-ILS/src/templates/staff/cat/catalog/index.tt2 b/Open-ILS/src/templates/staff/cat/catalog/index.tt2 index 3d19ca2646..a50822e778 100644 --- a/Open-ILS/src/templates/staff/cat/catalog/index.tt2 +++ b/Open-ILS/src/templates/staff/cat/catalog/index.tt2 @@ -18,6 +18,7 @@ [% INCLUDE 'staff/cat/share/marcedit_strings.tt2' %] + [% INCLUDE 'staff/circ/share/circ_strings.tt2' %] [% INCLUDE 'staff/circ/share/hold_strings.tt2' %] diff --git a/Open-ILS/src/templates/staff/circ/checkin/index.tt2 b/Open-ILS/src/templates/staff/circ/checkin/index.tt2 index cfd0a1b9cc..64e5510025 100644 --- a/Open-ILS/src/templates/staff/circ/checkin/index.tt2 +++ b/Open-ILS/src/templates/staff/circ/checkin/index.tt2 @@ -8,6 +8,7 @@ + + [% INCLUDE 'staff/circ/share/circ_strings.tt2' %] diff --git a/Open-ILS/src/templates/staff/circ/share/t_mark_damaged.tt2 b/Open-ILS/src/templates/staff/circ/share/t_mark_damaged.tt2 new file mode 100644 index 0000000000..7506217532 --- /dev/null +++ b/Open-ILS/src/templates/staff/circ/share/t_mark_damaged.tt2 @@ -0,0 +1,53 @@ + + + \ No newline at end of file diff --git a/Open-ILS/web/js/ui/default/staff/cat/catalog/app.js b/Open-ILS/web/js/ui/default/staff/cat/catalog/app.js index 33af1002aa..95c1dd34ca 100644 --- a/Open-ILS/web/js/ui/default/staff/cat/catalog/app.js +++ b/Open-ILS/web/js/ui/default/staff/cat/catalog/app.js @@ -1542,9 +1542,18 @@ function($scope , $routeParams , $location , $window , $q , egCore , egHolds , e } $scope.selectedHoldingsDamaged = function () { - egCirc.mark_damaged(gatherSelectedHoldingsIds()).then(function() { - holdingsSvcInst.fetchAgain().then(function() { - $scope.holdingsGridDataProvider.refresh(); + var copy_list = gatherSelectedRawCopies(); + if (copy_list.length == 0) return; + + angular.forEach(copy_list, function(cp) { + egCirc.mark_damaged({ + id: cp.id(), + barcode: cp.barcode(), + circ_lib: cp.circ_lib().id() + }).then(function() { + holdingsSvcInst.fetchAgain().then(function() { + $scope.holdingsGridDataProvider.refresh(); + }); }); }); } 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 2eac88868a..3624b2a54a 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 @@ -142,7 +142,8 @@ function($scope , $location , $timeout , egCore , egGridDataProvider , itemSvc) $scope.selectedHoldingsDamaged = function () { itemSvc.selectedHoldingsDamaged([{ id : $scope.args.copyId, - barcode : $scope.args.copyBarcode + barcode : $scope.args.copyBarcode, + refresh : true }]); } 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 46afb5b59d..7be19fb53f 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 @@ -307,14 +307,15 @@ function($scope , $q , $window , $location , $timeout , egCore , checkinSvc , eg $scope.showMarkDamaged = function(items) { var copy_ids = []; angular.forEach(items, function(item) { - if (item.acp) copy_ids.push(item.acp.id()); + if (item.acp) { + egCirc.mark_damaged({ + id: item.acp.id(), + barcode: item.acp.barcode() + }) + + } }); - if (copy_ids.length) { - egCirc.mark_damaged(copy_ids).then(function() { - // update grid items? - }); - } } $scope.abortTransit = function(items) { 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 bb544d0459..4a5130b9f7 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 @@ -1174,32 +1174,80 @@ function($uibModal , $q , egCore , egAlertDialog , egConfirmDialog, return deferred.promise; } - service.mark_damaged = function(copy_ids) { - return egConfirmDialog.open( - egCore.strings.MARK_DAMAGED_CONFIRM, '', - { num_items : copy_ids.length, - ok : function() {}, - cancel : function() {} - } + service.mark_damaged = function(params) { + if (!params) return $q.when(); + return $uibModal.open({ + templateUrl: './circ/share/t_mark_damaged', + controller: + ['$scope', '$uibModalInstance', 'egCore', 'egBilling', 'egItem', + function($scope, $uibModalInstance, egCore, egBilling, egItem) { + var doRefresh = params.refresh; + + $scope.billArgs = {charge: params.charge}; + $scope.mode = 'charge'; + $scope.barcode = params.barcode; + if (params.charge && params.charge > 0) { + $scope.applyFine = "apply"; + } + if (params.circ) { + $scope.circ = params.circ; + $scope.circ_checkin_time = params.circ.checkin_time(); + $scope.circ_patron_name = params.circ.usr().family_name() + ", " + + params.circ.usr().first_given_name() + " " + + params.circ.usr().second_given_name(); + } + egBilling.fetchBillingTypes().then(function(res) { + $scope.billingTypes = res; + }); - ).result.then(function() { - var promises = []; - angular.forEach(copy_ids, function(copy_id) { - promises.push( - egCore.net.request( - 'open-ils.circ', - 'open-ils.circ.mark_item_damaged', - egCore.auth.token(), copy_id - ).then(function(resp) { - if (evt = egCore.evt.parse(resp)) { - console.error('mark damaged failed: ' + evt); - } - }) - ); - }); + $scope.btnChargeFees = function() { + $scope.mode = 'charge'; + $scope.billArgs.charge = params.charge; + $scope.applyFine = "apply"; + } + $scope.btnWaiveFees = function() { + $scope.mode = 'waive'; + $scope.billArgs.charge = 0; + $scope.applyFine = "noapply"; + } - return $q.all(promises); - }); + $scope.cancel = function ($event) { + $uibModalInstance.dismiss(); + } + $scope.ok = function() { + handle_mark_item_damaged(); + } + + var handle_mark_item_damaged = function() { + egCore.net.request( + 'open-ils.circ', + 'open-ils.circ.mark_item_damaged', + egCore.auth.token(), params.id, { + apply_fines: $scope.applyFine, + override_amount: $scope.billArgs.charge, + override_btype: $scope.billArgs.type, + override_note: $scope.billArgs.note, + handle_checkin: !$scope.applyFine + }).then(function(resp) { + if (evt = egCore.evt.parse(resp)) { + doRefresh = false; + console.debug("mark damaged more information required. Pushing back."); + service.mark_damaged({ + id: params.id, + barcode: params.barcode, + charge: evt.payload.charge, + circ: evt.payload.circ, + refresh: params.refresh + }); + console.error('mark damaged failed: ' + evt); + } + }).then(function() { + if (doRefresh) egItem.add_barcode_to_list(params.barcode); + }); + $uibModalInstance.close(); + } + }] + }).result; } service.mark_missing = function(copy_ids) { diff --git a/Open-ILS/web/js/ui/default/staff/circ/services/holds.js b/Open-ILS/web/js/ui/default/staff/circ/services/holds.js index b8f67d980f..02546903b5 100644 --- a/Open-ILS/web/js/ui/default/staff/circ/services/holds.js +++ b/Open-ILS/web/js/ui/default/staff/circ/services/holds.js @@ -590,11 +590,14 @@ function($window , $location , $timeout , egCore , egHolds , egCirc) { generic_update(items, 'transfer_to_marked_title'); } service.mark_damaged = function(items) { - var copy_ids = items - .filter(function(item) { return Boolean(item.copy) }) - .map(function(item) { return item.copy.id() }); - if (copy_ids.length) - egCirc.mark_damaged(copy_ids).then(service.refresh); + angular.forEach(items, function(item) { + if (item.copy) { + egCirc.mark_damaged({ + id: item.copy.id(), + barcode: item.copy.barcode() + }).then(service.refresh); + } + }); } service.mark_missing = function(items) { 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 44c9aa134d..afbc474e71 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 @@ -579,8 +579,14 @@ function(egCore , egCirc , $uibModal , $q , $timeout , $window , egConfirmDialog } service.selectedHoldingsDamaged = function (items) { - egCirc.mark_damaged(items.map(function(el){return el.id;})).then(function(){ - angular.forEach(items, function(cp){service.add_barcode_to_list(cp.barcode)}); + angular.forEach(items, function(cp) { + if (cp) { + egCirc.mark_damaged({ + id: cp.id, + barcode: cp.barcode, + refresh: cp.refresh + }); + } }); } -- 2.43.2