diff options
Diffstat (limited to 'addons/pos_six/static/src/js')
| -rw-r--r-- | addons/pos_six/static/src/js/BalanceButton.js | 21 | ||||
| -rw-r--r-- | addons/pos_six/static/src/js/Chrome.js | 17 | ||||
| -rw-r--r-- | addons/pos_six/static/src/js/models.js | 9 | ||||
| -rw-r--r-- | addons/pos_six/static/src/js/payment_six.js | 164 |
4 files changed, 211 insertions, 0 deletions
diff --git a/addons/pos_six/static/src/js/BalanceButton.js b/addons/pos_six/static/src/js/BalanceButton.js new file mode 100644 index 00000000..a792aa33 --- /dev/null +++ b/addons/pos_six/static/src/js/BalanceButton.js @@ -0,0 +1,21 @@ +odoo.define('pos_six.BalanceButton', function(require) { + 'use strict'; + + const PosComponent = require('point_of_sale.PosComponent'); + const Registries = require('point_of_sale.Registries'); + + class BalanceButton extends PosComponent { + sendBalance() { + this.env.pos.payment_methods.map(pm => { + if (pm.use_payment_terminal === 'six') { + pm.payment_terminal.send_balance(); + } + }); + } + } + BalanceButton.template = 'BalanceButton'; + + Registries.Component.add(BalanceButton); + + return BalanceButton; +}); diff --git a/addons/pos_six/static/src/js/Chrome.js b/addons/pos_six/static/src/js/Chrome.js new file mode 100644 index 00000000..0df6c4e1 --- /dev/null +++ b/addons/pos_six/static/src/js/Chrome.js @@ -0,0 +1,17 @@ +odoo.define('pos_six.chrome', function (require) { + 'use strict'; + + const Chrome = require('point_of_sale.Chrome'); + const Registries = require('point_of_sale.Registries'); + + const PosSixChrome = (Chrome) => + class extends Chrome { + get balanceButtonIsShown() { + return this.env.pos.payment_methods.some(pm => pm.use_payment_terminal === 'six'); + } + }; + + Registries.Component.extend(Chrome, PosSixChrome); + + return Chrome; +}); diff --git a/addons/pos_six/static/src/js/models.js b/addons/pos_six/static/src/js/models.js new file mode 100644 index 00000000..cf007442 --- /dev/null +++ b/addons/pos_six/static/src/js/models.js @@ -0,0 +1,9 @@ +odoo.define('pos_six.models', function (require) { + +var models = require('point_of_sale.models'); +var PaymentSix = require('pos_six.payment'); + +models.register_payment_method('six', PaymentSix); +models.load_fields('pos.payment.method', ['six_terminal_ip']); + +}); diff --git a/addons/pos_six/static/src/js/payment_six.js b/addons/pos_six/static/src/js/payment_six.js new file mode 100644 index 00000000..2eeb9b7d --- /dev/null +++ b/addons/pos_six/static/src/js/payment_six.js @@ -0,0 +1,164 @@ +odoo.define('pos_six.payment', function (require) { +"use strict"; + +const { Gui } = require('point_of_sale.Gui'); +var core = require('web.core'); +var PaymentInterface = require('point_of_sale.PaymentInterface'); + +var _t = core._t; + +onTimApiReady = function () {}; +onTimApiPublishLogRecord = function (record) { + // Log only warning or errors + if (record.matchesLevel(timapi.LogRecord.LogLevel.warning)) { + timapi.log(String(record)); + } +}; + +var PaymentSix = PaymentInterface.extend({ + + //-------------------------------------------------------------------------- + // Public + //-------------------------------------------------------------------------- + + /** + * @override + */ + init: function () { + this._super.apply(this, arguments); + this.enable_reversals(); + + var settings = new timapi.TerminalSettings(); + settings.connectionMode = timapi.constants.ConnectionMode.onFixIp; + settings.connectionIPString = this.payment_method.six_terminal_ip; + settings.connectionIPPort = "80"; + settings.integratorId = "175d97a0-2a88-4413-b920-e90037b582ac"; + settings.dcc = false; + + this.terminal = new timapi.Terminal(settings); + this.terminal.setPosId(this.pos.pos_session.name); + this.terminal.setUserId(this.pos.pos_session.user_id[0]); + + this.terminalListener = new timapi.DefaultTerminalListener(); + this.terminalListener.transactionCompleted = this._onTransactionComplete.bind(this); + this.terminalListener.balanceCompleted = this._onBalanceComplete.bind(this); + this.terminal.addListener(this.terminalListener); + + var recipients = [timapi.constants.Recipient.merchant, timapi.constants.Recipient.cardholder]; + var options = []; + _.forEach(recipients, (recipient) => { + var option = new timapi.PrintOption( + recipient, + timapi.constants.PrintFormat.normal, + 45, + [timapi.constants.PrintFlag.suppressHeader, timapi.constants.PrintFlag.suppressEcrInfo] + ); + options.push(option); + }); + this.terminal.setPrintOptions(options); + }, + + /** + * @override + */ + send_payment_cancel: function () { + this._super.apply(this, arguments); + this.terminal.cancel(); + return Promise.resolve(); + }, + + /** + * @override + */ + send_payment_request: function () { + this._super.apply(this, arguments); + this.pos.get_order().selected_paymentline.set_payment_status('waitingCard'); + return this._sendTransaction(timapi.constants.TransactionType.purchase); + }, + + /** + * @override + */ + send_payment_reversal: function () { + this._super.apply(this, arguments); + this.pos.get_order().selected_paymentline.set_payment_status('reversing'); + return this._sendTransaction(timapi.constants.TransactionType.reversal); + }, + + send_balance: function () { + this.terminal.balanceAsync(); + }, + + //-------------------------------------------------------------------------- + // Private + //-------------------------------------------------------------------------- + + _onTransactionComplete: function (event, data) { + timapi.DefaultTerminalListener.prototype.transactionCompleted(event, data); + + if (event.exception) { + if (event.exception.resultCode !== timapi.constants.ResultCode.apiCancelEcr) { + Gui.showPopup('ErrorPopup', { + title: _t('Transaction was not processed correctly'), + body: event.exception.errorText, + }); + } + + this.transactionResolve(); + } else { + if (data.printData){ + this._printReceipts(data.printData.receipts) + } + + // Store Transaction Data + var transactionData = new timapi.TransactionData(); + transactionData.transSeq = data.transactionInformation.transSeq; + this.terminal.setTransactionData(transactionData); + + this.transactionResolve(true); + } + }, + + _onBalanceComplete: function (event, data) { + if (event.exception) { + Gui.showPopup('ErrorPopup',{ + 'title': _t('Balance Failed'), + 'body': _t('The balance operation failed.'), + }); + } else { + this._printReceipts(data.printData.receipts); + } + }, + + _printReceipts: function (receipts) { + _.forEach(receipts, (receipt) => { + var value = receipt.value.replace(/\n/g, "<br />"); + if (receipt.recipient === timapi.constants.Recipient.merchant && this.pos.proxy.printer) { + this.pos.proxy.printer.print_receipt( + "<div class='pos-receipt'><div class='pos-payment-terminal-receipt'>" + + value + + "</div></div>" + ); + } else if (receipt.recipient === timapi.constants.Recipient.cardholder) { + this.pos.get_order().selected_paymentline.set_receipt_info(value); + } + }); + }, + + _sendTransaction: function (transactionType) { + var amount = new timapi.Amount( + Math.round(this.pos.get_order().selected_paymentline.amount / this.pos.currency.rounding), + timapi.constants.Currency[this.pos.currency.name], + this.pos.currency.decimals + ); + + return new Promise((resolve) => { + this.transactionResolve = resolve; + this.terminal.transactionAsync(transactionType, amount); + }); + }, +}); + +return PaymentSix; + +}); |
