odoo-addon-account-financial-report 17.0.1.6.12__py3-none-any.whl → 17.0.1.7.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of odoo-addon-account-financial-report might be problematic. Click here for more details.

Files changed (33) hide show
  1. odoo/addons/account_financial_report/README.rst +1 -1
  2. odoo/addons/account_financial_report/__manifest__.py +1 -1
  3. odoo/addons/account_financial_report/i18n/account_financial_report.pot +16 -0
  4. odoo/addons/account_financial_report/i18n/ar.po +1 -1
  5. odoo/addons/account_financial_report/i18n/ca.po +1 -1
  6. odoo/addons/account_financial_report/i18n/de.po +1 -1
  7. odoo/addons/account_financial_report/i18n/es.po +26 -8
  8. odoo/addons/account_financial_report/i18n/es_AR.po +1 -1
  9. odoo/addons/account_financial_report/i18n/es_MX.po +1 -1
  10. odoo/addons/account_financial_report/i18n/fr.po +15 -16
  11. odoo/addons/account_financial_report/i18n/fr_CH.po +6 -7
  12. odoo/addons/account_financial_report/i18n/hr.po +1 -1
  13. odoo/addons/account_financial_report/i18n/hr_HR.po +1 -1
  14. odoo/addons/account_financial_report/i18n/it.po +1 -1
  15. odoo/addons/account_financial_report/i18n/ja.po +1 -1
  16. odoo/addons/account_financial_report/i18n/nl.po +1 -1
  17. odoo/addons/account_financial_report/i18n/nl_NL.po +1 -1
  18. odoo/addons/account_financial_report/i18n/pt.po +1 -1
  19. odoo/addons/account_financial_report/i18n/pt_BR.po +1 -1
  20. odoo/addons/account_financial_report/i18n/ro.po +1 -1
  21. odoo/addons/account_financial_report/i18n/sv.po +1 -1
  22. odoo/addons/account_financial_report/i18n/tr.po +1 -1
  23. odoo/addons/account_financial_report/report/open_items.py +29 -25
  24. odoo/addons/account_financial_report/report/open_items_xlsx.py +150 -17
  25. odoo/addons/account_financial_report/report/templates/open_items.xml +183 -56
  26. odoo/addons/account_financial_report/static/description/index.html +1 -1
  27. odoo/addons/account_financial_report/tests/test_open_items.py +30 -0
  28. odoo/addons/account_financial_report/wizard/open_items_wizard.py +18 -0
  29. odoo/addons/account_financial_report/wizard/open_items_wizard_view.xml +1 -0
  30. {odoo_addon_account_financial_report-17.0.1.6.12.dist-info → odoo_addon_account_financial_report-17.0.1.7.0.dist-info}/METADATA +2 -2
  31. {odoo_addon_account_financial_report-17.0.1.6.12.dist-info → odoo_addon_account_financial_report-17.0.1.7.0.dist-info}/RECORD +33 -33
  32. {odoo_addon_account_financial_report-17.0.1.6.12.dist-info → odoo_addon_account_financial_report-17.0.1.7.0.dist-info}/WHEEL +0 -0
  33. {odoo_addon_account_financial_report-17.0.1.6.12.dist-info → odoo_addon_account_financial_report-17.0.1.7.0.dist-info}/top_level.txt +0 -0
@@ -101,11 +101,126 @@ class OpenItemsXslx(models.AbstractModel):
101
101
  def _get_col_pos_final_balance_label(self):
102
102
  return 5
103
103
 
