diff --git a/account_invoice_report_grouped_by_picking/models/account_move.py b/account_invoice_report_grouped_by_picking/models/account_move.py
index 58198ddc2..0ae34a4d9 100644
--- a/account_invoice_report_grouped_by_picking/models/account_move.py
+++ b/account_invoice_report_grouped_by_picking/models/account_move.py
@@ -26,7 +26,8 @@ def _sort_grouped_lines(self, lines_dic):
DTF
),
)
- or ("", "")
+ or ("", ""),
+ x.get("is_last_section_notes", False),
),
)
@@ -74,15 +75,33 @@ def lines_grouped_by_picking(self):
so_dict = {x.sale_id: x for x in self.picking_ids if x.sale_id}
# Now group by picking by direct link or via same SO as picking's one
previous_section = previous_note = False
+ last_section_notes = []
for line in self.invoice_line_ids.sorted(
lambda ln: (-ln.sequence, ln.date, ln.move_name, -ln.id), reverse=True
):
if line.display_type == "line_section":
previous_section = line
+ last_section_notes.append(
+ {
+ "picking": picking_obj,
+ "line": line,
+ "qty": 0.0,
+ "is_last_section_notes": True,
+ }
+ )
continue
if line.display_type == "line_note":
previous_note = line
+ last_section_notes.append(
+ {
+ "picking": picking_obj,
+ "line": line,
+ "qty": 0.0,
+ "is_last_section_notes": True,
+ }
+ )
continue
+ last_section_notes = []
has_returned_qty = False
remaining_qty = line.quantity
for move in line.move_line_ids:
@@ -141,4 +160,7 @@ def lines_grouped_by_picking(self):
{"picking": key[0], "line": key[1], "quantity": value}
for key, value in picking_dict.items()
]
- return no_picking + self._sort_grouped_lines(with_picking)
+ lines_to_sort = with_picking
+ if last_section_notes:
+ lines_to_sort += last_section_notes
+ return no_picking + self._sort_grouped_lines(lines_to_sort)
diff --git a/account_invoice_report_grouped_by_picking/tests/test_account_invoice_group_picking.py b/account_invoice_report_grouped_by_picking/tests/test_account_invoice_group_picking.py
index 275955f5c..10667af8d 100644
--- a/account_invoice_report_grouped_by_picking/tests/test_account_invoice_group_picking.py
+++ b/account_invoice_report_grouped_by_picking/tests/test_account_invoice_group_picking.py
@@ -384,3 +384,62 @@ def test_section_manually_created_invocie_line(self):
)
grouped_lines = invoice.lines_grouped_by_picking()
self.assertEqual(len(grouped_lines), 4)
+
+ def test_account_invoice_group_picking_note_section_end(self):
+ # confirm quotation
+ self.sale.action_confirm()
+ # deliver lines2
+ picking = self.sale.picking_ids[:1]
+ picking.action_confirm()
+ picking.move_line_ids.write({"qty_done": 1})
+ picking._action_done()
+ # invoice sales
+ invoice = self.sale._create_invoices()
+ groups = invoice.lines_grouped_by_picking()
+ self.assertEqual(len(groups), 2)
+ invoice.write(
+ {
+ "invoice_line_ids": [
+ (
+ 0,
+ 0,
+ {
+ "name": "Note",
+ "display_type": "line_note",
+ },
+ ),
+ (
+ 0,
+ 0,
+ {
+ "name": "Section",
+ "display_type": "line_section",
+ },
+ ),
+ ],
+ }
+ )
+ groups = invoice.lines_grouped_by_picking()
+ self.assertEqual(len(groups), 4)
+ self.assertTrue(groups[0].get("is_last_section_notes", False))
+ self.assertTrue(groups[1].get("is_last_section_notes", False))
+ self.assertFalse(groups[2].get("is_last_section_notes", False))
+ self.assertFalse(groups[3].get("is_last_section_notes", False))
+ invoice.invoice_line_ids.filtered(
+ lambda a: a.product_id == self.product
+ ).with_context(check_move_validity=False).write({"quantity": 3})
+ invoice.invoice_line_ids.filtered(
+ lambda a: a.product_id == self.service
+ ).with_context(check_move_validity=False).write({"quantity": 4})
+ groups = invoice.lines_grouped_by_picking()
+ self.assertEqual(len(groups), 6)
+ self.assertFalse(groups[0].get("is_last_section_notes", False))
+ self.assertFalse(groups[0]["picking"])
+ self.assertFalse(groups[1].get("is_last_section_notes", False))
+ self.assertFalse(groups[1]["picking"])
+ self.assertTrue(groups[2].get("is_last_section_notes", False))
+ self.assertTrue(groups[3].get("is_last_section_notes", False))
+ self.assertFalse(groups[4].get("is_last_section_notes", False))
+ self.assertTrue(groups[4]["picking"])
+ self.assertFalse(groups[5].get("is_last_section_notes", False))
+ self.assertTrue(groups[5]["picking"])
diff --git a/account_invoice_report_grouped_by_picking/views/report_invoice.xml b/account_invoice_report_grouped_by_picking/views/report_invoice.xml
index 7eb4a7785..bad28f6ae 100644
--- a/account_invoice_report_grouped_by_picking/views/report_invoice.xml
+++ b/account_invoice_report_grouped_by_picking/views/report_invoice.xml
@@ -22,6 +22,10 @@
+
-
@@ -119,6 +122,21 @@
+
+
+
+
+ Subtotal:
+
+ |
+
+
+
lines_group['quantity'] == l.quantity