Files
manufacture/mrp_multi_level/wizards/mrp_inventory_procure.py
Lois Rilo d750aae31b [12.0][MIG] mrp_multi_level:
* You can know integrate with different forecasting mechanisms.
  As a consequence integration with stock_demand_estimate is moved
  to a new module (mrp_multi_level_estimate).
* As agreed by the authors, the module is re-licensed to LGPL-3.
2024-12-04 09:42:25 +05:30

145 lines
5.2 KiB
Python

# Copyright 2018-19 Eficent Business and IT Consulting Services S.L.
# (http://www.eficent.com)
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html).
from odoo import api, fields, models, _
from odoo.exceptions import UserError, ValidationError
class MrpInventoryProcure(models.TransientModel):
_name = 'mrp.inventory.procure'
_description = 'Make Procurements from MRP inventory projections'
item_ids = fields.One2many(
comodel_name='mrp.inventory.procure.item',
inverse_name='wiz_id',
string='Items',
)
@api.model
def _prepare_item(self, planned_order):
return {
'planned_order_id': planned_order.id,
'qty': planned_order.mrp_qty - planned_order.qty_released,
'uom_id': planned_order.mrp_inventory_id.uom_id.id,
'date_planned': planned_order.due_date,
'mrp_inventory_id': planned_order.mrp_inventory_id.id,
'product_id': planned_order.product_id.id,
'warehouse_id': planned_order.mrp_area_id.warehouse_id.id,
'location_id':
planned_order.product_mrp_area_id.location_proc_id.id or
planned_order.mrp_area_id.location_id.id,
}
@api.model
def fields_view_get(self, view_id=None, view_type='form', toolbar=False,
submenu=False):
if self.user_has_groups(
"mrp_multi_level.group_change_mrp_procure_qty"):
view_id = self.env.ref(
'mrp_multi_level.'
'view_mrp_inventory_procure_wizard').id
else:
view_id = self.env.ref(
'mrp_multi_level.'
'view_mrp_inventory_procure_without_security').id
return super(MrpInventoryProcure, self).fields_view_get(
view_id=view_id, view_type=view_type, toolbar=toolbar,
submenu=submenu)
@api.model
def default_get(self, fields):
res = super(MrpInventoryProcure, self).default_get(fields)
mrp_inventory_obj = self.env['mrp.inventory']
mrp_inventory_ids = self.env.context['active_ids'] or []
active_model = self.env.context['active_model']
if not mrp_inventory_ids or 'item_ids' not in fields:
return res
assert active_model == 'mrp.inventory', 'Bad context propagation'
items = item_obj = self.env['mrp.inventory.procure.item']
for line in mrp_inventory_obj.browse(mrp_inventory_ids).mapped(
'planned_order_ids'):
if line.qty_released < line.mrp_qty:
items += item_obj.create(self._prepare_item(line))
res['item_ids'] = [(6, 0, items.ids)]
return res
@api.multi
def make_procurement(self):
self.ensure_one()
errors = []
for item in self.item_ids:
if not item.qty:
raise ValidationError(_("Quantity must be positive."))
values = item._prepare_procurement_values()
# Run procurement
try:
self.env['procurement.group'].run(
item.product_id,
item.qty,
item.uom_id,
item.location_id,
'INT: ' + str(self.env.user.login), # name?
'INT: ' + str(self.env.user.login), # origin?
values
)
item.planned_order_id.qty_released += item.qty
except UserError as error:
errors.append(error.name)
if errors:
raise UserError('\n'.join(errors))
return {'type': 'ir.actions.act_window_close'}
class MrpInventoryProcureItem(models.TransientModel):
_name = 'mrp.inventory.procure.item'
_description = "MRP Inventory procure item"
wiz_id = fields.Many2one(
comodel_name='mrp.inventory.procure', string='Wizard',
ondelete='cascade', readonly=True,
)
qty = fields.Float(string='Quantity')
uom_id = fields.Many2one(
string='Unit of Measure',
comodel_name='uom.uom',
)
date_planned = fields.Date(string='Planned Date', required=False)
mrp_inventory_id = fields.Many2one(
string='Mrp Inventory',
comodel_name='mrp.inventory',
)
planned_order_id = fields.Many2one(
comodel_name='mrp.planned.order',
)
product_id = fields.Many2one(
string='Product',
comodel_name='product.product',
)
warehouse_id = fields.Many2one(
string='Warehouse',
comodel_name='stock.warehouse',
)
location_id = fields.Many2one(
string='Location',
comodel_name='stock.location',
)
def _prepare_procurement_values(self, group=False):
return {
'date_planned': fields.Datetime.to_string(
fields.Date.from_string(self.date_planned)),
'warehouse_id': self.warehouse_id,
# 'company_id': self.company_id, # TODO: consider company
'group_id': group,
}
@api.multi
@api.onchange('uom_id')
def onchange_uom_id(self):
for rec in self:
rec.qty = rec.mrp_inventory_id.uom_id._compute_quantity(
rec.mrp_inventory_id.to_procure, rec.uom_id)