104
- def _generate_report_content(self, workbook, report, data, report_data):
105
- res_data = self.env[
106
- "report.account_financial_report.open_items"
107
- ]._get_report_values(report, data)
108
- # For each account
104
+ def _calculate_amounts_by_partner(self, account_id, open_items_move_lines_data):
105
+ total_amount = {}
106
+ for line in open_items_move_lines_data:
107
+ partner_id_key = line["partner_id"]
108
+ if account_id not in total_amount:
109
+ total_amount[account_id] = {}
110
+ if partner_id_key not in total_amount[account_id]:
111
+ total_amount[account_id][partner_id_key] = {"residual": 0.0}
112
+ total_amount[account_id][partner_id_key]["residual"] += line[
113
+ "amount_residual"
114
+ ]
115
+ return total_amount
116
+
117
+ def _generate_report_content_by_salesperson(
118
+ self, workbook, report, data, report_data, res_data
119
+ ):
120
+ Open_items = res_data["Open_Items"]
121
+ accounts_data = res_data["accounts_data"]
122
+ partners_data = res_data["partners_data"]
123
+ journals_data = res_data["journals_data"]
124
+ total_amount = res_data["total_amount"]
125
+
126
+ for partner_id in partners_data.keys():
127
+ # Create a new sheet for each partner
128
+ partner_totals = {}
129
+ partner_name = partners_data[partner_id]["name"]
130
+ new_sheet = workbook.add_worksheet(partner_name[:31])
131
+ report_data["sheet"] = new_sheet
132
+ report_data["row_pos"] = 0
133
+
134
+ for account_id in Open_items.keys():
135
+ if partner_id in Open_items[account_id]:
136
+ self.write_array_title(
137
+ accounts_data[account_id]["code"]
138
+ + " - "
139
+ + accounts_data[account_id]["name"],
140
+ report_data,
141
+ )
142
+
143
+ # For each partner
144
+ if Open_items[account_id]:
145
+ type_object = "partner"
146
+ # Write partner title
147
+ self.write_array_title(
148
+ partners_data[partner_id]["name"], report_data
149
+ )
150
+
151
+ # Calculate totals by partner_id
152
+ partner_totals = self._calculate_amounts_by_partner(
153
+ account_id, Open_items[account_id][partner_id]
154
+ )
155
+ # Display array header for move lines
156
+ self.write_array_header(report_data)
157
+ # Display account move lines
158
+ has_lines = False
159
+ for partner_id_key, total_amount_dict in partner_totals.get(
160
+ account_id, {}
161
+ ).items():
162
+ for line in Open_items[account_id][partner_id]:
163
+ if line["partner_id"] == partner_id_key:
164
+ line.update(
165
+ {
166
+ "account": accounts_data[account_id][
167
+ "code"
168
+ ],
169
+ "journal": journals_data[
170
+ line["journal_id"]
171
+ ]["code"],
172
+ }
173
+ )
174
+ self.write_line_from_dict(line, report_data)
175
+ has_lines = True
176
+ if has_lines:
177
+ partner = self.env["res.partner"].browse(partner_id_key)
178
+ # Display ending balance line for partner
179
+ partner_data = {
180
+ "id": partner_id_key,
181
+ "name": partner.name
182
+ if partner
183
+ else _("Missing Partner"),
184
+ "currency_id": accounts_data[account_id][
185
+ "currency_id"
186
+ ],
187
+ "currency_name": accounts_data[account_id][
188
+ "currency_name"
189
+ ],
190
+ "residual": total_amount_dict,
191
+ }
192
+ self.write_ending_balance_from_dict(
193
+ partner_data,
194
+ "partner_subtotal",
195
+ partner_totals,
196
+ report_data,
197
+ account_id=account_id,
198
+ partner_id=partner_id_key,
199
+ )
200
+ has_lines = False
201
+ # Display ending balance line for salesperson
202
+ partners_data[partner_id].update(
203
+ {
204
+ "currency_id": accounts_data[account_id]["currency_id"],
205
+ "currency_name": accounts_data[account_id][
206
+ "currency_name"
207
+ ],
208
+ }
209
+ )
210
+ self.write_ending_balance_from_dict(
211
+ partners_data[partner_id],
212
+ type_object,
213
+ total_amount,
214
+ report_data,
215
+ account_id=account_id,
216
+ partner_id=partner_id,
217
+ )
218
+ # Line break
219
+ report_data["row_pos"] += 1
220
+
221
+ def _generate_report_content_by_partner(
222
+ self, workbook, report, data, report_data, res_data
223
+ ):
109
224
  Open_items = res_data["Open_Items"]
