Skip to content

Commit

Permalink
refactore creating a new route, a new procurement action and separate…
Browse files Browse the repository at this point in the history
… procurement rules to handle the mts+mto scenario
  • Loading branch information
florian-dacosta committed Apr 29, 2015
1 parent 4eddb59 commit fe31fa5
Show file tree
Hide file tree
Showing 12 changed files with 386 additions and 73 deletions.
1 change: 0 additions & 1 deletion stock_dynamic_mto/__init__.py

This file was deleted.

18 changes: 0 additions & 18 deletions stock_dynamic_mto/pull_rule_view.xml

This file was deleted.

62 changes: 62 additions & 0 deletions stock_mts_mto_rule/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
:alt: License: AGPL-3

Stock MTS+MTO Rule
==================

This module add a Make To Stock + Make to Order Route.

If you choose the make to stock + make to order rule instead of the make to
order route, the creation of a purchase order will depend on the virtual stock.
There are 3 cases :

1. The virtual stock of the product is 0
=> It will act exactly like the make to order route.

2. The virtual stock is equal to the quantity ordered
=> It will act exactly like a make to stock route

3. The virtual stock is more than 0 but less than ordered quantity
=> On part of the products will be taken from stock and a purchase order
will be created for the rest. So it will act like both make to order and
make to stock rule.

Example :
We have a virtual stock of : 1 product A
A sale Order is made for 3 products A.
2 Procurements will be created :

1. 1 with a make to stock rule and a quantity of 1

2. 1 with a make to order rule and a quantity of 2.

After validation, a purchase order with 2 products will be created.

Usage
=====

You have to choose the mts+mto route on the product form.
You should not choose both mts+mto route and mto route.

Credits
=======

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

* Florian da Costa <[email protected]>

Maintainer
----------

.. image:: http://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: http://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 http://odoo-community.org.
1 change: 1 addition & 0 deletions stock_mts_mto_rule/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import model
38 changes: 38 additions & 0 deletions stock_mts_mto_rule/__openerp__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# -*- coding: utf-8 -*-

##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2015 Akretion (<http://www.akretion.com>).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################

{'name': 'Stock MTS+MTO Rule',
'version': '1.0',
'author': 'Akretion,Odoo Community Association (OCA)',
'website': 'http://www.akretion.com',
'license': 'AGPL-3',
'category': 'Warehouse',
'summary': 'Add a MTS+MTO route',
'depends': ['stock',
],
'demo': [],
'data': ['data/stock_data.xml',
'view/pull_rule.xml',
'view/warehouse.xml',
],
'installable': True,
}
17 changes: 17 additions & 0 deletions stock_mts_mto_rule/data/stock_data.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>

<!--
Procurement rules
-->

<record id="route_mto_mts" model='stock.location.route'>
<field name="name">Make To Order + Make To Stock</field>
<field name="sequence">5</field>
<field name="product_selectable" eval="True"/>
</record>


</data>
</openerp>
5 changes: 5 additions & 0 deletions stock_mts_mto_rule/model/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# -*- coding: utf-8 -*-

from . import rule
from . import warehouse
from . import procurement
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from openerp import models, fields, api


class ProcurementRule(models.Model):
_inherit = 'procurement.rule'

mts_pull_rule_id = fields.Many2one('procurement.rule',
string="MTS Rule")
from openerp import models, api


class ProcurementOrder(models.Model):
Expand All @@ -48,33 +41,51 @@ def get_mto_qty_to_order(self):
return self.product_qty - qty_available
return self.product_qty

@api.model
def _get_mts_mto_procurement(self, proc, rule, qty, uos_qty):
return {
'name': rule.name,
'origin': proc.rule_id.name,
'product_qty': qty,
'product_uos_qty': uos_qty,
'rule_id': rule.id,
}

@api.model
def _run(self, procurement):
uom_obj = self.env['product.uom']
rule_id = procurement.rule_id
rule_mts = rule_id and rule_id.mts_pull_rule_id or False
if rule_mts:
if procurement.rule_id and \
procurement.rule_id.action == 'split_procurement':
uom_obj = self.env['product.uom']
needed_qty = procurement.get_mto_qty_to_order()
rule = procurement.rule_id
if needed_qty == 0.0:
procurement.write({'rule_id': rule_mts.id})
return super(ProcurementOrder, self)._run(procurement)
mts_vals = self._get_mts_mto_procurement(
procurement, rule.mts_rule_id, procurement.product_qty,
procurement.product_uos_qty)
mts_proc = procurement.copy(mts_vals)
mts_proc.run()
elif needed_qty == procurement.product_qty:
mto_vals = self._get_mts_mto_procurement(
procurement, rule.mto_rule_id, procurement.product_qty,
procurement.product_uos_qty)
mto_proc = procurement.copy(mto_vals)
mto_proc.run()
else:
if needed_qty != procurement.product_qty:
mts_qty = procurement.product_qty - needed_qty
mts_uos_qty = uom_obj._compute_qty(
procurement.product_uom.id,
mts_qty,
procurement.product_uos.id)
default_vals = {
'product_qty': mts_qty,
'product_uos_qty': mts_uos_qty,
}
uos_qty = procurement.product_uos_qty
update_vals = {
'product_qty': needed_qty,
'product_uos_qty': uos_qty - mts_uos_qty,
}
mts_proc = procurement.copy(default=default_vals)
mts_proc.run()
procurement.write(update_vals)
mts_qty = procurement.product_qty - needed_qty
mts_uos_qty = uom_obj._compute_qty(
procurement.product_uom.id,
mts_qty,
procurement.product_uos.id)
mts_vals = self._get_mts_mto_procurement(
procurement, rule.mts_rule_id, mts_qty, mts_uos_qty)
mts_proc = procurement.copy(mts_vals)
mts_proc.run()

uos_qty = procurement.product_uos_qty
mto_vals = self._get_mts_mto_procurement(
procurement, rule.mto_rule_id, needed_qty,
uos_qty - mts_uos_qty)

mto_proc = procurement.copy(mto_vals)
mto_proc.run()
return super(ProcurementOrder, self)._run(procurement)
Original file line number Diff line number Diff line change
Expand Up @@ -19,25 +19,19 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
{
"name": "Stock Dynamic MTO",
"version": "1.0",
"category": "Stock",
"description": """
Stock Dynamic MTO
======================
The purpose of the module is to give the possibility to a pull rule
make to order to act like a make to stock rule depending of the virtual
stock of a product.
""",
"license": "AGPL-3",
"author": "Akretion,Odoo Community Association (OCA)",
"website": "http://www.akretion.com/",
"depends": [
"stock",
],
"data": [
"pull_rule_view.xml",
],
"installable": True,
}
from openerp import models, api, fields
from openerp.tools.translate import _


class ProcurementRule(models.Model):
_inherit = 'procurement.rule'

mts_rule_id = fields.Many2one('procurement.rule',
string="MTS Rule")
mto_rule_id = fields.Many2one('procurement.rule',
string="MTO Rule")

@api.model
def _get_action(self):
return [('split_procurement', _('Choose between MTS and MTO'))] + \
super(ProcurementRule, self)._get_action()
Loading

0 comments on commit fe31fa5

Please sign in to comment.