1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
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);
},
});
});
|