[IMP] mrp_subcontracting: add a operation type for resupply

Add a operation type (`stock.picking.type`) for
the subcontracting resupply in order to distinct
easily the a simple delivery and a resupply to a subcontractor.

task-2486811

Part-of: odoo/odoo#75041
This commit is contained in:
Rémy Voet (ryv)
2021-09-03 10:37:46 +00:00
parent 820fbd9973
commit 7d9a9574ce
3 changed files with 41 additions and 11 deletions
@@ -22,6 +22,9 @@ class StockWarehouse(models.Model):
subcontracting_type_id = fields.Many2one(
'stock.picking.type', 'Subcontracting Operation Type',
domain=[('code', '=', 'mrp_operation')])
subcontracting_resupply_type_id = fields.Many2one(
'stock.picking.type', 'Subcontracting Resupply Operation Type',
domain=[('code', '=', 'outgoing')])
def get_rules_dict(self):
result = super(StockWarehouse, self).get_rules_dict()
@@ -29,7 +32,7 @@ class StockWarehouse(models.Model):
for warehouse in self:
result[warehouse.id].update({
'subcontract': [
self.Routing(warehouse.lot_stock_id, subcontract_location_id, warehouse.out_type_id, 'pull'),
self.Routing(warehouse.lot_stock_id, subcontract_location_id, warehouse.subcontracting_resupply_type_id, 'pull'),
]
})
return result
@@ -74,7 +77,7 @@ class StockWarehouse(models.Model):
'name': self._format_rulename(self.lot_stock_id, subcontract_location_id, 'MTO'),
'location_id': subcontract_location_id.id,
'location_src_id': self.lot_stock_id.id,
'picking_type_id': self.out_type_id.id
'picking_type_id': self.subcontracting_resupply_type_id.id
},
'update_values': {
'active': self.subcontracting_to_resupply
@@ -92,7 +95,7 @@ class StockWarehouse(models.Model):
'name': self._format_rulename(self.lot_stock_id, subcontract_location_id, False),
'location_id': production_location_id.id,
'location_src_id': subcontract_location_id.id,
'picking_type_id': self.out_type_id.id
'picking_type_id': self.subcontracting_resupply_type_id.id
},
'update_values': {
'active': self.subcontracting_to_resupply
@@ -112,13 +115,35 @@ class StockWarehouse(models.Model):
'sequence_code': 'SBC',
'company_id': self.company_id.id,
},
'subcontracting_resupply_type_id': {
'name': _('Resupply Subcontractor'),
'code': 'outgoing',
'use_create_lots': False,
'use_existing_lots': True,
'default_location_dest_id': self._get_subcontracting_location().id,
'sequence': next_sequence + 3,
'sequence_code': 'RES',
'print_label': True,
'company_id': self.company_id.id,
}
})
return data, max_sequence + 4
def _get_sequence_values(self):
values = super(StockWarehouse, self)._get_sequence_values()
values.update({
'subcontracting_type_id': {'name': self.name + ' ' + _('Sequence subcontracting'), 'prefix': self.code + '/SBC/', 'padding': 5, 'company_id': self.company_id.id},
'subcontracting_type_id': {
'name': self.name + ' ' + _('Sequence subcontracting'),
'prefix': self.code + '/SBC/',
'padding': 5,
'company_id': self.company_id.id
},
'subcontracting_resupply_type_id': {
'name': self.name + ' ' + _('Sequence Resupply Subcontractor'),
'prefix': self.code + '/RES/',
'padding': 5,
'company_id': self.company_id.id
},
})
return values
@@ -132,6 +157,11 @@ class StockWarehouse(models.Model):
'default_location_src_id': subcontract_location_id.id,
'default_location_dest_id': production_location_id.id,
},
'subcontracting_resupply_type_id': {
'default_location_src_id': production_location_id.id,
'default_location_dest_id': subcontract_location_id.id,
'barcode': self.code.replace(" ", "").upper() + "-RESUPPLY",
},
})
return data
@@ -67,7 +67,7 @@ class TestSubcontractingFlows(TestMrpSubcontractingCommon):
self.env['procurement.group'].run_scheduler()
picking = self.env['stock.picking'].search([('group_id', '=', pg1.id)])
self.assertEqual(len(picking), 1)
self.assertEqual(picking.picking_type_id, wh.out_type_id)
self.assertEqual(picking.picking_type_id, wh.subcontracting_resupply_type_id)
picking_receipt.move_lines.quantity_done = 1
picking_receipt.button_validate()
self.assertEqual(mo.state, 'done')
@@ -139,7 +139,7 @@ class TestSubcontractingFlows(TestMrpSubcontractingCommon):
wh = picking.picking_type_id.warehouse_id
# The picking should be a delivery order
self.assertEqual(picking.picking_type_id, wh.out_type_id)
self.assertEqual(picking.picking_type_id, wh.subcontracting_resupply_type_id)
# The date planned should be correct
self.assertEqual(picking_receipt.scheduled_date, picking.scheduled_date + relativedelta(days=self.finished.produce_delay))
@@ -209,7 +209,7 @@ class TestSubcontractingFlows(TestMrpSubcontractingCommon):
# The picking should be a delivery order
wh = picking_receipt.picking_type_id.warehouse_id
self.assertEqual(mo.picking_ids.picking_type_id, wh.out_type_id)
self.assertEqual(mo.picking_ids.picking_type_id, wh.subcontracting_resupply_type_id)
self.assertEqual(mo.picking_type_id, wh.subcontracting_type_id)
self.assertFalse(mo.picking_type_id.active)
@@ -576,7 +576,7 @@ class TestSubcontractingTracking(TransactionCase):
self.env['procurement.group'].run_scheduler()
picking = self.env['stock.picking'].search([('group_id', '=', pg1.id)])
self.assertEqual(len(picking), 1)
self.assertEqual(picking.picking_type_id, wh.out_type_id)
self.assertEqual(picking.picking_type_id, wh.subcontracting_resupply_type_id)
lot_id = self.env['stock.production.lot'].create({
'name': 'lot1',
@@ -114,7 +114,7 @@ class TestSubcontractingDropshippingFlows(TestMrpSubcontractingCommon):
origin = picking_delivery.origin
self.assertEqual(len(picking_delivery), 1)
self.assertEqual(len(picking_delivery.move_ids_without_package), 1)
self.assertEqual(picking_delivery.picking_type_id, wh.out_type_id)
self.assertEqual(picking_delivery.picking_type_id, wh.subcontracting_resupply_type_id)
self.assertEqual(picking_delivery.partner_id, self.subcontractor_partner1)
# Change the purchased quantity to 2
@@ -122,11 +122,11 @@ class TestSubcontractingDropshippingFlows(TestMrpSubcontractingCommon):
# Check that two deliveries with 1 component for the subcontractor have been created
picking_deliveries = self.env['stock.picking'].search([('origin', '=', origin)])
self.assertEqual(len(picking_deliveries), 2)
self.assertEqual(picking_deliveries[0].picking_type_id, wh.out_type_id)
self.assertEqual(picking_deliveries[0].picking_type_id, wh.subcontracting_resupply_type_id)
self.assertEqual(picking_deliveries[0].partner_id, self.subcontractor_partner1)
self.assertTrue(picking_deliveries[0].state != 'cancel')
move1 = picking_deliveries[0].move_ids_without_package
self.assertEqual(picking_deliveries[1].picking_type_id, wh.out_type_id)
self.assertEqual(picking_deliveries[1].picking_type_id, wh.subcontracting_resupply_type_id)
self.assertEqual(picking_deliveries[1].partner_id, self.subcontractor_partner1)
self.assertTrue(picking_deliveries[1].state != 'cancel')
move2 = picking_deliveries[1].move_ids_without_package