Skip to content

Commit

Permalink
Merge c3eefbf into 75d2dc0
Browse files Browse the repository at this point in the history
  • Loading branch information
thibaultrey committed Jul 15, 2016
2 parents 75d2dc0 + c3eefbf commit ba13518
Show file tree
Hide file tree
Showing 10 changed files with 403 additions and 0 deletions.
85 changes: 85 additions & 0 deletions mrp_workcenter_hierarchical/README.rst
@@ -0,0 +1,85 @@
.. 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

===========================
MRP Workcenter Hierarchical
===========================

* Add the possibility to define a parent workcenter to a workcenter

Installation
============

Just install this module.

Configuration
=============

To visualize features offered by this module, you need to:

* go to Settings > Configuration > Manufacturing
* in the section Manufacturing Order / Planning,
check "Manage routings and work orders" and Validate

Usage
=====

To use this module, you need to go to:

* Manufacturing > Configuration > Workcenter Hierarchical

.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
:alt: Try me on Runbot
:target: https://runbot.odoo-community.org/runbot/129/9.0

.. 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
<https://github.com/OCA/manufacture/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
<https://github.com/OCA/
manufacture/issues/new?body=module:%20
mrp_workcenter_hierarchical%0Aversion:%20
9.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.

Credits
=======

Images
------

* Odoo Community Association: `Icon <https://github.com/OCA/maintainer-tools/blob/master/template/module/static/description/icon.svg>`_.

Contributors
------------

* David BEAL <david.beal@akretion.com>
* Sébastien BEAU <sebastien.beau@akretion.com>
* Thibault REY <thibault.rey@akretion.com>

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.

6 changes: 6 additions & 0 deletions mrp_workcenter_hierarchical/__init__.py
@@ -0,0 +1,6 @@
# -*- coding: utf-8 -*-
# © 2016 Akretion (http://www.akretion.com)
# David BEAL <david.beal@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from . import model
27 changes: 27 additions & 0 deletions mrp_workcenter_hierarchical/__openerp__.py
@@ -0,0 +1,27 @@
# -*- coding: utf-8 -*-
# © 2016 Akretion (http://www.akretion.com)
# David BEAL <david.beal@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

