# Copyright 2011 Akretion Sébastien BEAU # Copyright 2013 Camptocamp SA (author: Guewen Baconnier) # Copyright 2016 Sodexis # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from odoo import api, fields, models from odoo.tools import float_compare class SaleOrder(models.Model): _inherit = "sale.order" workflow_process_id = fields.Many2one( comodel_name="sale.workflow.process", string="Automatic Workflow", ondelete="restrict", copy=False, ) all_qty_delivered = fields.Boolean( compute="_compute_all_qty_delivered", string="All quantities delivered", store=True, ) @api.depends("order_line.qty_delivered", "order_line.product_uom_qty") def _compute_all_qty_delivered(self): precision = self.env["decimal.precision"].precision_get( "Product Unit of Measure" ) for order in self: order.all_qty_delivered = all( line.product_id.type == "service" or float_compare( line.qty_delivered, line.product_uom_qty, precision_digits=precision ) == 0 for line in order.order_line ) def _prepare_invoice(self): invoice_vals = super()._prepare_invoice() workflow = self.workflow_process_id if not workflow: return invoice_vals invoice_vals["workflow_process_id"] = workflow.id if workflow.invoice_date_is_order_date: invoice_vals["invoice_date"] = fields.Date.context_today( self, self.date_order ) if workflow.property_journal_id: invoice_vals["journal_id"] = workflow.property_journal_id.id return invoice_vals @api.onchange("workflow_process_id") def _onchange_workflow_process_id(self): if self.workflow_process_id.warning: warning = { "title": self.env._("Workflow Warning"), "message": self.workflow_process_id.warning, } return {"warning": warning} @api.depends("partner_id", "user_id", "workflow_process_id") def _compute_team_id(self): # pylint: disable=W8110 super()._compute_team_id() if self.workflow_process_id.team_id: self.team_id = self.workflow_process_id.team_id.id def _create_invoices(self, grouped=False, final=False, date=None): for order in self: if not order.workflow_process_id.invoice_service_delivery: continue for line in order.order_line: if line.qty_delivered_method == "manual" and not line.qty_delivered: line.write({"qty_delivered": line.product_uom_qty}) return super()._create_invoices(grouped=grouped, final=final, date=date) def write(self, vals): if vals.get("state") == "sale" and vals.get("date_order"): sales_keep_order_date = self.filtered( lambda sale: sale.workflow_process_id.invoice_date_is_order_date ) if sales_keep_order_date: new_vals = vals.copy() del new_vals["date_order"] res = super(SaleOrder, sales_keep_order_date).write(new_vals) res |= super(SaleOrder, self - sales_keep_order_date).write(vals) return res return super().write(vals)