Browse Source

Initial Port of customer statements

pull/477/head
Graeme Gellatly 6 years ago
parent
commit
4160f86c79
  1. 79
      customer_outstanding_statement/README.rst
  2. 22
      customer_outstanding_statement/__manifest__.py
  3. 244
      customer_outstanding_statement/i18n/ca.po
  4. 253
      customer_outstanding_statement/i18n/customer_outstanding_statement.pot
  5. 254
      customer_outstanding_statement/i18n/de.po
  6. 254
      customer_outstanding_statement/i18n/es.po
  7. 254
      customer_outstanding_statement/i18n/fr.po
  8. 247
      customer_outstanding_statement/i18n/hr_HR.po
  9. 245
      customer_outstanding_statement/i18n/it.po
  10. 244
      customer_outstanding_statement/i18n/nl.po
  11. 246
      customer_outstanding_statement/i18n/nl_NL.po
  12. 246
      customer_outstanding_statement/i18n/pt.po
  13. 245
      customer_outstanding_statement/i18n/ro.po
  14. 3
      customer_outstanding_statement/report/__init__.py
  15. 190
      customer_outstanding_statement/report/customer_outstanding_statement.py
  16. BIN
      customer_outstanding_statement/static/description/Outstanding_Statement.png
  17. 76
      customer_outstanding_statement/static/description/index.html
  18. 3
      customer_outstanding_statement/tests/__init__.py
  19. 212
      customer_outstanding_statement/views/statement.xml
  20. 3
      customer_outstanding_statement/wizard/__init__.py
  21. 54
      customer_outstanding_statement/wizard/customer_outstanding_statement_wizard.xml
  22. 81
      customer_statement/README.rst
  23. 6
      customer_statement/__init__.py
  24. 13
      customer_statement/demo/account_payment_term.xml
  25. 1
      customer_statement/models/__init__.py
  26. 18
      customer_statement/models/account_payment_term.py
  27. 3
      customer_statement/report/__init__.py
  28. 207
      customer_statement/report/customer_activity_statement.py
  29. 368
      customer_statement/report/statement_common.py
  30. BIN
      customer_statement/static/description/Activity_Statement.png
  31. BIN
      customer_statement/static/description/icon.png
  32. 78
      customer_statement/static/description/index.html
  33. 3
      customer_statement/tests/__init__.py
  34. 67
      customer_statement/tests/test_customer_activity_statement.py
  35. 34
      customer_statement/views/account_payment_term.xml
  36. 171
      customer_statement/views/statement.xml
  37. 3
      customer_statement/wizard/__init__.py
  38. 38
      customer_statement/wizard/customer_activity_statement_wizard.py
  39. 56
      customer_statement/wizard/customer_activity_statement_wizard.xml
  40. 27
      customer_statement/wizard/customer_outstanding_statement_wizard.py
  41. 47
      customer_statement/wizard/statement_common.py
  42. 132
      partner_statement/README.rst
  43. 0
      partner_statement/__init__.py
  44. 16
      partner_statement/__manifest__.py
  45. 0
      partner_statement/i18n/ca.po
  46. 0
      partner_statement/i18n/de.po
  47. 0
      partner_statement/i18n/es.po
  48. 0
      partner_statement/i18n/fr.po
  49. 0
      partner_statement/i18n/hr_HR.po
  50. 0
      partner_statement/i18n/it.po
  51. 0
      partner_statement/i18n/nl.po
  52. 0
      partner_statement/i18n/nl_NL.po
  53. 0
      partner_statement/i18n/partner_statement.pot
  54. 0
      partner_statement/i18n/pt.po
  55. 0
      partner_statement/i18n/ro.po
  56. 14
      partner_statement/readme/CONFIGURE.rst
  57. 2
      partner_statement/readme/CONTRIBUTORS.rst
  58. 13
      partner_statement/readme/DESCRIPTION.rst
  59. 7
      partner_statement/readme/HISTORY.rst
  60. 3
      partner_statement/readme/ROADMAP.rst
  61. 6
      partner_statement/readme/USAGE.rst
  62. 3
      partner_statement/report/__init__.py
  63. 125
      partner_statement/report/activity_statement.py
  64. 150
      partner_statement/report/outstanding_statement.py
  65. 434
      partner_statement/report/report_statement_common.py
  66. 14
      partner_statement/security/statement_security.xml
  67. 0
      partner_statement/static/description/icon.png
  68. 4
      partner_statement/static/src/scss/layout_statement.scss
  69. 3
      partner_statement/tests/__init__.py
  70. 111
      partner_statement/tests/test_activity_statement.py
  71. 29
      partner_statement/tests/test_outstanding_statement.py
  72. 36
      partner_statement/tests/test_res_config_settings.py
  73. 130
      partner_statement/views/activity_statement.xml
  74. 49
      partner_statement/views/aging_buckets.xml
  75. 12
      partner_statement/views/assets.xml
  76. 126
      partner_statement/views/outstanding_statement.xml
  77. 59
      partner_statement/views/res_config_settings.xml
  78. 4
      partner_statement/wizard/__init__.py
  79. 44
      partner_statement/wizard/activity_statement_wizard.py
  80. 21
      partner_statement/wizard/outstanding_statement_wizard.py
  81. 57
      partner_statement/wizard/res_config_settings.py
  82. 70
      partner_statement/wizard/statement_common.py
  83. 101
      partner_statement/wizard/statement_wizard.xml

79
customer_outstanding_statement/README.rst

@ -1,79 +0,0 @@
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: https://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
====================================
Print Partner Outstanding Statement
====================================
The outstanding statement provides details of all outstanding partner receivables or payables
up to a particular date. This includes all unpaid invoices, unclaimed refunds and
outstanding payments. The list is displayed in chronological order and is split by currencies.
Aging details can be shown in the report, expressed in aging buckets (30 days
due, ...), so the customer or vendor can review how much is open, due or overdue.
Configuration
=============
Users willing to access to this report should have proper Accounting & Finance rights:
#. Go to *Settings / Users* and edit your user to add the corresponding access rights as follows.
#. In *Application / Accounting & Finance*, select *Billing* or *Billing Manager*
#. In *Technical Settings* mark *Show Full Accounting Features* options.
Usage
=====
To use this module, you need to:
#. Go to Invoicing > Sales > Master Data > Customers or or Invoicing > Purchases > Master Data > Vendors and select one or more
#. Press 'Action > Partner Outstanding Statement'
#. Indicate if you want to display receivables or payables, and if you want to display aging buckets
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
:alt: Try me on Runbot
:target: https://runbot.odoo-community.org/runbot/91/11.0
Roadmap
=======
* In v12, the module should be renamed to `Partner Outstanding Statement`.
Maybe merge this module with the `Partner Activity Statement` module.
Bug Tracker
===========
Bugs are tracked on `GitHub Issues
<https://github.com/OCA/account-financial-reporting/issues>`_. In case of trouble,
please check there if your issue has already been reported. If you spotted it
first, help us smash it by providing detailed and welcomed feedback.
Credits
=======
Images
------
* Odoo Community Association: `Icon <https://github.com/OCA/maintainer-tools/blob/master/template/module/static/description/icon.png>`_.
Contributors
------------
* Miquel Raïch <miquel.raich@eficent.com>
Maintainer
----------
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
This module is maintained by the OCA.
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
To contribute to this module, please visit https://odoo-community.org.

22
customer_outstanding_statement/__manifest__.py

@ -1,22 +0,0 @@
# Copyright 2018 Eficent Business and IT Consulting Services S.L.
# (http://www.eficent.com)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
{
'name': 'Partner Outstanding Statement',
'version': '11.0.2.0.0',
'category': 'Accounting & Finance',
'summary': 'OCA Financial Reports',
'author': "Eficent, Odoo Community Association (OCA)",
'website': 'https://github.com/OCA/account-financial-reporting',
'license': 'AGPL-3',
'depends': [
'account_invoicing',
],
'data': [
'views/statement.xml',
'wizard/customer_outstanding_statement_wizard.xml',
],
'installable': True,
'application': False,
}

244
customer_outstanding_statement/i18n/ca.po

@ -1,244 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * customer_outstanding_statement
#
# Translators:
# Marc Tormo i Bochaca <mtbochaca@gmail.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 9.0c\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-04-26 02:44+0000\n"
"PO-Revision-Date: 2017-04-26 02:44+0000\n"
"Last-Translator: Marc Tormo i Bochaca <mtbochaca@gmail.com>, 2017\n"
"Language-Team: Catalan (https://www.transifex.com/oca/teams/23907/ca/)\n"
"Language: ca\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "+120 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "1-30 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "30-60 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "60-90 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "90-120 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "<strong>The partner doesn't have due entries.</strong>"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Aging Report at"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid ""
"Aging details can be shown in the report, expressed in aging "
"buckets (30 days due, ...), so the customer can review how much is open, due "
"or overdue."
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Balance"
msgstr "Balanç "
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Balance Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid "Cancel"
msgstr "Cancel·lar "
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_company_id
msgid "Company"
msgstr "Empresa "
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_create_uid
msgid "Created by"
msgstr "Creat per "
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_create_date
msgid "Created on"
msgstr "Creat a "
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Current Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.actions.act_window,name:customer_outstanding_statement.customer_outstanding_statement_wizard_action
msgid "Customer Outstanding Statement"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model,name:customer_outstanding_statement.model_customer_outstanding_statement_wizard
msgid "Customer Outstanding Statement Wizard"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Date"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_date_end
msgid "Date End"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Date:"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Description"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_display_name
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_report_customer_outstanding_statement_statement_display_name
msgid "Display Name"
msgstr "Nom a mostrar "
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_filter_partners_non_due
msgid "Don't show partners with no due entries"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Due Date"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Ending Balance"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid "Export PDF"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_id
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_report_customer_outstanding_statement_statement_id
msgid "ID"
msgstr "ID"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_show_aging_buckets
msgid "Include Aging Buckets"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard___last_update
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_report_customer_outstanding_statement_statement___last_update
msgid "Last Modified on"
msgstr "Última modificació a "
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_write_uid
msgid "Last Updated by"
msgstr "Última actualització per "
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_write_date
msgid "Last Updated on"
msgstr "Última actualització a "
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_number_partner_ids
msgid "Number Partner"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Open Amount"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Original Amount"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Outstanding Statement"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Outstanding Statement at"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Partner ref:"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Reference number"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.actions.report,name:customer_outstanding_statement.action_print_customer_outstanding_statement
msgid "Statement Action to PDF"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid ""
"The outstanding statement provides details of all outstanding "
"customer receivables up to a particular date. This includes all unpaid "
"invoices, unclaimed refunds and outstanding payments. The list is "
"displayed in chronological order and is split by currencies."
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "in"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid "or"
msgstr "o"
#. module: customer_outstanding_statement
#: model:ir.model,name:customer_outstanding_statement.model_report_customer_outstanding_statement_statement
msgid "report.customer_outstanding_statement.statement"
msgstr ""

253
customer_outstanding_statement/i18n/customer_outstanding_statement.pot

@ -1,253 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * customer_outstanding_statement
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "+ Customer Outstanding Statement at"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "+ Supplier Outstanding Statement at"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "+120 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "1-30 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "30-60 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "60-90 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "90-120 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "<strong>The partner doesn't have due entries.</strong>"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_account_type
msgid "Account type"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Aging Report at"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid "Aging details can be shown in the report, expressed in aging buckets (30 days due, ...), so the customer or vendor can review how much is open, due or overdue."
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Balance"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Balance Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid "Cancel"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_company_id
msgid "Company"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_create_uid
msgid "Created by"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_create_date
msgid "Created on"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Current Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model,name:customer_outstanding_statement.model_customer_outstanding_statement_wizard
msgid "Customer Outstanding Statement Wizard"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Date"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_date_end
msgid "Date End"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Date:"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Description"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_display_name
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_report_customer_outstanding_statement_statement_display_name
msgid "Display Name"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_filter_partners_non_due
msgid "Don't show partners with no due entries"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Due Date"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Ending Balance"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid "Export PDF"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_id
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_report_customer_outstanding_statement_statement_id
msgid "ID"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_show_aging_buckets
msgid "Include Aging Buckets"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard___last_update
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_report_customer_outstanding_statement_statement___last_update
msgid "Last Modified on"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_write_uid
msgid "Last Updated by"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_write_date
msgid "Last Updated on"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_number_partner_ids
msgid "Number Partner"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Open Amount"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Original Amount"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Outstanding Statement"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.actions.act_window,name:customer_outstanding_statement.customer_outstanding_statement_wizard_action
msgid "Partner Outstanding Statement"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Partner ref:"
msgstr ""
#. module: customer_outstanding_statement
#: selection:customer.outstanding.statement.wizard,account_type:0
msgid "Payable"
msgstr ""
#. module: customer_outstanding_statement
#: selection:customer.outstanding.statement.wizard,account_type:0
msgid "Receivable"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Reference number"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.actions.report,name:customer_outstanding_statement.action_print_customer_outstanding_statement
msgid "Statement Action to PDF"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid "The outstanding statement provides details of all partner's outstanding receivables and payables up to a particular date. This includes all unpaid invoices, unclaimed refunds and outstanding payments. The list is displayed in chronological order and is split by currencies."
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "in"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid "or"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model,name:customer_outstanding_statement.model_report_customer_outstanding_statement_statement
msgid "report.customer_outstanding_statement.statement"
msgstr ""

254
customer_outstanding_statement/i18n/de.po

@ -1,254 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * customer_outstanding_statement
#
# Translators:
# OCA Transbot <transbot@odoo-community.org>, 2018
# Rudolf Schnapka <rs@techno-flex.de>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-02-28 10:11+0000\n"
"PO-Revision-Date: 2018-08-24 13:24+0000\n"
"Last-Translator: Rudolf Schnapka <rs@techno-flex.de>\n"
"Language-Team: German (https://www.transifex.com/oca/teams/23907/de/)\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 3.1.1\n"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "+120 Days Due"
msgstr "+120 Tage fällig"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "1-30 Days Due"
msgstr "1-30 Tage fällig"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "30-60 Days Due"
msgstr "30-60 Tage fällig"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "60-90 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "90-120 Days Due"
msgstr "90-120 Tage fällig"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "<strong>The partner doesn't have due entries.</strong>"
msgstr "<strong>Der Partner hat keine offenen Posten.</strong>"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Aging Report at"
msgstr "Fälligkeiten Bericht zu"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid ""
"Aging details can be shown in the report, expressed in aging "
"buckets (30 days due, ...), so the customer can review how much is open, due "
"or overdue."
msgstr ""
"Die einzelnen Fälligkeiten können im Bericht, nach Altersgruppen (30 Tage "
"fällig,....) gegliedert, ausgewertet werden, so dass der Kunde überprüfen "
"kann, wie viel offen, fällig oder überfällig ist."
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Balance"
msgstr "Saldo"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Balance Due"
msgstr "Fälliger Saldo"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid "Cancel"
msgstr "Abbrechen"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_company_id
msgid "Company"
msgstr "Unternehmen"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_create_uid
msgid "Created by"
msgstr "Angelegt von"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_create_date
msgid "Created on"
msgstr "Angelegt am"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Current Due"
msgstr "Aktuell fällig"
#. module: customer_outstanding_statement
#: model:ir.actions.act_window,name:customer_outstanding_statement.customer_outstanding_statement_wizard_action
msgid "Customer Outstanding Statement"
msgstr "Kunden-Offene Posten-Bericht"
#. module: customer_outstanding_statement
#: model:ir.model,name:customer_outstanding_statement.model_customer_outstanding_statement_wizard
msgid "Customer Outstanding Statement Wizard"
msgstr "Assistent zum Kunden-Offene Posten-Bericht"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Date"
msgstr "Datum"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_date_end
msgid "Date End"
msgstr "Enddatum"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Date:"
msgstr "Datum:"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Description"
msgstr "Beschreibung"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_display_name
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_report_customer_outstanding_statement_statement_display_name
msgid "Display Name"
msgstr "Anzeigename"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_filter_partners_non_due
msgid "Don't show partners with no due entries"
msgstr "Unterdrücke Partner ohne fällige Posten"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Due Date"
msgstr "Fälligkeitsdatum"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Ending Balance"
msgstr "Endsaldo"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid "Export PDF"
msgstr "Export PDF"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_id
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_report_customer_outstanding_statement_statement_id
msgid "ID"
msgstr "ID"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_show_aging_buckets
msgid "Include Aging Buckets"
msgstr "Schliesse Altersgruppen ein"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard___last_update
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_report_customer_outstanding_statement_statement___last_update
msgid "Last Modified on"
msgstr "Zuletzt geändert am"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_write_uid
msgid "Last Updated by"
msgstr "Zuletzt aktualisiert durch"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_write_date
msgid "Last Updated on"
msgstr "Zuletzt aktualisiert am"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_number_partner_ids
msgid "Number Partner"
msgstr "Nummeriere Partner"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Open Amount"
msgstr "Offene Summe"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Original Amount"
msgstr "Ursprüngliche Summe"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Outstanding Statement"
msgstr "Offene Posten-Bericht"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Outstanding Statement at"
msgstr "Offene Posten zum"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Partner ref:"
msgstr "Partner-Ref.:"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Reference number"
msgstr "Referenznummer"
#. module: customer_outstanding_statement
#: model:ir.actions.report,name:customer_outstanding_statement.action_print_customer_outstanding_statement
msgid "Statement Action to PDF"
msgstr "Berichtsaktion zu PDF"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid ""
"The outstanding statement provides details of all outstanding "
"customer receivables up to a particular date. This includes all unpaid "
"invoices, unclaimed refunds and outstanding payments. The list is "
"displayed in chronological order and is split by currencies."
msgstr ""
"Der offene Posten-Bericht gibt Auskunft über alle offenen Kundenforderungen "
"bis zu einem bestimmten Datum. Dazu gehören alle unbezahlten Rechnungen, "
"nicht eingeforderte Rückerstattungen und ausstehende Zahlungen. Die Liste "
"wird in chronologischer Reihenfolge angezeigt und ist nach Währungen "
"gegliedert."
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "in"
msgstr "in"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid "or"
msgstr "oder"
#. module: customer_outstanding_statement
#: model:ir.model,name:customer_outstanding_statement.model_report_customer_outstanding_statement_statement
msgid "report.customer_outstanding_statement.statement"
msgstr "report.customer_outstanding_statement.statement"

254
customer_outstanding_statement/i18n/es.po

@ -1,254 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * customer_outstanding_statement
#
# Translators:
# OCA Transbot <transbot@odoo-community.org>, 2017
# Gelo Joga Landoo <gj@landoo.es>, 2017
# Pedro M. Baeza <pedro.baeza@gmail.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-12-22 16:14+0000\n"
"PO-Revision-Date: 2018-10-23 03:45+0000\n"
"Last-Translator: Jordi Ballester Alomar <jordi.ballester@eficent.com>\n"
"Language-Team: Spanish (https://www.transifex.com/oca/teams/23907/es/)\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 3.2.1\n"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "+120 Days Due"
msgstr "+120 Días"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "1-30 Days Due"
msgstr "1-30 Días"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "30-60 Days Due"
msgstr "30-60 Días"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "60-90 Days Due"
msgstr "60-90 Días"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "90-120 Days Due"
msgstr "90-120 Días"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "<strong>The partner doesn't have due entries.</strong>"
msgstr "<strong>Este cliente no tiene pagos pendientes</strong>"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Aging Report at"
msgstr "Reporte de vencidos al"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid ""
"Aging details can be shown in the report, expressed in aging "
"buckets (30 days due, ...), so the customer can review how much is open, due "
"or overdue."
msgstr ""
"Detalles de vencidos pueden ser mostrados en el reporte, expresados en "
"rangos……de mora (30 días, …), para que el cliente pueda revisar cuando está "
"abierto, cuando debe y cuańto está vencido."
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Balance"
msgstr "Cuota"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Balance Due"
msgstr "Saldo"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid "Cancel"
msgstr "Cancelar"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_company_id
msgid "Company"
msgstr "Compañía"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_create_uid
msgid "Created by"
msgstr "Creado por"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_create_date
msgid "Created on"
msgstr "Creado en"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Current Due"
msgstr "Saldo a la Fecha"
#. module: customer_outstanding_statement
#: model:ir.actions.act_window,name:customer_outstanding_statement.customer_outstanding_statement_wizard_action
msgid "Customer Outstanding Statement"
msgstr "Informe de Saldos Abiertos"
#. module: customer_outstanding_statement
#: model:ir.model,name:customer_outstanding_statement.model_customer_outstanding_statement_wizard
msgid "Customer Outstanding Statement Wizard"
msgstr "Asistente de Informe de Saldos Abiertos"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Date"
msgstr "Fecha"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_date_end
msgid "Date End"
msgstr "Fecha Fin"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Date:"
msgstr "Fecha:"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Description"
msgstr "Descripción"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_display_name
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_report_customer_outstanding_statement_statement_display_name
msgid "Display Name"
msgstr "Nombre a mostrar"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_filter_partners_non_due
msgid "Don't show partners with no due entries"
msgstr "No mostrar clientes sin saldo pendiente"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Due Date"
msgstr "Fecha de Pago"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Ending Balance"
msgstr "Saldo Final"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid "Export PDF"
msgstr "Exportar a PDF"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_id
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_report_customer_outstanding_statement_statement_id
msgid "ID"
msgstr "ID"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_show_aging_buckets
msgid "Include Aging Buckets"
msgstr "Inluir Períodos de Mora"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard___last_update
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_report_customer_outstanding_statement_statement___last_update
msgid "Last Modified on"
msgstr "Última modificación en"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_write_uid
msgid "Last Updated by"
msgstr "Última modificación por"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_write_date
msgid "Last Updated on"
msgstr "Última actualización en"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_number_partner_ids
msgid "Number Partner"
msgstr "Número de Cliente"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Open Amount"
msgstr "Saldo Abierto"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Original Amount"
msgstr "Saldo Original"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Outstanding Statement"
msgstr "Estado de Cuenta"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Outstanding Statement at"
msgstr "Estado de Cuenta al"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Partner ref:"
msgstr "Ref. de Cliente:"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Reference number"
msgstr "Número de Referencia"
#. module: customer_outstanding_statement
#: model:ir.actions.report,name:customer_outstanding_statement.action_print_customer_outstanding_statement
msgid "Statement Action to PDF"
msgstr "Acción Estado a PDF"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid ""
"The outstanding statement provides details of all outstanding "
"customer receivables up to a particular date. This includes all unpaid "
"invoices, unclaimed refunds and outstanding payments. The list is "
"displayed in chronological order and is split by currencies."
msgstr ""
"El estado de cuenta proporciona detalles de todas las cuentas por cobrar "
"pendientes…… de clientes hasta una fecha determinada. Esto incluye todas las "
"facturas no pagadas, reembolsos…… no reclamados y pagos pendientes. La lista "
"se muestra en orden cronológico y se divide por monedas."
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "in"
msgstr "en"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid "or"
msgstr "o"
#. module: customer_outstanding_statement
#: model:ir.model,name:customer_outstanding_statement.model_report_customer_outstanding_statement_statement
msgid "report.customer_outstanding_statement.statement"
msgstr "informe.estado_de_cuenta_de_cliente"