{
'name': 'MRP Workcenter Hierarchical',
'version': '9.0.1.0.0',
'author': 'Akretion,Odoo Community Association (OCA)',
'summary': "Organise Workcenters by section",
'category': 'Manufacturing',
'depends': [
'mrp_operations',
],
'website': 'http://www.akretion.com/',
'data': [
'views/workcenter_view.xml',
],
'demo': [
'demo/mrp_demo.xml',
],
'license': 'AGPL-3',
'tests': [],
'installable': True,
'auto_install': False,
'application': False,
}
96 changes: 96 additions & 0 deletions mrp_workcenter_hierarchical/demo/mrp_demo.xml
@@ -0,0 +1,96 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data noupdate="0">
<record id="mrp_workcenter_top" model="mrp.workcenter">
<field name="name">Assembly 1</field>
<field name="calendar_id" ref="resource.timesheet_group1"/>
<field name="capacity_per_cycle">5</field>
<field name="time_cycle">1</field>
<field name="time_start">0.1</field>
<field name="time_stop">0.1</field>
<field name="time_efficiency">0.87</field>
<field name="product_id" ref="product.product_assembly"/>
<field name="costs_hour">0.1</field>
<field name="costs_hour_account_id" ref="mrp.account_assembly_hours"/>
<field name="costs_cycle">0.05</field>
<field name="costs_cycle_account_id" ref="mrp.account_assembly_cycle"/>
</record>
<record id="mrp_workcenter_2" model="mrp.workcenter">
<field name="name">Assembly workshop 2</field>
<field name="calendar_id" ref="resource.timesheet_group1"/>
<field name="capacity_per_cycle">5</field>
<field name="time_cycle">1</field>
<field name="time_start">0.1</field>
<field name="time_stop">0.1</field>
<field name="time_efficiency">0.87</field>
<field name="product_id" ref="product.product_assembly"/>
<field name="costs_hour">0.1</field>
<field name="costs_hour_account_id" ref="mrp.account_assembly_hours"/>
<field name="costs_cycle">0.05</field>
<field name="costs_cycle_account_id" ref="mrp.account_assembly_cycle"/>
<field name="parent_id" ref="mrp_workcenter_top"/>
</record>
<record id="mrp_workcenter_A" model="mrp.workcenter">
<field name="name">Assembly A</field>
<field name="calendar_id" ref="resource.timesheet_group1"/>
<field name="capacity_per_cycle">5</field>
<field name="time_cycle">1</field>
<field name="time_start">0.1</field>
<field name="time_stop">0.1</field>
<field name="time_efficiency">0.87</field>
<field name="product_id" ref="product.product_assembly"/>
<field name="costs_hour">0.1</field>
<field name="costs_hour_account_id" ref="mrp.account_assembly_hours"/>
<field name="costs_cycle">0.05</field>
<field name="costs_cycle_account_id" ref="mrp.account_assembly_cycle"/>
<field name="parent_id" ref="mrp_workcenter_2"/>
</record>
<record id="mrp_workcenter_B" model="mrp.workcenter">
<field name="name">Assembly B</field>
<field name="calendar_id" ref="resource.timesheet_group1"/>
<field name="capacity_per_cycle">5</field>
<field name="time_cycle">1</field>
<field name="time_start">0.1</field>
<field name="time_stop">0.1</field>
<field name="time_efficiency">0.87</field>
<field name="product_id" ref="product.product_assembly"/>
<field name="costs_hour">0.1</field>
<field name="costs_hour_account_id" ref="mrp.account_assembly_hours"/>
<field name="costs_cycle">0.05</field>
<field name="costs_cycle_account_id" ref="mrp.account_assembly_cycle"/>
<field name="parent_id" ref="mrp_workcenter_2"/>
</record>
<record id="mrp_workcenter_C" model="mrp.workcenter">
<field name="name">Assembly C</field>
<field name="calendar_id" ref="resource.timesheet_group1"/>
<field name="capacity_per_cycle">5</field>
<field name="time_cycle">1</field>
<field name="time_start">0.1</field>
<field name="time_stop">0.1</field>
<field name="time_efficiency">0.87</field>
<field name="product_id" ref="product.product_assembly"/>
<field name="costs_hour">0.1</field>
<field name="costs_hour_account_id" ref="mrp.account_assembly_hours"/>
<field name="costs_cycle">0.05</field>
<field name="costs_cycle_account_id" ref="mrp.account_assembly_cycle"/>
<field name="parent_id" ref="mrp.mrp_workcenter_0"/>
</record>
<record id="mrp_workcenter_E" model="mrp.workcenter">
<field name="name">Assembly E</field>
<field name="calendar_id" ref="resource.timesheet_group1"/>
<field name="capacity_per_cycle">5</field>
<field name="time_cycle">1</field>
<field name="time_start">0.1</field>
<field name="time_stop">0.1</field>
<field name="time_efficiency">0.87</field>
<field name="product_id" ref="product.product_assembly"/>
<field name="costs_hour">0.1</field>
<field name="costs_hour_account_id" ref="mrp.account_assembly_hours"/>
<field name="costs_cycle">0.05</field>
<field name="costs_cycle_account_id" ref="mrp.account_assembly_cycle"/>
</record>
<record id="mrp.mrp_workcenter_0" model="mrp.workcenter">
<field name="parent_id" ref="mrp_workcenter_top"/>
</record>
</data>
</openerp>
6 changes: 6 additions & 0 deletions mrp_workcenter_hierarchical/model/__init__.py
@@ -0,0 +1,6 @@
# -*- coding: utf-8 -*-
# © 2016 Akretion (http://www.akretion.com)
# David BEAL <david.beal@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from . import workcenter
62 changes: 62 additions & 0 deletions mrp_workcenter_hierarchical/model/workcenter.py
@@ -0,0 +1,62 @@
# -*- coding: utf-8 -*-
# © 2016 Akretion (http://www.akretion.com)
# David BEAL <david.beal@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from openerp import api, fields, models


class MrpWorkcenter(models.Model):
_inherit = 'mrp.workcenter'
_order = 'parent_left'
_parent_store = True

parent_id = fields.Many2one('mrp.workcenter', string='Parent')
child_ids = fields.One2many(
'mrp.workcenter',
'parent_id',
string='Children')
parent_level_1_id = fields.Many2one(
'mrp.workcenter',
compute='_compute_parent_level',
string='Parent Level 1',
store=True)
parent_level_2_id = fields.Many2one(
'mrp.workcenter',
compute='_compute_parent_level',
string='Parent Level 2',
store=True)
parent_level_3_id = fields.Many2one(
'mrp.workcenter',
compute='_compute_parent_level',
string='Parent Level 3',
store=True)
parent_left = fields.Integer(select=True)
parent_right = fields.Integer(select=True)

@api.multi
def _get_parent_ids(self):
self.ensure_one()
if self.parent_id:
ids = self.parent_id._get_parent_ids()
ids.append(self.parent_id.id)
else:
ids = []
return ids