110
225
  accounts_data = res_data["accounts_data"]
111
226
  partners_data = res_data["partners_data"]
@@ -120,7 +235,6 @@ class OpenItemsXslx(models.AbstractModel):
120
235
  + accounts_data[account_id]["name"],
121
236
  report_data,
122
237
  )
123
-
124
238
  # For each partner
125
239
  if Open_items[account_id]:
126
240
  if show_partner_details:
@@ -180,18 +294,33 @@ class OpenItemsXslx(models.AbstractModel):
180
294
  )
181
295
  self.write_line_from_dict(line, report_data)
182
296
 
183
- # Display ending balance line for account
184
- type_object = "account"
185
- self.write_ending_balance_from_dict(
186
- accounts_data[account_id],
187
- type_object,
188
- total_amount,
189
- report_data,
190
- account_id=account_id,
191
- )
297
+ # Display ending balance line for account
298
+ type_object = "account"
299
+ self.write_ending_balance_from_dict(
300
+ accounts_data[account_id],
301
+ type_object,
302
+ total_amount,
303
+ report_data,
304
+ account_id=account_id,
305
+ )
306
+
307
+ # 2 lines break
308
+ report_data["row_pos"] += 2
192
309
 
193
- # 2 lines break
194
- report_data["row_pos"] += 2
310
+ def _generate_report_content(self, workbook, report, data, report_data):
311
+ res_data = self.env[
312
+ "report.account_financial_report.open_items"
313
+ ]._get_report_values(report, data)
314
+ show_partner_details = res_data["show_partner_details"]
315
+ grouped_by = res_data["grouped_by"]
316
+ if grouped_by == "salesperson" and show_partner_details:
317
+ return self._generate_report_content_by_salesperson(
318
+ workbook, report, data, report_data, res_data
319
+ )
320
+ else:
321
+ return self._generate_report_content_by_partner(
322
+ workbook, report, data, report_data, res_data
323
+ )
195
324
 