254
customer_outstanding_statement/i18n/fr.po

@ -1,254 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * customer_outstanding_statement
#
# Translators:
# OCA Transbot <transbot@odoo-community.org>, 2018
# Quentin THEURET <odoo@kerpeo.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-02-28 10:11+0000\n"
"PO-Revision-Date: 2018-09-01 08:20+0000\n"
"Last-Translator: Valaeys Stéphane <svalaeys@fiefmanage.ch>\n"
"Language-Team: French (https://www.transifex.com/oca/teams/23907/fr/)\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 3.1.1\n"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "+120 Days Due"
msgstr "+120 jours d'arriérés"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "1-30 Days Due"
msgstr "1-30 jours d'arriérés"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "30-60 Days Due"
msgstr "30-60 jours d'arriérés"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "60-90 Days Due"
msgstr "60-90 jours d'arriérés"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "90-120 Days Due"
msgstr "90-120 jours d'arriérés"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "<strong>The partner doesn't have due entries.</strong>"
msgstr ""
"<strong>Le partenaire n'a pas d'écriture en attente de paiement.</strong>"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Aging Report at"
msgstr "Balance âgée au"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid ""
"Aging details can be shown in the report, expressed in aging "
"buckets (30 days due, ...), so the customer can review how much is open, due "
"or overdue."
msgstr ""
"Le détail des arriérés peut être affiché dans le rapport, exprimé par "
"tranche (30 jours d'arriérés, ...), de telle sorte que le destinataire "
"puisse voir combien est ouvert, dû ou échu."
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Balance"
msgstr "Solde"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Balance Due"
msgstr "Solde dû"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid "Cancel"
msgstr "Annuler"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_company_id
msgid "Company"
msgstr "Société"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_create_uid
msgid "Created by"
msgstr "Créé par"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_create_date
msgid "Created on"
msgstr "Créé le"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Current Due"
msgstr "Dû en ce moment"
#. module: customer_outstanding_statement
#: model:ir.actions.act_window,name:customer_outstanding_statement.customer_outstanding_statement_wizard_action
msgid "Customer Outstanding Statement"
msgstr "Postes ouverts des partenaires"
#. module: customer_outstanding_statement
#: model:ir.model,name:customer_outstanding_statement.model_customer_outstanding_statement_wizard
msgid "Customer Outstanding Statement Wizard"
msgstr "Assistant pour l'édition des postes ouverts"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Date"
msgstr "Date"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_date_end
msgid "Date End"
msgstr "Jusqu'au"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Date:"
msgstr "Date :"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Description"
msgstr "Description"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_display_name
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_report_customer_outstanding_statement_statement_display_name
msgid "Display Name"
msgstr "Nom affiché"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_filter_partners_non_due
msgid "Don't show partners with no due entries"
msgstr "Masquer les partenaires sans solde"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Due Date"
msgstr "Date d'échéance"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Ending Balance"
msgstr "Solde final"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid "Export PDF"
msgstr "Export PDF"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_id
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_report_customer_outstanding_statement_statement_id
msgid "ID"
msgstr "ID"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_show_aging_buckets
msgid "Include Aging Buckets"
msgstr "Afficher les arriérés par tranche"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard___last_update
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_report_customer_outstanding_statement_statement___last_update
msgid "Last Modified on"
msgstr "Dernière modification le"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_write_uid
msgid "Last Updated by"
msgstr "Dernière mise à jour par"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_write_date
msgid "Last Updated on"
msgstr "Dernière mise à jour le"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_number_partner_ids
msgid "Number Partner"
msgstr "Numéro du partenaire"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Open Amount"
msgstr "Solde ouvert"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Original Amount"
msgstr "Montant original"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Outstanding Statement"
msgstr "Relevé des postes ouverts"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Outstanding Statement at"
msgstr "Relevé des postes ouverts au"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Partner ref:"
msgstr "Ref. partenaire :"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Reference number"
msgstr "Numéro de référence"
#. module: customer_outstanding_statement
#: model:ir.actions.report,name:customer_outstanding_statement.action_print_customer_outstanding_statement
msgid "Statement Action to PDF"
msgstr "Export du relevé des postes ouverts en PDF"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid ""
"The outstanding statement provides details of all outstanding "
"customer receivables up to a particular date. This includes all unpaid "
"invoices, unclaimed refunds and outstanding payments. The list is "
"displayed in chronological order and is split by currencies."
msgstr ""
"Le relevé des postes ouverts détaille tous les montants dû à une date "
"donnée. Ceci inclus toutes les factures non payées, remboursements non "
"effectués et paiements en attente. Les transactions sont affichées par ordre "
"chronologique et ventillées par devise."
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "in"
msgstr "en"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid "or"
msgstr "ou"
#. module: customer_outstanding_statement
#: model:ir.model,name:customer_outstanding_statement.model_report_customer_outstanding_statement_statement
msgid "report.customer_outstanding_statement.statement"
msgstr "report.customer_outstanding_statement.statement"

247
customer_outstanding_statement/i18n/hr_HR.po

@ -1,247 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * customer_outstanding_statement
#
# Translators:
# Bole <bole@dajmi5.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-12-22 16:14+0000\n"
"PO-Revision-Date: 2017-12-22 16:14+0000\n"
"Last-Translator: Bole <bole@dajmi5.com>, 2017\n"
"Language-Team: Croatian (Croatia) (https://www.transifex.com/oca/teams/23907/"
"hr_HR/)\n"
"Language: hr_HR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "+120 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "1-30 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "30-60 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "60-90 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "90-120 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "<strong>The partner doesn't have due entries.</strong>"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Aging Report at"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid ""
"Aging details can be shown in the report, expressed in aging "
"buckets (30 days due, ...), so the customer can review how much is open, due "
"or overdue."
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Balance"
msgstr "Saldo"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Balance Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid "Cancel"
msgstr "Otkaži"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_company_id
msgid "Company"
msgstr "Tvrtka"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_create_uid
msgid "Created by"
msgstr "Kreirao"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_create_date
msgid "Created on"
msgstr "Kreirano"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Current Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.actions.act_window,name:customer_outstanding_statement.customer_outstanding_statement_wizard_action
msgid "Customer Outstanding Statement"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model,name:customer_outstanding_statement.model_customer_outstanding_statement_wizard
msgid "Customer Outstanding Statement Wizard"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Date"
msgstr "Datum"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_date_end
#, fuzzy
msgid "Date End"
msgstr "Datum"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Date:"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Description"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_display_name
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_report_customer_outstanding_statement_statement_display_name
msgid "Display Name"
msgstr "Naziv "
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_filter_partners_non_due
msgid "Don't show partners with no due entries"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Due Date"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Ending Balance"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid "Export PDF"
msgstr "Izvoz PDF"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_id
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_report_customer_outstanding_statement_statement_id
msgid "ID"
msgstr "ID"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_show_aging_buckets
msgid "Include Aging Buckets"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard___last_update
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_report_customer_outstanding_statement_statement___last_update
msgid "Last Modified on"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_write_uid
msgid "Last Updated by"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_write_date
msgid "Last Updated on"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_number_partner_ids
msgid "Number Partner"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Open Amount"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Original Amount"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Outstanding Statement"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Outstanding Statement at"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Partner ref:"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Reference number"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.actions.report,name:customer_outstanding_statement.action_print_customer_outstanding_statement
msgid "Statement Action to PDF"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid ""
"The outstanding statement provides details of all outstanding "
"customer receivables up to a particular date. This includes all unpaid "
"invoices, unclaimed refunds and outstanding payments. The list is "
"displayed in chronological order and is split by currencies."
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "in"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid "or"
msgstr "ili"
#. module: customer_outstanding_statement
#: model:ir.model,name:customer_outstanding_statement.model_report_customer_outstanding_statement_statement
msgid "report.customer_outstanding_statement.statement"
msgstr ""

245
customer_outstanding_statement/i18n/it.po

@ -1,245 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * customer_outstanding_statement
#
# Translators:
# Stefano <stefano.sforzi@agilebg.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-12-22 23:13+0000\n"
"PO-Revision-Date: 2017-12-22 23:13+0000\n"
"Last-Translator: Stefano <stefano.sforzi@agilebg.com>, 2017\n"
"Language-Team: Italian (https://www.transifex.com/oca/teams/23907/it/)\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "+120 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "1-30 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "30-60 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "60-90 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "90-120 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "<strong>The partner doesn't have due entries.</strong>"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Aging Report at"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid ""
"Aging details can be shown in the report, expressed in aging "
"buckets (30 days due, ...), so the customer can review how much is open, due "
"or overdue."
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Balance"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Balance Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid "Cancel"
msgstr "Cancellare"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_company_id
msgid "Company"
msgstr "Azienda"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_create_uid
msgid "Created by"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_create_date
msgid "Created on"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Current Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.actions.act_window,name:customer_outstanding_statement.customer_outstanding_statement_wizard_action
msgid "Customer Outstanding Statement"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model,name:customer_outstanding_statement.model_customer_outstanding_statement_wizard
msgid "Customer Outstanding Statement Wizard"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Date"
msgstr "Data"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_date_end
#, fuzzy
msgid "Date End"
msgstr "Data"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Date:"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Description"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_display_name
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_report_customer_outstanding_statement_statement_display_name
msgid "Display Name"
msgstr "Nome mostrato"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_filter_partners_non_due
msgid "Don't show partners with no due entries"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Due Date"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Ending Balance"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid "Export PDF"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_id
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_report_customer_outstanding_statement_statement_id
msgid "ID"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_show_aging_buckets
msgid "Include Aging Buckets"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard___last_update
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_report_customer_outstanding_statement_statement___last_update
msgid "Last Modified on"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_write_uid
msgid "Last Updated by"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_write_date
msgid "Last Updated on"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_number_partner_ids
msgid "Number Partner"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Open Amount"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Original Amount"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Outstanding Statement"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Outstanding Statement at"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Partner ref:"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Reference number"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.actions.report,name:customer_outstanding_statement.action_print_customer_outstanding_statement
msgid "Statement Action to PDF"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid ""
"The outstanding statement provides details of all outstanding "
"customer receivables up to a particular date. This includes all unpaid "
"invoices, unclaimed refunds and outstanding payments. The list is "
"displayed in chronological order and is split by currencies."
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "in"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid "or"
msgstr "o"
#. module: customer_outstanding_statement
#: model:ir.model,name:customer_outstanding_statement.model_report_customer_outstanding_statement_statement
msgid "report.customer_outstanding_statement.statement"
msgstr ""

244
customer_outstanding_statement/i18n/nl.po

@ -1,244 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * customer_outstanding_statement
#
# Translators:
# Melroy van den Berg <webmaster1989@gmail.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-02-28 10:11+0000\n"
"PO-Revision-Date: 2018-02-28 10:11+0000\n"
"Last-Translator: Melroy van den Berg <webmaster1989@gmail.com>, 2018\n"
"Language-Team: Dutch (https://www.transifex.com/oca/teams/23907/nl/)\n"
"Language: nl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "+120 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "1-30 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "30-60 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "60-90 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "90-120 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "<strong>The partner doesn't have due entries.</strong>"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Aging Report at"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid ""
"Aging details can be shown in the report, expressed in aging "
"buckets (30 days due, ...), so the customer can review how much is open, due "
"or overdue."
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Balance"
msgstr "Balans"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Balance Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid "Cancel"
msgstr "Annuleren"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_company_id
msgid "Company"
msgstr "Bedrijf"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_create_uid
msgid "Created by"
msgstr "Gecreëerd door"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_create_date
msgid "Created on"
msgstr "Gecreëerd op"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Current Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.actions.act_window,name:customer_outstanding_statement.customer_outstanding_statement_wizard_action
msgid "Customer Outstanding Statement"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model,name:customer_outstanding_statement.model_customer_outstanding_statement_wizard
msgid "Customer Outstanding Statement Wizard"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Date"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_date_end
msgid "Date End"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Date:"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Description"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_display_name
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_report_customer_outstanding_statement_statement_display_name
msgid "Display Name"
msgstr "Weergavenaam"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_filter_partners_non_due
msgid "Don't show partners with no due entries"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Due Date"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Ending Balance"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid "Export PDF"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_id
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_report_customer_outstanding_statement_statement_id
msgid "ID"
msgstr "ID"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_show_aging_buckets
msgid "Include Aging Buckets"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard___last_update
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_report_customer_outstanding_statement_statement___last_update
msgid "Last Modified on"
msgstr "Laatst Gewijzigd op"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_write_uid
msgid "Last Updated by"
msgstr "Laatst Geüpdatet door"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_write_date
msgid "Last Updated on"
msgstr "Laatst Geüpdatet op"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_number_partner_ids
msgid "Number Partner"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Open Amount"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Original Amount"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Outstanding Statement"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Outstanding Statement at"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Partner ref:"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Reference number"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.actions.report,name:customer_outstanding_statement.action_print_customer_outstanding_statement
msgid "Statement Action to PDF"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid ""
"The outstanding statement provides details of all outstanding "
"customer receivables up to a particular date. This includes all unpaid "
"invoices, unclaimed refunds and outstanding payments. The list is "
"displayed in chronological order and is split by currencies."
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "in"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid "or"
msgstr "of"
#. module: customer_outstanding_statement
#: model:ir.model,name:customer_outstanding_statement.model_report_customer_outstanding_statement_statement
msgid "report.customer_outstanding_statement.statement"
msgstr ""

246
customer_outstanding_statement/i18n/nl_NL.po

@ -1,246 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * customer_outstanding_statement
#
# Translators:
# Peter Hageman <hageman.p@gmail.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-12-22 16:14+0000\n"
"PO-Revision-Date: 2017-12-22 16:14+0000\n"
"Last-Translator: Peter Hageman <hageman.p@gmail.com>, 2017\n"
"Language-Team: Dutch (Netherlands) (https://www.transifex.com/oca/"
"teams/23907/nl_NL/)\n"
"Language: nl_NL\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "+120 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "1-30 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "30-60 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "60-90 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "90-120 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "<strong>The partner doesn't have due entries.</strong>"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Aging Report at"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid ""
"Aging details can be shown in the report, expressed in aging "
"buckets (30 days due, ...), so the customer can review how much is open, due "
"or overdue."
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Balance"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Balance Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid "Cancel"
msgstr "Annuleer"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_company_id
msgid "Company"
msgstr "Bedrijf"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_create_uid
msgid "Created by"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_create_date
msgid "Created on"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Current Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.actions.act_window,name:customer_outstanding_statement.customer_outstanding_statement_wizard_action
msgid "Customer Outstanding Statement"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model,name:customer_outstanding_statement.model_customer_outstanding_statement_wizard
msgid "Customer Outstanding Statement Wizard"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Date"
msgstr "Datum"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_date_end
#, fuzzy
msgid "Date End"
msgstr "Datum"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Date:"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Description"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_display_name
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_report_customer_outstanding_statement_statement_display_name
msgid "Display Name"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_filter_partners_non_due
msgid "Don't show partners with no due entries"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Due Date"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Ending Balance"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid "Export PDF"
msgstr "Export PDF"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_id
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_report_customer_outstanding_statement_statement_id
msgid "ID"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_show_aging_buckets
msgid "Include Aging Buckets"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard___last_update
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_report_customer_outstanding_statement_statement___last_update
msgid "Last Modified on"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_write_uid
msgid "Last Updated by"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_write_date
msgid "Last Updated on"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_number_partner_ids
msgid "Number Partner"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Open Amount"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Original Amount"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Outstanding Statement"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Outstanding Statement at"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Partner ref:"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Reference number"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.actions.report,name:customer_outstanding_statement.action_print_customer_outstanding_statement
msgid "Statement Action to PDF"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid ""
"The outstanding statement provides details of all outstanding "
"customer receivables up to a particular date. This includes all unpaid "
"invoices, unclaimed refunds and outstanding payments. The list is "
"displayed in chronological order and is split by currencies."
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "in"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid "or"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model,name:customer_outstanding_statement.model_report_customer_outstanding_statement_statement
msgid "report.customer_outstanding_statement.statement"
msgstr ""

246
customer_outstanding_statement/i18n/pt.po

@ -1,246 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * customer_outstanding_statement
#
# Translators:
# Pedro Castro Silva <inactive+pcs.sossia@transifex.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-12-22 16:14+0000\n"
"PO-Revision-Date: 2017-12-22 16:14+0000\n"
"Last-Translator: Pedro Castro Silva <inactive+pcs.sossia@transifex.com>, "
"2017\n"
"Language-Team: Portuguese (https://www.transifex.com/oca/teams/23907/pt/)\n"
"Language: pt\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "+120 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "1-30 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "30-60 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "60-90 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "90-120 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "<strong>The partner doesn't have due entries.</strong>"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Aging Report at"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid ""
"Aging details can be shown in the report, expressed in aging "
"buckets (30 days due, ...), so the customer can review how much is open, due "
"or overdue."
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Balance"
msgstr "Saldo"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Balance Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid "Cancel"
msgstr "Cancelar"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_company_id
msgid "Company"
msgstr "Empresa"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_create_uid
msgid "Created by"
msgstr "Criado por"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_create_date
msgid "Created on"
msgstr "Criado em"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Current Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.actions.act_window,name:customer_outstanding_statement.customer_outstanding_statement_wizard_action
msgid "Customer Outstanding Statement"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model,name:customer_outstanding_statement.model_customer_outstanding_statement_wizard
msgid "Customer Outstanding Statement Wizard"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Date"
msgstr "Data"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_date_end
#, fuzzy
msgid "Date End"
msgstr "Data"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Date:"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Description"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_display_name
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_report_customer_outstanding_statement_statement_display_name
msgid "Display Name"
msgstr "Exibir nome"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_filter_partners_non_due
msgid "Don't show partners with no due entries"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Due Date"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Ending Balance"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid "Export PDF"
msgstr "Exportar PDF"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_id
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_report_customer_outstanding_statement_statement_id
msgid "ID"
msgstr "ID"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_show_aging_buckets
msgid "Include Aging Buckets"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard___last_update
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_report_customer_outstanding_statement_statement___last_update
msgid "Last Modified on"
msgstr "Última modificação em"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_write_uid
msgid "Last Updated by"
msgstr "Última atualização em"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_write_date
msgid "Last Updated on"
msgstr "Última atualização por"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_number_partner_ids
msgid "Number Partner"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Open Amount"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Original Amount"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Outstanding Statement"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Outstanding Statement at"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Partner ref:"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Reference number"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.actions.report,name:customer_outstanding_statement.action_print_customer_outstanding_statement
msgid "Statement Action to PDF"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid ""
"The outstanding statement provides details of all outstanding "
"customer receivables up to a particular date. This includes all unpaid "
"invoices, unclaimed refunds and outstanding payments. The list is "
"displayed in chronological order and is split by currencies."
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "in"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid "or"
msgstr "ou"
#. module: customer_outstanding_statement
#: model:ir.model,name:customer_outstanding_statement.model_report_customer_outstanding_statement_statement
msgid "report.customer_outstanding_statement.statement"
msgstr ""

245
customer_outstanding_statement/i18n/ro.po

