diff --git a/shipment_advice/models/res_company.py b/shipment_advice/models/res_company.py
index df8c1ad0..530364ab 100644
--- a/shipment_advice/models/res_company.py
+++ b/shipment_advice/models/res_company.py
@@ -23,3 +23,4 @@ class ResCompany(models.Model):
"deliveries will be shipped by several trucks."
),
)
+ shipment_advice_auto_validate = fields.Boolean(string="Shipment Advice: Auto Validate")
diff --git a/shipment_advice/models/res_config_settings.py b/shipment_advice/models/res_config_settings.py
index 1bb6a241..c6e3dacc 100644
--- a/shipment_advice/models/res_config_settings.py
+++ b/shipment_advice/models/res_config_settings.py
@@ -10,3 +10,7 @@ class ResConfigSettings(models.TransientModel):
shipment_advice_outgoing_backorder_policy = fields.Selection(
related="company_id.shipment_advice_outgoing_backorder_policy", readonly=False
)
+ shipment_advice_auto_validate = fields.Boolean(
+ related="company_id.shipment_advice_auto_validate",
+ readonly=False
+ )
diff --git a/shipment_advice/models/shipment_advice.py b/shipment_advice/models/shipment_advice.py
index bfa8f368..c9bf1ebd 100644
--- a/shipment_advice/models/shipment_advice.py
+++ b/shipment_advice/models/shipment_advice.py
@@ -432,10 +432,27 @@ def action_done(self):
lambda m: m.state not in ("cancel", "done") and not m.quantity_done
)
moves_to_unplan.shipment_advice_id = False
- shipment.departure_date = fields.Datetime.now()
- shipment.state = "done"
+ shipment._action_done()
return True
+ def _action_done(self):
+ self.ensure_one()
+ self.write({"departure_date": fields.Datetime.now(), "state": "done"})
+
+ def _is_fully_done(self):
+ self.ensure_one()
+ for move in self.planned_move_ids:
+ if move.state not in ["cancel", "done"]:
+ return False
+ return True
+
+ def validate_when_fully_done(self):
+ """set the shipment advice to done if all the planned_move_ids
+ are done or cancel"""
+ for shipment in self:
+ if shipment._is_fully_done():
+ shipment._action_done()
+
def action_cancel(self):
for shipment in self:
if shipment.state not in ("confirmed", "in_progress"):
diff --git a/shipment_advice/models/stock_move.py b/shipment_advice/models/stock_move.py
index eafc69e9..6b6c1358 100644
--- a/shipment_advice/models/stock_move.py
+++ b/shipment_advice/models/stock_move.py
@@ -17,3 +17,13 @@ class StockMove(models.Model):
def _plan_in_shipment(self, shipment_advice):
"""Plan the moves into the given shipment advice."""
self.shipment_advice_id = shipment_advice
+
+ def _action_done(self, cancel_backorder=False):
+ res = super()._action_done(cancel_backorder=cancel_backorder)
+ shipment_advices = res.shipment_advice_id
+ for shipment_advice in shipment_advices:
+ if (shipment_advice.shipment_type != "incoming"
+ or not shipment_advice.company_id.shipment_advice_auto_validate):
+ continue
+ shipment_advice.validate_when_fully_done()
+ return res
diff --git a/shipment_advice/tests/common.py b/shipment_advice/tests/common.py
index 55064b06..6a33f029 100644
--- a/shipment_advice/tests/common.py
+++ b/shipment_advice/tests/common.py
@@ -154,7 +154,7 @@ def _plan_records_in_shipment(self, shipment_advice, records, user=None):
return wiz
def _load_records_in_shipment(self, shipment_advice, records, user=None):
- """Load pickings, move lines or package levels in the givent shipment."""
+ """Load pickings, move lines or package levels in the given shipment."""
wiz_model = self.env["wizard.load.shipment"].with_context(
active_model=records._name,
active_ids=records.ids,
diff --git a/shipment_advice/tests/test_shipment_advice.py b/shipment_advice/tests/test_shipment_advice.py
index 6e6ad581..65528711 100644
--- a/shipment_advice/tests/test_shipment_advice.py
+++ b/shipment_advice/tests/test_shipment_advice.py
@@ -246,3 +246,53 @@ def test_shipment_advice_draft(self):
def test_shipment_name(self):
self.assertTrue("OUT" in self.shipment_advice_out.name)
self.assertTrue("IN" in self.shipment_advice_in.name)
+
+ def test_auto_validate_shipment_advice(self):
+ shipment_advice_in2 = self.env["shipment.advice"].create(
+ {"shipment_type": "incoming"}
+ )
+ picking = self._prepare_picking_with_two_packages()
+ line1, line2 = picking.move_line_ids
+ # Load first package in shipment advice 2
+ pl1 = line1.package_level_id
+ self._in_progress_shipment_advice(self.shipment_advice_in)
+ self._in_progress_shipment_advice(shipment_advice_in2)
+ self.assertEqual(self.shipment_advice_in.state, "in_progress")
+ self._load_records_in_shipment(self.shipment_advice_in, pl1)
+ pl2 = line2.package_level_id
+ # Load second package into shipment advice
+ self._load_records_in_shipment(shipment_advice_in2, pl2)
+ # Assign planned move_ids that are assigned to test function
+ self.shipment_advice_in.planned_move_ids = line1.move_id
+ self.shipment_advice_in.planned_move_ids = line2.move_id
+ self.assertEqual(line1.move_id.state, "assigned")
+ self.assertEqual(line2.move_id.state, "assigned")
+ self.assertEqual(self.shipment_advice_in.state, "in_progress")
+ self.assertEqual(shipment_advice_in2.state, "in_progress")
+ # Setting autovalidate shipment advice company
+ self.shipment_advice_in.company_id.shipment_advice_auto_validate = True
+ # Assigning picking
+ picking.action_assign()
+ self.assertEqual(picking.state, "assigned")
+ # Making one line to not done to create backorder
+ picking.move_lines[0].move_line_ids[0].qty_done = 0
+ picking._action_done()
+ self.assertEqual(picking.state, "done")
+ self.assertEqual(
+ picking.move_line_ids.move_id.shipment_advice_id.state, "done")
+ # Testing backorder
+ backorder = self.env['stock.picking'].search([('backorder_id', '=', picking.id)])
+ shipment_advice_in3 = self.env["shipment.advice"].create(
+ {"shipment_type": "incoming"}
+ )
+ back_line1 = backorder.move_line_ids
+ self._in_progress_shipment_advice(shipment_advice_in3)
+ self._load_records_in_shipment(
+ shipment_advice_in3, back_line1.package_level_id)
+ shipment_advice_in3.planned_move_ids = back_line1.move_id
+ self.assertEqual(back_line1.move_id.state, "assigned")
+ self.assertEqual(shipment_advice_in3.state, "in_progress")
+ backorder._action_done()
+ self.assertEqual(backorder.state, "done")
+ self.assertEqual(
+ backorder.move_line_ids.move_id.shipment_advice_id.state, "done")
diff --git a/shipment_advice/views/res_config_settings.xml b/shipment_advice/views/res_config_settings.xml
index 2b747f38..76fcb330 100644
--- a/shipment_advice/views/res_config_settings.xml
+++ b/shipment_advice/views/res_config_settings.xml
@@ -27,6 +27,17 @@