Переглянути джерело

pending card processing (wip)

* rudiments done, still needs testing and cleanup
abetusk 4 роки тому
батько
коміт
4397796480

+ 18 - 3
main/app/routes.py

@@ -293,7 +293,7 @@ def api_pending():
   res = {}
   args = request.args
 
-  field_names = ["org_card_order_queue", "userid", "logical_card_id",
+  field_names = ["org_card_order_queue_id", "userid", "logical_card_id",
                  "created", "processed", "comment" ]
 
   vals = {}
@@ -311,8 +311,23 @@ def api_pending():
 
     elif args["action"] == "process":
       api_req["action"] = "process"
-      api_req["org_card_order_queue_id"] = val["org_card_order_queue"]
-      res = api.Pending(api_req)
+
+      if "org_card_order_queue_id" in vals:
+        api_req["org_card_order_queue_id"] = vals["org_card_order_queue_id"]
+        res = api.Request(api_req)
+      else:
+        res["result"] = "fail"
+        res["api_comment"] = "org_card_order_queue_id must be specified"
+
+    elif args["action"] == "get":
+      api_req["action"] = "get"
+      if "org_card_order_queue_id" in vals:
+        api_req["org_card_order_queue_id"] = vals["org_card_order_queue_id"]
+        res = api.Request(api_req)
+      else:
+        res["result"] = "fail"
+        res["api_comment"] = "org_card_order_queue_id must be specified"
+
 
   return jsonify(res)
 

+ 214 - 19
main/app/static/js/popufare_admin.js

@@ -225,18 +225,32 @@ function api_resp(xhr,extra) {
       }
 
       else if (extra["ui_function"] === "pending.list") {
-
         if (dat["result"] === "success") {
+          update_message("ui.pending.message", "success", "");
+          ui_pending_list_cards(dat);
+        }
+        else { update_message("ui.pending.message", "error", dat.api_comment); }
+      }
 
-          console.log(dat);
+      else if (extra["ui_function"] === "pending.populate") {
+        if (dat["result"] === "success") {
+          update_message("ui.pending.message", "success", "");
+          ui_pending_fill(dat);
 
-          update_message("ui.pending.message", "success", "loaded");
-          ui_pending_list(dat);
-        }
-        else {
-          update_message("ui.pending.message", "error", dat.api_comment);
+          ui_pending_showload();
         }
+        else { update_message("ui.pending.message", "error", dat.api_comment); }
+      }
 
+      else if (extra["ui_function"] === "pending.processed") {
+        console.log("!!!", dat);
+        if (dat["result"] === "success") {
+          update_message("ui.pending.message", "success", "processed");
+          ui_pending_clear(dat);
+          ui_pending_hideload();
+          ui_pending_list_cards(dat);
+        }
+        else { update_message("ui.pending.message", "error", dat.api_comment); }
       }
 
       else if (extra["ui_function"] === "group") {
@@ -304,6 +318,19 @@ function _get_select_id(fid) {
   return null;
 }
 
+function _set_select_by_id(fid, id) {
+  var ele = document.getElementById(fid);
+  if (!ele) { return; }
+
+  var n = ele.options.length;
+  for (var idx=0; idx<n; idx++) {
+    if (ele.options[idx].id == "id") {
+      ele.selectedIndex = idx;
+      return;
+    }
+  }
+}
+
 function _date_only(s) {
   if (!s) { return s; }
   if (s.length > 0) {
@@ -897,6 +924,37 @@ function reissue_card_fill(card_data) {
 // --------------------------------------
 // --------------------------------------
 
+function ui_pending_showload(qid) {
+  var ele = document.getElementById("ui.process.process");
+  ele.style.display = 'block';
+}
+
+function ui_pending_hideload(qid) {
+  var ele = document.getElementById("ui.process.process");
+  ele.style.display = 'none';
+}
+
+function ui_pending_process() {
+  var ele = document.getElementById("ui.pending.org_card_order_queue_id");
+  var qid = ele.innerHTML;
+
+  console.log(">>>", qid);
+
+  var dat = {
+    "api_function":"Pending",
+    "ui_function":"pending.processed",
+    "data": [
+      ["action", "process"],
+      ["org_card_order_queue_id", qid]
+    ]};
+  api_req(dat);
+
+}
+
+function ui_pending_load(qid) {
+  _redirect( "process_pending_card?org_card_order_queue_id=" + qid);
+}
+
 function _html_pending_card(qid, cardid, magid, rfid, idx) {
   idx = ((typeof idx === "undefined") ? 0 : idx);
   magid = ((typeof magid === "undeifned") ? "" : (magid ? magid : ""))
@@ -910,26 +968,148 @@ function _html_pending_card(qid, cardid, magid, rfid, idx) {
     row.classList.add("row-shade");
   }
 
+  /*
+  <div class='col-2'>
+  <button type='button' class='btn btn-secondary btn-sm'>Load</button>
+  </div>
+  */
+
+  cell = document.createElement("div");
+  cell.innerHTML = "<button type='button' class='btn btn-secondary btn-sm' onclick='ui_pending_load(" + qid + ");'>Load</button>";
+  cell.classList.add("col-3");
+  row.appendChild(cell);
+
+
   cell = document.createElement("div");
   cell.innerHTML = "<a href='/process_pending_card?org_card_order_queue_id=" + qid+ "'>" + cardid + "</a>";
-  cell.classList.add("col-4");
+  cell.classList.add("col-3");
   row.appendChild(cell);
 
   cell = document.createElement("div");
   cell.innerHTML = "<a href='/process_pending_card?org_card_order_queue_id=" + qid + "'>" + magid + "</a>";
-  cell.classList.add("col-4");
+  cell.classList.add("col-3");
   row.appendChild(cell);
 
   cell = document.createElement("div");
   cell.innerHTML = "<a href='/process_pending_card?org_card_order_queue_id=" + qid + "'>" + rfid + "</a>";
+  cell.classList.add("col-3");
+  row.appendChild(cell);
+
+  return row;
+}
+
+function _html_pass(data, idx) {
+  idx = ((typeof idx === "undefined") ? 0 : idx);
+  var row, cell;
+
+  row = document.createElement("div");
+  row.classList.add("row");
+  row.classList.add("rowpop");
+  if ((idx % 2) == 0) {
+    row.classList.add("row-shade");
+  }
+
+  var pass_type = "";
+  var pass_val = '';
+  var pass_rule = '';
+  if ("rule" in data) {
+    pass_rule = data.rule;
+    if (data.rule.match(/NRIDE/)) {
+      pass_type = "NRide";
+      pass_val = data.nrides_remain;
+    }
+    else if (data.rule.match(/NDAY/)) {
+      pass_type = "NDay";
+      pass_val = data.nday_orig;
+    }
+    else {
+      pass_type = "Other";
+    }
+  }
+
+  cell = document.createElement("div");
+  cell.innerHTML =  pass_type;
+  cell.classList.add("col-4");
+  row.appendChild(cell);
+
+  cell = document.createElement("div");
+  cell.innerHTML = pass_val;
+  cell.classList.add("col-4");
+  row.appendChild(cell);
+
+  cell = document.createElement("div");
+  cell.innerHTML = pass_rule;
   cell.classList.add("col-4");
   row.appendChild(cell);
 
   return row;
 }
 
+function ui_pending_clear() {
+  console.log("ui_pending_clear:");
+  var ui_pfx = "ui.pending.";
+  var card_fields = [
+    "mag_token", "rfid_token", "logical_card_id", "username", "first_name", "last_name",
+    "email", "phone", "address", "city", "state", "zip",
+    "shipping_name", "shipping_address", "shipping_city",
+    "shipping_state", "shipping_zip" ];
+
+  _fill_input_field(ui_pfx + "org_card_order_queue_id", "");
+  for (var idx=0; idx<card_fields.length; idx++) {
+    var key = card_fields[idx];
+    var ui_id  = ui_pfx + key;
+    _fill_input_field(ui_id, "");
+  }
+}
+
+function ui_pending_fill(data) {
+  console.log("ui_pending_fill:", data);
+  var ui_pfx = "ui.pending.";
+
+  var card_fields = [
+    "mag_token", "rfid_token", "logical_card_id", "username", "first_name", "last_name",
+    "email", "phone", "address", "city", "state", "zip",
+    "shipping_name", "shipping_address", "shipping_city",
+    "shipping_state", "shipping_zip" ];
+
+
+  _fill_input_field(ui_pfx + "org_card_order_queue_id", data.pending_card["org_card_order_queue_id"]);
+
+  if ("cardinfo" in data) {
+    for (var idx=0; idx<card_fields.length; idx++) {
+      var key = card_fields[idx];
+      var ui_id  = ui_pfx + key;
+
+      if (key in data.cardinfo) {
+        _fill_input_field(ui_id, data.cardinfo[key]);
+      }
+      else {
+        _fill_input_field(ui_id, "");
+      }
+
+    }
+
+    if ("group_id" in data.cardinfo) {
+      _set_select_by_id(ui_pfx + "group", data.cardinfo.group_id);
+    }
+
+    var pass_row = document.getElementById(ui_pfx + "passes");
+    while (pass_row.firstChild) {
+      pass_row.removeChild(pass_row.lastChild);
+    }
+
+    for (var pass_idx=0; pass_idx < data.cardinfo.pass.length; pass_idx++) {
+      var _r = _html_pass(data.cardinfo.pass[pass_idx], pass_idx);
+      pass_row.appendChild( _r );
+    }
+
+  }
+
+
+}
+
 
-function ui_pending_list(data) {
+function ui_pending_list_cards(data) {
   console.log("pending", data);
 
   var div_card_list = document.getElementById("ui.pending.cards");
@@ -1520,15 +1700,30 @@ function admin_api_init() {
   }
 
   else if (_func === "process_pending_card") {
-    _attach_button( "ui.process.", (function() { return ui_pending("xxx"); }) );
-
-    api_req({
-      "api_function":"Pending",
-      "ui_function":"pending.list",
-      "data": [
-        ["action","getall"]
-      ]
-    });
+    _attach_button( "ui.process.process", (function() { return ui_pending_process(); }) );
+
+    if ("org_card_order_queue_id" in _h) {
+
+      console.log("cp", _h["org_card_order_queue_id"]);
+
+      api_req({
+        "api_function":"Pending",
+        "ui_function":"pending.populate",
+        "data": [
+          ["action","get"],
+          ["org_card_order_queue_id",_h["org_card_order_queue_id"] ]
+        ]
+      });
+    }
+
+      api_req({
+        "api_function":"Pending",
+        "ui_function":"pending.list",
+        "data": [
+          ["action","getall"]
+        ]
+      });
+
 
   }
 

+ 38 - 46
main/app/templates/process_pending_card.html

@@ -14,12 +14,6 @@
 
   <div class='container'>
 
-    <!-- container row -->
-    <div class='row'>
-
-      <!-- col-10 -->
-      <div class=$col-12'>
-
         <!-- two column row-->
         <div class='row'>
 
@@ -27,32 +21,51 @@
           <div class='col-6'>
 
             <div class='row rowpop'>
-              <div class='col-12'><h3> Process Pending Card</h3></div>
+              <div class='col-8'><h3> Process Pending Card</h3></div>
+              <div class='col-4'>
+                <button type='button' class='btn btn-secondary btn-sm' style='display:none;' id='ui.process.process'>Process</button>
+              </div>
             </div>
 
 
             <div class='row rowpop row-shade'>
               <div class='col-4'> Queue Id </div>
-              <div class='col-8' id='ui.pending.queue_id'> ...  </div>
+              <div class='col-8' id='ui.pending.org_card_order_queue_id'> ...  </div>
             </div>
 
             <div class='row rowpop'>
-              <div class='col-4'> MagStripe </div>
-              <div class='col-8'> <input type='text' id='ui.pending.mag_token' class='form-control form-control-sm' placeholder=''> </div>
+              <div class='col-4'> Card Id </div>
+              <div class='col-8' id='ui.pending.logical_card_id'> ...  </div>
             </div>
 
             <div class='row rowpop row-shade'>
+              <div class='col-4'> MagStripe </div>
+              <div class='col-8' id='ui.pending.mag_token'> </div>
+            </div>
+
+            <div class='row rowpop '>
               <div class='col-4'> RFID </div>
-              <div class='col-3'>
-                <input type='text' class='form-control form-control-sm' placeholder='' id='ui.pending.rf_site'>
-              </div>
+              <div class='col-8' id='ui.pending.rfid_token'> ... </div>
+            </div>
 
-              <div class='col-5'>
-                <input type='text' class='form-control form-control-sm' placeholder='' id='ui.pending.rf_id'>
-              </div>
 
+            <div class='row rowpop row-shade'>
+              <div class='col-4'> Group </div>
+              <div class='col-8'>
+
+                <div class='input-group input-group-sm mb-3'>
+                  <select class='custom-select' id='ui.pending.group'>
+                    {% for g in groups %}
+                    <option id='{{ g.group_id }}'>{{ g.group_name }}</option>
+                    {% endfor %}
+                  </select>
+                </div>
+
+              </div>
             </div>
 
+
+
             <div class='row rowpop'>
               <div class='col-4'> User Name </div>
               <div class='col-8' id='ui.pending.username'> ...  </div>
@@ -122,22 +135,6 @@
               <div class='col-4'> Shipping ZIP </div>
               <div class='col-8' id='ui.pending.shipping_zip'> ...  </div>
             </div>
-
-            <div class='row rowpop'>
-              <div class='col-4'> Group </div>
-              <div class='col-8'>
-
-                <div class='input-group input-group-sm mb-3'>
-                  <select class='custom-select' id='ui.pending.group'>
-                    {% for g in groups %}
-                    <option id='{{ g.group_id }}'>{{ g.group_name }}</option>
-                    {% endfor %}
-                  </select>
-                </div>
-
-              </div>
-            </div>
-
           </div>
 
 <!--
@@ -151,7 +148,7 @@
               <div class='col-12'><h3> Passes on Card </h3></div>
             </div>
 
-            <div class='col-12'>
+            <div class='col-12' id='ui.pending.passes'>
 
               <div class='row rowpop row-shade'>
                 <div class='col-4'>Type</div>
@@ -192,17 +189,18 @@
         </div>
 
         <div class='row'>
-          <div class='col-12' id='ui.pending.cards'>
+          <div class='col-12' id='ui.pending.cards.hdr'>
 
 
-            <div class='row rowpop row-shade'>
-              <div class='col-2'> </div>
-              <div class='col-2'> Card Id </div>
-              <div class='col-4'> Mag Stripe</div>
-              <div class='col-2'> RF Site </div>
-              <div class='col-2'> RFID </div>
+            <div class='row rowpop '>
+              <div class='col-3'> </div>
+              <div class='col-3'> Card Id </div>
+              <div class='col-3'> Mag Stripe</div>
+              <div class='col-3'> RFID </div>
             </div>
+          </div>
 
+          <div class='col-12' id='ui.pending.cards'>
             <div class='row rowpop'>
               <div class='col-2'>
                 <button type='button' class='btn btn-secondary btn-sm'>Load</button>
@@ -232,12 +230,6 @@
         <br>
 
 
-      <!-- col-10 -->
-      </div>
-
-    <!-- container row -->
-    </div>
-
   <!-- container -->
   </div>