diff --git a/account_consolidation_oca/README.rst b/account_consolidation_oca/README.rst new file mode 100644 index 00000000..03169ef8 --- /dev/null +++ b/account_consolidation_oca/README.rst @@ -0,0 +1,125 @@ +===================== +Account Consolidation +===================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:9592ed01107dce615cd051b331076b9721662f7e1caf9006985d81fb19bea9f9 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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--consolidation-lightgray.png?logo=github + :target: https://github.com/OCA/account-consolidation/tree/14.0/account_consolidation_oca + :alt: OCA/account-consolidation +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/account-consolidation-14-0/account-consolidation-14-0-account_consolidation_oca + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/account-consolidation&target_branch=14.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module extends the functionality of accounting to allow you to consolidate journal items in a consolidation company. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +To install this module, you need the modules `currency_monthly_rate` to be +available in your system. + +To configure this module, you need to flag a company as Consolidation in the +Accounting settings. + +Then, you should define a consolidation difference account and a consolidation +journal on the consolidation company, and create consolidation profiles for +each subsidiary you want to consolidate. + +For each subsidiary to consolidate, make sure the related partner of the +company has no company_id defined. + +Afterwards, you should define a consolidation account from your consolidation +company, on every active account of the subsidiaries. + +You can then use the 'Consolidation : Checks' wizard in Accounting > Adviser to +ensure every active account of your subsidiaries are set, and company partners +have no company defined. + +Make sure you also defined currency rates and monthly currency rates on the +consolidation company for the currencies of your subsidiaries, as P&L accounts +are consolidated using monthly rates and B.S accounts using standard 'spot' +rates. + + +Known issues +============ + +* Consolidation manager has access to all the settings, or he wouldn't be able + to configure the module. +* Functional mapping of accounts is not tested. If no consolidation entries + are generated, it's probably because the balance of mapped accounts is 0 +* Correctness of companies hierarchy in profile rest on user + +Usage +===== + +To consolidate subsidiaries in your consolidation company, you should use 'Consolidation : consolidate' wizard in Accounting > Adviser. + +You have to select the month until which every account move will be processed, and select if you want to consolidate all the moves or only posted ones. + +This will generate a journal entry in YTD (Year-To-Date) mode on your consolidation company for each subsidiary. Those entries are flagged as 'auto_post', so they will actually be posted when you run the consolidation the next time. + +The generated journal entries are unposted, allowing you to modify or delete it to run the consolidation again. + +Known issues / Roadmap +====================== + +* Implement a distinction on analytic accounts + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Camptocamp + +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-consolidation `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/account_consolidation_oca/__init__.py b/account_consolidation_oca/__init__.py new file mode 100644 index 00000000..85453dae --- /dev/null +++ b/account_consolidation_oca/__init__.py @@ -0,0 +1,3 @@ +from . import models +from . import wizard +from .hooks import post_init diff --git a/account_consolidation_oca/__manifest__.py b/account_consolidation_oca/__manifest__.py new file mode 100644 index 00000000..f4f77fa8 --- /dev/null +++ b/account_consolidation_oca/__manifest__.py @@ -0,0 +1,36 @@ +# Copyright 2011-2019 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Account Consolidation", + "version": "14.0.1.0.0", + "author": "Camptocamp, Odoo Community Association (OCA)", + "license": "AGPL-3", + "category": "Generic Modules/Accounting", + "website": "https://github.com/OCA/account-consolidation", + "depends": [ + "account", + "currency_monthly_rate", + ], + "data": [ + "security/res_groups.xml", + "security/account_consolidation_security.xml", + "security/ir.model.access.csv", + "views/account_move_line_view.xml", + "views/account_view.xml", + "views/company_consolidation_profile.xml", + "wizard/consolidation_check_view.xml", + "wizard/consolidation_consolidate_view.xml", + "views/consolidation_menu.xml", + "views/res_config_settings.xml", + ], + "demo": [ + "demo/company_demo.xml", + "demo/currency_demo.xml", + "demo/consolidation_demo.xml", + "demo/company_a_demo.xml", + "demo/company_b_demo.xml", + ], + "post_init_hook": "post_init", + "installable": True, +} diff --git a/account_consolidation_oca/demo/company_a_demo.xml b/account_consolidation_oca/demo/company_a_demo.xml new file mode 100644 index 00000000..8e8731e9 --- /dev/null +++ b/account_consolidation_oca/demo/company_a_demo.xml @@ -0,0 +1,97 @@ + + + + EXP1 + Expenses 1 + + + + + + EXP2 + Expenses 2 + + + + + + EXP3 + Expenses 3 + + + + + + REV1 + Revenue 1 + + + + + + REV2 + Revenue 2 + + + + + + ASS1 + Assets 1 + + + + + + LIA1 + Liabilities 1 + + + + + + LIA2 + Liabilities 2 + + + + + + LIA3 + Liabilities 3 + + + + + + REC1 + Receivable 1 + + + + + + + PAY1 + Payable 1 + + + + + + + Operations journal + OP + general + + + diff --git a/account_consolidation_oca/demo/company_b_demo.xml b/account_consolidation_oca/demo/company_b_demo.xml new file mode 100644 index 00000000..3291cc1b --- /dev/null +++ b/account_consolidation_oca/demo/company_b_demo.xml @@ -0,0 +1,97 @@ + + + + EXP1 + Expenses 1 + + + + + + EXP2 + Expenses 2 + + + + + + EXP3 + Expenses 3 + + + + + + REV1 + Revenue 1 + + + + + + REV2 + Revenue 2 + + + + + + ASS1 + Assets 1 + + + + + + LIA1 + Liabilities 1 + + + + + + LIA2 + Liabilities 2 + + + + + + LIA3 + Liabilities 3 + + + + + + REC1 + Receivable 1 + + + + + + + PAY1 + Payable 1 + + + + + + + Operations journal + OP + general + + + diff --git a/account_consolidation_oca/demo/company_demo.xml b/account_consolidation_oca/demo/company_demo.xml new file mode 100644 index 00000000..fdfe58a8 --- /dev/null +++ b/account_consolidation_oca/demo/company_demo.xml @@ -0,0 +1,29 @@ + + + + Consolidation company + + + True + + + Subsidiary A + + + + + Subsidiary B + + + + + + + 100.0 + + + + + 100.0 + + diff --git a/account_consolidation_oca/demo/consolidation_demo.xml b/account_consolidation_oca/demo/consolidation_demo.xml new file mode 100644 index 00000000..a40c7ec8 --- /dev/null +++ b/account_consolidation_oca/demo/consolidation_demo.xml @@ -0,0 +1,119 @@ + + + + + + EXP1 + Expenses 1 + + + + + EXP2 + Expenses 2 + + + + + EXP3 + Expenses 3 + + + + + REV1 + Revenue 1 + + + + + REV2 + Revenue 2 + + + + + ASS1 + Assets 1 + + + + + LIA1 + Liabilities 1 + + + + + LIA2 + Liabilities 2 + + + + + LIA3 + Liabilities 3 + + + + + REC1 + Receivable 1 + + + + + + PAY1 + Payable 1 + + + + + + CED + Consolidation Exchange Differences + + + + + Consolidation journal + CONSO + general + + + + + + + + Consolidation Manager + + + + + consolidation + consolidation + + + + + diff --git a/account_consolidation_oca/demo/currency_demo.xml b/account_consolidation_oca/demo/currency_demo.xml new file mode 100644 index 00000000..af178128 --- /dev/null +++ b/account_consolidation_oca/demo/currency_demo.xml @@ -0,0 +1,35 @@ + + + + 1.8 + + + + + + 1.36 + + + + + + 1.23 + + + + + + 1.3 + + + 01 + + + + 1.05 + + + 02 + + + diff --git a/account_consolidation_oca/hooks.py b/account_consolidation_oca/hooks.py new file mode 100644 index 00000000..753d9590 --- /dev/null +++ b/account_consolidation_oca/hooks.py @@ -0,0 +1,16 @@ +# Copyright 2019 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) + +from odoo import SUPERUSER_ID, api + + +def disable_rule(cr, registry): + """disable rule for multicompanies so consolidation manager can access + account, earlier was done in yml""" + env = api.Environment(cr, SUPERUSER_ID, {}) + rule = env.ref("account.account_comp_rule") + rule.active = False + + +def post_init(cr, registry): + disable_rule(cr, registry) diff --git a/account_consolidation_oca/i18n/account_consolidation_oca.pot b/account_consolidation_oca/i18n/account_consolidation_oca.pot new file mode 100644 index 00000000..2fa40f98 --- /dev/null +++ b/account_consolidation_oca/i18n/account_consolidation_oca.pot @@ -0,0 +1,612 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_consolidation_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.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: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_check.py:82 +#, python-format +msgid "

Consolidation configuration errors

" +msgstr "" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_check.py:87 +#, python-format +msgid "

No configuration error detected ! You can now proceed with the consolidation.

" +msgstr "" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_check.py:77 +#, python-format +msgid "

Company access not allowed

" +msgstr "" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_check.py:73 +#, python-format +msgid "

Company defined on intercompany partners

" +msgstr "" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_check.py:70 +#, python-format +msgid "

Invalid account mapping

" +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "" +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +msgid "Accounts: Check consistency between subsidiaries accounts and Holding company consolidation accounts." +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +msgid "Companies allowed: Check that user has access to subsidiaries." +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +msgid "Partners: Check that partners linked to subsidiaries have no company defined." +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_account_account +msgid "Account" +msgstr "" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,target_move:0 +msgid "All Entries" +msgstr "" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,target_move:0 +msgid "All Posted Entries" +msgstr "" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "April" +msgstr "" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "August" +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_consolidate_form +msgid "Balance sheet accounts are consolidated using standard currency rates." +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_consolidate_form +msgid "Cancel" +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +msgid "Check configuration" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,help:account_consolidation_oca.field_res_config_settings__is_consolidation +msgid "Check this box if you want to consolidate in this company." +msgstr "" + +#. module: account_consolidation_oca +#: selection:account.consolidation.check,state:0 +msgid "Checks ok" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_account_consolidation_base +msgid "Common consolidation wizard. Intended to be inherited" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_res_company +msgid "Companies" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_base__company_id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__company_id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__company_id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__company_id +msgid "Company" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,help:account_consolidation_oca.field_res_company__consolidation_diff_account_id +#: model:ir.model.fields,help:account_consolidation_oca.field_res_config_settings__consolidation_diff_account_id +msgid "Conso. differences will be affected to this account" +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_consolidate_form +msgid "Consolidate" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_move_line__consolidated +msgid "Consolidated" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_move_line__consol_company_id +msgid "Consolidated from" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_move__consol_company_id +msgid "Consolidated from Company" +msgstr "" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:341 +#: model:ir.ui.menu,name:account_consolidation_oca.menu_consolidation +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +#, python-format +msgid "Consolidation" +msgstr "" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:249 +#, python-format +msgid "Consolidation (%s %s)" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_account_consolidation_check +msgid "Consolidation Checks. Model used for views" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_account__consolidation_company_id +msgid "Consolidation Company" +msgstr "" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:439 +#, python-format +msgid "Consolidation Items" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_company__consolidation_percentage +msgid "Consolidation Percentage" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__consolidation_profile_ids +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_company__consolidation_profile_ids +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_company_consolidation_company_profile +msgid "Consolidation Profile" +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "Consolidation Profiles" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_account__consolidation_account_id +msgid "Consolidation account" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_company__is_consolidation +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_config_settings__is_consolidation +msgid "Consolidation company" +msgstr "" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:138 +#, python-format +msgid "Consolidation difference (%s %s)" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_company__consolidation_diff_account_id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_config_settings__consolidation_diff_account_id +msgid "Consolidation difference account" +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "Consolidation differences" +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "Consolidation journal" +msgstr "" + +#. module: account_consolidation_oca +#: model:res.groups,name:account_consolidation_oca.group_consolidation_manager +msgid "Consolidation manager" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,help:account_consolidation_oca.field_account_account__consolidation_account_id +msgid "Consolidation moves will be generated on this account" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__consolidation_percentage +msgid "Consolidation percentage" +msgstr "" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/models/consolidation_profile.py:43 +#, python-format +msgid "Consolidation percentage can only be defined in the rangebetween 0 and 100." +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_config_settings__consolidation_profile_ids +msgid "Consolidation profiles" +msgstr "" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_base.py:24 +#, python-format +msgid "Consolidation wizards can only be called from a consolidation company." +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.actions.act_window,name:account_consolidation_oca.action_consolidation_checks +#: model:ir.ui.menu,name:account_consolidation_oca.menu_consolidation_checks +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +msgid "Consolidation: Checks" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.actions.act_window,name:account_consolidation_oca.action_consolidation_consolidate +#: model:ir.ui.menu,name:account_consolidation_oca.menu_consolidation_consolidate +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_consolidate_form +msgid "Consolidation: Consolidate" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.actions.act_window,name:account_consolidation_oca.action_consolidation_profile +msgid "Consolidation: Profiles" +msgstr "" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:448 +#, python-format +msgid "Could not generate any consolidation entries." +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__create_uid +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__create_uid +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__create_uid +msgid "Created by" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__create_date +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__create_date +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__create_date +msgid "Created on" +msgstr "" + +#. module: account_consolidation_oca +#: model:res.company,overdue_msg:account_consolidation_oca.consolidation_company +#: model:res.company,overdue_msg:account_consolidation_oca.subsidiary_a +#: model:res.company,overdue_msg:account_consolidation_oca.subsidiary_b +msgid "Dear Sir/Madam,\n" +"\n" +"Our records indicate that some payments on your account are still due. Please find details below.\n" +"If the amount has already been paid, please disregard this notice. Otherwise, please forward us the total amount stated below.\n" +"If you have any queries regarding your account, Please contact us.\n" +"\n" +"Thank you in advance for your cooperation.\n" +"Best Regards," +msgstr "" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "December" +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "Default consolidation differences account" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_company__consolidation_default_journal_id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_config_settings__consolidation_default_journal_id +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "Default consolidation journal" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,help:account_consolidation_oca.field_res_company__consolidation_default_journal_id +#: model:ir.model.fields,help:account_consolidation_oca.field_res_config_settings__consolidation_default_journal_id +msgid "Default journal to generate consolidation entries" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,help:account_consolidation_oca.field_company_consolidation_profile__consolidation_percentage +msgid "Define a percentage to consolidate this company (in percents)" +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "Define the subsidiaries to consolidate" +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_company_consolidation_profile_form +msgid "Discard" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_base__display_name +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__display_name +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__display_name +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__display_name +msgid "Display Name" +msgstr "" + +#. module: account_consolidation_oca +#: selection:account.consolidation.check,state:0 +msgid "Error" +msgstr "" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "February" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_base__id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__id +msgid "ID" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_move_line__consol_partner_id +msgid "Intercompany Partner" +msgstr "" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_base.py:137 +#, python-format +msgid "Invalid configuration, please launch the \"Consolidation: Checks\" wizard" +msgstr "" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "January" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__journal_id +msgid "Journal" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_account_move +msgid "Journal Entries" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_account_move_line +msgid "Journal Item" +msgstr "" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "July" +msgstr "" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "June" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_base____last_update +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check____last_update +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate____last_update +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile____last_update +msgid "Last Modified on" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__write_uid +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__write_uid +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__write_date +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__write_date +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__write_date +msgid "Last Updated on" +msgstr "" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "March" +msgstr "" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "May" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__message +msgid "Message" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__month +msgid "Month" +msgstr "" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_base.py:58 +#, python-format +msgid "No consolidation account defined for this account" +msgstr "" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "November" +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +msgid "OK" +msgstr "" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "October" +msgstr "" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/models/company.py:47 +#, python-format +msgid "Only one company can be defined as consolidation company." +msgstr "" + +#. module: account_consolidation_oca +#: selection:account.consolidation.check,state:0 +msgid "Open" +msgstr "" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:114 +#, python-format +msgid "Please set the Consolidation difference account for company %s in accounting settings." +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +msgid "Prepare your consolidation and make sure that your consolidation will be correct by proceeding with the checks." +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_company_consolidation_profile_tree +msgid "Profiles" +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_consolidate_form +msgid "Profit and Loss accounts are consolidated using monthly currency rates." +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_consolidate_form +msgid "Run the Year-To-Date consolidation until the selected period for the defined subsidiaries." +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_company_consolidation_profile_form +msgid "Save" +msgstr "" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "September" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__state +msgid "State" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__sub_company_id +msgid "Subsidiary" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_company_consolidation_profile +msgid "Subsidiary consolidation profile" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__target_move +msgid "Target Moves" +msgstr "" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/models/consolidation_profile.py:55 +#, python-format +msgid "The company %s is already used in a consolidation profile." +msgstr "" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_base.py:67 +#, python-format +msgid "The consolidation account defined for this account should be on company %s." +msgstr "" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:170 +#, python-format +msgid "The error below appeared while trying to reverse the following moves: \n" +" %s \n" +" %s" +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "Use this company as consolidation company" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__year +msgid "Year" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_account_consolidation_consolidate +msgid "account.consolidation.consolidate" +msgstr "" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:296 +#, python-format +msgid "monthly rate : %s" +msgstr "" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:301 +#, python-format +msgid "spot rate : %s" +msgstr "" + diff --git a/account_consolidation_oca/i18n/es.po b/account_consolidation_oca/i18n/es.po new file mode 100644 index 00000000..3d46f50e --- /dev/null +++ b/account_consolidation_oca/i18n/es.po @@ -0,0 +1,652 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_consolidation_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2020-03-04 00:14+0000\n" +"Last-Translator: Nelson Ramírez Sánchez \n" +"Language-Team: none\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.10\n" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_check.py:82 +#, python-format +msgid "

