mirror of
https://github.com/OCA/manufacture.git
synced 2025-01-28 16:37:15 +02:00
[IMP] Improved the code as per v13.
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
* Lois Rilo Antelo <lois.rilo@eficent.com>
|
||||
* Jordi Ballester <jordi.ballester@eficent.com>
|
||||
* Chandresh Thakkar <chandresh.thakkar.serpentcs@gmail.com>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 <<a class="reference external" href="mailto:lois.rilo@eficent.com">lois.rilo@eficent.com</a>></li>
|
||||
<li>Jordi Ballester <<a class="reference external" href="mailto:jordi.ballester@eficent.com">jordi.ballester@eficent.com</a>></li>
|
||||
<li>Chandresh Thakkar <<a class="reference external" href="mailto:chandresh.thakkar.serpentcs@gmail.com">chandresh.thakkar.serpentcs@gmail.com</a>></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>
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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="['&', '|', ('product_id','=',product_id), '&', ('product_tmpl_id.product_variant_ids','=',product_id), ('product_id','=',False), ('type', '=', 'normal')]"
|
||||
name="bom_id"
|
||||
domain="['&', '|', ('product_id','=',product_id),
|
||||
'&', ('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">{"search_default_todo":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">
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user