summaryrefslogtreecommitdiff
path: root/addons/stock/models/product_strategy.py
diff options
context:
space:
mode:
Diffstat (limited to 'addons/stock/models/product_strategy.py')
-rw-r--r--addons/stock/models/product_strategy.py88
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)