@api.multi
@api.depends('parent_id.parent_id.parent_id', 'child_ids')
def _compute_parent_level(self):
def get_next_level(parent_ids, workcenter):
return parent_ids and parent_ids.pop(0) or (
workcenter.child_ids and workcenter.id
or workcenter.parent_id.id)

for workcenter in self:
parent_ids = workcenter._get_parent_ids()
workcenter.parent_level_1_id = get_next_level(
parent_ids, workcenter)
workcenter.parent_level_2_id = get_next_level(
parent_ids, workcenter)
workcenter.parent_level_3_id = get_next_level(
parent_ids, workcenter)
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 6 additions & 0 deletions mrp_workcenter_hierarchical/tests/__init__.py
@@ -0,0 +1,6 @@
# -*- coding: utf-8 -*-
# © 2016 Akretion (http://www.akretion.com)
# David BEAL <david.beal@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from . import test_compute_level
78 changes: 78 additions & 0 deletions mrp_workcenter_hierarchical/tests/test_compute_level.py
@@ -0,0 +1,78 @@
# -*- coding: utf-8 -*-
# © 2016 Akretion (http://www.akretion.com)
# David BEAL <david.beal@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from openerp.tests.common import TransactionCase


class ComputeParentLevel(TransactionCase):
def test_compute_parent_level0(self):
workcenter = self.env['mrp.workcenter'].create({
'name': 'New Assembly',
'calendar_id': self.env.ref('resource.timesheet_group1').id,
'capacity_per_cycle': 5,
'time_cycle': 1,
'time_start': 0.1,
'time_stop': 0.1,
'time_efficiency': 0.87,
'product_id': self.env.ref('product.product_assembly').id,
'costs_hour': 0,
'costs_hour_account_id': self.env.ref(
'mrp.account_assembly_hours').id,
'costs_cycle': 0.05,
'costs_cycle_account_id': self.env.ref(
'mrp.account_assembly_cycle').id,
})
workcenter_child = self.env.ref(
'mrp_workcenter_hierarchical.mrp_workcenter_A')
workcenter_child.write({'parent_id': workcenter.id})
self.assertEqual(workcenter.parent_level_1_id, workcenter)

def test_compute_parent_level1(self):
workcenter_child = self.env.ref(
'mrp_workcenter_hierarchical.mrp_workcenter_E')
workcenter_parent = self.env.ref(
'mrp_workcenter_hierarchical.mrp_workcenter_top')
workcenter_child.write({'parent_id': workcenter_parent.id})
self.assertEqual(workcenter_child.parent_level_1_id, workcenter_parent)

def test_compute_parent_level2(self):
workcenter_child = self.env.ref(
'mrp_workcenter_hierarchical.mrp_workcenter_A')
workcenter_parent1 = self.env.ref(
'mrp_workcenter_hierarchical.mrp_workcenter_top')
workcenter_parent2 = self.env.ref('mrp.mrp_workcenter_0')
workcenter_child.write({'parent_id': workcenter_parent2.id})
self.assertEqual(
workcenter_child.parent_level_2_id, workcenter_parent2)
self.assertEqual(
workcenter_child.parent_level_1_id, workcenter_parent1)

def test_compute_parent_level3(self):
workcenter_child = self.env.ref(
'mrp_workcenter_hierarchical.mrp_workcenter_B')
workcenter_parent1 = self.env.ref(
'mrp_workcenter_hierarchical.mrp_workcenter_top')
workcenter_parent2 = self.env.ref(
'mrp_workcenter_hierarchical.mrp_workcenter_2')
workcenter_parent3 = self.env.ref(
'mrp_workcenter_hierarchical.mrp_workcenter_A')
workcenter_child.write({'parent_id': workcenter_parent3.id})
self.assertEqual(
workcenter_child.parent_level_3_id, workcenter_parent3)
self.assertEqual(
workcenter_child.parent_level_2_id, workcenter_parent2)
self.assertEqual(
workcenter_child.parent_level_1_id, workcenter_parent1)

def test_compute_parent_level3_bis(self):
workcenter_child = self.env.ref(
'mrp_workcenter_hierarchical.mrp_workcenter_C')
workcenter_parent3 = self.env.ref(
'mrp_workcenter_hierarchical.mrp_workcenter_A')
workcenter_parent4 = self.env.ref(
'mrp_workcenter_hierarchical.mrp_workcenter_B')
workcenter_parent4.write({'parent_id': workcenter_parent3.id})
workcenter_child.write({'parent_id': workcenter_parent4.id})
self.assertEqual(workcenter_child.parent_id, workcenter_parent4)

0 comments on commit ba13518

Please sign in to comment.