43 lines
1.5 KiB
Python
43 lines
1.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import _, models
|
|
from odoo.exceptions import UserError
|
|
|
|
|
|
class MrpBom(models.Model):
|
|
_inherit = 'mrp.bom'
|
|
|
|
def toggle_active(self):
|
|
self.filtered(lambda bom: bom.active)._ensure_bom_is_free()
|
|
return super().toggle_active()
|
|
|
|
def write(self, vals):
|
|
if 'phantom' in self.mapped('type') and vals.get('type', 'phantom') != 'phantom':
|
|
self._ensure_bom_is_free()
|
|
return super().write(vals)
|
|
|
|
def unlink(self):
|
|
self._ensure_bom_is_free()
|
|
return super().unlink()
|
|
|
|
def _ensure_bom_is_free(self):
|
|
product_ids = []
|
|
for bom in self:
|
|
if bom.type != 'phantom':
|
|
continue
|
|
product_ids += bom.product_id.ids or bom.product_tmpl_id.product_variant_ids.ids
|
|
if not product_ids:
|
|
return
|
|
lines = self.env['sale.order.line'].sudo().search([
|
|
('state', '=', 'sale'),
|
|
('invoice_status', 'in', ('no', 'to invoice')),
|
|
('product_id', 'in', product_ids),
|
|
('move_ids.state', '!=', 'cancel'),
|
|
])
|
|
if lines:
|
|
product_names = ', '.join(lines.product_id.mapped('display_name'))
|
|
raise UserError(_('As long as there are some sale order lines that must be delivered/invoiced and are '
|
|
'related to these bills of materials, you can not remove them.\n'
|
|
'The error concerns these products: %s', product_names))
|