mirror of
https://github.com/OCA/stock-logistics-warehouse.git
synced 2025-01-21 14:27:28 +02:00
Merge pull request #47 from florian-dacosta/8.0-stock-dynamic-mto
ADD module stock dynamic mto
This commit is contained in:
62
stock_mts_mto_rule/README.rst
Normal file
62
stock_mts_mto_rule/README.rst
Normal file
@@ -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 <florian.dacosta@akretion.com>
|
||||
|
||||
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
stock_mts_mto_rule/__init__.py
Normal file
1
stock_mts_mto_rule/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from . import model
|
||||
38
stock_mts_mto_rule/__openerp__.py
Normal file
38
stock_mts_mto_rule/__openerp__.py
Normal file
@@ -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
stock_mts_mto_rule/data/stock_data.xml
Normal file
17
stock_mts_mto_rule/data/stock_data.xml
Normal file
@@ -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
stock_mts_mto_rule/model/__init__.py
Normal file
5
stock_mts_mto_rule/model/__init__.py
Normal file
@@ -0,0 +1,5 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from . import rule
|
||||
from . import warehouse
|
||||
from . import procurement
|
||||
111
stock_mts_mto_rule/model/procurement.py
Normal file
111
stock_mts_mto_rule/model/procurement.py
Normal file
@@ -0,0 +1,111 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
###############################################################################
|
||||
#
|
||||
# Module for OpenERP
|
||||
# Copyright (C) 2015 Akretion (http://www.akretion.com). All Rights Reserved
|
||||
# @author Florian DA COSTA <florian.dacosta@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/>.
|
||||
#
|
||||
###############################################################################
|
||||
from openerp import models, api
|
||||
|
||||
|
||||
class ProcurementOrder(models.Model):
|
||||
_inherit = 'procurement.order'
|
||||
|
||||
@api.multi
|
||||
def get_mto_qty_to_order(self):
|
||||
self.ensure_one()
|
||||
uom_obj = self.env['product.uom']
|
||||
stock_location = self.warehouse_id.lot_stock_id.id
|
||||
proc_warehouse = self.with_context(location=stock_location)
|
||||
virtual_available = proc_warehouse.product_id.virtual_available
|
||||
qty_available = uom_obj._compute_qty(self.product_id.uom_id.id,
|
||||
virtual_available,
|
||||
self.product_uom.id)
|
||||
if qty_available > 0:
|
||||
if qty_available >= self.product_qty:
|
||||
return 0.0
|
||||
else:
|
||||
return self.product_qty - qty_available
|
||||
return self.product_qty
|
||||
|
||||
@api.model
|
||||
def _get_mts_mto_procurement(self, proc, rule, qty, uos_qty):
|
||||
origin = (proc.group_id and (proc.group_id.name + ":") or "") + \
|
||||
(proc.rule_id and proc.rule_id.name or proc.origin or "/")
|
||||
return {
|
||||
'name': rule.name,
|
||||
'origin': origin,
|
||||
'product_qty': qty,
|
||||
'product_uos_qty': uos_qty,
|
||||
'rule_id': rule.id,
|
||||
}
|
||||
|
||||
@api.model
|
||||
def _check(self, procurement):
|
||||
if procurement.rule_id and \
|
||||
procurement.rule_id.action == 'split_procurement':
|
||||
if procurement.state == 'running':
|
||||
return True
|
||||
return super(ProcurementOrder, self)._check(procurement)
|
||||
|
||||
@api.multi
|
||||
def run(self, autocommit=False):
|
||||
res = super(ProcurementOrder, self).run(autocommit=autocommit)
|
||||
for proc in self:
|
||||
if proc.rule_id and \
|
||||
proc.rule_id.action == 'split_procurement':
|
||||
proc.check()
|
||||
return res
|
||||
|
||||
@api.model
|
||||
def _run(self, procurement):
|
||||
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:
|
||||
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:
|
||||
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)
|
||||
37
stock_mts_mto_rule/model/rule.py
Normal file
37
stock_mts_mto_rule/model/rule.py
Normal file
@@ -0,0 +1,37 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
###############################################################################
|
||||
#
|
||||
# Module for OpenERP
|
||||
# Copyright (C) 2015 Akretion (http://www.akretion.com). All Rights Reserved
|
||||
# @author Florian DA COSTA <florian.dacosta@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/>.
|
||||
#
|
||||
###############################################################################
|
||||
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()
|
||||
137
stock_mts_mto_rule/model/warehouse.py
Normal file
137
stock_mts_mto_rule/model/warehouse.py
Normal file
@@ -0,0 +1,137 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
###############################################################################
|
||||
#
|
||||
# Module for OpenERP
|
||||
# Copyright (C) 2015 Akretion (http://www.akretion.com). All Rights Reserved
|
||||
# @author Florian DA COSTA <florian.dacosta@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/>.
|
||||
#
|
||||
###############################################################################
|
||||
from openerp import models, api, fields, exceptions
|
||||
from openerp.tools.translate import _
|
||||
|
||||
|
||||
class Warehouse(models.Model):
|
||||
_inherit = 'stock.warehouse'
|
||||
|
||||
mto_mts_management = fields.Boolean(
|
||||
'Use MTO+MTS rules',
|
||||
help='If this new route is selected on product form view, a '
|
||||
'purchase order will be created only if the virtual stock is '
|
||||
'less than 0 else, the product will be taken from stocks')
|
||||
mts_mto_rule_id = fields.Many2one('procurement.rule',
|
||||
'MTO+MTS rule')
|
||||
|
||||
@api.model
|
||||
def _get_mts_mto_rule(self, warehouse):
|
||||
route_model = self.env['stock.location.route']
|
||||
pull_model = self.env['procurement.rule']
|
||||
try:
|
||||
mts_mto_route = self.env.ref(
|
||||
'stock_mts_mto_rule.route_mto_mts')
|
||||
except:
|
||||
mts_mto_route = route_model.search([
|
||||
('name', 'like', 'Make To Order + Make To Stock')
|
||||
])
|
||||
if not mts_mto_route:
|
||||
raise exceptions.Warning(_(
|
||||
'Can\'t find any generic MTS+MTO route.'))
|
||||
|
||||
if not warehouse.mto_pull_id:
|
||||
raise exceptions.Warning(_(
|
||||
'Can\'t find MTO Rule on the warehouse'))
|
||||
|
||||
mts_rules = pull_model.search(
|
||||
[('location_src_id', '=', warehouse.lot_stock_id.id),
|
||||
('route_id', '=', warehouse.delivery_route_id.id)])
|
||||
if not mts_rules:
|
||||
raise exceptions.Warning(_(
|
||||
'Can\'t find MTS Rule on the warehouse'))
|
||||
return {
|
||||
'name': self._format_routename(warehouse, _('MTS+MTO')),
|
||||
'route_id': mts_mto_route.id,
|
||||
'action': 'split_procurement',
|
||||
'mto_rule_id': warehouse.mto_pull_id.id,
|
||||
'mts_rule_id': mts_rules[0].id,
|
||||
'warehouse_id': warehouse.id,
|
||||
'location_id': warehouse.mto_pull_id.location_id.id,
|
||||
'picking_type_id': warehouse.mto_pull_id.picking_type_id.id,
|
||||
}
|
||||
|
||||
@api.multi
|
||||
def create_routes(self, warehouse):
|
||||
pull_model = self.env['procurement.rule']
|
||||
res = super(Warehouse, self).create_routes(warehouse)
|
||||
if warehouse.mto_mts_management:
|
||||
mts_mto_pull_vals = self._get_mts_mto_rule(warehouse)
|
||||
mts_mto_pull = pull_model.create(mts_mto_pull_vals)
|
||||
res['mts_mto_rule_id'] = mts_mto_pull.id
|
||||
return res
|
||||
|
||||
@api.multi
|
||||
def write(self, vals):
|
||||
pull_model = self.env['procurement.rule']
|
||||
if 'mto_mts_management' in vals:
|
||||
if vals.get("mto_mts_management"):
|
||||
for warehouse in self:
|
||||
if not warehouse.mts_mto_rule_id:
|
||||
rule_vals = self._get_mts_mto_rule(warehouse)
|
||||
mts_mto_pull = pull_model.create(rule_vals)
|
||||
vals['mts_mto_rule_id'] = mts_mto_pull.id
|
||||
else:
|
||||
for warehouse in self:
|
||||
if warehouse.mts_mto_rule_id:
|
||||
warehouse.mts_mto_rule_id.unlink()
|
||||
return super(Warehouse, self).write(vals)
|
||||
|
||||
@api.model
|
||||
def get_all_routes_for_wh(self, warehouse):
|
||||
all_routes = super(Warehouse, self).get_all_routes_for_wh(warehouse)
|
||||
if (
|
||||
warehouse.mto_mts_management and
|
||||
warehouse.mts_mto_rule_id.route_id
|
||||
):
|
||||
all_routes += [warehouse.mts_mto_rule_id.route_id.id]
|
||||
return all_routes
|
||||
|
||||
@api.model
|
||||
def _handle_renaming(self, warehouse, name, code):
|
||||
res = super(Warehouse, self)._handle_renaming(warehouse, name, code)
|
||||
|
||||
if warehouse.mts_mto_rule_id:
|
||||
warehouse.mts_mto_rule_id.name = (
|
||||
warehouse.mts_mto_rule_id.name.replace(
|
||||
warehouse.name, name, 1)
|
||||
)
|
||||
return res
|
||||
|
||||
@api.multi
|
||||
def change_route(self, warehouse, new_reception_step=False,
|
||||
new_delivery_step=False):
|
||||
res = super(Warehouse, self).change_route(
|
||||
warehouse,
|
||||
new_reception_step=new_reception_step,
|
||||
new_delivery_step=new_delivery_step)
|
||||
|
||||
mts_mto_rule_id = warehouse.mts_mto_rule_id
|
||||
if new_delivery_step and mts_mto_rule_id:
|
||||
pull_model = self.env['procurement.rule']
|
||||
warehouse.mts_mto_rule_id.location_id = (
|
||||
warehouse.mto_pull_id.location_id)
|
||||
mts_rules = pull_model.search(
|
||||
[('location_src_id', '=', warehouse.lot_stock_id.id),
|
||||
('route_id', '=', warehouse.delivery_route_id.id)])
|
||||
warehouse.mts_mto_rule_id.mts_rule_id = mts_rules[0].id
|
||||
return res
|
||||
2
stock_mts_mto_rule/tests/__init__.py
Normal file
2
stock_mts_mto_rule/tests/__init__.py
Normal file
@@ -0,0 +1,2 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from . import test_mto_mts_route
|
||||
104
stock_mts_mto_rule/tests/test_mto_mts_route.py
Normal file
104
stock_mts_mto_rule/tests/test_mto_mts_route.py
Normal file
@@ -0,0 +1,104 @@
|
||||
# Author: Florian da Costa
|
||||
# Copyright 2015 Akretion
|
||||
#
|
||||
# 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/>.
|
||||
from openerp.tests.common import TransactionCase
|
||||
from datetime import datetime
|
||||
|
||||
|
||||
class TestMtoMtsRoute(TransactionCase):
|
||||
|
||||
def test_standard_mto_route(self):
|
||||
mto_route = self.env.ref('stock.route_warehouse0_mto')
|
||||
self.product.route_ids = [(6, 0, [mto_route.id])]
|
||||
self.procurement.run()
|
||||
self.assertEqual(self.warehouse.mto_pull_id,
|
||||
self.procurement.rule_id)
|
||||
self.assertEqual('make_to_order',
|
||||
self.procurement.move_ids[0].procure_method)
|
||||
self.assertEqual(self.procurement.product_qty,
|
||||
self.procurement.move_ids[0].product_uom_qty)
|
||||
self.assertEqual('waiting',
|
||||
self.procurement.move_ids[0].state)
|
||||
|
||||
def test_standard_mts_route(self):
|
||||
self.procurement.run()
|
||||
self.assertEqual('make_to_stock',
|
||||
self.procurement.move_ids[0].procure_method)
|
||||
self.assertEqual(self.procurement.product_qty,
|
||||
self.procurement.move_ids[0].product_uom_qty)
|
||||
self.assertEqual('confirmed',
|
||||
self.procurement.move_ids[0].state)
|
||||
|
||||
def test_mts_mto_route_split(self):
|
||||
mto_mts_route = self.env.ref('stock_mts_mto_rule.route_mto_mts')
|
||||
self.product.route_ids = [(6, 0, [mto_mts_route.id])]
|
||||
self.quant.qty = 1.0
|
||||
self.procurement.run()
|
||||
moves = self.env['stock.move'].search(
|
||||
[('group_id', '=', self.group.id)])
|
||||
self.assertEqual(2, len(moves))
|
||||
self.assertEqual(1.0, moves[0].product_uom_qty)
|
||||
|
||||
def test_mts_mto_route_mts_only(self):
|
||||
mto_mts_route = self.env.ref('stock_mts_mto_rule.route_mto_mts')
|
||||
self.product.route_ids = [(6, 0, [mto_mts_route.id])]
|
||||
self.quant.qty = 0.0
|
||||
self.procurement.run()
|
||||
moves = self.env['stock.move'].search(
|
||||
[('group_id', '=', self.group.id)])
|
||||
self.assertEqual(1, len(moves))
|
||||
self.assertEqual(2.0, moves[0].product_uom_qty)
|
||||
self.assertEqual('make_to_order',
|
||||
moves[0].procure_method)
|
||||
|
||||
def test_mts_mto_route_mto_only(self):
|
||||
mto_mts_route = self.env.ref('stock_mts_mto_rule.route_mto_mts')
|
||||
self.product.route_ids = [(6, 0, [mto_mts_route.id])]
|
||||
self.quant.qty = 3.0
|
||||
self.procurement.run()
|
||||
moves = self.env['stock.move'].search(
|
||||
[('group_id', '=', self.group.id)])
|
||||
self.assertEqual(1, len(moves))
|
||||
self.assertEqual(2.0, moves[0].product_uom_qty)
|
||||
self.assertEqual('make_to_stock',
|
||||
moves[0].procure_method)
|
||||
|
||||
def setUp(self):
|
||||
super(TestMtoMtsRoute, self).setUp()
|
||||
self.warehouse = self.env.ref('stock.warehouse0')
|
||||
self.warehouse.mto_mts_management = True
|
||||
self.product = self.env.ref('product.product_product_4')
|
||||
self.company_partner = self.env.ref('base.main_partner')
|
||||
self.group = self.env['procurement.group'].create({
|
||||
'name': 'test',
|
||||
})
|
||||
self.procurement = self.env['procurement.order'].create({
|
||||
'location_id': self.env.ref('stock.stock_location_customers').id,
|
||||
'product_id': self.product.id,
|
||||
'product_qty': 2.0,
|
||||
'product_uom': 1,
|
||||
'warehouse_id': self.warehouse.id,
|
||||
'priority': '1',
|
||||
'date_planned': datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
|
||||
'name': self.product.name,
|
||||
'origin': 'test',
|
||||
'group_id': self.group.id,
|
||||
})
|
||||
self.quant = self.env['stock.quant'].create({
|
||||
'owner_id': self.company_partner.id,
|
||||
'location_id': self.env.ref('stock.stock_location_stock').id,
|
||||
'product_id': self.product.id,
|
||||
'qty': 0.0,
|
||||
})
|
||||
21
stock_mts_mto_rule/view/pull_rule.xml
Normal file
21
stock_mts_mto_rule/view/pull_rule.xml
Normal file
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<openerp>
|
||||
<data>
|
||||
<record id="view_procurement_rule_form_mto_mto" model="ir.ui.view">
|
||||
<field name="name">procurement.rule.mts.mto</field>
|
||||
<field name="model">procurement.rule</field>
|
||||
<field name="inherit_id" ref="procurement.view_procurement_rule_form" />
|
||||
<field name="arch" type="xml">
|
||||
<field name="action" position="after">
|
||||
<field name="mts_rule_id"
|
||||
groups="stock.group_adv_location"
|
||||
attrs="{'invisible': [('action', '!=', 'split_procurement')]}"/>
|
||||
<field name="mto_rule_id"
|
||||
groups="stock.group_adv_location"
|
||||
attrs="{'invisible': [('action', '!=', 'split_procurement')]}"/>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
17
stock_mts_mto_rule/view/warehouse.xml
Normal file
17
stock_mts_mto_rule/view/warehouse.xml
Normal file
@@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data>
|
||||
|
||||
<record id="view_warehouse_inherited" model="ir.ui.view">
|
||||
<field name="name">view_warehouse_inherited</field>
|
||||
<field name="model">stock.warehouse</field>
|
||||
<field name="inherit_id" ref="stock.view_warehouse"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='delivery_steps']" position="after">
|
||||
<field name="mto_mts_management" />
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
Reference in New Issue
Block a user