Consolidation configuration errors

" +msgstr "

Errores de configuración de consolidación

" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_check.py:87 +#, python-format +msgid "

No configuration error detected ! You can now proceed with the consolidation.

" +msgstr "" +"

No se detectó ningún error de configuración! Ahora puede continuar con " +"la consolidación.

" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_check.py:77 +#, python-format +msgid "

Company access not allowed

" +msgstr "

Acceso a la empresa no permitido

" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_check.py:73 +#, python-format +msgid "

Company defined on intercompany partners

" +msgstr "

Empresa definida en socios intercompañía

" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_check.py:70 +#, python-format +msgid "

Invalid account mapping

" +msgstr "

Mapeo de cuenta inválido

" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "" +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +msgid "Accounts: Check consistency between subsidiaries accounts and Holding company consolidation accounts." +msgstr "" +"Cuentas: Verifique la consistencia entre las cuentas de " +"subsidiarias y las cuentas de consolidación de la compañía holding." + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +msgid "Companies allowed: Check that user has access to subsidiaries." +msgstr "" +"Empresas Permitidas: Verifique que el usuario tenga acceso " +"a las subsidiarias." + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +msgid "Partners: Check that partners linked to subsidiaries have no company defined." +msgstr "" +"Contactos: Verifique que los contactos vinculados a " +"subsidiarias no tengan una compañía definida." + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_account_account +msgid "Account" +msgstr "Cuenta" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,target_move:0 +msgid "All Entries" +msgstr "Todas las Entradas" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,target_move:0 +msgid "All Posted Entries" +msgstr "Todas las entradas publicadas" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "April" +msgstr "Abril" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "August" +msgstr "Agosto" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_consolidate_form +msgid "Balance sheet accounts are consolidated using standard currency rates." +msgstr "" +"Las cuentas del balance general se consolidan utilizando tasas de cambio " +"estándar." + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_consolidate_form +msgid "Cancel" +msgstr "Cancelar" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +msgid "Check configuration" +msgstr "Comprobar configuración" + +#. module: account_consolidation_oca +#: model:ir.model.fields,help:account_consolidation_oca.field_res_config_settings__is_consolidation +msgid "Check this box if you want to consolidate in this company." +msgstr "Marque esta casilla si desea consolidarse en esta empresa." + +#. module: account_consolidation_oca +#: selection:account.consolidation.check,state:0 +msgid "Checks ok" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_account_consolidation_base +msgid "Common consolidation wizard. Intended to be inherited" +msgstr "Asistente de consolidación común. Destinado a ser heredado" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_res_company +msgid "Companies" +msgstr "Empresas" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_base__company_id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__company_id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__company_id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__company_id +msgid "Company" +msgstr "Empresa" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_res_config_settings +msgid "Config Settings" +msgstr "Configuración" + +#. module: account_consolidation_oca +#: model:ir.model.fields,help:account_consolidation_oca.field_res_company__consolidation_diff_account_id +#: model:ir.model.fields,help:account_consolidation_oca.field_res_config_settings__consolidation_diff_account_id +msgid "Conso. differences will be affected to this account" +msgstr "Conso las diferencias se verán afectadas en esta cuenta" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_consolidate_form +msgid "Consolidate" +msgstr "Consolidar" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_move_line__consolidated +msgid "Consolidated" +msgstr "Consolidada" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_move_line__consol_company_id +msgid "Consolidated from" +msgstr "Consolidada desde" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_move__consol_company_id +msgid "Consolidated from Company" +msgstr "Consolidada desde Empresa" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:341 +#: model:ir.ui.menu,name:account_consolidation_oca.menu_consolidation +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +#, python-format +msgid "Consolidation" +msgstr "Consolidación" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:249 +#, python-format +msgid "Consolidation (%s %s)" +msgstr "Consolidación (%s %s)" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_account_consolidation_check +msgid "Consolidation Checks. Model used for views" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_account__consolidation_company_id +msgid "Consolidation Company" +msgstr "Empresa de Consolidación" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:439 +#, python-format +msgid "Consolidation Items" +msgstr "Items de Consolidación" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_company__consolidation_percentage +msgid "Consolidation Percentage" +msgstr "Porcentaje de Consolidación" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__consolidation_profile_ids +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_company__consolidation_profile_ids +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_company_consolidation_company_profile +msgid "Consolidation Profile" +msgstr "Perfil de Consolidación" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "Consolidation Profiles" +msgstr "Perfiles de Consolidación" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_account__consolidation_account_id +msgid "Consolidation account" +msgstr "Cuenta de Consolidación" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_company__is_consolidation +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_config_settings__is_consolidation +msgid "Consolidation company" +msgstr "Empresa de Consolidación" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:138 +#, python-format +msgid "Consolidation difference (%s %s)" +msgstr "Diferencia de Consolidación (%s %s)" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_company__consolidation_diff_account_id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_config_settings__consolidation_diff_account_id +msgid "Consolidation difference account" +msgstr "Cuenta Diferencia de Consolidación" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "Consolidation differences" +msgstr "Diferencias de Consolidación" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "Consolidation journal" +msgstr "Diario de Consolidación" + +#. module: account_consolidation_oca +#: model:res.groups,name:account_consolidation_oca.group_consolidation_manager +msgid "Consolidation manager" +msgstr "Gerente de Consolidación" + +#. module: account_consolidation_oca +#: model:ir.model.fields,help:account_consolidation_oca.field_account_account__consolidation_account_id +msgid "Consolidation moves will be generated on this account" +msgstr "Movimientos de consolidación serán generados en esta cuenta" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__consolidation_percentage +msgid "Consolidation percentage" +msgstr "Porcentaje de Consolidación" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/models/consolidation_profile.py:43 +#, python-format +msgid "Consolidation percentage can only be defined in the rangebetween 0 and 100." +msgstr "" +"Porcentaje de Consolidación solo puede ser definido en un rango entre 0 y " +"100." + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_config_settings__consolidation_profile_ids +msgid "Consolidation profiles" +msgstr "Perfiles de Consolidación" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_base.py:24 +#, python-format +msgid "Consolidation wizards can only be called from a consolidation company." +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.actions.act_window,name:account_consolidation_oca.action_consolidation_checks +#: model:ir.ui.menu,name:account_consolidation_oca.menu_consolidation_checks +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +msgid "Consolidation: Checks" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.actions.act_window,name:account_consolidation_oca.action_consolidation_consolidate +#: model:ir.ui.menu,name:account_consolidation_oca.menu_consolidation_consolidate +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_consolidate_form +msgid "Consolidation: Consolidate" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.actions.act_window,name:account_consolidation_oca.action_consolidation_profile +msgid "Consolidation: Profiles" +msgstr "" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:448 +#, python-format +msgid "Could not generate any consolidation entries." +msgstr "No se pudieron generar entradas de consolidación." + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__create_uid +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__create_uid +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__create_date +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__create_date +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__create_date +msgid "Created on" +msgstr "Creado en" + +#. module: account_consolidation_oca +#: model:res.company,overdue_msg:account_consolidation_oca.consolidation_company +#: model:res.company,overdue_msg:account_consolidation_oca.subsidiary_a +#: model:res.company,overdue_msg:account_consolidation_oca.subsidiary_b +msgid "Dear Sir/Madam,\n" +"\n" +"Our records indicate that some payments on your account are still due. Please find details below.\n" +"If the amount has already been paid, please disregard this notice. Otherwise, please forward us the total amount stated below.\n" +"If you have any queries regarding your account, Please contact us.\n" +"\n" +"Thank you in advance for your cooperation.\n" +"Best Regards," +msgstr "" +"Estimado Señor/Señora,\n" +"\n" +"Nuestros registros indican que algunos pagos en su cuenta aún se deben. Por " +"favor encuentre los detalles a continuación.\n" +"Si el monto ya ha sido pagado, ignore este aviso. De lo contrario, envíenos " +"el importe total que se indica a continuación.\n" +"Si tiene alguna consulta con respecto a su cuenta, contáctenos.\n" +"\n" +"Gracias de antemano por su cooperación.\n" +"Atentamente," + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "December" +msgstr "Diciembre" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "Default consolidation differences account" +msgstr "Cuenta de diferencias de consolidación predeterminada" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_company__consolidation_default_journal_id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_config_settings__consolidation_default_journal_id +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "Default consolidation journal" +msgstr "Diario de consolidación predeterminado" + +#. module: account_consolidation_oca +#: model:ir.model.fields,help:account_consolidation_oca.field_res_company__consolidation_default_journal_id +#: model:ir.model.fields,help:account_consolidation_oca.field_res_config_settings__consolidation_default_journal_id +msgid "Default journal to generate consolidation entries" +msgstr "Diario predeterminado para generar entradas de consolidación" + +#. module: account_consolidation_oca +#: model:ir.model.fields,help:account_consolidation_oca.field_company_consolidation_profile__consolidation_percentage +msgid "Define a percentage to consolidate this company (in percents)" +msgstr "Definir un porcentaje para consolidar esta empresa (en porcentajes)" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "Define the subsidiaries to consolidate" +msgstr "Definir las filiales para consolidar" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_company_consolidation_profile_form +msgid "Discard" +msgstr "Descartar" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_base__display_name +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__display_name +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__display_name +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__display_name +msgid "Display Name" +msgstr "Nombre a Mostrar" + +#. module: account_consolidation_oca +#: selection:account.consolidation.check,state:0 +msgid "Error" +msgstr "" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "February" +msgstr "Febrero" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_base__id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__id +msgid "ID" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_move_line__consol_partner_id +msgid "Intercompany Partner" +msgstr "Empresa Intercompañía" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_base.py:137 +#, python-format +msgid "Invalid configuration, please launch the \"Consolidation: Checks\" wizard" +msgstr "" +"Configuración no válida, inicie el asistente \"Consolidación: " +"Verificaciones\"" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "January" +msgstr "Enero" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__journal_id +msgid "Journal" +msgstr "Diario" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_account_move +msgid "Journal Entries" +msgstr "Entradas de Diario" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_account_move_line +msgid "Journal Item" +msgstr "Artículo de Diario" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "July" +msgstr "Julio" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "June" +msgstr "Junio" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_base____last_update +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check____last_update +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate____last_update +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile____last_update +msgid "Last Modified on" +msgstr "Última modificación el" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__write_uid +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__write_uid +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__write_uid +msgid "Last Updated by" +msgstr "Última actualización por" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__write_date +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__write_date +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__write_date +msgid "Last Updated on" +msgstr "Ultima actualización en" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "March" +msgstr "Marzo" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "May" +msgstr "Mayo" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__message +msgid "Message" +msgstr "Mensaje" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__month +msgid "Month" +msgstr "Mes" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_base.py:58 +#, python-format +msgid "No consolidation account defined for this account" +msgstr "No hay una cuenta de consolidación definida para esta cuenta" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "November" +msgstr "Noviembre" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +msgid "OK" +msgstr "" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "October" +msgstr "Octubre" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/models/company.py:47 +#, python-format +msgid "Only one company can be defined as consolidation company." +msgstr "Solo una empresa puede definirse como empresa de consolidación." + +#. module: account_consolidation_oca +#: selection:account.consolidation.check,state:0 +msgid "Open" +msgstr "Abierto" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:114 +#, python-format +msgid "Please set the Consolidation difference account for company %s in accounting settings." +msgstr "" +"Establezca la cuenta de diferencia de consolidación para la empresa %s en la " +"configuración de contabilidad." + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +msgid "Prepare your consolidation and make sure that your consolidation will be correct by proceeding with the checks." +msgstr "" +"Prepare su consolidación y asegúrese de que su consolidación sea correcta al " +"proceder con los controles." + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_company_consolidation_profile_tree +msgid "Profiles" +msgstr "Perfiles" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_consolidate_form +msgid "Profit and Loss accounts are consolidated using monthly currency rates." +msgstr "" +"Las cuentas de pérdidas y ganancias se consolidan utilizando las tasas de " +"cambio mensuales." + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_consolidate_form +msgid "Run the Year-To-Date consolidation until the selected period for the defined subsidiaries." +msgstr "" +"Ejecute la consolidación del año hasta la fecha hasta el período " +"seleccionado para las filiales definidas." + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_company_consolidation_profile_form +msgid "Save" +msgstr "Salvar" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "September" +msgstr "Septiembre" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__state +msgid "State" +msgstr "Estado" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__sub_company_id +msgid "Subsidiary" +msgstr "Subsidiaria" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_company_consolidation_profile +msgid "Subsidiary consolidation profile" +msgstr "Perfil de consolidación subsidiaria" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__target_move +msgid "Target Moves" +msgstr "Movimientos Objetivo" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/models/consolidation_profile.py:55 +#, python-format +msgid "The company %s is already used in a consolidation profile." +msgstr "La empresa %s ya se utiliza en un perfil de consolidación." + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_base.py:67 +#, python-format +msgid "The consolidation account defined for this account should be on company %s." +msgstr "" +"La cuenta de consolidación definida para esta cuenta debe estar en la " +"empresa %s." + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:170 +#, python-format +msgid "The error below appeared while trying to reverse the following moves: \n" +" %s \n" +" %s" +msgstr "" +"El error a continuación apareció al intentar revertir los siguientes " +"movimientos:\n" +" %s \n" +" %s" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "Use this company as consolidation company" +msgstr "Utilice esta empresa como empresa de consolidación" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__year +msgid "Year" +msgstr "Año" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_account_consolidation_consolidate +msgid "account.consolidation.consolidate" +msgstr "" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:296 +#, python-format +msgid "monthly rate : %s" +msgstr "tasa mensual : %s" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:301 +#, python-format +msgid "spot rate : %s" +msgstr "tasa al contado: %s" diff --git a/account_consolidation_oca/i18n/hr.po b/account_consolidation_oca/i18n/hr.po new file mode 100644 index 00000000..a2b9868c --- /dev/null +++ b/account_consolidation_oca/i18n/hr.po @@ -0,0 +1,619 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_consolidation_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2020-03-05 12:13+0000\n" +"Last-Translator: Bole \n" +"Language-Team: none\n" +"Language: 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" +"X-Generator: Weblate 3.10\n" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_check.py:82 +#, python-format +msgid "

Consolidation configuration errors

" +msgstr "

Greške u postavkama konsolidacije

" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_check.py:87 +#, python-format +msgid "

No configuration error detected ! You can now proceed with the consolidation.

" +msgstr "" +"

Nema grešaka u postavkama konsolidacije! Možete nastaviti sa " +"konsolidacijom.

" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_check.py:77 +#, python-format +msgid "

Company access not allowed

" +msgstr "

Pristup trvtci nije dozvoljen

" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_check.py:73 +#, python-format +msgid "

Company defined on intercompany partners

" +msgstr "

Tvrtka definirana na intercompany partnerima

" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_check.py:70 +#, python-format +msgid "

Invalid account mapping

" +msgstr "

Pogrešno mapiranje konta

" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "" +msgstr "" +"" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +msgid "Accounts: Check consistency between subsidiaries accounts and Holding company consolidation accounts." +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +msgid "Companies allowed: Check that user has access to subsidiaries." +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +msgid "Partners: Check that partners linked to subsidiaries have no company defined." +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_account_account +msgid "Account" +msgstr "Konto" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,target_move:0 +msgid "All Entries" +msgstr "Sve stavke" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,target_move:0 +msgid "All Posted Entries" +msgstr "Sve proknjižene stavke" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "April" +msgstr "Travanj" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "August" +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_consolidate_form +msgid "Balance sheet accounts are consolidated using standard currency rates." +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_consolidate_form +msgid "Cancel" +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +msgid "Check configuration" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,help:account_consolidation_oca.field_res_config_settings__is_consolidation +msgid "Check this box if you want to consolidate in this company." +msgstr "" + +#. module: account_consolidation_oca +#: selection:account.consolidation.check,state:0 +msgid "Checks ok" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_account_consolidation_base +msgid "Common consolidation wizard. Intended to be inherited" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_res_company +msgid "Companies" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_base__company_id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__company_id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__company_id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__company_id +msgid "Company" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,help:account_consolidation_oca.field_res_company__consolidation_diff_account_id +#: model:ir.model.fields,help:account_consolidation_oca.field_res_config_settings__consolidation_diff_account_id +msgid "Conso. differences will be affected to this account" +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_consolidate_form +msgid "Consolidate" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_move_line__consolidated +msgid "Consolidated" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_move_line__consol_company_id +msgid "Consolidated from" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_move__consol_company_id +msgid "Consolidated from Company" +msgstr "" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:341 +#: model:ir.ui.menu,name:account_consolidation_oca.menu_consolidation +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +#, python-format +msgid "Consolidation" +msgstr "" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:249 +#, python-format +msgid "Consolidation (%s %s)" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_account_consolidation_check +msgid "Consolidation Checks. Model used for views" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_account__consolidation_company_id +msgid "Consolidation Company" +msgstr "" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:439 +#, python-format +msgid "Consolidation Items" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_company__consolidation_percentage +msgid "Consolidation Percentage" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__consolidation_profile_ids +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_company__consolidation_profile_ids +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_company_consolidation_company_profile +msgid "Consolidation Profile" +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "Consolidation Profiles" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_account__consolidation_account_id +msgid "Consolidation account" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_company__is_consolidation +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_config_settings__is_consolidation +msgid "Consolidation company" +msgstr "" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:138 +#, python-format +msgid "Consolidation difference (%s %s)" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_company__consolidation_diff_account_id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_config_settings__consolidation_diff_account_id +msgid "Consolidation difference account" +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "Consolidation differences" +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "Consolidation journal" +msgstr "" + +#. module: account_consolidation_oca +#: model:res.groups,name:account_consolidation_oca.group_consolidation_manager +msgid "Consolidation manager" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,help:account_consolidation_oca.field_account_account__consolidation_account_id +msgid "Consolidation moves will be generated on this account" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__consolidation_percentage +msgid "Consolidation percentage" +msgstr "" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/models/consolidation_profile.py:43 +#, python-format +msgid "Consolidation percentage can only be defined in the rangebetween 0 and 100." +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_config_settings__consolidation_profile_ids +msgid "Consolidation profiles" +msgstr "" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_base.py:24 +#, python-format +msgid "Consolidation wizards can only be called from a consolidation company." +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.actions.act_window,name:account_consolidation_oca.action_consolidation_checks +#: model:ir.ui.menu,name:account_consolidation_oca.menu_consolidation_checks +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +msgid "Consolidation: Checks" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.actions.act_window,name:account_consolidation_oca.action_consolidation_consolidate +#: model:ir.ui.menu,name:account_consolidation_oca.menu_consolidation_consolidate +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_consolidate_form +msgid "Consolidation: Consolidate" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.actions.act_window,name:account_consolidation_oca.action_consolidation_profile +msgid "Consolidation: Profiles" +msgstr "" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:448 +#, python-format +msgid "Could not generate any consolidation entries." +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__create_uid +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__create_uid +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__create_uid +msgid "Created by" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__create_date +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__create_date +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__create_date +msgid "Created on" +msgstr "" + +#. module: account_consolidation_oca +#: model:res.company,overdue_msg:account_consolidation_oca.consolidation_company +#: model:res.company,overdue_msg:account_consolidation_oca.subsidiary_a +#: model:res.company,overdue_msg:account_consolidation_oca.subsidiary_b +msgid "Dear Sir/Madam,\n" +"\n" +"Our records indicate that some payments on your account are still due. Please find details below.\n" +"If the amount has already been paid, please disregard this notice. Otherwise, please forward us the total amount stated below.\n" +"If you have any queries regarding your account, Please contact us.\n" +"\n" +"Thank you in advance for your cooperation.\n" +"Best Regards," +msgstr "" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "December" +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "Default consolidation differences account" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_company__consolidation_default_journal_id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_config_settings__consolidation_default_journal_id +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "Default consolidation journal" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,help:account_consolidation_oca.field_res_company__consolidation_default_journal_id +#: model:ir.model.fields,help:account_consolidation_oca.field_res_config_settings__consolidation_default_journal_id +msgid "Default journal to generate consolidation entries" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,help:account_consolidation_oca.field_company_consolidation_profile__consolidation_percentage +msgid "Define a percentage to consolidate this company (in percents)" +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "Define the subsidiaries to consolidate" +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_company_consolidation_profile_form +msgid "Discard" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_base__display_name +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__display_name +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__display_name +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__display_name +msgid "Display Name" +msgstr "" + +#. module: account_consolidation_oca +#: selection:account.consolidation.check,state:0 +msgid "Error" +msgstr "" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "February" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_base__id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__id +msgid "ID" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_move_line__consol_partner_id +msgid "Intercompany Partner" +msgstr "" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_base.py:137 +#, python-format +msgid "Invalid configuration, please launch the \"Consolidation: Checks\" wizard" +msgstr "" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "January" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__journal_id +msgid "Journal" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_account_move +msgid "Journal Entries" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_account_move_line +msgid "Journal Item" +msgstr "" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "July" +msgstr "" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "June" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_base____last_update +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check____last_update +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate____last_update +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile____last_update +msgid "Last Modified on" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__write_uid +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__write_uid +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__write_date +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__write_date +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__write_date +msgid "Last Updated on" +msgstr "" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "March" +msgstr "" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "May" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__message +msgid "Message" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__month +msgid "Month" +msgstr "" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_base.py:58 +#, python-format +msgid "No consolidation account defined for this account" +msgstr "" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "November" +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +msgid "OK" +msgstr "" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "October" +msgstr "" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/models/company.py:47 +#, python-format +msgid "Only one company can be defined as consolidation company." +msgstr "" + +#. module: account_consolidation_oca +#: selection:account.consolidation.check,state:0 +msgid "Open" +msgstr "" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:114 +#, python-format +msgid "Please set the Consolidation difference account for company %s in accounting settings." +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +msgid "Prepare your consolidation and make sure that your consolidation will be correct by proceeding with the checks." +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_company_consolidation_profile_tree +msgid "Profiles" +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_consolidate_form +msgid "Profit and Loss accounts are consolidated using monthly currency rates." +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_consolidate_form +msgid "Run the Year-To-Date consolidation until the selected period for the defined subsidiaries." +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_company_consolidation_profile_form +msgid "Save" +msgstr "" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "September" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__state +msgid "State" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__sub_company_id +msgid "Subsidiary" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_company_consolidation_profile +msgid "Subsidiary consolidation profile" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__target_move +msgid "Target Moves" +msgstr "" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/models/consolidation_profile.py:55 +#, python-format +msgid "The company %s is already used in a consolidation profile." +msgstr "" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_base.py:67 +#, python-format +msgid "The consolidation account defined for this account should be on company %s." +msgstr "" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:170 +#, python-format +msgid "The error below appeared while trying to reverse the following moves: \n" +" %s \n" +" %s" +msgstr "" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "Use this company as consolidation company" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__year +msgid "Year" +msgstr "" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_account_consolidation_consolidate +msgid "account.consolidation.consolidate" +msgstr "" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:296 +#, python-format +msgid "monthly rate : %s" +msgstr "" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:301 +#, python-format +msgid "spot rate : %s" +msgstr "" diff --git a/account_consolidation_oca/i18n/pt.po b/account_consolidation_oca/i18n/pt.po new file mode 100644 index 00000000..9f29a45a --- /dev/null +++ b/account_consolidation_oca/i18n/pt.po @@ -0,0 +1,649 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_consolidation_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2021-07-28 12:49+0000\n" +"Last-Translator: alvarorib \n" +"Language-Team: none\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" +"X-Generator: Weblate 4.3.2\n" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_check.py:82 +#, python-format +msgid "

Consolidation configuration errors

" +msgstr "

Erros de configuração de consolidação

" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_check.py:87 +#, python-format +msgid "

No configuration error detected ! You can now proceed with the consolidation.

" +msgstr "" +"

Nenhum erro de configuração detectado! Pode prosseguir com a " +"consolidação.

" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_check.py:77 +#, python-format +msgid "

Company access not allowed

" +msgstr "

Acesso da empresa não permitido

" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_check.py:73 +#, python-format +msgid "

Company defined on intercompany partners

" +msgstr "

Empresa definida em parceiros interempresa

" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_check.py:70 +#, python-format +msgid "

Invalid account mapping

" +msgstr "

Mapeamento de contas inválido

" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "" +msgstr "" +"" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +msgid "Accounts: Check consistency between subsidiaries accounts and Holding company consolidation accounts." +msgstr "" +"Contas: Verifique a consistência entre as contas das " +"subsidiárias e as contas de consolidação da Holding." + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +msgid "Companies allowed: Check that user has access to subsidiaries." +msgstr "" +"Empresas permitidas: Verifique se o utilizador tem acesso a " +"subsidiárias." + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +msgid "Partners: Check that partners linked to subsidiaries have no company defined." +msgstr "" +"Parceiros: Verifique se os parceiros vinculados a " +"subsidiárias não têm empresa definida." + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_account_account +msgid "Account" +msgstr "Conta" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,target_move:0 +msgid "All Entries" +msgstr "Todos os Lançamentos" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,target_move:0 +msgid "All Posted Entries" +msgstr "Todos os Lançamentos Publicados" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "April" +msgstr "Abril" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "August" +msgstr "Agosto" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_consolidate_form +msgid "Balance sheet accounts are consolidated using standard currency rates." +msgstr "As contas do balanço são consolidadas usando taxas de câmbio padrão." + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_consolidate_form +msgid "Cancel" +msgstr "Cancelar" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +msgid "Check configuration" +msgstr "Verificar a configuração" + +#. module: account_consolidation_oca +#: model:ir.model.fields,help:account_consolidation_oca.field_res_config_settings__is_consolidation +msgid "Check this box if you want to consolidate in this company." +msgstr "Assinalar aqui se quer consolidar esta empresa." + +#. module: account_consolidation_oca +#: selection:account.consolidation.check,state:0 +msgid "Checks ok" +msgstr "Verificação Ok" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_account_consolidation_base +msgid "Common consolidation wizard. Intended to be inherited" +msgstr "Assistente de consolidação comum. pretende-se que seja herdado" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_res_company +msgid "Companies" +msgstr "Empresas" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_base__company_id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__company_id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__company_id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__company_id +msgid "Company" +msgstr "Empresa" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_res_config_settings +msgid "Config Settings" +msgstr "Config Configurações" + +#. module: account_consolidation_oca +#: model:ir.model.fields,help:account_consolidation_oca.field_res_company__consolidation_diff_account_id +#: model:ir.model.fields,help:account_consolidation_oca.field_res_config_settings__consolidation_diff_account_id +msgid "Conso. differences will be affected to this account" +msgstr "As diferenças de consolidação serão enviadas para esta conta" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_consolidate_form +msgid "Consolidate" +msgstr "Consolidar" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_move_line__consolidated +msgid "Consolidated" +msgstr "Consolidado" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_move_line__consol_company_id +msgid "Consolidated from" +msgstr "Consolidado da" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_move__consol_company_id +msgid "Consolidated from Company" +msgstr "Consolidado da empresa" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:341 +#: model:ir.ui.menu,name:account_consolidation_oca.menu_consolidation +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +#, python-format +msgid "Consolidation" +msgstr "Consolidação" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:249 +#, python-format +msgid "Consolidation (%s %s)" +msgstr "Consolidação (%s %s)" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_account_consolidation_check +msgid "Consolidation Checks. Model used for views" +msgstr "Verificações de Consolidação. Modelo usado para vista" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_account__consolidation_company_id +msgid "Consolidation Company" +msgstr "Empresa Consolidada" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:439 +#, python-format +msgid "Consolidation Items" +msgstr "Itens de Consolidação" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_company__consolidation_percentage +msgid "Consolidation Percentage" +msgstr "Percentagem de Consolidação" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__consolidation_profile_ids +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_company__consolidation_profile_ids +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_company_consolidation_company_profile +msgid "Consolidation Profile" +msgstr "Perfil de Consolidação" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "Consolidation Profiles" +msgstr "Perfis de Consolidação" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_account__consolidation_account_id +msgid "Consolidation account" +msgstr "Conta de Consolidação" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_company__is_consolidation +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_config_settings__is_consolidation +msgid "Consolidation company" +msgstr "Empresa Consolidada" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:138 +#, python-format +msgid "Consolidation difference (%s %s)" +msgstr "Diferenças de Consolidação (%s %s)" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_company__consolidation_diff_account_id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_config_settings__consolidation_diff_account_id +msgid "Consolidation difference account" +msgstr "Conta de diferença de consolidação" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "Consolidation differences" +msgstr "Diferenças de consolidação" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "Consolidation journal" +msgstr "Diário de consolidação" + +#. module: account_consolidation_oca +#: model:res.groups,name:account_consolidation_oca.group_consolidation_manager +msgid "Consolidation manager" +msgstr "Gestor de consolidação" + +#. module: account_consolidation_oca +#: model:ir.model.fields,help:account_consolidation_oca.field_account_account__consolidation_account_id +msgid "Consolidation moves will be generated on this account" +msgstr "Os movimentos de consolidação serão gerados nesta conta" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__consolidation_percentage +msgid "Consolidation percentage" +msgstr "Percentagem de consolidação" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/models/consolidation_profile.py:43 +#, python-format +msgid "Consolidation percentage can only be defined in the rangebetween 0 and 100." +msgstr "A percentagem de consolidação só pode ser definida entre 0 e 100." + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_config_settings__consolidation_profile_ids +msgid "Consolidation profiles" +msgstr "Perfis de Consolidação" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_base.py:24 +#, python-format +msgid "Consolidation wizards can only be called from a consolidation company." +msgstr "" +"Os assistentes de consolidação só podem ser chamados a partir de uma empresa " +"de consolidação." + +#. module: account_consolidation_oca +#: model:ir.actions.act_window,name:account_consolidation_oca.action_consolidation_checks +#: model:ir.ui.menu,name:account_consolidation_oca.menu_consolidation_checks +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +msgid "Consolidation: Checks" +msgstr "Consolidação: Verificações" + +#. module: account_consolidation_oca +#: model:ir.actions.act_window,name:account_consolidation_oca.action_consolidation_consolidate +#: model:ir.ui.menu,name:account_consolidation_oca.menu_consolidation_consolidate +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_consolidate_form +msgid "Consolidation: Consolidate" +msgstr "Consolidação: Consolidar" + +#. module: account_consolidation_oca +#: model:ir.actions.act_window,name:account_consolidation_oca.action_consolidation_profile +msgid "Consolidation: Profiles" +msgstr "Consolidação: Perfis" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:448 +#, python-format +msgid "Could not generate any consolidation entries." +msgstr "Não foi possível gerar lançamentos de consolidação." + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__create_uid +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__create_uid +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__create_uid +msgid "Created by" +msgstr "Criado por" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__create_date +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__create_date +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__create_date +msgid "Created on" +msgstr "Criado em" + +#. module: account_consolidation_oca +#: model:res.company,overdue_msg:account_consolidation_oca.consolidation_company +#: model:res.company,overdue_msg:account_consolidation_oca.subsidiary_a +#: model:res.company,overdue_msg:account_consolidation_oca.subsidiary_b +msgid "Dear Sir/Madam,\n" +"\n" +"Our records indicate that some payments on your account are still due. Please find details below.\n" +"If the amount has already been paid, please disregard this notice. Otherwise, please forward us the total amount stated below.\n" +"If you have any queries regarding your account, Please contact us.\n" +"\n" +"Thank you in advance for your cooperation.\n" +"Best Regards," +msgstr "" +"Exmo. Senhor/Senhora,\n" +"\n" +"Os nossos registos indicam que alguns pagamentos na sua conta, ainda se " +"encontram por liquidar. Por favor, encontre os detalhes abaixo.\n" +"Se o valor já tiver sido pago, por favor, ignore este aviso. Caso contrário, " +"por favor, envie-nos o total indicado abaixo.\n" +"Se tiver quaisquer dúvidas em relação à sua conta, por favor, contacte-nos.\n" +"\n" +"Obrigado antecipadamente pela sua colaboração.\n" +"\n" +"Melhores Cumprimentos," + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "December" +msgstr "Dezembro" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "Default consolidation differences account" +msgstr "Conta pré definida de diferenças de consolidação" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_company__consolidation_default_journal_id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_config_settings__consolidation_default_journal_id +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "Default consolidation journal" +msgstr "Diário de consolidação pré definido" + +#. module: account_consolidation_oca +#: model:ir.model.fields,help:account_consolidation_oca.field_res_company__consolidation_default_journal_id +#: model:ir.model.fields,help:account_consolidation_oca.field_res_config_settings__consolidation_default_journal_id +msgid "Default journal to generate consolidation entries" +msgstr "Diário pré definido de lançamentos de consolidação" + +#. module: account_consolidation_oca +#: model:ir.model.fields,help:account_consolidation_oca.field_company_consolidation_profile__consolidation_percentage +msgid "Define a percentage to consolidate this company (in percents)" +msgstr "Defina uma percentagem para consolidar esta empresa (em percentagem)" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "Define the subsidiaries to consolidate" +msgstr "Defina as subsidiárias a consolidar" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_company_consolidation_profile_form +msgid "Discard" +msgstr "Descartar" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_base__display_name +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__display_name +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__display_name +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__display_name +msgid "Display Name" +msgstr "Nome a Exibir" + +#. module: account_consolidation_oca +#: selection:account.consolidation.check,state:0 +msgid "Error" +msgstr "Erro" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "February" +msgstr "Fevereiro" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_base__id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__id +msgid "ID" +msgstr "ID" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_move_line__consol_partner_id +msgid "Intercompany Partner" +msgstr "Parceiro Interempresa" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_base.py:137 +#, python-format +msgid "Invalid configuration, please launch the \"Consolidation: Checks\" wizard" +msgstr "" +"Configuração inválida, por favor execute o assistente \"Consolidação: " +"Verificações\"" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "January" +msgstr "Janeiro" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__journal_id +msgid "Journal" +msgstr "Diário" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_account_move +msgid "Journal Entries" +msgstr "Movimentos de Diário" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_account_move_line +msgid "Journal Item" +msgstr "Item do Diário" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "July" +msgstr "Julho" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "June" +msgstr "Junho" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_base____last_update +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check____last_update +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate____last_update +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile____last_update +msgid "Last Modified on" +msgstr "Última Modificação Em" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__write_uid +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__write_uid +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__write_uid +msgid "Last Updated by" +msgstr "Atualizado pela última vez por" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__write_date +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__write_date +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__write_date +msgid "Last Updated on" +msgstr "Atualizado pela última vez em" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "March" +msgstr "Março" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "May" +msgstr "Maio" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__message +msgid "Message" +msgstr "Mensagem" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__month +msgid "Month" +msgstr "Mês" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_base.py:58 +#, python-format +msgid "No consolidation account defined for this account" +msgstr "Nenhuma conta de consolidação definida nesta conta" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "November" +msgstr "Novembro" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +msgid "OK" +msgstr "Ok" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "October" +msgstr "Outubro" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/models/company.py:47 +#, python-format +msgid "Only one company can be defined as consolidation company." +msgstr "Apenas uma empresa pode ser definida como empresa de consolidação." + +#. module: account_consolidation_oca +#: selection:account.consolidation.check,state:0 +msgid "Open" +msgstr "Aberto" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:114 +#, python-format +msgid "Please set the Consolidation difference account for company %s in accounting settings." +msgstr "" +"Defina a conta de diferenças de consolidação para a empresa %s em " +"configuração de contas." + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +msgid "Prepare your consolidation and make sure that your consolidation will be correct by proceeding with the checks." +msgstr "" +"Prepare a sua consolidação e garanta que está correta procedendo às " +"verificações." + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_company_consolidation_profile_tree +msgid "Profiles" +msgstr "Perfis" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_consolidate_form +msgid "Profit and Loss accounts are consolidated using monthly currency rates." +msgstr "" +"Contas de Rendimentos e Gastos estão consolidadas usando taxas de câmbio " +"mensais." + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_consolidate_form +msgid "Run the Year-To-Date consolidation until the selected period for the defined subsidiaries." +msgstr "" +"Executar a consolidação acumulada até ao período definido nas subsidiárias." + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_company_consolidation_profile_form +msgid "Save" +msgstr "Guardar" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "September" +msgstr "Setembro" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__state +msgid "State" +msgstr "Estado" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__sub_company_id +msgid "Subsidiary" +msgstr "Subsidiária" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_company_consolidation_profile +msgid "Subsidiary consolidation profile" +msgstr "Perfil de consolidação a subsidiária" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__target_move +msgid "Target Moves" +msgstr "Movimentos alvo" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/models/consolidation_profile.py:55 +#, python-format +msgid "The company %s is already used in a consolidation profile." +msgstr "A empresa %s já é usada num perfil de consolidação." + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_base.py:67 +#, python-format +msgid "The consolidation account defined for this account should be on company %s." +msgstr "A conta de consolidação definida nesta conta deve estra na empresa %s." + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:170 +#, python-format +msgid "The error below appeared while trying to reverse the following moves: \n" +" %s \n" +" %s" +msgstr "" +"O erro abaixo aparece quando se revertem os lançamentos seguintes: \n" +" %s \n" +" %s" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "Use this company as consolidation company" +msgstr "Usar esta empresa como empresa de consolidação" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__year +msgid "Year" +msgstr "Ano" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_account_consolidation_consolidate +msgid "account.consolidation.consolidate" +msgstr "account.consolidation.consolidate" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:296 +#, python-format +msgid "monthly rate : %s" +msgstr "Taxa mensal : %s" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:301 +#, python-format +msgid "spot rate : %s" +msgstr "taxa spot : %s" diff --git a/account_consolidation_oca/i18n/pt_BR.po b/account_consolidation_oca/i18n/pt_BR.po new file mode 100644 index 00000000..bf57579b --- /dev/null +++ b/account_consolidation_oca/i18n/pt_BR.po @@ -0,0 +1,649 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_consolidation_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2020-03-21 19:14+0000\n" +"Last-Translator: Rodrigo Macedo \n" +"Language-Team: none\n" +"Language: pt_BR\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.10\n" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_check.py:82 +#, python-format +msgid "

