Checkout: further validation of due date override
authorDan Scott <dan@coffeecode.net>
Mon, 8 Oct 2012 19:08:47 +0000 (15:08 -0400)
committerLebbeous Fogle-Weekley <lebbeous@esilibrary.com>
Tue, 9 Oct 2012 17:57:44 +0000 (13:57 -0400)
The check_past() function failed if given a date that was not strictly
in YYYY-mm-dd format; interestingly, a common transposition typo such
as "0212-10-20" results in "212-10-20" getting passed to check_past(),
and therefore generating an invalid date. Throw an exception in
check_past() rather than returning true, because we are not in fact
stating that the due date is in the past - and catch the exception and
flag the due date override box accordingly in the checkout screen.

We could bubble the exception up to the user, but hopefully highlighting
the checkout box as being in an invalid state will catch the attention
of the users.

[LFW: Slightly amended a comment in OpenILS/WWW/EGCatLoader/Util.pm]

Signed-off-by: Dan Scott <dan@coffeecode.net>
Signed-off-by: Lebbeous Fogle-Weekley <lebbeous@esilibrary.com>
Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Util.pm
Open-ILS/xul/staff_client/chrome/content/util/date.js
Open-ILS/xul/staff_client/server/circ/checkout.js

index 04360af..470e381 100644 (file)
@@ -184,7 +184,7 @@ sub init_ro_object_cache {
         my $date = shift;
 
         # Probably an accidental entry like '0212' instead of '2012',
-        # but 1) the leading 0 gets stripped in CStoreEditor and
+        # but 1) the leading 0 may get stripped in cstore and
         # 2) DateTime::Format::ISO8601 returns an error as years
         # must be 2 or 4 digits
         if ($date =~ m/^\d{3}-/) {
index fb95bee..47c3e21 100644 (file)
@@ -24,8 +24,16 @@ util.date.check = function(format,date) {
 
 util.date.check_past = function(format,date) {
     if (format != 'YYYY-MM-DD') { throw('I only understand YYYY-MM-DD.  Fix me if you want.'); }
-    var yyyy = date.substr(0,4); var mm = date.substr(5,2); var dd = date.substr(8,2);
+    var yyyy = date.substr(0,4);
+    var mm = date.substr(5,2);
+    var dd = date.substr(8,2);
     var test_date = new Date( yyyy, mm - 1, dd );
+
+    /* Ensure our date is valid */
+    if (isNaN(test_date.getTime())) {
+        throw('The date "' + date + '" is not valid.');
+    }
+
     date = util.date.formatted_date(new Date(),'%F');
     yyyy = date.substr(0,4); mm = date.substr(5,2); dd = date.substr(8,2);
     var today = new Date( yyyy, mm - 1, dd );
index 87a2115..08455c3 100644 (file)
@@ -120,7 +120,7 @@ circ.checkout.prototype = {
                         ['change'],
                         function(ev) { 
                             try {
-                               document.getElementById('checkout_duedate_checkbox').checked = true;
+                                document.getElementById('checkout_duedate_checkbox').checked = true;
                                 if (obj.check_date(ev.target)) {
                                     ev.target.parentNode.setAttribute('style','');
                                 } else {
@@ -348,10 +348,17 @@ circ.checkout.prototype = {
             obj.controller.view.checkout_barcode_entry_textbox.disabled = false;
             obj.controller.view.cmd_checkout_submit.setAttribute('disabled','false');
             obj.controller.view.cmd_checkout_submit.disabled = false;
-            if (util.date.check_past('YYYY-MM-DD',node.value) ) {
-                obj.controller.view.checkout_barcode_entry_textbox.setAttribute('disabled','true');
-                obj.controller.view.cmd_checkout_submit.setAttribute('disabled','true');
-                return false;
+            try {
+                if (util.date.check_past('YYYY-MM-DD',node.value) ) {
+                    obj.controller.view.checkout_barcode_entry_textbox.setAttribute('disabled','true');
+                    obj.controller.view.cmd_checkout_submit.setAttribute('disabled','true');
+                    return false;
+                }
+            }
+            catch (E) {
+                    obj.controller.view.checkout_barcode_entry_textbox.setAttribute('disabled','true');
+                    obj.controller.view.cmd_checkout_submit.setAttribute('disabled','true');
+                    return false;
             }
             return true;
         } catch(E) {