odoo-addon-account-financial-report 16.0.1.5.4.3__py3-none-any.whl → 16.0.1.6.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 (28) hide show
  1. odoo/addons/account_financial_report/README.rst +36 -1
  2. odoo/addons/account_financial_report/__manifest__.py +4 -1
  3. odoo/addons/account_financial_report/i18n/account_financial_report.pot +105 -5
  4. odoo/addons/account_financial_report/i18n/es.po +103 -0
  5. odoo/addons/account_financial_report/i18n/it.po +13 -13
  6. odoo/addons/account_financial_report/models/__init__.py +2 -0
  7. odoo/addons/account_financial_report/models/account_age_report_configuration.py +47 -0
  8. odoo/addons/account_financial_report/models/res_config_settings.py +14 -0
  9. odoo/addons/account_financial_report/readme/CONFIGURE.rst +26 -0
  10. odoo/addons/account_financial_report/readme/CONTRIBUTORS.rst +1 -0
  11. odoo/addons/account_financial_report/readme/DESCRIPTION.rst +4 -0
  12. odoo/addons/account_financial_report/report/aged_partner_balance.py +69 -8
  13. odoo/addons/account_financial_report/report/aged_partner_balance_xlsx.py +145 -104
  14. odoo/addons/account_financial_report/report/templates/aged_partner_balance.xml +428 -333
  15. odoo/addons/account_financial_report/security/ir.model.access.csv +2 -0
  16. odoo/addons/account_financial_report/security/security.xml +10 -0
  17. odoo/addons/account_financial_report/static/description/index.html +45 -21
  18. odoo/addons/account_financial_report/tests/__init__.py +1 -0
  19. odoo/addons/account_financial_report/tests/test_age_report_configuration.py +41 -0
  20. odoo/addons/account_financial_report/tests/test_aged_partner_balance.py +88 -7
  21. odoo/addons/account_financial_report/view/account_age_report_configuration_views.xml +41 -0
  22. odoo/addons/account_financial_report/view/res_config_settings_views.xml +56 -0
  23. odoo/addons/account_financial_report/wizard/aged_partner_balance_wizard.py +4 -0
  24. odoo/addons/account_financial_report/wizard/aged_partner_balance_wizard_view.xml +2 -3
  25. {odoo_addon_account_financial_report-16.0.1.5.4.3.dist-info → odoo_addon_account_financial_report-16.0.1.6.0.dist-info}/METADATA +37 -2
  26. {odoo_addon_account_financial_report-16.0.1.5.4.3.dist-info → odoo_addon_account_financial_report-16.0.1.6.0.dist-info}/RECORD +28 -21
  27. {odoo_addon_account_financial_report-16.0.1.5.4.3.dist-info → odoo_addon_account_financial_report-16.0.1.6.0.dist-info}/WHEEL +0 -0
  28. {odoo_addon_account_financial_report-16.0.1.5.4.3.dist-info → odoo_addon_account_financial_report-16.0.1.6.0.dist-info}/top_level.txt +0 -0
@@ -7,7 +7,7 @@ msgstr ""
7
7
  "Project-Id-Version: Odoo Server 12.0\n"
8
8
  "Report-Msgid-Bugs-To: \n"
9
9
  "POT-Creation-Date: 2019-06-03 12:07+0000\n"
10
- "PO-Revision-Date: 2024-04-05 12:35+0000\n"
10
+ "PO-Revision-Date: 2024-04-19 13:34+0000\n"
11
11
  "Last-Translator: mymage <stefano.consolaro@mymage.it>\n"
12
12
  "Language-Team: \n"
13
13
  "Language: it\n"
@@ -69,7 +69,7 @@ msgstr "Report astratto"
69
69
  #. module: account_financial_report
70
70
  #: model:ir.model,name:account_financial_report.model_account_financial_report_abstract_wizard
71
71
  msgid "Abstract Wizard"
