summaryrefslogtreecommitdiff
path: root/addons/pos_mercury/static/src/js/pos_mercury.js
diff options
context:
space:
mode:
Diffstat (limited to 'addons/pos_mercury/static/src/js/pos_mercury.js')
-rw-r--r--addons/pos_mercury/static/src/js/pos_mercury.js139
1 files changed, 139 insertions, 0 deletions
diff --git a/addons/pos_mercury/static/src/js/pos_mercury.js b/addons/pos_mercury/static/src/js/pos_mercury.js
new file mode 100644
index 00000000..48342f24
--- /dev/null
+++ b/addons/pos_mercury/static/src/js/pos_mercury.js
@@ -0,0 +1,139 @@
+odoo.define('pos_mercury.pos_mercury', function (require) {
+"use strict";
+
+var pos_model = require('point_of_sale.models');
+
+pos_model.load_fields('pos.payment.method', 'pos_mercury_config_id');
+
+pos_model.PosModel = pos_model.PosModel.extend({
+ getOnlinePaymentMethods: function () {
+ var online_payment_methods = [];
+
+ $.each(this.payment_methods, function (i, payment_method) {
+ if (payment_method.pos_mercury_config_id) {
+ online_payment_methods.push({label: payment_method.name, item: payment_method.id});
+ }
+ });
+
+ return online_payment_methods;
+ },
+ decodeMagtek: function (magtekInput) {
+ // Regular expression to identify and extract data from the track 1 & 2 of the magnetic code
+ var _track1_regex = /%B?([0-9]*)\^([A-Z\/ -_]*)\^([0-9]{4})(.{3})([^?]+)\?/;
+
+ var track1 = magtekInput.match(_track1_regex);
+ var magtek_generated = magtekInput.split('|');
+
+ var to_return = {};
+ try {
+ track1.shift(); // get rid of complete match
+ to_return['number'] = track1.shift().substr(-4);
+ to_return['name'] = track1.shift();
+ track1.shift(); // expiration date
+ track1.shift(); // service code
+ track1.shift(); // discretionary data
+ track1.shift(); // zero pad
+
+ magtek_generated.shift(); // track1 and track2
+ magtek_generated.shift(); // clear text crc
+ magtek_generated.shift(); // encryption counter
+ to_return['encrypted_block'] = magtek_generated.shift();
+ magtek_generated.shift(); // enc session id
+ magtek_generated.shift(); // device serial
+ magtek_generated.shift(); // magneprint data
+ magtek_generated.shift(); // magneprint status
+ magtek_generated.shift(); // enc track3
+ to_return['encrypted_key'] = magtek_generated.shift();
+ magtek_generated.shift(); // enc track1
+ magtek_generated.shift(); // reader enc status
+
+ return to_return;
+ } catch (e) {
+ return 0;
+ }
+ },
+ decodeMercuryResponse: function (data) {
+ // get rid of xml version declaration and just keep the RStream
+ // from the response because the xml contains two version
+ // declarations. One for the SOAP, and one for the content. Maybe
+ // we should unpack the SOAP layer in python?
+ data = data.replace(/.*<\?xml version="1.0"\?>/, "");
+ data = data.replace(/<\/CreditTransactionResult>.*/, "");
+
+ var xml = $($.parseXML(data));
+ var cmd_response = xml.find("CmdResponse");
+ var tran_response = xml.find("TranResponse");
+
+ return {
+ status: cmd_response.find("CmdStatus").text(),
+ message: cmd_response.find("TextResponse").text(),
+ error: cmd_response.find("DSIXReturnCode").text(),
+ card_type: tran_response.find("CardType").text(),
+ auth_code: tran_response.find("AuthCode").text(),
+ acq_ref_data: tran_response.find("AcqRefData").text(),
+ process_data: tran_response.find("ProcessData").text(),
+ invoice_no: tran_response.find("InvoiceNo").text(),
+ ref_no: tran_response.find("RefNo").text(),
+ record_no: tran_response.find("RecordNo").text(),
+ purchase: parseFloat(tran_response.find("Purchase").text()),
+ authorize: parseFloat(tran_response.find("Authorize").text()),
+ };
+ }
+});
+
+var _paylineproto = pos_model.Paymentline.prototype;
+pos_model.Paymentline = pos_model.Paymentline.extend({
+ init_from_JSON: function (json) {
+ _paylineproto.init_from_JSON.apply(this, arguments);
+
+ this.paid = json.paid;
+ this.mercury_card_number = json.mercury_card_number;
+ this.mercury_card_brand = json.mercury_card_brand;
+ this.mercury_card_owner_name = json.mercury_card_owner_name;
+ this.mercury_ref_no = json.mercury_ref_no;
+ this.mercury_record_no = json.mercury_record_no;
+ this.mercury_invoice_no = json.mercury_invoice_no;
+ this.mercury_auth_code = json.mercury_auth_code;
+ this.mercury_data = json.mercury_data;
+ this.mercury_swipe_pending = json.mercury_swipe_pending;
+
+ this.set_credit_card_name();
+ },
+ export_as_JSON: function () {
+ return _.extend(_paylineproto.export_as_JSON.apply(this, arguments), {paid: this.paid,
+ mercury_card_number: this.mercury_card_number,
+ mercury_card_brand: this.mercury_card_brand,
+ mercury_card_owner_name: this.mercury_card_owner_name,
+ mercury_ref_no: this.mercury_ref_no,
+ mercury_record_no: this.mercury_record_no,
+ mercury_invoice_no: this.mercury_invoice_no,
+ mercury_auth_code: this.mercury_auth_code,
+ mercury_data: this.mercury_data,
+ mercury_swipe_pending: this.mercury_swipe_pending});
+ },
+ set_credit_card_name: function () {
+ if (this.mercury_card_number) {
+ this.name = this.mercury_card_brand + " (****" + this.mercury_card_number + ")";
+ }
+ },
+ is_done: function () {
+ var res = _paylineproto.is_done.apply(this);
+ return res && !this.mercury_swipe_pending;
+ },
+ export_for_printing: function () {
+ const result = _paylineproto.export_for_printing.apply(this, arguments);
+ result.mercury_data = this.mercury_data;
+ result.mercury_auth_code = this.mercury_auth_code;
+ return result;
+ }
+});
+
+var _order_super = pos_model.Order.prototype;
+pos_model.Order = pos_model.Order.extend({
+ electronic_payment_in_progress: function() {
+ var res = _order_super.electronic_payment_in_progress.apply(this, arguments);
+ return res || this.get_paymentlines().some(line => line.mercury_swipe_pending);
+ },
+});
+
+});