diff --git a/addons/stock/models/stock_picking.py b/addons/stock/models/stock_picking.py index 751cdd1acc8..7f9780edc28 100644 --- a/addons/stock/models/stock_picking.py +++ b/addons/stock/models/stock_picking.py @@ -10,6 +10,7 @@ from markupsafe import escape from odoo import SUPERUSER_ID, _, api, fields, models from odoo.addons.stock.models.stock_move import PROCUREMENT_PRIORITIES +from odoo.addons.web.controllers.utils import clean_action from odoo.exceptions import UserError, ValidationError from odoo.osv import expression from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT, format_datetime, format_date, groupby @@ -84,6 +85,9 @@ class PickingType(models.Model): auto_show_reception_report = fields.Boolean( "Show Reception Report at Validation", help="If this checkbox is ticked, Odoo will automatically show the reception report (if there are moves to allocate to) when validating.") + auto_print_delivery_slip = fields.Boolean( + "Auto Print Delivery Slip", + help="If this checkbox is ticked, Odoo will automatically print the delivery slip of a picking when it is validated.") count_picking_draft = fields.Integer(compute='_compute_picking_count') count_picking_ready = fields.Integer(compute='_compute_picking_count') @@ -1150,7 +1154,8 @@ class Picking(models.Model): pickings_to_backorder = self - pickings_not_to_backorder pickings_not_to_backorder.with_context(cancel_backorder=True)._action_done() pickings_to_backorder.with_context(cancel_backorder=False)._action_done() - + report_actions = self._get_autoprint_report_actions() + another_action = False if self.user_has_groups('stock.group_reception_report'): pickings_show_report = self.filtered(lambda p: p.picking_type_id.auto_show_reception_report) lines = pickings_show_report.move_ids.filtered(lambda m: m.product_id.type == 'product' and m.state != 'cancel' and m.quantity_done and not m.move_dest_ids) @@ -1166,7 +1171,18 @@ class Picking(models.Model): ('product_id', 'in', lines.product_id.ids)], limit=1): action = pickings_show_report.action_view_reception_report() action['context'] = {'default_picking_ids': pickings_show_report.ids} - return action + if not report_actions: + return action + another_action = action + if report_actions: + return { + 'type': 'ir.actions.client', + 'tag': 'do_multi_print', + 'params': { + 'reports': report_actions, + 'anotherAction': another_action, + } + } return True def action_set_quantities_to_reservation(self): @@ -1690,3 +1706,12 @@ class Picking(models.Model): def _get_report_lang(self): return self.move_ids and self.move_ids[0].partner_id.lang or self.partner_id.lang or self.env.lang + + def _get_autoprint_report_actions(self): + report_actions = [] + pickings_to_print = self.filtered(lambda p: p.picking_type_id.auto_print_delivery_slip) + if pickings_to_print: + action = self.env.ref("stock.action_report_delivery").report_action(pickings_to_print.ids, config=False) + clean_action(action, self.env) + report_actions.append(action) + return report_actions diff --git a/addons/stock/static/src/client_actions/multi_print.js b/addons/stock/static/src/client_actions/multi_print.js new file mode 100644 index 00000000000..586f625f275 --- /dev/null +++ b/addons/stock/static/src/client_actions/multi_print.js @@ -0,0 +1,38 @@ +/** @odoo-module **/ + +import { _t } from "@web/core/l10n/translation"; +import { registry } from "@web/core/registry"; +import { sprintf } from "@web/core/utils/strings"; + +async function doMultiPrint(env, action) { + for (const report of action.params.reports) { + if (report.type != "ir.actions.report") { + env.services.notification.add(_t("Incorrect type of action submitted as a report, skipping action"), { + title: _t("Report Printing Error"), + }); + continue + } else if (report.report_type === "qweb-html") { + env.services.notification.add( + sprintf( + _t("HTML reports cannot be auto-printed, skipping report: %s"), + report.name) + , { + title: _t("Report Printing Error"), + }); + continue + } + // WARNING: potential issue if pdf generation fails, then action_service defaults + // to HTML and rest of the action chain will break w/potentially never resolving promise + await env.services.action.doAction({ type: "ir.actions.report", ...report }); + } + if (action.params.anotherAction) { + return env.services.action.doAction(action.params.anotherAction); + } else if (action.params.on_close) { + // handle special cases such as barcode + action.params.on_close() + } else { + return env.services.action.doAction("reload_context"); + } +} + +registry.category("actions").add("do_multi_print", doMultiPrint); diff --git a/addons/stock/views/stock_picking_type_views.xml b/addons/stock/views/stock_picking_type_views.xml index 00c14c789c2..6e0e530e9cc 100644 --- a/addons/stock/views/stock_picking_type_views.xml +++ b/addons/stock/views/stock_picking_type_views.xml @@ -78,49 +78,71 @@