Files
manufacture/mrp_production_request/models/stock_rule.py
2020-04-03 17:28:00 +05:30

131 lines
4.1 KiB
Python

# 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 _, models
from odoo.exceptions import UserError
class StockRule(models.Model):
_inherit = "stock.rule"
def _prepare_mrp_production_request(
self,
product_id,
product_qty,
product_uom,
location_id,
name,
origin,
company_id,
values,
bom,
):
data = self._prepare_mo_vals(
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:
data["orderpoint_id"] = orderpoint.id
procurement_group = values.get("group_id")
if procurement_group:
data["procurement_group_id"] = procurement_group.id
return data
def _need_production_request(self, product_id, action="manufacture"):
return action == "manufacture" and product_id.mrp_production_request
def _run_production_request(
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."""
request_obj = self.env["mrp.production.request"]
request_obj_sudo = request_obj.sudo().with_context(
force_company=values["company_id"].id
)
bom = self._get_matching_bom(product_id, company_id, values)
if not bom:
raise UserError(
_(
"There is no Bill of Material found for the product %s. "
"Please define a Bill of Material for this product."
)
% (product_id.display_name,)
)
# create the MR as SUPERUSER because the current user may not
# have the rights to do it (mto product launched by a sale for example)
request = request_obj_sudo.create(
self._prepare_mrp_production_request(
product_id,
product_qty,
product_uom,
location_id,
name,
origin,
company_id,
values,
bom,
)
)
origin_production = (
values.get("move_dest_ids")
and values["move_dest_ids"][0].raw_material_production_id
or False
)
orderpoint = values.get("orderpoint_id")
if orderpoint:
request.message_post_with_view(
"mail.message_origin_link",
values={"self": request, "origin": orderpoint},
subtype_id=self.env.ref("mail.mt_note").id,
)
if origin_production:
request.message_post_with_view(
"mail.message_origin_link",
values={"self": request, "origin": origin_production},
subtype_id=self.env.ref("mail.mt_note").id,
)
return True
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(procurements)