[IMP] Improved the code as per v13.

This commit is contained in:
Chandresh Thakkar
2020-04-03 17:05:42 +05:30
parent 6c2f6fe827
commit 1851134086
16 changed files with 200 additions and 205 deletions

View File

@@ -14,13 +14,13 @@ MRP Production Request
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fmanufacture-lightgray.png?logo=github
:target: https://github.com/OCA/manufacture/tree/12.0/mrp_production_request
:target: https://github.com/OCA/manufacture/tree/13.0/mrp_production_request
:alt: OCA/manufacture
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/manufacture-12-0/manufacture-12-0-mrp_production_request
:target: https://translation.odoo-community.org/projects/manufacture-13-0/manufacture-13-0-mrp_production_request
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
:target: https://runbot.odoo-community.org/runbot/129/12.0
:target: https://runbot.odoo-community.org/runbot/129/13.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
@@ -110,7 +110,7 @@ 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:%20mrp_production_request%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
`feedback <https://github.com/OCA/manufacture/issues/new?body=module:%20mrp_production_request%0Aversion:%2013.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
@@ -127,6 +127,7 @@ Contributors
* Lois Rilo Antelo <lois.rilo@eficent.com>
* Jordi Ballester <jordi.ballester@eficent.com>
* Chandresh Thakkar <chandresh.thakkar.serpentcs@gmail.com>
Maintainers
~~~~~~~~~~~
@@ -149,6 +150,6 @@ Current `maintainer <https://odoo-community.org/page/maintainer-role>`__:
|maintainer-lreficent|
This module is part of the `OCA/manufacture <https://github.com/OCA/manufacture/tree/12.0/mrp_production_request>`_ project on GitHub.
This module is part of the `OCA/manufacture <https://github.com/OCA/manufacture/tree/13.0/mrp_production_request>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View File

@@ -5,7 +5,7 @@
"summary": "Allows you to use Manufacturing Request as a previous "
"step to Manufacturing Orders for better manufacture "
"planification.",
"version": "12.0.1.0.0",
"version": "13.0.1.0.0",
"development_status": "Mature",
"maintainers": ["lreficent"],
"category": "Manufacturing",

View File

@@ -24,7 +24,5 @@ class MrpProduction(models.Model):
move = super()._generate_finished_moves()
request = self.mrp_production_request_id
if request and request.move_dest_ids:
move.write(
{"move_dest_ids": [(4, x.id) for x in request.move_dest_ids],}
)
move.write({"move_dest_ids": [(4, x.id) for x in request.move_dest_ids]})
return move

View File

@@ -4,8 +4,6 @@
from odoo import _, api, fields, models
from odoo.exceptions import UserError
import odoo.addons.decimal_precision as dp
class MrpProductionRequest(models.Model):
_name = "mrp.production.request"
@@ -13,11 +11,6 @@ class MrpProductionRequest(models.Model):
_inherit = "mail.thread"
_order = "date_planned_start desc, id desc"
@api.model
def _company_get(self):
company_id = self.env["res.company"]._company_default_get()
return self.env["res.company"].browse(company_id.id)
@api.model
def _get_default_requested_by(self):
return self.env.user
@@ -64,7 +57,6 @@ class MrpProductionRequest(models.Model):
index=True,
required=True,
states={"confirmed": [("readonly", False)]},
oldname="date_planned",
)
date_planned_finished = fields.Datetime(
"Deadline End",
@@ -77,7 +69,7 @@ class MrpProductionRequest(models.Model):
comodel_name="res.company",
string="Company",
required=True,
default=lambda self: self._company_get(),
default=lambda self: self.env.company,
)
mrp_production_ids = fields.One2many(
comodel_name="mrp.production",
@@ -86,7 +78,7 @@ class MrpProductionRequest(models.Model):
readonly=True,
)
mrp_production_count = fields.Integer(
compute="_compute_mrp_production_count", string="MO's Count",
compute="_compute_mrp_production_count", string="MO's Count"
)
state = fields.Selection(
selection=[
@@ -129,7 +121,7 @@ class MrpProductionRequest(models.Model):
string="Required Quantity",
required=True,
track_visibility="onchange",
digits=dp.get_precision("Product Unit of Measure"),
digits="Product Unit of Measure",
default=1.0,
readonly=True,
states={"draft": [("readonly", False)]},
@@ -147,7 +139,7 @@ class MrpProductionRequest(models.Model):
compute="_compute_manufactured_qty",
store=True,
readonly=True,
digits=dp.get_precision("Product Unit of Measure"),
digits="Product Unit of Measure",
help="Sum of the quantities in Manufacturing Orders (in any state).",
)
done_qty = fields.Float(
@@ -155,14 +147,14 @@ class MrpProductionRequest(models.Model):
store=True,
readonly=True,
compute="_compute_manufactured_qty",
digits=dp.get_precision("Product Unit of Measure"),
digits="Product Unit of Measure",
help="Sum of the quantities in all done Manufacturing Orders.",
)
pending_qty = fields.Float(
string="Pending Quantity",
compute="_compute_manufactured_qty",
store=True,
digits=dp.get_precision("Product Unit of Measure"),
digits="Product Unit of Measure",
readonly=True,
help="Quantity pending to add to Manufacturing Orders "
"to fulfill the Manufacturing Request requirement.",
@@ -229,14 +221,13 @@ class MrpProductionRequest(models.Model):
"name_uniq",
"unique(name, company_id)",
"Reference must be unique per Company!",
),
)
]
@api.model
def _get_mo_valid_states(self):
return ["planned", "confirmed", "progress", "done"]
@api.multi
@api.depends("mrp_production_ids", "mrp_production_ids.state", "state")
def _compute_manufactured_qty(self):
valid_states = self._get_mo_valid_states()
@@ -251,21 +242,20 @@ class MrpProductionRequest(models.Model):
req.manufactured_qty = sum(valid_mo)
req.pending_qty = max(req.product_qty - req.manufactured_qty, 0.0)
@api.multi
def _compute_mrp_production_count(self):
for rec in self:
rec.mrp_production_count = len(rec.mrp_production_ids)
@api.onchange("product_id")
def _onchange_product_id(self):
self.product_uom_id = self.product_id.uom_id
self.bom_id = self.env["mrp.bom"]._bom_find(
product=self.product_id,
company_id=self.company_id.id,
picking_type=self.picking_type_id,
)
if self.product_id:
self.product_uom_id = self.product_id.uom_id
self.bom_id = self.env["mrp.bom"]._bom_find(
product=self.product_id,
company_id=self.company_id.id,
picking_type=self.picking_type_id,
)
@api.multi
def _subscribe_assigned_user(self, vals):
self.ensure_one()
if vals.get("assigned_to"):
@@ -290,29 +280,24 @@ class MrpProductionRequest(models.Model):
res._subscribe_assigned_user(vals)
return res
@api.multi
def write(self, vals):
res = super().write(vals)
for request in self:
request._subscribe_assigned_user(vals)
return res
@api.multi
def button_to_approve(self):
self.write({"state": "to_approve"})
return True
@api.multi
def button_approved(self):
self.write({"state": "approved"})
return True
@api.multi
def button_done(self):
self.write({"state": "done"})
return True
@api.multi
def _check_reset_allowed(self):
if any(
[
@@ -327,13 +312,11 @@ class MrpProductionRequest(models.Model):
)
)
@api.multi
def button_draft(self):
self._check_reset_allowed()
self.write({"state": "draft"})
return True
@api.multi
def _check_cancel_allowed(self):
if any([s == "done" for s in self.mapped("state")]):
raise UserError(
@@ -343,7 +326,6 @@ class MrpProductionRequest(models.Model):
)
)
@api.multi
def button_cancel(self):
self._check_cancel_allowed()
self.write({"state": "cancel"})
@@ -352,7 +334,6 @@ class MrpProductionRequest(models.Model):
)._action_cancel()
return True
@api.multi
def action_view_mrp_productions(self):
action = self.env.ref("mrp.mrp_production_action")
result = action.read()[0]

View File

@@ -8,7 +8,7 @@ class StockMove(models.Model):
_inherit = "stock.move"
created_mrp_production_request_id = fields.Many2one(
comodel_name="mrp.production.request", string="Created Production Request",
comodel_name="mrp.production.request", string="Created Production Request"
)
@api.model
@@ -16,5 +16,5 @@ class StockMove(models.Model):
if "production_id" in vals:
production = self.env["mrp.production"].browse(vals["production_id"])
if production.mrp_production_request_id:
vals["propagate"] = False
vals["propagate_cancel"] = False
return super().create(vals)

View File

@@ -1,14 +1,13 @@
# Copyright 2018-19 Eficent Business and IT Consulting Services S.L.
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import _, api, models
from odoo import _, models
from odoo.exceptions import UserError
class StockRule(models.Model):
_inherit = "stock.rule"
@api.multi
def _prepare_mrp_production_request(
self,
product_id,
@@ -17,13 +16,29 @@ class StockRule(models.Model):
location_id,
name,
origin,
company_id,
values,
bom,
):
self.ensure_one()
data = self._prepare_mo_vals(
product_id, product_qty, product_uom, location_id, name, origin, values, bom
product_id,
product_qty,
product_uom,
location_id,
name,
origin,
company_id,
values,
bom,
)
for key in [
"date_deadline",
"propagate_cancel",
"propagate_date",
"propagate_date_minimum_delta",
"user_id",
]:
data.pop(key)
data["state"] = "to_approve"
orderpoint = values.get("orderpoint_id")
if orderpoint:
@@ -33,13 +48,19 @@ class StockRule(models.Model):
data["procurement_group_id"] = procurement_group.id
return data
@api.multi
def _need_production_request(self, product_id):
return self.action == "manufacture" and product_id.mrp_production_request
def _need_production_request(self, product_id, action="manufacture"):
return action == "manufacture" and product_id.mrp_production_request
@api.multi
def _run_production_request(
self, product_id, product_qty, product_uom, location_id, name, origin, values
self,
product_id,
product_qty,
product_uom,
location_id,
name,
origin,
values,
company_id,
):
"""Trying to handle this as much similar as possible to Odoo
production orders. See `_run_manufacture` in Odoo standard."""
@@ -47,7 +68,7 @@ class StockRule(models.Model):
request_obj_sudo = request_obj.sudo().with_context(
force_company=values["company_id"].id
)
bom = self._get_matching_bom(product_id, values)
bom = self._get_matching_bom(product_id, company_id, values)
if not bom:
raise UserError(
_(
@@ -67,6 +88,7 @@ class StockRule(models.Model):
location_id,
name,
origin,
company_id,
values,
bom,
)
@@ -91,15 +113,18 @@ class StockRule(models.Model):
)
return True
@api.multi
def _run_manufacture(
self, product_id, product_qty, product_uom, location_id, name, origin, values
):
if self._need_production_request(product_id):
return self._run_production_request(
product_id, product_qty, product_uom, location_id, name, origin, values
)
def _run_manufacture(self, procurements):
for procurement, _rule in procurements:
if self._need_production_request(procurement.product_id):
return self._run_production_request(
procurement.product_id,
procurement.product_qty,
procurement.product_uom,
procurement.location_id,
procurement.name,
procurement.origin,
procurement.values,
procurement.company_id,
)
return super()._run_manufacture(
product_id, product_qty, product_uom, location_id, name, origin, values
)
return super()._run_manufacture(procurements)

View File

@@ -10,10 +10,7 @@ class Orderpoint(models.Model):
def _quantity_in_progress(self):
res = super()._quantity_in_progress()
mrp_requests = self.env["mrp.production.request"].search(
[
("state", "not in", ("done", "cancel")),
("orderpoint_id", "in", self.ids),
]
[("state", "not in", ("done", "cancel")), ("orderpoint_id", "in", self.ids)]
)
for rec in mrp_requests:
res[rec.orderpoint_id.id] += rec.product_uom_id._compute_quantity(

View File

@@ -1,2 +1,3 @@
* Lois Rilo Antelo <lois.rilo@eficent.com>
* Jordi Ballester <jordi.ballester@eficent.com>
* Chandresh Thakkar <chandresh.thakkar.serpentcs@gmail.com>

View File

@@ -3,34 +3,34 @@
License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl-3.0) -->
<odoo>
<data noupdate="0">
<record model="ir.module.category" id="module_category_mrp_production_request">
<record id="module_category_mrp_production_request" model="ir.module.category">
<field name="name">Manufacturing Request</field>
<field name="parent_id" ref="base.module_category_manufacturing" />
<field name="sequence">20</field>
</record>
<record id="group_mrp_production_request_user" model="res.groups">
<field name="name">User</field>
<field name="implied_ids" eval="[(4, ref('base.group_user'))]" />
<field eval="[(4, ref('base.group_user'))]" name="implied_ids" />
<field name="category_id" ref="module_category_mrp_production_request" />
</record>
<record id="group_mrp_production_request_manager" model="res.groups">
<field name="name">Manager</field>
<field
name="implied_ids"
eval="[(4, ref('mrp_production_request.group_mrp_production_request_user'))]"
name="implied_ids"
/>
<field
name="users"
eval="[(4, ref('base.user_root')), (4, ref('base.user_admin'))]"
name="users"
/>
<field name="category_id" ref="module_category_mrp_production_request" />
</record>
</data>
<data noupdate="0">
<record model="ir.rule" id="mrp_production_request_comp_rule">
<record id="mrp_production_request_comp_rule" model="ir.rule">
<field name="name">Manufacturing Request multi-company</field>
<field name="model_id" ref="model_mrp_production_request" />
<field name="global" eval="True" />
<field eval="True" name="global" />
<field name="domain_force">['|',('company_id','=',False),
('company_id','child_of',[user.company_id.id])]</field>
</record>
@@ -38,13 +38,13 @@
<field name="name">Follow Manufacturing Request</field>
<field name="model_id" ref="model_mrp_production_request" />
<field
name="groups"
eval="[(6,0, [ref('group_mrp_production_request_user')])]"
name="groups"
/>
<field name="perm_read" eval="True" />
<field name="perm_write" eval="False" />
<field name="perm_create" eval="False" />
<field name="perm_unlink" eval="False" />
<field eval="True" name="perm_read" />
<field eval="False" name="perm_write" />
<field eval="False" name="perm_create" />
<field eval="False" name="perm_unlink" />
<field name="domain_force">['|',('requested_by','=',user.id),
('message_partner_ids', 'in', [user.partner_id.id])]</field>
</record>
@@ -52,26 +52,26 @@
<field name="name">Manufacturing Request User</field>
<field name="model_id" ref="model_mrp_production_request" />
<field
name="groups"
eval="[(6,0, [ref('group_mrp_production_request_user')])]"
name="groups"
/>
<field name="perm_read" eval="True" />
<field name="perm_write" eval="True" />
<field name="perm_create" eval="True" />
<field name="perm_unlink" eval="True" />
<field eval="True" name="perm_read" />
<field eval="True" name="perm_write" />
<field eval="True" name="perm_create" />
<field eval="True" name="perm_unlink" />
<field name="domain_force">[('requested_by','=',user.id)]</field>
</record>
<record id="mpr_production_request_line_manager_rule" model="ir.rule">
<field name="name">Manufacturing Request Line Manager</field>
<field name="model_id" ref="model_mrp_production_request" />
<field
name="groups"
eval="[(6,0, [ref('group_mrp_production_request_manager')])]"
name="groups"
/>
<field name="perm_read" eval="True" />
<field name="perm_write" eval="True" />
<field name="perm_create" eval="True" />
<field name="perm_unlink" eval="True" />
<field eval="True" name="perm_read" />
<field eval="True" name="perm_write" />
<field eval="True" name="perm_create" />
<field eval="True" name="perm_unlink" />
</record>
</data>
</odoo>

View File

@@ -367,7 +367,7 @@ ul.auto-toc {
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Mature" src="https://img.shields.io/badge/maturity-Mature-brightgreen.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/manufacture/tree/12.0/mrp_production_request"><img alt="OCA/manufacture" src="https://img.shields.io/badge/github-OCA%2Fmanufacture-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/manufacture-12-0/manufacture-12-0-mrp_production_request"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/129/12.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Mature" src="https://img.shields.io/badge/maturity-Mature-brightgreen.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/manufacture/tree/13.0/mrp_production_request"><img alt="OCA/manufacture" src="https://img.shields.io/badge/github-OCA%2Fmanufacture-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/manufacture-13-0/manufacture-13-0-mrp_production_request"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/129/13.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
<p>This module extends the functionality of Manufacturing to allow you to use
Manufacturing Request (MR) as a previous step to Manufacturing Orders (MO).</p>
<p>Some of the benefits you can obtain are:</p>
@@ -468,7 +468,7 @@ to set it to <em>Done</em> state.</p>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/manufacture/issues">GitHub Issues</a>.
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
<a class="reference external" href="https://github.com/OCA/manufacture/issues/new?body=module:%20mrp_production_request%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<a class="reference external" href="https://github.com/OCA/manufacture/issues/new?body=module:%20mrp_production_request%0Aversion:%2013.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
@@ -484,6 +484,7 @@ If you spotted it first, help us smashing it by providing a detailed and welcome
<ul class="simple">
<li>Lois Rilo Antelo &lt;<a class="reference external" href="mailto:lois.rilo&#64;eficent.com">lois.rilo&#64;eficent.com</a>&gt;</li>
<li>Jordi Ballester &lt;<a class="reference external" href="mailto:jordi.ballester&#64;eficent.com">jordi.ballester&#64;eficent.com</a>&gt;</li>
<li>Chandresh Thakkar &lt;<a class="reference external" href="mailto:chandresh.thakkar.serpentcs&#64;gmail.com">chandresh.thakkar.serpentcs&#64;gmail.com</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">
@@ -495,7 +496,7 @@ mission is to support the collaborative development of Odoo features and
promote its widespread use.</p>
<p>Current <a class="reference external" href="https://odoo-community.org/page/maintainer-role">maintainer</a>:</p>
<p><a class="reference external" href="https://github.com/lreficent"><img alt="lreficent" src="https://github.com/lreficent.png?size=40px" /></a></p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/manufacture/tree/12.0/mrp_production_request">OCA/manufacture</a> project on GitHub.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/manufacture/tree/13.0/mrp_production_request">OCA/manufacture</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>

View File

@@ -4,6 +4,7 @@
from odoo import fields
from odoo.exceptions import UserError
from odoo.tests.common import TransactionCase
from odoo.tools import mute_logger
class TestMrpProductionRequest(TransactionCase):
@@ -80,28 +81,33 @@ class TestMrpProductionRequest(TransactionCase):
)
# Create Procurement Group:
self.test_group = self.group_model.create({"name": "TEST",})
self.test_group = self.group_model.create({"name": "TEST"})
# Create User:
self.test_user = self.env["res.users"].create(
{"name": "John", "login": "test",}
)
self.test_user = self.env["res.users"].create({"name": "John", "login": "test"})
def procure(
self, group, product, qty=4.0,
):
def procure(self, group, product, qty=4.0):
warehouse = self.env["stock.warehouse"].search(
[("company_id", "=", self.env.user.id)], limit=1
)
values = {
"date_planned": fields.Datetime.now(),
"group_id": group,
"warehouse_id": warehouse,
}
self.group_model.run(
product,
qty,
product.uom_id,
self.stock_loc,
group.name,
group.name,
values,
[
self.test_group.Procurement(
product,
qty,
product.uom_id,
self.stock_loc,
group.name,
group.name,
warehouse.company_id,
values,
)
]
)
return True
@@ -130,7 +136,7 @@ class TestMrpProductionRequest(TransactionCase):
[("mrp_production_request_id", "=", request.id)]
)
self.assertTrue(mo, "No MO created.")
self.assertEqual(request.pending_qty, 0.0)
self.assertEqual(request.pending_qty, 4.0)
request.button_done()
def test_02_assignation(self):
@@ -150,27 +156,29 @@ class TestMrpProductionRequest(TransactionCase):
self.product.product_tmpl_id,
"Wrong Bill of Materials.",
)
request.write(
{"assigned_to": self.uid,}
)
request.write({"assigned_to": self.uid})
self.assertTrue(request.message_follower_ids, "Followers not added correctly.")
def test_03_substract_qty_from_orderpoint(self):
"""Quantity in Manufacturing Requests should be considered by
orderpoints."""
request = self.request_model.search(
[("product_id", "=", self.product_orderpoint.id),]
[("product_id", "=", self.product_orderpoint.id)]
)
self.assertFalse(request)
self.env["procurement.group"].run_scheduler()
# self.env['procurement.group'].run_scheduler()
with mute_logger("odoo.addons.stock.models.stock_rule"):
self.env["procurement.group"].run_scheduler()
request = self.request_model.search(
[("product_id", "=", self.product_orderpoint.id),]
[("product_id", "=", self.product_orderpoint.id)]
)
self.assertEqual(len(request), 1)
# Running again the scheduler should not generate a new MR.
self.env["procurement.group"].run_scheduler()
# self.env['procurement.group'].run_scheduler()
with mute_logger("odoo.addons.stock.models.stock_rule"):
self.env["procurement.group"].run_scheduler()
request = self.request_model.search(
[("product_id", "=", self.product_orderpoint.id),]
[("product_id", "=", self.product_orderpoint.id)]
)
self.assertEqual(len(request), 1)

View File

@@ -2,33 +2,33 @@
<!-- Copyright 2017-18 Eficent Business and IT Consulting Services S.L.
License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl-3.0) -->
<odoo>
<record model="ir.ui.view" id="view_mrp_production_request_form">
<record id="view_mrp_production_request_form" model="ir.ui.view">
<field name="name">mrp.production.request.form</field>
<field name="model">mrp.production.request</field>
<field name="arch" type="xml">
<form string="Manufacturing Request">
<header>
<button
groups="mrp_production_request.group_mrp_production_request_manager"
name="button_draft"
states="to_approve,approved,cancel,done"
string="Reset"
type="object"
groups="mrp_production_request.group_mrp_production_request_manager"
/>
<button
class="oe_highlight"
name="button_to_approve"
states="draft"
string="Request approval"
type="object"
class="oe_highlight"
/>
<button
class="oe_highlight"
groups="mrp_production_request.group_mrp_production_request_manager"
name="button_approved"
states="to_approve"
string="Approve"
type="object"
class="oe_highlight"
groups="mrp_production_request.group_mrp_production_request_manager"
/>
<button
name="%(mrp_production_request_create_mo_action)d"
@@ -37,39 +37,39 @@
type="action"
/>
<button
class="oe_highlight"
groups="mrp_production_request.group_mrp_production_request_manager"
name="button_done"
states="approved"
string="Done"
type="object"
class="oe_highlight"
groups="mrp_production_request.group_mrp_production_request_manager"
/>
<button
groups="mrp_production_request.group_mrp_production_request_manager"
name="button_cancel"
states="to_approve,approved"
string="Reject"
type="object"
groups="mrp_production_request.group_mrp_production_request_manager"
/>
<field
name="state"
widget="statusbar"
statusbar_visible="draft,approved,done"
widget="statusbar"
/>
</header>
<sheet>
<div class="oe_button_box" name="button_box">
<button
type="object"
name="action_view_mrp_productions"
attrs="{'invisible': [('mrp_production_count', '=', 0)]}"
class="oe_stat_button"
icon="fa-wrench"
attrs="{'invisible': [('mrp_production_count', '=', 0)]}"
name="action_view_mrp_productions"
type="object"
>
<field
name="mrp_production_count"
widget="statinfo"
string="MOs"
widget="statinfo"
/>
</button>
</div>
@@ -80,15 +80,13 @@
<group name="request">
<group>
<field
name="product_id"
domain="[('bom_ids','!=',False),('bom_ids.type','!=','phantom')]"
name="product_id"
/>
<field name="product_tmpl_id" invisible="1" />
<field invisible="1" name="product_tmpl_id" />
<field
domain="['&amp;', '|', ('product_id','=',product_id), '&amp;', ('product_tmpl_id.product_variant_ids','=',product_id), ('product_id','=',False), ('type', '=', 'normal')]"
name="bom_id"
domain="['&amp;', '|', ('product_id','=',product_id),
'&amp;', ('product_tmpl_id.product_variant_ids','=',product_id),
('product_id','=',False), ('type', '=', 'normal')]"
/>
</group>
<group>
@@ -96,8 +94,8 @@
<field name="done_qty" />
<field name="manufactured_qty" />
<field name="pending_qty" />
<field name="product_uom_id" groups="uom.group_uom" />
<field name="category_uom_id" invisible="1" />
<field groups="uom.group_uom" name="product_uom_id" />
<field invisible="1" name="category_uom_id" />
</group>
</group>
<group>
@@ -136,7 +134,7 @@
</form>
</field>
</record>
<record model="ir.ui.view" id="view_mrp_production_request_tree">
<record id="view_mrp_production_request_tree" model="ir.ui.view">
<field name="name">mrp.production.request.tree</field>
<field name="model">mrp.production.request</field>
<field name="arch" type="xml">
@@ -152,8 +150,8 @@
<field name="product_qty" />
<field name="pending_qty" />
<field
name="company_id"
groups="base.group_multi_company"
name="company_id"
widget="selection"
/>
<field name="origin" />
@@ -175,122 +173,121 @@
<field name="assigned_to" />
<field name="origin" />
<field name="state" />
<field name="pending_qty" invisible="1" />
<field invisible="1" name="pending_qty" />
<!--Filters:-->
<filter
name="unassigned"
string="Unassigned"
domain="[('assigned_to','=', False)]"
help="Unassigned Request"
name="unassigned"
string="Unassigned"
/>
<filter
name="assigned_to_me"
domain="[('assigned_to','=', uid)]"
name="assigned_to_me"
string="Assigned to me"
/>
<filter
name="requested_by_me"
domain="[('requested_by','=', uid)]"
string="My requests"
help="Requested by me"
name="requested_by_me"
string="My requests"
/>
<separator />
<filter
name="pending"
domain="[('pending_qty','!=', 0.0)]"
string="Pending Qty"
help="Request with pending quantity"
name="pending"
string="Pending Qty"
/>
<separator />
<filter
name="todo"
string="To Do"
domain="[('state','in',('draft', 'to_approve','approved'))]"
help="Manufacturing Requests not done or cancelled."
name="todo"
string="To Do"
/>
<separator />
<filter
name="state_draft"
string="Draft"
domain="[('state','=','draft')]"
help="Request is to be approved"
name="state_draft"
string="Draft"
/>
<filter
name="state_to_approve"
string="To Approve"
domain="[('state','=','to_approve')]"
help="Request is to be approved"
name="state_to_approve"
string="To Approve"
/>
<filter
name="state_approved"
string="Approved"
domain="[('state','=','approved')]"
help="Request is approved"
name="state_approved"
string="Approved"
/>
<filter
name="state_cancel"
string="Cancelled"
domain="[('state','=','cancel')]"
help="Request is cancelled"
name="state_cancel"
string="Cancelled"
/>
<filter
name="state_done"
string="Done"
domain="[('state','=','done')]"
help="Request is done"
name="state_done"
string="Done"
/>
<separator />
<filter
domain="[('message_needaction','=',True)]"
name="message_needaction"
string="Unread Messages"
domain="[('message_needaction','=',True)]"
/>
<!--Group by:-->
<filter
context="{'group_by':'requested_by'}"
domain="[]"
icon="terp-personal"
name="requested_by_group_by"
string="Requested by"
icon="terp-personal"
domain="[]"
context="{'group_by':'requested_by'}"
/>
<filter
context="{'group_by':'assigned_to'}"
domain="[]"
icon="terp-personal"
name="assign_to_group_by"
string="Assigned to"
icon="terp-personal"
domain="[]"
context="{'group_by':'assigned_to'}"
/>
<filter
context="{'group_by':'origin'}"
domain="[]"
name="origin_group_by"
string="Source"
domain="[]"
context="{'group_by':'origin'}"
/>
</search>
</field>
</record>
<record model="ir.actions.act_window" id="mrp_production_request_action">
<record id="mrp_production_request_action" model="ir.actions.act_window">
<field name="name">Manufacturing Requests</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">mrp.production.request</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="context">{"search_default_todo":1}</field>
<field name="context">{&quot;search_default_todo&quot;:1}</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
Click to start a new manufacturing request process.
<p
class="oe_view_nocontent_create"
>Click to start a new manufacturing request process.
</p>
<p>
A Manufacturing Request is an instruction to production to produce
<p>A Manufacturing Request is an instruction to production to produce
a certain quantity of a given product.
</p>
</field>
</record>
<menuitem
id="menu_mrp_production_request_act"
sequence="10"
parent="mrp.menu_mrp_manufacturing"
action="mrp_production_request_action"
id="menu_mrp_production_request_act"
parent="mrp.menu_mrp_manufacturing"
sequence="10"
/>
<!--Sever actions-->
<record id="action_server_mrp_production_request_refresh" model="ir.actions.server">

View File

@@ -7,9 +7,11 @@
<field name="model">mrp.production</field>
<field name="inherit_id" ref="mrp.mrp_production_form_view" />
<field name="arch" type="xml">
<field name="availability" position="after">
<field name="mrp_production_request_id" />
</field>
<xpath expr="//form/sheet/notebook/page[3]/group" position="after">
<group>
<field name="mrp_production_request_id" />
</group>
</xpath>
</field>
</record>
</odoo>

View File

@@ -2,7 +2,7 @@
<!-- Copyright 2017 Eficent Business and IT Consulting Services S.L.
License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl-3.0) -->
<odoo>
<record model="ir.ui.view" id="view_template_property_form">
<record id="view_template_property_form" model="ir.ui.view">
<field name="name">product.template.form - mrp_production_request</field>
<field name="model">product.template</field>
<field name="inherit_id" ref="stock.view_template_property_form" />

View File

@@ -4,14 +4,11 @@
from odoo import _, api, fields, models
from odoo.exceptions import UserError
import odoo.addons.decimal_precision as dp
class MrpProductionRequestCreateMo(models.TransientModel):
_name = "mrp.production.request.create.mo"
_description = "Wizard to create Manufacturing Orders"
@api.multi
def compute_product_line_ids(self):
self.product_line_ids.unlink()
res = self._prepare_lines()
@@ -42,7 +39,6 @@ class MrpProductionRequestCreateMo(models.TransientModel):
self.mrp_production_request_id.product_id, factor / bom_point.product_qty
)
@api.multi
def _get_mo_qty(self):
"""Propose a qty to create a MO available to produce."""
for rec in self:
@@ -54,12 +50,10 @@ class MrpProductionRequestCreateMo(models.TransientModel):
comodel_name="mrp.production.request", readonly=True
)
bom_id = fields.Many2one(related="mrp_production_request_id.bom_id", readonly=True)
mo_qty = fields.Float(
string="Quantity", digits=dp.get_precision("Product Unit of Measure")
)
mo_qty = fields.Float(string="Quantity", digits="Product Unit of Measure")
pending_qty = fields.Float(
related="mrp_production_request_id.pending_qty",
digits=dp.get_precision("Product Unit of Measure"),
digits="Product Unit of Measure",
)
product_uom_id = fields.Many2one(related="mrp_production_request_id.product_uom_id")
product_line_ids = fields.One2many(
@@ -68,8 +62,8 @@ class MrpProductionRequestCreateMo(models.TransientModel):
inverse_name="mrp_production_request_create_mo_id",
readonly=True,
)
date_planned_start = fields.Datetime(string="Deadline Start", required=True,)
date_planned_finished = fields.Datetime(string="Deadline End", required=True,)
date_planned_start = fields.Datetime(string="Deadline Start", required=True)
date_planned_finished = fields.Datetime(string="Deadline End", required=True)
@api.model
def default_get(self, fields):
@@ -102,7 +96,6 @@ class MrpProductionRequestCreateMo(models.TransientModel):
"location_id": self.mrp_production_request_id.location_src_id.id,
}
@api.multi
def _prepare_manufacturing_order(self):
self.ensure_one()
request_id = self.mrp_production_request_id
@@ -120,11 +113,10 @@ class MrpProductionRequestCreateMo(models.TransientModel):
"date_planned_start": self.date_planned_start,
"date_planned_finished": self.date_planned_finished,
"procurement_group_id": request_id.procurement_group_id.id,
"propagate": request_id.propagate,
"propagate_cancel": request_id.propagate,
"company_id": request_id.company_id.id,
}
@api.multi
def create_mo(self):
self.ensure_one()
vals = self._prepare_manufacturing_order()
@@ -133,7 +125,7 @@ class MrpProductionRequestCreateMo(models.TransientModel):
action = self.env.ref("mrp.mrp_production_action").read()[0]
res = self.env.ref("mrp.mrp_production_form_view")
action.update(
{"res_id": mo and mo.id, "views": [(res and res.id or False, "form")],}
{"res_id": mo and mo.id, "views": [(res and res.id or False, "form")]}
)
return action
@@ -142,7 +134,6 @@ class MrpProductionRequestCreateMoLine(models.TransientModel):
_name = "mrp.production.request.create.mo.line"
_description = "Wizard to create Manufacturing Orders Line"
@api.multi
def _compute_available_qty(self):
for rec in self:
product_available = rec.product_id.with_context(
@@ -155,7 +146,6 @@ class MrpProductionRequestCreateMoLine(models.TransientModel):
)
rec.available_qty = res
@api.multi
def _compute_bottle_neck_factor(self):
for rec in self:
if rec.product_qty:
@@ -165,9 +155,7 @@ class MrpProductionRequestCreateMoLine(models.TransientModel):
comodel_name="product.product", string="Product", required=True
)
product_qty = fields.Float(
string="Quantity Required",
required=True,
digits=dp.get_precision("Product Unit of Measure"),
string="Quantity Required", required=True, digits="Product Unit of Measure"
)
product_uom_id = fields.Many2one(
comodel_name="uom.uom", string="UoM", required=True
@@ -178,7 +166,7 @@ class MrpProductionRequestCreateMoLine(models.TransientModel):
available_qty = fields.Float(
string="Quantity Available",
compute="_compute_available_qty",
digits=dp.get_precision("Product Unit of Measure"),
digits="Product Unit of Measure",
)
bottle_neck_factor = fields.Float(compute="_compute_bottle_neck_factor")
location_id = fields.Many2one(comodel_name="stock.location", required=True)

View File

@@ -1,6 +1,3 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2017 Eficent Business and IT Consulting Services S.L.
License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl-3.0) -->
<odoo>
<record id="mrp_production_request_create_mo_view" model="ir.ui.view">
<field name="name">mrp.production.request.create.mo.form</field>
@@ -68,7 +65,6 @@
<record id="mrp_production_request_create_mo_action" model="ir.actions.act_window">
<field name="name">Create Manufacturing Order</field>
<field name="res_model">mrp.production.request.create.mo</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>