87 lines
2.8 KiB
Python
87 lines
2.8 KiB
Python
from odoo import _, fields, models
|
|
from odoo.exceptions import UserError
|
|
|
|
|
|
class SaleOrder(models.Model):
|
|
_inherit = "sale.order"
|
|
|
|
batch_id = fields.Many2one(
|
|
"sale.order.batch",
|
|
copy=False,
|
|
check_company=True,
|
|
domain="[('state','!=','closed')]",
|
|
)
|
|
batch_state = fields.Selection(
|
|
related="batch_id.state",
|
|
string="Batch State",
|
|
)
|
|
|
|
def _get_current_batch(self):
|
|
"""
|
|
Returns the current batch of the sale order.
|
|
:return: sale.order.batch
|
|
"""
|
|
self.ensure_one()
|
|
return self.env["sale.order.batch"].search(
|
|
[("state", "=", "open"), ("company_id", "=", self.company_id.id)], limit=1
|
|
)
|
|
|
|
def action_add_to_batch(self):
|
|
"""
|
|
TODO: Add Wizard to choose between batches if more than one existis.
|
|
Picking the first one for now.
|
|
"""
|
|
for sale_order in self:
|
|
company = sale_order.company_id
|
|
sale_order = sale_order.with_company(company)
|
|
if not sale_order.batch_id and sale_order.state in ["draft"]:
|
|
batch = sale_order._get_current_batch()
|
|
if not batch:
|
|
batch = sale_order.env["sale.order.batch"].create({})
|
|
sale_order.batch_id = batch
|
|
|
|
def action_view_sale_order_batch(self):
|
|
return {
|
|
"name": _("Sale Order Batch"),
|
|
"type": "ir.actions.act_window",
|
|
"view_type": "form",
|
|
"view_mode": "form",
|
|
"res_model": "sale.order.batch",
|
|
"res_id": self.batch_id.id,
|
|
}
|
|
|
|
def action_quotation_send(self):
|
|
invalid_orders = []
|
|
if not self.env.context.get("bypass_batch", False):
|
|
for order in self:
|
|
if order.batch_id:
|
|
invalid_orders.append(order.name)
|
|
if invalid_orders:
|
|
raise UserError(
|
|
_(f"Sale Order belongs to a Batch: {', '.join(invalid_orders)}")
|
|
)
|
|
return super().action_quotation_send()
|
|
|
|
def action_confirm(self):
|
|
invalid_orders = []
|
|
if not self.env.context.get("bypass_batch", False):
|
|
for order in self:
|
|
if order.batch_id:
|
|
invalid_orders.append(order.name)
|
|
if invalid_orders:
|
|
raise UserError(
|
|
_(f"Sale Order belongs to a Batch: {', '.join(invalid_orders)}")
|
|
)
|
|
return super().action_confirm()
|
|
|
|
def action_cancel(self):
|
|
self.write({"batch_id": False})
|
|
res = super().action_cancel()
|
|
return res
|
|
|
|
def write(self, vals):
|
|
res = super().write(vals)
|
|
if "batch_id" in vals.keys():
|
|
for order in self:
|
|
order.order_line._update_batch_product()
|
|
return res
|