From a44bd0011f11c13be23286d0266d8a69749a23cc Mon Sep 17 00:00:00 2001 From: Iryna Vyshnevska Date: Thu, 18 Jul 2019 16:50:59 +0300 Subject: [PATCH 1/9] [12.0][ADD] create addon: account_reconcile_restrict_partner_mismatch --- .../README.rst | 0 .../__init__.py | 2 + .../__manifest__.py | 19 + .../models/__init__.py | 1 + .../models/account_move_line.py | 29 ++ .../readme/DESCRIPTION.rst | 10 + .../report/__init__.py | 1 + .../report/account_move_lines_report.xml | 61 +++ .../report/report_reconciled_lines.py | 65 +++ .../security/ir.model.access.csv | 2 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 419 ++++++++++++++++++ .../tests/__init__.py | 1 + .../tests/test_reconciliation.py | 104 +++++ 14 files changed, 714 insertions(+) create mode 100644 account_reconcile_restrict_partner_mismatch/README.rst create mode 100755 account_reconcile_restrict_partner_mismatch/__init__.py create mode 100644 account_reconcile_restrict_partner_mismatch/__manifest__.py create mode 100755 account_reconcile_restrict_partner_mismatch/models/__init__.py create mode 100644 account_reconcile_restrict_partner_mismatch/models/account_move_line.py create mode 100644 account_reconcile_restrict_partner_mismatch/readme/DESCRIPTION.rst create mode 100644 account_reconcile_restrict_partner_mismatch/report/__init__.py create mode 100644 account_reconcile_restrict_partner_mismatch/report/account_move_lines_report.xml create mode 100644 account_reconcile_restrict_partner_mismatch/report/report_reconciled_lines.py create mode 100644 account_reconcile_restrict_partner_mismatch/security/ir.model.access.csv create mode 100644 account_reconcile_restrict_partner_mismatch/static/description/icon.png create mode 100644 account_reconcile_restrict_partner_mismatch/static/description/index.html create mode 100644 account_reconcile_restrict_partner_mismatch/tests/__init__.py create mode 100644 account_reconcile_restrict_partner_mismatch/tests/test_reconciliation.py diff --git a/account_reconcile_restrict_partner_mismatch/README.rst b/account_reconcile_restrict_partner_mismatch/README.rst new file mode 100644 index 0000000000..e69de29bb2 diff --git a/account_reconcile_restrict_partner_mismatch/__init__.py b/account_reconcile_restrict_partner_mismatch/__init__.py new file mode 100755 index 0000000000..bf588bc8b8 --- /dev/null +++ b/account_reconcile_restrict_partner_mismatch/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import report diff --git a/account_reconcile_restrict_partner_mismatch/__manifest__.py b/account_reconcile_restrict_partner_mismatch/__manifest__.py new file mode 100644 index 0000000000..a9e05f0638 --- /dev/null +++ b/account_reconcile_restrict_partner_mismatch/__manifest__.py @@ -0,0 +1,19 @@ +# Copyright 2019 Camptocamp SA +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +{ + 'name': 'Reconcile restrict partner mismatch', + 'summary': 'Restrict reconciliation on receivable ' + 'and payable accounts to the same partner', + 'version': '12.0.1.0.0', + 'depends': ['account'], + 'author': 'Camptocamp, Odoo Community Association (OCA)', + 'website': 'http://www.github.com/OCA/account-reconcile', + 'category': 'Finance', + 'license': 'AGPL-3', + 'data': [ + 'report/account_move_lines_report.xml', + 'security/ir.model.access.csv', + ], + 'installable': True, +} diff --git a/account_reconcile_restrict_partner_mismatch/models/__init__.py b/account_reconcile_restrict_partner_mismatch/models/__init__.py new file mode 100755 index 0000000000..8795b3bea6 --- /dev/null +++ b/account_reconcile_restrict_partner_mismatch/models/__init__.py @@ -0,0 +1 @@ +from . import account_move_line diff --git a/account_reconcile_restrict_partner_mismatch/models/account_move_line.py b/account_reconcile_restrict_partner_mismatch/models/account_move_line.py new file mode 100644 index 0000000000..8ab5f13e85 --- /dev/null +++ b/account_reconcile_restrict_partner_mismatch/models/account_move_line.py @@ -0,0 +1,29 @@ +# Copyright 2019 Camptocamp SA +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from odoo import api, models, _ +from odoo.exceptions import UserError +from odoo.tools import config + + +class AccountMoveLine(models.Model): + _inherit = "account.move.line" + + @api.multi + def reconcile(self, writeoff_acc_id=False, writeoff_journal_id=False): + if (config['test_enable'] + and not self.env.context.get('test_partner_mismatch')): + return super().reconcile(writeoff_acc_id, writeoff_journal_id) + + # to be consistent with parent method + if not self: + return True + partners = set() + for line in self: + if line.account_id.internal_type in ('receivable', 'payable'): + partners.add(line.partner_id.id) + if len(partners) > 1: + raise UserError(_('The partner has to be the same on all' + ' lines for receivable and payable accounts!')) + return super().reconcile( + writeoff_acc_id, writeoff_journal_id) diff --git a/account_reconcile_restrict_partner_mismatch/readme/DESCRIPTION.rst b/account_reconcile_restrict_partner_mismatch/readme/DESCRIPTION.rst new file mode 100644 index 0000000000..a546b3fa4d --- /dev/null +++ b/account_reconcile_restrict_partner_mismatch/readme/DESCRIPTION.rst @@ -0,0 +1,10 @@ +This module restricts reconciliation between journal items when: + + - both items have different partners + - one item is with partner and the other without it + +This rule applies only for journal items using receivable and payable account type. + +As at the moment of installation some journal items could have been reconciled +using different partners, you can detect them in menu Accounting > Adviser > +Reconciled items with partner mismatch. diff --git a/account_reconcile_restrict_partner_mismatch/report/__init__.py b/account_reconcile_restrict_partner_mismatch/report/__init__.py new file mode 100644 index 0000000000..f32b29ee8d --- /dev/null +++ b/account_reconcile_restrict_partner_mismatch/report/__init__.py @@ -0,0 +1 @@ +from . import report_reconciled_lines diff --git a/account_reconcile_restrict_partner_mismatch/report/account_move_lines_report.xml b/account_reconcile_restrict_partner_mismatch/report/account_move_lines_report.xml new file mode 100644 index 0000000000..14b7276f1b --- /dev/null +++ b/account_reconcile_restrict_partner_mismatch/report/account_move_lines_report.xml @@ -0,0 +1,61 @@ + + + + Reconciled items with partner mismatch + account.reconcile.partner.mismatch.report + + + + + + + + + + + + + + + + + + + account.reconcile.partner.mismatch.report.form + account.reconcile.partner.mismatch.report + +
+ + + + + + + + + + + + + + + + + + +
+
+
+ + + Reconciled items with partner mismatch + account.reconcile.partner.mismatch.report + tree,form + + + +
diff --git a/account_reconcile_restrict_partner_mismatch/report/report_reconciled_lines.py b/account_reconcile_restrict_partner_mismatch/report/report_reconciled_lines.py new file mode 100644 index 0000000000..ac2cfc576c --- /dev/null +++ b/account_reconcile_restrict_partner_mismatch/report/report_reconciled_lines.py @@ -0,0 +1,65 @@ +# Copyright 2019 Camptocamp SA +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + + +from odoo import api, fields, models, tools + + +class AccountReconcilePartnerMismatchReport(models.Model): + _name = 'account.reconcile.partner.mismatch.report' + _auto = False + + partial_reconcile_id = fields.Many2one( + 'account.partial.reconcile', + string="Partial Reconcile" + ) + full_reconcile_id = fields.Many2one('account.full.reconcile') + account_id = fields.Many2one( + 'account.account', + string="Account" + ) + account_type_id = fields.Many2one( + 'account.account.type', + string="Account type", + ) + debit_move_id = fields.Many2one('account.move.line', string="Debit move") + debit_amount = fields.Float("Debit amount") + debit_partner_id = fields.Many2one('res.partner', string="Debit partner") + credit_move_id = fields.Many2one('account.move.line', string="Credit move") + credit_amount = fields.Float("Credit amount") + credit_partner_id = fields.Many2one('res.partner', string="Credit partner") + + @api.model_cr + def init(self): + """Select lines which violate defined rules""" + tools.drop_view_if_exists(self.env.cr, self._table) + self._cr.execute( + """CREATE OR REPLACE VIEW %s AS ( + SELECT pr.id id + , pr.id partial_reconcile_id + , pr.full_reconcile_id + , pr.debit_move_id + , daml.debit debit_amount + , aat.id account_type_id + , daml.partner_id debit_partner_id + , daml.account_id account_id + , pr.credit_move_id + , caml.credit credit_amount + , caml.partner_id credit_partner_id + FROM account_partial_reconcile pr + LEFT JOIN account_move_line daml + ON daml.id = pr.debit_move_id + LEFT JOIN account_move_line caml + ON caml.id = pr.credit_move_id + LEFT JOIN account_account_type aat + ON daml.user_type_id = aat.id + WHERE aat.type in ('receivable', 'payable') + AND (daml.partner_id <> caml.partner_id + OR (daml.partner_id IS NULL + AND caml.partner_id IS NOT NULL) + OR (caml.partner_id IS NULL + AND daml.partner_id IS NOT NULL)) + ) + """ + % self._table + ) diff --git a/account_reconcile_restrict_partner_mismatch/security/ir.model.access.csv b/account_reconcile_restrict_partner_mismatch/security/ir.model.access.csv new file mode 100644 index 0000000000..8dea174ac2 --- /dev/null +++ b/account_reconcile_restrict_partner_mismatch/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_account_reconcile_partner_mismatch_report,access_account_reconcile_partner_mismatch_report,model_account_reconcile_partner_mismatch_report,account.group_account_user,1,0,0,0 diff --git a/account_reconcile_restrict_partner_mismatch/static/description/icon.png b/account_reconcile_restrict_partner_mismatch/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/account_reconcile_restrict_partner_mismatch/static/description/index.html b/account_reconcile_restrict_partner_mismatch/static/description/index.html new file mode 100644 index 0000000000..876a1f6cb3 --- /dev/null +++ b/account_reconcile_restrict_partner_mismatch/static/description/index.html @@ -0,0 +1,419 @@ + + + + + + +Account Set Reconcilable + + + +
+

Account Set Reconcilable

+ + +

Beta License: AGPL-3 OCA/account-reconcile Translate me on Weblate Try me on Runbot

+

Allows to set as reconcilable a non reconcilable account that already have journal items.

+

Table of contents

+ +
+

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 smashing it by providing a detailed and welcomed +feedback.

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Eficent
  • +
+
+
+

Contributors

+ +
+
+

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

+

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

+
+
+
+ + diff --git a/account_reconcile_restrict_partner_mismatch/tests/__init__.py b/account_reconcile_restrict_partner_mismatch/tests/__init__.py new file mode 100644 index 0000000000..5eaab0190a --- /dev/null +++ b/account_reconcile_restrict_partner_mismatch/tests/__init__.py @@ -0,0 +1 @@ +from . import test_reconciliation diff --git a/account_reconcile_restrict_partner_mismatch/tests/test_reconciliation.py b/account_reconcile_restrict_partner_mismatch/tests/test_reconciliation.py new file mode 100644 index 0000000000..a21c6af9e5 --- /dev/null +++ b/account_reconcile_restrict_partner_mismatch/tests/test_reconciliation.py @@ -0,0 +1,104 @@ +# Copyright 2019 Camptocamp SA +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from odoo.addons.account.tests.account_test_classes import AccountingTestCase +from odoo.exceptions import UserError + + +class TestReconciliation(AccountingTestCase): + + def setUp(self): + super().setUp() + self.env = self.env(context=dict( + self.env.context, tracking_disable=True, + test_partner_mismatch=True) + ) + + self.partner = self.env.ref("base.res_partner_2") + self.partner_id = self.partner.id + rec_type = self.env['account.account'].search([ + ('user_type_id', '=', + self.env.ref('account.data_account_type_receivable').id) + ], limit=1) + pay_type = self.env['account.account'].search([ + ('user_type_id', '=', + self.env.ref('account.data_account_type_payable').id) + ], limit=1) + self.account_rcv = (self.partner.property_account_receivable_id + or rec_type) + self.account_rsa = self.partner.property_account_payable_id or pay_type + + self.bank_journal = self.env['account.journal']. \ + create({'name': 'Bank', 'type': 'bank', 'code': 'BNK67'}) + self.aml = self.init_moves() + self.wizard = self.env['account.move.line.reconcile.writeoff']. \ + with_context(active_ids=[x.id for x in self.aml]).create({ + 'journal_id': self.bank_journal.id, + 'writeoff_acc_id': self.account_rsa.id + }) + + def create_move(self, name, amount): + debit_line_vals = { + 'name': name, + 'debit': amount > 0 and amount or 0.0, + 'credit': amount < 0 and -amount or 0.0, + 'account_id': self.account_rcv.id, + } + credit_line_vals = debit_line_vals.copy() + credit_line_vals['debit'] = debit_line_vals['credit'] + credit_line_vals['credit'] = debit_line_vals['debit'] + credit_line_vals['account_id'] = self.account_rsa.id + vals = { + 'journal_id': self.bank_journal.id, + 'line_ids': [(0, 0, debit_line_vals), (0, 0, credit_line_vals)] + } + return self.env['account.move'].create(vals).id + + def init_moves(self): + move_list_vals = [ + ('1', -1.83), + ('2', 728.35), + ('3', -4.46), + ('4', 0.32), + ('5', 14.72), + ('6', -737.10), + ] + move_ids = [] + for name, amount in move_list_vals: + move_ids.append(self.create_move(name, amount)) + aml_recs = self.env['account.move.line'].search([ + ('move_id', 'in', move_ids), + ('account_id', '=', self.account_rcv.id) + ]) + return aml_recs + + def test_reconcile_no_partner(self): + self.wizard.trans_rec_reconcile() + self.assertTrue(all(self.aml.mapped('reconciled'))) + + def test_reconcile_partner_mismatch(self): + self.aml[0].partner_id = self.partner.id + with self.assertRaises(UserError): + self.wizard.trans_rec_reconcile() + # all lines with same partner allowed + self.aml.write({'partner_id': self.partner.id}) + self.wizard.trans_rec_reconcile() + self.assertTrue(all(self.aml.mapped('reconciled'))) + + def test_reconcile_accounts_excluded(self): + self.aml[0].partner_id = self.partner.id + with self.assertRaises(UserError): + self.wizard.trans_rec_reconcile() + # reconciliation forbiden only for certain types of accounts + account = self.env['account.account'].search([ + ('user_type_id.type', '=', 'other') + ], limit=1) + account.reconcile = True + self.aml[0].account_id = account.id + with self.assertRaises(UserError): + self.wizard.trans_rec_reconcile() + # reconciliation for different partners allowed + # for not forbidden types + self.aml.write({'account_id': account.id}) + self.wizard.trans_rec_reconcile() + self.assertTrue(all(self.aml.mapped('reconciled'))) From 1eed8a7d75f9c0c949cddab166b77803b5ae4218 Mon Sep 17 00:00:00 2001 From: Iryna Vyshnevska Date: Thu, 18 Jul 2019 18:10:43 +0300 Subject: [PATCH 2/9] [MIG][12.0] adapt tests to v12 --- .../tests/test_reconciliation.py | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/account_reconcile_restrict_partner_mismatch/tests/test_reconciliation.py b/account_reconcile_restrict_partner_mismatch/tests/test_reconciliation.py index a21c6af9e5..13be44556d 100644 --- a/account_reconcile_restrict_partner_mismatch/tests/test_reconciliation.py +++ b/account_reconcile_restrict_partner_mismatch/tests/test_reconciliation.py @@ -31,11 +31,6 @@ def setUp(self): self.bank_journal = self.env['account.journal']. \ create({'name': 'Bank', 'type': 'bank', 'code': 'BNK67'}) self.aml = self.init_moves() - self.wizard = self.env['account.move.line.reconcile.writeoff']. \ - with_context(active_ids=[x.id for x in self.aml]).create({ - 'journal_id': self.bank_journal.id, - 'writeoff_acc_id': self.account_rsa.id - }) def create_move(self, name, amount): debit_line_vals = { @@ -73,22 +68,22 @@ def init_moves(self): return aml_recs def test_reconcile_no_partner(self): - self.wizard.trans_rec_reconcile() + self.aml.reconcile() self.assertTrue(all(self.aml.mapped('reconciled'))) def test_reconcile_partner_mismatch(self): self.aml[0].partner_id = self.partner.id with self.assertRaises(UserError): - self.wizard.trans_rec_reconcile() + self.aml.reconcile() # all lines with same partner allowed self.aml.write({'partner_id': self.partner.id}) - self.wizard.trans_rec_reconcile() + self.aml.reconcile() self.assertTrue(all(self.aml.mapped('reconciled'))) def test_reconcile_accounts_excluded(self): self.aml[0].partner_id = self.partner.id with self.assertRaises(UserError): - self.wizard.trans_rec_reconcile() + self.aml.reconcile() # reconciliation forbiden only for certain types of accounts account = self.env['account.account'].search([ ('user_type_id.type', '=', 'other') @@ -96,9 +91,9 @@ def test_reconcile_accounts_excluded(self): account.reconcile = True self.aml[0].account_id = account.id with self.assertRaises(UserError): - self.wizard.trans_rec_reconcile() + self.aml.reconcile() # reconciliation for different partners allowed # for not forbidden types self.aml.write({'account_id': account.id}) - self.wizard.trans_rec_reconcile() + self.aml.reconcile() self.assertTrue(all(self.aml.mapped('reconciled'))) From d3b59cc5225a676e52e3d098ab571add779eca3d Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 24 Jul 2019 08:54:16 +0000 Subject: [PATCH 3/9] [UPD] README.rst --- .../README.rst | 77 +++++++++++++++++++ .../static/description/index.html | 37 +++++---- 2 files changed, 97 insertions(+), 17 deletions(-) diff --git a/account_reconcile_restrict_partner_mismatch/README.rst b/account_reconcile_restrict_partner_mismatch/README.rst index e69de29bb2..8abb6497fc 100644 --- a/account_reconcile_restrict_partner_mismatch/README.rst +++ b/account_reconcile_restrict_partner_mismatch/README.rst @@ -0,0 +1,77 @@ +=================================== +Reconcile restrict partner mismatch +=================================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Faccount--reconcile-lightgray.png?logo=github + :target: https://github.com/OCA/account-reconcile/tree/12.0/account_reconcile_restrict_partner_mismatch + :alt: OCA/account-reconcile +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/account-reconcile-12-0/account-reconcile-12-0-account_reconcile_restrict_partner_mismatch + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/98/12.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module restricts reconciliation between journal items when: + + - both items have different partners + - one item is with partner and the other without it + +This rule applies only for journal items using receivable and payable account type. + +As at the moment of installation some journal items could have been reconciled +using different partners, you can detect them in menu Accounting > Adviser > +Reconciled items with partner mismatch. + +**Table of contents** + +.. contents:: + :local: + +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 smashing 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-reconcile `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/account_reconcile_restrict_partner_mismatch/static/description/index.html b/account_reconcile_restrict_partner_mismatch/static/description/index.html index 876a1f6cb3..40a64c10d2 100644 --- a/account_reconcile_restrict_partner_mismatch/static/description/index.html +++ b/account_reconcile_restrict_partner_mismatch/static/description/index.html @@ -4,7 +4,7 @@ -Account Set Reconcilable +Reconcile restrict partner mismatch -
-