Consolidation configuration errors

" +msgstr "

Erros de configuração de consolidação

" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_check.py:87 +#, python-format +msgid "

No configuration error detected ! You can now proceed with the consolidation.

" +msgstr "" +"

Nenhum erro de configuração detectado! Agora você pode prosseguir com a " +"consolidação.

" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_check.py:77 +#, python-format +msgid "

Company access not allowed

" +msgstr "

Acesso da empresa não é permitido

" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_check.py:73 +#, python-format +msgid "

Company defined on intercompany partners

" +msgstr "

Empresa definida em parceiros intercompanhia

" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_check.py:70 +#, python-format +msgid "

Invalid account mapping

" +msgstr "

Mapeamento de contas inválidas

" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "" +msgstr "" +"" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +msgid "Accounts: Check consistency between subsidiaries accounts and Holding company consolidation accounts." +msgstr "" +"Contas: Verifique a consistência entre as contas das " +"subsidiárias e as contas de consolidação da Holding." + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +msgid "Companies allowed: Check that user has access to subsidiaries." +msgstr "" +"Empresas permitidas: Verifique se o usuário tem acesso a " +"subsidiárias." + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +msgid "Partners: Check that partners linked to subsidiaries have no company defined." +msgstr "" +"Parceiros: Verifique se os sócios vinculados a subsidiárias " +"não têm nenhuma empresa definida." + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_account_account +msgid "Account" +msgstr "Conta" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,target_move:0 +msgid "All Entries" +msgstr "Todas as Entradas" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,target_move:0 +msgid "All Posted Entries" +msgstr "Todas as Entradas Lançadas" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "April" +msgstr "Abril" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "August" +msgstr "Agosto" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_consolidate_form +msgid "Balance sheet accounts are consolidated using standard currency rates." +msgstr "As contas do balanço são consolidadas usando taxas de moeda padrão." + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_consolidate_form +msgid "Cancel" +msgstr "Cancelar" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +msgid "Check configuration" +msgstr "Verificar a configuração" + +#. module: account_consolidation_oca +#: model:ir.model.fields,help:account_consolidation_oca.field_res_config_settings__is_consolidation +msgid "Check this box if you want to consolidate in this company." +msgstr "Marque esta caixa se você quiser se consolidar nesta empresa." + +#. module: account_consolidation_oca +#: selection:account.consolidation.check,state:0 +msgid "Checks ok" +msgstr "Verificação ok" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_account_consolidation_base +msgid "Common consolidation wizard. Intended to be inherited" +msgstr "Assistente de consolidação comum. Pretendia ser herdado" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_res_company +msgid "Companies" +msgstr "Empresas" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_base__company_id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__company_id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__company_id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__company_id +msgid "Company" +msgstr "Empresa" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_res_config_settings +msgid "Config Settings" +msgstr "Configurações" + +#. module: account_consolidation_oca +#: model:ir.model.fields,help:account_consolidation_oca.field_res_company__consolidation_diff_account_id +#: model:ir.model.fields,help:account_consolidation_oca.field_res_config_settings__consolidation_diff_account_id +msgid "Conso. differences will be affected to this account" +msgstr "As diferenças de consolidação serão afetadas nesta conta" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_consolidate_form +msgid "Consolidate" +msgstr "Consolidar" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_move_line__consolidated +msgid "Consolidated" +msgstr "Consolidado(s)" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_move_line__consol_company_id +msgid "Consolidated from" +msgstr "Consolidado de" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_move__consol_company_id +msgid "Consolidated from Company" +msgstr "Consolidado da Empresa" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:341 +#: model:ir.ui.menu,name:account_consolidation_oca.menu_consolidation +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +#, python-format +msgid "Consolidation" +msgstr "Consolidação" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:249 +#, python-format +msgid "Consolidation (%s %s)" +msgstr "Consolidação (%s %s)" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_account_consolidation_check +msgid "Consolidation Checks. Model used for views" +msgstr "Verificações de consolidação. Modelo usado para visualizações" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_account__consolidation_company_id +msgid "Consolidation Company" +msgstr "Empresa de Consolidação" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:439 +#, python-format +msgid "Consolidation Items" +msgstr "Itens de Consolidação" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_company__consolidation_percentage +msgid "Consolidation Percentage" +msgstr "Percentual de Consolidação" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__consolidation_profile_ids +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_company__consolidation_profile_ids +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_company_consolidation_company_profile +msgid "Consolidation Profile" +msgstr "Perfil de Consolidação" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "Consolidation Profiles" +msgstr "Perfis de Consolidação" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_account__consolidation_account_id +msgid "Consolidation account" +msgstr "Conta de consolidação" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_company__is_consolidation +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_config_settings__is_consolidation +msgid "Consolidation company" +msgstr "Empresa de consolidação" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:138 +#, python-format +msgid "Consolidation difference (%s %s)" +msgstr "Diferença de consolidação (%s %s)" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_company__consolidation_diff_account_id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_config_settings__consolidation_diff_account_id +msgid "Consolidation difference account" +msgstr "Conta de diferença de consolidação" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "Consolidation differences" +msgstr "Diferenças de consolidação" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "Consolidation journal" +msgstr "Diário de consolidação" + +#. module: account_consolidation_oca +#: model:res.groups,name:account_consolidation_oca.group_consolidation_manager +msgid "Consolidation manager" +msgstr "Gerente de consolidação" + +#. module: account_consolidation_oca +#: model:ir.model.fields,help:account_consolidation_oca.field_account_account__consolidation_account_id +msgid "Consolidation moves will be generated on this account" +msgstr "Movimentos de consolidação serão gerados por conta" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__consolidation_percentage +msgid "Consolidation percentage" +msgstr "Percentual de consolidação" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/models/consolidation_profile.py:43 +#, python-format +msgid "Consolidation percentage can only be defined in the rangebetween 0 and 100." +msgstr "" +"O percentual de consolidação só pode ser definido na faixa entre 0 e 100." + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_config_settings__consolidation_profile_ids +msgid "Consolidation profiles" +msgstr "Perfis de consolidação" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_base.py:24 +#, python-format +msgid "Consolidation wizards can only be called from a consolidation company." +msgstr "" +"Os assistentes de consolidação só podem ser chamados de uma empresa de " +"consolidação." + +#. module: account_consolidation_oca +#: model:ir.actions.act_window,name:account_consolidation_oca.action_consolidation_checks +#: model:ir.ui.menu,name:account_consolidation_oca.menu_consolidation_checks +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +msgid "Consolidation: Checks" +msgstr "Consolidação: Verificações" + +#. module: account_consolidation_oca +#: model:ir.actions.act_window,name:account_consolidation_oca.action_consolidation_consolidate +#: model:ir.ui.menu,name:account_consolidation_oca.menu_consolidation_consolidate +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_consolidate_form +msgid "Consolidation: Consolidate" +msgstr "Consolidação: Consolidação" + +#. module: account_consolidation_oca +#: model:ir.actions.act_window,name:account_consolidation_oca.action_consolidation_profile +msgid "Consolidation: Profiles" +msgstr "Consolidação: Perfis" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:448 +#, python-format +msgid "Could not generate any consolidation entries." +msgstr "Não conseguiu gerar entradas de consolidação." + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__create_uid +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__create_uid +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__create_uid +msgid "Created by" +msgstr "Criado por" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__create_date +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__create_date +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__create_date +msgid "Created on" +msgstr "Criado em" + +#. module: account_consolidation_oca +#: model:res.company,overdue_msg:account_consolidation_oca.consolidation_company +#: model:res.company,overdue_msg:account_consolidation_oca.subsidiary_a +#: model:res.company,overdue_msg:account_consolidation_oca.subsidiary_b +msgid "Dear Sir/Madam,\n" +"\n" +"Our records indicate that some payments on your account are still due. Please find details below.\n" +"If the amount has already been paid, please disregard this notice. Otherwise, please forward us the total amount stated below.\n" +"If you have any queries regarding your account, Please contact us.\n" +"\n" +"Thank you in advance for your cooperation.\n" +"Best Regards," +msgstr "" +"Prezado senhor/senhora, nossos registros indicam que alguns pagamentos em " +"sua conta ainda estão por pagar. Por favor, encontre detalhes abaixo.\n" +"Se o montante já tiver sido pago, por favor ignore este aviso. Caso " +"contrário, envie-nos o montante total indicado abaixo.\n" +"Se você tem quaisquer perguntas a respeito de sua conta, contate-nos por " +"favor.\n" +"\n" +"Obrigado antecipadamente pela sua cooperação.\n" +"Atenciosamente," + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "December" +msgstr "Dezembro" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "Default consolidation differences account" +msgstr "Conta de diferenças de consolidação padrão" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_company__consolidation_default_journal_id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_res_config_settings__consolidation_default_journal_id +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "Default consolidation journal" +msgstr "Diário de consolidação padrão" + +#. module: account_consolidation_oca +#: model:ir.model.fields,help:account_consolidation_oca.field_res_company__consolidation_default_journal_id +#: model:ir.model.fields,help:account_consolidation_oca.field_res_config_settings__consolidation_default_journal_id +msgid "Default journal to generate consolidation entries" +msgstr "Diário padrão para gerar entradas de consolidação" + +#. module: account_consolidation_oca +#: model:ir.model.fields,help:account_consolidation_oca.field_company_consolidation_profile__consolidation_percentage +msgid "Define a percentage to consolidate this company (in percents)" +msgstr "Defina uma porcentagem para consolidar essa empresa (em percentual)" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "Define the subsidiaries to consolidate" +msgstr "Definir as subsidiárias para consolidar" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_company_consolidation_profile_form +msgid "Discard" +msgstr "Descartar" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_base__display_name +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__display_name +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__display_name +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__display_name +msgid "Display Name" +msgstr "Nome Exibido" + +#. module: account_consolidation_oca +#: selection:account.consolidation.check,state:0 +msgid "Error" +msgstr "Erro" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "February" +msgstr "Fevereiro" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_base__id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__id +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__id +msgid "ID" +msgstr "ID" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_move_line__consol_partner_id +msgid "Intercompany Partner" +msgstr "Parceiro Intercompany" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_base.py:137 +#, python-format +msgid "Invalid configuration, please launch the \"Consolidation: Checks\" wizard" +msgstr "" +"Configuração inválida, por favor, execute o assistente \"Consolidação: " +"Verificações\"" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "January" +msgstr "Janeiro" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__journal_id +msgid "Journal" +msgstr "Diário" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_account_move +msgid "Journal Entries" +msgstr "Registros Diários" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_account_move_line +msgid "Journal Item" +msgstr "Item de Diário" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "July" +msgstr "Julho" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "June" +msgstr "Junho" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_base____last_update +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check____last_update +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate____last_update +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile____last_update +msgid "Last Modified on" +msgstr "Última Modificação em" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__write_uid +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__write_uid +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__write_uid +msgid "Last Updated by" +msgstr "Última Atualização por" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__write_date +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__write_date +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__write_date +msgid "Last Updated on" +msgstr "Última Atualização em" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "March" +msgstr "Março" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "May" +msgstr "Maio" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__message +msgid "Message" +msgstr "Mensagem" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__month +msgid "Month" +msgstr "Mês" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_base.py:58 +#, python-format +msgid "No consolidation account defined for this account" +msgstr "Nenhuma conta de consolidação definida para esta conta" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "November" +msgstr "Novembro" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +msgid "OK" +msgstr "OK" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "October" +msgstr "Outubro" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/models/company.py:47 +#, python-format +msgid "Only one company can be defined as consolidation company." +msgstr "Apenas uma empresa pode ser definida como empresa de consolidação." + +#. module: account_consolidation_oca +#: selection:account.consolidation.check,state:0 +msgid "Open" +msgstr "Abrir" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:114 +#, python-format +msgid "Please set the Consolidation difference account for company %s in accounting settings." +msgstr "" +"Defina a conta de diferença de consolidação para a empresa %s em " +"configurações contábeis." + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_check_form +msgid "Prepare your consolidation and make sure that your consolidation will be correct by proceeding with the checks." +msgstr "" +"Prepare sua consolidação e certifique-se de que sua consolidação estará " +"correta prosseguindo com as verificações." + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_company_consolidation_profile_tree +msgid "Profiles" +msgstr "Perfis" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_consolidate_form +msgid "Profit and Loss accounts are consolidated using monthly currency rates." +msgstr "" +"As contas de Lucro e Perda estão consolidadas usando taxas mensais de moeda." + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_consolidation_consolidate_form +msgid "Run the Year-To-Date consolidation until the selected period for the defined subsidiaries." +msgstr "" +"Execute a consolidação acumulada até o período selecionado para as " +"subsidiárias definidas." + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.view_company_consolidation_profile_form +msgid "Save" +msgstr "Salvar" + +#. module: account_consolidation_oca +#: selection:account.consolidation.consolidate,month:0 +msgid "September" +msgstr "Setembro" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_check__state +msgid "State" +msgstr "Estado" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_company_consolidation_profile__sub_company_id +msgid "Subsidiary" +msgstr "Subsidiária" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_company_consolidation_profile +msgid "Subsidiary consolidation profile" +msgstr "Perfil de consolidação subsidiária" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__target_move +msgid "Target Moves" +msgstr "Destino dos Movimentos" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/models/consolidation_profile.py:55 +#, python-format +msgid "The company %s is already used in a consolidation profile." +msgstr "A empresa %s já é usada em um perfil de consolidação." + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_base.py:67 +#, python-format +msgid "The consolidation account defined for this account should be on company %s." +msgstr "" +"A conta de consolidação definida para essa conta deve ser da empresa %s." + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:170 +#, python-format +msgid "The error below appeared while trying to reverse the following moves: \n" +" %s \n" +" %s" +msgstr "" +"O erro abaixo apareceu ao tentar reverter os seguintes movimentos: \n" +" %s \n" +" %s" + +#. module: account_consolidation_oca +#: model_terms:ir.ui.view,arch_db:account_consolidation_oca.res_config_settings_view_form +msgid "Use this company as consolidation company" +msgstr "Use esta empresa como empresa de consolidação" + +#. module: account_consolidation_oca +#: model:ir.model.fields,field_description:account_consolidation_oca.field_account_consolidation_consolidate__year +msgid "Year" +msgstr "Ano" + +#. module: account_consolidation_oca +#: model:ir.model,name:account_consolidation_oca.model_account_consolidation_consolidate +msgid "account.consolidation.consolidate" +msgstr "conta.consolidação.consolidado" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:296 +#, python-format +msgid "monthly rate : %s" +msgstr "taxa mensal : %s" + +#. module: account_consolidation_oca +#: code:addons/account_consolidation_oca/wizard/consolidation_consolidate.py:301 +#, python-format +msgid "spot rate : %s" +msgstr "taxa spot : %s" diff --git a/account_consolidation_oca/models/__init__.py b/account_consolidation_oca/models/__init__.py new file mode 100644 index 00000000..6faadd5c --- /dev/null +++ b/account_consolidation_oca/models/__init__.py @@ -0,0 +1,5 @@ +from . import account +from . import account_move +from . import company +from . import consolidation_profile +from . import res_config_settings diff --git a/account_consolidation_oca/models/account.py b/account_consolidation_oca/models/account.py new file mode 100644 index 00000000..1825aa9f --- /dev/null +++ b/account_consolidation_oca/models/account.py @@ -0,0 +1,52 @@ +# Copyright 2011-2019 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class AccountAccount(models.Model): + + _inherit = "account.account" + + consolidation_company_id = fields.Many2one( + comodel_name="res.company", + compute="_compute_conso_company", + store=True, + ) + consolidation_account_id = fields.Many2one( + comodel_name="account.account", + string="Consolidation account", + domain="[('company_id', '=', consolidation_company_id)]", + help="Consolidation moves will be generated on this account", + ) + + @api.depends("company_id") + def _compute_conso_company(self): + """Computes the consolidation company of the account's company.""" + for acc in self: + profile = self.env["company.consolidation.profile"].search( + [("sub_company_id", "=", acc.company_id.id)] + ) + if profile: + acc.consolidation_company_id = profile.company_id + + @api.depends("name", "code") + def name_get(self): + """Display the account company if the user is connected to it..""" + if self.env.user.has_group( + "account_consolidation_oca.group_consolidation_manager" + ): + result = [] + for account in self: + if account.company_id != self.env.user.company_id: + name = "%s %s (%s)" % ( + account.code, + account.name, + account.company_id.name, + ) + else: + name = account.code + " " + account.name + result.append((account.id, name)) + else: + result = super().name_get() + return result diff --git a/account_consolidation_oca/models/account_move.py b/account_consolidation_oca/models/account_move.py new file mode 100644 index 00000000..c7d9b3ab --- /dev/null +++ b/account_consolidation_oca/models/account_move.py @@ -0,0 +1,95 @@ +# Copyright 2011-2019 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from lxml import etree + +from odoo import api, fields, models + + +class AccountMove(models.Model): + + _inherit = "account.move" + + consol_company_id = fields.Many2one( + comodel_name="res.company", + string="Consolidated from Company", + readonly=True, + ) + + @api.model + def _fields_view_get( + self, view_id=None, view_type="form", toolbar=False, submenu=False + ): + """Hide fields `consol_company_id` if the user is not connected to + a consolidation company.""" + res = super()._fields_view_get(view_id, view_type, toolbar, submenu) + if view_type == "form": + xml = etree.fromstring(res["arch"]) + node = xml.find(".//tree//field[@name='consol_company_id']") + if node is not None: + node.set( + "attrs", + str( + { + "column_invisible": not self.env.user.company_id.is_consolidation + } + ), + ) + res["arch"] = etree.tostring(xml) + return res + + def post(self): + """Bypass move posting when reversing consolidation moves""" + if self.env.context.get("__conso_reversal_no_post"): + return True + return super().action_post() + + +class AccountMoveLine(models.Model): + + _inherit = "account.move.line" + + consol_company_id = fields.Many2one( + comodel_name="res.company", + related="move_id.consol_company_id", + string="Consolidated from", + store=True, # for the group_by + readonly=True, + ) + consol_partner_id = fields.Many2one( + comodel_name="res.partner", string="Intercompany Partner", readonly=True + ) + consolidated = fields.Boolean(default=False) + + @api.model + def _fields_view_get( + self, view_id=None, view_type="form", toolbar=False, submenu=False + ): + """Hide fields `consol_company_id` and `consol_partner_id` if the + user is not connected to a consolidation company.""" + res = super()._fields_view_get(view_id, view_type, toolbar, submenu) + + if view_id == self.env.ref("account.view_move_line_tree").id: + xml = etree.fromstring(res["arch"]) + company_node = xml.find(".//field[@name='consol_company_id']") + if company_node is not None: + company_node.set( + "attrs", + str( + { + "column_invisible": not self.env.user.company_id.is_consolidation + } + ), + ) + partner_node = xml.find(".//field[@name='consol_partner_id']") + if partner_node is not None: + partner_node.set( + "attrs", + str( + { + "column_invisible": not self.env.user.company_id.is_consolidation + } + ), + ) + res["arch"] = etree.tostring(xml) + + return res diff --git a/account_consolidation_oca/models/company.py b/account_consolidation_oca/models/company.py new file mode 100644 index 00000000..430fa019 --- /dev/null +++ b/account_consolidation_oca/models/company.py @@ -0,0 +1,48 @@ +# Copyright 2011-2019 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError + + +class ResCompany(models.Model): + + _inherit = "res.company" + + @api.depends("consolidation_profile_ids") + def _compute_conso_percentage(self): + """Computes conso percentage from sub company consolidation profile.""" + for company in self: + profile = self.env["company.consolidation.profile"].search( + [("sub_company_id", "=", company.id)] + ) + if profile: + company.consolidation_percentage = profile.consolidation_percentage + else: + company.consolidation_percentage = 0 + + consolidation_diff_account_id = fields.Many2one( + comodel_name="account.account", + string="Consolidation difference account", + help="Conso. differences will be affected to this account", + ) + consolidation_default_journal_id = fields.Many2one( + comodel_name="account.journal", + string="Default consolidation journal", + help="Default journal to generate consolidation entries", + ) + consolidation_profile_ids = fields.One2many( + comodel_name="company.consolidation.profile", inverse_name="company_id" + ) + consolidation_percentage = fields.Float( + compute=lambda self: self._compute_conso_percentage() + ) + is_consolidation = fields.Boolean(string="Consolidation company") + + @api.constrains("is_consolidation") + def _check_single_conso_company(self): + """Ensure there is only one company defined as consolidation.""" + if self.search_count([("is_consolidation", "=", True)]) > 1: + raise ValidationError( + _("Only one company can be defined as consolidation company.") + ) diff --git a/account_consolidation_oca/models/consolidation_profile.py b/account_consolidation_oca/models/consolidation_profile.py new file mode 100644 index 00000000..75ec6874 --- /dev/null +++ b/account_consolidation_oca/models/consolidation_profile.py @@ -0,0 +1,71 @@ +# Copyright 2019 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError + + +class CompanyConsolidationProfile(models.Model): + + _name = "company.consolidation.profile" + _description = "Subsidiary consolidation profile" + _order = "sub_company_id" + _rec_name = "sub_company_id" + + @api.model + def _default_consolidation_percentage(self): + return 100 + + company_id = fields.Many2one( + comodel_name="res.company", + default=lambda self: self.env.user.company_id, + required=True, + ) + consolidation_percentage = fields.Float( + string="Consolidation percentage", + help="Define a percentage to consolidate this company (in percents)", + default=lambda self: self._default_consolidation_percentage(), + required=True, + ) + sub_company_id = fields.Many2one( + comodel_name="res.company", required=True, string="Subsidiary" + ) + + @api.constrains("consolidation_percentage") + def _check_consolidation_percentage(self): + for profile in self: + if ( + profile.consolidation_percentage < 0 + or profile.consolidation_percentage > 100 + ): + raise ValidationError( + _( + "Consolidation percentage can only be defined in the range" + "between 0 and 100." + ) + ) + + @api.constrains("sub_company_id") + def _check_sub_company_unique(self): + """Ensure there is only one consolidation profile per sub company.""" + for profile in self: + count = self.search_count( + [("sub_company_id", "=", profile.sub_company_id.id)] + ) + if count > 1: + raise ValidationError( + _( + "The company %s is already used in a consolidation " + "profile." % profile.sub_company_id.name + ) + ) + + def name_get(self): + return [ + ( + record.id, + "%s (%s %%)" + % (record.sub_company_id.name, record.consolidation_percentage), + ) + for record in self + ] diff --git a/account_consolidation_oca/models/res_config_settings.py b/account_consolidation_oca/models/res_config_settings.py new file mode 100644 index 00000000..4c1fd3ad --- /dev/null +++ b/account_consolidation_oca/models/res_config_settings.py @@ -0,0 +1,36 @@ +# Copyright 2019 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + + _inherit = "res.config.settings" + + consolidation_diff_account_id = fields.Many2one( + comodel_name="account.account", + string="Consolidation difference account", + related="company_id.consolidation_diff_account_id", + help="Conso. differences will be affected to this account", + readonly=False, + ) + consolidation_default_journal_id = fields.Many2one( + comodel_name="account.journal", + string="Default consolidation journal", + related="company_id.consolidation_default_journal_id", + help="Default journal to generate consolidation entries", + readonly=False, + ) + is_consolidation = fields.Boolean( + string="Consolidation company", + related="company_id.is_consolidation", + help="Check this box if you want to consolidate in this company.", + readonly=False, + ) + consolidation_profile_ids = fields.One2many( + comodel_name="company.consolidation.profile", + related="company_id.consolidation_profile_ids", + string="Consolidation profiles", + readonly=False, + ) diff --git a/account_consolidation_oca/readme/CONFIGURE.rst b/account_consolidation_oca/readme/CONFIGURE.rst new file mode 100644 index 00000000..9fa23894 --- /dev/null +++ b/account_consolidation_oca/readme/CONFIGURE.rst @@ -0,0 +1,34 @@ +To install this module, you need the modules `currency_monthly_rate` to be +available in your system. + +To configure this module, you need to flag a company as Consolidation in the +Accounting settings. + +Then, you should define a consolidation difference account and a consolidation +journal on the consolidation company, and create consolidation profiles for +each subsidiary you want to consolidate. + +For each subsidiary to consolidate, make sure the related partner of the +company has no company_id defined. + +Afterwards, you should define a consolidation account from your consolidation +company, on every active account of the subsidiaries. + +You can then use the 'Consolidation : Checks' wizard in Accounting > Adviser to +ensure every active account of your subsidiaries are set, and company partners +have no company defined. + +Make sure you also defined currency rates and monthly currency rates on the +consolidation company for the currencies of your subsidiaries, as P&L accounts +are consolidated using monthly rates and B.S accounts using standard 'spot' +rates. + + +Known issues +============ + +* Consolidation manager has access to all the settings, or he wouldn't be able + to configure the module. +* Functional mapping of accounts is not tested. If no consolidation entries + are generated, it's probably because the balance of mapped accounts is 0 +* Correctness of companies hierarchy in profile rest on user diff --git a/account_consolidation_oca/readme/DESCRIPTION.rst b/account_consolidation_oca/readme/DESCRIPTION.rst new file mode 100644 index 00000000..63f0e407 --- /dev/null +++ b/account_consolidation_oca/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This module extends the functionality of accounting to allow you to consolidate journal items in a consolidation company. diff --git a/account_consolidation_oca/readme/ROADMAP.rst b/account_consolidation_oca/readme/ROADMAP.rst new file mode 100644 index 00000000..97a6f3b6 --- /dev/null +++ b/account_consolidation_oca/readme/ROADMAP.rst @@ -0,0 +1 @@ +* Implement a distinction on analytic accounts diff --git a/account_consolidation_oca/readme/USAGE.rst b/account_consolidation_oca/readme/USAGE.rst new file mode 100644 index 00000000..1eb2f722 --- /dev/null +++ b/account_consolidation_oca/readme/USAGE.rst @@ -0,0 +1,7 @@ +To consolidate subsidiaries in your consolidation company, you should use 'Consolidation : consolidate' wizard in Accounting > Adviser. + +You have to select the month until which every account move will be processed, and select if you want to consolidate all the moves or only posted ones. + +This will generate a journal entry in YTD (Year-To-Date) mode on your consolidation company for each subsidiary. Those entries are flagged as 'auto_post', so they will actually be posted when you run the consolidation the next time. + +The generated journal entries are unposted, allowing you to modify or delete it to run the consolidation again. diff --git a/account_consolidation_oca/security/account_consolidation_security.xml b/account_consolidation_oca/security/account_consolidation_security.xml new file mode 100644 index 00000000..05adb644 --- /dev/null +++ b/account_consolidation_oca/security/account_consolidation_security.xml @@ -0,0 +1,41 @@ + + + + Account multi-company + + + ['|',('company_id','=',False),'|',('company_id','child_of',[user.company_id.id]),('company_id','in',user.company_ids.ids)] + + + Account multi-company employees portal + + + ['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])] + + + + Account multi-company consolidation + + + [(1,'=',1)] + + + + Company rule consolidation + + + [('id','in',user.company_ids.ids)] + + + + + + + diff --git a/account_consolidation_oca/security/ir.model.access.csv b/account_consolidation_oca/security/ir.model.access.csv new file mode 100644 index 00000000..4fe46492 --- /dev/null +++ b/account_consolidation_oca/security/ir.model.access.csv @@ -0,0 +1,5 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_company_consolidation_profile,access_company_consolidation_profile,model_company_consolidation_profile,,1,0,0,0 +access_company_consolidation_profile_manager,access_company_consolidation_profile_manager,model_company_consolidation_profile,account_consolidation_oca.group_consolidation_manager,1,1,1,1 +access_account_consolidation_consolidate,access_account_consolidation_consolidate,model_account_consolidation_consolidate,account_consolidation_oca.group_consolidation_manager,1,1,1,1 +access_account_consolidation_check,access_account_consolidation_check,model_account_consolidation_check,account_consolidation_oca.group_consolidation_manager,1,1,1,1 diff --git a/account_consolidation_oca/security/res_groups.xml b/account_consolidation_oca/security/res_groups.xml new file mode 100644 index 00000000..cc23ffc2 --- /dev/null +++ b/account_consolidation_oca/security/res_groups.xml @@ -0,0 +1,12 @@ + + + + Consolidation manager + + + + diff --git a/account_consolidation_oca/static/description/icon.png b/account_consolidation_oca/static/description/icon.png new file mode 100644 index 00000000..3a0328b5 Binary files /dev/null and b/account_consolidation_oca/static/description/icon.png differ diff --git a/account_consolidation_oca/static/description/index.html b/account_consolidation_oca/static/description/index.html new file mode 100644 index 00000000..da578407 --- /dev/null +++ b/account_consolidation_oca/static/description/index.html @@ -0,0 +1,462 @@ + + + + + + +Account Consolidation + + + +
+

