LP#1879983: Trigger email receipts when appropriate
authorMike Rylander <mrylander@gmail.com>
Fri, 12 Jun 2020 16:40:32 +0000 (12:40 -0400)
committerGalen Charlton <gmc@equinoxinitiative.org>
Fri, 12 Jun 2020 20:13:57 +0000 (16:13 -0400)
Gather the checkout responses, warn when some failed via toast, and have
the server side trigger email/sms notification for successful checkouts
unconditionally.

Signed-off-by: Mike Rylander <mrylander@gmail.com>
Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
Open-ILS/src/perlmods/lib/OpenILS/Application/Curbside.pm
Open-ILS/src/templates/staff/circ/curbside/index.tt2
Open-ILS/web/js/ui/default/staff/circ/curbside/directives/arrived_manager.js

index 80d6f0f..62ddc2e 100644 (file)
@@ -954,10 +954,30 @@ sub mark_delivered {
         )
     } @$holds;
 
-    $conn->respond($_->gather(1)) for @requests;
-    $circ_sess->disconnect;
+    my @successful_checkouts;
+    my $successful_patron;
+    for my $r (@requests) {
+        my $co_res = $r->gather(1);
+        $conn->respond($co_res);
+        next if (ref($co_res) eq 'ARRAY'); # success is always singular
+
+        if ($co_res->{textcode} eq 'SUCCESS') { # that's great news...
+            push @successful_checkouts, $co_res->{payload}->{circ}->id;
+            $successful_patron = $co_res->{payload}->{circ}->usr;
+        }
+    }
 
-    return $e->retrieve_action_curbside($slot->id);
+    $conn->respond_complete($e->retrieve_action_curbside($slot->id));
+
+    $circ_sess->request(
+        'open-ils.circ.checkout.batch_notify.session.atomic',
+        $authtoken,
+        $successful_patron,
+        \@successful_checkouts
+    ) if (@successful_checkouts);
+
+    $circ_sess->disconnect;
+    return undef;
 }
 __PACKAGE__->register_method(
     method   => "mark_delivered",
index f42d332..5aee3bc 100644 (file)
@@ -38,6 +38,7 @@ angular.module('egCoreMod').run(['egStrings', function(s) {
     s.SUCCESS_CURBSIDE_MARK_DELIVERED = "[% l('Marked curbside appointment {{slot_id}} as delivered') %]";
     s.NOTFOUND_CURBSIDE_MARK_DELIVERED = "[% l('Could not find curbside appointment {{slot_id}} to mark as delivered') %]";
     s.FAILED_CURBSIDE_MARK_DELIVERED = "[% l('Failed to mark curbside appointment {{slot_id}} as delivered: {{evt_code}}') %]";
+    s.FAILED_CURBSIDE_CHECKOUT = "[% l('Failed to check out an item as part of curbside appointment {{slot_id}}: {{evt_code}}') %]";
     s.CONFIRM_CANCEL_TITLE = "[% l('Cancel Curbside Pickup Appointment') %]";
     s.CONFIRM_CANCEL_BODY = "[% l('Cancel curbside pickup appointment [_1]?', '{{slot_id}}') %]";
     s.SUCCESS_CANCEL_APPOINTMENT = "[% l('Canceled curbside appointment {{slot_id}}') %]";
index 1613279..6205aea 100644 (file)
@@ -62,9 +62,30 @@ function($scope , $q , egCurbsideCoreSvc , egCore , egGridDataProvider , egProgr
 
     $scope.gridCellHandlers = { };
     $scope.gridCellHandlers.mark_delivered = function(id) {
+        var events_to_handle_later = [];
         egProgressDialog.open();
         egCurbsideCoreSvc.mark_delivered(id).then(function(resp) {
             egProgressDialog.close();
+
+            events_to_handle_later.pop(); // last element is resp, our param
+            if (events_to_handle_later.length) { // this means we got at least one CO attempt
+
+                var bad_event;
+                angular.forEach(events_to_handle_later, function (evt) {
+                    if (bad_event) return; // already warned staff, leave
+                    if (angular.isArray(evt)) evt = evt[0]; // we only need to look at the first event from each CO response
+
+                    evt = egCore.evt.parse(evt);
+                    if (!bad_event && evt && evt.textcode != 'SUCCESS') { // at least one non-success event, show the first event.
+                        bad_event = evt;
+                        ngToast.danger(egCore.strings.$replace(
+                            egCore.strings.FAILED_CURBSIDE_CHECKOUT,
+                            { slot_id : id, evt_code : bad_event.code }
+                        ));
+                    }
+                });
+            }
+
             if (evt = egCore.evt.parse(resp)) {
                 ngToast.danger(egCore.strings.$replace(
                     egCore.strings.FAILED_CURBSIDE_MARK_DELIVERED,
@@ -72,6 +93,7 @@ function($scope , $q , egCurbsideCoreSvc , egCore , egGridDataProvider , egProgr
                 ));
                 return;
             } 
+
             if (!angular.isDefined(resp)) {
                 ngToast.warning(egCore.strings.$replace(
                     egCore.strings.NOTFOUND_CURBSIDE_MARK_DELIVERED,
@@ -79,12 +101,15 @@ function($scope , $q , egCurbsideCoreSvc , egCore , egGridDataProvider , egProgr
                 ));
                 return;
             }
+
             ngToast.success(egCore.strings.$replace(
                 egCore.strings.SUCCESS_CURBSIDE_MARK_DELIVERED,
                 { slot_id : id }
             ));
             $scope.wasHandled[id] = true;
             $timeout(function() { $scope.refresh_arrived() }, 500);
+        },null, function (resp) {
+            events_to_handle_later.push(resp);
         });
     }
     $scope.gridCellHandlers.wasHandled = function(id) {