From 2b2d102fd419c75d14f050eeb5769cb457c946ad Mon Sep 17 00:00:00 2001
From: Roberto Fichera <robyf@tekno-soft.it>
Date: Wed, 24 Jan 2024 16:37:09 +0100
Subject: [PATCH] [16.0][l10n_it_intrastat_statement] Code optimization to
 remove unnecessary triple for loop when generating the statement

---
 .../models/intrastat_statement.py             | 49 ++++++++++---------
 1 file changed, 25 insertions(+), 24 deletions(-)

diff --git a/l10n_it_intrastat_statement/models/intrastat_statement.py b/l10n_it_intrastat_statement/models/intrastat_statement.py
index 4186ee6762ce..9265f5dba2f4 100644
--- a/l10n_it_intrastat_statement/models/intrastat_statement.py
+++ b/l10n_it_intrastat_statement/models/intrastat_statement.py
@@ -1,6 +1,7 @@
 # Copyright 2019 Simone Rubino - Agile Business Group
 # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
 
+from collections import defaultdict
 from datetime import date, datetime, timedelta
 
 from dateutil.relativedelta import relativedelta
@@ -775,35 +776,35 @@ def compute_statement(self):
             inv_type += ["in_invoice", "in_refund"]
         domain.append(("move_type", "in", inv_type))
 
-        statement_data = dict()
+        statement_data = defaultdict(list)
+        section_field_reverse = {}
+        for section_type in ["purchase", "sale"]:
+            for section_number in range(1, 5):
+                statement_section_field = self.get_section_field_name(
+                    section_type, section_number
+                )
+                section_model = self.get_section_model(section_type, section_number)
+                section_field_reverse[f"{section_type}_s{section_number}"] = {
+                    "model": self.env[section_model],
+                    "field": statement_section_field,
+                }
+
         invoices = self.env["account.move"].search(domain)
 
         for inv_intra_line in invoices.mapped("intrastat_line_ids"):
-            for section_type in ["purchase", "sale"]:
-                for section_number in range(1, 5):
-                    section_details = (section_type, section_number)
-                    statement_section = "{}_s{}".format(*section_details)
-                    if inv_intra_line.statement_section != statement_section:
-                        continue
-                    statement_section_model_name = self.get_section_model(
-                        *section_details
-                    )
-                    st_line = self.env[
-                        statement_section_model_name
-                    ]._prepare_statement_line(inv_intra_line, self)
-                    if not st_line:
-                        continue
-                    statement_section_field = self.get_section_field_name(
-                        *section_details
-                    )
-                    if statement_section_field not in statement_data:
-                        statement_data[statement_section_field] = list()
-                    st_line["sequence"] = (
-                        len(statement_data[statement_section_field]) + 1
-                    )
-                    statement_data[statement_section_field].append((0, 0, st_line))
+            statement_section = section_field_reverse[inv_intra_line.statement_section]
+            statement_section_model_name = statement_section["model"]
+            st_line = statement_section_model_name._prepare_statement_line(
+                inv_intra_line, self
+            )
+            if st_line:
+                statement_section_field = statement_section["field"]
+                st_line["sequence"] = len(statement_data[statement_section_field]) + 1
+                statement_data[statement_section_field].append((0, 0, st_line))
 
+        # Write only the fields having been touched
         self.write(statement_data)
+
         # Group refund to sale lines if they have the same period of ref
         refund_map = [
             (2, 1),  # Sale (Purchase) section 2 refunds section 1