90 lines
3.4 KiB
Python
Executable File
90 lines
3.4 KiB
Python
Executable File
# 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)
|