From 93de437e06b0f379c9ca8b4ff83424479568a459 Mon Sep 17 00:00:00 2001 From: Stefan Rijnhart Date: Sun, 17 Nov 2013 20:45:48 +0100 Subject: [PATCH 1/4] [RFR] Refactor out the code that retrieves default debit or credit account of the partner [RFR] Remove suspicious references to the company partner debit and credit accounts [ADD] Module that allows for alternative partner journal accounts to be used as defaults in imported bank statements --- account_banking/__init__.py | 1 + account_banking/banking_import_transaction.py | 32 ++++----- account_banking/res_partner.py | 72 +++++++++++++++++++ .../wizard/banking_transaction_wizard.py | 38 +++++----- .../__init__.py | 1 + .../__openerp__.py | 44 ++++++++++++ ...ccount_banking_partner_journal_account.pot | 35 +++++++++ .../i18n/nl.po | 42 +++++++++++ .../res_partner.py | 64 +++++++++++++++++ .../res_partner_view.xml | 21 ++++++ 10 files changed, 311 insertions(+), 39 deletions(-) create mode 100644 account_banking/res_partner.py create mode 100644 account_banking_partner_journal_account/__init__.py create mode 100644 account_banking_partner_journal_account/__openerp__.py create mode 100644 account_banking_partner_journal_account/i18n/account_banking_partner_journal_account.pot create mode 100644 account_banking_partner_journal_account/i18n/nl.po create mode 100644 account_banking_partner_journal_account/res_partner.py create mode 100644 account_banking_partner_journal_account/res_partner_view.xml diff --git a/account_banking/__init__.py b/account_banking/__init__.py index b4ebb7caf..adb630837 100644 --- a/account_banking/__init__.py +++ b/account_banking/__init__.py @@ -30,5 +30,6 @@ import banking_import_transaction import account_banking import parsers import wizard +import res_partner # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/account_banking/banking_import_transaction.py b/account_banking/banking_import_transaction.py index 95886a4fa..9853c00bd 100644 --- a/account_banking/banking_import_transaction.py +++ b/account_banking/banking_import_transaction.py @@ -875,9 +875,6 @@ class banking_import_transaction(orm.Model): # when retrieving move_line_ids below. company = company_obj.browse( cr, uid, transaction.company_id.id, context) - # Get default defaults - def_pay_account_id = company.partner_id.property_account_payable.id - def_rec_account_id = company.partner_id.property_account_receivable.id # Get interesting journals once # Added type 'general' to capture fund transfers @@ -1112,24 +1109,21 @@ class banking_import_transaction(orm.Model): account_id = move_info and move_info.get('account_id', False) if not account_id: # Use the default settings, but allow individual partner - # settings to overrule this. Note that you need to change - # the internal type of these accounts to either 'payable' - # or 'receivable' to enable usage like this. + # settings to overrule this. + bank_partner = ( + partner_banks[0].partner_id if len(partner_banks) == 1 + else False) if transaction.statement_line_id.amount < 0: - account_type = 'payable' - else: - account_type = 'receivable' - if len(partner_banks) == 1: - partner = partner_banks[0].partner_id - if partner.supplier and not partner.customer: - account_type = 'payable' - elif partner.customer and not partner.supplier: - account_type = 'receivable' - if partner['property_account_' + account_type]: - account_id = partner['property_account_' + account_type].id - if not account_id or account_id in (def_pay_account_id, def_rec_account_id): - if account_type == 'payable': + if bank_partner: + account_id = bank_partner.\ + def_journal_account_bank_decr()[bank_partner.id] + else: account_id = account_info.default_credit_account_id.id + else: + + if bank_partner: + account_id = bank_partner.\ + def_journal_account_bank_incr()[bank_partner.id] else: account_id = account_info.default_debit_account_id.id diff --git a/account_banking/res_partner.py b/account_banking/res_partner.py new file mode 100644 index 000000000..4166b89d5 --- /dev/null +++ b/account_banking/res_partner.py @@ -0,0 +1,72 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# Copyright (C) 2013 Therp BV (). +# +# All Rights Reserved +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################################## + +from openerp.osv import orm + + +class ResPartner(orm.Model): + _inherit = 'res.partner' + + def def_journal_account_bank( + self, cr, uid, ids, get_property_account, context=None): + """ + Returns the property journal account for the given partners ids. + + :param get_property_account: method of this object that takes + a partner browse record and returns a field name of type many2one. + """ + if not ids: + return {} + res = dict([(res_id, False) for res_id in ids]) + for partner in self.browse(cr, uid, ids, context=context): + property_account = get_property_account(partner) + if partner[property_account]: + res[partner.id] = partner[property_account].id + return res + + def get_property_account_decrease(self, partner): + if partner.customer and not partner.supplier: + return 'property_account_receivable' + return 'property_account_payable' + + def get_property_account_increase(self, partner): + if partner.supplier and not partner.customer: + return 'property_account_payable' + return 'property_account_receivable' + + def def_journal_account_bank_decr( + self, cr, uid, ids, context=None): + """ + Return the default journal account to be used for this partner + in the case of bank transactions that decrease the balance. + """ + return self.def_journal_account_bank( + cr, uid, ids, self.get_property_account_decrease, context=context) + + def def_journal_account_bank_incr( + self, cr, uid, ids, context=None): + """ + Return the default journal account to be used for this partner + in the case of bank transactions that increase the balance. + """ + return self.def_journal_account_bank( + cr, uid, ids, self.get_property_account_increase, context=context) diff --git a/account_banking/wizard/banking_transaction_wizard.py b/account_banking/wizard/banking_transaction_wizard.py index 28c433956..63fd7ed07 100644 --- a/account_banking/wizard/banking_transaction_wizard.py +++ b/account_banking/wizard/banking_transaction_wizard.py @@ -271,27 +271,25 @@ class banking_transaction_wizard(orm.TransientModel): else: account_type = 'receivable' + bank_partner = False if partner_id: - partner = wiz.statement_line_id.partner_bank_id.partner_id - if partner.supplier and not partner.customer: - account_type = 'payable' - elif partner.customer and not partner.supplier: - account_type = 'receivable' - if partner['property_account_' + account_type]: - account_id = partner['property_account_' + account_type].id - - company_partner = wiz.statement_line_id.statement_id.company_id.partner_id - if len(setting_ids) and ( - not account_id - or account_id in ( - company_partner.property_account_payable.id, - company_partner.property_account_receivable.id) - ): - setting = settings_pool.browse(cr, uid, setting_ids[0], context=context) - if account_type == 'payable': - account_id = setting.default_credit_account_id.id - else: - account_id = setting.default_debit_account_id.id + bank_partner = wiz.statement_line_id.partner_bank_id.partner_id + if wiz.amount < 0: + if bank_partner: + account_id = bank_partner.\ + def_journal_account_bank_decr()[bank_partner.id] + elif setting_ids: + account_id = settings_pool.browse( + cr, uid, setting_ids[0], + context=context).default_credit_account_id.id + else: + if bank_partner: + account_id = bank_partner.\ + def_journal_account_bank_incr()[bank_partner.id] + elif setting_ids: + account_id = settings_pool.browse( + cr, uid, setting_ids[0], + context=context).default_debit_account_id.id if account_id: wiz.statement_line_id.write({'account_id': account_id}) diff --git a/account_banking_partner_journal_account/__init__.py b/account_banking_partner_journal_account/__init__.py new file mode 100644 index 000000000..91fed54d4 --- /dev/null +++ b/account_banking_partner_journal_account/__init__.py @@ -0,0 +1 @@ +from . import res_partner diff --git a/account_banking_partner_journal_account/__openerp__.py b/account_banking_partner_journal_account/__openerp__.py new file mode 100644 index 000000000..7a042283e --- /dev/null +++ b/account_banking_partner_journal_account/__openerp__.py @@ -0,0 +1,44 @@ +############################################################################## +# +# Copyright (C) 2013 Therp BV () +# All Rights Reserved +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +{ + 'name': 'Banking Addons - Default partner journal accounts for bank transactions', + 'version': '0.1', + 'license': 'AGPL-3', + 'author': 'Therp BV', + 'website': 'https://launchpad.net/banking-addons', + 'category': 'Banking addons', + 'depends': ['account_banking'], + 'description': ''' +This module allows to set alternative journal accounts on partners to use +as default accounts in imported bank statements. + +This is useful when regular transactions on clearing accounts occur. Such +clearing accounts cannot usually be selected as default partner accounts +because they are neither of type 'payable' nor 'receivable' (or at least +never at the same time!). For the alternative journal accounts for bank +transactions, any reconcilable account can be selected. + +When a transaction matches a specific move in the system, the account +from the move line takes still precedence so as not to impede +reconciliation. + ''', + 'data': ['res_partner_view.xml'], + 'installable': True, +} diff --git a/account_banking_partner_journal_account/i18n/account_banking_partner_journal_account.pot b/account_banking_partner_journal_account/i18n/account_banking_partner_journal_account.pot new file mode 100644 index 000000000..9ba2a975b --- /dev/null +++ b/account_banking_partner_journal_account/i18n/account_banking_partner_journal_account.pot @@ -0,0 +1,35 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * account_banking_partner_journal_account +# +msgid "" +msgstr "" + +#. module: account_banking_partner_journal_account +#: model:ir.model,name:account_banking_partner_journal_account.model_res_partner +msgid "Partner" +msgstr "" + +#. module: account_banking_partner_journal_account +#: help:res.partner,account_receivable_bank_id:0 +msgid "" +"Optional default journal account on bank statements for debits from this " +"partner. Overrides the default debit account." +msgstr "" + +#. module: account_banking_partner_journal_account +#: field:res.partner,account_payable_bank_id:0 +msgid "Default bank credit account" +msgstr "" + +#. module: account_banking_partner_journal_account +#: help:res.partner,account_payable_bank_id:0 +msgid "" +"Optional default journal account on bank statements for credits from this " +"partner. Overrides the default credit account." +msgstr "" + +#. module: account_banking_partner_journal_account +#: field:res.partner,account_receivable_bank_id:0 +msgid "Default bank debit account" +msgstr "" diff --git a/account_banking_partner_journal_account/i18n/nl.po b/account_banking_partner_journal_account/i18n/nl.po new file mode 100644 index 000000000..d70456d9a --- /dev/null +++ b/account_banking_partner_journal_account/i18n/nl.po @@ -0,0 +1,42 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * account_banking_partner_journal_account +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 6.1\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-11-16 10:29+0000\n" +"PO-Revision-Date: 2013-11-16 10:29+0000\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_banking_partner_journal_account +#: model:ir.model,name:account_banking_partner_journal_account.model_res_partner +msgid "Partner" +msgstr "Relatie" + +#. module: account_banking_partner_journal_account +#: help:res.partner,account_receivable_bank_id:0 +msgid "Optional default journal account on bank statements for debits from this partner. Overrides the default debit account." +msgstr "Optionele standaard grootboekrekening voor geïmporteerde bankbijschrijvingen, in plaats van de standaard debiteurenrekening." + +#. module: account_banking_partner_journal_account +#: field:res.partner,account_payable_bank_id:0 +msgid "Default bank credit account" +msgstr "Standaardrekening afschrijvingen" + +#. module: account_banking_partner_journal_account +#: help:res.partner,account_payable_bank_id:0 +msgid "Optional default journal account on bank statements for credits from this partner. Overrides the default credit account." +msgstr "Optionele standaard grootboekrekening voor geïmporteerde bankafschrijvingen, in plaats van de standaard crediteurenrekening." + +#. module: account_banking_partner_journal_account +#: field:res.partner,account_receivable_bank_id:0 +msgid "Default bank debit account" +msgstr "Standaardrekening bankbijschrijvingen" + diff --git a/account_banking_partner_journal_account/res_partner.py b/account_banking_partner_journal_account/res_partner.py new file mode 100644 index 000000000..9ac52c930 --- /dev/null +++ b/account_banking_partner_journal_account/res_partner.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Copyright (C) 2013 Therp BV (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from openerp.osv import orm, fields + + +class ResPartner(orm.Model): + _inherit = 'res.partner' + + _columns = { + 'account_payable_bank_id': fields.many2one( + 'account.account', + 'Default bank credit account', + help=('Optional default journal account on bank statements for ' + 'credits from this partner. Overrides the default credit ' + 'account.'), + domain=[('reconcile', '=', True)]), + 'account_receivable_bank_id': fields.many2one( + 'account.account', + 'Default bank debit account', + help=('Optional default journal account on bank statements for ' + 'debits from this partner. Overrides the default debit ' + 'account.'), + domain=[('reconcile', '=', True)]), + } + + def def_journal_account_bank_decr( + self, cr, uid, ids, context=None): + if not ids: + return {} + res = super(ResPartner, self).def_journal_account_bank_decr( + cr, uid, ids, context=context) + for partner in self.browse(cr, uid, ids, context=context): + if partner.account_payable_bank_id: + res[partner.id] = partner.account_payable_bank_id.id + return res + + def def_journal_account_bank_incr( + self, cr, uid, ids, context=None): + if not ids: + return {} + res = super(ResPartner, self).def_journal_account_bank_decr( + cr, uid, ids, context=context) + for partner in self.browse(cr, uid, ids, context=context): + if partner.account_receivable_bank_id: + res[partner.id] = partner.account_receivable_bank_id.id + return res diff --git a/account_banking_partner_journal_account/res_partner_view.xml b/account_banking_partner_journal_account/res_partner_view.xml new file mode 100644 index 000000000..7b4afa5e3 --- /dev/null +++ b/account_banking_partner_journal_account/res_partner_view.xml @@ -0,0 +1,21 @@ + + + + + Add default accounts on bank statements + res.partner + + + + + + + + + + + + + From 4b0d72a38209a6ca5c869e0d7eea6ed783200191 Mon Sep 17 00:00:00 2001 From: Stefan Rijnhart Date: Sun, 17 Nov 2013 20:46:53 +0100 Subject: [PATCH 2/4] [UPD] Translation --- account_banking_partner_journal_account/i18n/nl.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/account_banking_partner_journal_account/i18n/nl.po b/account_banking_partner_journal_account/i18n/nl.po index d70456d9a..9d99149ba 100644 --- a/account_banking_partner_journal_account/i18n/nl.po +++ b/account_banking_partner_journal_account/i18n/nl.po @@ -28,7 +28,7 @@ msgstr "Optionele standaard grootboekrekening voor geïmporteerde bankbijschrijv #. module: account_banking_partner_journal_account #: field:res.partner,account_payable_bank_id:0 msgid "Default bank credit account" -msgstr "Standaardrekening afschrijvingen" +msgstr "Standaardrekening bankafschrijvingen" #. module: account_banking_partner_journal_account #: help:res.partner,account_payable_bank_id:0 From d131858d63c576c00bb526759fd545347f59502a Mon Sep 17 00:00:00 2001 From: Stefan Rijnhart Date: Sun, 17 Nov 2013 21:04:15 +0100 Subject: [PATCH 3/4] [FIX] Calling the right super --- account_banking_partner_journal_account/res_partner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/account_banking_partner_journal_account/res_partner.py b/account_banking_partner_journal_account/res_partner.py index 9ac52c930..5f2891823 100644 --- a/account_banking_partner_journal_account/res_partner.py +++ b/account_banking_partner_journal_account/res_partner.py @@ -56,7 +56,7 @@ class ResPartner(orm.Model): self, cr, uid, ids, context=None): if not ids: return {} - res = super(ResPartner, self).def_journal_account_bank_decr( + res = super(ResPartner, self).def_journal_account_bank_incr( cr, uid, ids, context=context) for partner in self.browse(cr, uid, ids, context=context): if partner.account_receivable_bank_id: From acf6b8512a249ea288318d64dddc13faf847359d Mon Sep 17 00:00:00 2001 From: Stefan Rijnhart Date: Tue, 26 Nov 2013 20:41:54 +0100 Subject: [PATCH 4/4] [FIX] Allow for any kind of account [RFR] Use property fields --- .../i18n/nl.po | 13 +++++----- .../res_partner.py | 24 +++++++++++-------- .../res_partner_view.xml | 4 ++-- 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/account_banking_partner_journal_account/i18n/nl.po b/account_banking_partner_journal_account/i18n/nl.po index 9d99149ba..ff6bc8fb0 100644 --- a/account_banking_partner_journal_account/i18n/nl.po +++ b/account_banking_partner_journal_account/i18n/nl.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: OpenERP Server 6.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-11-16 10:29+0000\n" -"PO-Revision-Date: 2013-11-16 10:29+0000\n" +"POT-Creation-Date: 2013-11-26 19:34+0000\n" +"PO-Revision-Date: 2013-11-26 19:34+0000\n" "Last-Translator: <>\n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -21,22 +21,21 @@ msgid "Partner" msgstr "Relatie" #. module: account_banking_partner_journal_account -#: help:res.partner,account_receivable_bank_id:0 +#: help:res.partner,property_account_receivable_bank_id:0 msgid "Optional default journal account on bank statements for debits from this partner. Overrides the default debit account." msgstr "Optionele standaard grootboekrekening voor geïmporteerde bankbijschrijvingen, in plaats van de standaard debiteurenrekening." #. module: account_banking_partner_journal_account -#: field:res.partner,account_payable_bank_id:0 +#: field:res.partner,property_account_payable_bank_id:0 msgid "Default bank credit account" msgstr "Standaardrekening bankafschrijvingen" #. module: account_banking_partner_journal_account -#: help:res.partner,account_payable_bank_id:0 +#: help:res.partner,property_account_payable_bank_id:0 msgid "Optional default journal account on bank statements for credits from this partner. Overrides the default credit account." msgstr "Optionele standaard grootboekrekening voor geïmporteerde bankafschrijvingen, in plaats van de standaard crediteurenrekening." #. module: account_banking_partner_journal_account -#: field:res.partner,account_receivable_bank_id:0 +#: field:res.partner,property_account_receivable_bank_id:0 msgid "Default bank debit account" msgstr "Standaardrekening bankbijschrijvingen" - diff --git a/account_banking_partner_journal_account/res_partner.py b/account_banking_partner_journal_account/res_partner.py index 5f2891823..04315f88b 100644 --- a/account_banking_partner_journal_account/res_partner.py +++ b/account_banking_partner_journal_account/res_partner.py @@ -25,20 +25,24 @@ class ResPartner(orm.Model): _inherit = 'res.partner' _columns = { - 'account_payable_bank_id': fields.many2one( + 'property_account_payable_bank_id': fields.property( 'account.account', - 'Default bank credit account', + type='many2one', + relation='account.account', + string='Default bank credit account', help=('Optional default journal account on bank statements for ' 'credits from this partner. Overrides the default credit ' 'account.'), - domain=[('reconcile', '=', True)]), - 'account_receivable_bank_id': fields.many2one( + domain=[('type', '!=', 'view')]), + 'property_account_receivable_bank_id': fields.property( 'account.account', - 'Default bank debit account', + type='many2one', + relation='account.account', + string='Default bank debit account', help=('Optional default journal account on bank statements for ' 'debits from this partner. Overrides the default debit ' 'account.'), - domain=[('reconcile', '=', True)]), + domain=[('type', '!=', 'view')]), } def def_journal_account_bank_decr( @@ -48,8 +52,8 @@ class ResPartner(orm.Model): res = super(ResPartner, self).def_journal_account_bank_decr( cr, uid, ids, context=context) for partner in self.browse(cr, uid, ids, context=context): - if partner.account_payable_bank_id: - res[partner.id] = partner.account_payable_bank_id.id + if partner.property_account_payable_bank_id: + res[partner.id] = partner.property_account_payable_bank_id.id return res def def_journal_account_bank_incr( @@ -59,6 +63,6 @@ class ResPartner(orm.Model): res = super(ResPartner, self).def_journal_account_bank_incr( cr, uid, ids, context=context) for partner in self.browse(cr, uid, ids, context=context): - if partner.account_receivable_bank_id: - res[partner.id] = partner.account_receivable_bank_id.id + if partner.property_account_receivable_bank_id: + res[partner.id] = partner.property_account_receivable_bank_id.id return res diff --git a/account_banking_partner_journal_account/res_partner_view.xml b/account_banking_partner_journal_account/res_partner_view.xml index 7b4afa5e3..fc05ddfcb 100644 --- a/account_banking_partner_journal_account/res_partner_view.xml +++ b/account_banking_partner_journal_account/res_partner_view.xml @@ -7,11 +7,11 @@ - -