72
- msgstr "Procedura guidata astratta"
72
+ msgstr "Procedura guidata sintesi"
73
73
 
74
74
  #. module: account_financial_report
75
75
  #: model:ir.model,name:account_financial_report.model_report_account_financial_report_abstract_report_xlsx
@@ -810,7 +810,7 @@ msgstr "Filtro conti"
810
810
  #. module: account_financial_report
811
811
  #: model_terms:ir.ui.view,arch_db:account_financial_report.general_ledger_wizard
812
812
  msgid "Filter analytic accounts"
813
- msgstr "Filtro conti analitici"
813
+ msgstr "Filtra conti analitici"
814
814
 
815
815
  #. module: account_financial_report
816
816
  #: model:ir.model.fields,field_description:account_financial_report.field_general_ledger_report_wizard__cost_center_ids
@@ -857,7 +857,7 @@ msgstr "Da:"
857
857
  #: code:addons/account_financial_report/report/trial_balance_xlsx.py:0
858
858
  #, python-format
859
859
  msgid "From: %(date_from)s To: %(date_to)s"
860
- msgstr "Da: %(date_from)s A: %(date_to)s"
860
+ msgstr "Dal: %(date_from)s Al: %(date_to)s"
861
861
 
862
862
  #. module: account_financial_report
863
863
  #: model:ir.model.fields,field_description:account_financial_report.field_account_group__complete_code
@@ -929,7 +929,7 @@ msgstr "Raggruppa registrazioni per"
929
929
  #. module: account_financial_report
930
930
  #: model:ir.model.fields,field_description:account_financial_report.field_general_ledger_report_wizard__grouped_by
931
931
  msgid "Grouped By"
932
- msgstr "Raggruppa per"
932
+ msgstr "Raggruppato per"
933
933
 
934
934
  #. module: account_financial_report
935
935
  #. odoo-python
@@ -1048,12 +1048,12 @@ msgstr "Libro Mastro -"
1048
1048
  #. module: account_financial_report
1049
1049
  #: model:ir.model,name:account_financial_report.model_report_account_financial_report_journal_ledger
1050
1050
  msgid "Journal Ledger Report"
1051
- msgstr "Resoconto libro registri"
1051
+ msgstr "Resoconto libro mastro"
1052
1052
 
1053
1053
  #. module: account_financial_report
1054
1054
  #: model:ir.model,name:account_financial_report.model_journal_ledger_report_wizard
1055
1055
  msgid "Journal Ledger Report Wizard"
1056
- msgstr "Procedura guidata resoconto libro registri"
1056
+ msgstr "Procedura guidata resoconto libro mastro"
1057
1057
 
1058
1058
  #. module: account_financial_report
1059
1059
  #: model:ir.actions.report,name:account_financial_report.action_report_journal_ledger_xlsx
@@ -1063,7 +1063,7 @@ msgstr "Libro mastro XLSX"
1063
1063
  #. module: account_financial_report
1064
1064
  #: model:ir.model,name:account_financial_report.model_report_a_f_r_report_journal_ledger_xlsx
1065
1065
  msgid "Journal Ledger XLSX Report"
1066
- msgstr "Resoconto XLSX libro registri"
1066
+ msgstr "Resoconto XLSX libro mastro"
1067
1067
 
1068
1068
  #. module: account_financial_report
1069
1069
  #. odoo-python
@@ -1737,7 +1737,7 @@ msgstr ""
1737
1737
  #: model:ir.model.fields,field_description:account_financial_report.field_general_ledger_report_wizard__unaffected_earnings_account
1738
1738
  #: model:ir.model.fields,field_description:account_financial_report.field_trial_balance_report_wizard__unaffected_earnings_account
1739
1739
  msgid "Unaffected Earnings Account"
1740
- msgstr "Conto di ricavi anno corrente"
1740
+ msgstr "Conto ricavi inalterato"
1741
1741
 
1742
1742
  #. module: account_financial_report
1743
1743
  #: model:ir.model.fields,help:account_financial_report.field_general_ledger_report_wizard__hide_account_at_0
@@ -1875,22 +1875,22 @@ msgstr "larghezza: 23.24%;"
1875
1875
  #. module: account_financial_report
1876
1876
  #: model_terms:ir.ui.view,arch_db:account_financial_report.report_journal_ledger_journal_table_header
1877
1877
  msgid "width: 23.78%;"
1878
- msgstr "larghezza: 23.78%;"
1878
+ msgstr "larghezza: 23,78%;"
1879
1879
 
1880
1880
  #. module: account_financial_report
1881
1881
  #: model_terms:ir.ui.view,arch_db:account_financial_report.report_journal_ledger_journal_table_header
1882
1882
  msgid "width: 31.35%;"
1883
- msgstr "larghezza: 31.35%;"
1883
+ msgstr "larghezza: 31,35%;"
1884
1884
 
1885
1885
  #. module: account_financial_report
1886
1886
  #: model_terms:ir.ui.view,arch_db:account_financial_report.report_journal_ledger_journal_table_header
1887
1887
  msgid "width: 38.92%;"
1888
- msgstr "larghezza: 38.92%;"
1888
+ msgstr "larghezza: 38,92%;"
1889
1889
 
1890
1890
  #. module: account_financial_report
1891
1891
  #: model_terms:ir.ui.view,arch_db:account_financial_report.report_journal_ledger_journal_table_header
1892
1892
  msgid "width: 8.11%;"
1893
- msgstr "larghezza: 8.11%;"
1893
+ msgstr "larghezza: 8,11%;"
1894
1894
 
1895
1895
  #~ msgid "Filter analytic tags"
1896
1896
  #~ msgstr "Filtro tag analitici"
@@ -1,4 +1,6 @@
1
+ from . import account_age_report_configuration
1
2
  from . import account_group
2
3
  from . import account
3
4
  from . import account_move_line
4
5
  from . import ir_actions_report
6
+ from . import res_config_settings
@@ -0,0 +1,47 @@
1
+ # Copyright 2023 Ernesto García
2
+ # Copyright 2023 Carolina Fernandez
3
+ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
4
+ from odoo import _, api, fields, models
5
+ from odoo.exceptions import ValidationError
6
+
7
+
8
+ class AccountAgeReportConfiguration(models.Model):
9
+ _name = "account.age.report.configuration"
10
+ _description = "Model to set intervals for Age partner balance report"
11
+
12
+ name = fields.Char(required=True)
13
+ company_id = fields.Many2one(
14
+ "res.company", default=lambda self: self.env.company, readonly=True
15
+ )
16
+ line_ids = fields.One2many(
17
+ "account.age.report.configuration.line", "account_age_report_config_id"
18
+ )
19
+
20
+ @api.constrains("line_ids")
21
+ def _check_line_ids(self):
22
+ for rec in self:
23
+ if not rec.line_ids:
24
+ raise ValidationError(_("Must complete Configuration Lines"))
25
+
26
+
27
+ class AccountAgeReportConfigurationLine(models.Model):
28
+ _name = "account.age.report.configuration.line"
29
+ _description = "Model to set interval lines for Age partner balance report"
30
+
31
+ name = fields.Char(required=True)
32
+ account_age_report_config_id = fields.Many2one("account.age.report.configuration")
33
+ inferior_limit = fields.Integer()
34
+
35
+ @api.constrains("inferior_limit")
36
+ def _check_inferior_limit(self):
37
+ for rec in self:
38
+ if rec.inferior_limit <= 0:
39
+ raise ValidationError(_("Inferior Limit must be greather than zero"))
40
+
41
+ _sql_constraints = [
42
+ (
43
+ "unique_name_config_combination",
44
+ "UNIQUE(name,account_age_report_config_id)",
45
+ _("Name must be unique per report configuration"),
46
+ )
47
+ ]
@@ -0,0 +1,14 @@
1
+ # Copyright 2023 Tecnativa - Carolina Fernandez
2
+ # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
3
+
4
+ from odoo import fields, models
5
+
6
+
7
+ class ResConfigSettings(models.TransientModel):
8
+ _inherit = "res.config.settings"
9
+
10
+ default_age_partner_config_id = fields.Many2one(
11
+ "account.age.report.configuration",
12
+ string="Intervals configuration",
13
+ default_model="aged.partner.balance.report.wizard",
14
+ )
@@ -0,0 +1,26 @@
1
+ To configure dynamic intervals for Aged Partner Balance you need to:
2
+
3
+ Go on 'Settings' -> 'Invoicing' -> 'OCA Aged Report Configuration'.
4
+
5
+ Click on option 'Configurations' and create new record.
6
+
7
+ Create new interval.
8
+ The name established on line will be the column to display in Aged Partner Balance.
9
+ Inferior limit established on line is the interval
10
+
11
+ Example of configuration inferior limit:
12
+
13
+ -> 15
14
+ -> 30
15
+ -> 60
16
+
17
+ It means the first interval is from 0 to 15, the second from 16 to 30, and the third is 61+.
18
+
19
+ Go on 'Invoicing' -> 'Reports' -> 'OCA accounting reports' -> 'Aged Partner Balance'
20
+
21
+ When wizard is open, you need to select your interval configuration and print report.
22
+
23
+ If you want to get default interval configuration any time you wish to print Aged Partner Report,
24
+ you can set default interval configuration per company in:
25
+
26
+ 'Settings' -> 'Invoicing' -> 'OCA Aged Report Configuration'.
@@ -24,6 +24,7 @@
24
24
  * João Marques