Account Consolidation

+ + +

Beta License: AGPL-3 OCA/account-consolidation Translate me on Weblate Try me on Runboat

+

This module extends the functionality of accounting to allow you to consolidate journal items in a consolidation company.

+

Table of contents

+ +
+

Configuration

+

To install this module, you need the modules currency_monthly_rate to be +available in your system.

+

To configure this module, you need to flag a company as Consolidation in the +Accounting settings.

+

Then, you should define a consolidation difference account and a consolidation +journal on the consolidation company, and create consolidation profiles for +each subsidiary you want to consolidate.

+

For each subsidiary to consolidate, make sure the related partner of the +company has no company_id defined.

+

Afterwards, you should define a consolidation account from your consolidation +company, on every active account of the subsidiaries.

+

You can then use the ‘Consolidation : Checks’ wizard in Accounting > Adviser to +ensure every active account of your subsidiaries are set, and company partners +have no company defined.

+

Make sure you also defined currency rates and monthly currency rates on the +consolidation company for the currencies of your subsidiaries, as P&L accounts +are consolidated using monthly rates and B.S accounts using standard ‘spot’ +rates.

+
+
+

Known issues

+
    +
  • Consolidation manager has access to all the settings, or he wouldn’t be able +to configure the module.
  • +
  • Functional mapping of accounts is not tested. If no consolidation entries +are generated, it’s probably because the balance of mapped accounts is 0
  • +
  • Correctness of companies hierarchy in profile rest on user
  • +