196
325
  def write_ending_balance_from_dict(
197
326
  self,
@@ -211,6 +340,10 @@ class OpenItemsXslx(models.AbstractModel):
211
340
  name = my_object["code"] + " - " + my_object["name"]
212
341
  my_object["residual"] = total_amount[account_id]["residual"]
213
342
  label = _("Ending balance")
343
+ elif type_object == "partner_subtotal":
344
+ name = my_object["name"]
345
+ my_object["residual"] = total_amount[account_id][partner_id]["residual"]
346
+ label = _("Ending balance")
214
347
  return super().write_ending_balance_from_dict(
215
348
  my_object, name, label, report_data
216
349
  )
@@ -9,6 +9,7 @@
9
9
  </t>
10
10
  </t>
11
11
  </template>
12
+
12
13
  <template id="account_financial_report.report_open_items_base">
13
14
  <!-- Saved flag fields into variables, used to define columns display -->
14
15
  <t t-set="foreign_currency" t-value="foreign_currency" />
@@ -28,82 +29,188 @@
28
29
  style="text-align: center;"
29
30
  />
30
31
  </div>
31
- <!-- Display filters -->
32
- <t t-call="account_financial_report.report_open_items_filters" />
33
- <t t-foreach="Open_Items.keys()" t-as="account_id">
34
- <!-- Display account header -->
35
- <div class="act_as_table list_table" style="margin-top: 10px;" />
36
- <div class="account_title" style="width: 100%;">
37
- <span t-esc="accounts_data[account_id]['code']" />
38
- -
39
- <span t-esc="accounts_data[account_id]['name']" />
40
- </div>
41
- <t t-if="not show_partner_details">
42
- <div class="act_as_table data_table" style="width: 100%;">
43
- <t
44
- t-call="account_financial_report.report_open_items_lines_header"
45
- />
46
- <!-- Display account move lines -->
47
- <t t-foreach="Open_Items[account_id]" t-as="line">
48
- <t
49
- t-call="account_financial_report.report_open_items_lines"
50
- />
51
- </t>
32
+ <t t-if="grouped_by == 'salesperson' and show_partner_details">
33
+ <t t-foreach="partners_data.keys()" t-as="partner_id">
34
+ <t t-call="account_financial_report.report_open_items_filters" />
35
+ <div class="act_as_caption account_title">
36
+ <span t-esc="partners_data[partner_id]['name']" />
52
37
  </div>
53
- </t>
54
- <t t-if="show_partner_details">
55
- <div class="page_break">
56
- <!-- Display account partners -->
57
- <t t-foreach="Open_Items[account_id]" t-as="partner_id">
58
- <div class="act_as_caption account_title">
59
- <span t-esc="partners_data[partner_id]['name']" />
38
+ <t t-foreach="Open_Items.keys()" t-as="account_id">
39
+ <t t-if="partner_id in Open_Items[account_id]">
40
+ <div
41
+ class="act_as_table list_table"
42
+ style="margin-top: 10px;"
43
+ />
44
+ <div class="account_title" style="width: 100%;">
45
+ <span t-esc="accounts_data[account_id]['code']" />
46
+ -
47
+ <span t-esc="accounts_data[account_id]['name']" />
60
48
  </div>
61
- <div class="act_as_table data_table" style="width: 100%;">
62
- <!-- Display partner header -->
63
- <t
64
- t-call="account_financial_report.report_open_items_lines_header"
49
+
50
+ <t t-if="Open_Items[account_id]">
51
+ <t
52
+ t-set="partner_totals"
53
+ t-value="o._calculate_amounts_by_partner(account_id,Open_Items[account_id][partner_id])"
65
54
  />
66
- <!-- Display partner move lines -->
67
- <t
68
- t-foreach="Open_Items[account_id][partner_id]"
69
- t-as="line"
55
+ <t
56
+ t-foreach="partner_totals.get(account_id, {})"
57
+ t-as="partner_id_key"
70
58
  >
59
+ <t t-set="has_lines" t-value="False" />
60
+ <div
61
+ class="act_as_table data_table"
62
+ style="width: 100%;"
63
+ >
64
+
71
65
  <t
72
- t-call="account_financial_report.report_open_items_lines"
73
- />
66
+ t-foreach="Open_Items[account_id][partner_id]"
67
+ t-as="line"
68
+ >
69
+ <t t-if="line['partner_id'] == partner_id_key">
70
+ <t t-set="has_lines" t-value="True" />
71
+ </t>
72
+
74
73
  </t>
75
- </div>
74
+ <t t-if="has_lines">
75
+ <!-- Display partner header -->
76
+ <t
77
+ t-call="account_financial_report.report_open_items_lines_header"
78
+ />
79
+ </t>
80
+ <t
81
+ t-foreach="Open_Items[account_id][partner_id]"
82
+ t-as="line"
83
+ >
84
+ <t t-if="line['partner_id'] == partner_id_key">
85
+ <!-- Display partner move lines -->
86
+ <t
87
+ t-call="account_financial_report.report_open_items_lines"
88
+ />
89
+ </t>
90
+
91
+ </t>
92
+ </div>
93
+ <!-- Check if there were any lines displayed for the partner -->
94
+ <t t-if="has_lines">
95
+ <!-- Calculate and display subtotal for current partner_id -->
96
+ <t
97
+ t-call="account_financial_report.report_open_items_ending_cumul"
98
+ >
99
+ <t
100
+ t-set="currency_id"
101
+ t-value="accounts_data[account_id]['currency_name']"
102
+ />
103
+ <t
104
+ t-set="type"
105
+ t-value="'partner_subtotal_type'"
106
+ />
107
+ </t>
108
+ </t>
109
+ </t>
110
+
111
+ </t>
112
+ <!-- Display account footer -->
76
113
  <t
77
114
  t-call="account_financial_report.report_open_items_ending_cumul"
78
115
  >
79
- <t
116
+ <t
80
117
  t-set="account_or_partner_id"
81
118
  t-value="partners_data[partner_id]"
82
119
  />
83
- <t
120
+ <t
84
121
  t-set="currency_id"
85
122
  t-value="accounts_data[account_id]['currency_name']"
86
123
  />
87
- <t t-set="type" t-value='"partner_type"' />
88
- </t>
124
+ <t t-set="type" t-value='"partner_type"' />
89
125
  </t>
90
- </div>
91
- </t>
92
- <!-- Display account footer -->
93
- <t t-call="account_financial_report.report_open_items_ending_cumul">
94
- <t
95
- t-set="account_or_partner_id"
96
- t-value="accounts_data[account_id]"
97
- />
98
- <t
99
- t-set="currency_id"
100
- t-value="accounts_data[account_id]['currency_name']"
101
- />
102
- <t t-set="type" t-value='"account_type"' />
126
+ </t>
127
+
103
128
  </t>
129
+ <div style="page-break-after: always;" />
130
+ </t>
131
+ </t>
132
+ <t t-else="">
133
+ <!-- Display filters -->
134
+ <t t-call="account_financial_report.report_open_items_filters" />
135
+ <t t-foreach="Open_Items.keys()" t-as="account_id">
136
+ <!-- Display account header -->
137
+ <div class="act_as_table list_table" style="margin-top: 10px;" />
138
+ <div class="account_title" style="width: 100%;">
139
+ <span t-esc="accounts_data[account_id]['code']" />
140
+ -
141
+ <span t-esc="accounts_data[account_id]['name']" />
142
+ </div>
143
+ <t t-if="not show_partner_details">
144
+ <div class="act_as_table data_table" style="width: 100%;">
145
+ <t
146
+ t-call="account_financial_report.report_open_items_lines_header"
147
+ />
148
+ <!-- Display account move lines -->
149
+ <t t-foreach="Open_Items[account_id]" t-as="line">
150
+ <t
151
+ t-call="account_financial_report.report_open_items_lines"
152
+ />
153
+ </t>
154
+ </div>
155
+ </t>
156
+ <t t-if="show_partner_details">
157
+ <div class="page_break">
158
+ <!-- Display account partners -->
159
+ <t t-foreach="Open_Items[account_id]" t-as="partner_id">
160
+ <div class="act_as_caption account_title">
161
+ <span t-esc="partners_data[partner_id]['name']" />
162
+ </div>
163
+ <div
164
+ class="act_as_table data_table"
165
+ style="width: 100%;"
166
+ >
167
+ <!-- Display partner header -->
168
+ <t
169
+ t-call="account_financial_report.report_open_items_lines_header"
170
+ />
171
+ <!-- Display partner move lines -->
172
+ <t
173
+ t-foreach="Open_Items[account_id][partner_id]"
174
+ t-as="line"
175
+ >
176
+ <t
177
+ t-call="account_financial_report.report_open_items_lines"
178
+ />
179
+ </t>
180
+ </div>
181
+ <t
182
+ t-call="account_financial_report.report_open_items_ending_cumul"
183
+ >
184
+ <t
185
+ t-set="account_or_partner_id"
186
+ t-value="partners_data[partner_id]"
187
+ />
188
+ <t
189
+ t-set="currency_id"
190
+ t-value="accounts_data[account_id]['currency_name']"
191
+ />
192
+ <t t-set="type" t-value='"partner_type"' />
193
+ </t>
194
+ </t>
195
+ </div>
196
+ </t>
197
+ <!-- Display account footer -->
198
+ <t t-call="account_financial_report.report_open_items_ending_cumul">
199
+ <t
200
+ t-set="account_or_partner_id"
201
+ t-value="accounts_data[account_id]"
202
+ />
203
+ <t
204
+ t-set="currency_id"
205
+ t-value="accounts_data[account_id]['currency_name']"
206
+ />
207
+ <t t-set="type" t-value='"account_type"' />
208
+ </t>
209
+ </t>
104
210
  </t>
105
211
  </div>
106
212
  </template>
213
+
107
214
  <template id="account_financial_report.report_open_items_filters">
108
215
  <div class="act_as_table data_table" style="width: 100%;">
109
216
  <div class="act_as_row labels">
@@ -294,6 +401,20 @@
294
401
  Partner ending balance
295
402
  </div>
296
403
  </t>
404
+ <t t-if='type == "partner_subtotal_type"'>
405
+ <div class="act_as_cell first_column" style="width: 36.34%;" />
406
+ <t
407
+ t-set="partner"
408
+ t-value="env['res.partner'].browse(partner_id_key)"
409
+ />
410
+ <t t-if="partner">
411
+ <span t-esc="partner.name" />
412
+ </t>
413
+ <div class="act_as_cell right" style="width: 28.66%;">
414
+ Ending
415
+ balance
416
+ </div>
417
+ </t>
297
418
  <!--## date_due-->
298
419
  <div class="act_as_cell" style="width: 6.47%;" />
299
420
  <!--## amount_total_due-->
@@ -312,6 +433,12 @@
312
433
  t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"
313
434
  />
314
435
  </t>
436
+ <t t-if='type == "partner_subtotal_type"'>
437
+ <span
438
+ t-esc="partner_totals[account_id][partner_id_key]['residual']"
439
+ t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"
440
+ />
441
+ </t>
315
442
  </div>
316
443
  <!--## amount_total_due_currency + amount_residual_currency -->
317
444
  <t t-if="foreign_currency">
@@ -372,7 +372,7 @@ ul.auto-toc {
372
372
  !! This file is generated by oca-gen-addon-readme !!
373
373
  !! changes will be overwritten. !!
374
374
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
375
- !! source digest: sha256:9a1c3ae053c7fc73842b096646fcf93f131762e400d8f9a1b7695c75bc0acdf5
375
+ !! source digest: sha256:cfbb2086a9be8678690d4a0be5da4df57c9659b82433d1ce724a46ae7aa70cb3
376
376
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
377
377
  <p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/license-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/account-financial-reporting/tree/17.0/account_financial_report"><img alt="OCA/account-financial-reporting" src="https://img.shields.io/badge/github-OCA%2Faccount--financial--reporting-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/account-financial-reporting-17-0/account-financial-reporting-17-0-account_financial_report"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/account-financial-reporting&amp;target_branch=17.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
378
378
  <p>This module adds a set of financial reports. They are accessible under
@@ -1,7 +1,9 @@
1
1
  # Author: Julien Coux
2
2
  # Copyright 2016 Camptocamp SA
3
+ # Copyright 2024 Tecnativa - Carolina Fernandez
3
4
  # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
4
5
 
6
+ from odoo.fields import Date
5
7
  from odoo.tests import tagged
6
8
 
7
9
  from odoo.addons.account.tests.common import AccountTestInvoicingCommon
@@ -22,6 +24,14 @@ class TestOpenItems(AccountTestInvoicingCommon):
22
24
  tracking_disable=True,
23
25
  )
24
26
  )
