diff --git a/mrp_production_raw_material_procurement_group/README.rst b/mrp_production_raw_material_procurement_group/README.rst new file mode 100644 index 000000000..2a31a9261 --- /dev/null +++ b/mrp_production_raw_material_procurement_group/README.rst @@ -0,0 +1,84 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 + +============== +{module_title} +============== + +This module extends the functionality of ... to support ... +and to allow you to ... + +Installation +============ + +To install this module, you need to: + +#. Do this ... + +Configuration +============= + +To configure this module, you need to: + +#. Go to ... + +.. figure:: path/to/local/image.png + :alt: alternative description + :width: 600 px + +Usage +===== + +To use this module, you need to: + +#. Go to ... + +.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas + :alt: Try me on Runbot + :target: https://runbot.odoo-community.org/runbot/{repo_id}/{branch} + +.. repo_id is available in https://github.com/OCA/maintainer-tools/blob/master/tools/repos_with_ids.txt +.. branch is "8.0" for example + +Known issues / Roadmap +====================== + +* ... + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues +`_. In case of trouble, please +check there if your issue has already been reported. If you spotted it first, +help us smashing it by providing a detailed and welcomed feedback. + +Credits +======= + +Images +------ + +* Odoo Community Association: `Icon `_. + +Contributors +------------ + +* Firstname Lastname +* Second Person + +Maintainer +---------- + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +This module is maintained by the OCA. + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +To contribute to this module, please visit https://odoo-community.org. diff --git a/mrp_production_raw_material_procurement_group/__init__.py b/mrp_production_raw_material_procurement_group/__init__.py new file mode 100644 index 000000000..dfd08accc --- /dev/null +++ b/mrp_production_raw_material_procurement_group/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 OpenSynergy Indonesia +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import models diff --git a/mrp_production_raw_material_procurement_group/__openerp__.py b/mrp_production_raw_material_procurement_group/__openerp__.py new file mode 100644 index 000000000..0316cf4be --- /dev/null +++ b/mrp_production_raw_material_procurement_group/__openerp__.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 OpenSynergy Indonesia +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +{ + "name": "Create Procurement Group On Manufacturing Order", + "version": "8.0.1.0.0", + "category": "Manufacturing", + "website": "https://opensynergy-indonesia.com/", + "author": "OpenSynergy Indonesia, Odoo Community Association (OCA)", + "license": "AGPL-3", + "installable": True, + "depends": [ + "mrp", + ], + "data": [ + "views/mrp_production_views.xml", + ], +} diff --git a/mrp_production_raw_material_procurement_group/models/__init__.py b/mrp_production_raw_material_procurement_group/models/__init__.py new file mode 100644 index 000000000..3b25f06f2 --- /dev/null +++ b/mrp_production_raw_material_procurement_group/models/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 OpenSynergy Indonesia +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import mrp_production diff --git a/mrp_production_raw_material_procurement_group/models/mrp_production.py b/mrp_production_raw_material_procurement_group/models/mrp_production.py new file mode 100644 index 000000000..40602f21d --- /dev/null +++ b/mrp_production_raw_material_procurement_group/models/mrp_production.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 OpenSynergy Indonesia +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from openerp import models, fields, api + + +class MrpProduction(models.Model): + _inherit = "mrp.production" + + raw_material_procurement_group_id = fields.Many2one( + string="Raw Material Procurement Group", + comodel_name="procurement.group", + ) + + @api.model + def _make_consume_line_from_data( + self, + production, product, uom_id, qty, + uos_id, uos_qty): + + move_id = super(MrpProduction, self)._make_consume_line_from_data( + production, product, uom_id, qty, + uos_id, uos_qty) + obj_move = self.env["stock.move"] + move = obj_move.browse(move_id) + if move.procure_method == "make_to_stock": + return move_id + if not production.raw_material_procurement_group_id: + return move_id + move.write( + {"group_id": production.raw_material_procurement_group_id.id}) + return move_id diff --git a/mrp_production_raw_material_procurement_group/tests/__init__.py b/mrp_production_raw_material_procurement_group/tests/__init__.py new file mode 100644 index 000000000..0d87d0677 --- /dev/null +++ b/mrp_production_raw_material_procurement_group/tests/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 OpenSynergy Indonesia +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import test_mrp_production diff --git a/mrp_production_raw_material_procurement_group/tests/test_mrp_production.py b/mrp_production_raw_material_procurement_group/tests/test_mrp_production.py new file mode 100644 index 000000000..004502af4 --- /dev/null +++ b/mrp_production_raw_material_procurement_group/tests/test_mrp_production.py @@ -0,0 +1,128 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 OpenSynergy Indonesia +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from openerp.tests.common import TransactionCase + + +class MrpProductionCase(TransactionCase): + def setUp(self, *args, **kwargs): + super(MrpProductionCase, self).setUp(*args, **kwargs) + + self.obj_group = self.env["procurement.group"] + self.obj_mo = self.env["mrp.production"] + + self.warehouse1 = self.env.ref("stock.warehouse0") + self.warehouse2 = self.env["stock.warehouse"].create({ + "name": "X Warehouse", + "code": "X WH", + "reception_steps": "one_step", + "delivery_steps": "ship_only", + "resupply_from_wh": False, + "default_resupply_wh_id": False, + }) + self.loc_stock_2 = self.warehouse2.lot_stock_id + self.loc_production = self.env.ref( + "stock.location_production") + self.route = self.env["stock.location.route"].create({ + "name": "X Route", + "sequence": 1, + "product_selectable": True, + }) + self.rule = self.env["procurement.rule"].create({ + "name": "X Production", + "location_id": self.loc_production.id, + "location_src_id": self.loc_stock_2.id, + "procure_method": "make_to_order", + "picking_type_id": self.warehouse2.int_type_id.id, + "action": "move", + "sequence": 1, + "route_id": self.route.id, + }) + self.product1 = self.env.ref("product.product_product_18") + self.product_raw1 = self.env.ref("product.product_product_17") + self.product_raw1.write({ + "route_ids": [(4, self.route.id)], + }) + self.bom1 = self.env.ref("mrp.mrp_bom_3") + self.bom1.write({ + "routing_id": False}) + + def _create_procurement_group( + self, name): + res = { + "name": name, + "move_type": "direct" + } + return self.obj_group.create(res) + + + def _create_mo( + self, + product=False, + bom=False, + src_loc=False, + dest_loc=False, + group=False, + qty=10.0): + if not product: + product = self.product1 + uom = product.uom_id + if not bom: + bom = self.bom1 + if not src_loc: + src_loc = self.loc_stock_2 + if not dest_loc: + dest_loc = self.loc_stock_2 + res = { + "product_id": product.id, + "bom_id": bom.id, + "location_src_id": src_loc.id, + "location_dest_id": dest_loc.id, + "raw_material_procurement_group_id": group, + "product_qty": qty, + "product_uom": uom.id, + } + return self.obj_mo.create(res) + + + def test_1(self): + # Create MO + mo = self._create_mo() + # Click confirm button + mo.signal_workflow("button_confirm") + for raw in mo.move_lines: + self.assertEqual( + raw.location_id, + self.loc_stock_2) + self.assertEqual( + raw.location_dest_id, + self.loc_production) + self.assertEqual( + raw.procure_method, + "make_to_order") + self.assertEqual( + len(raw.group_id), + 0) + + def test_2(self): + group1 = self._create_procurement_group( + "X 001") + # Create MO + mo = self._create_mo( + group=group1.id) + # Click confirm button + mo.signal_workflow("button_confirm") + for raw in mo.move_lines: + self.assertEqual( + raw.location_id, + self.loc_stock_2) + self.assertEqual( + raw.location_dest_id, + self.loc_production) + self.assertEqual( + raw.procure_method, + "make_to_order") + self.assertEqual( + raw.group_id, + group1) diff --git a/mrp_production_raw_material_procurement_group/views/mrp_production_views.xml b/mrp_production_raw_material_procurement_group/views/mrp_production_views.xml new file mode 100644 index 000000000..475e6f348 --- /dev/null +++ b/mrp_production_raw_material_procurement_group/views/mrp_production_views.xml @@ -0,0 +1,22 @@ + + + + + + + + mrp.production form + mrp.production + + + + + + + + + + + +