summaryrefslogtreecommitdiff
path: root/addons/stock/wizard/product_replenish.py
diff options
context:
space:
mode:
Diffstat (limited to 'addons/stock/wizard/product_replenish.py')
-rw-r--r--addons/stock/wizard/product_replenish.py89
1 files changed, 89 insertions, 0 deletions
diff --git a/addons/stock/wizard/product_replenish.py b/addons/stock/wizard/product_replenish.py
new file mode 100644
index 00000000..ff697299
--- /dev/null
+++ b/addons/stock/wizard/product_replenish.py
@@ -0,0 +1,89 @@
+# -*- 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='Unity 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.location.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.model
+ def default_get(self, fields):
+ res = super(ProductReplenish, self).default_get(fields)
+ product_tmpl_id = self.env['product.template']
+ if 'product_id' in fields:
+ 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
+ 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'])
+ 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)
+ 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({
+ 'partner_id': self.product_id.with_company(self.company_id).responsible_id.partner_id.id,
+ })
+
+ values = {
+ 'warehouse_id': self.warehouse_id,
+ 'route_ids': self.route_ids,
+ 'date_planned': self.date_planned,
+ 'group_id': replenishment,
+ }
+ return values