93 lines
4.4 KiB
Python
93 lines
4.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
import datetime
|
|
|
|
from odoo import _, api, fields, models
|
|
from odoo.exceptions import UserError
|
|
from odoo.tools.misc import clean_context
|
|
|
|
|
|
class ProductReplenish(models.TransientModel):
|
|
_name = 'product.replenish'
|
|
_description = 'Product Replenish'
|
|
|
|
product_id = fields.Many2one('product.product', string='Product', required=True)
|
|
product_tmpl_id = fields.Many2one('product.template', string='Product Template', required=True)
|
|
product_has_variants = fields.Boolean('Has variants', default=False, required=True)
|
|
product_uom_category_id = fields.Many2one('uom.category', related='product_id.uom_id.category_id', readonly=True, required=True)
|
|
product_uom_id = fields.Many2one('uom.uom', string='Unit of measure', required=True)
|
|
quantity = fields.Float('Quantity', default=1, required=True)
|
|
date_planned = fields.Datetime('Scheduled Date', required=True, help="Date at which the replenishment should take place.")
|
|
warehouse_id = fields.Many2one(
|
|
'stock.warehouse', string='Warehouse', required=True,
|
|
domain="[('company_id', '=', company_id)]")
|
|
route_ids = fields.Many2many(
|
|
'stock.route', string='Preferred Routes',
|
|
help="Apply specific route(s) for the replenishment instead of product's default routes.",
|
|
domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]")
|
|
company_id = fields.Many2one('res.company')
|
|
|
|
@api.onchange('product_id')
|
|
def _onchange_product_id(self):
|
|
self.quantity = abs(self.product_id.virtual_available) if self.product_id.virtual_available < 0 else 1
|
|
|
|
@api.model
|
|
def default_get(self, fields):
|
|
res = super(ProductReplenish, self).default_get(fields)
|
|
product_tmpl_id = self.env['product.template']
|
|
if self.env.context.get('default_product_id'):
|
|
product_id = self.env['product.product'].browse(self.env.context['default_product_id'])
|
|
product_tmpl_id = product_id.product_tmpl_id
|
|
if 'product_id' in fields:
|
|
res['product_tmpl_id'] = product_id.product_tmpl_id.id
|
|
res['product_id'] = product_id.id
|
|
elif self.env.context.get('default_product_tmpl_id'):
|
|
product_tmpl_id = self.env['product.template'].browse(self.env.context['default_product_tmpl_id'])
|
|
if 'product_id' in fields:
|
|
res['product_tmpl_id'] = product_tmpl_id.id
|
|
res['product_id'] = product_tmpl_id.product_variant_id.id
|
|
if len(product_tmpl_id.product_variant_ids) > 1:
|
|
res['product_has_variants'] = True
|
|
company = product_tmpl_id.company_id or self.env.company
|
|
if 'product_uom_id' in fields:
|
|
res['product_uom_id'] = product_tmpl_id.uom_id.id
|
|
if 'company_id' in fields:
|
|
res['company_id'] = company.id
|
|
if 'warehouse_id' in fields and 'warehouse_id' not in res:
|
|
warehouse = self.env['stock.warehouse'].search([('company_id', '=', company.id)], limit=1)
|
|
res['warehouse_id'] = warehouse.id
|
|
if 'date_planned' in fields:
|
|
res['date_planned'] = datetime.datetime.now()
|
|
return res
|
|
|
|
def launch_replenishment(self):
|
|
uom_reference = self.product_id.uom_id
|
|
self.quantity = self.product_uom_id._compute_quantity(self.quantity, uom_reference, rounding_method='HALF-UP')
|
|
try:
|
|
self.env['procurement.group'].with_context(clean_context(self.env.context)).run([
|
|
self.env['procurement.group'].Procurement(
|
|
self.product_id,
|
|
self.quantity,
|
|
uom_reference,
|
|
self.warehouse_id.lot_stock_id, # Location
|
|
_("Manual Replenishment"), # Name
|
|
_("Manual Replenishment"), # Origin
|
|
self.warehouse_id.company_id,
|
|
self._prepare_run_values() # Values
|
|
)
|
|
])
|
|
except UserError as error:
|
|
raise UserError(error)
|
|
|
|
def _prepare_run_values(self):
|
|
replenishment = self.env['procurement.group'].create({})
|
|
|
|
values = {
|
|
'warehouse_id': self.warehouse_id,
|
|
'route_ids': self.route_ids,
|
|
'date_planned': self.date_planned,
|
|
'group_id': replenishment,
|
|
}
|
|
return values
|