27
+ cls.account001 = cls.env["account.account"].create(
28
+ {
29
+ "code": "001",
30
+ "name": "Account 001",
31
+ "account_type": "income_other",
32
+ "reconcile": True,
33
+ }
34
+ )
25
35
 
26
36
  def test_partner_filter(self):
27
37
  partner_1 = self.env.ref("base.res_partner_1")
@@ -39,3 +49,23 @@ class TestOpenItems(AccountTestInvoicingCommon):
39
49
 
40
50
  wizard = self.env["open.items.report.wizard"].with_context(**context)
41
51
  self.assertEqual(wizard._default_partners(), expected_list)
52
+
53
+ def test_open_items_grouped_by(self):
54
+ open_item_wizard = self.env["open.items.report.wizard"]
55
+ all_accounts = self.env["account.account"].search(
56
+ [
57
+ ("reconcile", "=", True),
58
+ ],
59
+ order="code",
60
+ )
61
+ wizard = open_item_wizard.create(
62
+ {
63
+ "date_at": Date.today(),
64
+ "account_code_from": self.account001.id,
65
+ "account_code_to": all_accounts[-1].id,
66
+ "grouped_by": "salesperson",
67
+ }
68
+ )
69
+ wizard.on_change_account_range()
70
+ res = wizard._prepare_report_open_items()
71
+ self.assertEqual(res["grouped_by"], wizard.grouped_by)
@@ -59,6 +59,10 @@ class OpenItemsReportWizard(models.TransientModel):
59
59
  comodel_name="account.account",
60
60
  help="Ending account in a range",
61
61
  )
62
+ grouped_by = fields.Selection(
63
+ selection=[("partners", "Partners"), ("salesperson", "Partner Salesperson")],
64
+ default="partners",
65
+ )
62
66
 
63
67
  @api.onchange("account_code_from", "account_code_to")
64
68
  def on_change_account_range(self):
@@ -134,6 +138,19 @@ class OpenItemsReportWizard(models.TransientModel):
134
138
  else:
135
139
  self.account_ids = None
136
140
 
141
+ def _calculate_amounts_by_partner(self, account_id, open_items_move_lines_data):
142
+ total_amount = {}
143
+ for line in open_items_move_lines_data:
144
+ partner_id_key = line["partner_id"]
145
+ if account_id not in total_amount:
146
+ total_amount[account_id] = {}
147
+ if partner_id_key not in total_amount[account_id]:
148
+ total_amount[account_id][partner_id_key] = {"residual": 0.0}
149
+ total_amount[account_id][partner_id_key]["residual"] += line[
150
+ "amount_residual"
151
+ ]
152
+ return total_amount
153
+
137
154
  def _print_report(self, report_type):
138
155
  self.ensure_one()
139
156
  data = self._prepare_report_open_items()
@@ -165,6 +182,7 @@ class OpenItemsReportWizard(models.TransientModel):
165
182
  "account_ids": self.account_ids.ids,