+
+
+

Usage

+

To consolidate subsidiaries in your consolidation company, you should use ‘Consolidation : consolidate’ wizard in Accounting > Adviser.

+

You have to select the month until which every account move will be processed, and select if you want to consolidate all the moves or only posted ones.

+

This will generate a journal entry in YTD (Year-To-Date) mode on your consolidation company for each subsidiary. Those entries are flagged as ‘auto_post’, so they will actually be posted when you run the consolidation the next time.

+

The generated journal entries are unposted, allowing you to modify or delete it to run the consolidation again.

+
+
+

Known issues / Roadmap

+
    +
  • Implement a distinction on analytic accounts
  • +
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Camptocamp
  • +
+
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

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-consolidation project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/account_consolidation_oca/tests/__init__.py b/account_consolidation_oca/tests/__init__.py new file mode 100644 index 00000000..f7579225 --- /dev/null +++ b/account_consolidation_oca/tests/__init__.py @@ -0,0 +1,5 @@ +# Copyright 2019 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import test_account_company_rules +from . import test_account_consolidation diff --git a/account_consolidation_oca/tests/test_account_company_rules.py b/account_consolidation_oca/tests/test_account_company_rules.py new file mode 100644 index 00000000..b3e5abde --- /dev/null +++ b/account_consolidation_oca/tests/test_account_company_rules.py @@ -0,0 +1,211 @@ +# Copyright 2019 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import exceptions +from odoo.tests.common import SavepointCase + + +class TestAccountCompanyRules(SavepointCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + + cls.user_model = cls.env["res.users"].with_context( + {"no_reset_password": True, "mail_create_nosubscribe": True} + ) + + cls.account_model = cls.env["account.account"] + + cls.main_company = cls.env.ref("base.main_company") + cls.consolidation_company = cls.env.ref( + "account_consolidation_oca.consolidation_company" + ) + cls.subsidiary_a = cls.env.ref("account_consolidation_oca.subsidiary_a") + cls.subsidiary_b = cls.env.ref("account_consolidation_oca.subsidiary_b") + + cls.account_user = cls.user_model.create( + { + "name": "Account user", + "login": "Account user", + "email": "account@user.com", + "groups_id": [ + ( + 6, + 0, + [ + cls.env.ref("account.group_account_user").id, + cls.env.ref("base.group_user").id, + ], + ) + ], + "company_ids": [(6, 0, [cls.main_company.id])], + "company_id": cls.main_company.id, + } + ) + + cls.account_manager = cls.user_model.create( + { + "name": "Account manager", + "login": "Account manager", + "email": "account@manager.com", + "groups_id": [ + ( + 6, + 0, + [ + cls.env.ref("account.group_account_manager").id, + cls.env.ref("base.group_user").id, + ], + ) + ], + "company_ids": [(6, 0, [cls.main_company.id])], + "company_id": cls.main_company.id, + } + ) + + cls.all_companies = ( + cls.main_company + | cls.consolidation_company + | cls.subsidiary_a + | cls.subsidiary_b + ) + + cls.consolidation_manager = cls.user_model.create( + { + "name": "Consolidation manager", + "login": "Consolidation manager", + "email": "consolidation@manager.com", + "groups_id": [ + ( + 6, + 0, + [ + cls.env.ref( + "account_consolidation_oca.group_consolidation_manager" + ).id, + cls.env.ref("base.group_user").id, + ], + ) + ], + "company_ids": [(6, 0, cls.all_companies.ids)], + "company_id": cls.main_company.id, + } + ) + + cls.dummy_account = cls.account_model.create( + { + "code": "DUMMY", + "name": "DUMMY", + "user_type_id": cls.env.ref( + "account.data_account_type_current_assets" + ).id, + "company_id": cls.main_company.id, + } + ) + + cls.conso_account = cls.account_model.create( + { + "code": "CONSO", + "name": "CONSO", + "user_type_id": cls.env.ref( + "account.data_account_type_current_assets" + ).id, + "company_id": cls.consolidation_company.id, + } + ) + + def _create_account(self, user, name, company=False): + vals = { + "code": name, + "name": name, + "user_type_id": self.env.ref("account.data_account_type_current_assets").id, + } + if company: + vals["company_id"] = company.id + + return self.account_model.with_user(user).create(vals) + + def _test_account_main_company_crud(self, user): + # Create + create_account = self._create_account(user, "TEST") + self.assertEqual(len(create_account), 1) + # Read + read_account = self.account_model.with_user(user).search( + [("name", "=", "TEST")] + ) + self.assertEqual(create_account, read_account) + # Write + read_account.with_user(user).write({"name": "TEST modified"}) + self.assertEqual(read_account.name, "TEST modified") + # Delete + read_account.with_user(user).unlink() + with self.assertRaises(exceptions.MissingError): + name = read_account.name # noqa + + def _test_account_main_company_read_only(self, user): + # Create error + with self.assertRaises(exceptions.AccessError): + self._create_account(user, "TEST") + # Read + read_account = self.account_model.with_user(user).search( + [("name", "=", "DUMMY")] + ) + self.assertEqual(len(read_account), 1) + self.assertEqual(read_account.name, "DUMMY") + # Write + with self.assertRaises(exceptions.AccessError): + read_account.with_user(user).write({"name": "DUMMY modified"}) + # Delete + with self.assertRaises(exceptions.AccessError): + read_account.with_user(user).unlink() + + def _test_account_multicompany_no_crud(self, user): + # Create + with self.assertRaises(exceptions.AccessError): + self._create_account(user, "TEST", company=self.consolidation_company) + # Read + read_account = self.account_model.with_user(user).search( + [("name", "=", "CONSO")] + ) + self.assertEqual(len(read_account), 0) + # Write + with self.assertRaises(exceptions.AccessError): + self.conso_account.with_user(user).write({"name": "CONSO modified"}) + # Delete + with self.assertRaises(exceptions.AccessError): + self.conso_account.with_user(user).unlink() + + def _test_account_multicompany_crud(self, user): + # Create + # We use TEST2 because somehow TEST was created although + # AccessError were raised + create_account = self._create_account( + user, "TEST2", company=self.consolidation_company + ) + self.assertEqual(len(create_account), 1) + # Read + read_account = self.account_model.with_user(user).search( + [("name", "=", "CONSO")] + ) + self.assertEqual(len(read_account), 1) + self.assertEqual(read_account.name, "CONSO") + # Write + read_account.with_user(user).write({"name": "CONSO modified"}) + self.assertEqual(read_account.name, "CONSO modified") + # Delete + read_account.with_user(user).unlink() + with self.assertRaises(exceptions.MissingError): + name = read_account.name # noqa + + def test_account_users(self): + self._test_account_main_company_crud(self.account_manager) + self._test_account_main_company_crud(self.consolidation_manager) + + self._test_account_main_company_read_only(self.account_user) + + def test_account_multicompany(self): + self._test_account_multicompany_no_crud(self.account_user) + self._test_account_multicompany_no_crud(self.account_manager) + + self.consolidation_manager.company_id = self.subsidiary_a + self._test_account_multicompany_crud(self.consolidation_manager) diff --git a/account_consolidation_oca/tests/test_account_consolidation.py b/account_consolidation_oca/tests/test_account_consolidation.py new file mode 100644 index 00000000..186031b9 --- /dev/null +++ b/account_consolidation_oca/tests/test_account_consolidation.py @@ -0,0 +1,477 @@ +# Copyright 2019 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +import time +from datetime import date +from unittest import mock + +from dateutil.relativedelta import relativedelta + +from odoo import fields +from odoo.tests.common import TransactionCase + +MOCK_PATH = "odoo.addons.account_consolidation_oca" + + +class TestAccountConsolidation(TransactionCase): + def setUp(self): + super().setUp() + + subsidiaries = [("subsidiary_a", "subA"), ("subsidiary_b", "subB")] + + opening_entries = { + "date": "%s-01-01" % time.strftime("%Y"), + "label": "Opening", + "subA": [("ass1", 130), ("lia1", -80), ("lia2", -50)], + "subB": [("ass1", 170), ("lia1", -160), ("lia2", -10)], + } + + p1_entries = { + "date": "%s-01-20" % time.strftime("%Y"), + "label": "P1", + "subA": [ + ("exp1", 20), + ("exp2", 30), + ("exp3", 65), + ("rev1", -50), + ("rev2", -90), + ("ass1", 80), + ("lia1", -10), + ("lia2", -45), + ], + "subB": [ + ("exp1", 15), + ("exp2", 26), + ("exp3", 12), + ("rev1", -88), + ("rev2", -70), + ("ass1", 155), + ("lia1", -40), + ("lia2", -10), + ], + } + + p2_entries = { + "date": "%s-02-15" % time.strftime("%Y"), + "label": "P2", + "subA": [ + ("exp1", 10), + ("exp2", 55), + ("exp3", 40), + ("rev1", -120), + ("rev2", -75), + ("ass1", 40), + ("lia1", 50), + ], + "subB": [ + ("exp1", 10), + ("exp2", 55), + ("exp3", 40), + ("rev1", -120), + ("ass1", 80), + ("lia1", -30), + ("lia2", -35), + ], + } + + entries = [opening_entries, p1_entries, p2_entries] + + for sub in subsidiaries: + company = self.env.ref("account_consolidation_oca.%s" % sub[0]) + company.partner_id.company_id = False + + setattr(self, sub[0], company) + + self.env.user.write({"company_ids": [(4, company.id, False)]}) + self.env.user.company_id = company + + journal = self.env.ref("account_consolidation_oca.%s_op_journal" % sub[1]) + setattr(self, "op_journal_%s" % sub[0], journal) + + for entry in entries: + lines_list = [] + for move_tuple in entry[sub[1]]: + account = self.env.ref( + "account_consolidation_oca.%s_%s" % (sub[1], move_tuple[0]) + ) + line_vals = { + "name": entry["label"], + "account_id": account.id, + "company_id": company.id, + "debit": 0, + "credit": 0, + } + amount = move_tuple[1] + + if amount > 0: + line_vals.update({"debit": amount}) + elif amount < 0: + line_vals.update({"credit": -amount}) + + lines_list.append(line_vals) + + lines_vals = [(0, 0, line) for line in lines_list] + move_vals = { + "journal_id": journal.id, + "company_id": company.id, + "ref": entry["label"], + "date": fields.Date.from_string(entry["date"]), + "line_ids": lines_vals, + } + move = self.env["account.move"].create(move_vals) + + # Post only moves of subisdiary B + if sub[0] == "subsidiary_b": + move.post() + + self.holding = self.env.ref("account_consolidation_oca.consolidation_company") + + self.consolidation_manager = self.env["res.users"].create( + { + "name": "Consolidation manager", + "login": "Consolidation manager", + "email": "consolidation@manager.com", + "groups_id": [ + ( + 6, + 0, + [ + self.env.ref( + "account_consolidation_oca.group_consolidation_manager" + ).id, + self.env.ref("base.group_user").id, + ], + ) + ], + "company_ids": [ + ( + 6, + 0, + [self.holding.id, self.subsidiary_a.id, self.subsidiary_b.id], + ) + ], + "company_id": self.holding.id, + } + ) + # Definition of company on the user should be done after creating + # consolidation user as this create() switches self.env.user's company + self.env.user.company_id = self.holding + + def test_default_values(self): + wizard = self.env["account.consolidation.consolidate"].create({}) + last_month = date.today() - relativedelta(month=1) + self.assertEqual(wizard.year, last_month.strftime("%Y")) + self.assertEqual(wizard.month, last_month.strftime("%m")) + self.assertEqual(wizard.company_id, self.holding) + self.assertEqual( + wizard.journal_id, self.holding.consolidation_default_journal_id + ) + self.assertEqual( + wizard.consolidation_profile_ids.mapped("sub_company_id"), + self.subsidiary_a | self.subsidiary_b, + ) + self.assertEqual(wizard.target_move, "posted") + + def test_consolidation_checks_ok(self): + wizard = self.env["account.consolidation.check"].create({}) + wizard.check_configuration() + self.assertEqual(wizard.state, "ok") + + def test_consolidation_checks_error_account(self): + self.env.ref("account_consolidation_oca.subA_exp1").write( + {"consolidation_account_id": False} + ) + wizard = self.env["account.consolidation.check"].create({}) + wizard.check_configuration() + self.assertEqual(wizard.state, "error") + + def test_consolidation_checks_error_company_partner(self): + self.subsidiary_a.partner_id.company_id = self.subsidiary_a + wizard = self.env["account.consolidation.check"].create({}) + wizard.check_configuration() + self.assertEqual(wizard.state, "error") + + def test_consolidation_checks_error_unallowed_company(self): + self.env.user.write( + {"company_ids": [(6, False, [self.holding.id, self.subsidiary_a.id])]} + ) + wizard = self.env["account.consolidation.check"].create({}) + wizard.check_configuration() + self.assertEqual(wizard.state, "error") + + def test_consolidation_jan_with_exchange_rates(self): + wizard = self.env["account.consolidation.consolidate"].create( + { + "month": "01", + } + ) + res = wizard.run_consolidation() + line_ids = res["domain"][0][2] + conso_move_lines = self.env["account.move.line"].browse(line_ids) + + conso_results = { + # monthly rate used : 1.3 + "exp1": 11.54, + "exp2": 20, + "exp3": 9.23, + "rev1": -67.69, + "rev2": -53.85, + # spot rate used : 1.36 + "ass1": 238.97, + "lia1": -147.06, + "lia2": -14.71, + "ced": 3.57, + } + for line in conso_move_lines: + + self.assertEqual(line.consol_company_id, self.subsidiary_b) + + acc = line.account_id.code.lower() + + self.assertAlmostEqual(line.balance, conso_results[acc], places=2) + + def test_consolidation_jan_with_interco_partner(self): + # Create intercompany moves + self.env["account.move"].create( + { + "journal_id": self.op_journal_subsidiary_a.id, + "company_id": self.subsidiary_a.id, + "ref": "/", + "date": fields.Date.from_string("%s-01-26" % time.strftime("%Y")), + "line_ids": [ + ( + 0, + 0, + { + "account_id": self.env.ref( + "account_consolidation_oca.subA_rec1" + ).id, + "company_id": self.subsidiary_a.id, + "debit": 100, + "credit": 0, + "partner_id": self.subsidiary_b.partner_id.id, + }, + ), + ( + 0, + 0, + { + "account_id": self.env.ref( + "account_consolidation_oca.subA_rev1" + ).id, + "company_id": self.subsidiary_a.id, + "debit": 0, + "credit": 100, + "partner_id": self.subsidiary_b.partner_id.id, + }, + ), + ], + } + ) + + self.env["account.move"].create( + { + "journal_id": self.op_journal_subsidiary_b.id, + "company_id": self.subsidiary_b.id, + "ref": "/", + "date": fields.Date.from_string("%s-01-26" % time.strftime("%Y")), + "currency_id": self.env.ref("base.EUR").id, + "line_ids": [ + ( + 0, + 0, + { + "account_id": self.env.ref( + "account_consolidation_oca.subB_exp1" + ).id, + "company_id": self.subsidiary_b.id, + "currency_id": self.env.ref("base.EUR").id, + "amount_currency": 100, + "debit": 180, + "credit": 0, + "partner_id": self.subsidiary_a.partner_id.id, + }, + ), + ( + 0, + 0, + { + "account_id": self.env.ref( + "account_consolidation_oca.subB_pay1" + ).id, + "company_id": self.subsidiary_b.id, + "currency_id": self.env.ref("base.EUR").id, + "amount_currency": -100, + "debit": 0, + "credit": 180, + "partner_id": self.subsidiary_a.partner_id.id, + }, + ), + ], + } + ).post() + # Run consolidation + wizard = self.env["account.consolidation.consolidate"].create( + {"month": "01", "target_move": "all"} + ) + res = wizard.run_consolidation() + line_ids = res["domain"][0][2] + conso_move_lines = self.env["account.move.line"].browse(line_ids) + + interco_partners = self.subsidiary_a.partner_id | self.subsidiary_b.partner_id + + interco_conso_move_lines = conso_move_lines.filtered( + lambda line: line.consol_partner_id in interco_partners + ) + + conso_results = { + "subA": {"rev1": -100, "rec1": 100}, + "subB": { + "exp1": 138.46, # 180 / monthly rate : 1.3 + "pay1": -132.35, # 180 / spot rate : 1.36 + }, + } + for line in interco_conso_move_lines: + if line.consol_company_id == self.subsidiary_a: + conso_comp = "subA" + elif line.consol_company_id == self.subsidiary_b: + conso_comp = "subB" + + acc = line.account_id.code.lower() + + self.assertAlmostEqual( + line.balance, conso_results[conso_comp][acc], places=2 + ) + + def test_multi_consolidation_(self): + # run consolidation multiple times and check if accounting entries are + # created correctly + wizard = ( + self.env["account.consolidation.consolidate"] + .with_user(self.consolidation_manager) + .create({"month": "01", "target_move": "all"}) + ) + res = wizard.with_user(self.consolidation_manager).run_consolidation() + line_ids = res["domain"][0][2] + jan_moves = ( + self.env["account.move.line"] + .with_user(self.consolidation_manager) + .browse(line_ids) + .mapped("move_id") + ) + self.assertTrue(all(jan_moves.mapped("auto_post"))) + self.assertFalse(jan_moves.mapped("reversed_entry_id")) + wizard = ( + self.env["account.consolidation.consolidate"] + .with_user(self.consolidation_manager) + .create({"month": "02", "target_move": "all"}) + ) + res = wizard.with_user(self.consolidation_manager).run_consolidation() + line_ids = res["domain"][0][2] + feb_moves = ( + self.env["account.move.line"] + .with_user(self.consolidation_manager) + .browse(line_ids) + .mapped("move_id") + ) + self.assertTrue(all(feb_moves.mapped("auto_post"))) + self.assertFalse(feb_moves.mapped("reversed_entry_id")) + # january moves were reversed and stay unposted + for jan_move in jan_moves: + self.assertTrue(jan_move.reversed_entry_id) + self.assertEqual(jan_move.state, "draft") + # If reversals of jan entries and feb entries are deleted, they must + # be generated again with the same values on the next run + jan_reversals = jan_moves.mapped("reversed_entry_id") + entry_fields = [ + "state", + "partner_id", + "consol_company_id", + "reversed_entry_id", + "currency_id", + "auto_post", + "journal_id", + "date", + "amount_total", + "company_id", + ] + line_fields = [ + "credit", + "consol_company_id", + "consol_partner_id", + "reconciled", + "account_id", + "partner_id", + "balance", + "journal_id", + "company_id", + "amount_currency", + "currency_id", + "company_currency_id", + "debit", + "quantity", + "consolidated", + "date", + ] + jan_reversal_values = jan_reversals.read(entry_fields) + jan_reversal_lines_values = jan_reversals.mapped("line_ids").read(line_fields) + feb_moves_values = feb_moves.read(entry_fields) + feb_moves_lines_values = feb_moves.mapped("line_ids").read(line_fields) + jan_reversals.unlink() + feb_moves.unlink() + wizard = ( + self.env["account.consolidation.consolidate"] + .with_user(self.consolidation_manager) + .create({"month": "02", "target_move": "all"}) + ) + res = wizard.with_user(self.consolidation_manager).run_consolidation() + line_ids = res["domain"][0][2] + new_feb_moves = ( + self.env["account.move.line"] + .with_user(self.consolidation_manager) + .browse(line_ids) + .mapped("move_id") + ) + new_jan_reversals = jan_moves.mapped("reversed_entry_id") + new_jan_reversal_values = new_jan_reversals.read(entry_fields) + new_jan_reversal_lines_values = new_jan_reversals.mapped("line_ids").read( + line_fields + ) + new_feb_moves_values = new_feb_moves.read(entry_fields) + new_feb_moves_lines_values = new_feb_moves.mapped("line_ids").read(line_fields) + + def _compare_new_read_values(list1, list2, flist): + """Ensure list1 and list2 are equal out of id fields + + :param list1: Result of a read on a recordset + :param list2: Result of a read on a recordset + :param flist: Fields that must be equal + :return: + """ + for item1, item2 in zip(list1, list2): + for fname in flist: + self.assertEqual(item1.get(fname), item2.get(fname)) + self.assertNotEqual(item1.get("id"), item2.get("id")) + + _compare_new_read_values( + jan_reversal_values, new_jan_reversal_values, entry_fields + ) + _compare_new_read_values( + jan_reversal_lines_values, new_jan_reversal_lines_values, line_fields + ) + _compare_new_read_values(feb_moves_values, new_feb_moves_values, entry_fields) + _compare_new_read_values( + feb_moves_lines_values, new_feb_moves_lines_values, line_fields + ) + # Check that reversal ir.cron will not reverse entries automatically + cron = self.env.ref("account.ir_cron_auto_post_draft_entry") + with mock.patch( + MOCK_PATH + ".models.consolidation_profile.fields.Date.today" + ) as fnct: + # Unposted entries are not selected by the ir.cron, so we post one + # and check that both entries stay 'unreversed' + new_feb_moves[0].post() + fnct.return_value = ("%s-06-30" % time.strftime("%Y"),) + cron.method_direct_trigger() + self.assertTrue(all(new_feb_moves.mapped("auto_post"))) + self.assertFalse(new_feb_moves.mapped("reversed_entry_id")) diff --git a/account_consolidation_oca/views/account_move_line_view.xml b/account_consolidation_oca/views/account_move_line_view.xml new file mode 100644 index 00000000..a8b41b2c --- /dev/null +++ b/account_consolidation_oca/views/account_move_line_view.xml @@ -0,0 +1,42 @@ + + + + account.move.form + account.move + + + + + + + + + + + + + + + + account.move.line.tree.conso + account.move.line + + + + + + + + + + + diff --git a/account_consolidation_oca/views/account_view.xml b/account_consolidation_oca/views/account_view.xml new file mode 100644 index 00000000..3993f9b9 --- /dev/null +++ b/account_consolidation_oca/views/account_view.xml @@ -0,0 +1,23 @@ + + + + + account.account.consolidation.form + account.account + + + + + + + + + + + diff --git a/account_consolidation_oca/views/company_consolidation_profile.xml b/account_consolidation_oca/views/company_consolidation_profile.xml new file mode 100644 index 00000000..74610a14 --- /dev/null +++ b/account_consolidation_oca/views/company_consolidation_profile.xml @@ -0,0 +1,79 @@ + + + + company.consolidation.profile.view + company.consolidation.profile + form + +
+ +
+
+ + + +
+
+
+
+
+
+ + + + company.consolidation.profile.view + company.consolidation.profile + tree + + + + + + + + + + + Consolidation: Profiles + ir.actions.act_window + company.consolidation.profile + tree,form + + + + company.consolidation.profile + res.company + + + + + + + + + + + + + + + +
diff --git a/account_consolidation_oca/views/consolidation_menu.xml b/account_consolidation_oca/views/consolidation_menu.xml new file mode 100644 index 00000000..2eb1d0c6 --- /dev/null +++ b/account_consolidation_oca/views/consolidation_menu.xml @@ -0,0 +1,27 @@ + + + + + + + + + + diff --git a/account_consolidation_oca/views/res_config_settings.xml b/account_consolidation_oca/views/res_config_settings.xml new file mode 100644 index 00000000..11619a1c --- /dev/null +++ b/account_consolidation_oca/views/res_config_settings.xml @@ -0,0 +1,139 @@ + + + + res.config.settings.view.form.inherit.account.consolidation + res.config.settings + + + +
+