Account Set Reconcilable

+
+

Reconcile restrict partner mismatch

-

Beta License: AGPL-3 OCA/account-reconcile Translate me on Weblate Try me on Runbot

-

Allows to set as reconcilable a non reconcilable account that already have journal items.

+

Beta License: AGPL-3 OCA/account-reconcile Translate me on Weblate Try me on Runbot

+

This module restricts reconciliation between journal items when:

+
+
    +
  • both items have different partners
  • +
  • one item is with partner and the other without it
  • +
+
+

This rule applies only for journal items using receivable and payable account type.

+

As at the moment of installation some journal items could have been reconciled +using different partners, you can detect them in menu Accounting > Adviser > +Reconciled items with partner mismatch.

Table of contents

@@ -386,7 +395,7 @@

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 smashing it by providing a detailed and welcomed -feedback.

+feedback.

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

@@ -394,23 +403,17 @@

Credits

Authors

    -
  • Eficent
  • -
-
-
-

Contributors

-
-

Maintainers

+

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

+

This module is part of the OCA/account-reconcile project on GitHub.

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

From 4ccaaad925b6abc1a4cb64625035dcc94e45a94c Mon Sep 17 00:00:00 2001 From: oca-travis Date: Wed, 24 Jul 2019 09:01:40 +0000 Subject: [PATCH 4/9] [UPD] Update account_reconcile_restrict_partner_mismatch.pot --- ...nt_reconcile_restrict_partner_mismatch.pot | 104 ++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 account_reconcile_restrict_partner_mismatch/i18n/account_reconcile_restrict_partner_mismatch.pot diff --git a/account_reconcile_restrict_partner_mismatch/i18n/account_reconcile_restrict_partner_mismatch.pot b/account_reconcile_restrict_partner_mismatch/i18n/account_reconcile_restrict_partner_mismatch.pot new file mode 100644 index 0000000000..9a97f57378 --- /dev/null +++ b/account_reconcile_restrict_partner_mismatch/i18n/account_reconcile_restrict_partner_mismatch.pot @@ -0,0 +1,104 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_reconcile_restrict_partner_mismatch +# +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_reconcile_restrict_partner_mismatch +#: model:ir.model.fields,field_description:account_reconcile_restrict_partner_mismatch.field_account_reconcile_partner_mismatch_report__account_id +msgid "Account" +msgstr "" + +#. module: account_reconcile_restrict_partner_mismatch +#: model:ir.model.fields,field_description:account_reconcile_restrict_partner_mismatch.field_account_reconcile_partner_mismatch_report__account_type_id +msgid "Account type" +msgstr "" + +#. module: account_reconcile_restrict_partner_mismatch +#: model:ir.model.fields,field_description:account_reconcile_restrict_partner_mismatch.field_account_reconcile_partner_mismatch_report__credit_amount +msgid "Credit amount" +msgstr "" + +#. module: account_reconcile_restrict_partner_mismatch +#: model:ir.model.fields,field_description:account_reconcile_restrict_partner_mismatch.field_account_reconcile_partner_mismatch_report__credit_move_id +msgid "Credit move" +msgstr "" + +#. module: account_reconcile_restrict_partner_mismatch +#: model:ir.model.fields,field_description:account_reconcile_restrict_partner_mismatch.field_account_reconcile_partner_mismatch_report__credit_partner_id +msgid "Credit partner" +msgstr "" + +#. module: account_reconcile_restrict_partner_mismatch +#: model:ir.model.fields,field_description:account_reconcile_restrict_partner_mismatch.field_account_reconcile_partner_mismatch_report__debit_amount +msgid "Debit amount" +msgstr "" + +#. module: account_reconcile_restrict_partner_mismatch +#: model:ir.model.fields,field_description:account_reconcile_restrict_partner_mismatch.field_account_reconcile_partner_mismatch_report__debit_move_id +msgid "Debit move" +msgstr "" + +#. module: account_reconcile_restrict_partner_mismatch +#: model:ir.model.fields,field_description:account_reconcile_restrict_partner_mismatch.field_account_reconcile_partner_mismatch_report__debit_partner_id +msgid "Debit partner" +msgstr "" + +#. module: account_reconcile_restrict_partner_mismatch +#: model:ir.model.fields,field_description:account_reconcile_restrict_partner_mismatch.field_account_reconcile_partner_mismatch_report__display_name +msgid "Display Name" +msgstr "" + +#. module: account_reconcile_restrict_partner_mismatch +#: model:ir.model.fields,field_description:account_reconcile_restrict_partner_mismatch.field_account_reconcile_partner_mismatch_report__full_reconcile_id +msgid "Full Reconcile" +msgstr "" + +#. module: account_reconcile_restrict_partner_mismatch +#: model:ir.model.fields,field_description:account_reconcile_restrict_partner_mismatch.field_account_reconcile_partner_mismatch_report__id +msgid "ID" +msgstr "" + +#. module: account_reconcile_restrict_partner_mismatch +#: model:ir.model,name:account_reconcile_restrict_partner_mismatch.model_account_move_line +msgid "Journal Item" +msgstr "" + +#. module: account_reconcile_restrict_partner_mismatch +#: model:ir.model.fields,field_description:account_reconcile_restrict_partner_mismatch.field_account_reconcile_partner_mismatch_report____last_update +msgid "Last Modified on" +msgstr "" + +#. module: account_reconcile_restrict_partner_mismatch +#: model:ir.model.fields,field_description:account_reconcile_restrict_partner_mismatch.field_account_reconcile_partner_mismatch_report__partial_reconcile_id +msgid "Partial Reconcile" +msgstr "" + +#. module: account_reconcile_restrict_partner_mismatch +#: model:ir.actions.act_window,name:account_reconcile_restrict_partner_mismatch.action_account_reconcile_partner_mismatch_report +#: model:ir.ui.menu,name:account_reconcile_restrict_partner_mismatch.menu_account_reconcile_partner_mismatch_report +#: model_terms:ir.ui.view,arch_db:account_reconcile_restrict_partner_mismatch.account_reconcile_partner_mismatch_report_view_form +#: model_terms:ir.ui.view,arch_db:account_reconcile_restrict_partner_mismatch.view_account_move_reconciled_report_tree +msgid "Reconciled items with partner mismatch" +msgstr "" + +#. module: account_reconcile_restrict_partner_mismatch +#: code:addons/account_reconcile_restrict_partner_mismatch/models/account_move_line.py:26 +#, python-format +msgid "The partner has to be the same on all lines for receivable and payable accounts!" +msgstr "" + +#. module: account_reconcile_restrict_partner_mismatch +#: model:ir.model,name:account_reconcile_restrict_partner_mismatch.model_account_reconcile_partner_mismatch_report +msgid "account.reconcile.partner.mismatch.report" +msgstr "" + From d7e6dddef667d94c3ff47b3336e3e15790d43eca Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Mon, 29 Jul 2019 02:39:37 +0000 Subject: [PATCH 5/9] [UPD] README.rst --- .../static/description/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/account_reconcile_restrict_partner_mismatch/static/description/index.html b/account_reconcile_restrict_partner_mismatch/static/description/index.html index 40a64c10d2..aa278bcf27 100644 --- a/account_reconcile_restrict_partner_mismatch/static/description/index.html +++ b/account_reconcile_restrict_partner_mismatch/static/description/index.html @@ -3,7 +3,7 @@ - + Reconcile restrict partner mismatch