Files
suite/pos_pax/static/src/js/PAXPaymentScreen.js
2020-11-15 15:07:02 -08:00

184 lines
7.1 KiB
JavaScript

odoo.define('pos_pax.PAXPaymentScreen', function (require) {
'use strict';
// Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
const { _t } = require('web.core');
const PaymentScreen = require('point_of_sale.PaymentScreen');
const Registries = require('point_of_sale.Registries');
const { useListener } = require('web.custom_hooks');
const PAX = require('pos_pax.pax_device');
PAX.mDestinationIP = '';
const PAXPaymentScreen = (PaymentScreen) =>
class extends PaymentScreen {
constructor() {
super(...arguments);
// tempting to use 'send-payment-request',
// but method implements things that don't seem to exist yet (payment_method.payment_terminal)
useListener('pax-send-payment-request', this._sendPAXPaymentRequest);
}
async _sendPAXPaymentRequest({ detail: line }) {
this.pax_credit_transaction(line);
}
pax_credit_transaction(line) {
var order = this.env.pos.get_order();
if(this.env.pos.getPAXOnlinePaymentJournals().length === 0) {
return;
}
var self = this;
var transaction = {};
var purchase_amount = line.get_amount();
var transactionType = '01'; // SALE
if (purchase_amount < 0.0) {
purchase_amount = -purchase_amount;
transactionType = '02'; // RETURN
}
transaction = {
command: 'T00',
version: '1.28',
transactionType: transactionType,
amountInformation: {
TransactionAmount: (purchase_amount * 100) | 0, // cast to integer
},
cashierInformation: {
ClerkID: this.env.pos.user.name,
},
traceInformation: {
ReferenceNumber: self.env.pos.get_order().uid,
// InvoiceNumber: self.env.pos.get_order().uid,
},
}
var def = new $.Deferred();
// show the transaction popup.
// the transaction deferred is used to update transaction status
self.showPopup('PAXPaymentTransactionPopup', {
transaction: def
});
def.notify({
message: _t('Handling transaction...'),
});
PAX.mDestinationIP = self.env.pos.config.pax_endpoint;
PAX.DoCredit(transaction, function (response) {
console.log(response);
var parsed_response = self.env.pos.decodePAXResponse(response);
if (parsed_response.fail) {
def.resolve({message: parsed_response.fail})
return;
}
if (parsed_response.success) {
line.paid = true;
line.pax_card_number = parsed_response.card_num;
line.pax_txn_id = parsed_response.txn_id;
line.pax_approval = parsed_response.approval;
line.pax_txn_pending = false;
line.set_credit_card_name();
order.trigger('change', order);
self.render();
def.resolve({message: 'Approval ' + parsed_response.approval, auto_close: true})
}
def.resolve({message: _t('Unknown response.')})
}, function (fail){
def.resolve({message: _t('Communication Failure: ') + fail});
});
}
pax_do_reversal(line) {
var def = new $.Deferred();
var self = this;
var transaction = {};
// show the transaction popup.
// the transaction deferred is used to update transaction status
this.showPopup('PAXPaymentTransactionPopup', {
transaction: def
});
def.notify({
message: 'Sending reversal...',
});
transaction = {
command: 'T00',
version: '1.28',
transactionType: (line.get_amount() > 0) ? '17' : '18', // V/SALE, V/RETURN
cashierInformation: {
ClerkID: this.env.pos.user.name,
},
traceInformation: {
ReferenceNumber: this.env.pos.get_order().uid,
InvoiceNumber: '',
AuthCode: line.pax_approval,
TransactionNumber: line.pax_txn_id,
},
}
PAX.mDestinationIP = self.env.pos.config.pax_endpoint;
PAX.DoCredit(transaction, function (response) {
var parsed_response = self.env.pos.decodePAXResponse(response);
if (parsed_response.fail) {
def.resolve({message: parsed_response.fail})
return;
}
if (parsed_response.success) {
def.resolve({
message: _t('Reversal succeeded.'),
auto_close: true,
});
self.remove_paymentline_by_ref(line);
return;
}
def.resolve({message: _t('Unknown response.')})
}, function (fail){
def.resolve({message: _t('Communication Failure: ') + fail});
});
}
remove_paymentline_by_ref(line) {
this.env.pos.get_order().remove_paymentline(line);
this.render();
}
/**
* @override
*/
deletePaymentLine(event) {
const { cid } = event.detail;
const line = this.paymentLines.find((line) => line.cid === cid);
if (line.pax_txn_id) {
this.pax_do_reversal(line);
} else {
super.deletePaymentLine(event);
}
}
/**
* @override
*/
addNewPaymentLine({ detail: paymentMethod }) {
const order = this.env.pos.get_order();
const res = super.addNewPaymentLine(...arguments);
if (res && paymentMethod.use_payment_terminal == 'pax') {
order.selected_paymentline.pax_txn_pending = true;
order.trigger('change', order);
this.render();
}
}
};
Registries.Component.extend(PaymentScreen, PAXPaymentScreen);
return PAXPaymentScreen;
});