diff --git a/erpnext/regional/report/soldes_intermediaires_de_gestion/soldes_intermediaires_de_gestion.js b/erpnext/regional/report/soldes_intermediaires_de_gestion/soldes_intermediaires_de_gestion.js index 2c98f90998dee41b5126aeb899238629e4989b29..ab723d46209760c5f726a1dd6b45fdee01995704 100644 --- a/erpnext/regional/report/soldes_intermediaires_de_gestion/soldes_intermediaires_de_gestion.js +++ b/erpnext/regional/report/soldes_intermediaires_de_gestion/soldes_intermediaires_de_gestion.js @@ -9,8 +9,8 @@ frappe.query_reports["Soldes Intermediaires de Gestion"]["filters"].splice(8, 1) frappe.query_reports["Soldes Intermediaires de Gestion"]["filters"].splice(1, 1); Object.assign(frappe.query_reports["Soldes Intermediaires de Gestion"], { - formatter: function (value, row, column, data, default_formatter, filter) { - if (row[1].content && column.fieldtype == "Currency") { + "formatter": function(value, row, column, data, default_formatter, filter) { + if (row[1].content && ["Currency", "Percent"].includes(column.fieldtype)) { value = default_formatter(value, row, column, data); } return value || ""; diff --git a/erpnext/regional/report/soldes_intermediaires_de_gestion/soldes_intermediaires_de_gestion.py b/erpnext/regional/report/soldes_intermediaires_de_gestion/soldes_intermediaires_de_gestion.py index 4a09c5f6e5d09967b21e1811b3813b665148bb72..85f1a2be932e0d758ceb4b37838783f9f86dc952 100644 --- a/erpnext/regional/report/soldes_intermediaires_de_gestion/soldes_intermediaires_de_gestion.py +++ b/erpnext/regional/report/soldes_intermediaires_de_gestion/soldes_intermediaires_de_gestion.py @@ -97,11 +97,21 @@ class SIGCalculator: "width": 150, } ) + # Ajoute la colonne pourcentage pour chaque période + columns.append( + { + "fieldname": f"{period.key}_pct", + "label": f"{period.label} (%)", + "fieldtype": "Percent", + "width": 100, # largeur réduite + } + ) return columns def get_data(self): self.data = defaultdict(dict) + self.turnover_by_period = {} for period in self.period_list: self.period_key = period.key @@ -115,6 +125,11 @@ class SIGCalculator: self.calcul_resultat_exceptionnel() self.calcul_resultat_net() + # Calcul du CA pour la période courante + self.turnover_by_period[self.period_key] = self.data[_("Ventes de marchandise")].get( + self.period_key, 0.0 + ) + self.data[_("Production vendue")].get(self.period_key, 0.0) + result = [] empty_row = False for label in self.labels: @@ -129,12 +144,22 @@ class SIGCalculator: row["bold"] = True empty_row = True + # Ajoute le pourcentage pour chaque période (toujours en valeur absolue, arrondi sans virgule) + for period in self.period_list: + val = row.get(period.key, 0.0) + period_turnover = self.turnover_by_period.get(period.key) + if not period_turnover: + percent = 0.0 + else: + percent = abs(val) / abs(period_turnover) * 100 + row[f"{period.key}_pct"] = round(percent) + result.append(row) return result def get_accounts( - self, account_type: str, selected_numbers: tuple | str, excluded_numbers: list = None + self, account_type: str, selected_numbers: tuple | str, excluded_numbers: list | None = None ): accounts_list = self.revenue_accounts if account_type == "revenue" else self.expense_accounts @@ -148,21 +173,28 @@ class SIGCalculator: else: return [a.name for a in accounts_list if a.account_number.startswith(selected_numbers)] - def get_accounting_entries(self, accounts): + def get_accounting_entries(self, lft, rgt): return get_accounting_entries( - "GL Entry", - self.period.from_date, - self.period.to_date, - accounts, - self.filters, - True, + doctype="GL Entry", + from_date=self.period.from_date, + to_date=self.period.to_date, + root_lft=lft, + root_rgt=rgt, + filters=self.filters, + ignore_closing_entries=True, + ignore_opening_entries=True, ) def get_accounts_balance(self, accounts): if not accounts: return 0.0 - entries = self.get_accounting_entries(accounts) + entries = [] + for account in accounts: # TODO: Optimize query + if account_details := frappe.get_all( + "Account", filters={"name": account}, fields=["min(lft) as lft", "max(rgt) as rgt"] + ): + entries.extend(self.get_accounting_entries(account_details[0].lft, account_details[0].rgt)) # type: ignore return sum(entry.credit - entry.debit for entry in entries) @@ -219,9 +251,7 @@ class SIGCalculator: # 3.2 Variation des stocks de matières premières stock_variation_accounts = self.get_accounts("expense", "603", "6037") total_stock_variations = self.get_accounts_balance(stock_variation_accounts) - self.data[_("Variation des stocks de matières premières")][ - self.period_key - ] = total_stock_variations + self.data[_("Variation des stocks de matières premières")][self.period_key] = total_stock_variations # 3.3 Autres achats et charges externes external_expenses_accounts = self.get_accounts("expense", ("61", "62"))