diff --git a/models/pos_config.py b/models/pos_config.py index afa83a7..3d9ea1e 100644 --- a/models/pos_config.py +++ b/models/pos_config.py @@ -3,14 +3,13 @@ from odoo import fields, models, api class PosConfig(models.Model): _inherit = 'pos.config' - receipt_print_copies = fields.Integer(string='Default Number of Copies', default=1, help="Default number of copies to print for receipts.") - receipt_paper_size = fields.Selection([ + imin_print_copies = fields.Integer(string='Default Print Copies', default=1, help="Default number of copies to print.") + imin_paper_size = fields.Selection([ ('57mm', '57mm (ISO 57)'), ('58mm', '58mm'), ('80mm', '80mm'), - ('80x210mm', '80 x 210 mm'), - ('80x297mm', '80 x 297 mm'), + ('80x210mm', '80x210mm'), + ('80x297mm', '80x297mm'), ('112mm', '112mm'), ('A4', 'A4'), ], string='Default Paper Size', default='57mm', help="Default paper size for browser print dialog.") - diff --git a/models/res_config_settings.py b/models/res_config_settings.py index f90a0bc..f95e0ff 100644 --- a/models/res_config_settings.py +++ b/models/res_config_settings.py @@ -3,5 +3,5 @@ from odoo import fields, models class ResConfigSettings(models.TransientModel): _inherit = 'res.config.settings' - pos_receipt_print_copies = fields.Integer(related='pos_config_id.receipt_print_copies', readonly=False) - pos_receipt_paper_size = fields.Selection(related='pos_config_id.receipt_paper_size', readonly=False) + pos_imin_print_copies = fields.Integer(related='pos_config_id.imin_print_copies', readonly=False) + pos_imin_paper_size = fields.Selection(related='pos_config_id.imin_paper_size', readonly=False) diff --git a/static/src/app/services/pos_store_patch.js b/static/src/app/services/pos_store_patch.js index 83265a6..470aa98 100644 --- a/static/src/app/services/pos_store_patch.js +++ b/static/src/app/services/pos_store_patch.js @@ -2,20 +2,67 @@ import { PosStore } from "@point_of_sale/app/services/pos_store"; import { patch } from "@web/core/utils/patch"; +import { OrderReceipt } from "@point_of_sale/app/screens/receipt_screen/receipt/order_receipt"; +import { waitImages } from "@point_of_sale/utils"; patch(PosStore.prototype, { async printReceipt(params = {}) { - const copies = this.config.receipt_print_copies || 1; - const paperSize = this.config.receipt_paper_size || '57mm'; + const config = this.config; + const copies = config.imin_print_copies || 1; + const paperSize = config.imin_paper_size || '57mm'; // Inject CSS for paper size to guide browser print dialog this._injectReceiptPaperSizeCSS(paperSize); - - let result; - // Print multiple copies - for (let i = 0; i < copies; i++) { - result = await super.printReceipt(params); + + if (copies <= 1) { + return super.printReceipt(params); } + + const { basic = false, order = this.getOrder(), printBillActionTriggered = false } = params; + + // Manually render the receipt element + const el = await this.printer.renderer.toHtml(OrderReceipt, { + order, + basic_receipt: basic, + }); + await waitImages(el); + + // Duplicate the receipt content in a container + const container = document.createElement('div'); + container.classList.add('pos-multi-receipt-container'); + + for (let i = 0; i < copies; i++) { + const clone = el.cloneNode(true); + if (i < copies - 1) { + // Add a page break between receipts + clone.style.breakAfter = "page"; + // Add a small margin for thermal printers that don't support hard breaks + clone.style.marginBottom = "20px"; + } + container.appendChild(clone); + } + + // Print the combined container (only one print dialog will show) + const result = await this.printer.printHtml(container, this.printOptions); + + // Update print count logic (matching Odoo core) + if (!printBillActionTriggered && result) { + const count = order.nb_print ? order.nb_print + 1 : 1; + if (order.isSynced) { + const wasDirty = order.isDirty(); + await this.data.write("pos.order", [order.id], { nb_print: count }); + if (!wasDirty) { + order._dirty = false; + } + } else { + order.nb_print = count; + } + } + + if (result?.warningCode) { + this.displayPrinterWarning(result, "Receipt Printer"); + } + return result; }, diff --git a/views/pos_config_views.xml b/views/pos_config_views.xml index daf1da6..f8f456f 100644 --- a/views/pos_config_views.xml +++ b/views/pos_config_views.xml @@ -9,12 +9,12 @@
-
-