123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- # -*- 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
|