diff --git a/fiscal_epos_print/models/point_of_sale.py b/fiscal_epos_print/models/point_of_sale.py index 4a9df0dc700c..d4b8a6ea3f39 100644 --- a/fiscal_epos_print/models/point_of_sale.py +++ b/fiscal_epos_print/models/point_of_sale.py @@ -21,6 +21,10 @@ class PosConfig(models.Model): fiscal_printer_serial = fields.Char(string='Fiscal Printer Serial') fiscal_cashdrawer = fields.Boolean(string='Fiscal Printer Open CashDrawer') + epos_print_courtesy_receipt = fields.Boolean( + string="Print courtesy receipt", + help="Print a courtesy receipt when the order has to be invoiced", + ) @api.constrains('printer_ip', 'iface_reprint_done_order') def _check_fiscal_epos_reprint(self): diff --git a/fiscal_epos_print/static/src/js/epson_epos_print.js b/fiscal_epos_print/static/src/js/epson_epos_print.js index e4430826a9d6..4ae8a70904a2 100644 --- a/fiscal_epos_print/static/src/js/epson_epos_print.js +++ b/fiscal_epos_print/static/src/js/epson_epos_print.js @@ -8,6 +8,39 @@ odoo.define("fiscal_epos_print.epson_epos_print", function (require) { var _t = core._t; var round_pr = utils.round_precision; + /** + * Return true if the fiscal printer will print a fiscal receipt for `order`. + */ + function eposWillPrintReceipt(order) { + return order.pos.config.printer_ip && !order.is_to_invoice(); + }; + /** + * Return true if the fiscal printer will print a courtesy receipt for `order`. + */ + function eposWillPrintCourtesyReceipt(order) { + return order.pos.config.printer_ip && order.is_to_invoice() && order.pos.config.epos_print_courtesy_receipt; + }; + /** + * Return true if the fiscal printer will print a receipt for `order`. + */ + function eposWillPrint(order) { + return eposWillPrintReceipt(order) || eposWillPrintCourtesyReceipt(order); + }; + /** + * Send `receipt` to the fiscal `printer`, + * this might print a receipt (fiscal or not) for `receipt`. + */ + function eposPrint(printer, receipt) { + var order = printer.order; + var result; + if (eposWillPrintReceipt(order)) { + result = printer.printFiscalReceipt(receipt); + } else if (eposWillPrintCourtesyReceipt(order)) { + result = printer.printNonFiscalReceipt(receipt); + } + return result + } + function addPadding(str, padding=4) { var pad = new Array(padding).fill(0).join('') + str; return pad.substr(pad.length - padding, padding); @@ -436,6 +469,41 @@ odoo.define("fiscal_epos_print.epson_epos_print", function (require) { console.log(xml); }, + prepareXMLNonFiscalReceipt: function(receipt) { + var xml = document.implementation.createDocument(null, "printerNonFiscal"); + + var beginNonFiscal = xml.createElement("beginNonFiscal"); + beginNonFiscal.setAttribute("operator", receipt.operator || "1"); + xml.documentElement.appendChild(beginNonFiscal); + + var printNormal = xml.createElement("printNormal"); + printNormal.setAttribute("data", _t("Courtesy receipt")); + printNormal.setAttribute("font", "3"); + printNormal.setAttribute("operator", receipt.operator || "1"); + xml.documentElement.appendChild(printNormal); + + for (let line of receipt.orderlines) { + printNormal = xml.createElement("printNormal"); + printNormal.setAttribute("data", line.product_name); + printNormal.setAttribute("font", "1"); + printNormal.setAttribute("operator", receipt.operator || "1"); + xml.documentElement.appendChild(printNormal); + } + + var endNonFiscal = xml.createElement("endNonFiscal"); + endNonFiscal.setAttribute("operator", receipt.operator || "1"); + xml.documentElement.appendChild(endNonFiscal); + + return xml; + }, + + printNonFiscalReceipt: function(receipt) { + var xml = this.prepareXMLNonFiscalReceipt(receipt); + var xmlString = new XMLSerializer().serializeToString(xml); + this.fiscalPrinter.send(this.url, xmlString); + console.log(xmlString); + }, + printFiscalReport: function() { var xml = ''; xml += ''; @@ -474,7 +542,11 @@ odoo.define("fiscal_epos_print.epson_epos_print", function (require) { }); return { - eposDriver: eposDriver + eposDriver: eposDriver, + eposWillPrintReceipt: eposWillPrintReceipt, + eposWillPrintCourtesyReceipt: eposWillPrintCourtesyReceipt, + eposWillPrint: eposWillPrint, + eposPrint: eposPrint, } }); diff --git a/fiscal_epos_print/static/src/js/pos_order_mgmt.js b/fiscal_epos_print/static/src/js/pos_order_mgmt.js index 3cc7965b6eee..e0e6e1deb4e2 100644 --- a/fiscal_epos_print/static/src/js/pos_order_mgmt.js +++ b/fiscal_epos_print/static/src/js/pos_order_mgmt.js @@ -31,10 +31,10 @@ odoo.define("fiscal_epos_print.pos_order_mgmt", function (require) { // copiato da screens.PaymentScreenWidget sendToFP90Printer: function(receipt, printer_options) { var fp90 = new eposDriver(printer_options, this); - fp90.printFiscalReceipt(receipt); + return epson_epos_print.eposPrint(fp90, receipt); }, action_print: function (order_data, order) { - if (this.pos.config.printer_ip) { + if (epson_epos_print.eposWillPrint(currentOrder)) { if (order_data.fiscal_receipt_number) { this.pos.gui.show_popup('error', { 'title': _t('Order already printed'), diff --git a/fiscal_epos_print/static/src/js/screens.js b/fiscal_epos_print/static/src/js/screens.js index 2edd9370d864..13007f7e0029 100644 --- a/fiscal_epos_print/static/src/js/screens.js +++ b/fiscal_epos_print/static/src/js/screens.js @@ -26,7 +26,7 @@ odoo.define("fiscal_epos_print.screens", function (require) { sendToFP90Printer: function(receipt, printer_options) { var fp90 = new eposDriver(printer_options, this); - fp90.printFiscalReceipt(receipt); + return epson_epos_print.eposPrint(printer_options["order"], receipt); }, render_receipt: function() { @@ -59,7 +59,7 @@ odoo.define("fiscal_epos_print.screens", function (require) { }, sendToFP90Printer: function(receipt, printer_options) { var fp90 = new eposDriver(printer_options, this); - fp90.printFiscalReceipt(receipt); + return epson_epos_print.eposPrint(fp90, receipt); }, finalize_validation: function() { // we need to get currentOrder before calling the _super() @@ -67,7 +67,7 @@ odoo.define("fiscal_epos_print.screens", function (require) { // the receipt preview var currentOrder = this.pos.get('selectedOrder'); this._super.apply(this, arguments); - if (this.pos.config.printer_ip && !currentOrder.is_to_invoice()) { + if (epson_epos_print.eposWillPrint(currentOrder)) { this.chrome.loading_show(); this.chrome.loading_message(_t('Connecting to the fiscal printer')); var printer_options = currentOrder.getPrinterOptions(); diff --git a/fiscal_epos_print/views/point_of_sale.xml b/fiscal_epos_print/views/point_of_sale.xml index 4176a81d8509..f45228be9c08 100644 --- a/fiscal_epos_print/views/point_of_sale.xml +++ b/fiscal_epos_print/views/point_of_sale.xml @@ -42,6 +42,16 @@
+
+
+ +
+
+