@ -1,245 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * customer_outstanding_statement
#
# Translators:
# Dorin Hongu <dhongu@gmail.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-16 08:14+0000\n"
"PO-Revision-Date: 2018-03-16 08:14+0000\n"
"Last-Translator: Dorin Hongu <dhongu@gmail.com>, 2018\n"
"Language-Team: Romanian (https://www.transifex.com/oca/teams/23907/ro/)\n"
"Language: ro\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?"
"2:1));\n"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "+120 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "1-30 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "30-60 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "60-90 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "90-120 Days Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "<strong>The partner doesn't have due entries.</strong>"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Aging Report at"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid ""
"Aging details can be shown in the report, expressed in aging "
"buckets (30 days due, ...), so the customer can review how much is open, due "
"or overdue."
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Balance"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Balance Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid "Cancel"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_company_id
msgid "Company"
msgstr "Companie"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_create_uid
msgid "Created by"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_create_date
msgid "Created on"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Current Due"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.actions.act_window,name:customer_outstanding_statement.customer_outstanding_statement_wizard_action
msgid "Customer Outstanding Statement"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model,name:customer_outstanding_statement.model_customer_outstanding_statement_wizard
msgid "Customer Outstanding Statement Wizard"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Date"
msgstr "Data"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_date_end
msgid "Date End"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Date:"
msgstr "Data:"
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Description"
msgstr "Descriere"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_display_name
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_report_customer_outstanding_statement_statement_display_name
msgid "Display Name"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_filter_partners_non_due
msgid "Don't show partners with no due entries"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Due Date"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Ending Balance"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid "Export PDF"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_id
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_report_customer_outstanding_statement_statement_id
msgid "ID"
msgstr "ID"
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_show_aging_buckets
msgid "Include Aging Buckets"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard___last_update
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_report_customer_outstanding_statement_statement___last_update
msgid "Last Modified on"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_write_uid
msgid "Last Updated by"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_write_date
msgid "Last Updated on"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model.fields,field_description:customer_outstanding_statement.field_customer_outstanding_statement_wizard_number_partner_ids
msgid "Number Partner"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Open Amount"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Original Amount"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Outstanding Statement"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Outstanding Statement at"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Partner ref:"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "Reference number"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.actions.report,name:customer_outstanding_statement.action_print_customer_outstanding_statement
msgid "Statement Action to PDF"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid ""
"The outstanding statement provides details of all outstanding "
"customer receivables up to a particular date. This includes all unpaid "
"invoices, unclaimed refunds and outstanding payments. The list is "
"displayed in chronological order and is split by currencies."
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.statement_document
msgid "in"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.ui.view,arch_db:customer_outstanding_statement.customer_outstanding_statement_wizard_view
msgid "or"
msgstr ""
#. module: customer_outstanding_statement
#: model:ir.model,name:customer_outstanding_statement.model_report_customer_outstanding_statement_statement
msgid "report.customer_outstanding_statement.statement"
msgstr ""

3
customer_outstanding_statement/report/__init__.py

@ -1,3 +0,0 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from . import customer_outstanding_statement

190
customer_outstanding_statement/report/customer_outstanding_statement.py

@ -1,190 +0,0 @@
# Copyright 2018 Eficent Business and IT Consulting Services S.L.
# (http://www.eficent.com)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from datetime import datetime, timedelta
from odoo.tools.misc import DEFAULT_SERVER_DATE_FORMAT
from odoo import api, fields, models
class CustomerOutstandingStatement(models.AbstractModel):
"""Model of Customer Outstanding Statement"""
_inherit = 'report.statement.common'
_name = 'report.customer_outstanding_statement.statement'
def _display_lines_sql_q0(self, date_end):
return self._cr.mogrify("""
SELECT l1.id,
CASE WHEN l1.reconciled = TRUE and l1.balance > 0.0
THEN max(pd.max_date)
WHEN l1.reconciled = TRUE and l1.balance < 0.0
THEN max(pc.max_date)
ELSE null
END as reconciled_date
FROM account_move_line l1
LEFT JOIN (SELECT pr.*
FROM account_partial_reconcile pr
INNER JOIN account_move_line l2
ON pr.credit_move_id = l2.id
WHERE l2.date <= %(date_end)s
) as pd ON pd.debit_move_id = l1.id
LEFT JOIN (SELECT pr.*
FROM account_partial_reconcile pr
INNER JOIN account_move_line l2
ON pr.debit_move_id = l2.id
WHERE l2.date <= %(date_end)s
) as pc ON pc.credit_move_id = l1.id
GROUP BY l1.id
""", locals()
)
def _display_lines_sql_q1(self, partners, date_end, account_type):
partners = tuple(partners)
return self._cr.mogrify("""
SELECT m.name AS move_id, l.partner_id, l.date, l.name,
l.ref, l.blocked, l.currency_id, l.company_id,
CASE WHEN (l.currency_id is not null AND l.amount_currency > 0.0)
THEN avg(l.amount_currency)
ELSE avg(l.debit)
END as debit,
CASE WHEN (l.currency_id is not null AND l.amount_currency < 0.0)
THEN avg(l.amount_currency * (-1))
ELSE avg(l.credit)
END as credit,
CASE WHEN l.balance > 0.0
THEN l.balance - sum(coalesce(pd.amount, 0.0))
ELSE l.balance + sum(coalesce(pc.amount, 0.0))
END AS open_amount,
CASE WHEN l.balance > 0.0
THEN l.amount_currency - sum(coalesce(pd.amount_currency, 0.0))
ELSE l.amount_currency + sum(coalesce(pc.amount_currency, 0.0))
END AS open_amount_currency,
CASE WHEN l.date_maturity is null
THEN l.date
ELSE l.date_maturity
END as date_maturity
FROM account_move_line l
JOIN account_account_type at ON (at.id = l.user_type_id)
JOIN account_move m ON (l.move_id = m.id)
LEFT JOIN Q0 ON Q0.id = l.id
LEFT JOIN (SELECT pr.*
FROM account_partial_reconcile pr
INNER JOIN account_move_line l2
ON pr.credit_move_id = l2.id
WHERE l2.date <= %(date_end)s
) as pd ON pd.debit_move_id = l.id
LEFT JOIN (SELECT pr.*
FROM account_partial_reconcile pr
INNER JOIN account_move_line l2
ON pr.debit_move_id = l2.id
WHERE l2.date <= %(date_end)s
) as pc ON pc.credit_move_id = l.id
WHERE l.partner_id IN %(partners)s AND at.type = %(account_type)s
AND (Q0.reconciled_date is null or
Q0.reconciled_date > %(date_end)s)
AND l.date <= %(date_end)s
GROUP BY l.partner_id, m.name, l.date, l.date_maturity, l.name,
l.ref, l.blocked, l.currency_id,
l.balance, l.amount_currency, l.company_id
""", locals())
def _display_lines_sql_q2(self):
return self._cr.mogrify("""
SELECT partner_id, currency_id, move_id, date, date_maturity,
debit, credit, name, ref, blocked, company_id,
CASE WHEN currency_id is not null
THEN open_amount_currency
ELSE open_amount
END as open_amount
FROM Q1
""", locals())
def _display_lines_sql_q3(self, company_id):
return self._cr.mogrify("""
SELECT Q2.partner_id, move_id, date, date_maturity, Q2.name, ref,
debit, credit, debit-credit AS amount, blocked,
COALESCE(Q2.currency_id, c.currency_id) AS currency_id, open_amount
FROM Q2
JOIN res_company c ON (c.id = Q2.company_id)
WHERE c.id = %(company_id)s
""", locals())
def _get_account_display_lines(self, company_id, partner_ids, date_end,
account_type):
res = dict(map(lambda x: (x, []), partner_ids))
partners = tuple(partner_ids)
# pylint: disable=E8103
self.env.cr.execute("""
WITH Q0 as (%s),
Q1 AS (%s),
Q2 AS (%s),
Q3 AS (%s)
SELECT partner_id, currency_id, move_id, date, date_maturity, debit,
credit, amount, open_amount, name, ref, blocked
FROM Q3
ORDER BY date, date_maturity, move_id""" % (
self._display_lines_sql_q0(date_end),
self._display_lines_sql_q1(partners, date_end, account_type),
self._display_lines_sql_q2(),
self._display_lines_sql_q3(company_id)))
for row in self.env.cr.dictfetchall():
res[row.pop('partner_id')].append(row)
return res
@api.multi
def get_report_values(self, docids, data):
company_id = data['company_id']
partner_ids = data['partner_ids']
date_end = data['date_end']
account_type = data['account_type']
today = fields.Date.today()
buckets_to_display = {}
lines_to_display, amount_due = {}, {}
currency_to_display = {}
today_display, date_end_display = {}, {}
lines = self._get_account_display_lines(
company_id, partner_ids, date_end, account_type)
for partner_id in partner_ids:
lines_to_display[partner_id], amount_due[partner_id] = {}, {}
currency_to_display[partner_id] = {}
today_display[partner_id] = self._format_date_to_partner_lang(
today, partner_id)
date_end_display[partner_id] = self._format_date_to_partner_lang(
date_end, partner_id)
for line in lines[partner_id]:
currency = self.env['res.currency'].browse(line['currency_id'])
if currency not in lines_to_display[partner_id]:
lines_to_display[partner_id][currency] = []
currency_to_display[partner_id][currency] = currency
amount_due[partner_id][currency] = 0.0
if not line['blocked']:
amount_due[partner_id][currency] += line['open_amount']
line['balance'] = amount_due[partner_id][currency]
line['date'] = self._format_date_to_partner_lang(
line['date'], partner_id)
line['date_maturity'] = self._format_date_to_partner_lang(
line['date_maturity'], partner_id)
lines_to_display[partner_id][currency].append(line)
if data['show_aging_buckets']:
buckets_to_display = self._get_account_show_buckets(
company_id, partner_ids, date_end, account_type)
return {
'doc_ids': partner_ids,
'doc_model': 'res.partner',
'docs': self.env['res.partner'].browse(partner_ids),
'Amount_Due': amount_due,
'Lines': lines_to_display,
'Buckets': buckets_to_display,
'Currencies': currency_to_display,
'Show_Buckets': data['show_aging_buckets'],
'Filter_non_due_partners': data['filter_non_due_partners'],
'Date_end': date_end_display,
'Date': today_display,
'account_type': account_type,
}

BIN
customer_outstanding_statement/static/description/Outstanding_Statement.png

Before

Width: 660  |  Height: 512  |  Size: 24 KiB

76
customer_outstanding_statement/static/description/index.html

@ -1,76 +0,0 @@
<section class="oe_container">
<div class="oe_row oe_spaced">
<div class="oe_span12">
<h2 class="oe_slogan">Partner Outstanding Statement</h2>
</div>
<div class="oe_span6">
<div class="oe_demo oe_picture oe_screenshot">
<img src="Outstanding_Statement.png">
</div>
</div>
<div class="oe_span4">
<p class="oe_mt32"><div style="text-align:justify">The outstanding statement provides details of all outstanding
receivables or payables of a partner up to a particular date. This includes all unpaid invoices, unclaimed
refunds and outstanding payments. The list is displayed in chronological order and is split
by currencies.<br><br>Aging details can be shown in the report, expressed in aging buckets (30 days
due, ...), so the customer or vendor can review how much is open, due or overdue.</div></p>
</div>
</div>
</section>
<section class="oe_container">
<div class="oe_row oe_spaced">
<div class="oe_span12">
<h2 class="oe_slogan">Configuration</h2>
</div>
<div class="oe_span12">
<p class="oe_mt32">To configure this module, you need to:
<ul>
<li>Go to <code>Settings / Users</code> and edit your user to add the corresponding access rights as follows.</li>
<li>In <code>Application / Accounting & Finance</code>, select <code>Billing</code> or <code>Billing Manager</code> options.</li>
<li>In <code>Technical Setting</code> mark <code>Show Full Accounting Features</code> options.</li>
</ul>
</p>
</div>
</div>
</section>
<section class="oe_container oe_dark">
<div class="oe_row oe_spaced">
<div class="oe_span12">
<h2 class="oe_slogan">Usage</h2>
</div>
<div class="oe_span12">
<p class="oe_mt32">To use this module, you need to:
<ul>
<li>Go to <code>Invoicing > Sales > Master Data > Customers</code> or <code>Invoicing > Purchases > Master Data > Vendors</code> and select one or more</li>
<li>Press '<code>Action > Partner Outstanding Statement</code>'</li>
<li>Indicate if you want to display aging buckets</li>
</ul>
</p>
</div>
</div>
</section>
<section class="oe_container oe_dark">
<div class="oe_row">
<div class="oe_span12">
<h2 class="oe_slogan">Credits</h2>
</div>
<div class="oe_span12">
<h3>Contributors</h3>
<ul>
<li>Miquel Ra&iuml;ch &lt;<a href="mailto:miquel.raich@eficent.com">miquel.raich@eficent.com</a>&gt;</li>
</ul>
</div>
<div class="oe_span12">
<h3>Maintainer</h3>
<p>
This module is maintained by the OCA.<br/>
OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.<br/>
To contribute to this module, please visit <a href="http://odoo-community.org">http://odoo-community.org</a>.<br/>
<a href="http://odoo-community.org"><img class="oe_picture oe_centered" src="http://odoo-community.org/logo.png"></a>
</p>
</div>
</div>
</section>

3
customer_outstanding_statement/tests/__init__.py

@ -1,3 +0,0 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from . import test_customer_outstanding_statement

212
customer_outstanding_statement/views/statement.xml

@ -1,212 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2018 Eficent Business and IT Consulting Services S.L.
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
<odoo>
<template id="customer_outstanding_statement.statement_document">
<t t-call="web.external_layout">
<div class="page">
<div class="row">
<div class="col-xs-5 col-xs-offset-7">
<span t-field="o.name"/><br/>
<span t-raw="o.contact_address.replace('\n\n', '\n').replace('\n', '&lt;br&gt;')"/>
<span t-field="o.vat"/>
</div>
<h4 style="padding-left:15em;padding-top:2em">
Outstanding Statement
</h4>
<p>
Date: <span t-esc="Date[o.id]" /><br/><!--Today-->
<t t-if="o.ref">Partner ref: <span t-field="o.ref"/></t>
</p>
<t t-if="Lines[o.id]">
<br/>
<t t-foreach="Lines[o.id]" t-as="currency">
<br t-if="not currency_first" />
<p t-if="account_type == 'receivable'">
+ Customer Outstanding Statement at <span t-esc="Date_end[o.id]" /> in <span t-esc="Currencies[o.id][currency].name"/>:
+ </p>
<p t-if="account_type == 'payable'">
+ Supplier Outstanding Statement at <span t-esc="Date_end[o.id]" /> in <span t-esc="Currencies[o.id][currency].name"/>:
</p>
<table class="table table-condensed" style="border: 1px solid black; border-collapse: collapse;">
<thead>
<tr>
<th style="border-right: 1px solid black;">Reference number</th>
<th class="text-center" style="border-right: 1px solid black;">Date</th>
<th class="text-center" style="border-right: 1px solid black;">Due Date</th>
<th style="border-right: 1px solid black;">Description</th>
<th class="text-right" style="border-right: 1px solid black;">Original Amount</th>
<th class="text-right" style="border-right: 1px solid black;">Open Amount</th>
<th class="text-right" style="border-right: 1px solid black;">Balance</th>
</tr>
</thead>
<tr t-foreach="Lines[o.id][currency]" t-as="line">
<t t-if="not line['blocked']">
<td style="border-right: 1px solid black;">
<span t-esc="line['move_id']"/>
</td>
<td style="border-right: 1px solid black;">
<span t-esc="line['date']"/>
</td>
<td style="border-right: 1px solid black;">
<span t-esc="line['date_maturity']"/>
</td>
<td style="border-right: 1px solid black;">
<t t-if="line['name'] != '/'">
<t t-if="not line['ref']"><span t-esc="line['name']"/></t>
<t t-if="line['ref'] and line['name']">
<t t-if="line['name'] not in line['ref']"><span t-esc="line['name']"/></t>
<t t-if="line['ref'] not in line['name']"><span t-esc="line['ref']"/></t>
</t>
</t>
<t t-if="line['name'] == '/'"><span t-esc="line['ref']"/></t>
</td>
<td class="text-right" style="border-right: 1px solid black;">
<span t-esc="line['amount']" t-esc-options='{"widget": "monetary", "display_currency": "currency"}'/>
</td>
<td class="text-right" style="border-right: 1px solid black;">
<span t-esc="line['open_amount']" t-esc-options='{"widget": "monetary", "display_currency": "currency"}'/>
</td>
<td class="text-right" style="border-right: 1px solid black;">
<span t-esc="line['balance']" t-esc-options='{"widget": "monetary", "display_currency": "currency"}'/>
</td>
</t>
<t t-if="line['blocked']">
<td style="border-right: 1px solid black; background-color: grey;">
<span t-esc="line['move_id']"/>
</td>
<td style="border-right: 1px solid black; background-color: grey;">
<span t-esc="line['date']"/>
</td>
<td style="border-right: 1px solid black; background-color: grey;">
<span t-esc="line['date_maturity']"/>
</td>
<td style="border-right: 1px solid black; background-color: grey;">
<t t-if="line['name'] != '/'">
<t t-if="not line['ref']"><span t-esc="line['name']"/></t>
<t t-if="line['ref'] and line['name']">
<t t-if="line['name'] not in line['ref']"><span t-esc="line['name']"/></t>
<t t-if="line['ref'] not in line['name']"><span t-esc="line['ref']"/></t>
</t>
</t>
<t t-if="line['name'] == '/'"><span t-esc="line['ref']"/></t>
</td>
<td class="text-right" style="border-right: 1px solid black; background-color: grey;">
<span t-esc="line['amount']" t-esc-options='{"widget": "monetary", "display_currency": "currency"}'/>
</td>
<td class="text-right" style="border-right: 1px solid black; background-color: grey;">
<span t-esc="line['open_amount']" t-esc-options='{"widget": "monetary", "display_currency": "currency"}'/>
</td>
<td class="text-right" style="border-right: 1px solid black; background-color: grey;">
<span t-esc="line['balance']" t-esc-options='{"widget": "monetary", "display_currency": "currency"}'/>
</td>
</t>
</tr>
<tr>
<td style="border-right: 1px solid black;"/>
<td style="border-right: 1px solid black;">
<span t-esc="Date_end[o.id]"/>
</td>
<td style="border-right: 1px solid black;"/>
<td style="border-right: 1px solid black;">
Ending Balance
</td>
<td style="border-right: 1px solid black;"/>
<td style="border-right: 1px solid black;"/>
<td class="text-right" style="border-right: 1px solid black;">
<span t-esc="Amount_Due[o.id][currency]" t-esc-options='{"widget": "monetary", "display_currency": "currency"}'/>
</td>
</tr>
</table>
<p>
Aging Report at <span t-esc="Date_end[o.id]" /> in <span t-esc="Currencies[o.id][currency].name"/>:
</p>
<table class="table table-condensed" t-if="Show_Buckets" style="border: 1px solid black; border-collapse: collapse;">
<thead>
<tr>
<th class="text-center" style="border-right: 1px solid black;">Current Due</th>
<th class="text-center" style="border-right: 1px solid black;">1-30 Days Due</th>
<th class="text-center" style="border-right: 1px solid black;">30-60 Days Due</th>
<th class="text-center" style="border-right: 1px solid black;">60-90 Days Due</th>
<th class="text-center" style="border-right: 1px solid black;">90-120 Days Due</th>
<th class="text-center" style="border-right: 1px solid black;">+120 Days Due</th>
<th class="text-right" style="border-right: 1px solid black;">Balance Due</th>
</tr>
</thead>
<tr t-if="currency in Buckets[o.id]">
<td class="text-right" style="border-right: 1px solid black;">
<span t-esc="Buckets[o.id][currency]['current']" t-esc-options='{"widget": "monetary", "display_currency": "currency"}'/>
</td>
<td class="text-right" style="border-right: 1px solid black;">
<span t-esc="Buckets[o.id][currency]['b_1_30']" t-esc-options='{"widget": "monetary", "display_currency": "currency"}'/>
</td>
<td class="text-right" style="border-right: 1px solid black;">
<span t-esc="Buckets[o.id][currency]['b_30_60']" t-esc-options='{"widget": "monetary", "display_currency": "currency"}'/>
</td>
<td class="text-right" style="border-right: 1px solid black;">
<span t-esc="Buckets[o.id][currency]['b_60_90']" t-esc-options='{"widget": "monetary", "display_currency": "currency"}'/>
</td>
<td class="text-right" style="border-right: 1px solid black;">
<span t-esc="Buckets[o.id][currency]['b_90_120']" t-esc-options='{"widget": "monetary", "display_currency": "currency"}'/>
</td>
<td class="text-right" style="border-right: 1px solid black;">
<span t-esc="Buckets[o.id][currency]['b_over_120']" t-esc-options='{"widget": "monetary", "display_currency": "currency"}'/>
</td>
<td class="text-right" style="border-right: 1px solid black;">
<span t-esc="Buckets[o.id][currency]['balance']" t-esc-options='{"widget": "monetary", "display_currency": "currency"}'/>
</td>
</tr>
<tr t-if="currency not in Buckets[o.id]">
<td class="text-right" style="border-right: 1px solid black;">
<span t-esc="0.0" t-esc-options='{"widget": "monetary", "display_currency": "currency"}'/>
</td>
<td class="text-right" style="border-right: 1px solid black;">
<span t-esc="0.0" t-esc-options='{"widget": "monetary", "display_currency": "currency"}'/>
</td>
<td class="text-right" style="border-right: 1px solid black;">
<span t-esc="0.0" t-esc-options='{"widget": "monetary", "display_currency": "currency"}'/>
</td>
<td class="text-right" style="border-right: 1px solid black;">
<span t-esc="0.0" t-esc-options='{"widget": "monetary", "display_currency": "currency"}'/>
</td>
<td class="text-right" style="border-right: 1px solid black;">
<span t-esc="0.0" t-esc-options='{"widget": "monetary", "display_currency": "currency"}'/>
</td>
<td class="text-right" style="border-right: 1px solid black;">
<span t-esc="0.0" t-esc-options='{"widget": "monetary", "display_currency": "currency"}'/>
</td>
<td class="text-right" style="border-right: 1px solid black;">
<span t-esc="0.0" t-esc-options='{"widget": "monetary", "display_currency": "currency"}'/>
</td>
</tr>
</table>
</t>
</t>
<p t-if="not Lines[o.id]">
<strong>The partner doesn't have due entries.</strong>
</p>
</div>
</div>
</t>
</template>
<template id="statement">
<t t-call="web.html_container">
<t t-foreach="docs" t-as="o">
<t t-if="not (Filter_non_due_partners and (not Lines[o.id]) and (len(doc_ids) > 1))">
<t t-call="customer_outstanding_statement.statement_document" t-lang="o.lang"/>
</t>
</t>
</t>
</template>
<report id="action_print_customer_outstanding_statement"
model="res.partner"
report_type="qweb-pdf"
menu="False"
string="Statement Action to PDF"
name="customer_outstanding_statement.statement"
file="customer_outstanding_statement.statement"
/>
</odoo>

