diff options
Diffstat (limited to 'addons/stock/models/product_strategy.py')
| -rw-r--r-- | addons/stock/models/product_strategy.py | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/addons/stock/models/product_strategy.py b/addons/stock/models/product_strategy.py new file mode 100644 index 00000000..5606fb9f --- /dev/null +++ b/addons/stock/models/product_strategy.py @@ -0,0 +1,88 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import _, api, fields, models +from odoo.exceptions import UserError + + +class RemovalStrategy(models.Model): + _name = 'product.removal' + _description = 'Removal Strategy' + + name = fields.Char('Name', required=True) + method = fields.Char("Method", required=True, help="FIFO, LIFO...") + + +class StockPutawayRule(models.Model): + _name = 'stock.putaway.rule' + _order = 'sequence,product_id' + _description = 'Putaway Rule' + _check_company_auto = True + + def _default_category_id(self): + if self.env.context.get('active_model') == 'product.category': + return self.env.context.get('active_id') + + def _default_location_id(self): + if self.env.context.get('active_model') == 'stock.location': + return self.env.context.get('active_id') + + def _default_product_id(self): + if self.env.context.get('active_model') == 'product.template' and self.env.context.get('active_id'): + product_template = self.env['product.template'].browse(self.env.context.get('active_id')) + product_template = product_template.exists() + if product_template.product_variant_count == 1: + return product_template.product_variant_id + elif self.env.context.get('active_model') == 'product.product': + return self.env.context.get('active_id') + + def _domain_category_id(self): + active_model = self.env.context.get('active_model') + if active_model in ('product.template', 'product.product') and self.env.context.get('active_id'): + product = self.env[active_model].browse(self.env.context.get('active_id')) + product = product.exists() + if product: + return [('id', '=', product.categ_id.id)] + return [] + + def _domain_product_id(self): + domain = "[('type', '!=', 'service'), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" + if self.env.context.get('active_model') == 'product.template': + return [('product_tmpl_id', '=', self.env.context.get('active_id'))] + return domain + + product_id = fields.Many2one( + 'product.product', 'Product', check_company=True, + default=_default_product_id, domain=_domain_product_id, ondelete='cascade') + category_id = fields.Many2one('product.category', 'Product Category', + default=_default_category_id, domain=_domain_category_id, ondelete='cascade') + location_in_id = fields.Many2one( + 'stock.location', 'When product arrives in', check_company=True, + domain="[('child_ids', '!=', False), '|', ('company_id', '=', False), ('company_id', '=', company_id)]", + default=_default_location_id, required=True, ondelete='cascade') + location_out_id = fields.Many2one( + 'stock.location', 'Store to', check_company=True, + domain="[('id', 'child_of', location_in_id), ('id', '!=', location_in_id), '|', ('company_id', '=', False), ('company_id', '=', company_id)]", + required=True, ondelete='cascade') + sequence = fields.Integer('Priority', help="Give to the more specialized category, a higher priority to have them in top of the list.") + company_id = fields.Many2one( + 'res.company', 'Company', required=True, + default=lambda s: s.env.company.id, index=True) + + @api.onchange('location_in_id') + def _onchange_location_in(self): + if self.location_out_id: + child_location_count = self.env['stock.location'].search_count([ + ('id', '=', self.location_out_id.id), + ('id', 'child_of', self.location_in_id.id), + ('id', '!=', self.location_in_id.id), + ]) + if not child_location_count: + self.location_out_id = None + + def write(self, vals): + if 'company_id' in vals: + for rule in self: + if rule.company_id.id != vals['company_id']: + raise UserError(_("Changing the company of this record is forbidden at this point, you should rather archive it and create a new one.")) + return super(StockPutawayRule, self).write(vals) |
