Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[14.0][IMP] shipment_advice: Autovalidate #128

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions shipment_advice/models/res_company.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,6 @@ class ResCompany(models.Model):
"deliveries will be shipped by several trucks."
),
)
shipment_advice_auto_validate = fields.Boolean(
string="Shipment Advice: Auto Validate"
)
3 changes: 3 additions & 0 deletions shipment_advice/models/res_config_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,6 @@ 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
)
21 changes: 19 additions & 2 deletions shipment_advice/models/shipment_advice.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"):
Expand Down
13 changes: 13 additions & 0 deletions shipment_advice/models/stock_move.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ class StockMove(models.Model):
ondelete="set null",
string="Planned shipment",
index=True,
copy=False,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This needs to reverted when #123 is merged.

)

def _plan_in_shipment(self, shipment_advice):
Expand All @@ -23,3 +24,15 @@ def _prepare_merge_moves_distinct_fields(self):
# Avoid having stock move assign to different shipment merged together
res.append("shipment_advice_id")
return res

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
2 changes: 1 addition & 1 deletion shipment_advice/tests/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ def _unplan_records_from_shipment(self, 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,
Expand Down
38 changes: 38 additions & 0 deletions shipment_advice/tests/test_shipment_advice.py
Original file line number Diff line number Diff line change
Expand Up @@ -246,3 +246,41 @@ 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):
vnikolayev1 marked this conversation as resolved.
Show resolved Hide resolved
# Creating two pickings with two move lines
picking1 = self._prepare_picking_with_two_packages()
picking2 = self._prepare_picking_with_two_packages()
picking1_line1, picking1_line2 = picking1.move_line_ids
picking2_line1, picking2_line2 = picking2.move_line_ids
move_ids = (picking1.move_line_ids + picking2.move_line_ids).move_id
package_levels = (
picking1.move_line_ids + picking2.move_line_ids
).package_level_id
# Load packages from both pickings into shipment advice
self._in_progress_shipment_advice(self.shipment_advice_in)
self._load_records_in_shipment(self.shipment_advice_in, package_levels)
# Assign planned move_ids that are assigned to test function
self.shipment_advice_in.planned_move_ids = move_ids
self.assertEqual(picking1_line1.move_id.state, "assigned")
self.assertEqual(picking1_line2.move_id.state, "assigned")
self.assertEqual(picking2_line1.move_id.state, "assigned")
self.assertEqual(picking2_line2.move_id.state, "assigned")
self.assertEqual(self.shipment_advice_in.state, "in_progress")
# Setting autovalidate shipment advice company
self.shipment_advice_in.company_id.shipment_advice_auto_validate = True
# Assigning picking1
picking1.action_assign()
self.assertEqual(picking1.state, "assigned")
# Completing picking, advice should still be in progress because of second picking
picking1._action_done()
self.assertEqual(picking2.state, "assigned")
self.assertEqual(picking1.state, "done")
self.assertEqual(self.shipment_advice_in.state, "in_progress")
# Assigning picking2
picking2.action_assign()
self.assertEqual(picking2.state, "assigned")
# Completing picking2, advice should be done because all moves are done
picking2._action_done()
self.assertEqual(picking2.state, "done")
self.assertEqual(self.shipment_advice_in.state, "done")
11 changes: 11 additions & 0 deletions shipment_advice/views/res_config_settings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,17 @@
<field name="shipment_advice_outgoing_backorder_policy" />
</div>
</div>
<div class="col-12 col-lg-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="shipment_advice_auto_validate" />
</div>
<div class="o_setting_right_pane">
<label for="shipment_advice_auto_validate" />
<div class="text-muted">
Validates shipment advice automatically whenever stock move is done
</div>
</div>
</div>
</xpath>
</field>
</record>
Expand Down
Loading