25
25
  * Alexandre D. Díaz
26
26
  * Víctor Martínez
27
+ * Carolina Fernandez
27
28
 
28
29
  * `Sygel <https://www.sygel.es>`__:
29
30
 
@@ -14,3 +14,7 @@ currency used in account move lines is properly shown.
14
14
 
15
15
  In case that in an account has not been configured a second currency foreign
16
16
  currency balances are not available.
17
+
18
+ Invoicing / Settings / Invoicing / OCA Aged Report Configuration you will be able to set
19
+ dynamic intervals that will appear on the Aged Partner Balance.
20
+ For further information, check CONFIGURE.rst
@@ -25,6 +25,8 @@ class AgedPartnerBalanceReport(models.AbstractModel):
25
25
  ag_pb_data[acc_id]["90_days"] = 0.0
26
26
  ag_pb_data[acc_id]["120_days"] = 0.0
27
27
  ag_pb_data[acc_id]["older"] = 0.0
28
+ for interval_line in self.env.context["age_partner_config"].line_ids:
29
+ ag_pb_data[acc_id][interval_line] = 0.0
28
30
  return ag_pb_data
29
31
 
30
32
  @api.model
@@ -39,6 +41,8 @@ class AgedPartnerBalanceReport(models.AbstractModel):
39
41
  ag_pb_data[acc_id][prt_id]["120_days"] = 0.0
40
42
  ag_pb_data[acc_id][prt_id]["older"] = 0.0
41
43
  ag_pb_data[acc_id][prt_id]["move_lines"] = []
44
+ for interval_line in self.env.context["age_partner_config"].line_ids:
45
+ ag_pb_data[acc_id][prt_id][interval_line] = 0.0
42
46
  return ag_pb_data
43
47
 
44
48
  @api.model
@@ -47,6 +51,7 @@ class AgedPartnerBalanceReport(models.AbstractModel):
47
51
  ):
48
52
  ag_pb_data[acc_id]["residual"] += residual
49
53
  ag_pb_data[acc_id][prt_id]["residual"] += residual
54
+ interval_lines = self.env.context["age_partner_config"].line_ids
50
55
  today = date_at_object
51
56
  if not due_date or today <= due_date:
52
57
  ag_pb_data[acc_id]["current"] += residual
@@ -66,8 +71,29 @@ class AgedPartnerBalanceReport(models.AbstractModel):
66
71
  else:
67
72
  ag_pb_data[acc_id]["older"] += residual
68
73
  ag_pb_data[acc_id][prt_id]["older"] += residual
74
+ days_difference = abs((today - due_date).days)
75
+ for index, line in enumerate(interval_lines):
76
+ lower_limit = 0 if not index else interval_lines[index - 1].inferior_limit
77
+ next_line = interval_lines[index] if index < len(interval_lines) else None
78
+ interval_range = self._get_values_for_range_intervals(
79
+ lower_limit, next_line.inferior_limit
80
+ )
81
+ if (
82
+ days_difference in interval_range
83
+ or days_difference == line.inferior_limit
84
+ ):
85
+ ag_pb_data[acc_id][line] += residual
86
+ ag_pb_data[acc_id][prt_id][line] += residual
87
+ break
69
88
  return ag_pb_data
70
89
 
90
+ def _get_values_for_range_intervals(self, num1, num2):
91
+ min_num = min(num1, num2)
92
+ max_num = max(num1, num2)
93
+ if abs(num2 - num1) == 1:
94
+ return [max_num]
95
+ return list(range(min_num + 1, max_num))
96
+
71
97
  def _get_account_partial_reconciled(self, company_id, date_at_object):
72
98
  domain = [("max_date", ">", date_at_object), ("company_id", "=", company_id)]
73
99
  fields = [
@@ -235,6 +261,9 @@ class AgedPartnerBalanceReport(models.AbstractModel):
235
261
  "older": 0.0,
236
262
  }
237
263
  )
264
+ interval_lines = self.env.context["age_partner_config"].line_ids
265
+ for interval_line in interval_lines:
266
+ ml[interval_line] = 0.0
238
267
  due_date = ml["due_date"]
239
268
  amount = ml["residual"]
240
269
  today = date_at_object
@@ -250,6 +279,19 @@ class AgedPartnerBalanceReport(models.AbstractModel):
250
279
  ml["120_days"] += amount
251
280
  else:
252
281
  ml["older"] += amount
282
+ days_difference = abs((today - due_date).days)
283
+ for index, interval_line in enumerate(interval_lines):
284
+ lower_limit = 0 if not index else interval_lines[index - 1].inferior_limit
285
+ next_line = interval_lines[index] if index < len(interval_lines) else None
286
+ interval_range = self._get_values_for_range_intervals(
287
+ lower_limit, next_line.inferior_limit
288
+ )
289
+ if (
290
+ days_difference in interval_range
291
+ or days_difference == interval_line.inferior_limit
292
+ ):
293
+ ml[interval_line] += amount
294
+ break
253
295
 
254
296
  def _create_account_list(
255
297
  self,
@@ -261,6 +303,7 @@ class AgedPartnerBalanceReport(models.AbstractModel):
261
303
  date_at_oject,
262
304
  ):
263
305
  aged_partner_data = []
306
+ interval_lines = self.env.context["age_partner_config"].line_ids
264
307
  for account in accounts_data.values():
265
308
  acc_id = account["id"]
266
309
  account.update(
@@ -275,6 +318,8 @@ class AgedPartnerBalanceReport(models.AbstractModel):
275
318
  "partners": [],
276
319
  }
277
320
  )
321
+ for interval_line in interval_lines:
322
+ account[interval_line] = ag_pb_data[acc_id][interval_line]
278
323
  for prt_id in ag_pb_data[acc_id]:
279
324
  if isinstance(prt_id, int):
280
325
  partner = {
@@ -287,6 +332,10 @@ class AgedPartnerBalanceReport(models.AbstractModel):
287
332
  "120_days": ag_pb_data[acc_id][prt_id]["120_days"],
288
333
  "older": ag_pb_data[acc_id][prt_id]["older"],
289
334
  }
