mirror of
https://github.com/OCA/manufacture.git
synced 2025-01-28 16:37:15 +02:00
131 lines
4.1 KiB
Python
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)
|