3
customer_outstanding_statement/wizard/__init__.py

@ -1,3 +0,0 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from . import customer_outstanding_statement_wizard

54
customer_outstanding_statement/wizard/customer_outstanding_statement_wizard.xml

@ -1,54 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2018 Eficent Business and IT Consulting Services S.L.
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
<odoo>
<!-- wizard action on res.partner -->
<act_window id="customer_outstanding_statement_wizard_action"
name="Partner Outstanding Statement"
src_model="res.partner"
res_model="customer.outstanding.statement.wizard"
view_type="form" view_mode="form"
key2="client_action_multi" target="new"
groups="account.group_account_user"/>
<!-- wizard view -->
<record id="customer_outstanding_statement_wizard_view" model="ir.ui.view">
<field name="name">Customer Outstanding Statement Wizard</field>
<field name="model">customer.outstanding.statement.wizard</field>
<field name="arch" type="xml">
<form name="Report Options">
<div style="text-align:justify">
<label string="The outstanding statement provides details of all partner's outstanding
receivables and payables up to a particular date. This includes all unpaid invoices, unclaimed
refunds and outstanding payments. The list is displayed in chronological order and is
split by currencies."/><br/><br/>
<label string="Aging details can be shown in the report, expressed in aging
buckets (30 days due, ...), so the customer or vendor can review how much is open, due or overdue."/>
</div><hr/>
<group name="main_info">
<field name="company_id" options="{'no_create': True}" groups="base.group_multi_company"/>
</group>
<group name="account_type">
<label for="account_type"/>
<field name="account_type" nolabel="1" widget="radio"/>
</group>
<group name="dates">
<field name="date_end"/>
</group>
<group name="aging_report">
<field name="show_aging_buckets"/>
</group>
<group name="multiple_partners">
<field name="number_partner_ids" readonly="1" invisible="1"/>
<field name="filter_partners_non_due" attrs="{'invisible': [('number_partner_ids', '=', 1)]}"/>
</group>
<footer>
<button name="button_export_pdf" string="Export PDF" type="object" default_focus="1" class="oe_highlight"/>
or
<button string="Cancel" class="oe_link" special="cancel" />
</footer>
</form>
</field>
</record>
</odoo>

81
customer_statement/README.rst

@ -1,81 +0,0 @@
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
=================================
Print Partner Activity Statement
=================================
The activity statement provides details of all activity on the partner receivables or payables
between two selected dates. This includes all invoices, refunds and payments.
Any outstanding balance dated prior to the chosen statement period will appear
as a forward balance at the top of the statement. The list is displayed in chronological
order and is split by currencies.
Aging details can be shown in the report, expressed in aging buckets (30 days
due, ...), so the customer or vendor can review how much is open, due or overdue.
Configuration
=============
Users willing to access to this report should have proper Accounting & Finance rights:
#. Go to *Settings / Users* and edit your user to add the corresponding access rights as follows.
#. In *Application / Accounting & Finance*, select *Billing* or *Billing Manager*
#. In *Technical Settings* mark *Show Full Accounting Features* options.
Usage
=====
To use this module, you need to:
#. Go to Invoicing > Sales > Master Data > Customers or Invoicing > Purchases > Master Data > Vendors and select one or more
#. Press 'Action > Partner Activity Statement'
#. Indicate if you want to display receivables or payables, and if you want to display aging buckets
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
:alt: Try me on Runbot
:target: https://runbot.odoo-community.org/runbot/91/11.0
Roadmap
=======
* In v12, the module should be renamed to `Partner Activity Statement`.
Maybe merge this module with the `Partner Outstanding Statement` module.
Bug Tracker
===========
Bugs are tracked on `GitHub Issues
<https://github.com/OCA/account-financial-reporting/issues>`_. In case of trouble,
please check there if your issue has already been reported. If you spotted it
first, help us smash it by providing detailed and welcomed feedback.
Credits
=======
Images
------
* Odoo Community Association: `Icon <https://github.com/OCA/maintainer-tools/blob/master/template/module/static/description/icon.png>`_.
Contributors
------------
* Miquel Raïch <miquel.raich@eficent.com>
Maintainer
----------
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
This module is maintained by the OCA.
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
To contribute to this module, please visit https://odoo-community.org.

6
customer_statement/__init__.py

@ -1,6 +0,0 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from . import report
from . import wizard
from . import models
from . import wizards

13
customer_statement/demo/account_payment_term.xml

@ -1,13 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2018 Graeme Gellatly
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
<odoo noupdate="1">
<!-- TODO
<record model="account.payment.term" id="account_payment_term_demo_1">
<field name="name">...</field>
</record>
-->
</odoo>

1
customer_statement/models/__init__.py

@ -1 +0,0 @@
from . import account_payment_term

18
customer_statement/models/account_payment_term.py

@ -1,18 +0,0 @@
# -*- coding: utf-8 -*-
# Copyright 2018 Graeme Gellatly
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, fields, models, _
class AccountPaymentTerm(models.Model):
_inherit = 'account.payment.term'
aging_periods = fields.Integer(string='Aging Periods to show', default=4)
@api.constrains('aging_periods')
def _aging_period_limits(self):
periods = self.mapped('aging_periods')
if max(periods) > 5 or min(periods) < 0:
raise ValidationError(_('Only between 0 and 5 Aging periods allowed'))

3
customer_statement/report/__init__.py

@ -1,3 +0,0 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from . import customer_activity_statement

207
customer_statement/report/customer_activity_statement.py

@ -1,207 +0,0 @@
# Copyright 2018 Eficent Business and IT Consulting Services S.L.
# (http://www.eficent.com)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from datetime import datetime, timedelta
from odoo.tools.misc import DEFAULT_SERVER_DATE_FORMAT
from odoo import api, fields, models
from collections import defaultdict
class CustomerActivityStatement(models.AbstractModel):
"""Model of Customer Activity Statement"""
_inherit = 'report.statement.common'
_name = 'report.customer_activity_statement.statement'
def _initial_balance_sql_q1(self, partners, date_start, account_type):
return self._cr.mogrify("""
SELECT l.partner_id, l.currency_id, l.company_id,
CASE WHEN l.currency_id is not null AND l.amount_currency > 0.0
THEN sum(l.amount_currency)
ELSE sum(l.debit)
END as debit,
CASE WHEN l.currency_id is not null AND l.amount_currency < 0.0
THEN sum(l.amount_currency * (-1))
ELSE sum(l.credit)
END as credit
FROM account_move_line l
JOIN account_account_type at ON (at.id = l.user_type_id)
JOIN account_move m ON (l.move_id = m.id)
WHERE l.partner_id IN %(partners)s AND at.type = %(account_type)s
AND l.date < %(date_start)s AND not l.blocked
GROUP BY l.partner_id, l.currency_id, l.amount_currency,
l.company_id
""", locals())
def _initial_balance_sql_q2(self, company_id):
return """
SELECT Q1.partner_id, debit-credit AS balance,
COALESCE(Q1.currency_id, c.currency_id) AS currency_id
FROM Q1
JOIN res_company c ON (c.id = Q1.company_id)
WHERE c.id = %s
""" % company_id
def _get_account_initial_balance(self, company_id, partner_ids,
date_start, account_type, currencies):
balance_start = dict(map(lambda x: (x, []), partner_ids))
balance_start_to_display = defaultdict({})
partners = tuple(partner_ids)
# pylint: disable=E8103
self.env.cr.execute("""WITH Q1 AS (%s), Q2 AS (%s)
SELECT partner_id, currency_id, balance
FROM Q2""" % (self._initial_balance_sql_q1(partners, date_start,
account_type),
self._initial_balance_sql_q2(company_id)))
for row in self.env.cr.dictfetchall():
balance_start[row.pop('partner_id')].append(row)
for partner_id, line in balance_start.items():
currency = currencies.get(
line['currency_id'],
self.env['res.currency'].browse(line['currency_id'])
)
balance_start_to_display[partner_id][currency] = \
line['balance']
return balance_start_to_display
def _display_lines_sql_q1(self, partners, date_start, date_end,
account_type):
return self._cr.mogrify("""
SELECT m.name AS move_id, l.partner_id, l.date, l.name,
l.ref, l.blocked, l.currency_id, l.company_id,
CASE WHEN (l.currency_id is not null AND l.amount_currency > 0.0)
THEN sum(l.amount_currency)
ELSE sum(l.debit)
END as debit,
CASE WHEN (l.currency_id is not null AND l.amount_currency < 0.0)
THEN sum(l.amount_currency * (-1))
ELSE sum(l.credit)
END as credit,
CASE WHEN l.date_maturity is null
THEN l.date
ELSE l.date_maturity
END as date_maturity
FROM account_move_line l
JOIN account_account_type at ON (at.id = l.user_type_id)
JOIN account_move m ON (l.move_id = m.id)
WHERE l.partner_id IN %(partners)s AND at.type = %(account_type)s
AND %(date_start)s <= l.date AND l.date <= %(date_end)s
GROUP BY l.partner_id, m.name, l.date, l.date_maturity, l.name,
l.ref, l.blocked, l.currency_id,
l.amount_currency, l.company_id
""", locals())
def _display_lines_sql_q2(self, company_id):
return self._cr.mogrify("""
SELECT Q1.partner_id, move_id, date, date_maturity, Q1.name, ref,
debit, credit, debit-credit as amount, blocked,
COALESCE(Q1.currency_id, c.currency_id) AS currency_id
FROM Q1
JOIN res_company c ON (c.id = Q1.company_id)
WHERE c.id = %(company_id)s
""", locals())
def _get_account_display_lines(self, company_id, partner_ids, date_start,
date_end, account_type):
res = dict(map(lambda x: (x, []), partner_ids))
partners = tuple(partner_ids)
# pylint: disable=E8103
self.env.cr.execute("""
WITH Q1 AS (%s),
Q2 AS (%s)
SELECT partner_id, move_id, date, date_maturity, name, ref, debit,
credit, amount, blocked, currency_id
FROM Q2
ORDER BY date, date_maturity, move_id""" % (
self._display_lines_sql_q1(partners, date_start, date_end,
account_type),
self._display_lines_sql_q2(company_id)))
for row in self.env.cr.dictfetchall():
res[row.pop('partner_id')].append(row)
return res
@api.multi
def get_report_values(self, docids, data):
if not data:
wiz = self.env["customer.activity.statement.wizard"].with_context(
active_ids=docids, model="res.partner"
)
data = wiz.create({})._prepare_statement()
company_id = data['company_id']
partner_ids = data['partner_ids']
date_start = data['date_start']
date_end = data['date_end']
account_type = data['account_type']
today = fields.Date.today()
# There should be relatively few of these, so to speed performance we cache them
self._cr.execute("""
SELECT p.id, l.date_format
FROM res_partner p LEFT JOIN res_lang l ON p.lang=l.id
WHERE p.id IN %(partner_ids)s""", {"partner_ids": tuple(partner_ids)})
date_formats = {r[0]: r[1] for r in self._cr.fetchall()}
currencies = {x.id: x for x in self.env['res.currency'].search([])}
buckets_to_display = {}
lines_to_display = defaultdict({})
amount_due = defaultdict({})
currency_to_display = defaultdict({})
today_display, date_start_display, date_end_display = {}, {}, {}
balance_start_to_display = self._get_account_initial_balance(
company_id, partner_ids, date_start, account_type, currencies)
lines = self._get_account_display_lines(
company_id, partner_ids, date_start, date_end, account_type)
for partner_id in partner_ids:
today_display[partner_id] = self._format_date_to_partner_lang(
today, partner_id, date_formats['partner_id'])
date_start_display[partner_id] = self._format_date_to_partner_lang(
date_start, partner_id, date_formats['partner_id'])
date_end_display[partner_id] = self._format_date_to_partner_lang(
date_end, partner_id, date_formats['partner_id'])
for line in lines[partner_id]:
currency = self.env['res.currency'].browse(line['currency_id'])
if currency not in lines_to_display[partner_id]:
lines_to_display[partner_id][currency] = []
currency_to_display[partner_id][currency] = currency
if currency in balance_start_to_display[partner_id]:
amount_due[partner_id][currency] = \
balance_start_to_display[partner_id][currency]
else:
amount_due[partner_id][currency] = 0.0
if not line['blocked']:
amount_due[partner_id][currency] += line['amount']
line['balance'] = amount_due[partner_id][currency]
line['date'] = self._format_date_to_partner_lang(
line['date'], partner_id, date_formats['partner_id'])
line['date_maturity'] = self._format_date_to_partner_lang(
line['date_maturity'], partner_id, date_formats['partner_id'])
lines_to_display[partner_id][currency].append(line)
if data['show_aging_buckets']:
buckets_to_display = self._get_account_show_buckets(
company_id, partner_ids, date_end, account_type)
return {
'doc_ids': partner_ids,
'doc_model': 'res.partner',
'docs': self.env['res.partner'].browse(partner_ids),
'Amount_Due': amount_due,
'Balance_forward': balance_start_to_display,
'Lines': lines_to_display,
'Buckets': buckets_to_display,
'Currencies': currency_to_display,
'Show_Buckets': data['show_aging_buckets'],
'Filter_non_due_partners': data['filter_non_due_partners'],
'Date_start': date_start_display,
'Date_end': date_end_display,
'Date': today_display,
'account_type': account_type,
}

368
customer_statement/report/statement_common.py

@ -1,368 +0,0 @@
# Copyright 2018 Eficent Business and IT Consulting Services S.L.
# (http://www.eficent.com)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from datetime import datetime, timedelta
from odoo.tools.misc import DEFAULT_SERVER_DATE_FORMAT
from odoo import api, fields, models
class ReportStatementCommon(models.AbstractModel):
"""Abstract Report Statement for use in other models"""
_name = 'report.statement.common'
def _format_date_to_partner_lang(self, date, partner_id, date_formats=DEFAULT_SERVER_DATE_FORMAT):
"""
Note: Function kept for backwards compatibility in V12 in case of override.
Consider deprecating in v13 migration or removing
"""
return date.strftime(lang.date_format)
def _get_account_initial_balance(self, company_id, partner_ids,
date_start, account_type):
res = dict(map(lambda x: (x, []), partner_ids))
partners = ', '.join([str(i) for i in partner_ids])
date_start = datetime.strptime(
date_start, DEFAULT_SERVER_DATE_FORMAT).date()
# pylint: disable=E8103
self.env.cr.execute("""WITH Q1 AS (%s), Q2 AS (%s)
SELECT partner_id, currency_id, balance
FROM Q2""" % (self._initial_balance_sql_q1(partners, date_start,
account_type),
self._initial_balance_sql_q2(company_id)))
for row in self.env.cr.dictfetchall():
res[row.pop('partner_id')].append(row)
return res
def _display_lines_sql_q1(self, partners, date_start, date_end,
account_type):
return """
SELECT m.name AS move_id, l.partner_id, l.date, l.name,
l.ref, l.blocked, l.currency_id, l.company_id,
CASE WHEN (l.currency_id is not null AND l.amount_currency > 0.0)
THEN sum(l.amount_currency)
ELSE sum(l.debit)
END as debit,
CASE WHEN (l.currency_id is not null AND l.amount_currency < 0.0)
THEN sum(l.amount_currency * (-1))
ELSE sum(l.credit)
END as credit,
CASE WHEN l.date_maturity is null
THEN l.date
ELSE l.date_maturity
END as date_maturity
FROM account_move_line l
JOIN account_account_type at ON (at.id = l.user_type_id)
JOIN account_move m ON (l.move_id = m.id)
WHERE l.partner_id IN (%s) AND at.type = '%s'
AND '%s' <= l.date AND l.date <= '%s'
GROUP BY l.partner_id, m.name, l.date, l.date_maturity, l.name,
l.ref, l.blocked, l.currency_id,
l.amount_currency, l.company_id
""" % (partners, account_type, date_start, date_end)
def _display_lines_sql_q2(self, company_id):
return """
SELECT Q1.partner_id, move_id, date, date_maturity, Q1.name, ref,
debit, credit, debit-credit as amount, blocked,
COALESCE(Q1.currency_id, c.currency_id) AS currency_id
FROM Q1
JOIN res_company c ON (c.id = Q1.company_id)
WHERE c.id = %s
""" % company_id
def _show_buckets_sql_q0(self, date_end):
return self._cr_mogrify("""
SELECT l1.id,
CASE WHEN l1.reconciled = TRUE and l1.balance > 0.0
THEN max(pd.max_date)
WHEN l1.reconciled = TRUE and l1.balance < 0.0
THEN max(pc.max_date)
ELSE null
END as reconciled_date
FROM account_move_line l1
LEFT JOIN (SELECT pr.*
FROM account_partial_reconcile pr
INNER JOIN account_move_line l2
ON pr.credit_move_id = l2.id
WHERE l2.date <= %(date_end)s
) as pd ON pd.debit_move_id = l1.id
LEFT JOIN (SELECT pr.*
FROM account_partial_reconcile pr
INNER JOIN account_move_line l2
ON pr.debit_move_id = l2.id
WHERE l2.date <= %(date_end)s
) as pc ON pc.credit_move_id = l1.id
GROUP BY l1.id
""", locals())
def _show_buckets_sql_q1(self, partners, date_end, account_type):
return self._cr.mogrify("""
SELECT l.partner_id, l.currency_id, l.company_id, l.move_id,
CASE WHEN l.balance > 0.0
THEN l.balance - sum(coalesce(pd.amount, 0.0))
ELSE l.balance + sum(coalesce(pc.amount, 0.0))
END AS open_due,
CASE WHEN l.balance > 0.0
THEN l.amount_currency - sum(coalesce(pd.amount_currency, 0.0))
ELSE l.amount_currency + sum(coalesce(pc.amount_currency, 0.0))
END AS open_due_currency,
CASE WHEN l.date_maturity is null
THEN l.date
ELSE l.date_maturity
END as date_maturity
FROM account_move_line l
JOIN account_account_type at ON (at.id = l.user_type_id)
JOIN account_move m ON (l.move_id = m.id)
LEFT JOIN Q0 ON Q0.id = l.id
LEFT JOIN (SELECT pr.*
FROM account_partial_reconcile pr
INNER JOIN account_move_line l2
ON pr.credit_move_id = l2.id
WHERE l2.date <= %(date_end)s
) as pd ON pd.debit_move_id = l.id
LEFT JOIN (SELECT pr.*
FROM account_partial_reconcile pr
INNER JOIN account_move_line l2
ON pr.debit_move_id = l2.id
WHERE l2.date <= %(date_end)s
) as pc ON pc.credit_move_id = l.id
WHERE l.partner_id IN %(partners)s AND at.type = %(account_type)s
AND (Q0.reconciled_date is null or
Q0.reconciled_date > %(date_end)s)
AND l.date <= %(date_end)s AND not l.blocked
GROUP BY l.partner_id, l.currency_id, l.date, l.date_maturity,
l.amount_currency, l.balance, l.move_id,
l.company_id
""", locals())
def _show_buckets_sql_q2(self, date_end, minus_30, minus_60, minus_90,
minus_120):
return """
SELECT partner_id, currency_id, date_maturity, open_due,
open_due_currency, move_id, company_id,
CASE
WHEN '%s' <= date_maturity AND currency_id is null
THEN open_due
WHEN '%s' <= date_maturity AND currency_id is not null
THEN open_due_currency
ELSE 0.0
END as current,
CASE
WHEN '%s' < date_maturity AND date_maturity < '%s'
AND currency_id is null THEN open_due
WHEN '%s' < date_maturity AND date_maturity < '%s'
AND currency_id is not null
THEN open_due_currency
ELSE 0.0
END as b_1_30,
CASE
WHEN '%s' < date_maturity AND date_maturity <= '%s'
AND currency_id is null THEN open_due
WHEN '%s' < date_maturity AND date_maturity <= '%s'
AND currency_id is not null
THEN open_due_currency
ELSE 0.0
END as b_30_60,
CASE
WHEN '%s' < date_maturity AND date_maturity <= '%s'
AND currency_id is null THEN open_due
WHEN '%s' < date_maturity AND date_maturity <= '%s'
AND currency_id is not null
THEN open_due_currency
ELSE 0.0
END as b_60_90,
CASE
WHEN '%s' < date_maturity AND date_maturity <= '%s'
AND currency_id is null THEN open_due
WHEN '%s' < date_maturity AND date_maturity <= '%s'
AND currency_id is not null
THEN open_due_currency
ELSE 0.0
END as b_90_120,
CASE
WHEN date_maturity <= '%s' AND currency_id is null
THEN open_due
WHEN date_maturity <= '%s' AND currency_id is not null
THEN open_due_currency
ELSE 0.0
END as b_over_120
FROM Q1
GROUP BY partner_id, currency_id, date_maturity, open_due,
open_due_currency, move_id, company_id
""" % (date_end, date_end, minus_30, date_end, minus_30, date_end,
minus_60, minus_30, minus_60, minus_30, minus_90, minus_60,
minus_90, minus_60, minus_120, minus_90, minus_120, minus_90,
minus_120, minus_120)
def _show_buckets_sql_q3(self, company_id):
return self._cr.mogrify("""
SELECT Q2.partner_id, current, b_1_30, b_30_60, b_60_90, b_90_120,
b_over_120,
COALESCE(Q2.currency_id, c.currency_id) AS currency_id
FROM Q2
JOIN res_company c ON (c.id = Q2.company_id)
WHERE c.id = %(company_id)s
""", locals())
def _show_buckets_sql_q4(self):
return """
SELECT partner_id, currency_id, sum(current) as current,
sum(b_1_30) as b_1_30,
sum(b_30_60) as b_30_60,
sum(b_60_90) as b_60_90,
sum(b_90_120) as b_90_120,
sum(b_over_120) as b_over_120
FROM Q3
GROUP BY partner_id, currency_id
"""
def _get_bucket_dates(self, date_end, aging_type):
return getattr(
self, '_get_bucket_dates_%s' % aging_type,
self._get_bucket_dates_days
)(date_end)
def _get_bucket_dates_days(date_end):
return {
'date_end': date_end,
'minus_30': date_end - timedelta(days=30),
'minus_60': date_end - timedelta(days=60),
'minus_90': date_end - timedelta(days=90),
'minus_120': date_end - timedelta(days=120),
}
def _get_bucket_dates_months(date_end):
res = {}
d = date_end
for k in (
"date_end",
"minus_30",
"minus_60",
"minus_90",
"minus_120",
):
res[k] = d
d = d.replace(day=1) - timedelta(days=1)
return res
def _get_account_show_buckets(self, company_id, partner_ids, date_end,
account_type):
buckets = dict(map(lambda x: (x, []), partner_ids))
partners = ', '.join([str(i) for i in partner_ids])
date_end = datetime.strptime(
date_end, DEFAULT_SERVER_DATE_FORMAT).date()
full_dates = self._get_bucket_dates(date_end)
# pylint: disable=E8103
self.env.cr.execute("""
WITH Q0 AS (%s), Q1 AS (%s), Q2 AS (%s), Q3 AS (%s), Q4 AS (%s)
SELECT partner_id, currency_id, current, b_1_30, b_30_60, b_60_90,
b_90_120, b_over_120,
current+b_1_30+b_30_60+b_60_90+b_90_120+b_over_120
AS balance
FROM Q4
GROUP BY partner_id, currency_id, current, b_1_30, b_30_60, b_60_90,
b_90_120, b_over_120""" % (
self._show_buckets_sql_q0(date_end),
self._show_buckets_sql_q1(partners, date_end, account_type),
self._show_buckets_sql_q2(
full_dates['date_end'],
full_dates['minus_30'],
full_dates['minus_60'],
full_dates['minus_90'],
full_dates['minus_120']),
self._show_buckets_sql
_q3(company_id),
self._show_buckets_sql_q4()))
for row in self.env.cr.dictfetchall():
buckets[row.pop('partner_id')].append(row)
for partner_id in partner_ids:
buckets_to_display[partner_id] = {}
for line in buckets[partner_id]:
currency = self.env['res.currency'].browse(
line['currency_id'])
if currency not in buckets_to_display[partner_id]:
buckets_to_display[partner_id][currency] = []
buckets_to_display[partner_id][currency] = line
return buckets_to_display
@api.multi
def get_report_values(self, docids, data):
company_id = data['company_id']
partner_ids = data['partner_ids']
date_start = data['date_start']
date_end = data['date_end']
account_type = data['account_type']
today = fields.Date.today()
balance_start_to_display, buckets_to_display = {}, {}
lines_to_display, amount_due = {}, {}
currency_to_display = {}
today_display, date_start_display, date_end_display = {}, {}, {}
balance_start = self._get_account_initial_balance(
company_id, partner_ids, date_start, account_type)
for partner_id in partner_ids:
balance_start_to_display[partner_id] = {}
for line in balance_start[partner_id]:
currency = self.env['res.currency'].browse(line['currency_id'])
if currency not in balance_start_to_display[partner_id]:
balance_start_to_display[partner_id][currency] = []
balance_start_to_display[partner_id][currency] = \
line['balance']
lines = self._get_account_display_lines(
company_id, partner_ids, date_start, date_end, account_type)
for partner_id in partner_ids:
lines_to_display[partner_id], amount_due[partner_id] = {}, {}
currency_to_display[partner_id] = {}
today_display[partner_id] = self._format_date_to_partner_lang(
today, partner_id)
date_start_display[partner_id] = self._format_date_to_partner_lang(
date_start, partner_id)
date_end_display[partner_id] = self._format_date_to_partner_lang(
date_end, partner_id)
for line in lines[partner_id]:
currency = self.env['res.currency'].browse(line['currency_id'])
if currency not in lines_to_display[partner_id]:
lines_to_display[partner_id][currency] = []
currency_to_display[partner_id][currency] = currency
if currency in balance_start_to_display[partner_id]:
amount_due[partner_id][currency] = \
balance_start_to_display[partner_id][currency]
else:
amount_due[partner_id][currency] = 0.0
if not line['blocked']:
amount_due[partner_id][currency] += line['amount']
line['balance'] = amount_due[partner_id][currency]
line['date'] = self._format_date_to_partner_lang(
line['date'], partner_id)
line['date_maturity'] = self._format_date_to_partner_lang(
line['date_maturity'], partner_id)
lines_to_display[partner_id][currency].append(line)
if data['show_aging_buckets']:
buckets_to_display = self._get_account_show_buckets(
company_id, partner_ids, date_end, account_type)
return {
'doc_ids': partner_ids,
'doc_model': 'res.partner',
'docs': self.env['res.partner'].browse(partner_ids),
'Amount_Due': amount_due,
'Balance_forward': balance_start_to_display,
'Lines': lines_to_display,
'Buckets': buckets_to_display,
'Currencies': currency_to_display,
'Show_Buckets': data['show_aging_buckets'],
'Filter_non_due_partners': data['filter_non_due_partners'],
'Date_start': date_start_display,
'Date_end': date_end_display,
'Date': today_display,
'account_type': account_type,
}

BIN
customer_statement/static/description/Activity_Statement.png

Before

Width: 662  |  Height: 514  |  Size: 34 KiB

BIN
customer_statement/static/description/icon.png

Before

Width: 128  |  Height: 128  |  Size: 9.2 KiB

78
customer_statement/static/description/index.html

@ -1,78 +0,0 @@
<section class="oe_container">
<div class="oe_row oe_spaced">
<div class="oe_span12">
<h2 class="oe_slogan">Partner Activity Statement</h2>
</div>
<div class="oe_span6">
<div class="oe_demo oe_picture oe_screenshot">
<img src="Activity_Statement.png">
</div>
</div>
<div class="oe_span4">
<p class="oe_mt32"><div style="text-align:justify">The activity statement provides
details of all activity on the receivables or payables of a partner between two selected dates. This
includes all invoices, refunds and payments. Any outstanding balance dated prior to
the chosen statement period will appear as a forward balance at the top of the statement.
The list is displayed in chronological order and is split by currencies.<br><br>Aging
details can be shown in the report, expressed in aging buckets (30 days due, ...),
so the customer or vendor can review how much is open, due or overdue.</div></p>
</div>
</div>
</section>
<section class="oe_container">
<div class="oe_row oe_spaced">
<div class="oe_span12">
<h2 class="oe_slogan">Configuration</h2>
</div>
<div class="oe_span12">
<p class="oe_mt32">To configure this module, you need to:
<ul>
<li>Go to <code>Settings / Users</code> and edit your user to add the corresponding access rights as follows.</li>
<li>In <code>Application / Accounting & Finance</code>, select <code>Billing</code> or <code>Billing Manager</code> options.</li>
<li>In <code>Technical Setting</code> mark <code>Show Full Accounting Features</code> options.</li>
</ul>
</p>
</div>
</div>
</section>
<section class="oe_container oe_dark">
<div class="oe_row oe_spaced">
<div class="oe_span12">
<h2 class="oe_slogan">Usage</h2>
</div>
<div class="oe_span12">
<p class="oe_mt32">To use this module, you need to:
<ul>
<li>Go to <code>Invoicing > Sales > Master Data > Customers</code> or <code>Invoicing > Purchases > Master Data > Vendors</code> and select one or more</li>
<li>Press '<code>Action > Partner Activity Statement</code>'</li>
<li>Indicate if you want to display aging buckets</li>
</ul>
</p>
</div>
</div>
</section>
<section class="oe_container oe_dark">
<div class="oe_row">
<div class="oe_span12">
<h2 class="oe_slogan">Credits</h2>
</div>
<div class="oe_span12">
<h3>Contributors</h3>
<ul>
<li>Miquel Ra&iuml;ch &lt;<a href="mailto:miquel.raich@eficent.com">miquel.raich@eficent.com</a>&gt;</li>
</ul>
</div>
<div class="oe_span12">
<h3>Maintainer</h3>
<p>
This module is maintained by the OCA.<br/>
OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.<br/>
To contribute to this module, please visit <a href="http://odoo-community.org">http://odoo-community.org</a>.<br/>
<a href="http://odoo-community.org"><img class="oe_picture oe_centered" src="http://odoo-community.org/logo.png"></a>
</p>
</div>
</div>
</section>

3
customer_statement/tests/__init__.py

@ -1,3 +0,0 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from . import test_customer_activity_statement

67
customer_statement/tests/test_customer_activity_statement.py

@ -1,67 +0,0 @@
# Copyright 2018 Eficent Business and IT Consulting Services S.L.
# (http://www.eficent.com)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo.tests.common import TransactionCase
class TestCustomerActivityStatement(TransactionCase):
"""
Tests for Customer Activity Statement.
"""
def setUp(self):
super(TestCustomerActivityStatement, self).setUp()
self.res_users_model = self.env['res.users']
self.company = self.env.ref('base.main_company')
self.partner1 = self.env.ref('base.res_partner_1')
self.partner2 = self.env.ref('base.res_partner_2')
self.g_account_user = self.env.ref('account.group_account_user')
self.user = self._create_user('user_1', [self.g_account_user],
self.company).id
self.statement_model = \
self.env['report.customer_activity_statement.statement']
self.wiz = self.env['customer.activity.statement.wizard']
self.report_name = 'customer_activity_statement.statement'
self.report_title = 'Customer Activity Statement'
def _create_user(self, login, groups, company):
group_ids = [group.id for group in groups]
user = self.res_users_model.create({
'name': login,
'login': login,
'password': 'demo',
'email': 'example@yourcompany.com',
'company_id': company.id,
'company_ids': [(4, company.id)],
'groups_id': [(6, 0, group_ids)]
})
return user
def test_customer_activity_statement(self):
wiz_id = self.wiz.with_context(
active_ids=[self.partner1.id, self.partner2.id],
).create({})
statement = wiz_id.button_export_pdf()
self.assertDictContainsSubset(
{
'type': 'ir.actions.report',
'report_name': self.report_name,
'report_type': 'qweb-pdf',
},
statement,
'There was an error and the PDF report was not generated.'
)
data = wiz_id._prepare_activity_statement()
docids = data['partner_ids']
report = self.statement_model.get_report_values(docids, data)
self.assertIsInstance(report, dict,
"There was an error while compiling the report.")
self.assertIn("Show_Buckets", report,
"There was an error while compiling the report.")

34
customer_statement/views/account_payment_term.xml

@ -1,34 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2018 Graeme Gellatly
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
<odoo>
<record model="ir.ui.view" id="account_payment_term_form_view">
<field name="name">account.payment.term.form (in customer_activity_statement)</field>
<field name="model">account.payment.term</field>
<field name="inherit_id" ref="TODO othermodule.form_view"/>
<field name="arch" type="xml">
<!-- TODO -->
</field>
</record>
<record model="ir.ui.view" id="account_payment_term_search_view">
<field name="name">account.payment.term.search (in customer_activity_statement)</field>
<field name="model">account.payment.term</field>
<field name="inherit_id" ref="TODO othermodule.search_view"/>
<field name="arch" type="xml">
<!-- TODO -->
</field>
</record>
<record model="ir.ui.view" id="account_payment_term_tree_view">
<field name="name">account.payment.term.tree (in customer_activity_statement)</field>
<field name="model">account.payment.term</field>
<field name="inherit_id" ref="TODO othermodule.tree_view"/>
<field name="arch" type="xml">
<!-- TODO -->
</field>
</record>
</odoo>

171
customer_statement/views/statement.xml

@ -1,171 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2018 Eficent Business and IT Consulting Services S.L.
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
<odoo>
<template id="report_assets_common" name="oca_statements report assets" inherit_id="web.report_assets_common">
<xpath expr="." position="inside">
<link href="/customer_activity_statement/static/src/less/layout_statement.less" rel="stylesheet"/>
</xpath>
</template>
<template id="customer_activity_statement.statement_document">
<t t-call="web.external_layout">
<div class="page">
<div class="row">
<div class="col-xs-5 col-xs-offset-7">
<span t-field="o.name"/><br/>
<span t-raw="o.contact_address.replace('\n\n', '\n').replace('\n', '&lt;br&gt;')"/>
<span t-field="o.vat"/>
</div>
<h4 style="padding-left:15em;padding-top:2em">
Activity Statement
</h4>
<p>
Date: <span t-esc="Date[o.id]" /><br/><!--Today-->
<t t-if="o.ref">Partner ref: <span t-field="o.ref"/></t>
</p>
<t t-if="Lines[o.id]">
<br/>
<t t-foreach="Lines[o.id]" t-as="currency">
<br t-if="not currency_first" />
<p >
<span t-esc="'Customer' if account_type == 'receivable' else 'Supplier'"/> Activity Statement between <span t-esc="Date_start[o.id]" /> and <span t-esc="Date_end[o.id]" /> in <span t-esc="Currencies[o.id][currency].name"/>:
</p>
<table class="table table-condensed table-statement" >
<thead>
<tr>
<th >Reference number</th>
<th >Date</th>
<th >Description</th>
<th class="amount" >Amount</th>
<th class="amount" >Balance</th>
</tr>
</thead>
<tbody>
<tr>
<td />
<td >
<span t-esc="Date_start[o.id]"/>
</td>
<td >
Balance Forward
</td>
<td />
<td class="amount" >
<span t-esc="Balance_forward[o.id].get(currency, 0.0)" t-options="{'widget': 'monetary', 'display_currency': currency}"/>
</td>
</tr>
<tr t-foreach="Lines[o.id][currency]" t-as="line" t-att-class="'statement-blocked' if line['blocked'] else ''">
<td >
<span t-esc="line['move_id']"/>
</td>
<td >
<span t-esc="line['date']"/>
</td>
<td >
<t t-if="line['name'] != '/'">
<t t-if="not line['ref']"><span t-esc="line['name']"/></t>
<t t-if="line['ref'] and line['name']">
<t t-if="line['name'] not in line['ref']"><span t-esc="line['name']"/></t>
<t t-if="line['ref'] not in line['name']"><span t-esc="line['ref']"/></t>
</t>
</t>
<t t-if="line['name'] == '/'"><span t-esc="line['ref']"/></t>
</td>
<td class="amount" >
<span t-esc="line['amount']" t-options="{'widget': 'monetary', 'display_currency': currency}"/>
</td>
<td class="amount" >
<span t-esc="line['balance']" t-options="{'widget': 'monetary', 'display_currency': currency}"/>
</td>
</tr>
<tr>
<td />
<td >
<span t-esc="Date_end[o.id]"/>
</td>
<td >
Ending Balance
</td>
<td />
<td class="amount" >
<span t-esc="Amount_Due[o.id][currency]" t-options="{'widget': 'monetary', 'display_currency': currency}"/>
</td>
</tr>
</tbody>
</table>
<p>
Aging Report at <span t-esc="Date_end[o.id]" /> in <span t-esc="Currencies[o.id][currency].name"/>:
</p>
<table class="table table-condensed table-statement" t-if="Show_Buckets" >
<thead>
<tr>
<th class="amount" >Current Due</th>
<th class="amount" >1-30 Days Due</th>
<th class="amount" >30-60 Days Due</th>
<th class="amount" >60-90 Days Due</th>
<th class="amount" >90-120 Days Due</th>
<th class="amount" >+120 Days Due</th>
<th class="amount" >Balance Due</th>
</tr>
</thead>
<t t-set="buckets" t-value="Buckets[o.id].get(currency, {})" />
<tbody >
<tr >
<td class="amount" >
<span t-esc="buckets.get('current', 0.0)" t-options="{'widget': 'monetary', 'display_currency': currency}"/>
</td>
<td class="amount" >
<span t-esc="buckets.get('b_1_30', 0.0)" t-options="{'widget': 'monetary', 'display_currency': currency}"/>
</td>
<td class="amount" >
<span t-esc="buckets.get('b_30_60', 0.0)" t-options="{'widget': 'monetary', 'display_currency': currency}"/>
</td>
<td class="amount" >
<span t-esc="buckets.get('b_60_90', 0.0)" t-options="{'widget': 'monetary', 'display_currency': currency}"/>
</td>
<td class="amount" >
<span t-esc="buckets.get('b_90_120', 0.0)" t-options="{'widget': 'monetary', 'display_currency': currency}"/>
</td>
<td class="amount" >
<span t-esc="buckets.get('b_over_120', 0.0)" t-options="{'widget': 'monetary', 'display_currency': currency}"/>
</td>
<td class="amount" >
<span t-esc="buckets.get('balance', 0.0)" t-options="{'widget': 'monetary', 'display_currency': currency}"/>
</td>
</tr>
</tbody>
</table>
</t>
</t>
<p t-if="not Lines[o.id]">
<strong>The partner doesn't have due entries.</strong>
</p>
</div>
</div>
</t>
</template>
<template id="statement">
<t t-call="web.html_container">
<t t-foreach="docs" t-as="o">
<t t-if="not (Filter_non_due_partners and (not Lines[o.id]) and (len(doc_ids) > 1))">
<t t-call="customer_activity_statement.statement_document" t-lang="o.lang"/>
</t>
</t>
</t>
</template>
<report id="action_print_customer_activity_statement"
model="res.partner"
report_type="qweb-pdf"
menu="False"
string="Activity Statement"
name="customer_activity_statement.statement"
file="customer_activity_statement.statement"
/>
</odoo>

3
customer_statement/wizard/__init__.py

@ -1,3 +0,0 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from . import customer_activity_statement_wizard

38
customer_statement/wizard/customer_activity_statement_wizard.py

@ -1,38 +0,0 @@
# Copyright 2018 Eficent Business and IT Consulting Services S.L.
# (http://www.eficent.com)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from datetime import date
from odoo import api, fields, models
class CustomerActivityStatementWizard(models.TransientModel):
"""Customer Activity Statement wizard."""
_inherit = 'statement.common'
_name = 'customer.activity.statement.wizard'
_description = 'Customer Activity Statement Wizard'
def _get_date_start(self):
for record in self:
record.date_start = fields.Date.context_today() - relativedelta(day=1)
date_start = fields.Date(required=True, default='_get_date_start')
account_type = fields.Selection(
[('receivable', 'Receivable'),
('payable', 'Payable')], string='Account type', default='receivable')
def _export(self):
"""Export to PDF."""
data = self._prepare_statement()
return self.env.ref(
'customer_statement'
'.action_print_customer_activity_statement').report_action(
self, data=data)
def _prepare_activity_statement(self):
res = super()._prepare_activity_statement()
res.update({'date_start': self.date_start})
return res

56
customer_statement/wizard/customer_activity_statement_wizard.xml

