diff --git a/addons/mrp/models/mrp_production.py b/addons/mrp/models/mrp_production.py
index e424be4fd14..540a74f55ad 100644
--- a/addons/mrp/models/mrp_production.py
+++ b/addons/mrp/models/mrp_production.py
@@ -1791,8 +1791,11 @@ class MrpProduction(models.Model):
'state': 'done',
'product_uom_qty': 0.0,
})
-
+ diff_per_production = {}
for production in self:
+ diff_per_production[production] = 1
+ if production.qty_produced != production.product_qty:
+ diff_per_production[production] = production.qty_produced/production.product_qty
production.write({
'date_finished': fields.Datetime.now(),
'product_qty': production.qty_produced,
@@ -1801,8 +1804,11 @@ class MrpProduction(models.Model):
'state': 'done',
})
- for workorder in self.workorder_ids.filtered(lambda w: w.state not in ('done', 'cancel')):
- workorder.duration_expected = workorder._get_duration_expected()
+ for workorder in self.workorder_ids:
+ if workorder.state not in ('done', 'cancel'):
+ workorder.duration_expected = workorder._get_duration_expected()
+ if workorder.duration == 0.0:
+ workorder.duration = workorder.duration_expected * diff_per_production[workorder.production_id]
if not backorders:
if self.env.context.get('from_workorder'):
@@ -1968,6 +1974,7 @@ class MrpProduction(models.Model):
'view_id': self.env.ref('mrp.mrp_unbuild_form_view_simplified').id,
'type': 'ir.actions.act_window',
'context': {'default_product_id': self.product_id.id,
+ 'default_lot_id': self.lot_producing_id.id,
'default_mo_id': self.id,
'default_company_id': self.company_id.id,
'default_location_id': self.location_dest_id.id,
diff --git a/addons/mrp/models/mrp_unbuild.py b/addons/mrp/models/mrp_unbuild.py
index 31f38afc2f7..12747d5a732 100644
--- a/addons/mrp/models/mrp_unbuild.py
+++ b/addons/mrp/models/mrp_unbuild.py
@@ -53,8 +53,7 @@ class MrpUnbuild(models.Model):
mo_bom_id = fields.Many2one('mrp.bom', 'Bill of Material used on the Production Order', related='mo_id.bom_id')
lot_id = fields.Many2one(
'stock.lot', 'Lot/Serial Number',
- domain="[('product_id', '=', product_id), ('company_id', '=', company_id)]", check_company=True,
- states={'done': [('readonly', True)]})
+ domain="[('product_id', '=', product_id), ('company_id', '=', company_id)]", check_company=True)
has_tracking=fields.Selection(related='product_id.tracking', readonly=True)
location_id = fields.Many2one(
'stock.location', 'Source Location',
@@ -102,23 +101,12 @@ class MrpUnbuild(models.Model):
self.product_id = self.mo_id.product_id.id
self.bom_id = self.mo_id.bom_id
self.product_uom_id = self.mo_id.product_uom_id
+ self.lot_id = self.mo_id.lot_producing_id
if self.has_tracking == 'serial':
self.product_qty = 1
else:
self.product_qty = self.mo_id.product_qty
- if self.lot_id and self.lot_id not in self.mo_id.move_finished_ids.move_line_ids.lot_id:
- return {'warning': {
- 'title': _("Warning"),
- 'message': _("The selected serial number does not correspond to the one used in the manufacturing order, please select another one.")
- }}
- @api.onchange('lot_id')
- def _onchange_lot_id(self):
- if self.mo_id and self.lot_id and self.lot_id not in self.mo_id.move_finished_ids.move_line_ids.lot_id:
- return {'warning': {
- 'title': _("Warning"),
- 'message': _("The selected serial number does not correspond to the one used in the manufacturing order, please select another one.")
- }}
@api.onchange('product_id')
def _onchange_product_id(self):
diff --git a/addons/mrp/tests/test_traceability.py b/addons/mrp/tests/test_traceability.py
index ecaeaadfd1c..14eb9d00043 100644
--- a/addons/mrp/tests/test_traceability.py
+++ b/addons/mrp/tests/test_traceability.py
@@ -349,7 +349,6 @@ class TestTraceability(TestMrpCommon):
unbuild_form = Form(self.env['mrp.unbuild'])
unbuild_form.mo_id = mo
- unbuild_form.lot_id = lot
unbuild_form.save().action_unbuild()
mo_form = Form(self.env['mrp.production'])
diff --git a/addons/mrp/tests/test_unbuild.py b/addons/mrp/tests/test_unbuild.py
index cc30780ac35..a8e6aa19047 100644
--- a/addons/mrp/tests/test_unbuild.py
+++ b/addons/mrp/tests/test_unbuild.py
@@ -305,13 +305,6 @@ class TestUnbuild(TestMrpCommon):
self.assertEqual(self.env['stock.quant']._get_available_quantity(p_final, self.stock_location, lot_id=lot_final), 5, 'You should have consumed 3 final product in stock')
- with self.assertRaises(AssertionError):
- x.product_id = p_final
- x.bom_id = bom
- x.mo_id = mo
- x.product_qty = 3
- x.save()
-
self.assertEqual(self.env['stock.quant']._get_available_quantity(p_final, self.stock_location, lot_id=lot_final), 5, 'You should have consumed 3 final product in stock')
x = Form(self.env['mrp.unbuild'])
@@ -319,7 +312,6 @@ class TestUnbuild(TestMrpCommon):
x.bom_id = bom
x.mo_id = mo
x.product_qty = 3
- x.lot_id = lot_final
x.save().action_unbuild()
self.assertEqual(self.env['stock.quant']._get_available_quantity(p_final, self.stock_location, lot_id=lot_final), 2, 'You should have consumed 3 final product in stock')
@@ -331,7 +323,6 @@ class TestUnbuild(TestMrpCommon):
x.bom_id = bom
x.mo_id = mo
x.product_qty = 2
- x.lot_id = lot_final
x.save().action_unbuild()
self.assertEqual(self.env['stock.quant']._get_available_quantity(p_final, self.stock_location, lot_id=lot_final), 0, 'You should have 0 finalproduct in stock')
@@ -343,7 +334,6 @@ class TestUnbuild(TestMrpCommon):
x.bom_id = bom
x.mo_id = mo
x.product_qty = 5
- x.lot_id = lot_final
x.save().action_unbuild()
self.assertEqual(self.env['stock.quant']._get_available_quantity(p_final, self.stock_location, lot_id=lot_final, allow_negative=True), -5, 'You should have negative quantity for final product in stock')
@@ -814,7 +804,6 @@ class TestUnbuild(TestMrpCommon):
#unbuild order
unbuild_form = Form(self.env['mrp.unbuild'])
unbuild_form.mo_id = mo
- unbuild_form.lot_id = product_1_sn
unbuild_form.save().action_unbuild()
#mo2
diff --git a/addons/mrp/views/mrp_production_views.xml b/addons/mrp/views/mrp_production_views.xml
index 7886f7e3dea..cb146f0582f 100644
--- a/addons/mrp/views/mrp_production_views.xml
+++ b/addons/mrp/views/mrp_production_views.xml
@@ -17,7 +17,7 @@
-
+
@@ -34,7 +34,7 @@
decoration-danger="reservation_state != 'assigned' and components_availability_state == 'late'"/>
-
+
@@ -348,11 +348,11 @@
{'column_invisible': [('parent.product_id', '!=', False)]}
-
+
diff --git a/addons/mrp/views/mrp_unbuild_views.xml b/addons/mrp/views/mrp_unbuild_views.xml
index 2bb126d2411..4a934a95cf4 100644
--- a/addons/mrp/views/mrp_unbuild_views.xml
+++ b/addons/mrp/views/mrp_unbuild_views.xml
@@ -117,7 +117,7 @@
-
+
@@ -156,7 +156,7 @@
-
+
diff --git a/addons/repair/models/repair.py b/addons/repair/models/repair.py
index 4cfc2b9e9ef..f27ccd5fe4d 100644
--- a/addons/repair/models/repair.py
+++ b/addons/repair/models/repair.py
@@ -131,13 +131,15 @@ class Repair(models.Model):
invoice_state = fields.Selection(string='Invoice State', related='invoice_id.state')
priority = fields.Selection([('0', 'Normal'), ('1', 'Urgent')], default='0', string="Priority")
+ @api.depends('product_id')
def _compute_allowed_picking_type_ids(self):
'''
computes the ids of return picking types
'''
out_picking_types = self.env['stock.picking.type'].search_read(domain=[('code', '=', 'outgoing')],
fields=['return_picking_type_id'], load='')
- self.allowed_picking_type_ids = [pick_type['return_picking_type_id'] for pick_type in out_picking_types]
+ self.allowed_picking_type_ids = [
+ pt['return_picking_type_id'] for pt in out_picking_types if pt['return_picking_type_id']]
@api.depends('partner_id')
def _compute_default_address_id(self):
diff --git a/addons/repair/views/repair_views.xml b/addons/repair/views/repair_views.xml
index c5e81a4b062..8d927e73bf0 100644
--- a/addons/repair/views/repair_views.xml
+++ b/addons/repair/views/repair_views.xml
@@ -89,7 +89,7 @@
-
+