Consolidation

+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + diff --git a/account_consolidation_oca/wizard/__init__.py b/account_consolidation_oca/wizard/__init__.py new file mode 100644 index 00000000..78a9515f --- /dev/null +++ b/account_consolidation_oca/wizard/__init__.py @@ -0,0 +1,3 @@ +from . import consolidation_base +from . import consolidation_check +from . import consolidation_consolidate diff --git a/account_consolidation_oca/wizard/consolidation_base.py b/account_consolidation_oca/wizard/consolidation_base.py new file mode 100644 index 00000000..01714265 --- /dev/null +++ b/account_consolidation_oca/wizard/consolidation_base.py @@ -0,0 +1,155 @@ +# Copyright 2011-2019 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import _, api, fields, models +from odoo.exceptions import UserError + + +class AccountConsolidationBase(models.AbstractModel): + _name = "account.consolidation.base" + _description = "Common consolidation wizard. Intended to be inherited" + + @api.model + def _default_company(self): + return self.env.company + + @api.model + def _get_consolidation_profiles(self): + return self._default_company().consolidation_profile_ids + + @api.model + def default_get(self, fields): + """Raise an error if user is not connected to consolidation company.""" + if not self.env.company.is_consolidation: + raise UserError( + _( + "Consolidation wizards can only be called from " + "a consolidation company." + ) + ) + return super().default_get(fields) + + company_id = fields.Many2one( + comodel_name="res.company", + default=lambda self: self._default_company(), + domain=[("is_consolidation", "=", True)], + string="Company", + required=True, + readonly=True, + ) + + def check_subsidiary_mapping(self, conso_holding_accounts, subsidiary): + """Check the mapping between accounts of subsidiary and the accounts + of holding. + + All the active accounts of the subsidiary must be linked to an active + account in the holding. + :param conso_holding_accounts: Recordset of the holding company + accounts + :param subsidiary: Recordset of the subsidiary company to check + + :return: Dictionnary of accounts not correctly mapped to an holding + company account + """ + subsidiary_accounts = self.env["account.account"].search( + [("company_id", "=", subsidiary.id)] + ) + + mapping_errors = {} + + for account in subsidiary_accounts: + account_errors = [] + if not account.consolidation_account_id: + account_errors.append( + _("No consolidation account defined for this account") + ) + mapping_errors.update({account: account_errors}) + continue + + conso_acc = account.consolidation_account_id + + if conso_acc not in conso_holding_accounts: + if conso_acc.company_id != self.company_id: + account_errors.append( + _( + "The consolidation account defined for this account " + "should be on company %s." + ) + % self.company_id.name + ) + + mapping_errors.update({account: account_errors}) + + return mapping_errors + + def check_account_mapping(self): + """Check subsidiaries mapping against hodling's.""" + self.ensure_one() + + invalid_items_per_company = {} + + conso_holding_accounts = self.env["account.account"].search( + [("company_id", "=", self.company_id.id)] + ) + + for subsidiary in self.company_id.consolidation_profile_ids.mapped( + "sub_company_id" + ): + + invalid_items = self.check_subsidiary_mapping( + conso_holding_accounts, subsidiary + ) + + if any(invalid_items): + invalid_items_per_company[subsidiary] = invalid_items + + return invalid_items_per_company + + def check_interco_partner(self): + """Check that subsidiaries' partners defined in profiles are not linked + to a company. + """ + self.ensure_one() + + invalid_partners = {} + + conso_profiles = self.company_id.consolidation_profile_ids + for subsidiary in conso_profiles.mapped("sub_company_id"): + partner = subsidiary.partner_id + if partner.company_id: + invalid_partners[partner] = partner.company_id + + return invalid_partners + + def check_companies_allowed(self): + """Check that the user has access to subsidiaries defined in profiles.""" + self.ensure_one() + + subsidiaries = self.company_id.consolidation_profile_ids.mapped( + "sub_company_id" + ) + + return subsidiaries - self.env.user.company_ids + + def run_consolidation(self): + """Consolidate. + + Proceed with all checks before launch any consolidation step. + This is a base method intended to be inherited with the next + consolidation steps. + """ + self.ensure_one() + + if ( + self.check_account_mapping() + or self.check_interco_partner() + or self.check_companies_allowed() + ): + raise UserError( + _( + "Invalid configuration, please launch the " + '"Consolidation: Checks" wizard' + ) + ) + + return {"type": "ir.actions.act_window_close"} diff --git a/account_consolidation_oca/wizard/consolidation_check.py b/account_consolidation_oca/wizard/consolidation_check.py new file mode 100644 index 00000000..16720e79 --- /dev/null +++ b/account_consolidation_oca/wizard/consolidation_check.py @@ -0,0 +1,98 @@ +# Copyright 2011-2019 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import _, fields, models + + +class AccountConsolidationCheck(models.TransientModel): + _name = "account.consolidation.check" + _inherit = "account.consolidation.base" + _description = "Consolidation Checks. Model used for views" + + message = fields.Html(readonly=True) + state = fields.Selection( + [("open", "Open"), ("error", "Error"), ("ok", "Checks ok")], default="open" + ) + + def check_account_mapping(self): + """Convert errors message to a HTML list of errors.""" + invalid_items_per_company = super().check_account_mapping() + + err_lines = [] + for company, account_errors in invalid_items_per_company.items(): + err_lines.append("
  • %s :
    • " % company.name) + for account, error in account_errors.items(): + err_lines.append( + "
    • %s (%s) : %s
    • " + % (account.code, account.name, ", ".join(error)) + ) + err_lines.append("