@ -1,56 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2018 Eficent Business and IT Consulting Services S.L.
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
<odoo>
<!-- wizard action on res.partner -->
<act_window id="customer_activity_statement_wizard_action"
name="Partner Activity Statement"
src_model="res.partner"
res_model="customer.activity.statement.wizard"
view_type="form" view_mode="form"
key2="client_action_multi" target="new"
groups="account.group_account_user"/>
<!-- wizard view -->
<record id="customer_activity_statement_wizard_view" model="ir.ui.view">
<field name="name">Customer Activity Statement Wizard</field>
<field name="model">customer.activity.statement.wizard</field>
<field name="arch" type="xml">
<form name="Report Options">
<div style="text-align:justify">
<label string="The activity statement provides details of all activity on
a partner's receivables and payables between two selected dates. This includes all invoices,
refunds and payments. Any outstanding balance dated prior to the chosen statement
period will appear as a forward balance at the top of the statement. The list is
displayed in chronological order and is split by currencies."/><br/><br/>
<label string="Aging details can be shown in the report, expressed in aging
buckets (30 days due, ...), so the customer or vendor can review how much is open, due or overdue."/>
</div><hr/>
<group name="main_info">
<field name="company_id" options="{'no_create': True}" groups="base.group_multi_company"/>
</group>
<group name="account_type">
<label for="account_type"/>
<field name="account_type" nolabel="1" widget="radio"/>
</group>
<group name="dates">
<field name="date_start"/>
<field name="date_end"/>
</group>
<group name="aging_report">
<field name="show_aging_buckets"/>
</group>
<group name="multiple_partners">
<field name="number_partner_ids" readonly="1" invisible="1"/>
<field name="filter_partners_non_due" attrs="{'invisible': [('number_partner_ids', '=', 1)]}"/>
</group>
<footer>
<button name="button_export_pdf" string="Export PDF" type="object" default_focus="1" class="oe_highlight"/>
or
<button string="Cancel" class="oe_link" special="cancel" />
</footer>
</form>
</field>
</record>
</odoo>

27
customer_statement/wizard/customer_outstanding_statement_wizard.py

@ -1,27 +0,0 @@
# Copyright 2018 Eficent Business and IT Consulting Services S.L.
# (http://www.eficent.com)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from datetime import date
from odoo import api, fields, models
class CustomerOutstandingStatementWizard(models.TransientModel):
"""Customer Outstanding Statement wizard."""
_name = 'customer.outstanding.statement.wizard'
_description = 'Customer Outstanding Statement Wizard'
company_id = fields.Many2one(
comodel_name='res.company',
default=lambda self: self.env.user.company_id,
string='Company'
)
def _export(self):
"""Export to PDF."""
data = self._prepare_statement()
return self.env.ref(
'customer_statement'
'.action_print_customer_outstanding_statement').report_action(
self, data=data)

47
customer_statement/wizard/statement_common.py

@ -1,47 +0,0 @@
# -*- coding: utf-8 -*-
# Copyright 2018 Graeme Gellatly
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, fields, models, _
class StatementCommon(models.AbstractModel):
_name = 'statement.common'
name = fields.Char()
company_id = fields.Many2one(
comodel_name='res.company',
default=lambda self: self.env.user.company_id,
string='Company'
)
date_end = fields.Date(required=True,
default=fields.Date.context_today)
show_aging_buckets = fields.Selection(
[('auto', 'Auto'), ('always', 'Always'), ('never', 'Never')],
string='Include Aging Buckets', default=True)
number_partner_ids = fields.Integer(
default=lambda self: len(self._context['active_ids'])
)
filter_partners_non_due = fields.Boolean(
string='Don\'t show partners with no due entries', default=True)
@api.multi
def button_export_pdf(self):
self.ensure_one()
return self._export()
def _prepare_statement(self):
self.ensure_one()
return {
'date_start': self.date_start,
'date_end': self.date_end,
'company_id': self.company_id.id,
'partner_ids': self._context['active_ids'],
'show_aging_buckets': self.show_aging_buckets,
'filter_non_due_partners': self.filter_partners_non_due,
'account_type': self.account_type,
}
def _export(self):
raise NotImplementedError

132
partner_statement/README.rst

@ -0,0 +1,132 @@
=================
Partner Statement
=================
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Faccount--financial--reporting-lightgray.png?logo=github
:target: https://github.com/OCA/account-financial-reporting/tree/12.0/partner_statement
:alt: OCA/account-financial-reporting
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/account-financial-reporting-12-0/account-financial-reporting-12-0-partner_statement
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
:target: https://runbot.odoo-community.org/runbot/91/12.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
This module extends the functionality of Invoicing to support the printing of customer and vendor statements.
There are two types of statements, Activity and Outstanding. Aging details can be shown in the reports, expressed in aging buckets,
so the customer or vendor can review how much is open, due or overdue.
The activity statement provides details of all activity on the partner receivables or payables
between two selected dates. This includes all invoices, refunds and payments.
Any outstanding balance dated prior to the chosen statement period will appear
as a forward balance at the top of the statement. The list is displayed in chronological
order and is split by currencies.
The outstanding statement provides details of all outstanding partner receivables or payables
up to a particular date. This includes all unpaid invoices, unclaimed refunds and
outstanding payments. The list is displayed in chronological order and is split by currencies.
**Table of contents**
.. contents::
:local:
Configuration
=============
Users willing to access to this report should have proper Accounting & Finance rights:
#. Go to *Settings / Users* and edit your user to add the corresponding access rights as follows.
#. In *Application / Accounting & Finance*, select *Billing* or *Billing Manager*
To configure this module, you need to:
#. Go to *Configuration / Settings*
#. Under the *Followup Section* of *Accounting* option select either or both of OCA Activity or Outstanding Statement
#. Once selected, you may set default options for the reports.
#. Click *Save*
Removing the wizard from menus follows the same process.
Usage
=====
To use this module, you need to:
#. Go to Invoicing > Sales > Master Data > Customers or Invoicing > Purchases > Master Data > Vendors and select one or more
#. Press 'Action > Partner Activity Statement' or 'Action > Partner Outstanding Statement' respectively.
#. Indicate if you want to display receivables or payables, and if you want to display aging buckets and the aging type.
#. Optionally complete advanced options such as filtering non due or negative balance partners.
Known issues / Roadmap
======================
* Email template.
* Expose reports (using defaults) to billing users while restricting the wizard to managers option.
* Concept of statement run - to start an async job to send out all statements.
Changelog
=========
12.0.1.0.0 (2018-11-08)
~~~~~~~~~~~~~~~~~~~~~~~
* [BREAKING] Modules customer_activity_statement and customer_outstanding_statement merged to create partner_statement.
* [ADD] New features.
* Age by months or days
* Filter negative balances
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/account-financial-reporting/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
`feedback <https://github.com/OCA/account-financial-reporting/issues/new?body=module:%20partner_statement%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* Eficent
Contributors
~~~~~~~~~~~~
* Miquel Raïch <miquel.raich@eficent.com>
* Graeme Gellatly <graeme@o4sb.com>
Maintainers
~~~~~~~~~~~
This module is maintained by the OCA.
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
This module is part of the `OCA/account-financial-reporting <https://github.com/OCA/account-financial-reporting/tree/12.0/partner_statement>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

0
customer_outstanding_statement/__init__.py → partner_statement/__init__.py

16
customer_statement/__manifest__.py → partner_statement/__manifest__.py

@ -3,20 +3,24 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
{
'name': 'Partner Activity Statement',
'version': '11.0.2.1.0',
'name': 'Partner Statement',
'version': '12.0.1.0.0',
'category': 'Accounting & Finance',
'summary': 'OCA Financial Reports',
'author': "Eficent, Odoo Community Association (OCA)",
'website': 'https://github.com/OCA/account-financial-reporting',
'license': 'AGPL-3',
'depends': [
'account_invoicing',
'account',
],
'data': [
'views/account_payment_term.xml',
'views/statement.xml',
'wizard/customer_activity_statement_wizard.xml',
'security/statement_security.xml',
'views/activity_statement.xml',
'views/outstanding_statement.xml',
'views/assets.xml',
'views/aging_buckets.xml',
'views/res_config_settings.xml',
'wizard/statement_wizard.xml',
],
'installable': True,
'application': False,

0
customer_statement/i18n/ca.po → partner_statement/i18n/ca.po

0
customer_statement/i18n/de.po → partner_statement/i18n/de.po

0
customer_statement/i18n/es.po → partner_statement/i18n/es.po

0
customer_statement/i18n/fr.po → partner_statement/i18n/fr.po

0
customer_statement/i18n/hr_HR.po → partner_statement/i18n/hr_HR.po

0
customer_statement/i18n/it.po → partner_statement/i18n/it.po

0
customer_statement/i18n/nl.po → partner_statement/i18n/nl.po

0
customer_statement/i18n/nl_NL.po → partner_statement/i18n/nl_NL.po

0
customer_statement/i18n/customer_activity_statement.pot → partner_statement/i18n/partner_statement.pot

0
customer_statement/i18n/pt.po → partner_statement/i18n/pt.po

0
customer_statement/i18n/ro.po → partner_statement/i18n/ro.po

14
partner_statement/readme/CONFIGURE.rst

@ -0,0 +1,14 @@
Users willing to access to this report should have proper Accounting & Finance rights:
#. Go to *Settings / Users* and edit your user to add the corresponding access rights as follows.
#. In *Application / Accounting & Finance*, select *Billing* or *Billing Manager*
To configure this module, you need to:
#. Go to *Configuration / Settings*
#. Under the *Followup Section* of *Accounting* option select either or both of OCA Activity or Outstanding Statement
#. Once selected, you may set default options for the reports.
#. Click *Save*
Removing the wizard from menus follows the same process.

2
partner_statement/readme/CONTRIBUTORS.rst

@ -0,0 +1,2 @@
* Miquel Raïch <miquel.raich@eficent.com>
* Graeme Gellatly <graeme@o4sb.com>

13
partner_statement/readme/DESCRIPTION.rst

@ -0,0 +1,13 @@
This module extends the functionality of Invoicing to support the printing of customer and vendor statements.
There are two types of statements, Activity and Outstanding. Aging details can be shown in the reports, expressed in aging buckets,
so the customer or vendor can review how much is open, due or overdue.
The activity statement provides details of all activity on the partner receivables or payables
between two selected dates. This includes all invoices, refunds and payments.
Any outstanding balance dated prior to the chosen statement period will appear
as a forward balance at the top of the statement. The list is displayed in chronological
order and is split by currencies.
The outstanding statement provides details of all outstanding partner receivables or payables
up to a particular date. This includes all unpaid invoices, unclaimed refunds and
outstanding payments. The list is displayed in chronological order and is split by currencies.

7
partner_statement/readme/HISTORY.rst

@ -0,0 +1,7 @@
12.0.1.0.0 (2018-11-08)
~~~~~~~~~~~~~~~~~~~~~~~
* [BREAKING] Modules customer_activity_statement and customer_outstanding_statement merged to create partner_statement.
* [ADD] New features.
* Age by months or days
* Filter negative balances

3
partner_statement/readme/ROADMAP.rst

@ -0,0 +1,3 @@
* Email template.
* Expose reports (using defaults) to billing users while restricting the wizard to managers option.
* Concept of statement run - to start an async job to send out all statements.

6
partner_statement/readme/USAGE.rst

@ -0,0 +1,6 @@
To use this module, you need to:
#. Go to Invoicing > Sales > Master Data > Customers or Invoicing > Purchases > Master Data > Vendors and select one or more
#. Press 'Action > Partner Activity Statement' or 'Action > Partner Outstanding Statement' respectively.
#. Indicate if you want to display receivables or payables, and if you want to display aging buckets and the aging type.
#. Optionally complete advanced options such as filtering non due or negative balance partners.

3
partner_statement/report/__init__.py

@ -0,0 +1,3 @@
from . import report_statement_common
from . import activity_statement
from . import outstanding_statement

125
partner_statement/report/activity_statement.py

@ -0,0 +1,125 @@
# Copyright 2018 Eficent Business and IT Consulting Services S.L.
# (http://www.eficent.com)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo import api, models
from collections import defaultdict
class ActivityStatement(models.AbstractModel):
"""Model of Activity Statement"""
_inherit = 'statement.common'
_name = 'report.partner_statement.activity_statement'
def _initial_balance_sql_q1(self, partners, date_start, account_type):
return str(self._cr.mogrify("""
SELECT l.partner_id, l.currency_id, l.company_id,
CASE WHEN l.currency_id is not null AND l.amount_currency > 0.0
THEN sum(l.amount_currency)
ELSE sum(l.debit)
END as debit,
CASE WHEN l.currency_id is not null AND l.amount_currency < 0.0
THEN sum(l.amount_currency * (-1))
ELSE sum(l.credit)
END as credit
FROM account_move_line l
JOIN account_account_type at ON (at.id = l.user_type_id)
JOIN account_move m ON (l.move_id = m.id)
WHERE l.partner_id IN %(partners)s AND at.type = %(account_type)s
AND l.date < %(date_start)s AND not l.blocked
GROUP BY l.partner_id, l.currency_id, l.amount_currency,
l.company_id
""", locals()), "utf-8")
def _initial_balance_sql_q2(self, company_id):
return str(self._cr.mogrify("""
SELECT Q1.partner_id, debit-credit AS balance,
COALESCE(Q1.currency_id, c.currency_id) AS currency_id
FROM Q1
JOIN res_company c ON (c.id = Q1.company_id)
WHERE c.id = %(company_id)s
""", locals()), "utf-8")
def _get_account_initial_balance(self, company_id, partner_ids,
date_start, account_type):
balance_start = defaultdict(list)
partners = tuple(partner_ids)
# pylint: disable=E8103
self.env.cr.execute("""WITH Q1 AS (%s), Q2 AS (%s)
SELECT partner_id, currency_id, balance
FROM Q2""" % (self._initial_balance_sql_q1(partners, date_start,
account_type),
self._initial_balance_sql_q2(company_id)))
for row in self.env.cr.dictfetchall():
balance_start[row.pop('partner_id')].append(row)
return balance_start
def _display_lines_sql_q1(self, partners, date_start, date_end,
account_type):
return str(self._cr.mogrify("""
SELECT m.name AS move_id, l.partner_id, l.date, l.name,
l.ref, l.blocked, l.currency_id, l.company_id,
CASE WHEN (l.currency_id is not null AND l.amount_currency > 0.0)
THEN sum(l.amount_currency)
ELSE sum(l.debit)
END as debit,
CASE WHEN (l.currency_id is not null AND l.amount_currency < 0.0)
THEN sum(l.amount_currency * (-1))
ELSE sum(l.credit)
END as credit,
CASE WHEN l.date_maturity is null
THEN l.date
ELSE l.date_maturity
END as date_maturity
FROM account_move_line l
JOIN account_account_type at ON (at.id = l.user_type_id)
JOIN account_move m ON (l.move_id = m.id)
WHERE l.partner_id IN %(partners)s
AND at.type = %(account_type)s
AND %(date_start)s <= l.date
AND l.date <= %(date_end)s
GROUP BY l.partner_id, m.name, l.date, l.date_maturity, l.name,
l.ref, l.blocked, l.currency_id,
l.amount_currency, l.company_id
""", locals()), "utf-8")
def _display_lines_sql_q2(self, company_id):
return str(self._cr.mogrify("""
SELECT Q1.partner_id, move_id, date, date_maturity, Q1.name, ref,
debit, credit, debit-credit as amount, blocked,
COALESCE(Q1.currency_id, c.currency_id) AS currency_id
FROM Q1
JOIN res_company c ON (c.id = Q1.company_id)
WHERE c.id = %(company_id)s
""", locals()), "utf-8")
def _get_account_display_lines(self, company_id, partner_ids, date_start,
date_end, account_type):
res = dict(map(lambda x: (x, []), partner_ids))
partners = tuple(partner_ids)
# pylint: disable=E8103
self.env.cr.execute("""
WITH Q1 AS (%s),
Q2 AS (%s)
SELECT partner_id, move_id, date, date_maturity, name, ref, debit,
credit, amount, blocked, currency_id
FROM Q2
ORDER BY date, date_maturity, move_id""" % (
self._display_lines_sql_q1(partners, date_start, date_end,
account_type),
self._display_lines_sql_q2(company_id)))
for row in self.env.cr.dictfetchall():
res[row.pop('partner_id')].append(row)
return res
@api.multi
def _get_report_values(self, docids, data):
if not data:
wiz = self.env["activity.statement.wizard"].with_context(
active_ids=docids, model="res.partner"
)
data = wiz.create({})._prepare_statement()
data['amount_field'] = 'amount'
return super()._get_report_values(docids, data)

150
partner_statement/report/outstanding_statement.py

@ -0,0 +1,150 @@
# Copyright 2018 Eficent Business and IT Consulting Services S.L.
# (http://www.eficent.com)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo import api, models
class OutstandingStatement(models.AbstractModel):
"""Model of Outstanding Statement"""
_inherit = 'statement.common'
_name = 'report.partner_statement.outstanding_statement'
def _display_lines_sql_q0(self, date_end):
return str(
self._cr.mogrify("""
SELECT l1.id,
CASE WHEN l1.reconciled = TRUE and l1.balance > 0.0
THEN max(pd.max_date)
WHEN l1.reconciled = TRUE and l1.balance < 0.0
THEN max(pc.max_date)
ELSE null
END as reconciled_date
FROM account_move_line l1
LEFT JOIN (SELECT pr.*
FROM account_partial_reconcile pr
INNER JOIN account_move_line l2
ON pr.credit_move_id = l2.id
WHERE l2.date <= %(date_end)s
) as pd ON pd.debit_move_id = l1.id
LEFT JOIN (SELECT pr.*
FROM account_partial_reconcile pr
INNER JOIN account_move_line l2
ON pr.debit_move_id = l2.id
WHERE l2.date <= %(date_end)s
) as pc ON pc.credit_move_id = l1.id
GROUP BY l1.id
""", locals()
),
"utf-8"
)
def _display_lines_sql_q1(self, partners, date_end, account_type):
partners = tuple(partners)
return str(self._cr.mogrify("""
SELECT m.name AS move_id, l.partner_id, l.date, l.name,
l.ref, l.blocked, l.currency_id, l.company_id,
CASE WHEN (l.currency_id is not null AND l.amount_currency > 0.0)
THEN avg(l.amount_currency)
ELSE avg(l.debit)
END as debit,
CASE WHEN (l.currency_id is not null AND l.amount_currency < 0.0)
THEN avg(l.amount_currency * (-1))
ELSE avg(l.credit)
END as credit,
CASE WHEN l.balance > 0.0
THEN l.balance - sum(coalesce(pd.amount, 0.0))
ELSE l.balance + sum(coalesce(pc.amount, 0.0))
END AS open_amount,
CASE WHEN l.balance > 0.0
THEN l.amount_currency - sum(coalesce(pd.amount_currency, 0.0))
ELSE l.amount_currency + sum(coalesce(pc.amount_currency, 0.0))
END AS open_amount_currency,
CASE WHEN l.date_maturity is null
THEN l.date
ELSE l.date_maturity
END as date_maturity
FROM account_move_line l
JOIN account_account_type at ON (at.id = l.user_type_id)
JOIN account_move m ON (l.move_id = m.id)
LEFT JOIN Q0 ON Q0.id = l.id
LEFT JOIN (SELECT pr.*
FROM account_partial_reconcile pr
INNER JOIN account_move_line l2
ON pr.credit_move_id = l2.id
WHERE l2.date <= %(date_end)s
) as pd ON pd.debit_move_id = l.id
LEFT JOIN (SELECT pr.*
FROM account_partial_reconcile pr
INNER JOIN account_move_line l2
ON pr.debit_move_id = l2.id
WHERE l2.date <= %(date_end)s
) as pc ON pc.credit_move_id = l.id
WHERE l.partner_id IN %(partners)s AND at.type = %(account_type)s
AND (Q0.reconciled_date is null or
Q0.reconciled_date > %(date_end)s)
AND l.date <= %(date_end)s
GROUP BY l.partner_id, m.name, l.date, l.date_maturity, l.name,
l.ref, l.blocked, l.currency_id,
l.balance, l.amount_currency, l.company_id
""", locals()), "utf-8"
)
def _display_lines_sql_q2(self):
return str(
self._cr.mogrify("""
SELECT partner_id, currency_id, move_id, date, date_maturity,
debit, credit, name, ref, blocked, company_id,
CASE WHEN currency_id is not null
THEN open_amount_currency
ELSE open_amount
END as open_amount
FROM Q1
""", locals()
),
"utf-8"
)
def _display_lines_sql_q3(self, company_id):
return str(self._cr.mogrify("""
SELECT Q2.partner_id, move_id, date, date_maturity, Q2.name, ref,
debit, credit, debit-credit AS amount, blocked,
COALESCE(Q2.currency_id, c.currency_id) AS currency_id, open_amount
FROM Q2
JOIN res_company c ON (c.id = Q2.company_id)
WHERE c.id = %(company_id)s
""", locals()), "utf-8"
)
def _get_account_display_lines(self, company_id, partner_ids, date_start,
date_end, account_type):
res = dict(map(lambda x: (x, []), partner_ids))
partners = tuple(partner_ids)
# pylint: disable=E8103
self.env.cr.execute("""
WITH Q0 as (%s),
Q1 AS (%s),
Q2 AS (%s),
Q3 AS (%s)
SELECT partner_id, currency_id, move_id, date, date_maturity, debit,
credit, amount, open_amount, name, ref, blocked
FROM Q3
ORDER BY date, date_maturity, move_id""" % (
self._display_lines_sql_q0(date_end),
self._display_lines_sql_q1(partners, date_end, account_type),
self._display_lines_sql_q2(),
self._display_lines_sql_q3(company_id)))
for row in self.env.cr.dictfetchall():
res[row.pop('partner_id')].append(row)
return res
@api.multi
def _get_report_values(self, docids, data):
if not data:
wiz = self.env["outstanding.statement.wizard"].with_context(
active_ids=docids, model="res.partner"
)
data = wiz.create({})._prepare_statement()
data['amount_field'] = 'open_amount'
return super()._get_report_values(docids, data)

434
partner_statement/report/report_statement_common.py

@ -0,0 +1,434 @@
# Copyright 2018 Eficent Business and IT Consulting Services S.L.
# (http://www.eficent.com)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from datetime import datetime, timedelta
from odoo.tools.misc import DEFAULT_SERVER_DATE_FORMAT
from odoo import api, fields, models, _
class ReportStatementCommon(models.AbstractModel):
"""Abstract Report Statement for use in other models"""
_name = 'statement.common'
_description = 'Statement Reports Common'
def _format_date_to_partner_lang(
self,
date,
date_format=DEFAULT_SERVER_DATE_FORMAT
):
if isinstance(date, str):
date = datetime.strptime(date, DEFAULT_SERVER_DATE_FORMAT)
return date.strftime(date_format) if date else ''
def _get_account_display_lines(self, company_id, partner_ids, date_start,
date_end, account_type):
raise NotImplementedError
def _get_account_initial_balance(self, company_id, partner_ids,
date_start, account_type):
return {}
def _show_buckets_sql_q0(self, date_end):
return str(self._cr.mogrify("""
SELECT l1.id,
CASE WHEN l1.reconciled = TRUE and l1.balance > 0.0
THEN max(pd.max_date)
WHEN l1.reconciled = TRUE and l1.balance < 0.0
THEN max(pc.max_date)
ELSE null
END as reconciled_date
FROM account_move_line l1
LEFT JOIN (SELECT pr.*
FROM account_partial_reconcile pr
INNER JOIN account_move_line l2
ON pr.credit_move_id = l2.id
WHERE l2.date <= %(date_end)s
) as pd ON pd.debit_move_id = l1.id
LEFT JOIN (SELECT pr.*
FROM account_partial_reconcile pr
INNER JOIN account_move_line l2
ON pr.debit_move_id = l2.id
WHERE l2.date <= %(date_end)s
) as pc ON pc.credit_move_id = l1.id
GROUP BY l1.id
""", locals()), "utf-8")
def _show_buckets_sql_q1(self, partners, date_end, account_type):
return str(self._cr.mogrify("""
SELECT l.partner_id, l.currency_id, l.company_id, l.move_id,
CASE WHEN l.balance > 0.0
THEN l.balance - sum(coalesce(pd.amount, 0.0))
ELSE l.balance + sum(coalesce(pc.amount, 0.0))
END AS open_due,
CASE WHEN l.balance > 0.0
THEN l.amount_currency - sum(coalesce(pd.amount_currency, 0.0))
ELSE l.amount_currency + sum(coalesce(pc.amount_currency, 0.0))
END AS open_due_currency,
CASE WHEN l.date_maturity is null
THEN l.date
ELSE l.date_maturity
END as date_maturity
FROM account_move_line l
JOIN account_account_type at ON (at.id = l.user_type_id)
JOIN account_move m ON (l.move_id = m.id)
LEFT JOIN Q0 ON Q0.id = l.id
LEFT JOIN (SELECT pr.*
FROM account_partial_reconcile pr
INNER JOIN account_move_line l2
ON pr.credit_move_id = l2.id
WHERE l2.date <= %(date_end)s
) as pd ON pd.debit_move_id = l.id
LEFT JOIN (SELECT pr.*
FROM account_partial_reconcile pr
INNER JOIN account_move_line l2
ON pr.debit_move_id = l2.id
WHERE l2.date <= %(date_end)s
) as pc ON pc.credit_move_id = l.id
WHERE l.partner_id IN %(partners)s AND at.type = %(account_type)s
AND (Q0.reconciled_date is null or
Q0.reconciled_date > %(date_end)s)
AND l.date <= %(date_end)s AND not l.blocked
GROUP BY l.partner_id, l.currency_id, l.date, l.date_maturity,
l.amount_currency, l.balance, l.move_id,
l.company_id
""", locals()), "utf-8")
def _show_buckets_sql_q2(self, date_end, minus_30, minus_60, minus_90,
minus_120):
return str(self._cr.mogrify("""
SELECT partner_id, currency_id, date_maturity, open_due,
open_due_currency, move_id, company_id,
CASE
WHEN %(date_end)s <= date_maturity AND currency_id is null
THEN open_due
WHEN %(date_end)s <= date_maturity AND currency_id is not null
THEN open_due_currency
ELSE 0.0
END as current,
CASE
WHEN %(minus_30)s < date_maturity
AND date_maturity < %(date_end)s
AND currency_id is null
THEN open_due
WHEN %(minus_30)s < date_maturity
AND date_maturity < %(date_end)s
AND currency_id is not null
THEN open_due_currency
ELSE 0.0
END as b_1_30,
CASE
WHEN %(minus_60)s < date_maturity
AND date_maturity <= %(minus_30)s
AND currency_id is null
THEN open_due
WHEN %(minus_60)s < date_maturity
AND date_maturity <= %(minus_30)s
AND currency_id is not null
THEN open_due_currency
ELSE 0.0
END as b_30_60,
CASE
WHEN %(minus_90)s < date_maturity
AND date_maturity <= %(minus_60)s
AND currency_id is null
THEN open_due
WHEN %(minus_90)s < date_maturity
AND date_maturity <= %(minus_60)s
AND currency_id is not null
THEN open_due_currency
ELSE 0.0
END as b_60_90,
CASE
WHEN %(minus_120)s < date_maturity
AND date_maturity <= %(minus_90)s
AND currency_id is null
THEN open_due
WHEN %(minus_120)s < date_maturity
AND date_maturity <= %(minus_90)s
AND currency_id is not null
THEN open_due_currency
ELSE 0.0
END as b_90_120,
CASE
WHEN date_maturity <= %(minus_120)s
AND currency_id is null
THEN open_due
WHEN date_maturity <= %(minus_120)s
AND currency_id is not null
THEN open_due_currency
ELSE 0.0
END as b_over_120
FROM Q1
GROUP BY partner_id, currency_id, date_maturity, open_due,
open_due_currency, move_id, company_id
""", locals()), "utf-8")
def _show_buckets_sql_q3(self, company_id):
return str(self._cr.mogrify("""
SELECT Q2.partner_id, current, b_1_30, b_30_60, b_60_90, b_90_120,
b_over_120,
COALESCE(Q2.currency_id, c.currency_id) AS currency_id
FROM Q2
JOIN res_company c ON (c.id = Q2.company_id)
WHERE c.id = %(company_id)s
""", locals()), "utf-8")
def _show_buckets_sql_q4(self):
return """
SELECT partner_id, currency_id, sum(current) as current,
sum(b_1_30) as b_1_30,
sum(b_30_60) as b_30_60,
sum(b_60_90) as b_60_90,
sum(b_90_120) as b_90_120,
sum(b_over_120) as b_over_120
FROM Q3
GROUP BY partner_id, currency_id
"""
def _get_bucket_dates(self, date_end, aging_type):
return getattr(
self, '_get_bucket_dates_%s' % aging_type,
self._get_bucket_dates_days
)(date_end)
def _get_bucket_dates_days(self, date_end):
return {
'date_end': date_end,
'minus_30': date_end - timedelta(days=30),
'minus_60': date_end - timedelta(days=60),
'minus_90': date_end - timedelta(days=90),
'minus_120': date_end - timedelta(days=120),
}
def _get_bucket_dates_months(self, date_end):
res = {}
d = date_end
for k in (
"date_end",
"minus_30",
"minus_60",
"minus_90",
"minus_120",
):
res[k] = d
d = d.replace(day=1) - timedelta(days=1)
return res
def _get_account_show_buckets(self, company_id, partner_ids, date_end,
account_type, aging_type):
buckets = dict(map(lambda x: (x, []), partner_ids))
partners = tuple(partner_ids)
full_dates = self._get_bucket_dates(date_end, aging_type)
# pylint: disable=E8103
# All input queries are properly escaped - false positive
self.env.cr.execute("""
WITH Q0 AS (%s),
Q1 AS (%s),
Q2 AS (%s),
Q3 AS (%s),
Q4 AS (%s)
SELECT partner_id, currency_id, current, b_1_30, b_30_60, b_60_90,
b_90_120, b_over_120,
current+b_1_30+b_30_60+b_60_90+b_90_120+b_over_120
AS balance
FROM Q4
GROUP BY partner_id, currency_id, current, b_1_30, b_30_60,
b_60_90, b_90_120, b_over_120""" % (
self._show_buckets_sql_q0(date_end),
self._show_buckets_sql_q1(partners, date_end, account_type),
self._show_buckets_sql_q2(
full_dates['date_end'],
full_dates['minus_30'],
full_dates['minus_60'],
full_dates['minus_90'],
full_dates['minus_120']),
self._show_buckets_sql_q3(company_id),
self._show_buckets_sql_q4()))
for row in self.env.cr.dictfetchall():
buckets[row.pop('partner_id')].append(row)
return buckets
def _get_bucket_labels(self, date_end, aging_type):
return getattr(
self, '_get_bucket_labels_%s' % aging_type,
self._get_bucket_dates_days
)(date_end)
def _get_bucket_labels_days(self, date_end):
return [
_('Current'),
_('1 - 30 Days'),
_('31 - 60 Days'),
_('61 - 90 Days'),
_('91 - 120 Days'),
_('121 Days +'),
_('Total'),
]
def _get_bucket_labels_months(self, date_end):
return [
_('Current'),
_('1 Month'),
_('2 Months'),
_('3 Months'),
_('4 Months'),
_('Older'),
_('Total'),
]
def _get_line_currency_defaults(self, currency_id, currencies,
balance_forward):
if currency_id not in currencies:
# This will only happen if currency is inactive
currencies[currency_id] = (
self.env['res.currency'].browse(currency_id)
)
return (
{
'lines': [],
'buckets': [],
'balance_forward': balance_forward,
'amount_due': balance_forward,
},
currencies
)
@api.multi
def _get_report_values(self, docids, data):
"""
@return: returns a dict of parameters to pass to qweb report.
the most important pair is {'data': res} which contains all
the data for each partner. It is structured like:
{partner_id: {
'start': date string,
'end': date_string,
'today': date_string
'currencies': {
currency_id: {
'lines': [{'date': date string, ...}, ...],
'balance_forward': float,
'amount_due': float,
'buckets': {
'p1': float, 'p2': ...
}
}
}
}
"""
company_id = data['company_id']
partner_ids = data['partner_ids']
date_start = data.get('date_start')
if date_start and isinstance(date_start, str):
date_start = datetime.strptime(
date_start, DEFAULT_SERVER_DATE_FORMAT
).date()
date_end = data['date_end']
if isinstance(date_end, str):
date_end = datetime.strptime(
date_end, DEFAULT_SERVER_DATE_FORMAT
).date()
account_type = data['account_type']
aging_type = data['aging_type']
today = fields.Date.today()
amount_field = data.get('amount_field', 'amount')
# There should be relatively few of these, so to speed performance
# we cache them
self._cr.execute("""
SELECT p.id, l.date_format
FROM res_partner p LEFT JOIN res_lang l ON p.lang=l.code
WHERE p.id IN %(partner_ids)s
""", {"partner_ids": tuple(partner_ids)})
date_formats = {r[0]: r[1] for r in self._cr.fetchall()}
currencies = {x.id: x for x in self.env['res.currency'].search([])}
res = {}
# get base data
lines = self._get_account_display_lines(
company_id, partner_ids, date_start, date_end, account_type)
balances_forward = self._get_account_initial_balance(
company_id, partner_ids, date_start, account_type)
if data['show_aging_buckets']:
buckets = self._get_account_show_buckets(
company_id, partner_ids, date_end, account_type, aging_type)
bucket_labels = self._get_bucket_labels(date_end, aging_type)
else:
bucket_labels = {}
# organise and format for report
format_date = self._format_date_to_partner_lang
partners_to_remove = set()
for partner_id in partner_ids:
res[partner_id] = {
'today': format_date(today, date_formats[partner_id]),
'start': format_date(date_start, date_formats[partner_id]),
'end': format_date(date_end, date_formats[partner_id]),
'currencies': {},
}
currency_dict = res[partner_id]['currencies']
for line in balances_forward.get(partner_id, []):
currency_dict[line['currency_id']], currencies = (
self._get_line_currency_defaults(
line['currency_id'], currencies, line['balance'])
)
for line in lines[partner_id]:
if line['currency_id'] not in currency_dict:
currency_dict[line['currency_id']], currencies = (
self._get_line_currency_defaults(
line['currency_id'], currencies, 0.0)
)
line_currency = currency_dict[line['currency_id']]
if not line['blocked']:
line_currency['amount_due'] += line[amount_field]
line['balance'] = line_currency['amount_due']
line['date'] = format_date(
line['date'], date_formats[partner_id]
)
line['date_maturity'] = format_date(
line['date_maturity'], date_formats[partner_id]
)
line_currency['lines'].append(line)
if data['show_aging_buckets']:
for line in buckets[partner_id]:
if line['currency_id'] not in currency_dict:
currency_dict[line['currency_id']], currencies = (
self._get_line_currency_defaults(
line['currency_id'], currencies, 0.0)
)
line_currency = currency_dict[line['currency_id']]
line_currency['buckets'] = line
if len(partner_ids) > 1:
values = currency_dict.values()
if not any(
[v['lines'] or v['balance_forward'] for v in values]
):
if data["filter_non_due_partners"]:
partners_to_remove.add(partner_id)
continue
else:
res[partner_id]['no_entries'] = True
if data["filter_negative_balances"]:
if not all([v['amount_due'] >= 0.0 for v in values]):
partners_to_remove.add(partner_id)
for partner in partners_to_remove:
del res[partner]
partner_ids.remove(partner)
return {
'doc_ids': partner_ids,
'doc_model': 'res.partner',
'docs': self.env['res.partner'].browse(partner_ids),
'data': res,
'company': self.env['res.company'].browse(company_id),
'Currencies': currencies,
'account_type': account_type,
'bucket_labels': bucket_labels,
}

14
partner_statement/security/statement_security.xml

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="group_activity_statement" model="res.groups">
<field name="name">Use activity statements</field>
<field name="category_id" ref="base.module_category_hidden"/>
</record>
<record id="group_outstanding_statement" model="res.groups">
<field name="name">Use outstanding statements</field>
<field name="category_id" ref="base.module_category_hidden"/>
</record>
</odoo>

0
customer_outstanding_statement/static/description/icon.png → partner_statement/static/description/icon.png

Before

Width: 128  |  Height: 128  |  Size: 9.2 KiB

After

Width: 128  |  Height: 128  |  Size: 9.2 KiB

4
customer_statement/static/src/less/layout_statement.less → partner_statement/static/src/scss/layout_statement.scss

@ -15,8 +15,8 @@
}
.statement-blocked {
background-color: @gray-lighter-darker !important;
background-color: $gray-500 !important;
td:last-child {
background-color: @gray-lighter-darker !important;
background-color: $gray-500 !important;
}
}