335
+ for interval_line in interval_lines:
336
+ partner[interval_line] = ag_pb_data[acc_id][prt_id][
337
+ interval_line
338
+ ]
290
339
  if show_move_line_details:
291
340
  move_lines = []
292
341
  for ml in ag_pb_data[acc_id][prt_id]["move_lines"]:
@@ -306,6 +355,7 @@ class AgedPartnerBalanceReport(models.AbstractModel):
306
355
 
307
356
  @api.model
308
357
  def _calculate_percent(self, aged_partner_data):
358
+ interval_lines = self.env.context["age_partner_config"].line_ids
309
359
  for account in aged_partner_data:
310
360
  if abs(account["residual"]) > 0.01:
311
361
  total = account["residual"]
@@ -331,6 +381,10 @@ class AgedPartnerBalanceReport(models.AbstractModel):
331
381
  ),
332
382
  }
333
383
  )
384
+ for interval_line in interval_lines:
385
+ account[f"percent_{interval_line.id}"] = abs(
386
+ round((account[interval_line] / total) * 100, 2)
387
+ )
334
388
  else:
335
389
  account.update(
336
390
  {
@@ -342,6 +396,8 @@ class AgedPartnerBalanceReport(models.AbstractModel):
342
396
  "percent_older": 0.0,
343
397
  }
344
398
  )
399
+ for interval_line in interval_lines:
400
+ account[f"percent_{interval_line.id}"] = 0.0
345
401
  return aged_partner_data
346
402
 
347
403
  def _get_report_values(self, docids, data):
@@ -355,12 +411,12 @@ class AgedPartnerBalanceReport(models.AbstractModel):
355
411
  date_from = data["date_from"]
356
412
  only_posted_moves = data["only_posted_moves"]
357
413
  show_move_line_details = data["show_move_line_details"]
358
- (
359
- ag_pb_data,
360
- accounts_data,
361
- partners_data,
362
- journals_data,
363
- ) = self._get_move_lines_data(
414
+ aged_partner_configuration = self.env[
415
+ "account.age.report.configuration"
416
+ ].browse(data["age_partner_config_id"])
417
+ (ag_pb_data, accounts_data, partners_data, journals_data,) = self.with_context(
418
+ age_partner_config=aged_partner_configuration
419
+ )._get_move_lines_data(
364
420
  company_id,
365
421
  account_ids,
366
422
  partner_ids,
@@ -369,7 +425,9 @@ class AgedPartnerBalanceReport(models.AbstractModel):
369
425
  only_posted_moves,
370
426
  show_move_line_details,
371
427
  )
372
- aged_partner_data = self._create_account_list(
428
+ aged_partner_data = self.with_context(
429
+ age_partner_config=aged_partner_configuration
430
+ )._create_account_list(
373
431
  ag_pb_data,
374
432
  accounts_data,
375
433
  partners_data,
@@ -377,7 +435,9 @@ class AgedPartnerBalanceReport(models.AbstractModel):
377
435
  show_move_line_details,
378
436
  date_at_object,
379
437
  )
380
- aged_partner_data = self._calculate_percent(aged_partner_data)
438
+ aged_partner_data = self.with_context(
439
+ age_partner_config=aged_partner_configuration
440
+ )._calculate_percent(aged_partner_data)
381
441
  return {
382
442
  "doc_ids": [wizard_id],
383
443
  "doc_model": "open.items.report.wizard",
@@ -388,6 +448,7 @@ class AgedPartnerBalanceReport(models.AbstractModel):
388
448
  "only_posted_moves": only_posted_moves,
389
449
  "aged_partner_balance": aged_partner_data,
390
450
  "show_move_lines_details": show_move_line_details,
451
+ "age_partner_config": aged_partner_configuration,
391
452
  }
392
453
 
393
454
  def _get_ml_fields(self):