From 315c0d67e23c696f7f6970d82b6c9dd6fd057b77 Mon Sep 17 00:00:00 2001 From: vnikolayev1 Date: Wed, 29 May 2024 13:43:20 +0300 Subject: [PATCH] [ADD][REF] shipment_advice - modified shipment_advice, so it has validate_when_fully_done method that sets shipment to done if its moves are in "done" state, updated tests. --- shipment_advice/models/shipment_advice.py | 21 ++++++++++++-- shipment_advice/tests/common.py | 2 +- shipment_advice/tests/test_shipment_advice.py | 28 +++++++++++++++++++ 3 files changed, 48 insertions(+), 3 deletions(-) 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/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..deaeb0a4 100644 --- a/shipment_advice/tests/test_shipment_advice.py +++ b/shipment_advice/tests/test_shipment_advice.py @@ -246,3 +246,31 @@ 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_validate_shipment_advice_when_fully_done(self): + 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_out) + self.assertEqual(self.shipment_advice_out.state, "in_progress") + self._load_records_in_shipment(self.shipment_advice_out, pl1) + pl2 = line2.package_level_id + # Load second package into shipment advice + self._load_records_in_shipment(self.shipment_advice_out, pl2) + # Assign planned move_ids that are assigned to test function + self.shipment_advice_out.planned_move_ids = line2.move_id + line1.move_id + self.assertEqual(line1.move_id.state, "assigned") + self.assertEqual(line2.move_id.state, "assigned") + self.assertEqual(self.shipment_advice_out.state, "in_progress") + # Validating if moves in "incorrect" states do not trigger _action_done() + self.shipment_advice_out.validate_when_fully_done() + self.assertEqual(self.shipment_advice_out.state, "in_progress") + # Validating if moves in one "incorrect" state do not trigger _action_done() + line1.move_id.state = "done" + self.shipment_advice_out.validate_when_fully_done() + self.assertEqual(self.shipment_advice_out.state, "in_progress") + line2.move_id.state = "done" + self.shipment_advice_out.validate_when_fully_done() + self.assertEqual(self.shipment_advice_out.state, "done") + self.assertEqual(picking.state, "done")