3
partner_statement/tests/__init__.py

@ -0,0 +1,3 @@
from . import test_activity_statement
from . import test_outstanding_statement
from . import test_res_config_settings

111
partner_statement/tests/test_activity_statement.py

@ -0,0 +1,111 @@
# Copyright 2018 Eficent Business and IT Consulting Services S.L.
# (http://www.eficent.com)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from datetime import date
from odoo.tests.common import TransactionCase
from odoo import fields
class TestActivityStatement(TransactionCase):
"""
Tests for Activity Statement.
"""
def setUp(self):
super().setUp()
self.res_users_model = self.env['res.users']
self.company = self.env.ref('base.main_company')
self.partner1 = self.env.ref('base.res_partner_1')
self.partner2 = self.env.ref('base.res_partner_2')
self.g_account_user = self.env.ref('account.group_account_user')
self.user = self._create_user('user_1', [self.g_account_user],
self.company).id
self.statement_model = \
self.env['report.partner_statement.activity_statement']
self.wiz = self.env['activity.statement.wizard']
self.report_name = 'partner_statement.activity_statement'
self.report_title = 'Activity Statement'
self.today = fields.Date.context_today(self.wiz)
def _create_user(self, login, groups, company):
group_ids = [group.id for group in groups]
user = self.res_users_model.create({
'name': login,
'login': login,
'password': 'demo',
'email': 'example@yourcompany.com',
'company_id': company.id,
'company_ids': [(4, company.id)],
'groups_id': [(6, 0, group_ids)]
})
return user
def test_customer_activity_statement(self):
wiz_id = self.wiz.with_context(
active_ids=[self.partner1.id, self.partner2.id],
).create({})
wiz_id.aging_type = 'months'
wiz_id.show_aging_buckets = False
statement = wiz_id.button_export_pdf()
self.assertDictContainsSubset(
{
'type': 'ir.actions.report',
'report_name': self.report_name,
'report_type': 'qweb-pdf',
},
statement,
'There was an error and the PDF report was not generated.'
)
data = wiz_id._prepare_statement()
docids = data['partner_ids']
report = self.statement_model._get_report_values(docids, data)
self.assertIsInstance(report, dict,
"There was an error while compiling the report.")
self.assertIn("bucket_labels", report,
"There was an error while compiling the report.")
def test_customer_activity_report_no_wizard(self):
docids = [self.partner1.id, self.partner2.id]
report = self.statement_model._get_report_values(docids, False)
self.assertIsInstance(report, dict,
"There was an error while compiling the report.")
self.assertIn("bucket_labels", report,
"There was an error while compiling the report.")
def test_date_formatting(self):
date_fmt = '%d/%m/%Y'
test_date = date(2018, 9, 30)
res = self.statement_model._format_date_to_partner_lang(
test_date, date_fmt
)
self.assertEqual(res, '30/09/2018')
test_date_string = '2018-09-30'
res = self.statement_model._format_date_to_partner_lang(
test_date_string, date_fmt
)
self.assertEqual(res, '30/09/2018')
def test_onchange_aging_type(self):
"""Test that partner data is filled accodingly"""
wiz_id = self.wiz.with_context(
active_ids=[self.partner1.id, self.partner2.id],
).new()
wiz_id.aging_type = 'months'
wiz_id.onchange_aging_type()
self.assertEqual(wiz_id.date_end.month, wiz_id.date_start.month)
self.assertTrue(wiz_id.date_end.day > wiz_id.date_start.day)
self.assertTrue(wiz_id.date_end < self.today)
wiz_id.aging_type = 'days'
wiz_id.onchange_aging_type()
self.assertEqual((wiz_id.date_end - wiz_id.date_start).days, 30)
self.assertTrue(wiz_id.date_end == self.today)

29
customer_outstanding_statement/tests/test_customer_outstanding_statement.py → partner_statement/tests/test_outstanding_statement.py

