67 lines
2.5 KiB
Python
67 lines
2.5 KiB
Python
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||
|
|
||
|
from odoo import api, models
|
||
|
|
||
|
|
||
|
class Repair(models.Model):
|
||
|
_inherit = 'repair.order'
|
||
|
|
||
|
@api.model_create_multi
|
||
|
def create(self, vals_list):
|
||
|
orders = super().create(vals_list)
|
||
|
orders.action_explode()
|
||
|
return orders
|
||
|
|
||
|
def write(self, vals):
|
||
|
res = super().write(vals)
|
||
|
self.action_explode()
|
||
|
return res
|
||
|
|
||
|
def action_explode(self):
|
||
|
lines_to_unlink_ids = set()
|
||
|
line_vals_list = []
|
||
|
for op in self.operations:
|
||
|
bom = self.env['mrp.bom'].sudo()._bom_find(op.product_id, company_id=op.company_id.id, bom_type='phantom')[op.product_id]
|
||
|
if not bom:
|
||
|
continue
|
||
|
factor = op.product_uom._compute_quantity(op.product_uom_qty, bom.product_uom_id) / bom.product_qty
|
||
|
_boms, lines = bom.sudo().explode(op.product_id, factor, picking_type=bom.picking_type_id)
|
||
|
for bom_line, line_data in lines:
|
||
|
if bom_line.product_id.type != 'service':
|
||
|
line_vals_list.append(op._prepare_phantom_line_vals(bom_line, line_data['qty']))
|
||
|
lines_to_unlink_ids.add(op.id)
|
||
|
|
||
|
self.env['repair.line'].browse(lines_to_unlink_ids).sudo().unlink()
|
||
|
if line_vals_list:
|
||
|
self.env['repair.line'].create(line_vals_list)
|
||
|
|
||
|
|
||
|
class RepairLine(models.Model):
|
||
|
_inherit = 'repair.line'
|
||
|
|
||
|
def _prepare_phantom_line_vals(self, bom_line, qty):
|
||
|
self.ensure_one()
|
||
|
product = bom_line.product_id
|
||
|
uom = bom_line.product_uom_id
|
||
|
partner = self.repair_id.partner_id
|
||
|
price = self.repair_id.pricelist_id._get_product_price(product, qty, uom=uom)
|
||
|
tax = self.env['account.tax']
|
||
|
if partner:
|
||
|
partner_invoice = self.repair_id.partner_invoice_id or partner
|
||
|
fpos = self.env['account.fiscal.position']._get_fiscal_position(partner_invoice, delivery=self.repair_id.address_id)
|
||
|
taxes = self.product_id.taxes_id.filtered(lambda x: x.company_id == self.repair_id.company_id)
|
||
|
tax = fpos.map_tax(taxes)
|
||
|
return {
|
||
|
'name': self.name,
|
||
|
'repair_id': self.repair_id.id,
|
||
|
'type': self.type,
|
||
|
'product_id': product.id,
|
||
|
'price_unit': price,
|
||
|
'tax_id': [(4, t.id) for t in tax],
|
||
|
'product_uom_qty': qty,
|
||
|
'product_uom': uom.id,
|
||
|
'location_id': self.location_id.id,
|
||
|
'location_dest_id': self.location_dest_id.id,
|
||
|
'state': 'draft',
|
||
|
}
|