diff --git a/multi_level_mrp/__manifest__.py b/multi_level_mrp/__manifest__.py
index 02199d1fb..6d009ae06 100644
--- a/multi_level_mrp/__manifest__.py
+++ b/multi_level_mrp/__manifest__.py
@@ -26,9 +26,17 @@
'wizards/mrp_inventory_procure_view.xml',
'views/mrp_inventory_view.xml',
'wizards/multi_level_mrp_view.xml',
- 'wizards/mrp_move_create_po_view.xml',
'views/mrp_menuitem.xml',
'data/multi_level_mrp_cron.xml',
+ 'data/mrp_area_data.xml',
+ ],
+ 'demo': [
+ 'demo/product_category_demo.xml',
+ 'demo/product_product_demo.xml',
+ 'demo/res_partner_demo.xml',
+ 'demo/product_supplierinfo_demo.xml',
+ 'demo/mrp_bom_demo.xml',
+ 'demo/initial_on_hand_demo.xml',
],
'installable': True,
'application': True,
diff --git a/multi_level_mrp/data/mrp_area_data.xml b/multi_level_mrp/data/mrp_area_data.xml
new file mode 100644
index 000000000..6ce02c128
--- /dev/null
+++ b/multi_level_mrp/data/mrp_area_data.xml
@@ -0,0 +1,8 @@
+
+
+
+ WH/Stock
+
+
+
+
diff --git a/multi_level_mrp/demo/initial_on_hand_demo.xml b/multi_level_mrp/demo/initial_on_hand_demo.xml
new file mode 100644
index 000000000..a2cd4991c
--- /dev/null
+++ b/multi_level_mrp/demo/initial_on_hand_demo.xml
@@ -0,0 +1,32 @@
+
+
+
+
+ Simulating MRP
+
+
+
+
+
+ 10
+
+
+
+
+
+
+ 20
+
+
+
+
+
+
+ 15
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/multi_level_mrp/demo/mrp_bom_demo.xml b/multi_level_mrp/demo/mrp_bom_demo.xml
new file mode 100644
index 000000000..1b1e9f7b5
--- /dev/null
+++ b/multi_level_mrp/demo/mrp_bom_demo.xml
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+ 5
+
+
+
+ 2
+
+ 5
+
+
+
+
+ 3
+
+ 5
+
+
+
+
+
+
+
+ 5
+
+
+
+ 2
+
+ 5
+
+
+
+
+ 3
+
+ 5
+
+
+
+
+
+
+ 5
+
+
+
+ 3
+
+ 5
+
+
+
+
+ 2
+
+ 5
+
+
+
+
+
+
+ 5
+
+
+
+ 3
+
+ 5
+
+
+
diff --git a/multi_level_mrp/demo/product_category_demo.xml b/multi_level_mrp/demo/product_category_demo.xml
new file mode 100644
index 000000000..bf989ea45
--- /dev/null
+++ b/multi_level_mrp/demo/product_category_demo.xml
@@ -0,0 +1,6 @@
+
+
+
+ MRP
+
+
diff --git a/multi_level_mrp/demo/product_product_demo.xml b/multi_level_mrp/demo/product_product_demo.xml
new file mode 100644
index 000000000..358d70978
--- /dev/null
+++ b/multi_level_mrp/demo/product_product_demo.xml
@@ -0,0 +1,59 @@
+
+
+
+ FP-1
+
+ product
+
+
+ 2
+
+
+
+
+ FP-2
+
+ product
+
+
+ 1
+
+
+
+
+ SF-1
+
+ product
+
+
+ 1
+
+
+
+ SF-2
+
+ product
+
+
+ 3
+
+
+
+
+ PP-1
+
+ product
+
+
+
+
+
+
+ PP-2
+
+ product
+
+
+
+
+
diff --git a/multi_level_mrp/demo/product_supplierinfo_demo.xml b/multi_level_mrp/demo/product_supplierinfo_demo.xml
new file mode 100644
index 000000000..ab223f04c
--- /dev/null
+++ b/multi_level_mrp/demo/product_supplierinfo_demo.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+ 4
+ 0
+ 100
+
+
+
+
+
+ 2
+ 0
+ 100
+
+
diff --git a/multi_level_mrp/demo/res_partner_demo.xml b/multi_level_mrp/demo/res_partner_demo.xml
new file mode 100644
index 000000000..ecb86d323
--- /dev/null
+++ b/multi_level_mrp/demo/res_partner_demo.xml
@@ -0,0 +1,10 @@
+
+
+
+ Lazer Tech
+ 1
+
+
+
+
+
diff --git a/multi_level_mrp/models/mrp_move.py b/multi_level_mrp/models/mrp_move.py
index 474f57934..511f7a70c 100644
--- a/multi_level_mrp/models/mrp_move.py
+++ b/multi_level_mrp/models/mrp_move.py
@@ -152,40 +152,3 @@ class MrpMove(models.Model):
self.current_date = self.mrp_date
self.mrp_processed = True
self.name = seqnbr
-
- @api.one
- def mrp_process(self):
- self.mrp_process_mo()
- self.mrp_process_pr()
- return True
-
- # TODO: move to new API
- @api.v7
- def mrp_process_po(self, cr, uid, ids, context=None):
- view_id = self.pool.get('ir.ui.view').search(
- cr, uid, [('model', '=', 'mrp.move.create.po'),
- ('name', '=', 'mrp.move.create.po.form')])
- move = self.browse(cr, uid, ids)[0]
- context['move_id'] = move.id
- context['default_move_id'] = move.id
- context['default_mrp_qty'] = move.mrp_qty
- context['default_mrp_date'] = move.mrp_date
- context['default_qty_po'] = move.mrp_qty
- context['default_date_po'] = move.mrp_date
- context['default_main_supplier_id'] = \
- move.mrp_product_id.main_supplier_id.id
- context['default_product_id'] = move.mrp_product_id.product_id.id
- context['default_purchase_line_warn_msg'] = \
- move.mrp_product_id.product_id.purchase_line_warn_msg
- context['default_purchase_line_warn'] = \
- move.mrp_product_id.product_id.purchase_line_warn
- return {
- 'type': 'ir.actions.act_window',
- 'name': 'Create PO',
- 'view_mode': 'form',
- 'view_type': 'form',
- 'view_id': view_id[0],
- 'res_model': 'mrp.move.create.po',
- 'target': 'new',
- 'context': context,
- }
diff --git a/multi_level_mrp/models/mrp_product.py b/multi_level_mrp/models/mrp_product.py
index 4871061a8..37cf6ee4f 100644
--- a/multi_level_mrp/models/mrp_product.py
+++ b/multi_level_mrp/models/mrp_product.py
@@ -16,8 +16,8 @@ class MrpProduct(models.Model):
select=True)
mrp_inspection_delay = fields.Integer(
string='Inspection Delay', related='product_id.mrp_inspection_delay')
- mrp_lead_time = fields.Integer(string='Lead Time',
- related='product_id.mrp_lead_time')
+ mrp_lead_time = fields.Float(string='Lead Time',
+ related='product_id.produce_delay')
mrp_llc = fields.Integer('Low Level Code', select=True)
mrp_maximum_order_qty = fields.Float(
string='Maximum Order Qty', related='product_id.mrp_maximum_order_qty')
diff --git a/multi_level_mrp/models/product.py b/multi_level_mrp/models/product.py
index 5b9d9ecfd..95007bc23 100644
--- a/multi_level_mrp/models/product.py
+++ b/multi_level_mrp/models/product.py
@@ -19,7 +19,6 @@ class Product(models.Model):
mrp_applicable = fields.Boolean('MRP Applicable')
mrp_exclude = fields.Boolean('Exclude from MRP')
mrp_inspection_delay = fields.Integer('Inspection Delay', default=0)
- mrp_lead_time = fields.Integer('Lead Time', default=1)
mrp_maximum_order_qty = fields.Float('Maximum Order Qty', default=0.00)
mrp_minimum_order_qty = fields.Float('Minimum Order Qty', default=0.00)
mrp_minimum_stock = fields.Float('Minimum Stock')
diff --git a/multi_level_mrp/tests/__init__.py b/multi_level_mrp/tests/__init__.py
new file mode 100644
index 000000000..5aafb933a
--- /dev/null
+++ b/multi_level_mrp/tests/__init__.py
@@ -0,0 +1,2 @@
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+from . import test_multi_level_mrp
diff --git a/multi_level_mrp/tests/test_multi_level_mrp.py b/multi_level_mrp/tests/test_multi_level_mrp.py
new file mode 100644
index 000000000..c6424bb36
--- /dev/null
+++ b/multi_level_mrp/tests/test_multi_level_mrp.py
@@ -0,0 +1,60 @@
+# Copyright 2018 Eficent Business and IT Consulting Services S.L.
+# (http://www.eficent.com)
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
+
+from odoo.tests.common import SavepointCase
+from datetime import datetime, timedelta
+
+
+class TestMultiLevelMRP(SavepointCase):
+ def setUp(self):
+ super(TestMultiLevelMRP, self).setUp()
+ self.wiz_multi_level_mrp_model = self.env['multi.level.mrp']
+ self.stock_picking_model = self.env['stock.picking']
+ self.mrp_inventory_model = self.env['mrp.inventory']
+ self.fp_1 = self.env.ref('multi_level_mrp.product_product_fp_1')
+ self.fp_2 = self.env.ref('multi_level_mrp.product_product_fp_2')
+ self.sf_1 = self.env.ref('multi_level_mrp.product_product_sf_1')
+ self.sf_2 = self.env.ref('multi_level_mrp.product_product_sf_2')
+ self.pp_1 = self.env.ref('multi_level_mrp.product_product_pp_1')
+ self.pp_2 = self.env.ref('multi_level_mrp.product_product_pp_2')
+ self.wh = self.env.ref('stock.warehouse0')
+ self.stock_location = self.wh.lot_stock_id
+ self.customer_location = self.env.ref(
+ 'stock.stock_location_customers')
+ date_move = datetime.today() + timedelta(days=7)
+ self.picking_1 = self.stock_picking_model.create({
+ 'picking_type_id': self.ref('stock.picking_type_out'),
+ 'location_id': self.stock_location.id,
+ 'location_dest_id': self.customer_location.id,
+ 'move_lines': [
+ (0, 0, {
+ 'name': 'Test move pf-1',
+ 'product_id': self.fp_1.id,
+ 'date_expected': date_move,
+ 'date': date_move,
+ 'product_uom': self.fp_1.uom_id.id,
+ 'product_uom_qty': 100,
+ 'location_id': self.stock_location.id,
+ 'location_dest_id': self.customer_location.id
+ }),
+ (0, 0, {
+ 'name': 'Test move fp-2',
+ 'product_id': self.fp_2.id,
+ 'date_expected': date_move,
+ 'date': date_move,
+ 'product_uom': self.fp_2.uom_id.id,
+ 'product_uom_qty': 15,
+ 'location_id': self.stock_location.id,
+ 'location_dest_id': self.customer_location.id
+ })]
+ })
+ self.picking_1.action_confirm()
+
+ def test_mrp_1(self):
+ self.wiz_multi_level_mrp_model.create({}).run_multi_level_mrp()
+ pp_1_inventory_lines = self.mrp_inventory_model.search(
+ [('mrp_product_id.product_id', '=', self.pp_1.id)])
+ self.assertEqual(len(pp_1_inventory_lines), 1)
+ self.assertEqual(pp_1_inventory_lines.demand_qty, 290)
+ self.assertEqual(pp_1_inventory_lines.to_procure, 250)
diff --git a/multi_level_mrp/views/mrp_product_view.xml b/multi_level_mrp/views/mrp_product_view.xml
index 4b7cff0d7..647d5f741 100644
--- a/multi_level_mrp/views/mrp_product_view.xml
+++ b/multi_level_mrp/views/mrp_product_view.xml
@@ -72,8 +72,6 @@
-
-