Initial commit: Odoo 18.0-20251222 extra-addons
This commit is contained in:
89
sale_automatic_workflow/models/sale_order.py
Executable file
89
sale_automatic_workflow/models/sale_order.py
Executable file
@@ -0,0 +1,89 @@
|
||||
# Copyright 2011 Akretion Sébastien BEAU <sebastien.beau@akretion.com>
|
||||
# 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)
|
||||
Reference in New Issue
Block a user