[MOV] mr_byproduct: move and split
This commit is contained in:
committed by
Thibault Delavallée
parent
ab9335fa92
commit
58ee9b99c3
@@ -1,4 +1,5 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
import mrp_byproduct
|
||||
import stock_move
|
||||
|
||||
import models
|
||||
import wizard
|
||||
@@ -23,8 +23,8 @@ With this module:
|
||||
'website': 'https://www.odoo.com/page/manufacturing',
|
||||
'depends': ['base', 'mrp'],
|
||||
'data': [
|
||||
'security/ir.model.access.csv',
|
||||
'mrp_byproduct_view.xml'
|
||||
'security/ir.model.access.csv',
|
||||
'views/mrp_bom_views.xml'
|
||||
],
|
||||
'demo': [],
|
||||
'test': ['test/mrp_byproduct.yml'],
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
import mrp_bom
|
||||
import mrp_production
|
||||
import mrp_subproduct
|
||||
import stock_move
|
||||
@@ -0,0 +1,14 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from openerp.osv import fields, osv
|
||||
|
||||
|
||||
class mrp_bom(osv.osv):
|
||||
_name = 'mrp.bom'
|
||||
_description = 'Bill of Material'
|
||||
_inherit='mrp.bom'
|
||||
|
||||
_columns={
|
||||
'sub_products':fields.one2many('mrp.subproduct', 'bom_id', 'Byproducts', copy=True),
|
||||
}
|
||||
+1
-71
@@ -1,60 +1,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from openerp.osv import fields
|
||||
from openerp.osv import osv
|
||||
import openerp.addons.decimal_precision as dp
|
||||
from openerp.tools.translate import _
|
||||
|
||||
class mrp_subproduct(osv.osv):
|
||||
_name = 'mrp.subproduct'
|
||||
_description = 'Byproduct'
|
||||
_columns={
|
||||
'product_id': fields.many2one('product.product', 'Product', required=True),
|
||||
'product_qty': fields.float('Product Qty', digits_compute=dp.get_precision('Product Unit of Measure'), required=True),
|
||||
'product_uom': fields.many2one('product.uom', 'Product Unit of Measure', required=True),
|
||||
'subproduct_type': fields.selection([('fixed','Fixed'),('variable','Variable')], 'Quantity Type', required=True, help="Define how the quantity of byproducts will be set on the production orders using this BoM.\
|
||||
'Fixed' depicts a situation where the quantity of created byproduct is always equal to the quantity set on the BoM, regardless of how many are created in the production order.\
|
||||
By opposition, 'Variable' means that the quantity will be computed as\
|
||||
'(quantity of byproduct set on the BoM / quantity of manufactured product set on the BoM * quantity of manufactured product in the production order.)'"),
|
||||
'bom_id': fields.many2one('mrp.bom', 'BoM', ondelete='cascade'),
|
||||
}
|
||||
_defaults={
|
||||
'subproduct_type': 'variable',
|
||||
'product_qty': lambda *a: 1.0,
|
||||
}
|
||||
|
||||
def onchange_product_id(self, cr, uid, ids, product_id, context=None):
|
||||
""" Changes UoM if product_id changes.
|
||||
@param product_id: Changed product_id
|
||||
@return: Dictionary of changed values
|
||||
"""
|
||||
if product_id:
|
||||
prod = self.pool.get('product.product').browse(cr, uid, product_id, context=context)
|
||||
v = {'product_uom': prod.uom_id.id}
|
||||
return {'value': v}
|
||||
return {}
|
||||
|
||||
def onchange_uom(self, cr, uid, ids, product_id, product_uom, context=None):
|
||||
res = {'value':{}}
|
||||
if not product_uom or not product_id:
|
||||
return res
|
||||
product = self.pool.get('product.product').browse(cr, uid, product_id, context=context)
|
||||
uom = self.pool.get('product.uom').browse(cr, uid, product_uom, context=context)
|
||||
if uom.category_id.id != product.uom_id.category_id.id:
|
||||
res['warning'] = {'title': _('Warning'), 'message': _('The Product Unit of Measure you chose has a different category than in the product form.')}
|
||||
res['value'].update({'product_uom': product.uom_id.id})
|
||||
return res
|
||||
|
||||
|
||||
class mrp_bom(osv.osv):
|
||||
_name = 'mrp.bom'
|
||||
_description = 'Bill of Material'
|
||||
_inherit='mrp.bom'
|
||||
|
||||
_columns={
|
||||
'sub_products':fields.one2many('mrp.subproduct', 'bom_id', 'Byproducts', copy=True),
|
||||
}
|
||||
|
||||
|
||||
class mrp_production(osv.osv):
|
||||
@@ -126,21 +73,4 @@ class mrp_production(osv.osv):
|
||||
elif move.subproduct_id.subproduct_type == 'fixed':
|
||||
return move.product_qty, 0
|
||||
# no subproduct
|
||||
return super(mrp_production, self)._calculate_produce_line_qty(cr, uid, move, quantity, context=context)
|
||||
|
||||
|
||||
class change_production_qty(osv.osv_memory):
|
||||
_inherit = 'change.production.qty'
|
||||
|
||||
def _update_product_to_produce(self, cr, uid, prod, qty, context=None):
|
||||
move_lines_obj = self.pool.get('stock.move')
|
||||
prod_obj = self.pool.get('mrp.production')
|
||||
for m in prod.move_created_ids:
|
||||
if m.product_id.id == prod.product_id.id:
|
||||
move_lines_obj.write(cr, uid, [m.id], {'product_uom_qty': qty})
|
||||
else:
|
||||
for sub_product_line in prod.bom_id.sub_products:
|
||||
if sub_product_line.product_id.id == m.product_id.id:
|
||||
factor = prod_obj._get_subproduct_factor(cr, uid, m, context=context)
|
||||
subproduct_qty = sub_product_line.subproduct_type == 'variable' and qty * factor or sub_product_line.product_qty
|
||||
move_lines_obj.write(cr, uid, [m.id], {'product_uom_qty': subproduct_qty})
|
||||
return super(mrp_production, self)._calculate_produce_line_qty(cr, uid, move, quantity, context=context)
|
||||
@@ -0,0 +1,47 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from openerp.osv import fields
|
||||
from openerp.osv import osv
|
||||
import openerp.addons.decimal_precision as dp
|
||||
from openerp.tools.translate import _
|
||||
|
||||
class mrp_subproduct(osv.osv):
|
||||
_name = 'mrp.subproduct'
|
||||
_description = 'Byproduct'
|
||||
_columns={
|
||||
'product_id': fields.many2one('product.product', 'Product', required=True),
|
||||
'product_qty': fields.float('Product Qty', digits_compute=dp.get_precision('Product Unit of Measure'), required=True),
|
||||
'product_uom': fields.many2one('product.uom', 'Product Unit of Measure', required=True),
|
||||
'subproduct_type': fields.selection([('fixed','Fixed'),('variable','Variable')], 'Quantity Type', required=True, help="Define how the quantity of byproducts will be set on the production orders using this BoM.\
|
||||
'Fixed' depicts a situation where the quantity of created byproduct is always equal to the quantity set on the BoM, regardless of how many are created in the production order.\
|
||||
By opposition, 'Variable' means that the quantity will be computed as\
|
||||
'(quantity of byproduct set on the BoM / quantity of manufactured product set on the BoM * quantity of manufactured product in the production order.)'"),
|
||||
'bom_id': fields.many2one('mrp.bom', 'BoM', ondelete='cascade'),
|
||||
}
|
||||
_defaults={
|
||||
'subproduct_type': 'variable',
|
||||
'product_qty': lambda *a: 1.0,
|
||||
}
|
||||
|
||||
def onchange_product_id(self, cr, uid, ids, product_id, context=None):
|
||||
""" Changes UoM if product_id changes.
|
||||
@param product_id: Changed product_id
|
||||
@return: Dictionary of changed values
|
||||
"""
|
||||
if product_id:
|
||||
prod = self.pool.get('product.product').browse(cr, uid, product_id, context=context)
|
||||
v = {'product_uom': prod.uom_id.id}
|
||||
return {'value': v}
|
||||
return {}
|
||||
|
||||
def onchange_uom(self, cr, uid, ids, product_id, product_uom, context=None):
|
||||
res = {'value':{}}
|
||||
if not product_uom or not product_id:
|
||||
return res
|
||||
product = self.pool.get('product.product').browse(cr, uid, product_id, context=context)
|
||||
uom = self.pool.get('product.uom').browse(cr, uid, product_uom, context=context)
|
||||
if uom.category_id.id != product.uom_id.category_id.id:
|
||||
res['warning'] = {'title': _('Warning'), 'message': _('The Product Unit of Measure you chose has a different category than in the product form.')}
|
||||
res['value'].update({'product_uom': product.uom_id.id})
|
||||
return res
|
||||
@@ -0,0 +1,4 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
import change_production_qty
|
||||
@@ -0,0 +1,21 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from openerp.osv import osv
|
||||
|
||||
|
||||
class change_production_qty(osv.osv_memory):
|
||||
_inherit = 'change.production.qty'
|
||||
|
||||
def _update_product_to_produce(self, cr, uid, prod, qty, context=None):
|
||||
move_lines_obj = self.pool.get('stock.move')
|
||||
prod_obj = self.pool.get('mrp.production')
|
||||
for m in prod.move_created_ids:
|
||||
if m.product_id.id == prod.product_id.id:
|
||||
move_lines_obj.write(cr, uid, [m.id], {'product_uom_qty': qty})
|
||||
else:
|
||||
for sub_product_line in prod.bom_id.sub_products:
|
||||
if sub_product_line.product_id.id == m.product_id.id:
|
||||
factor = prod_obj._get_subproduct_factor(cr, uid, m, context=context)
|
||||
subproduct_qty = sub_product_line.subproduct_type == 'variable' and qty * factor or sub_product_line.product_qty
|
||||
move_lines_obj.write(cr, uid, [m.id], {'product_uom_qty': subproduct_qty})
|
||||
Reference in New Issue
Block a user