@ -5,12 +5,12 @@
from odoo.tests.common import TransactionCase
class TestCustomerOutstandingStatement(TransactionCase):
class TestOutstandingStatement(TransactionCase):
"""
Tests for Customer Outstanding Statement.
Tests for Outstanding Statement.
"""
def setUp(self):
super(TestCustomerOutstandingStatement, self).setUp()
super().setUp()
self.res_users_model = self.env['res.users']
self.company = self.env.ref('base.main_company')
@ -22,10 +22,10 @@ class TestCustomerOutstandingStatement(TransactionCase):
self.company).id
self.statement_model = \
self.env['report.customer_outstanding_statement.statement']
self.wiz = self.env['customer.outstanding.statement.wizard']
self.report_name = 'customer_outstanding_statement.statement'
self.report_title = 'Customer Outstanding Statement'
self.env['report.partner_statement.outstanding_statement']
self.wiz = self.env['outstanding.statement.wizard']
self.report_name = 'partner_statement.outstanding_statement'
self.report_title = 'Outstanding Statement'
def _create_user(self, login, groups, company):
group_ids = [group.id for group in groups]
@ -45,6 +45,7 @@ class TestCustomerOutstandingStatement(TransactionCase):
wiz_id = self.wiz.with_context(
active_ids=[self.partner1.id, self.partner2.id],
).create({})
wiz_id.aging_type = 'months'
statement = wiz_id.button_export_pdf()
@ -58,11 +59,19 @@ class TestCustomerOutstandingStatement(TransactionCase):
'There was an error and the PDF report was not generated.'
)
data = wiz_id._prepare_outstanding_statement()
data = wiz_id._prepare_statement()
docids = data['partner_ids']
report = self.statement_model.get_report_values(docids, data)
report = self.statement_model._get_report_values(docids, data)
self.assertIsInstance(report,
dict,
"There was an error while compiling the report.")
self.assertIn("Show_Buckets", report,
self.assertIn("bucket_labels", report,
"There was an error while compiling the report.")
def test_customer_outstanding_report_no_wizard(self):
docids = [self.partner1.id]
report = self.statement_model._get_report_values(docids, False)
self.assertIsInstance(report, dict,
"There was an error while compiling the report.")
self.assertIn("bucket_labels", report,
"There was an error while compiling the report.")

36
partner_statement/tests/test_res_config_settings.py

@ -0,0 +1,36 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo.tests.common import TransactionCase
class TestResConfigSettings(TransactionCase):
def setUp(self):
super().setUp()
self.config = self.env['res.config.settings']
self.cr.execute(
"SELECT uid FROM res_groups_users_rel "
"WHERE gid IN (SELECT res_id FROM ir_model_data "
" WHERE module='account' AND name='group_account_invoice') "
"ORDER BY uid DESC LIMIT 1"
)
self.account_user = self.cr.fetchone()[0]
self.user_obj = self.env['res.users'].sudo(self.account_user)
def test_groups(self):
conf = self.config.create({
"default_aging_type": "months",
"group_activity_statement": True,
"group_outstanding_statement": False,
})
conf.set_values()
self.assertFalse(self.user_obj._has_group(
'partner_statement.group_outstanding_statement')
)
self.assertTrue(self.user_obj._has_group(
'partner_statement.group_activity_statement')
)
res = self.env['ir.default'].get(
'activity.statement.wizard', 'aging_type'
)
self.assertEquals(res, 'months')

130
partner_statement/views/activity_statement.xml

@ -0,0 +1,130 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2018 Eficent Business and IT Consulting Services S.L.
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
<odoo>
<template id="partner_statement.activity_statement_document">
<t t-call="web.external_layout">
<t t-set="o" t-value="o.with_context({'lang': lang})"/>
<t t-set="address">
<address t-esc="o" t-options='{"widget": "contact", "fields": ["address", "name"], "no_marker": True}' />
<div t-if="o.vat" class="mt16"><t t-esc="company.country_id.vat_label or 'Tax ID'"/>: <span t-field="o.partner_id.vat"/></div>
</t>
<div class="page">
<h2 >Statement of Account</h2>
<p>
Date: <span t-esc="d['today']" /><br/>
<t t-if="o.ref">Partner ref: <span t-field="o.ref"/></t>
</p>
<t t-if="d['currencies']">
<br/>
<t t-foreach="d['currencies'].items()" t-as="currency">
<t t-set="display_currency" t-value="Currencies[currency[0]]" />
<t t-set="currency" t-value="currency[1]" />
<p>
<span t-esc="'' if account_type == 'receivable' else 'Supplier '"/>Statement between <span t-esc="d['start']" /> and <span t-esc="d['end']" /> in <span t-esc="display_currency.name"/>
</p>
<table class="table table-condensed table-statement">
<thead>
<tr>
<th>Reference number</th>
<th>Date</th>
<th>Description</th>
<th class="amount">Amount</th>
<th class="amount">Balance</th>
</tr>
</thead>
<tbody>
<tr>
<td />
<td>
<span t-esc="d['start']"/>
</td>
<td>
Balance Forward
</td>
<td />
<td class="amount">
<span t-esc="currency['balance_forward']" t-options="{'widget': 'monetary', 'display_currency': display_currency}"/>
</td>
</tr>
<tr t-foreach="currency['lines']" t-as="line" t-att-class="'statement-blocked' if line['blocked'] else ''">
<td>
<span t-esc="line['move_id']"/>
</td>
<td>
<span t-esc="line['date']"/>
</td>
<td>
<t t-if="line['name'] != '/'">
<t t-if="not line['ref']">
<span t-esc="line['name']"/>
</t>
<t t-if="line['ref'] and line['name']">
<t t-if="line['name'] not in line['ref']">
<span t-esc="line['name']"/>
</t>
<t t-if="line['ref'] not in line['name']">
<span t-esc="line['ref']"/>
</t>
</t>
</t>
<t t-if="line['name'] == '/'">
<span t-esc="line['ref']"/>
</t>
</td>
<td class="amount">
<span t-esc="line['amount']" t-options="{'widget': 'monetary', 'display_currency': display_currency}"/>
</td>
<td class="amount">
<span t-esc="line['balance']" t-options="{'widget': 'monetary', 'display_currency': display_currency}"/>
</td>
</tr>
<tr>
<td />
<td>
<span t-esc="d['end']"/>
</td>
<td>
Ending Balance
</td>
<td />
<td class="amount">
<span t-esc="currency['amount_due']" t-options="{'widget': 'monetary', 'display_currency': display_currency}"/>
</td>
</tr>
</tbody>
</table>
<t t-call="partner_statement.aging_buckets" t-if="currency['buckets']" />
</t>
</t>
<p t-if="d.get('no_entries')">
<strong>The partner doesn't have due entries.</strong>
</p>
</div>
</t>
</template>
<template id="activity_statement">
<t t-call="web.html_container">
<t t-foreach="docs" t-as="o">
<t t-set="d" t-value="data.get(o.id)" />
<t t-call="partner_statement.activity_statement_document" t-lang="o.lang"/>
</t>
</t>
</template>
<report id="action_print_activity_statement"
model="res.partner"
report_type="qweb-pdf"
menu="False"
string="Activity Statement"
name="partner_statement.activity_statement"
file="partner_statement.activity_statement"
/>
</odoo>

49
partner_statement/views/aging_buckets.xml

@ -0,0 +1,49 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2018 Eficent Business and IT Consulting Services S.L.
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
<odoo>
<template id="aging_buckets">
<p>
Aging Report at <span t-esc="d['end']" /> in <span t-esc="display_currency.name"/>:
</p>
<table class="table table-sm table-statement">
<thead>
<tr>
<t t-foreach="bucket_labels" t-as="bl">
<th class="amount">
<span t-esc="bl" />
</th>
</t>
</tr>
</thead>
<t t-set="buckets" t-value="currency['buckets']" />
<tbody>
<tr>
<td class="amount">
<span t-esc="buckets.get('current', 0.0)" t-options="{'widget': 'monetary', 'display_currency': display_currency}"/>
</td>
<td class="amount">
<span t-esc="buckets.get('b_1_30', 0.0)" t-options="{'widget': 'monetary', 'display_currency': display_currency}"/>
</td>
<td class="amount">
<span t-esc="buckets.get('b_30_60', 0.0)" t-options="{'widget': 'monetary', 'display_currency': display_currency}"/>
</td>
<td class="amount">
<span t-esc="buckets.get('b_60_90', 0.0)" t-options="{'widget': 'monetary', 'display_currency': display_currency}"/>
</td>
<td class="amount">
<span t-esc="buckets.get('b_90_120', 0.0)" t-options="{'widget': 'monetary', 'display_currency': display_currency}"/>
</td>
<td class="amount">
<span t-esc="buckets.get('b_over_120', 0.0)" t-options="{'widget': 'monetary', 'display_currency': display_currency}"/>
</td>
<td class="amount">
<span t-esc="buckets.get('balance', 0.0)" t-options="{'widget': 'monetary', 'display_currency': display_currency}"/>
</td>
</tr>
</tbody>
</table>
</template>
</odoo>

12
partner_statement/views/assets.xml

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2018 Eficent Business and IT Consulting Services S.L.
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
<odoo>
<template id="report_assets_common" name="oca_statements report assets" inherit_id="web.report_assets_common">
<xpath expr="." position="inside">
<link rel="stylesheet" href="/partner_statement/static/src/scss/layout_statement.scss" type="text/scss" />
</xpath>
</template>
</odoo>

126
partner_statement/views/outstanding_statement.xml

@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2018 Eficent Business and IT Consulting Services S.L.
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
<odoo>
<template id="partner_statement.outstanding_statement_document">
<t t-call="web.external_layout">
<t t-set="o" t-value="o.with_context({'lang': lang})"/>
<t t-set="address">
<address t-esc="o" t-options='{"widget": "contact", "fields": ["address", "name"], "no_marker": True}' />
<div t-if="o.vat" class="mt16"><t t-esc="company.country_id.vat_label or 'Tax ID'"/>: <span t-field="o.partner_id.vat"/></div>
</t>
<div class="page">
<h2 >Statement of Account</h2>
<p>
Date: <span t-esc="d['today']" /><br/>
<t t-if="o.ref">Partner ref: <span t-field="o.ref"/></t>
</p>
<t t-if="d['currencies']">
<br/>
<t t-foreach="d['currencies'].items()" t-as="currency">
<t t-set="display_currency" t-value="Currencies[currency[0]]" />
<t t-set="currency" t-value="currency[1]" />
<p>
<span t-esc="'' if account_type == 'receivable' else 'Supplier '"/>Statement up to <span t-esc="d['end']" /> in <span t-esc="display_currency.name"/>
</p>
<table class="table table-sm table-statement">
<thead>
<tr>
<th>Reference number</th>
<th>Date</th>
<th>Due Date</th>
<th>Description</th>
<th class="amount">Original</th>
<th class="amount">Open Amount</th>
<th class="amount">Balance</th>
</tr>
</thead>
<tbody>
<tr t-foreach="currency['lines']" t-as="line" t-att-class="'statement-blocked' if line['blocked'] else ''">
<td>
<span t-esc="line['move_id']"/>
</td>
<td>
<span t-esc="line['date']"/>
</td>
<td>
<span t-esc="line['date_maturity']"/>
</td>
<td>
<t t-if="line['name'] != '/'">
<t t-if="not line['ref']">
<span t-esc="line['name']"/>
</t>
<t t-if="line['ref'] and line['name']">
<t t-if="line['name'] not in line['ref']">
<span t-esc="line['name']"/>
</t>
<t t-if="line['ref'] not in line['name']">
<span t-esc="line['ref']"/>
</t>
</t>
</t>
<t t-if="line['name'] == '/'">
<span t-esc="line['ref']"/>
</t>
</td>
<td class="amount">
<span t-esc="line['amount']" t-options="{'widget': 'monetary', 'display_currency': display_currency}"/>
</td>
<td class="amount">
<span t-esc="line['open_amount']" t-options="{'widget': 'monetary', 'display_currency': display_currency}"/>
</td>
<td class="amount">
<span t-esc="line['balance']" t-options="{'widget': 'monetary', 'display_currency': display_currency}"/>
</td>
</tr>
<tr>
<td />
<td>
<span t-esc="d['end']"/>
</td>
<td>
Ending Balance
</td>
<td />
<td />
<td />
<td class="amount">
<span t-esc="currency['amount_due']" t-options="{'widget': 'monetary', 'display_currency': display_currency}"/>
</td>
</tr>
</tbody>
</table>
<t t-call="partner_statement.aging_buckets" t-if="currency['buckets']" />
</t>
</t>
<p t-if="d.get('no_entries')">
<strong>The partner doesn't have due entries.</strong>
</p>
</div>
</t>
</template>
<template id="outstanding_statement">
<t t-call="web.html_container">
<t t-foreach="docs" t-as="o">
<t t-set="d" t-value="data.get(o.id)" />
<t t-call="partner_statement.outstanding_statement_document" t-lang="o.lang"/>
</t>
</t>
</template>
<report id="action_print_outstanding_statement"
model="res.partner"
report_type="qweb-pdf"
menu="False"
string="Outstanding Statement"
name="partner_statement.outstanding_statement"
file="partner_statement.outstanding_statement"
/>
</odoo>

59
partner_statement/views/res_config_settings.xml

@ -0,0 +1,59 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="res_config_settings_view_form" model="ir.ui.view">
<field name="name">res.config.settings.view.form (in partner_statement)</field>
<field name="model">res.config.settings</field>
<field name="priority" eval="40"/>
<field name="inherit_id" ref="account.res_config_settings_view_form"/>
<field name="arch" type="xml">
<xpath expr="//div[@id='account_followup']" position="after">
<div class="col-12 col-lg-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="group_activity_statement" />
</div>
<div class="o_setting_right_pane">
<label for="group_activity_statement"/>
<div class="text-muted">
Activity Statements show all transactions between two dates.
</div>
<div class="content-group" attrs="{'invisible': [('group_activity_statement', '=', False), ('group_outstanding_statement', '=', False)]}">
<div class="row mt16">
<label for="default_aging_type" class="col-lg-3 o_light_label"/>
<field name="default_aging_type" />
</div>
<div >
<field name="default_show_aging_buckets" class="oe_inline" />
<label for="default_show_aging_buckets" class="o_light_label"/>
</div>
<div >
<field name="default_filter_partners_non_due" class="oe_inline" />
<label for="default_filter_partners_non_due" class="o_light_label"/>
</div>
<div >
<field name="default_filter_negative_balances" class="oe_inline" />
<label for="default_filter_negative_balances" class="o_light_label"/>
</div>
</div>
</div>
</div>
<div class="col-12 col-lg-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="group_outstanding_statement" />
</div>
<div class="o_setting_right_pane">
<label for="group_outstanding_statement"/>
<div class="text-muted">
Outstanding Statements show all transactions up to a date.
</div>
<div class="text-muted" attrs="{'invisible': [('group_outstanding_statement', '=', False)]}">
Please set defaults under Activity Statements.
</div>
</div>
</div>
</xpath>
</field>
</record>
</odoo>

4
partner_statement/wizard/__init__.py

@ -0,0 +1,4 @@
from . import statement_common
from . import activity_statement_wizard
from . import outstanding_statement_wizard
from . import res_config_settings

44
partner_statement/wizard/activity_statement_wizard.py

@ -0,0 +1,44 @@
# Copyright 2018 Eficent Business and IT Consulting Services S.L.
# (http://www.eficent.com)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from dateutil.relativedelta import relativedelta
from odoo import api, fields, models
class ActivityStatementWizard(models.TransientModel):
"""Activity Statement wizard."""
_inherit = 'statement.common.wizard'
_name = 'activity.statement.wizard'
_description = 'Activity Statement Wizard'
@api.model
def _get_date_start(self):
return (
fields.Date.context_today(self).replace(day=1) -
relativedelta(days=1)
).replace(day=1)
date_start = fields.Date(required=True, default=_get_date_start)
@api.onchange('aging_type')
def onchange_aging_type(self):
super().onchange_aging_type()
if self.aging_type == 'months':
self.date_start = self.date_end.replace(day=1)
else:
self.date_start = self.date_end - relativedelta(days=30)
def _export(self):
"""Export to PDF."""
data = self._prepare_statement()
return self.env.ref(
'partner_statement'
'.action_print_activity_statement').report_action(
self, data=data)
def _prepare_statement(self):
res = super()._prepare_statement()
res.update({'date_start': self.date_start})
return res

21
partner_statement/wizard/outstanding_statement_wizard.py

@ -0,0 +1,21 @@
# Copyright 2018 Eficent Business and IT Consulting Services S.L.
# (http://www.eficent.com)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo import models
class OutstandingStatementWizard(models.TransientModel):
"""Outstanding Statement wizard."""
_name = 'outstanding.statement.wizard'
_inherit = 'statement.common.wizard'
_description = 'Outstanding Statement Wizard'
def _export(self):
"""Export to PDF."""
data = self._prepare_statement()
return self.env.ref(
'partner_statement'
'.action_print_outstanding_statement').report_action(
self, data=data)

57
partner_statement/wizard/res_config_settings.py

@ -0,0 +1,57 @@
from odoo import fields, models
class ResConfigSettings(models.TransientModel):
_inherit = 'res.config.settings'
group_activity_statement = fields.Boolean(
"Enable OCA Activity Statements",
group='account.group_account_invoice',
implied_group='partner_statement.group_activity_statement',
)
default_aging_type = fields.Selection(
[("days", "Age by Days"), ("months", "Age by Months")],
string="Aging Method",
required=True,
default_model="statement.common.wizard",
)
default_show_aging_buckets = fields.Boolean(
string="Show Aging Buckets",
default_model="statement.common.wizard",
)
default_filter_partners_non_due = fields.Boolean(
string='Exclude partners with no due entries',
default_model="statement.common.wizard",
)
default_filter_negative_balances = fields.Boolean(
"Exclude Negative Balances",
default_model="statement.common.wizard",
)
group_outstanding_statement = fields.Boolean(
"Enable OCA Outstanding Statements",
group='account.group_account_invoice',
implied_group='partner_statement.group_outstanding_statement',
)
def set_values(self):
self = self.with_context(active_test=False)
# default values fields
IrDefault = self.env['ir.default'].sudo()
for name, field in self._fields.items():
if (name.startswith("default_") and
field.default_model == 'statement.common.wizard'):
if isinstance(self[name], models.BaseModel):
if self._fields[name].type == 'many2one':
value = self[name].id
else:
value = self[name].ids
else:
value = self[name]
IrDefault.set('activity.statement.wizard', name[8:], value)
IrDefault.set('outstanding.statement.wizard', name[8:], value)
return super().set_values()

70
partner_statement/wizard/statement_common.py

@ -0,0 +1,70 @@
# Copyright 2018 Graeme Gellatly
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from dateutil.relativedelta import relativedelta
from odoo import api, fields, models
class StatementCommon(models.AbstractModel):
_name = 'statement.common.wizard'
_description = 'Statement Reports Common Wizard'
name = fields.Char()
company_id = fields.Many2one(
comodel_name='res.company',
default=lambda self: self.env.user.company_id,
string='Company'
)
date_end = fields.Date(required=True, default=fields.Date.context_today)
show_aging_buckets = fields.Boolean(default=True)
number_partner_ids = fields.Integer(
default=lambda self: len(self._context['active_ids'])
)
filter_partners_non_due = fields.Boolean(
string='Don\'t show partners with no due entries', default=True)
filter_negative_balances = fields.Boolean(
"Exclude Negative Balances", default=True
)
aging_type = fields.Selection(
[("days", "Age by Days"), ("months", "Age by Months")],
string="Aging Method",
default="days",
required=True,
)
account_type = fields.Selection(
[('receivable', 'Receivable'),
('payable', 'Payable')], string='Account type', default='receivable')
@api.onchange('aging_type')
def onchange_aging_type(self):
if self.aging_type == 'months':
self.date_end = (
fields.Date.context_today(self).replace(day=1) -
relativedelta(days=1)
)
else:
self.date_end = fields.Date.context_today(self)
@api.multi
def button_export_pdf(self):
self.ensure_one()
return self._export()
def _prepare_statement(self):
self.ensure_one()
return {
'date_end': self.date_end,
'company_id': self.company_id.id,
'partner_ids': self._context['active_ids'],
'show_aging_buckets': self.show_aging_buckets,
'filter_non_due_partners': self.filter_partners_non_due,
'account_type': self.account_type,
'aging_type': self.aging_type,
'filter_negative_balances': self.filter_negative_balances,
}
def _export(self):
raise NotImplementedError

101
partner_statement/wizard/statement_wizard.xml

@ -0,0 +1,101 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2018 Eficent Business and IT Consulting Services S.L.
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
<odoo>
<!-- wizard action on res.partner -->
<act_window id="activity_statement_wizard_action"
name="Partner Activity Statement"
src_model="res.partner"
res_model="activity.statement.wizard"
view_type="form" view_mode="form"
key2="client_action_multi" target="new"
groups="partner_statement.group_activity_statement"/>
<act_window id="outstanding_statement_wizard_action"
name="Partner Outstanding Statement"
src_model="res.partner"
res_model="outstanding.statement.wizard"
view_type="form" view_mode="form"
key2="client_action_multi" target="new"
groups="partner_statement.group_outstanding_statement"/>
<!-- wizard view -->
<record id="statement_common_view" model="ir.ui.view">
<field name="name">Statement Common Wizard View</field>
<field name="model">statement.common.wizard</field>
<field name="arch" type="xml">
<form name="Report Options">
<div style="text-align:justify" name="info">
<label string="Aging details can be shown in the report, expressed in aging
buckets, so the partner can review how much is open, due or overdue." for=""/>
</div><hr/>
<group>
<group name="main_info">
<field name="company_id" options="{'no_create': True}" groups="base.group_multi_company"/>
<label for="account_type"/>
<field name="account_type" nolabel="1" widget="radio"/>
</group>
<group name="aging_report">
<field name="show_aging_buckets"/>
<field name="aging_type" />
</group>
</group>
<group>
<group name="dates">
<field name="date_end"/>
</group>
<group name="multiple_partners">
<field name="number_partner_ids" readonly="1" invisible="1"/>
<field name="filter_partners_non_due" attrs="{'invisible': [('number_partner_ids', '=', 1)]}" />
<field name="filter_negative_balances" attrs="{'invisible': [('number_partner_ids', '=', 1)]}" />
</group>
</group>
<footer>
<button name="button_export_pdf" string="Export PDF" type="object" default_focus="1" class="oe_highlight"/>
or
<button string="Cancel" class="oe_link" special="cancel" />
</footer>
</form>
</field>
</record>
<record id="outstanding_statement_wizard_view" model="ir.ui.view">
<field name="name">Outstanding Statement Wizard</field>
<field name="model">outstanding.statement.wizard</field>
<field name="inherit_id" ref="partner_statement.statement_common_view" />
<field name="mode">primary</field>
<field name="arch" type="xml">
<xpath expr="//div[@name='info']/label" position="before" >
<label string="The outstanding statement provides details of all partner's outstanding
receivables and payables up to a particular date. This includes all unpaid invoices, unclaimed
refunds and outstanding payments. The list is displayed in chronological order and is
split by currencies." for=""/>
<br/><br/>
</xpath>
</field>
</record>
<record id="activity_statement_wizard_view" model="ir.ui.view">
<field name="name">Activity Statement Wizard</field>
<field name="model">activity.statement.wizard</field>
<field name="inherit_id" ref="partner_statement.statement_common_view" />
<field name="mode">primary</field>
<field name="arch" type="xml">
<xpath expr="//div[@name='info']/label" position="before" >
<label string="The activity statement provides details of all activity on
a partner's receivables and payables between two selected dates. This includes all invoices,
refunds and payments. Any outstanding balance dated prior to the chosen statement
period will appear as a forward balance at the top of the statement. The list is
displayed in chronological order and is split by currencies." for=""/>
<br/><br/>
</xpath>
<xpath expr="//field[@name='date_end']" position="before">
<field name="date_start"/>
</xpath>
</field>
</record>
</odoo>
Loading…
Cancel
Save