166
183
  "partner_ids": self.partner_ids.ids or [],
167
184
  "account_financial_report_lang": self.env.lang,
185
+ "grouped_by": self.grouped_by,
168
186
  }
169
187
 
170
188
  def _export(self, report_type):
@@ -21,6 +21,7 @@
21
21
  <group name="other_filters">
22
22
  <field name="target_move" widget="radio" />
23
23
  <field name="show_partner_details" />
24
+ <field name="grouped_by" />
24
25
  <field name="hide_account_at_0" />
25
26
  <field name="foreign_currency" />
26
27
  </group>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: odoo-addon-account_financial_report
3
- Version: 17.0.1.6.12
3
+ Version: 17.0.1.7.0
4
4
  Requires-Python: >=3.10
5
5
  Requires-Dist: odoo-addon-date_range>=17.0dev,<17.1dev
6
6
  Requires-Dist: odoo-addon-report_xlsx>=17.0dev,<17.1dev
@@ -29,7 +29,7 @@ Account Financial Reports
29
29
  !! This file is generated by oca-gen-addon-readme !!
30
30
  !! changes will be overwritten. !!
31
31
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
32
- !! source digest: sha256:9a1c3ae053c7fc73842b096646fcf93f131762e400d8f9a1b7695c75bc0acdf5
32
+ !! source digest: sha256:cfbb2086a9be8678690d4a0be5da4df57c9659b82433d1ce724a46ae7aa70cb3
33
33
  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
34
34
 
35
35
  .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png