diff --git a/stock_inventory/__manifest__.py b/stock_inventory/__manifest__.py
index 42e10fb24356..2121d8d1bb7a 100644
--- a/stock_inventory/__manifest__.py
+++ b/stock_inventory/__manifest__.py
@@ -11,6 +11,7 @@
"depends": ["stock"],
"data": [
"security/ir.model.access.csv",
+ "security/security.xml",
"views/stock_inventory.xml",
"views/stock_quant.xml",
"views/stock_move_line.xml",
diff --git a/stock_inventory/models/stock_inventory.py b/stock_inventory/models/stock_inventory.py
index f237057dbadf..6bc8179a8002 100644
--- a/stock_inventory/models/stock_inventory.py
+++ b/stock_inventory/models/stock_inventory.py
@@ -12,6 +12,14 @@ class InventoryAdjustmentsGroup(models.Model):
date = fields.Datetime(default=lambda self: fields.Datetime.now())
+ company_id = fields.Many2one(
+ comodel_name="res.company",
+ readonly=True,
+ index=True,
+ states={"draft": [("readonly", False)]},
+ default=lambda self: self.env.company,
+ )
+
state = fields.Selection(
[("draft", "Draft"), ("in_progress", "In Progress"), ("done", "Done")],
default="draft",
@@ -22,7 +30,9 @@ class InventoryAdjustmentsGroup(models.Model):
)
location_ids = fields.Many2many(
- "stock.location", string="Locations", domain="[('usage', '=', 'internal')]"
+ "stock.location",
+ string="Locations",
+ domain="[('usage', '=', 'internal'),('company_id', '=', company_id)]",
)
product_selection = fields.Selection(
@@ -37,15 +47,22 @@ class InventoryAdjustmentsGroup(models.Model):
required=True,
)
- product_ids = fields.Many2many("product.product", string="Products")
+ product_ids = fields.Many2many(
+ "product.product", string="Products", domain="[('company_id', '=', company_id)]"
+ )
- stock_quant_ids = fields.Many2many("stock.quant", string="Inventory Adjustment")
+ stock_quant_ids = fields.Many2many(
+ "stock.quant",
+ string="Inventory Adjustment",
+ domain="[('company_id', '=', company_id)]",
+ )
category_id = fields.Many2one("product.category", string="Product Category")
lot_ids = fields.Many2many(
"stock.production.lot",
string="Lot/Serial Numbers",
+ domain="[('company_id', '=', company_id)]",
)
stock_move_ids = fields.One2many(
@@ -71,6 +88,13 @@ class InventoryAdjustmentsGroup(models.Model):
"the locations settled, not the child ones."
)
+ responsible_id = fields.Many2one(
+ comodel_name="res.users",
+ string="Assigned to",
+ tracking=True,
+ help="Specific responsible of Inventory Adjustment.",
+ )
+
@api.depends("stock_quant_ids")
def _compute_count_stock_quants(self):
self.count_stock_quants = len(self.stock_quant_ids)
@@ -162,8 +186,8 @@ def action_state_to_in_progress(self):
[
("state", "=", "in_progress"),
"|",
- ("location_ids", "in", self.location_ids.mapped("id")),
- ("location_ids", "in", self.location_ids.child_ids.ids),
+ ("location_ids", "in", self.location_ids.ids),
+ ("location_ids", "child_of", self.location_ids.ids),
],
limit=1,
)
@@ -176,12 +200,24 @@ def action_state_to_in_progress(self):
)
self.state = "in_progress"
self.refresh_stock_quant_ids()
- self.stock_quant_ids.update({"to_do": True})
+ self.stock_quant_ids.update(
+ {
+ "to_do": True,
+ "user_id": self.responsible_id,
+ "inventory_date": self.date,
+ }
+ )
return
def action_state_to_done(self):
self.state = "done"
- self.stock_quant_ids.update({"to_do": True})
+ self.stock_quant_ids.update(
+ {
+ "to_do": True,
+ "user_id": False,
+ "inventory_date": False,
+ }
+ )
return
def action_auto_state_to_done(self):
@@ -192,7 +228,13 @@ def action_auto_state_to_done(self):
def action_state_to_draft(self):
self.state = "draft"
- self.stock_quant_ids.update({"to_do": True})
+ self.stock_quant_ids.update(
+ {
+ "to_do": True,
+ "user_id": False,
+ "inventory_date": False,
+ }
+ )
self.stock_quant_ids = None
return
@@ -212,6 +254,31 @@ def action_view_stock_moves(self):
result["context"] = []
return result
+ @api.constrains("state", "location_ids")
+ def _check_inventory_in_progress_not_override(self):
+ inventories = self.search([("state", "=", "in_progress")])
+ for rec in inventories:
+ inventory = inventories.filtered(
+ lambda x: x.id != rec.id
+ and (
+ any(i in x.location_ids for i in rec.location_ids)
+ or (
+ any(
+ i in x.location_ids.child_internal_location_ids
+ for i in rec.location_ids
+ )
+ and not x.exclude_sublocation
+ )
+ )
+ )
+ if len(inventory) > 0:
+ raise ValidationError(
+ _(
+ "Cannot be more than one in progress inventory adjustment "
+ "affecting the same location at the same time."
+ )
+ )
+
@api.constrains("product_selection", "product_ids")
def _check_one_product_in_product_selection(self):
for rec in self:
diff --git a/stock_inventory/models/stock_quant.py b/stock_inventory/models/stock_quant.py
index bbd544d10e9f..a533890ffa13 100644
--- a/stock_inventory/models/stock_quant.py
+++ b/stock_inventory/models/stock_quant.py
@@ -15,7 +15,10 @@ def _apply_inventory(self):
.search([("state", "=", "in_progress")])
.filtered(
lambda x: rec.location_id in x.location_ids
- or rec.location_id in x.location_ids.child_ids
+ or (
+ rec.location_id in x.location_ids.child_internal_location_ids
+ and not x.exclude_sublocation
+ )
)
)
moves = record_moves.search(
diff --git a/stock_inventory/security/security.xml b/stock_inventory/security/security.xml
new file mode 100644
index 000000000000..11aab9b291b1
--- /dev/null
+++ b/stock_inventory/security/security.xml
@@ -0,0 +1,11 @@
+
+
+
+ Stock Inventory multi-company
+
+
+ ['|',('company_id','=',False),('company_id', 'in', company_ids)]
+
+
diff --git a/stock_inventory/views/stock_inventory.xml b/stock_inventory/views/stock_inventory.xml
index ae11b660aa65..fed3e75b6602 100644
--- a/stock_inventory/views/stock_inventory.xml
+++ b/stock_inventory/views/stock_inventory.xml
@@ -90,6 +90,8 @@
+
+
+
+
+
+