mirror of
https://gitlab.com/hibou-io/hibou-odoo/suite.git
synced 2025-01-20 12:37:31 +02:00
184 lines
7.1 KiB
JavaScript
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;
|
|
});
|