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