") + + return err_lines + + def check_interco_partner(self): + """Convert errors message to a HTML list of errors.""" + invalid_partners = super().check_interco_partner() + err_lines = [] + if invalid_partners: + err_lines.append("
    ") + for partner, company in invalid_partners.items(): + err_lines.append("
  • %s : %s
  • " % (partner.name, company.name)) + err_lines.append("
") + return err_lines + + def check_companies_allowed(self): + """Convert errors message to a HTML list of errors.""" + unallowed_companies = super().check_companies_allowed() + err_lines = [] + if unallowed_companies: + err_lines.append("
    ") + for comp in unallowed_companies: + err_lines.append( + "
  • %s : User has no access to this company.
  • " % (comp.name) + ) + err_lines.append("
") + return err_lines + + def check_configuration(self): + """Action launched with the button on the view. + + Calls the checks and display the result as HTML + """ + mapping_errors = self.check_account_mapping() + partner_errors = self.check_interco_partner() + company_allowed_errors = self.check_companies_allowed() + messages = [] + if mapping_errors: + messages.append( + _("

Invalid account mapping

") + "".join(mapping_errors) + ) + if partner_errors: + messages.append( + _("

Company defined on intercompany partners

") + + "".join(partner_errors) + ) + if company_allowed_errors: + messages.append( + _("

Company access not allowed

") + + "".join(company_allowed_errors) + ) + + if messages: + self.message = _("

Consolidation configuration errors

") + "".join( + messages + ) + self.state = "error" + else: + self.message = _( + "

No configuration error detected ! " + "You can now proceed with the consolidation.

" + ) + self.state = "ok" + return { + "type": "ir.actions.act_window", + "view_mode": "form", + "res_id": self.id, + "res_model": self._name, + "target": "new", + } diff --git a/account_consolidation_oca/wizard/consolidation_check_view.xml b/account_consolidation_oca/wizard/consolidation_check_view.xml new file mode 100644 index 00000000..72355061 --- /dev/null +++ b/account_consolidation_oca/wizard/consolidation_check_view.xml @@ -0,0 +1,78 @@ + + + + + account.consolidation.check.form + account.consolidation.check + +
+ +
+
+
+ + +
+
+
+ +
+
+ + + Consolidation: Checks + ir.actions.act_window + account.consolidation.check + form + new + + +
diff --git a/account_consolidation_oca/wizard/consolidation_consolidate.py b/account_consolidation_oca/wizard/consolidation_consolidate.py new file mode 100644 index 00000000..ce482f06 --- /dev/null +++ b/account_consolidation_oca/wizard/consolidation_consolidate.py @@ -0,0 +1,458 @@ +# Copyright 2011-2019 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +import logging +from calendar import monthrange + +from dateutil.relativedelta import relativedelta + +from odoo import _, api, fields, models +from odoo.exceptions import UserError, ValidationError + +_logger = logging.getLogger(__name__) + +MONTHS = [ + ("01", "January"), + ("02", "February"), + ("03", "March"), + ("04", "April"), + ("05", "May"), + ("06", "June"), + ("07", "July"), + ("08", "August"), + ("09", "September"), + ("10", "October"), + ("11", "November"), + ("12", "December"), +] + + +class AccountConsolidationConsolidate(models.TransientModel): + _name = "account.consolidation.consolidate" + _inherit = "account.consolidation.base" + _description = "Consolidation Consolidate" + + @api.model + def _default_journal(self): + return self._default_company().consolidation_default_journal_id + + @api.model + def _default_get_month(self): + today = fields.Date.from_string(fields.Date.context_today(self)) + return (today - relativedelta(month=1)).strftime("%m") + + @api.model + def _default_get_year(self): + today = fields.Date.from_string(fields.Date.context_today(self)) + if today.strftime("%m") != "01": + return today.strftime("%Y") + else: + return (today - relativedelta(year=1)).strftime("%Y") + + @api.model + def _get_month_last_date(self): + last_day = monthrange(int(self.year), int(self.month))[1] + return "%s-%s-%s" % (self.year, self.month, last_day) + + @api.model + def _get_month_first_date(self): + return "%s-%s-%s" % (self.year, self.month, "01") + + year = fields.Char( + size=4, required=True, default=lambda self: self._default_get_year() + ) + month = fields.Selection( + MONTHS, required=True, default=lambda self: self._default_get_month() + ) + journal_id = fields.Many2one( + comodel_name="account.journal", + string="Journal", + default=lambda self: self._default_journal(), + required=True, + ) + target_move = fields.Selection( + [("posted", "All Posted Entries"), ("all", "All Entries")], + string="Target Moves", + default="posted", + required=True, + ) + consolidation_profile_ids = fields.Many2many( + comodel_name="company.consolidation.profile", + relation="consolidate_profile_rel", + column1="consolidate_id", + column2="profile_id", + default=lambda self: self._get_consolidation_profiles(), + readonly=True, + ) + + def _get_intercompany_partners(self, subsidiary): + """ + Return partners linked to subsidiaries which are consolidated, without + the partner of the actual company being consolidated. + + :param subsidiary: Recordset of company to consolidate + :return: Recordset of partners + """ + subsidiaries = self.consolidation_profile_ids.mapped("sub_company_id") + partners = subsidiaries.mapped("partner_id") + return partners - subsidiary.partner_id + + def _prepare_rate_difference_line(self, move_lines_list): + """ + Prepares a move line to balance the move to be created, as the move + lines can be unbalanced if different currencies are used + + :param move_lines_list: List of move lines to generate + :return: Dictionnary to create exchange difference move line + """ + + if not move_lines_list: + return False + diff_account = self.company_id.consolidation_diff_account_id + if not diff_account: + raise UserError( + _( + "Please set the Consolidation difference " + "account for company %s in accounting settings." + ) + % self.company_id.name + ) + + debit = credit = 0.0 + + for line_vals in move_lines_list: + debit += line_vals.get("debit") + credit += line_vals.get("credit") + + balance = debit - credit + + # We do not want to create counter parts for amount smaller than + # "holding" company currency rounding policy. + # As generated lines are in draft state, accountant will be able to + # manage special cases + move_is_balanced = self.company_id.currency_id.is_zero(balance) + if move_is_balanced: + return False + else: + return { + "account_id": diff_account.id, + "debit": abs(balance) if balance < 0.0 else 0.0, + "credit": balance if balance > 0.0 else 0.0, + "name": _("Consolidation difference (%s %s)") + % (dict(MONTHS)[self.month], self.year), + } + + def reverse_moves(self, subsidiary): + """ + Reverse all consolidation account moves of a subsidiary which have + the "Auto posted" flag, and wasn't reversed before this date + + :param subsidiary: Recordset of the subsidiary + + :return: tuple with : Recordset of the reversed moves, + Recordset of the reversal moves + """ + move_obj = self.env["account.move"] + moves_to_reverse = move_obj.search( + [ + ("journal_id", "=", self.journal_id.id), + ("auto_post", "=", True), + ("consol_company_id", "=", subsidiary.id), + ("reversed_entry_id", "=", False), + ] + ) + if not moves_to_reverse: + return moves_to_reverse, False + + reversed_moves = self.env["account.move"] + for move in moves_to_reverse: + # Reverse the move + reversal_move = move._reverse_moves() + reversed_moves |= reversal_move + # Update the reversed_entry_id field on the original move + move.write({"reversed_entry_id": reversal_move.id}) + # Update the ref field on the reversed move + reversal_move.write({"ref": _("Reversal of %s") % move.name}) + # Adjust the date of the reversed move to the first day of the month + reversal_move.write({"date": self._get_month_first_date()}) + + return moves_to_reverse, reversed_moves + + def get_account_balance(self, account, partner=False): + """ + Gets the accounting balance for the specified account according to + Wizard settings. + + Flags every processed move line with consolidated=True, so these move + lines will not be processed two times in the same consolidation. + + :param account: Recordset of the account + :param partner: Recordset of partner to distinct + + :return: Balance of the account + """ + domain = [ + ("company_id", "=", account.company_id.id), + ("account_id", "=", account.id), + ("date", "<=", self._get_month_last_date()), + ("consolidated", "!=", True), + ] + + if partner: + domain.append(("partner_id", "=", partner.id)) + + move_lines = self.env["account.move.line"].sudo().search(domain) + + if self.target_move == "posted": + move_lines = move_lines.filtered( + lambda line: line.move_id.state == "posted" + ) + if move_lines: + _logger.debug("Move lines processed : %s " % move_lines.ids) + move_lines.write({"consolidated": True}) + + return sum([line.balance for line in move_lines]) + + def _prepare_consolidate_account(self, holding_account, profile, partner=False): + """ + Prepare a dictionnary for each move lines to generate. + + :param holding_account: Recordset of the account to consolidate + (on the holding), the method will + find the subsidiary's corresponding accounts + :param profile: Recordset of the subsidiary profile to consolidate + :param partner: Recordset of partner to distinct + + :return: Dictionnary to create move lines + """ + + _logger.debug( + "Consolidating subsidiary %s on holding account %s" + % (profile.sub_company_id.name, holding_account.name) + ) + + account_obj = self.env["account.account"] + + subs_accounts = account_obj.search( + [ + ("company_id", "=", profile.sub_company_id.id), + ("consolidation_account_id", "=", holding_account.id), + ] + ) + + if not subs_accounts: + # an account may exist on the holding and not be used as + # consolidation account in the subsidiaries, + # nothing to do + _logger.debug( + "No accounts found on %s mapped to holding account %s" + % (profile.sub_company_id.name, holding_account.name) + ) + return False + + vals = { + "name": _("Consolidation (%s %s)") % (dict(MONTHS)[self.month], self.year), + "account_id": holding_account.id, + } + sub_balance = 0 + for account in subs_accounts: + balance = self.get_account_balance(account, partner) + if not balance: + continue + else: + sub_balance += balance + + if not sub_balance: + _logger.debug( + "Accounts mapped to holding account %s were found " + "on %s but balance is null." + % (holding_account.name, profile.sub_company_id.name) + ) + return False + + if partner: + vals.update({"consol_partner_id": partner.id}) + + conso_percentage = profile.consolidation_percentage / 100 + conso_balance = sub_balance * conso_percentage + + holding_currency = holding_account.company_id.currency_id + subsidiary_currency = account.company_id.currency_id + + # If holding and subsidiary account are in the same currency + # We can use the subsidiary account balance without conversion + if holding_currency == subsidiary_currency: + vals.update( + { + "debit": conso_balance if conso_balance > 0.0 else 0.0, + "credit": abs(conso_balance) if conso_balance < 0.0 else 0.0, + } + ) + else: + # If holding and subsidiary account are in different currencies + # we use monthly rate for P&L accounts and spot rate for + # Balance sheet accounts + + if not holding_account.user_type_id.include_initial_balance: + subsidiary_currency = subsidiary_currency.with_context( + monthly_rate=True + ) + rate = subsidiary_currency.with_context( + date=self._get_month_last_date() + ).monthly_rate + rate_text = _("monthly rate : %s") % (subsidiary_currency.round(rate)) + else: + rate = subsidiary_currency.with_context( + date=self._get_month_last_date() + ).rate + rate_text = _("spot rate : %s") % (subsidiary_currency.round(rate)) + + currency_value = subsidiary_currency._convert( + conso_balance, + holding_currency, + self.env.user.company_id, + self._get_month_last_date(), + ) + + vals.update( + { + "currency_id": subsidiary_currency.id, + "amount_currency": conso_balance, + "debit": currency_value if currency_value > 0.0 else 0.0, + "credit": abs(currency_value) if currency_value < 0.0 else 0.0, + "name": "%s - %s" % (vals["name"], rate_text), + } + ) + return vals + + def consolidate_subsidiary(self, profile): + """ + Consolidate one subsidiary on the Holding according to its profile. + + Create a move per subsidiary and a move line per account. + If intercompany partners were used, extra move lines will be generated + per partner and account. + + :param profile: Recordset of the consolidation profile of the + subsidiary to consolidate on the holding + + :return: Recordset of the created move + """ + _logger.debug("Consolidating subsidiary %s." % profile.sub_company_id.name) + holding_accounts = self.env["account.account"].search( + [("company_id", "=", self.company_id.id)] + ) + + move_vals = { + "journal_id": self.journal_id.id, + "company_id": self.company_id.id, + "consol_company_id": profile.sub_company_id.id, + "ref": _("Consolidation"), + "date": self._get_month_last_date(), + } + + intercompany_partners = self._get_intercompany_partners(profile.sub_company_id) + + move_lines_to_generate = [] + _logger.debug( + "Consolidating intercompany transactions on %s" + % profile.sub_company_id.name + ) + for account in holding_accounts: + # prepare a move line per partner/account + for partner in intercompany_partners: + move_line_vals = self._prepare_consolidate_account( + account, profile, partner + ) + + if move_line_vals: + move_line_vals.update( + { + "journal_id": self.journal_id.id, + "company_id": self.company_id.id, + "date": self._get_month_last_date(), + } + ) + move_lines_to_generate.append(move_line_vals) + _logger.debug("Consolidating transactions on %s" % profile.sub_company_id.name) + for account in holding_accounts: + # prepare a move line per account + move_line_vals = self._prepare_consolidate_account(account, profile) + + if move_line_vals: + move_line_vals.update( + { + "journal_id": self.journal_id.id, + "company_id": self.company_id.id, + "date": self._get_month_last_date(), + } + ) + move_lines_to_generate.append(move_line_vals) + + # Now that all move lines are processed we reset the flag of processed + # accounts + self.env.cr.execute( + "UPDATE account_move_line SET consolidated = False " + "WHERE consolidated = True;" + ) + + if move_lines_to_generate: + + # reverse previous entries if it wasn't done before + self.reverse_moves(profile.sub_company_id) + + # prepare a rate difference move line + move_line_vals = self._prepare_rate_difference_line(move_lines_to_generate) + if move_line_vals: + move_line_vals.update( + { + "journal_id": self.journal_id.id, + "company_id": self.company_id.id, + "date": self._get_month_last_date(), + } + ) + move_lines_to_generate.append(move_line_vals) + + # Create the move with all the move lines + move_vals.update( + {"line_ids": [(0, False, vals) for vals in move_lines_to_generate]} + ) + return self.env["account.move"].create(move_vals) + else: + # Return an empty recordset if there is no move to generate + return self.env["account.move"] + + def run_consolidation(self): + """Consolidate. + + Consolidate selected subsidiaries according to consolidation profiles + onto the Holding accounts. + + :return: dict to open an Items view filtered on the created move lines + """ + super().run_consolidation() + + created_moves = self.env["account.move"] + + self.env.cr.execute( + "UPDATE account_move_line SET consolidated = False " + "WHERE consolidated = True;" + ) + + for profile in self.consolidation_profile_ids: + created_moves |= self.consolidate_subsidiary(profile) + + if created_moves: + created_moves.write( + { + "auto_post": True, + } + ) + return { + "name": _("Consolidation Items"), + "type": "ir.actions.act_window", + "view_mode": "tree,form", + "res_model": "account.move.line", + "domain": [("id", "in", created_moves.mapped("line_ids").ids)], + } + else: + raise ValidationError(_("Could not generate any consolidation entries.")) diff --git a/account_consolidation_oca/wizard/consolidation_consolidate_view.xml b/account_consolidation_oca/wizard/consolidation_consolidate_view.xml new file mode 100644 index 00000000..de42032c --- /dev/null +++ b/account_consolidation_oca/wizard/consolidation_consolidate_view.xml @@ -0,0 +1,48 @@ + + + + + account.consolidation.consolidate.form + account.consolidation.consolidate + +
+

+

Balance sheet accounts are consolidated using standard currency rates.

+

Profit and Loss accounts are consolidated using monthly currency rates.

+ + + + + + + + +
+
+
+
+
+ + + Consolidation: Consolidate + ir.actions.act_window + account.consolidation.consolidate + form + new + + +
diff --git a/setup/account_consolidation_oca/odoo/addons/account_consolidation_oca b/setup/account_consolidation_oca/odoo/addons/account_consolidation_oca new file mode 120000 index 00000000..031513c0 --- /dev/null +++ b/setup/account_consolidation_oca/odoo/addons/account_consolidation_oca @@ -0,0 +1 @@ +../../../../account_consolidation_oca \ No newline at end of file diff --git a/setup/account_consolidation_oca/setup.py b/setup/account_consolidation_oca/setup.py new file mode 100644 index 00000000..28c57bb6 --- /dev/null +++ b/setup/account_consolidation_oca/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +)