[15.0][IMP] stock_cycle_count: add auto complete into cron

This commit is contained in:
ArnauCForgeFlow
2024-04-17 16:09:25 +02:00
parent 54c9af40ff
commit 5c67fbb7c8
7 changed files with 85 additions and 11 deletions

View File

@@ -32,6 +32,21 @@ class StockCycleCount(models.Model):
readonly=True,
states={"draft": [("readonly", False)]},
tracking=True,
compute="_compute_date_deadline",
inverse="_inverse_date_deadline",
store=True,
)
automatic_deadline_date = fields.Date(
string="Automatic Required Date",
readonly=True,
states={"draft": [("readonly", False)]},
tracking=True,
)
manual_deadline_date = fields.Date(
string="Manual Required Date",
readonly=True,
states={"draft": [("readonly", False)]},
tracking=True,
)
cycle_count_rule_id = fields.Many2one(
comodel_name="stock.cycle.count.rule",
@@ -124,3 +139,15 @@ class StockCycleCount(models.Model):
action["views"] = [(res and res.id or False, "form")]
action["res_id"] = adjustment_ids and adjustment_ids[0] or False
return action
@api.depends("automatic_deadline_date", "manual_deadline_date")
def _compute_date_deadline(self):
for rec in self:
if rec.manual_deadline_date:
rec.date_deadline = rec.manual_deadline_date
else:
rec.date_deadline = rec.automatic_deadline_date
def _inverse_date_deadline(self):
for rec in self:
rec.manual_deadline_date = rec.date_deadline

View File

@@ -172,7 +172,7 @@ class StockCycleCountRule(models.Model):
.search(
[
("location_ids", "in", [loc.id]),
("state", "in", ["confirm", "done", "draft"]),
("state", "in", ["in_progress", "done", "draft"]),
],
order="date desc",
limit=1,

View File

@@ -144,3 +144,13 @@ class StockInventory(models.Model):
message=msg,
)
)
def action_state_to_in_progress(self):
res = super().action_state_to_in_progress()
self.stock_quant_ids.update(
{
"user_id": self.cycle_count_id.responsible_id,
"inventory_date": self.cycle_count_id.date_deadline,
}
)
return res

View File

@@ -106,7 +106,7 @@ class StockLocation(models.Model):
)
self.env["stock.cycle.count"].create(
{
"date_deadline": date,
"automatic_deadline_date": date,
"location_id": self.id,
"cycle_count_rule_id": rule.id,
"state": "draft",

View File

@@ -70,7 +70,7 @@ class StockWarehouse(models.Model):
@api.model
def _prepare_cycle_count(self, cycle_count_proposed):
return {
"date_deadline": cycle_count_proposed["date"],
"automatic_deadline_date": cycle_count_proposed["date"],
"location_id": cycle_count_proposed["location"].id,
"cycle_count_rule_id": cycle_count_proposed["rule_type"].id,
"state": "draft",
@@ -133,7 +133,7 @@ class StockWarehouse(models.Model):
)
cc_to_update.write(
{
"date_deadline": cycle_count_proposed_date,
"automatic_deadline_date": cycle_count_proposed_date,
"cycle_count_rule_id": cycle_count_proposed["rule_type"].id,
}
)
@@ -144,6 +144,24 @@ class StockWarehouse(models.Model):
try:
whs = self.search([])
whs.action_compute_cycle_count_rules()
today = fields.Date.today()
cycle_counts = self.env["stock.cycle.count"].search(
[("date_deadline", "<=", today), ("state", "=", "draft")]
)
for cycle_count in cycle_counts:
open_cycle_counts = self.env["stock.cycle.count"].search(
[
("location_id", "=", cycle_count.location_id.id),
("state", "=", "open"),
]
)
if open_cycle_counts:
continue
cycle_count.action_create_inventory_adjustment()
try:
cycle_count.stock_adjustment_ids.action_state_to_in_progress()
except Exception as e:
_logger.info("Error when beginning an adjustment: %s", str(e))
except Exception as e:
_logger.info("Error while running stock_cycle_count cron job: %s", str(e))
raise

View File

@@ -153,7 +153,7 @@ class TestStockCycleCount(common.TransactionCase):
"name": "To be cancelled when running cron job.",
"cycle_count_rule_id": self.rule_periodic.id,
"location_id": loc.id,
"date_deadline": date_pre_existing_cc,
"automatic_deadline_date": date_pre_existing_cc,
}
)
self.assertEqual(
@@ -188,14 +188,32 @@ class TestStockCycleCount(common.TransactionCase):
move1._action_assign()
move1.move_line_ids[0].qty_done = 1.0
move1._action_done()
# Remove the pre_existing_count
self.inventory_model.search(
[("cycle_count_id", "=", pre_existing_count.id)], limit=1
).unlink()
pre_existing_count.unlink()
# Execute cron for first time
wh.cron_cycle_count()
self.assertNotEqual(
pre_existing_count.date_deadline,
date_pre_existing_cc,
"Date of pre-existing cycle counts has not been " "updated.",
# There are counts in state open(execution) and not in state draft
open_counts = self.cycle_count_model.search(
[("location_id", "in", locs.ids), ("state", "=", "open")]
)
counts = self.cycle_count_model.search([("location_id", "in", locs.ids)])
self.assertTrue(counts, "Cycle counts not planned")
self.assertTrue(open_counts, "Cycle counts in execution state")
draft_counts = self.cycle_count_model.search(
[("location_id", "in", locs.ids), ("state", "=", "draft")]
)
self.assertFalse(draft_counts, "No Cycle counts in draft state")
# Execute the cron for second time
wh.cron_cycle_count()
# New cycle counts for same location created in draft state
draft_counts = self.cycle_count_model.search(
[("location_id", "in", locs.ids), ("state", "=", "draft")]
)
self.assertTrue(draft_counts, "No Cycle counts in draft state")
# Inventory adjustment only started for cycle counts in open state
self.assertTrue(open_counts.stock_adjustment_ids)
self.assertFalse(draft_counts.stock_adjustment_ids)
# Zero-confirmations:
count = self.cycle_count_model.search(
[

View File

@@ -10,6 +10,7 @@
<tree
decoration-muted="state == 'cancelled'"
decoration-info="state == 'draft'"
multi_edit="1"
>
<field name="name" />
<field name="location_id" />